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 <j...@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@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
_______________________________________________
ffmpeg-devel mailing list
ffmpeg-devel@ffmpeg.org
http://ffmpeg.org/mailman/listinfo/ffmpeg-devel

Reply via email to