From patchwork Tue Dec 7 23:24:57 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 32117 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp6946527iog; Tue, 7 Dec 2021 15:25:17 -0800 (PST) X-Google-Smtp-Source: ABdhPJza3UCpqbMqiQytmdYbilMtd85kkyrVMWC6SZKJGjKpmcvglk2nmRmqJznFwVtXLkurUIaW X-Received: by 2002:a17:907:7210:: with SMTP id dr16mr2975724ejc.267.1638919517497; Tue, 07 Dec 2021 15:25:17 -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 x14si1941523edd.374.2021.12.07.15.25.16; Tue, 07 Dec 2021 15:25:17 -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=@outlook.com header.s=selector1 header.b=jsoar6wf; arc=fail (body hash mismatch); 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; dmarc=fail (p=NONE sp=QUARANTINE dis=NONE) header.from=outlook.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id E11B568AB2E; Wed, 8 Dec 2021 01:25:13 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR05-DB8-obe.outbound.protection.outlook.com (unknown [40.92.89.38]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D0DF56880FC for ; Wed, 8 Dec 2021 01:25:07 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=eQxoXyVahwyYTm2L0muHdmQFkjxQwEDm8jEV+XmJhpGp/VDu+/Q2nDfYXSApiuDSSLLUxtxHMpNXurZ7GTmlEXT0Q1tv+h0zRu7kx+7BRgb+uJcOtFlq0GLm9g7NgUhjkh/7zSxidt3d5lbhe/ALfhWoriK2DzaFbD1e4qywUJ1/HUR4Zg5mdmgETykcAwCqP+0I1P6Gn5K505UKqcC9X9nxMMNNIxBVcTxfilGu4QkRvOW1XVN/V3IwzbPnGz6VUzbWh24sz98rRSEDWCy5wWqXiSFh28v5vfh41gzZga/EbTEjdkiwr15b1o6MktH5XHaxu2KK5ZVdc4HsIFK7ug== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=4CJyk9G9Gsz+LNRCBJCczAGPFBJKLx8Hr5nCKuoU+Y8=; b=fZHqeE+nNMOTq/LkDcdxZsSLfx5+nkIxt7kDtcrPJ1CJe35yQUPKD7CZ2sD2xXwyCZg+5pBmTQB/3EkNxasJx7+7eHo9wLo4yNiWW2+35V84o1oYOql3gJPLtA9fIvL+8iJr3vqn33scnMTEkeW40nTJZpfP+wFtG8B3qCr2BOZrYPdEGoMzdVv0RDASLan19tj4UYJl3iVD15gNiDjcG1exQG0U37Vaqm7e76UgEvcKyTQbHowNeHoa/HYi3A6QzsQr+MO7KbKhcvcU33pN5CJn9kKSifVSqflCyV6EH4yeRJPRoWmxCPhq32UF1QimMJKmbkKO7Vydy7B3gS8oLA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=outlook.com; s=selector1; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=4CJyk9G9Gsz+LNRCBJCczAGPFBJKLx8Hr5nCKuoU+Y8=; b=jsoar6wfTO376qNeRc24XYhi+MQVR+JRC5B//592mt6SXoQb+/hNJl7sThfuKm27Wq9DMwSQyihzhHrivJJ/Vesx/tKfzGagfVNH+5VhdwETD/T8wMYj7zK69mEYjfYOZ+WhEIj2aRRHgJvSubAks7kvuVdP/fhkDOwHg63i19kSrUJ4Ub8ex8+4Mlm44ThQfx1xlh91t2NodEt/OQgBRbil9xTWyzda7aiB7IENeuBWbjvWbOSRczYaRoKCTGUcgSSTay2ySfiektZZkCvJGb1lrpSc/8Lp+Io4qOXb0Fphaembp2wrt1ddoxl5yR4ZbOmFOTpjn8XulrY8pnPHQw== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by AM6PR0302MB3480.eurprd03.prod.outlook.com (2603:10a6:209:19::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4755.11; Tue, 7 Dec 2021 23:25:06 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::f0dc:92f5:6bc2:45ca]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::f0dc:92f5:6bc2:45ca%4]) with mapi id 15.20.4755.024; Tue, 7 Dec 2021 23:25:06 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 8 Dec 2021 00:24:57 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [/4SSl7rZZKkmrXGMjWUUgV5KcY33QHW/] X-ClientProxiedBy: AM6P192CA0034.EURP192.PROD.OUTLOOK.COM (2603:10a6:209:83::47) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20211207232459.483893-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from sblaptop.fritz.box (188.192.248.74) by AM6P192CA0034.EURP192.PROD.OUTLOOK.COM (2603:10a6:209:83::47) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4755.11 via Frontend Transport; Tue, 7 Dec 2021 23:25:05 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: a7fcd122-95fc-479a-1578-08d9b9d8cd79 X-MS-Exchange-SLBlob-MailProps: gjx25WM8ZNXOjPmV/Ff/siVXexYT0WFzwlbFaG+vXipNWAJZpmO2CLo3jIGiKp+HX4H6pBZyuzC/f/Jr7scEEpf/luCrwIIAhGTHualubYLUCQ3NPklog+eBxtiVS1fNXV1FpssgbSTQDdAxspDGbbi4huD2gtlVhTLbyquJ2bfshTUSqvJ89zr5oDhOnqfdrMsQ6w0agap52ZD6qKCqjA/MevHFy6fVzfP4Xg5vCRbLpZ1h1fpc8gEwtNX0zZDahJS0yAyJGFq3C6MdZMKkU0rF1phZpzaHeIV3eC5rfeYOEp623KYF9ZRwwUceA/6FywTEoUTYRzt0qt7YfuwlFtYvfvETfAk/fpxxhVg2DDkDztspub0CzSlUhZ9t9E3BqxFwAp46a2mFEBd7l+97E4RqynOO3xckjQQKXF/ganX1q0D7vLuMNlKjOZbVFc7ePgopaNahehCh02dufezWUGibTakeGtd5jHbMaJqtrX35r5uaszDb8n0mE0hxhPVsSj8Zci/54RCbPSEOD8KVRr0WlPj0EgdGzehWvsHH0kUm8O6Vxlswu1VuPiboBatU9OkncuAXfMRFMyg+BOwIPcIhMvJUveLGzR/NjJEoOO+E9MNIK3AiEv++cwP5x8Xq1rrt+vy+wWXAqqNFhXDDIW/g1rTHh2lC59Gik2FVCxZkJdHXDIu3RMpKL1Peerg/7FUcze04K/uoTYdchhFColtCq02agoCp8Sa5IqLXOFM= X-MS-TrafficTypeDiagnostic: AM6PR0302MB3480:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: kFcfsxr1zdHFRWrEM6X/soC0YB5wj8Ig2wcAEMue5DJMt71L6xFRrGvscQFvWHmD8QvT37MdWHbL0qunutco3UwEilR+BP15LekthvoclNZX7MBGTAhy9Pfp8QEvlqcEIPlHaO7ekAvQKpkEIyff+fxdykmJh1RV3wVgS4V+Z90HByVM1eItliPkbz0ae2FnUQW8ULmD5WuN4yeLfoN1IxlgH98VEtEm11IQex3zEuLj3ldPlYITnlTSM8wLfSx0XfN5ik4A6XQG07vzt7sOvzHclqDT+sjscoSbEVQLzXo3oHp/MdahiWv/i/6KEhUryIHpz2bstt1+I6BM7bnq2Cdu2iqoA5+lqf7kqL/pQ6rbHCKZQXKOyTR0RPsekky4Oy1GMFYySARMxwnef9EEi76PYBpTf4WrnBdBrwgOfZPRS89efB1x3iJ113uCqpFztq5i9kP/RsLWTLL/T0Q11/JEYK/1eOV9/XqgbDzY+5vNzZSgfFBOxsqi83ICWsM/eQVHZtkzDBusZ1wjQqNxWDqFf4bWB3cFjkDy4uPumHtp9N2NXQWEh2HGRLeju6oqLsbKhuTv345F0XBKEDsqzA== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: c8o+l8vONUNmFW4aRu9zP4OblluyuqIKGJtyYnI7ZjmPe6SWobiiLTjAXY/CUsH8XpcS8NO0Y5lxJxTFHsZYdoF1HjdojhWdy3Kgw5I48ZjdjTSVrbRPoYfHQiN1KBUMEvXeyEnZH4F157h7m58zDkmuk+iL7xguKUXDZiZxYi6DrCfHv6aUyn7HHY8nfx9d4BibM5gmjAbv2/mrkWpi/Z7ptYdAo7m6fSV0qEW0cw/gV0YE084NkqVzNBItHKYJ2g6rYriFfThaUCdYDraWeDKeSK8k2idSIlLEsa7FlrhSFGt2Nk44EBDpedn5Te2B/Het8B2i9dJggNW+0n/DRuYpdxVlYx8feZT7z4qUDjehJjEzh9jmMOifew+gVhP1wbZl8NngBXIbXjfsHTUmFszoeJyiAZs+Lf23zZZQGcwrc852Vcqc8mEXVV66dNpHbuTarfD+kWOeihR0HJh5cTIU/r1TogQE9BZOKC9H/toMh3N9QpgIo927wDgkMa6AulkapLEFFOZPqJGpt7smZKQ6/dtBZwAZj+lbatXmobeeV4TSd6QrN79SN4VKfBRjUcZTCkGIuJ59PQzo85CblVVx/380SUcIUfjEgfcUjEZ73QtxNMt+uBJ79MsaDIwMiXy6MoxM2Y3Rum3jNq4hyzliczm3R1EAuOkS4QxJkLSSy4UxIGXx2pIvYVIg00AU13+2O5wu9vk7IL9pIelZGIj2ZR3aP14+l62GPd3dn4X90d59Yy4wZ24ZJ4WnYcBeJsY6eiMSsie992n0eqcbAVrM48OHAJdy4cKVh4/YgHwm2knvUd841LzHP17oIuGeTPN6aLrTd5GSwmmcKICupQBtl1wNrcxsKIYaKmAXQUm1BLiche6lfTj5VnkrEvzEA1ARIkjEWQCAEtmM/G+iqKpVR3CglF9UfRBWEnIsbD8eQ4lfUAXcDQEr3npzf+LXnzlEblhxpp4+liwpMGOq1A== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: a7fcd122-95fc-479a-1578-08d9b9d8cd79 X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 07 Dec 2021 23:25:06.3620 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM6PR0302MB3480 Subject: [FFmpeg-devel] [PATCH 2/4] avcodec/movtextdec: Deduplicate parsing of StyleRecords X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: zeTxqQ9Y18N1 Both TextSampleEntry and TextSample can contain StyleRecords; yet both the code as well as the structures for them were duplicated. This commit changes this. Signed-off-by: Andreas Rheinhardt --- libavcodec/movtextdec.c | 95 +++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 51 deletions(-) diff --git a/libavcodec/movtextdec.c b/libavcodec/movtextdec.c index 7021ad9e24..d3b15d07f8 100644 --- a/libavcodec/movtextdec.c +++ b/libavcodec/movtextdec.c @@ -53,20 +53,6 @@ #define RGB_TO_BGR(c) (((c) & 0xff) << 16 | ((c) & 0xff00) | (((c) >> 16) & 0xff)) -typedef struct { - uint16_t font_id; - const char *font; - uint8_t fontsize; - int color; - uint8_t alpha; - int back_color; - uint8_t back_alpha; - uint8_t bold; - uint8_t italic; - uint8_t underline; - int alignment; -} MovTextDefault; - typedef struct { uint16_t font_id; char *font; @@ -85,6 +71,14 @@ typedef struct { uint16_t font_id; } StyleBox; +typedef struct { + StyleBox style; + const char *font; + int back_color; + uint8_t back_alpha; + int alignment; +} MovTextDefault; + typedef struct { uint16_t hlit_start; uint16_t hlit_end; @@ -137,13 +131,28 @@ static void mov_text_cleanup_ftab(MovTextContext *m) m->ftab_entries = 0; } +static void mov_text_parse_style_record(StyleBox *style, const uint8_t **ptr) +{ + // fontID + style->font_id = bytestream_get_be16(ptr); + // face-style-flags + style->flags = bytestream_get_byte(ptr); + style->bold = !!(style->flags & STYLE_FLAG_BOLD); + style->italic = !!(style->flags & STYLE_FLAG_ITALIC); + style->underline = !!(style->flags & STYLE_FLAG_UNDERLINE); + // fontsize + style->fontsize = bytestream_get_byte(ptr); + // Primary color + style->color = bytestream_get_be24(ptr); + style->alpha = bytestream_get_byte(ptr); +} + static int mov_text_tx3g(AVCodecContext *avctx, MovTextContext *m) { const uint8_t *tx3g_ptr = avctx->extradata; int i, j = -1, font_length, remaining = avctx->extradata_size - BOX_SIZE_INITIAL; int8_t v_align, h_align; unsigned ftab_entries; - StyleBox s_default; m->ftab_entries = 0; if (remaining < 0) @@ -185,18 +194,7 @@ static int mov_text_tx3g(AVCodecContext *avctx, MovTextContext *m) tx3g_ptr += 8; // StyleRecord tx3g_ptr += 4; - // fontID - m->d.font_id = bytestream_get_be16(&tx3g_ptr); - // face-style-flags - s_default.flags = bytestream_get_byte(&tx3g_ptr); - m->d.bold = !!(s_default.flags & STYLE_FLAG_BOLD); - m->d.italic = !!(s_default.flags & STYLE_FLAG_ITALIC); - m->d.underline = !!(s_default.flags & STYLE_FLAG_UNDERLINE); - // fontsize - m->d.fontsize = bytestream_get_byte(&tx3g_ptr); - // Primary color - m->d.color = bytestream_get_be24(&tx3g_ptr); - m->d.alpha = bytestream_get_byte(&tx3g_ptr); + mov_text_parse_style_record(&m->d.style, &tx3g_ptr); // FontRecord // FontRecord Size tx3g_ptr += 4; @@ -219,7 +217,7 @@ static int mov_text_tx3g(AVCodecContext *avctx, MovTextContext *m) for (i = 0; i < m->ftab_entries; i++) { m->ftab[i].font_id = bytestream_get_be16(&tx3g_ptr); - if (m->ftab[i].font_id == m->d.font_id) + if (m->ftab[i].font_id == m->d.style.font_id) j = i; font_length = bytestream_get_byte(&tx3g_ptr); @@ -298,14 +296,7 @@ static int decode_styl(const uint8_t *tsmb, MovTextContext *m, const AVPacket *a continue; } - style->font_id = bytestream_get_be16(&tsmb); - style->flags = bytestream_get_byte(&tsmb); - style->bold = !!(style->flags & STYLE_FLAG_BOLD); - style->italic = !!(style->flags & STYLE_FLAG_ITALIC); - style->underline = !!(style->flags & STYLE_FLAG_UNDERLINE); - style->fontsize = bytestream_get_byte(&tsmb); - style->color = bytestream_get_be24(&tsmb); - style->alpha = bytestream_get_byte(&tsmb); + mov_text_parse_style_record(style, &tsmb); } return 0; } @@ -337,10 +328,11 @@ static int text_to_ass(AVBPrint *buf, const char *text, const char *text_end, AVCodecContext *avctx) { MovTextContext *m = avctx->priv_data; + const StyleBox *const default_style = &m->d.style; int i = 0; int text_pos = 0; int entry = 0; - int color = m->d.color; + int color = default_style->color; if (text < text_end && m->box_flags & TWRP_BOX) { if (m->w.wrap_flag == 1) { @@ -357,29 +349,29 @@ static int text_to_ass(AVBPrint *buf, const char *text, const char *text_end, const StyleBox *style = &m->s[entry]; if (text_pos == style->end) { av_bprintf(buf, "{\\r}"); - color = m->d.color; + color = default_style->color; entry++; style++; } if (entry < m->style_entries && text_pos == style->start) { - if (style->bold ^ m->d.bold) + if (style->bold ^ default_style->bold) av_bprintf(buf, "{\\b%d}", style->bold); - if (style->italic ^ m->d.italic) + if (style->italic ^ default_style->italic) av_bprintf(buf, "{\\i%d}", style->italic); - if (style->underline ^ m->d.underline) + if (style->underline ^ default_style->underline) av_bprintf(buf, "{\\u%d}", style->underline); - if (style->fontsize != m->d.fontsize) + if (style->fontsize != default_style->fontsize) av_bprintf(buf, "{\\fs%d}", style->fontsize); - if (style->font_id != m->d.font_id) + if (style->font_id != default_style->font_id) for (i = 0; i < m->ftab_entries; i++) { if (style->font_id == m->ftab[i].font_id) av_bprintf(buf, "{\\fn%s}", m->ftab[i].font); } - if (m->d.color != style->color) { + if (default_style->color != style->color) { color = style->color; av_bprintf(buf, "{\\1c&H%X&}", RGB_TO_BGR(color)); } - if (m->d.alpha != style->alpha) + if (default_style->alpha != style->alpha) av_bprintf(buf, "{\\1a&H%02X&}", 255 - style->alpha); } } @@ -400,10 +392,10 @@ static int text_to_ass(AVBPrint *buf, const char *text, const char *text_end, } if (text_pos == m->h.hlit_end) { if (m->box_flags & HCLR_BOX) { - av_bprintf(buf, "{\\2c&H%X&}", RGB_TO_BGR(m->d.color)); + av_bprintf(buf, "{\\2c&H%X&}", RGB_TO_BGR(default_style->color)); } else { av_bprintf(buf, "{\\1c&H%X&}{\\2c&H%X&}", - RGB_TO_BGR(color), RGB_TO_BGR(m->d.color)); + RGB_TO_BGR(color), RGB_TO_BGR(default_style->color)); } } } @@ -441,18 +433,19 @@ static int mov_text_init(AVCodecContext *avctx) { MovTextContext *m = avctx->priv_data; ret = mov_text_tx3g(avctx, m); if (ret == 0) { + const StyleBox *const default_style = &m->d.style; if (!m->frame_width || !m->frame_height) { m->frame_width = ASS_DEFAULT_PLAYRESX; m->frame_height = ASS_DEFAULT_PLAYRESY; } return ff_ass_subtitle_header_full(avctx, m->frame_width, m->frame_height, - m->d.font, m->d.fontsize, - (255U - m->d.alpha) << 24 | RGB_TO_BGR(m->d.color), - (255U - m->d.alpha) << 24 | RGB_TO_BGR(m->d.color), + m->d.font, default_style->fontsize, + (255U - default_style->alpha) << 24 | RGB_TO_BGR(default_style->color), + (255U - default_style->alpha) << 24 | RGB_TO_BGR(default_style->color), (255U - m->d.back_alpha) << 24 | RGB_TO_BGR(m->d.back_color), (255U - m->d.back_alpha) << 24 | RGB_TO_BGR(m->d.back_color), - m->d.bold, m->d.italic, m->d.underline, + default_style->bold, default_style->italic, default_style->underline, ASS_DEFAULT_BORDERSTYLE, m->d.alignment); } else return ff_ass_subtitle_header_default(avctx);