Lines Matching refs:ctx
150 static char *create_ass_text(TeletextContext *ctx, const char *text)
161 dialog = ff_ass_get_dialog(ctx->readorder++, 0, NULL, NULL, buf.str);
167 static int gen_sub_text(TeletextContext *ctx, AVSubtitleRect *sub_rect, vbi_page *page, int chop_top)
182 av_log(ctx, AV_LOG_ERROR, "vbi_print error\n");
190 if (ctx->chop_spaces) {
220 sub_rect->ass = create_ass_text(ctx, buf.str);
226 av_log(ctx, AV_LOG_DEBUG, "subtext:%s:txetbus\n", sub_rect->ass);
295 static int gen_sub_ass(TeletextContext *ctx, AVSubtitleRect *sub_rect, vbi_page *page, int chop_top)
304 int is_subtitle_page = ctx->subtitle_map[page->pgno & 0x7ff];
332 ctx->last_ass_alignment = alignment = 1;
334 ctx->last_ass_alignment = alignment = 2;
336 ctx->last_ass_alignment = alignment = 3;
338 if (ctx->last_ass_alignment == 1 && can_align_left ||
339 ctx->last_ass_alignment == 2 && can_align_center ||
340 ctx->last_ass_alignment == 3 && can_align_right)
341 alignment = ctx->last_ass_alignment;
398 sub_rect->ass = ff_ass_get_dialog(ctx->readorder++, 0, is_subtitle_page ? "Subtitle" : "Teletext", NULL, buf.str);
404 av_log(ctx, AV_LOG_DEBUG, "subtext:%s:txetbus\n", sub_rect->ass);
412 static void fix_transparency(TeletextContext *ctx, AVSubtitleRect *sub_rect, vbi_page *page,
429 if (!ctx->transparent_bg)
432 if (ctx->opacity > 0) {
433 if (ctx->opacity < 255)
451 static int gen_sub_bitmap(TeletextContext *ctx, AVSubtitleRect *sub_rect, vbi_page *page, int chop_top)
465 av_log(ctx, AV_LOG_DEBUG, "dropping empty page %3x\n", page->pgno);
480 fix_transparency(ctx, sub_rect, page, chop_top, resx, resy);
481 sub_rect->x = ctx->x_offset;
482 sub_rect->y = ctx->y_offset + chop_top * BITMAP_CHAR_HEIGHT;
485 sub_rect->nb_colors = ctx->opacity > 0 && ctx->opacity < 255 ? 2 * VBI_NB_COLORS : VBI_NB_COLORS;
499 ((uint32_t *)sub_rect->data[1])[ci + VBI_NB_COLORS] = RGBA(r, g, b, ctx->opacity);
500 ff_dlog(ctx, "palette %0x\n", ((uint32_t *)sub_rect->data[1])[ci]);
510 TeletextContext *ctx = user_data;
516 int is_subtitle_page = ctx->subtitle_map[ev->ev.ttx_page.pgno & 0x7ff];
519 av_log(ctx, AV_LOG_DEBUG, "decoded page %s.%02x\n",
522 if (strcmp(ctx->pgno, "*") && (strcmp(ctx->pgno, "subtitle") || !is_subtitle_page) && !strstr(ctx->pgno, pgno_str))
524 if (ctx->handler_ret < 0)
527 res = vbi_fetch_vt_page(ctx->vbi, &page,
535 chop_top = ctx->chop_top || ((page.rows > 1) && is_subtitle_page);
537 av_log(ctx, AV_LOG_DEBUG, "%d x %d page chop:%d\n",
540 if (ctx->nb_pages < MAX_BUFFERED_PAGES) {
541 if ((new_pages = av_realloc_array(ctx->pages, ctx->nb_pages + 1, sizeof(TeletextPage)))) {
542 TeletextPage *cur_page = new_pages + ctx->nb_pages;
543 ctx->pages = new_pages;
545 cur_page->pts = ctx->pts;
549 switch (ctx->format_id) {
551 res = gen_sub_bitmap(ctx, cur_page->sub_rect, &page, chop_top);
554 res = gen_sub_text(ctx, cur_page->sub_rect, &page, chop_top);
557 res = gen_sub_ass(ctx, cur_page->sub_rect, &page, chop_top);
565 ctx->handler_ret = res;
567 ctx->pages[ctx->nb_pages++] = *cur_page;
570 ctx->handler_ret = AVERROR(ENOMEM);
573 ctx->handler_ret = AVERROR(ENOMEM);
577 av_log(ctx, AV_LOG_ERROR, "Buffered too many pages, dropping page %s.\n", pgno_str);
578 ctx->handler_ret = AVERROR(ENOSYS);
584 static int slice_to_vbi_lines(TeletextContext *ctx, const uint8_t *buf, int size)
598 uint8_t *p = ctx->sliced[lines].data;
600 ctx->sliced[lines].id = VBI_SLICED_TELETEXT_B;
601 ctx->sliced[lines].line = (line_offset > 0 ? (line_offset + (field_parity ? 0 : 313)) : 0);
615 ctx->subtitle_map[pgno] = (!(flags1 & 0x40) && flags1 & 0x80 && flags2 & 0x01);
617 if (ctx->subtitle_map[pgno] && pgno == ctx->last_pgno) {
618 int last_byte9 = vbi_unham8(ctx->last_p5);
625 ctx->last_pgno = pgno;
626 ctx->last_p5 = p[5];
636 av_log(ctx, AV_LOG_WARNING, "%d bytes remained after slicing data\n", size);
643 TeletextContext *ctx = avctx->priv_data;
646 if (!ctx->vbi) {
647 if (!(ctx->vbi = vbi_decoder_new()))
649 if (ctx->default_region != -1) {
650 av_log(avctx, AV_LOG_INFO, "Setting default zvbi region to %i\n", ctx->default_region);
651 vbi_teletext_set_default_region(ctx->vbi, ctx->default_region);
653 if (!vbi_event_handler_register(ctx->vbi, VBI_EVENT_TTX_PAGE, handler, ctx)) {
654 vbi_decoder_delete(ctx->vbi);
655 ctx->vbi = NULL;
661 ctx->pts = av_rescale_q(pkt->pts, avctx->pkt_timebase, AV_TIME_BASE_Q);
671 ctx->handler_ret = pkt->size;
674 if ((lines = slice_to_vbi_lines(ctx, pkt->data + 1, pkt->size - 1)) < 0)
676 ff_dlog(avctx, "ctx=%p buf_size=%d lines=%u pkt_pts=%7.3f\n",
677 ctx, pkt->size, lines, (double)pkt->pts/90000.0);
679 vbi_decode(ctx->vbi, ctx->sliced, lines, 0.0);
680 ctx->lines_processed += lines;
683 ctx->pts = AV_NOPTS_VALUE;
684 ret = ctx->handler_ret;
691 if (ctx->nb_pages) {
693 sub->format = !!ctx->format_id;
695 sub->end_display_time = ctx->sub_duration;
697 sub->pts = ctx->pages->pts;
699 if (ctx->pages->sub_rect->type != SUBTITLE_NONE) {
703 sub->rects[0] = ctx->pages->sub_rect;
712 subtitle_rect_free(&ctx->pages->sub_rect);
714 for (i = 0; i < ctx->nb_pages - 1; i++)
715 ctx->pages[i] = ctx->pages[i + 1];
716 ctx->nb_pages--;
728 TeletextContext *ctx = avctx->priv_data;
737 if (ctx->format_id == 0) {
742 ctx->vbi = NULL;
743 ctx->pts = AV_NOPTS_VALUE;
744 ctx->last_pgno = -1;
745 ctx->last_ass_alignment = 2;
747 if (ctx->opacity == -1)
748 ctx->opacity = ctx->transparent_bg ? 0 : 255;
750 av_log(avctx, AV_LOG_VERBOSE, "page filter: %s\n", ctx->pgno);
752 switch (ctx->format_id) {
765 TeletextContext *ctx = avctx->priv_data;
767 ff_dlog(avctx, "lines_total=%u\n", ctx->lines_processed);
768 while (ctx->nb_pages)
769 subtitle_rect_free(&ctx->pages[--ctx->nb_pages].sub_rect);
770 av_freep(&ctx->pages);
772 vbi_decoder_delete(ctx->vbi);
773 ctx->vbi = NULL;
774 ctx->pts = AV_NOPTS_VALUE;
775 ctx->last_pgno = -1;
776 ctx->last_ass_alignment = 2;
777 memset(ctx->subtitle_map, 0, sizeof(ctx->subtitle_map));
779 ctx->readorder = 0;