[FFmpeg-cvslog] lavc/libzvbi-teletextdec: add support for setting background opacity
Marton Balint
git at videolan.org
Mon Jan 25 22:35:07 CET 2016
ffmpeg | branch: master | Marton Balint <cus at passwd.hu> | Thu Jan 21 23:57:50 2016 +0100| [73e4565dff92d372e53a2073b65a3c88d0ac8baa] | committer: Marton Balint
lavc/libzvbi-teletextdec: add support for setting background opacity
Signed-off-by: Marton Balint <cus at passwd.hu>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=73e4565dff92d372e53a2073b65a3c88d0ac8baa
---
doc/decoders.texi | 8 +++++++-
libavcodec/libzvbi-teletextdec.c | 18 ++++++++++++++++--
libavcodec/version.h | 2 +-
3 files changed, 24 insertions(+), 4 deletions(-)
diff --git a/doc/decoders.texi b/doc/decoders.texi
index a6eb573..3577114 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.
+ at item txt_opacity
+Sets the opacity (0-255) of the teletext background. If
+ at 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
+ at 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 5f07761..308f735 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 2b01e6f..c059fdf 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, \
More information about the ffmpeg-cvslog
mailing list