[FFmpeg-devel] [PATCH] lavc/libzvbi: base support for multiple levels
Marton Balint
cus at passwd.hu
Sat Feb 18 02:51:08 EET 2017
On Fri, 17 Feb 2017, Josh de Kock wrote:
> Also add support for level 1.0 explicitly.
>
What is the use case for this? Reducing the number of colors?
I don't think you can reduce the number of colors based on teletext level,
because libzvbi uses high (>32) colors for navigation, which is also part
of level 1.0.
Also, I don't think you can skip fix_transparency.
And by reducing to level 1.0, you are excluding a lot of users, many
countries use the extra international characters level 1.5 provides.
If you only want to reduce the number of colors, then I prefer an option
which makes the code go through every pixel, find the minimum color
value, and sets nb_colors to that. Still a hack, but IMHO small enough to
be acceptable, until subtitle filters are implemented, and you can do this
with a filter.
Regards,
Marton
> Signed-off-by: Josh de Kock <josh at itanimul.li>
> ---
> libavcodec/libzvbi-teletextdec.c | 60 ++++++++++++++++++++++++++++------------
> 1 file changed, 42 insertions(+), 18 deletions(-)
>
> diff --git a/libavcodec/libzvbi-teletextdec.c b/libavcodec/libzvbi-teletextdec.c
> index 687b6af..b4316f4 100644
> --- a/libavcodec/libzvbi-teletextdec.c
> +++ b/libavcodec/libzvbi-teletextdec.c
> @@ -76,6 +76,7 @@ typedef struct TeletextContext
> vbi_sliced sliced[MAX_SLICES];
>
> int readorder;
> + int wst_level;
> } TeletextContext;
>
> static int chop_spaces_utf8(const unsigned char* t, int len)
> @@ -248,32 +249,51 @@ static int gen_sub_bitmap(TeletextContext *ctx, AVSubtitleRect *sub_rect, vbi_pa
> sub_rect->data[0], sub_rect->linesize[0],
> 0, chop_top, page->columns, page->rows - chop_top,
> /*reveal*/ 1, /*flash*/ 1);
> -
> - fix_transparency(ctx, sub_rect, page, chop_top, resx, resy);
> + if (ctx->opacity != -1)
> + fix_transparency(ctx, sub_rect, page, chop_top, resx, resy);
> sub_rect->x = ctx->x_offset;
> sub_rect->y = ctx->y_offset + chop_top * BITMAP_CHAR_HEIGHT;
> sub_rect->w = resx;
> sub_rect->h = resy;
> - sub_rect->nb_colors = ctx->opacity > 0 && ctx->opacity < 255 ? 2 * VBI_NB_COLORS : VBI_NB_COLORS;
> + sub_rect->type = SUBTITLE_BITMAP;
> +
> sub_rect->data[1] = av_mallocz(AVPALETTE_SIZE);
> if (!sub_rect->data[1]) {
> av_freep(&sub_rect->data[0]);
> return AVERROR(ENOMEM);
> }
> - for (ci = 0; ci < VBI_NB_COLORS; ci++) {
> - int r, g, b, a;
> -
> - r = VBI_R(page->color_map[ci]);
> - g = VBI_G(page->color_map[ci]);
> - b = VBI_B(page->color_map[ci]);
> - a = VBI_A(page->color_map[ci]);
> - ((uint32_t *)sub_rect->data[1])[ci] = RGBA(r, g, b, a);
> - ((uint32_t *)sub_rect->data[1])[ci + VBI_NB_COLORS] = RGBA(r, g, b, ctx->opacity);
> - ff_dlog(ctx, "palette %0x\n", ((uint32_t *)sub_rect->data[1])[ci]);
> +
> + switch (ctx->wst_level) {
> + case VBI_WST_LEVEL_1:
> + sub_rect->nb_colors = 16;
> + for (ci = 0; ci < VBI_NB_COLORS; ci ++)
> + ((uint32_t *)sub_rect->data[1])[ci] = ci < 16 ? RGBA(VBI_R(page->color_map[ci]), VBI_G(page->color_map[ci]),
> + VBI_B(page->color_map[ci]), VBI_A(page->color_map[ci])) :
> + RGBA(0, 0, 0, 0);
> + break;
> + case VBI_WST_LEVEL_1p5:
> + case VBI_WST_LEVEL_2p5:
> + return AVERROR_PATCHWELCOME;
> + break;
> + case VBI_WST_LEVEL_3p5:
> + sub_rect->nb_colors = ctx->opacity > 0 && ctx->opacity < 255 ? 2 * VBI_NB_COLORS : VBI_NB_COLORS;
> + for (ci = 0; ci < VBI_NB_COLORS; ci++) {
> + int r, g, b, a;
> +
> + r = VBI_R(page->color_map[ci]);
> + g = VBI_G(page->color_map[ci]);
> + b = VBI_B(page->color_map[ci]);
> + a = VBI_A(page->color_map[ci]);
> + ((uint32_t *)sub_rect->data[1])[ci] = RGBA(r, g, b, a);
> + ((uint32_t *)sub_rect->data[1])[ci + VBI_NB_COLORS] = RGBA(r, g, b, ctx->opacity);
> + av_log(ctx, AV_LOG_DEBUG, "palette %08x pallete opacity %08x\n",
> + ((uint32_t *)sub_rect->data[1])[ci], ((uint32_t *)sub_rect->data[1])[ci + VBI_NB_COLORS]);
> + }
> }
> +
> ((uint32_t *)sub_rect->data[1])[VBI_TRANSPARENT_BLACK] = RGBA(0, 0, 0, 0);
> ((uint32_t *)sub_rect->data[1])[VBI_TRANSPARENT_BLACK + VBI_NB_COLORS] = RGBA(0, 0, 0, 0);
> - sub_rect->type = SUBTITLE_BITMAP;
> +
> return 0;
> }
>
> @@ -301,7 +321,7 @@ static void handler(vbi_event *ev, void *user_data)
> res = vbi_fetch_vt_page(ctx->vbi, &page,
> ev->ev.ttx_page.pgno,
> ev->ev.ttx_page.subno,
> - VBI_WST_LEVEL_3p5, 25, TRUE);
> + ctx->wst_level, 25, TRUE);
>
> if (!res)
> return;
> @@ -549,9 +569,13 @@ static const AVOption options[] = {
> {"txt_top", "y offset of generated bitmaps", OFFSET(y_offset), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 65535, SD},
> {"txt_chop_spaces", "chops leading and trailing spaces from text", OFFSET(chop_spaces), AV_OPT_TYPE_INT, {.i64 = 1}, 0, 1, SD},
> {"txt_duration", "display duration of teletext pages in msecs", OFFSET(sub_duration), AV_OPT_TYPE_INT, {.i64 = 30000}, 0, 86400000, SD},
> - {"txt_transparent", "force transparent background of the teletext", OFFSET(transparent_bg), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, SD},
> - {"txt_opacity", "set opacity of the transparent background", OFFSET(opacity), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 255, SD},
> - { NULL },
> + {"txt_transparent", "force transparent background of the teletext (doesn't work with level 1.0)", OFFSET(transparent_bg), AV_OPT_TYPE_INT, {.i64 = 0}, 0, 1, SD},
> + {"txt_opacity", "set opacity of the transparent background (doesn't work with level 1.0)", OFFSET(opacity), AV_OPT_TYPE_INT, {.i64 = -1}, -1, 255, SD},
> + {"txt_level", "set the output level of the teletext bitmap", OFFSET(wst_level), AV_OPT_TYPE_INT, {.i64 = VBI_WST_LEVEL_3p5}, VBI_WST_LEVEL_1, VBI_WST_LEVEL_3p5, SD, "txt_level"},
> + {"1.0", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VBI_WST_LEVEL_1}, 0, 0, SD, "txt_level"},
> + {"1.5", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VBI_WST_LEVEL_1p5}, 0, 0, SD, "txt_level"},
> + {"2.5", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VBI_WST_LEVEL_2p5}, 0, 0, SD, "txt_level"},
> + {"3.5", NULL, 0, AV_OPT_TYPE_CONST, {.i64 = VBI_WST_LEVEL_3p5}, 0, 0, SD, "txt_level"},
> };
>
> static const AVClass teletext_class = {
> --
> 2.10.1 (Apple Git-78)
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel at ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
More information about the ffmpeg-devel
mailing list