diff options
author | Marton Balint <cus@passwd.hu> | 2016-01-22 01:57:50 +0300 |
---|---|---|
committer | Marton Balint <cus@passwd.hu> | 2016-01-26 00:15:27 +0300 |
commit | 73e4565dff92d372e53a2073b65a3c88d0ac8baa (patch) | |
tree | abe504fd8e73ac6de3584f7fdb6ed701bb256235 | |
parent | 92f2a9dbc501f3d3423253b00fc25bb9bd330657 (diff) |
lavc/libzvbi-teletextdec: add support for setting background opacity
Signed-off-by: Marton Balint <cus@passwd.hu>
-rw-r--r-- | doc/decoders.texi | 8 | ||||
-rw-r--r-- | libavcodec/libzvbi-teletextdec.c | 18 | ||||
-rw-r--r-- | libavcodec/version.h | 2 |
3 files changed, 24 insertions, 4 deletions
diff --git a/doc/decoders.texi b/doc/decoders.texi index a6eb573a89..35771140e1 100644 --- a/doc/decoders.texi +++ b/doc/decoders.texi @@ -282,7 +282,13 @@ Sets the display duration of the decoded teletext pages or subtitles in miliseconds. Default value is 30000 which is 30 seconds. @item txt_transparent Force transparent background of the generated teletext bitmaps. Default value -is 0 which means an opaque (black) background. +is 0 which means an opaque background. +@item txt_opacity +Sets the opacity (0-255) of the teletext background. If +@option{txt_transparent} is not set, it only affects characters between a start +box and an end box, typically subtitles. Default value is 0 if +@option{txt_transparent} is set, 255 otherwise. + @end table @c man end SUBTILES DECODERS diff --git a/libavcodec/libzvbi-teletextdec.c b/libavcodec/libzvbi-teletextdec.c index 5f07761300..308f735ba4 100644 --- a/libavcodec/libzvbi-teletextdec.c +++ b/libavcodec/libzvbi-teletextdec.c @@ -59,6 +59,7 @@ typedef struct TeletextContext int chop_top; int sub_duration; /* in msec */ int transparent_bg; + int opacity; int chop_spaces; int lines_processed; @@ -210,9 +211,16 @@ static void fix_transparency(TeletextContext *ctx, AVSubtitleRect *sub_rect, vbi memset(pixel, VBI_TRANSPARENT_BLACK, BITMAP_CHAR_WIDTH); break; case VBI_OPAQUE: - case VBI_SEMI_TRANSPARENT: if (!ctx->transparent_bg) break; + case VBI_SEMI_TRANSPARENT: + if (ctx->opacity > 0) { + if (ctx->opacity < 255) + for(; pixel < pixelnext; pixel++) + if (*pixel == vc->background) + *pixel += VBI_NB_COLORS; + break; + } case VBI_TRANSPARENT_FULL: for(; pixel < pixelnext; pixel++) if (*pixel == vc->background) @@ -259,7 +267,7 @@ static int gen_sub_bitmap(TeletextContext *ctx, AVSubtitleRect *sub_rect, vbi_pa sub_rect->y = ctx->y_offset + chop_top * BITMAP_CHAR_HEIGHT; sub_rect->w = resx; sub_rect->h = resy; - sub_rect->nb_colors = VBI_NB_COLORS; + sub_rect->nb_colors = ctx->opacity > 0 && ctx->opacity < 255 ? 2 * VBI_NB_COLORS : VBI_NB_COLORS; sub_rect->data[1] = av_mallocz(AVPALETTE_SIZE); if (!sub_rect->data[1]) { av_freep(&sub_rect->data[0]); @@ -273,9 +281,11 @@ static int gen_sub_bitmap(TeletextContext *ctx, AVSubtitleRect *sub_rect, vbi_pa 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]); } ((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; } @@ -511,6 +521,9 @@ static int teletext_init_decoder(AVCodecContext *avctx) ctx->vbi = NULL; ctx->pts = AV_NOPTS_VALUE; + if (ctx->opacity == -1) + ctx->opacity = ctx->transparent_bg ? 0 : 255; + #ifdef DEBUG { char *t; @@ -554,6 +567,7 @@ static const AVOption options[] = { {"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 }, }; diff --git a/libavcodec/version.h b/libavcodec/version.h index 2b01e6f916..c059fdfa55 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -30,7 +30,7 @@ #define LIBAVCODEC_VERSION_MAJOR 57 #define LIBAVCODEC_VERSION_MINOR 22 -#define LIBAVCODEC_VERSION_MICRO 100 +#define LIBAVCODEC_VERSION_MICRO 101 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ LIBAVCODEC_VERSION_MINOR, \ |