From patchwork Fri Feb 17 21:43:36 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Josh Dekker X-Patchwork-Id: 2597 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.89.21 with SMTP id n21csp373754vsb; Fri, 17 Feb 2017 13:43:51 -0800 (PST) X-Received: by 10.28.4.10 with SMTP id 10mr6097402wme.142.1487367831328; Fri, 17 Feb 2017 13:43:51 -0800 (PST) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id p10si3080004wmb.167.2017.02.17.13.43.50; Fri, 17 Feb 2017 13:43:51 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@itanimul.li; dkim=neutral (body hash did not verify) header.i=@messagingengine.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 1442068999C; Fri, 17 Feb 2017 23:43:42 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from out4-smtp.messagingengine.com (out4-smtp.messagingengine.com [66.111.4.28]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 169C2680A9D for ; Fri, 17 Feb 2017 23:43:35 +0200 (EET) Received: from compute4.internal (compute4.nyi.internal [10.202.2.44]) by mailout.nyi.internal (Postfix) with ESMTP id 044A6206CF for ; Fri, 17 Feb 2017 16:43:41 -0500 (EST) Received: from frontend1 ([10.202.2.160]) by compute4.internal (MEProxy); Fri, 17 Feb 2017 16:43:41 -0500 DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d=itanimul.li; h= date:from:message-id:subject:to:x-me-sender:x-me-sender :x-sasl-enc:x-sasl-enc; s=mesmtp; bh=xZ4x3ShPR7CV6DF6XC0wcUuV8o4 =; b=UiOHZsv6lzcOcW9nZuDqECYtPqwp2Cy2RcaNwG1HH0aneJIo7trzbk9ku2+ fbGzYQhCRrBpAvYRe+PQKsWW7qspVa8NIeTMZVU+msDUYTgmqgOxQzuDDm8vbFkR +ILoFg44FXv0uIe7eXEWH+vnKAWsmN0Yd5Wv/R8/6iUufQZk= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed/relaxed; d= messagingengine.com; h=date:from:message-id:subject:to :x-me-sender:x-me-sender:x-sasl-enc:x-sasl-enc; s=smtpout; bh=xZ 4x3ShPR7CV6DF6XC0wcUuV8o4=; b=KVgUsXk6Tzf+dh/StWqrxCxnhg11Zf4wO1 8QFcXglpuvY6wuUEzucQsvg4X3u/NGf8mFVPtSJi6OWYwGyJBv5T9nmiDsWoyEKE akEmBpU1tHyf58YxAbkfPSdriKOiJ8d7ywQrYAnPaZHE8M4CNTb1H8dBdsV21xwt CtxlGIUsk= X-ME-Sender: X-Sasl-enc: biY7OEV2M6g3mIS3/soyQ5MzCqNku1aUpgmdlN27yntm 1487367820 Received: from localhost (cpc75394-sotn16-2-0-cust168.15-1.cable.virginm.net [82.22.8.169]) by mail.messagingengine.com (Postfix) with ESMTPA id 93A707E334 for ; Fri, 17 Feb 2017 16:43:40 -0500 (EST) From: Josh de Kock To: ffmpeg-devel@ffmpeg.org Date: Fri, 17 Feb 2017 21:43:36 +0000 Message-Id: <20170217214336.99700-1-josh@itanimul.li> X-Mailer: git-send-email 2.10.1 (Apple Git-78) Subject: [FFmpeg-devel] [PATCH] lavc/libzvbi: base support for multiple levels X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Also add support for level 1.0 explicitly. Signed-off-by: Josh de Kock --- 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 = {