From patchwork Sun Jan 16 23:03:58 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 33630 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp2273898iog; Sun, 16 Jan 2022 15:07:07 -0800 (PST) X-Google-Smtp-Source: ABdhPJyGiZMjPHAeM2yDle2VM7+rqqpxsLGUomayf6rEOu7vpNAOFwE9SozWIMXBCAFuNK/CWCuV X-Received: by 2002:a17:907:60d6:: with SMTP id hv22mr15574181ejc.438.1642374427630; Sun, 16 Jan 2022 15:07:07 -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 u2si6668071ejy.858.2022.01.16.15.07.07; Sun, 16 Jan 2022 15:07:07 -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=etcZQNVm; 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 8D41D68AF9F; Mon, 17 Jan 2022 01:05:28 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-DB3-obe.outbound.protection.outlook.com (mail-oln040092074080.outbound.protection.outlook.com [40.92.74.80]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 91B5768AF8B for ; Mon, 17 Jan 2022 01:05:26 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Ml2ZBAaiw51CgaDdYG4uQo0NBB88zGdh0MdoT6+DTw6W7WmjTlw+Z7/T73FTQiPUPVh+ZakN53oB7t6R/MwAEeqQ+sfzJxj/siN9FNVvcb3JEQQ0WM7oIXQh0niKCZL5Q+t+EMy+w5p3hRgtDHX55iNAwe2YenIJriEdaXJ2GOWEAknCGiMCkliTe6Xr3aOX5sWFrFxwZE7OV2L6Y57YaNtb7nvHr9R468vKaoEZuUqN/HuqmfOD9ZJKJ+oAbWqhy35dv0ZVkR4EMXKbNZoLT4kPZRQJTtOK1eTTYLcv/QNqtFddOcpfgwtsyD/yOgyS07L1TcW8oLEISTEL8EjDsg== 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=q+7PFHggiRfu3hKblBHtRex3MkL/GAuCpAoJbBFBNP4=; b=mLoJinhL3dSmAu6h5QzocicKoKUzTpwAxzqHkv7tHl4M/P4/Ewo4Anrd594cxfJ8fZ7EB0slMTCaT290a7oyhjnWPcBzKkdE55MLZwwEQWEIMjCBfWGmAjhLOnvoxNycloPz0Db0Y4qSipvFoWJBUucThktM8W2GHPMYvPVCw3rQZLE1hAnBtt46flAVCzJ774T+hYjMyGv/9s+IRWCU96bmbQRQfupjKCi/ixmutujEkwoj+H5Md9AxmQ56g6lgjmr4EJaUSh/tHXDMLWm12duh6H83GD0Z2lCVM+INz/RhaLXjbWuJ5f5G4/JF8DOFKwTIY9ZxQ/ebiQrHZZPLRA== 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=q+7PFHggiRfu3hKblBHtRex3MkL/GAuCpAoJbBFBNP4=; b=etcZQNVmm/g5XRINGib0U3uMcTqhNmwr57ne0R2AJV3SlGIN4cebT6Qa5R/vbx4R9x51GGQmBvQ6T6ZpUTQPUa0ocWEVlrg6fkIK970LehsdjSLdfSsaBBUFibMFD6tfVIbP2nsNqpC7ekra4JOg7ZzV3lvgxAos3vZKfwF0pfZDES4NmWDl9aA5LzaB/NHgDa9AuPjJmjbBfQi6M5HPOJgxXyJxrwvjJC4XoUFYgQgjlekzmqU5Vq3ZE9I70tUCciZ/yJ8qJ+63SeZ0ykARFDV1bjwtCmyexI12OvPV3FdFtzhm6n7RzpR7bVoiCYqJZku9s1/1bhcOm467SxMJJQ== 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:24 +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:24 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Mon, 17 Jan 2022 00:03:58 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: References: X-TMN: [0WHGthKqGc1j6pR8dDjVbEn8BUVAOdvl] 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-17-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: ac8e3345-ce08-4a97-4abd-08d9d944ad6f X-MS-Exchange-SLBlob-MailProps: S/btQ8cKWiQ2WpFcKeHQajRkhOqduPnsJ2TXWru2y+0GyChdbKekiuIZ3645IREbUVndyYory9Qs2wrVP8mq/j2N+jrvcCDUWAW5hLmLH9Az8ngmA1IkbIeqTFyH1XTkH93EGGJxs8kUhuXL12BE76dvEKU6JgbbC8+5gB1Wm6SZWCBry0e1qWF+tdLDxWhxmo7dpeiMpXRzlj1UI6Aq1KUVtUwzIBSrCp1MbmIPel3qhxtFMkGOC+cePk9T8jEdZMC8DePjNOd7c/TDqyyBUtnNV1LWQyv3QwKEKW7psl64dXDJFqIARfyJ8ouRwykCGUMaJOR+OYHMcZE+wcSvs+178WDQDaIUbTg+gwFKYn2dUa0TcwLtkxjw677ZeO7DTBvZBZ3SsegjpMVYZM+Nkj1tFgXr3LPBm0GS+saMx/aQ4xu1mGJDtuBNXGBMC2eogJUmGydmITAQEcvpu/F8exXJHypQJWS9h9vpby2RYXa5cGex+E88O4bQrWOcLvdBFLCDCGuHiSZ/XwWJw7ymIU9DxVS2tlDAGiwdHL0ymNxabTffhwVAFy/AjBTLDlhvzO5UESXvhQVKEA8+VnEHKc0uV7+LpSAvQpgcfdNJCO5nkkAg0zugeyvFHI6oD7lE3xB3z3bkr1I/6ezjh+t7epdIEjXt0iWtoHW2NO6tYn8Owxk5slqTIJA3NNJyzxaeAY6ba55FKtYfNyQ8wSd4d+OHgH7MfSd+0iZJ+jMofjGzvUR9NyqB+hR4C7zu5bcx3nmTz/6IhJo= X-MS-TrafficTypeDiagnostic: VI1PR0301MB2560:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: WZoSdr81AeroDnzou5DuyCT1bhhSn/XrBJNCYjV+U7IU2rhlUkXzAAiBItaXv2gafAZbYlyNKpfjGbpXrFQLGFTv6FF/HBccMPOtlnQ8Zl7SoZgRliuNlFsSq7oR2OiT/YMz3QN2laBzsGOrsSwdUDiiOzWhLw7GVfZSCMqa4aili3FaE998l7htq3AGedESGEQimdIIML/I0tYt6if1ZtdreFXL9cARaMUEI9HQIS0zemnIb4xaBsDdcmr+akm1tI+tPpeVbapHaTLJs3pLsr5i3cyfaWjW9UoB0+KiUKsm2FMtxKV3UyGS5q4Z1TvRetZqvvvQUA95cD5de882OfLvIWsmVqFu70usesmsXzuNUzRcAlMwy56fy+s2xvVdH78tGecGCT++aCtxW/uwqPkmZ8HSjq98bXtZ+PiFwCHT1OxX+/S+qfFlqenNlP+D9atTG4wtHBLMFJQAsc0nVyWNtOHynjAlcAYM8oeDmYQ6yeWSPXp0rtvL20YoWIfou+0Nji8x5gU1fNqEENLjsJINLQeJ4L5TZIq4BKWWpGzl+/CkkwGQnYtgAv/ov2nOWufZg68RuYr4WEhUyIeCXQ== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: j+UeB+lwq9UzVFaJYqraU9yjnAeL5nceLhFEx8sVb/Kaai5EYXfqTcmupds2drMwstW02fl9DYkuKXe7/zxNVSFHYXkk8gJU8E4Sd+hXijHvICLbC/Q9hzkBHmeIi0JUTxBhRhrZidGx2WHLYveepUlb1/q/K5ZgWYJu+cWPK0HBN9LKAr1fSLMqugv5lkh+kEowL+/qGqVcRDvWhqcd7XgQNnwUD4BlGXV0IBYZ1wrv+UTkAJAs9usqtgMf+x+dF4OYDZp53qhR3qGQUm8WnGeCASRgA5TkkadIwF3t1whnylRNaBsCmva2oUMf/0GwSfskw06OBrEyceboIOCx3LIcvLRz0iwOgkKjETEbGWjEJILo71adzOFCYt27CDm6DCgk+8z+jAHi7qA6iSQ5zuej57pi5iGcZk1eqLDWaUhHUfvX3yOz+9SYeGq17+/6B5UUyxcXWUKUyW+pnkFwqreaC8DmmyM/ZqG3v1LbMrnNVXyjFL/c3kfB6WVrUwgyArs8RPDLK2n1aZS7DqI71BLtt+nJygj6Fu/9ujOGTNfVLV7hxK90+HrcdZHNf84RZRumi0a0AnFkrxOA5j6fD3VyPRlVAa2KHAle4q2NrZNVEP/h8Jw96Rqv3mnu/PaUzxLxnbRcWuH9H2AXKAYwpeBcICfS0VsM4MRGt8iU9CAgAl+hJFujWDkUtmmHuK86s6FWJOKp9aC8rLSmWrhZGq9OQMYgm1NdX20bc31LoKn51brmGABiRqpr8WmnP1Nw3SOIyarMVnI1LMbgZqqULes7l7m8UYWE2k4mvPf0rE2qQAjtzv61atcweUu9iCfvFMC0/hFguzPV5PH5e6q0XHYhHLfqLLzlG/QbYUIKyA5fzMO27IWD2WWFa8t/2f5C8jk23ykAtO9UuPnNvhg9FTsx5oL+6PQyhbBk4b35VfhYELxHg3sF1xJygA2k34awSp1t255x/Qmu55xBgzcGzQ== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: ac8e3345-ce08-4a97-4abd-08d9d944ad6f 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:24.2110 (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 18/25] avformat/matroskaenc: Remove special code for writing subtitles 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: Y9sKTW7/Sb1P Once upon a time, mkv_write_block() only wrote a (Simple)Block, not a BlockGroup which is needed for subtitles to convey the duration. But with the introduction of support for writing BlockAdditions and DiscardPadding (both of which require a BlockGroup), mkv_write_block() can also open and close a BlockGroup of its own. This naturally led to some code duplication which is removed in this commit. This new code leads to one regression: It always uses eight bytes for the BlockGroup's length field, whereas the earlier code usually used the lowest amount of bytes needed. This will be fixed in a future commit. This temporary regression is also the reason for changes to the binsub-mksenc and matroska-zero-length-block fate tests. Signed-off-by: Andreas Rheinhardt --- libavformat/matroskaenc.c | 40 ++++++++++------------- tests/ref/fate/binsub-mksenc | 2 +- tests/ref/fate/matroska-zero-length-block | 4 +-- 3 files changed, 20 insertions(+), 26 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index e247f1029c..4e921e3d6d 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -2418,7 +2418,7 @@ static int mkv_reformat_av1(MatroskaMuxContext *mkv, AVIOContext *pb, } static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, - uint32_t blockid, const AVPacket *pkt, int keyframe) + const AVPacket *pkt, int keyframe, uint64_t duration) { MatroskaMuxContext *mkv = s->priv_data; AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar; @@ -2428,10 +2428,10 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, int err = 0, offset = 0, size = pkt->size; int64_t ts = track->write_dts ? pkt->dts : pkt->pts; uint64_t additional_id; + uint32_t blockid = MATROSKA_ID_SIMPLEBLOCK; int64_t discard_padding = 0; unsigned track_number = track->track_num; ebml_master block_group, block_additions, block_more; - int blockgroup_already_opened = blockid == MATROSKA_ID_BLOCK; ts += track->ts_offset; @@ -2466,7 +2466,7 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, side_data = av_packet_get_side_data(pkt, AV_PKT_DATA_SKIP_SAMPLES, &side_data_size); - if (side_data && side_data_size >= 10 && !blockgroup_already_opened) { + if (side_data && side_data_size >= 10) { discard_padding = av_rescale_q(AV_RL32(side_data + 4), (AVRational){1, par->sample_rate}, (AVRational){1, 1000000000}); @@ -2477,8 +2477,7 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, &side_data_size); if (side_data) { // Only the Codec-specific BlockMore (id == 1) is currently supported. - if (side_data_size < 8 || (additional_id = AV_RB64(side_data)) != 1 || - blockgroup_already_opened) { + if (side_data_size < 8 || (additional_id = AV_RB64(side_data)) != 1) { side_data_size = 0; } else { side_data += 8; @@ -2486,7 +2485,7 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, } } - if (side_data_size || discard_padding) { + if (side_data_size || discard_padding || duration) { block_group = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, 0); blockid = MATROSKA_ID_BLOCK; } @@ -2502,6 +2501,9 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, avio_write(pb, data + offset, size); } + if (duration) + put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration); + if (blockid == MATROSKA_ID_BLOCK && !keyframe) put_ebml_sint(pb, MATROSKA_ID_BLOCKREFERENCE, track->last_timestamp - ts); track->last_timestamp = ts; @@ -2520,7 +2522,7 @@ static int mkv_write_block(AVFormatContext *s, AVIOContext *pb, end_ebml_master(pb, block_more); end_ebml_master(pb, block_additions); } - if (side_data_size || discard_padding) + if (blockid == MATROSKA_ID_BLOCK) end_ebml_master(pb, block_group); return 0; @@ -2697,8 +2699,11 @@ static int mkv_write_packet_internal(AVFormatContext *s, const AVPacket *pkt) AVIOContext *pb; AVCodecParameters *par = s->streams[pkt->stream_index]->codecpar; mkv_track *track = &mkv->tracks[pkt->stream_index]; - int keyframe = !!(pkt->flags & AV_PKT_FLAG_KEY); + int is_sub = par->codec_type == AVMEDIA_TYPE_SUBTITLE; + /* All subtitle blocks are considered to be keyframes. */ + int keyframe = is_sub || !!(pkt->flags & AV_PKT_FLAG_KEY); int64_t duration = pkt->duration; + int64_t write_duration = is_sub ? FFMAX(duration, 0) : 0; int ret; int64_t ts = track->write_dts ? pkt->dts : pkt->pts; int64_t relative_packet_pos; @@ -2735,9 +2740,8 @@ static int mkv_write_packet_internal(AVFormatContext *s, const AVPacket *pkt) relative_packet_pos = avio_tell(pb); - if (par->codec_type != AVMEDIA_TYPE_SUBTITLE || - (par->codec_id != AV_CODEC_ID_WEBVTT && duration <= 0)) { - ret = mkv_write_block(s, pb, MATROSKA_ID_SIMPLEBLOCK, pkt, keyframe); + if (par->codec_id != AV_CODEC_ID_WEBVTT) { + ret = mkv_write_block(s, pb, pkt, keyframe, write_duration); if (ret < 0) return ret; if (keyframe && IS_SEEKABLE(s->pb, mkv) && @@ -2745,26 +2749,16 @@ static int mkv_write_packet_internal(AVFormatContext *s, const AVPacket *pkt) par->codec_type == AVMEDIA_TYPE_SUBTITLE || !mkv->have_video && !track->has_cue)) { ret = mkv_add_cuepoint(mkv, pkt->stream_index, ts, - mkv->cluster_pos, relative_packet_pos, 0); + mkv->cluster_pos, relative_packet_pos, + write_duration); if (ret < 0) return ret; track->has_cue = 1; } } else { - if (par->codec_id == AV_CODEC_ID_WEBVTT) { ret = mkv_write_vtt_blocks(s, pb, pkt); if (ret < 0) return ret; - } else { - ebml_master blockgroup = start_ebml_master(pb, MATROSKA_ID_BLOCKGROUP, - mkv_blockgroup_size(pkt->size, - track->track_num_size)); - - /* All subtitle blocks are considered to be keyframes. */ - mkv_write_block(s, pb, MATROSKA_ID_BLOCK, pkt, 1); - put_ebml_uint(pb, MATROSKA_ID_BLOCKDURATION, duration); - end_ebml_master(pb, blockgroup); - } if (IS_SEEKABLE(s->pb, mkv)) { ret = mkv_add_cuepoint(mkv, pkt->stream_index, ts, diff --git a/tests/ref/fate/binsub-mksenc b/tests/ref/fate/binsub-mksenc index 184661a3f0..01e7db64f2 100644 --- a/tests/ref/fate/binsub-mksenc +++ b/tests/ref/fate/binsub-mksenc @@ -1 +1 @@ -490b1b4beb4a614c06004609039ce779 +9dd2ff92a3da9fb50405db3d05e41042 diff --git a/tests/ref/fate/matroska-zero-length-block b/tests/ref/fate/matroska-zero-length-block index 924cec1e3f..edee36a4ab 100644 --- a/tests/ref/fate/matroska-zero-length-block +++ b/tests/ref/fate/matroska-zero-length-block @@ -1,5 +1,5 @@ -f37ba7e8a30eaa33c1fd0ef77447fb41 *tests/data/fate/matroska-zero-length-block.matroska -636 tests/data/fate/matroska-zero-length-block.matroska +c09d3b89ed0795817d671deb041fca1b *tests/data/fate/matroska-zero-length-block.matroska +650 tests/data/fate/matroska-zero-length-block.matroska #tb 0: 1/1000 #media_type 0: subtitle #codec_id 0: subrip