From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by master.gitmailbox.com (Postfix) with ESMTP id 1E3AA422FA for ; Sun, 16 Jan 2022 23:07:43 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6EC5568AFD9; Mon, 17 Jan 2022 01:05:38 +0200 (EET) Received: from EUR04-DB3-obe.outbound.protection.outlook.com (mail-oln040092074045.outbound.protection.outlook.com [40.92.74.45]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D3C8B68AEC5 for ; Mon, 17 Jan 2022 01:05:35 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=gXu/CH+3uo2/lZT4/02Y0IJmgJwsBnS/sQoQFvpIGnxfImjS0kexCn4c9MeBm7n4k+q/qmh0OW/FToYziaEytYS3gQH6l9mS5o2QDxUvlQiZRXzn/V/yiVs5aBSlJGBW6wzMynMYzNQ9RcUhVICbm0mbpf+RQLtNvqyjYxhM+V+oX6khtMQahvymubEqNgJbTwnWtvw0pXq0h+5Bm5ntXMFkq/sVEfH2JmlKD0Br5+uPqqkNnk8Eb9m+eMgU8kf25EG4JHqG2nhIY7susliTc1xdPD+5SzJSlbN3mb3WhBIIceltAYOmVdQmuCunXM5XkRu4IZoFHqQRjRtl+8zwhA== 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=FTyVpOtZsa3sMmHheOzwqLJqpt49Vd64DSvSPyAQoOo=; b=mZTpeMGdWlM3divaPPrTs2Wg/CoiY78+HyGql8HQAW5+ZrktVYHy/Lj45Tk/+IPLFAjMclqfd+zL0WBMGs5/g5VEQvf4lur8+M3ln7HKo8zKsuHpDUPcvMg9aOb23MkKAcHG8ymQNnGfl3VKR2JfRjtFUtIfFLc1Nq/6akOzJMJ79pDtf3XVfWJQDORZ9ualalkKmD4rWjoBhVn1274YGXbieJNC3n1jrrMtJupsyNpOwn+NyBI7xHrcCuTljZ4Q+zXNQ61uFm2QWLNdfFJgQGRvGVntVVbR0IXvHPww9CAcDDufpVrY2lkdu9ZK92EYj1ZcUGmA3i4fUoxcfC4xkQ== 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=FTyVpOtZsa3sMmHheOzwqLJqpt49Vd64DSvSPyAQoOo=; b=sDydtitopjhJIld98sWsUqMBi1/AYUqMois0VoUyO+EE9E1e1UwhwRFeT/QsvwJHCKlUdjb8/IUHfDntt1qZrvALiX1Nubu6OKvpthjdT7Dlo+RCjr2FhBbR6Mm1oUbvnNVcYFDO5+naC5cJxFG0kB6wYBkmK6vstlLLTL0YdGV8bH+E6DzVqYjEV/tNQ3IwI2fgedyu9aqiYdl4GBh/84mxRb6psSV/t0pEyUA7zVDOmitnqRPrS7KVO5ibkpzQhPYDufmn1IJXnb/pax7vI0yHA96TIKSkTWozjDwbTRF8gXM6SlYSW1Dsc2oCsHBz59/5DLfBl+2LK4l1dU0FmQ== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by VI1PR0301MB2560.eurprd03.prod.outlook.com (2603:10a6:800:68::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4888.11; Sun, 16 Jan 2022 23:05:32 +0000 Received: from AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::19fc:be9f:2c9c:53f5]) by AM7PR03MB6660.eurprd03.prod.outlook.com ([fe80::19fc:be9f:2c9c:53f5%9]) with mapi id 15.20.4888.013; Sun, 16 Jan 2022 23:05:32 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 Jan 2022 00:04:02 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [dWE2mQG4KF12TJzCrHWzYkAj/JMpfPN9] X-ClientProxiedBy: AM0PR10CA0070.EURPRD10.PROD.OUTLOOK.COM (2603:10a6:208:15::23) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20220116230405.194506-21-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: f2f72e5f-79d7-4bf8-f097-08d9d944b261 X-MS-Exchange-SLBlob-MailProps: sTyj/kSftou7kRWZu+p1Yy70c3quhp4iiGEUUKuzaKkT5OyQPytVsSb8jssy8Uo8vwDEK0OQzHHidTZl6JuKSNgrMnXmlCUAMcNh/PllCuD7fuHvZMnvgleesMR6U0oyYrMcMU9lbg7byjTIsYYqnizLWdBZKwmOvDzOPNy6iNhspx7YgVCO893P50G9Gn8pSmYSoh314iId6bOhi6qumCzfl/yYFpIBxRnK/aKRFm+jZoAyJSGhVkR5eqbWyJZxF8d6fSGMcKO9rwwM8UR74pMuVXpL8fjpTVo2HE7fwWl5CozJzvDPTua6ldp20hoo59chJSWGdfoWRxjFbONEeVBRLIEthHsOGbCRdwihQlX0tWkte9TjCa/QdfFQU+GQGMcPQocVQrRLuRs4489+LmPSHO35rK2KM+17lP/7HvDQSbG/GoFkJsWmKIGUdarKN8D6rQErvGXyuaXlxc3UHAZ6sknC/L9vsqAQA29Nm0nKpJdUwWQ+hl4auqN/caQjeex9lAkuIegy7TfKpW/5jIkOMZqJ7Lt/47SjeVtTUMWiI/sEC2jsQArfY75mQV6CHUo726qdCFXLcmiNABjWyxpiq4lt60nVzapGwFtLyFSfWWcutd+C3S19rNmPe7EyC8H8oWNH312/I1K/DAbqMrBbsGKRW53EOOnF5BR0qJET7f/E2ybCE69sVfxfKovLPOaWmTSt4vx1kJ0S+bz6tA4TiUhpg5NhfJuFYWLhoGyaK1ynKeDvY/jmubkD3bEds6lQ8yiSIWmRTgrHWEP2fRKIgPxq2opPuy5bDdZY7ju1knYKC4QclDVq+aa/DJa3ujiQfhx2wohU9SvUY7tFnA== X-MS-TrafficTypeDiagnostic: VI1PR0301MB2560:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: OzMDEYq/nkIqlAhn4LGFbfagnrlUsynnXmODi0kXfRuWEPlzxkFg2rlw9DsidGxj1SwfhT6QkHgbBdsYe0rjt5A6Y0b2zL/89uI7SgUmfhTNB9ieMf8zkLjW968+VhKDgtagnpvpVwAUVRueI9qg3OXYTG5WQy9y4CZ8wnVrcfchUyrLD7rabUV+x7522x39QsEIc8WRwkoD9YPB0J1zCy6pxddWs4ndoYMRI7IR3eEKNJC24xNWNgeDxqHVVs/InW5K9NS1zCvkDNwSlEujTBgQMrQH0bRAK7GwM5i9eOvVrBhVe7ZPoAgCDNV8d81/txlmU3Opf8eK2Q2/1hzYkipZf/+j5h+DGR9E+Evt/3pRA/j4E9kAEXSlZDEt5vnFKgm/lPcZfRnduaf7/rQsv5grdaXumwgxUROE18gCV8BPgB/IDzwu7Aw3ImKPyA6iJbzfsfWxZ28hJlIlXOLVPn//9v2lMy08T81FJnpAM73Pc1NMVS5QJaseNH6WWelG8TIvb0nvE5yhHkZPa+hWfSqd8e3xvbprOfOtkerw1IpJcPNN6m+PlYY0QguV+iST85U+w4a4fDS+WTVzueBW4+xGIrKBILGq4zqfHXnb5fcCqQ9BxW6S0NcbaVA9tP4b X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?us-ascii?Q?m5mVYvlOa7Aep5yfiXdn0YmD0c7AlPIBhdzyjytR+YCTteb9dso/ssdtytfo?= =?us-ascii?Q?tKIePdWTxGQvPPCbzQmXM9Yg6xzvN6uIrFM7lBv5MR4XFmhvl3nPeaWW1bFc?= =?us-ascii?Q?kchZqOWx98LcA0XGMJbWuXeFh4GTJZSYEAtINkL4q+07BMEPcyX/uZT8N6MU?= =?us-ascii?Q?e17CrPN2krmC9kDZzhWTJLSmZdZHw+mflh2yxN/lSIx5mO0BrmNFPFROxWDw?= =?us-ascii?Q?xBbIazIcBTmGFKENVqX89acVuvuwvzpTdNUeBrEnzDQssyxNO8+zK5Av7uEN?= =?us-ascii?Q?+hhu+Mc8pEcbSNKAaA3ZXC+AKS6Rms5Rrg6GPPFp4Q2Hq2T6GfgQaIGuYfOx?= =?us-ascii?Q?YaEMbEmNZaZn8AE13Uk/dADiiuLyYlHWdbHzdyhSciH5OTLmFmoQYdz7xitH?= =?us-ascii?Q?rrT+rrbr6naYnWB0Q3WT2Ke2wNlrH1j/+QZ5vdqQSIl8MJ4SsJ4y6Bi6vBSu?= =?us-ascii?Q?9fLGZPAiPEb4fWxjV+mDrg+tJ4JTDLsQS1FqevI5RbSb3926FxKX+JGtykfL?= =?us-ascii?Q?pzTPvU3rZHGHOxshnQYzQlgj70Z22HHa27BcN/TlQ0F1bdcp5ih/ebcvnrBQ?= =?us-ascii?Q?Psyam1YGynJ5/pWqm0C7ZYSMeLCd9oZCwcHrQwl59kRfp1rozu0EJOwr3zd5?= =?us-ascii?Q?899a1nYsxwLmBQqQ1UoQXGewwHoA6GQmjTlWIbAxqyUmgb8kl6AN5aqeUFy5?= =?us-ascii?Q?nhMyIn3/VpoOEmfkPEkbA6U5HuCud3tMpjmpHKPAPce2jw+14EP7VBDzgpAf?= =?us-ascii?Q?vZUsXyPUFpGErSqbpnEt+lSv0JN8rAGw/bENz5mpbyCAoQnJfIK0/uvRdyJt?= =?us-ascii?Q?mHxpVfoOepBr+0ESxRMQ2+AqneOhKmZHZnb3HMWSebc6RUNG509u+jhuJ3/q?= =?us-ascii?Q?iB5UZeXsgwK27JRxCGZVIKjOJoYbwK0fQ8IiMJf7CBvyTxwJY19IMU4ftjiI?= =?us-ascii?Q?ulTGU4rRJb19h/MlzwrX6g=3D=3D?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: f2f72e5f-79d7-4bf8-f097-08d9d944b261 X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 16 Jan 2022 23:05:32.5589 (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: VI1PR0301MB2560 Subject: [FFmpeg-devel] [PATCH 22/25] avformat/matroskaenc: Remove duplicated code for writing WebVTT subs 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 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Archived-At: List-Archive: List-Post: Up until now, the WebM variant of WebVTT subtitles has been handled specially: It had its own function to write it, because the data had to be reformatted before writing. But given that other codecs also need reformatting, this is no good reason to also duplicate the generic stuff for writing Block(Group)s. This commit therefore uses an ordinary reformatting function for this task; writing WebVTT subtitles now uses the generic code and therefore automatically uses the least amount of bytes for its BlockGroup length fields whereas the earlier code used an overestimation for the length of the Duration element. This is the reason for the changes to the webm-webvtt-remux FATE-test. (This commit does not implement support for Matroska's way of muxing WebVTT; it also does not add checks to ensure that WebM-style subtitles don't get muxed in Matroska. But the function for reformatting gets a webm prefix to indicate that this is for WebM.) Signed-off-by: Andreas Rheinhardt --- Finally! Removing this has been on my list for ages; see https://ffmpeg.org/pipermail/ffmpeg-devel/2019-April/243012.html libavformat/matroskaenc.c | 117 ++++++++++--------------------- tests/ref/fate/webm-webvtt-remux | 4 +- 2 files changed, 39 insertions(+), 82 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index a3c84eb63b..e2f2dd7dae 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -2404,15 +2404,6 @@ static int mkv_write_header(AVFormatContext *s) return 0; } -static int mkv_blockgroup_size(int pkt_size, int track_num_size) -{ - int size = pkt_size + track_num_size + 3; - size += ebml_length_size(size); - size += 2; // EBML ID for block and block duration - size += 9; // max size of block duration incl. length field - return size; -} - #if CONFIG_MATROSKA_MUXER static int mkv_reformat_h2645(MatroskaMuxContext *mkv, AVIOContext *pb, const AVPacket *pkt, int *size) @@ -2481,10 +2472,38 @@ static int mkv_reformat_av1(MatroskaMuxContext *mkv, AVIOContext *pb, return 0; } +static int webm_reformat_vtt(MatroskaMuxContext *mkv, AVIOContext *pb, + const AVPacket *pkt, int *size) +{ + const uint8_t *id, *settings; + size_t id_size, settings_size; + unsigned total = pkt->size + 2U; + + if (total > INT_MAX) + return AVERROR(ERANGE); + + id = av_packet_get_side_data(pkt, AV_PKT_DATA_WEBVTT_IDENTIFIER, + &id_size); + settings = av_packet_get_side_data(pkt, AV_PKT_DATA_WEBVTT_SETTINGS, + &settings_size); + if (id_size > INT_MAX - total || settings_size > INT_MAX - (total += id_size)) + return AVERROR(ERANGE); + *size = total += settings_size; + if (pb) { + avio_write(pb, id, id_size); + avio_w8(pb, '\n'); + avio_write(pb, settings, settings_size); + avio_w8(pb, '\n'); + avio_write(pb, pkt->data, pkt->size); + } + return 0; +} + static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv, AVIOContext *pb, const AVCodecParameters *par, mkv_track *track, const AVPacket *pkt, - int keyframe, int64_t ts, uint64_t duration) + int keyframe, int64_t ts, uint64_t duration, + int force_blockgroup) { uint8_t *side_data; size_t side_data_size; @@ -2506,8 +2525,6 @@ static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv, if (duration) ebml_writer_add_uint(&writer, MATROSKA_ID_BLOCKDURATION, duration); - /* The following string is identical to the one in mkv_write_vtt_blocks - * so that only one copy needs to exist in binaries. */ av_log(logctx, AV_LOG_DEBUG, "Writing block of size %d with pts %" PRId64 ", dts %" PRId64 ", " "duration %" PRId64 " at relative offset %" PRId64 " in cluster " @@ -2542,7 +2559,7 @@ static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv, ebml_writer_close_master(&writer); } - if (writer.nb_elements == 2) { + if (!force_blockgroup && writer.nb_elements == 2) { /* Nothing except the BlockGroup + Block. Can use a SimpleBlock. */ writer.elements++; // Skip the BlockGroup. writer.nb_elements--; @@ -2557,59 +2574,6 @@ static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv, return ebml_writer_write(&writer, pb); } -static int mkv_write_vtt_blocks(AVFormatContext *s, AVIOContext *pb, const AVPacket *pkt) -{ - MatroskaMuxContext *mkv = s->priv_data; - mkv_track *track = &mkv->tracks[pkt->stream_index]; - ebml_master blockgroup; - size_t id_size, settings_size; - int size, id_size_int, settings_size_int; - const char *id, *settings; - int64_t ts = track->write_dts ? pkt->dts : pkt->pts; - const int flags = 0; - - id = av_packet_get_side_data(pkt, AV_PKT_DATA_WEBVTT_IDENTIFIER, - &id_size); - id = id ? id : ""; - - settings = av_packet_get_side_data(pkt, AV_PKT_DATA_WEBVTT_SETTINGS, - &settings_size); - settings = settings ? settings : ""; - - if (id_size > INT_MAX - 2 || settings_size > INT_MAX - id_size - 2 || - pkt->size > INT_MAX - settings_size - id_size - 2) - return AVERROR(EINVAL); - - size = id_size + 1 + settings_size + 1 + pkt->size; - - /* The following string is identical to the one in mkv_write_block so that - * only one copy needs to exist in binaries. */ - av_log(s, AV_LOG_DEBUG, - "Writing block of size %d with pts %" PRId64 ", dts %" PRId64 ", " - "duration %" PRId64 " at relative offset %" PRId64 " in cluster " - "at offset %" PRId64 ". TrackNumber %u, keyframe %d\n", - size, pkt->pts, pkt->dts, pkt->duration, avio_tell(pb), - mkv->cluster_pos, track->track_num, 1); - - blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, - mkv_blockgroup_size(size, track->track_num_size)); - - put_ebml_id(pb, MATROSKA_ID_BLOCK); - put_ebml_length(pb, size + track->track_num_size + 3, 0); - put_ebml_num(pb, track->track_num, track->track_num_size); - avio_wb16(pb, ts - mkv->cluster_pts); - avio_w8(pb, flags); - - id_size_int = id_size; - settings_size_int = settings_size; - avio_printf(pb, "%.*s\n%.*s\n%.*s", id_size_int, id, settings_size_int, settings, pkt->size, pkt->data); - - put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, pkt->duration); - end_ebml_master(pb, blockgroup); - - return 0; -} - static int mkv_end_cluster(AVFormatContext *s) { MatroskaMuxContext *mkv = s->priv_data; @@ -2769,9 +2733,11 @@ static int mkv_write_packet_internal(AVFormatContext *s, const AVPacket *pkt) relative_packet_pos = avio_tell(pb); - if (par->codec_id != AV_CODEC_ID_WEBVTT) { + /* The WebM spec requires WebVTT to be muxed in BlockGroups; + * so we force it even for packets without duration. */ ret = mkv_write_block(s, mkv, pb, par, track, pkt, - keyframe, ts, write_duration); + keyframe, ts, write_duration, + par->codec_id == AV_CODEC_ID_WEBVTT); if (ret < 0) return ret; if (keyframe && IS_SEEKABLE(s->pb, mkv) && @@ -2785,18 +2751,6 @@ static int mkv_write_packet_internal(AVFormatContext *s, const AVPacket *pkt) return ret; track->has_cue = 1; } - } else { - ret = mkv_write_vtt_blocks(s, pb, pkt); - if (ret < 0) - return ret; - - if (IS_SEEKABLE(s->pb, mkv)) { - ret = mkv_add_cuepoint(mkv, pkt->stream_index, ts, - mkv->cluster_pos, relative_packet_pos, duration); - if (ret < 0) - return ret; - } - } track->last_timestamp = ts; mkv->duration = FFMAX(mkv->duration, ts + duration); @@ -3162,6 +3116,9 @@ static int mkv_init(struct AVFormatContext *s) case AV_CODEC_ID_AV1: track->reformat = mkv_reformat_av1; break; + case AV_CODEC_ID_WEBVTT: + track->reformat = webm_reformat_vtt; + break; } if (s->flags & AVFMT_FLAG_BITEXACT) { diff --git a/tests/ref/fate/webm-webvtt-remux b/tests/ref/fate/webm-webvtt-remux index 15e919d74b..d847bbee2b 100644 --- a/tests/ref/fate/webm-webvtt-remux +++ b/tests/ref/fate/webm-webvtt-remux @@ -1,5 +1,5 @@ -c5625f28e6968e12d91f125edef5f16c *tests/data/fate/webm-webvtt-remux.webm -6560 tests/data/fate/webm-webvtt-remux.webm +8620a6614f149fc49ab7f4552373943e *tests/data/fate/webm-webvtt-remux.webm +6556 tests/data/fate/webm-webvtt-remux.webm #tb 0: 1/1000 #media_type 0: subtitle #codec_id 0: webvtt -- 2.32.0 _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org https://ffmpeg.org/mailman/listinfo/ffmpeg-devel To unsubscribe, visit link above, or email ffmpeg-devel-request@ffmpeg.org with subject "unsubscribe".