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 4E5E847AC9 for ; Sun, 1 Oct 2023 13:07:45 +0000 (UTC) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2552868CDBF; Sun, 1 Oct 2023 16:07:44 +0300 (EEST) Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05olkn2065.outbound.protection.outlook.com [40.92.90.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 6287368CD1C for ; Sun, 1 Oct 2023 16:07:37 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=BhITT4sWBtGOmJ8jkMlhS7FSKigWzFB1lhJMopqcRQqKJoJfIj++i940HRrGJvVvNgJDblYufRkjO8uP1SNeU4+mtUIp155UnwFdiraOXEO16zjzWFrDT37hfv5GcCVV3Bqx7fHHs7XrcuCglYDigNm8SmM+P/oFDHW4i8UirMoHglvtizqG/FJ8QQEqTiqfi29Kt9/9m+4+vODChiMTgWMS0d0iRn8HjpXmRye2CtdSXggMsP3tXfuTQvRFMKt24DcO3RbSUkx8c6Y2CNDpWNRaLlcCGd+5wlOR1lk+QSxO1ZEeyUVN5o6dk7bl1H00FGh52BRER53TZOUcmvcNcw== 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=pBw6LWhY9P+g0JJtOyvRHPSgQ7Pv1w8e9JYqr5yO5B8=; b=cbutIlg67CfbGd8NT9lNOuC6w95epEvDctm6VdpdQx+BSbttpAUXIbJMJZmDanmNzffX6mAMzSI8QO0C3KlkEDS3Uxr9DAczc6yZ+vYPL4csHEBQK32oDkfleTMmV7P9neZLIcfaB2fd1GZWfhiA99JWrYpnPGZJRTmcKyKjrd52xoGzwZ4Lg9hnvUuwVSm4nSqhlC7q5nCavkojdrOiZFZPoR40NAc5v3ujT5+OKwUUX2t0dlqaDXhSiyfla9MAMN/JOSSnWZ1h0wWSpZgphkQvfO2ONU3g8wlBm7nzF/rDvksuRgXGAraYflZSOiw/7xuyp5/45Pm438sDLVzx6Q== 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=pBw6LWhY9P+g0JJtOyvRHPSgQ7Pv1w8e9JYqr5yO5B8=; b=jgwQHtRAFV/eA+T5H8tYIr2DcYcalJex6Jj3n+MFv0Ajk97RrpLkxS9hxN76Pg0vLejxcP693T7JtT8CbRYY2Ydg5x/8Dt1gaEjYRHwvTdSVlcIGAUkA1XF/DfYSMBsDeSJzTdszrTcbyLWpsUQCkmUJ77lES0F8l6aLsNIcwYvAa1KYTVPJ14E14BhozFU6yPIpfaB5XnTu3fKK6OvD9lzOOhFt06uPZD4JwA8UOJefvC9X5ExW/Rjjj96hZKrYV7xxLFRNKvMF5L61AHNdmf4o96qd+5AoxHHg0mLLhINEKLX0eqewxbtiLiR1JsQPnVe5p10v94nnYGvM/QoRhg== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by AM8P250MB0138.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:321::16) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6838.28; Sun, 1 Oct 2023 13:07:36 +0000 Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::5e01:aea5:d3a8:cafa]) by AS8P250MB0744.EURP250.PROD.OUTLOOK.COM ([fe80::5e01:aea5:d3a8:cafa%3]) with mapi id 15.20.6792.026; Sun, 1 Oct 2023 13:07:36 +0000 Message-ID: Date: Sun, 1 Oct 2023 15:08:51 +0200 User-Agent: Mozilla Thunderbird To: ffmpeg-devel@ffmpeg.org References: Content-Language: en-US From: Andreas Rheinhardt In-Reply-To: X-TMN: [rQILhUjzUnGZ2bL5U/dBne9UaDd6NDYP] X-ClientProxiedBy: ZR0P278CA0019.CHEP278.PROD.OUTLOOK.COM (2603:10a6:910:1c::6) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <56ceac23-9d88-48f1-b040-09181a351fa4@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|AM8P250MB0138:EE_ X-MS-Office365-Filtering-Correlation-Id: 96bad879-17a0-4f2a-51b7-08dbc27f61bb X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: aelJX6j/wzmt2jOiGXTSwjzXZRhcq08rlXjWv1PvDEbip+U3wNTFU5SArc8xX2mbaHZIppHzHVzXKTe5aExn8Y47RFhYMvqXOzG0/K/Vy9vkZv3npsXbfen5S/8VJ7jqk7+axdcaasifRz6GtSUlPftUNdQjaZ0IAnMyaCTzK4PwmP9Vg+8lblST8AtuNMK+Qf27VHnJI1bYFjIfSSUrTU2DsEMEBpwtc3EL4iBX5pvZFiOHhLCAPyOM8IrmfRQyg0M7eWgUB+hXuEKdadPwF24j4kVXW+b9r/r/SXjfMkSSWlhkgkBX1gMefzTsSeTeOmCPeP0PSnKagixseXS1BqE1EX0aVVRPplN7ooffUPCqLoYR4XmhjsFpMMY9O0QKAqTJ1189WCmZ2fe5abfGimJc6uIT3Mxua8teDT0HflykZbMtC9lsv7TAaUbECxt3hgfQ8v+e8Ept7K1yy9K5fb+JhHSRHSkLa9rZHMRXMyvv/uf8SsJ6EOKMfUQkFWGqLrxfsxqjZkU3vzv62Oc/+BcQvZbHaBzFNAoUyiJpZSTzW6kWuHjPqhPotzwEPZEB9fwpgiPVybCdDiEefitWCHiLonQxyKRblWTMi6fLMwQ= X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: =?utf-8?B?bWRRMkNwN2xjSFNoTXE3Skwxc0ZkZVg5a3A3MmozRjN4a00zelhNaldUUUNY?= =?utf-8?B?T25TcXZURVZXbXl2SmhiWE0zZjRKd3FOeHJEUjBRblhIUmJ6YVh0YnRaT3hD?= =?utf-8?B?cFcyRkgwdVJxR05mcEU1eXJOWnE0RG5Ha3NPcVFFZ2d5ZldYSDZxaGlEcHdF?= =?utf-8?B?ZjdMbFVlVlFkWlJ4OG11OXdXdFNYUXoxNFZubTI2ejVsTVZOTGdFOE9oTndM?= =?utf-8?B?TThmVEdOV2Z3VVNDTmlNS2p0dHdidFQwRVo4aTAzQWM3VnFrcGVMZEpvaFoz?= =?utf-8?B?dWVkeVg4TVhCS29kSWdaM0ZHbzB2dWFMOUNyVW53YlArZ1JxOGFmVFpYaHpm?= =?utf-8?B?dGxSeTYxd3Jrc0g2N2R2VjF2VW04T1ZnV2MwNWhYRkNhaHRTQ2p5b2VoODVT?= =?utf-8?B?QS9IMm9ZNzlTam9wWGZrVWlLQVAyb3hQR2s4TW5tbHVJZ0g0TUVkTjc2OWdE?= =?utf-8?B?eWN0Rys5T1NjK0IwRmt0dzB2T3RUd0s4R1gvSHVGcHRIMklRemNIYmd4QVpM?= =?utf-8?B?TXZpZkVkbVJQa01MZEliaWpDSS9kTmY1RE1ITDA1My93NUhFY29nQjhCTGpC?= =?utf-8?B?VUkzQ3N3RnFBVlgrSGM1VGdURjRUZldBVDR2dlRyRUN2Vk9tSnRaUURIbFcz?= =?utf-8?B?ajNvTDU0ckhTUHpzVGZIMkIyUmxuYTRTamtiaGk2MXNYNXZ3MWUwcXg1OUds?= =?utf-8?B?bUJpSUpOcUpoRlFWQWJEZGJZT1ExNUtvd0VvQVQ0UkZOMGQ5Qi9PUHp4bnV2?= =?utf-8?B?VzNGRVVtMjRYMUMrK1I5SGVXY2lLaW9PeEw4Wk8xV0FuNnlabzNmMk1JeElB?= =?utf-8?B?YXdrL053RHdVanM2UHlHN0VUVmdMa1h1a3E5RU1sUmRZekw2N0VoSkM4OTI5?= =?utf-8?B?NVVCZld0UEVuQzBCNEszbTNSK09aVitvckRBbksxNk1rZWJVQWhlVUdqendM?= =?utf-8?B?Ym5OREFXOE4wbDhQYzBJQUdDRWxVa0RhWTA1TEdMcyt0b0dyTlE1SDkzdGdj?= =?utf-8?B?VGx3UTN3dnovQW9jZGNWdEZ3d3lRQlZ5b0hWemlYSU5RYXk0ZEhLSXZBTm9t?= =?utf-8?B?eVo4VUQrNXBYdmtZbEMzOElOTjdnYzY4MEgrUW9KL2w3UzhWQm8rYThzNnF2?= =?utf-8?B?ZVVxTU42YWxlOUdHMnNab09uaTFYajI5a28yWU8vVHFFQXZ5OVpGVlY5azZy?= =?utf-8?B?aHMvQjJOdTdlN3lpU1Q3L2RwdGNhQm4wY0xtUVB2bGp0V1ZtRkkzdzFoTzl5?= =?utf-8?B?MVQrdlI4VEhzcTA5bTM1eDJRQkFSeWljNnJwN25MWUUrUTdwaWV1ODdNTCta?= =?utf-8?B?Z210WmY3NWJLVjVTeityc0NWdFV0NkxqTm1yKzhNTmhobGpyZTE4aEpnRUdO?= =?utf-8?B?M2M1NDFXQVlwTlpucGF4MW5qTGxUU2NEV2x6OWJIU3RnM20yY1NkclQwbjRh?= =?utf-8?B?bXQvOWNHbGJkeHNKVWNiT1pFL29nMjNZZWZwUlZBbDVOOExOVHZVb01EUi9Z?= =?utf-8?B?NEozcENZd3hBSHNZK1RHQ0VhRHArUDNPK0E3RC92U05CVjdMcS96L1YrV2d0?= =?utf-8?B?ODUzWFBMZWUvS1Q2dlNTaFFqS2U2Q3d1ZVc4dzZtQ1dlT3hmM0dTZnlZMjJq?= =?utf-8?B?MnJzT3lzVEVHNm9SdFpvbzRWSU5OSnFjYWlscWp0bUR6alF0RnhHYmQwREVj?= =?utf-8?Q?Nd5O7y9tCoMjD8NpvN0w?= X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 96bad879-17a0-4f2a-51b7-08dbc27f61bb X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Oct 2023 13:07:36.1853 (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: AM8P250MB0138 Subject: Re: [FFmpeg-devel] [PATCH 1/2] avformat/matroskaenc: Don't create wrong packet durations 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 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: Andreas Rheinhardt: > We have to write an explicit BlockDuration element (and use > a BlockGroup instead of a SimpleBlock) in case the Track > has a DefaultDuration that is inconsistent with the duration > of the packet. > > The matroska-h264-remux test uses a file with coded fields > where the duration of a Block is the duration of a field, > not of a frame, therefore this patch writes said BlockDuration > elements. > > (When using a BlockGroup, one has to add ReferenceBlock elements > to distinguish keyframes from non-keyframes. Unfortunately, > the AV1 codec mapping [1] requires us to reference all references > and to really use the real references, which requires a lot of > effort for basically no gain. When BlockGroups are used with AV1, > the created files are most likely invalid, both before and after > this patch, but this patch makes this more likely to happen.) > > [1]: https://github.com/ietf-wg-cellar/matroska-specification/blob/master/codec/av1.md > > Signed-off-by: Andreas Rheinhardt > --- > libavformat/matroskaenc.c | 40 ++++++++++++++++++++++-------- > tests/ref/fate/matroska-h264-remux | 4 +-- > 2 files changed, 32 insertions(+), 12 deletions(-) > > diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c > index ba54f5f98e..9286932a08 100644 > --- a/libavformat/matroskaenc.c > +++ b/libavformat/matroskaenc.c > @@ -195,6 +195,8 @@ typedef struct mkv_track { > int codecpriv_offset; > unsigned codecpriv_size; ///< size reserved for CodecPrivate excluding header+length field > int64_t ts_offset; > + uint64_t default_duration_low; > + uint64_t default_duration_high; > /* This callback will be called twice: First with a NULL AVIOContext > * to return the size of the (Simple)Block's data via size > * and a second time with the AVIOContext set when the data > @@ -1805,6 +1807,16 @@ static int mkv_write_track_video(AVFormatContext *s, MatroskaMuxContext *mkv, > return ebml_writer_write(&writer, pb); > } > > +static void mkv_write_default_duration(mkv_track *track, AVIOContext *pb, > + AVRational duration) > +{ > + put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, > + 1000000000LL * duration.num / duration.den); > + track->default_duration_low = 1000LL * duration.num / duration.den; > + track->default_duration_high = track->default_duration_low + > + !!(1000LL * duration.num % duration.den); > +} > + > static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, > AVStream *st, mkv_track *track, AVIOContext *pb, > int is_default) > @@ -1913,16 +1925,19 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, > } > > switch (par->codec_type) { > + AVRational frame_rate; > case AVMEDIA_TYPE_VIDEO: > mkv->have_video = 1; > put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_VIDEO); > > - if( st->avg_frame_rate.num > 0 && st->avg_frame_rate.den > 0 > - && av_cmp_q(av_inv_q(st->avg_frame_rate), st->time_base) > 0) > - put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, 1000000000LL * st->avg_frame_rate.den / st->avg_frame_rate.num); > - else if( st->r_frame_rate.num > 0 && st->r_frame_rate.den > 0 > - && av_cmp_q(av_inv_q(st->r_frame_rate), st->time_base) > 0) > - put_ebml_uint(pb, MATROSKA_ID_TRACKDEFAULTDURATION, 1000000000LL * st->r_frame_rate.den / st->r_frame_rate.num); > + frame_rate = (AVRational){ 0, 1 }; > + if (st->avg_frame_rate.num > 0 && st->avg_frame_rate.den > 0) > + frame_rate = st->avg_frame_rate; > + else if (st->r_frame_rate.num > 0 && st->r_frame_rate.den > 0) > + frame_rate = st->r_frame_rate; > + > + if (frame_rate.num > 0) > + mkv_write_default_duration(track, pb, av_inv_q(frame_rate)); > > if (CONFIG_MATROSKA_MUXER && !native_id && > ff_codec_get_tag(ff_codec_movvideo_tags, par->codec_id) && > @@ -2739,7 +2754,12 @@ static int mkv_write_block(void *logctx, MatroskaMuxContext *mkv, > ebml_writer_open_master(&writer, MATROSKA_ID_BLOCKGROUP); > ebml_writer_add_block(&writer, mkv); > > - if (duration) > + if (duration > 0 && (par->codec_type == AVMEDIA_TYPE_SUBTITLE || > + /* If the packet's duration is inconsistent with the default duration, > + * add an explicit duration element. */ > + track->default_duration_high > 0 && > + duration != track->default_duration_high && > + duration != track->default_duration_low)) > ebml_writer_add_uint(&writer, MATROSKA_ID_BLOCKDURATION, duration); > > av_log(logctx, AV_LOG_DEBUG, > @@ -2917,7 +2937,7 @@ static int mkv_write_packet_internal(AVFormatContext *s, const AVPacket *pkt) > /* All subtitle blocks are considered to be keyframes. */ > int keyframe = is_sub || !!(pkt->flags & AV_PKT_FLAG_KEY); > int64_t duration = FFMAX(pkt->duration, 0); > - int64_t write_duration = is_sub ? duration : 0; > + int64_t cue_duration = is_sub ? duration : 0; > int ret; > int64_t ts = track->write_dts ? pkt->dts : pkt->pts; > int64_t relative_packet_pos; > @@ -2958,7 +2978,7 @@ static int mkv_write_packet_internal(AVFormatContext *s, const AVPacket *pkt) > /* 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, duration, > par->codec_id == AV_CODEC_ID_WEBVTT, > relative_packet_pos); > if (ret < 0) > @@ -2969,7 +2989,7 @@ static int mkv_write_packet_internal(AVFormatContext *s, const AVPacket *pkt) > !mkv->have_video && !track->has_cue)) { > ret = mkv_add_cuepoint(mkv, pkt->stream_index, ts, > mkv->cluster_pos, relative_packet_pos, > - write_duration); > + cue_duration); > if (ret < 0) > return ret; > track->has_cue = 1; > diff --git a/tests/ref/fate/matroska-h264-remux b/tests/ref/fate/matroska-h264-remux > index 2c727f03cd..6362b6f684 100644 > --- a/tests/ref/fate/matroska-h264-remux > +++ b/tests/ref/fate/matroska-h264-remux > @@ -1,5 +1,5 @@ > -f6b943ed3ff05087d0ef58fbaf7abcb0 *tests/data/fate/matroska-h264-remux.matroska > -2036067 tests/data/fate/matroska-h264-remux.matroska > +277a08f708965112a7c2fb25d941e68a *tests/data/fate/matroska-h264-remux.matroska > +2036806 tests/data/fate/matroska-h264-remux.matroska > #tb 0: 1/25 > #media_type 0: video > #codec_id 0: rawvideo Will apply this patchset tomorrow unless there are objections. - Andreas _______________________________________________ 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".