From patchwork Fri Sep 29 16:01:18 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 44022 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:394d:b0:15d:8365:d4b8 with SMTP id r13csp650062pzg; Fri, 29 Sep 2023 09:00:25 -0700 (PDT) X-Google-Smtp-Source: AGHT+IGtrkctSTy/L1WhtD3zFoqhl4vKHCdhrDXt/46cnUs/mr3w2fI0UccSHbA7/fJg4bY6yeny X-Received: by 2002:a17:906:73d8:b0:9a1:c447:3c62 with SMTP id n24-20020a17090673d800b009a1c4473c62mr4660345ejl.49.1696003225389; Fri, 29 Sep 2023 09:00:25 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id t5-20020a17090616c500b009a1f53509a5si15381924ejd.96.2023.09.29.09.00.23; Fri, 29 Sep 2023 09:00:25 -0700 (PDT) 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=U0aCiilQ; 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 045D568CC43; Fri, 29 Sep 2023 19:00:20 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR01-HE1-obe.outbound.protection.outlook.com (mail-he1eur01olkn2082.outbound.protection.outlook.com [40.92.65.82]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 41ED968CC12 for ; Fri, 29 Sep 2023 19:00:14 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=IBTlprlldM3RXywAOHqI5Xk6EXEbJQqgDr4N70ECSBfRFRekhMRLrF4RbXHzVfzAHvP0nxNzJbhgAXecw82X8S/3IdGdVnf8EjUA2w0ViLt/mu2jE84+W7Xvxs6gTuKjmhystdVmAy6x0Wd2SCIs4WBfmfsEY3XujjZPdlxRAqSkm9xml0NYkRLselVaJfC94wyPdl9clSbkRZscLJtslIqierO5dAbpaHBnspWYMds4b7DiR13zzL59JVs9JZOkL9LYceHmjX6a6np0Fw97udY+90caVIr8zInShwSWrdKP+s64B0oSXKSUf9zuOKvehUFW15oRJAw5/KtjgsldQg== 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=MO/2EUpJ5jEl253AxhwndEVcBB4sF6u2iL0J7Cm8WXo=; b=g8rwfqnBvGMn0U6DRJLbc1iGD0+rFgThReSjOk/W6+s/KRfeJj3weFz7P/MNrVMYSS/EQbLNV8GBDeA9WoQRnTDmCP57WBDjdXNRLuytg6+AS9jgAshQDd+EpCSyhbF1mvQPpYsiuWHwRr7iadWtOE135Ce8DZ2cMs84+DbbdTlmYBRWZV4Yg3uq0QZhG4hQM8VLzUhRn6bKQOgHYJUomQgY7/LAeXZ0EEgA3Jr/VRqMwVTFVE0y8WXiINaxiBV6ibvWPseab4igvWWbE8Ma1WVy+O8JP8X4OEnGMbBXBAviF9ownyhWdsDCRPFDKIYjUjKEdZNunVwhHIPq5rPL5w== 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=MO/2EUpJ5jEl253AxhwndEVcBB4sF6u2iL0J7Cm8WXo=; b=U0aCiilQq3JKCmdboCSx0DOpW6ZvloTU03RMOjw0wjplRar8wEP8DraTCfEXXyGGF7aBOVr4HpH9hehxQgk8cH+6CRGuCjDi0jUe/QBl0QpADnGBafC8tsggRd6bsUsXW5DIHA70u7tn5HBrIJo5/5pVdAg3pXIV+hWdA1FbQhA3ulN3U+ZxFxEQ7y3vUmL1T2ePJHj3hCg6NVipS1qLqFy9b8O2BYqToOvLbqHMPuvjN+jQl+HNldIp/eXmsz00TH/ciQcpg0vmsI0mT+c8yeq/6HxYaUenOwry6y7lOE1Kug/Aq5rpnzY9lon8F2x6GdXvTK0bvwXOqmWJ+juWYQ== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by AS8P250MB0071.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:37e::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6813.37; Fri, 29 Sep 2023 16:00:12 +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; Fri, 29 Sep 2023 16:00:11 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 29 Sep 2023 18:01:18 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 X-TMN: [T7P8wkYdTqvTE4BGCnox8pGC+QuTNkVC] X-ClientProxiedBy: FR3P281CA0195.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:a4::7) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <20230929160119.2059903-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|AS8P250MB0071:EE_ X-MS-Office365-Filtering-Correlation-Id: 4d613f26-619a-47e4-76e6-08dbc10528d2 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: nmNKj597CDT8o9eL+lT4KKiJuZFN0R6ooPr9iw5zljteJ/yK1raCbJ2cFs7jsgFL3ZkaFNy7CN5X84UMybhzvLlHWGxzhERJAx7EtDWNh6EH276FYanM1FKcGZNlO7m0SVkofzWMQLFBzC/qqz6j+M0nZZFjKYzJVxAQ7yfJ7DK61XiX4hTsj6h69Tcyo1rus/boe5SABcZLYzwm+hj1ysVS0uSTBq4nJChPkpIdjWl1U710w8Ralsv0XxYU9lVogKiuCMLb91gh4A02LWtuj9CKZaaOMF3NrL+DBKK/qDCLPYfStXgqYu/PhAowJFg19OeiVf6KEoF0oIpaZ0QroYs6fCpXKy6XgcGEFyGIZT6dwJRwnPHlyVxHcAqO/y2D9CT34EQ66Pckhrnra8suNj/UPHglr4JiE453grC8zHJZnCWrg5BX/Ha5z6bQm+766vbqroabUkZJr4SoCgt3WRpEgVRf/W01Tpw2+w98StTdv+0TrxzP3DyL7vxE/+w2nAR/GSjyR21rg6JKy4BAPmEbDPvLnEaedfPxz8cruPNn+fMO860oTe64bNyxGDMY8EiGFCvK/PwFHrbt/FH93WrEAdUw00JtUKPrR0odgK5uVZ+lvFRrr4iFx9On9fKS X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: /mDFQOfvZ4+tTAOxY24HBu5jAKSH6BAtxHW9llOneisw3HGRtso+AvXmIeqKbhexzLssjkZ+Pl2cLt/O4HJjmAsLDvrVrWxZLLBU1ZJ8m9pkz0sdFNTgFnaBBTaDZ8Wv+/Cdhrl9141XW6nsTbSqChwNoudDD/i3i/uh2xhapYSUUkY5uGcxaszvU8eTHbb4ZB+UsNRM0gk0qgcaRUSzEK/g6tpaiAV8INygmmkzn+elfNap53BtA3R1fuFBBOM+OvxBgBbSoLaUc8zaGWQUWdNW43f6oHocwhFEjbxfE9NBUDVSFTufsJKtPdCbmscIbdwps23XUbgTX8LDs1G/en7DNdxTO3XddeqP+UbzgCdNt1JLrynkRhSL0d+UplMkYqon20pRNk8dRn0zcFGkCYJO5cM8BWapHlSVT50hlEe+ywR/CnyV6yhjPhkwqg2UPs9iaO2nTYbgvrzQsfeveKeQRjHvSVK+28p+fIHa5j1yDDnnn+JtLWbm07VS3yiPQEeyBZuZsUKTohg7vVJEhycAD6SUOnWuRWLp6fffot9kocmMGssIw1vEEyD/BluHe8+Vm5iB6kgwivM4rlbqaAd9iLZnHZBwfz9ig301Co7tLsX0wR1F+4S9JHB6cCjKDQlW4++Zv/C4mdvmE3eaAEMP/2THW+zE5/I8X7XYoZ8PNFHZWYcKqcW8vMHKVJtOfF8zysB9hZPBMSE88XnLBJVm2AVGjQXbb3z53OEujXUSOqoWmubXaKKki/dg7DbbSBhp+mkmJBj2IWBysDNmX0qzwmWNHZqU8jReyVrN2H4tFCjzHhGLS+PsGmJj0zqNVdxsf0Swt4SlHZChTVz+iwUJU9KimMRdfqkeSoO1Jzv0NKduJzrD3pw8l1fC90TQycoKJcCicWzydh9E9XndMSlybHx1a8b5fQrB/qFJidhkMiVjaLbT5U4pLu7RkTh7SuCeYY5bKtrSIG3c8BJl36adqTh7olFOQqYIh2SuesiOSrMaWGY0yDC232LBy8v9yd6TegIjj5bgWWlrK1wwU3E4xYIMFdbv5tfeUoEPOtD0n093h8ywd0pjw1kb9NlwfeBCDjD1mYtLUGO0m2t87MVfAgCRNyX/C0Tfnw3yxFZ1Ch0KXmSFk4NBvgGY/2TT8zFZEcCctJggztUHKF8HUtx8KDwqNdNhPLXenL4EPyO4Xan4g3V/jVB6kAKkadzTKOIxhYnh3epYQWlv1cbSnwo4hokKmzBo2Z7B+U+NmiOQKd4ISUzDuK7Spdbll/So X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 4d613f26-619a-47e4-76e6-08dbc10528d2 X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Sep 2023 16:00:10.9937 (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: AS8P250MB0071 Subject: [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 Cc: Andreas Rheinhardt Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: h2hRndyOpxvE 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 From patchwork Fri Sep 29 16:04:04 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 44023 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a05:6a20:394d:b0:15d:8365:d4b8 with SMTP id r13csp653255pzg; Fri, 29 Sep 2023 09:03:50 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHurFFcuK2su0zfkoJihZsBHK3BG8BHFxyDEMMK3hn9FiY6BQ+kt4LiuqheC6TDP8khKylw X-Received: by 2002:a17:906:dc:b0:9b2:b755:5b94 with SMTP id 28-20020a17090600dc00b009b2b7555b94mr4342950eji.38.1696003428400; Fri, 29 Sep 2023 09:03:48 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id ac7-20020a170907344700b009b27b557e92si10361025ejc.430.2023.09.29.09.03.36; Fri, 29 Sep 2023 09:03:48 -0700 (PDT) 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=HHBYqOG3; 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 4CEE068CC49; Fri, 29 Sep 2023 19:03:33 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR01-VE1-obe.outbound.protection.outlook.com (mail-ve1eur01olkn2016.outbound.protection.outlook.com [40.92.66.16]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 0FC9568CC3B for ; Fri, 29 Sep 2023 19:03:26 +0300 (EEST) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=hoE33khWXy5M5XFCSogETzErH/t9w0x+/gTalmIpAozk1+3PPWG8CWrF4fyUKYmdHEnDKOGfe5gk1VMCg0TglpRj6jfndL2UElrEzFn/w5QH6WOdoX7aZVVnGryPy25joLhuyB+sQaMFcVKT6mlE+ufDXUZB/qASSvNW1ssuI/ELYKx1oK11IDLilfmu1AQsh8fXahXkMZ/CKBO4MBxJvGapujZJtRfPhwKMLG6D+gQ5GzilgNOMY0q/OP6/vQH3PK65CQNeYIjEodZgTJXxxRGQaEJgMCkMCVlfH3XBZ/eRLu32bEgWbJREnpB5ilSs+G6UsvxgV+yERcCiWB92+w== 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=exQ+Ey64AWr/c4MnVPq58IRXBOmgZ8ePZ2/7gFBZT2Q=; b=cCny67JRQ1rqxEVkWjIXaalE8YShTROaZ12uQnssTEPz1WJ7pf0ynqNTaOCHZqkObI/rb38ultmv6y4U+lC24cTDdDMej86NojyBpZCq21tmf/5RD+OB5PKNB1y7Ca8v1AkZg53aISDmU4HoTfZYTDKwUsrsortAWVEbNuS+XbmTJdXnBaMJP7c67Vy3lGieIbLJiZHkfEGD60MN9FCWfhcwTEa1NC1fh/0RblnYKPZ09L5Viv2p7Tw7DBcROg0X9fO8aP7Trt0uO13Ry6oldpK7BOoQpHwYXn+T5nRj7fkWQ15JvazAfBTkscu1kVettCGkMF4Y6Q2expSUforneA== 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=exQ+Ey64AWr/c4MnVPq58IRXBOmgZ8ePZ2/7gFBZT2Q=; b=HHBYqOG3XAwIdU1XqDO/0gNr7Nyx6d4ahNPTQjEmbs1E5tSq8hTC6M2NbbT978STVZo6ngKOc2oxBmMQBItIKuOZrUAcjJtCsSNCOlhYGwMlfTBQdocbKky1GAq6jOp/TEax7YQzwTxxw8MqET5qjRAyzIlCj54XOO4dpdGlk7udlilc9DoEutgZ1UN1kw0qh8r+/qKEhvbi1xuU6QvKnMk2t1Ou3goc58ccMAYGWMl4oiOo4v5lfkUrzOC9TF6vEMzX1FgyYNyOnrYzBhOKWtnpVVmB8UsXkVVgmhEUYJhoRk0I2r4aaKq10XLy4BW/OZGhIgphTBO/qZsggUR0cQ== Received: from AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) by AM8P250MB0197.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:324::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6838.22; Fri, 29 Sep 2023 16:02:55 +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; Fri, 29 Sep 2023 16:02:54 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Fri, 29 Sep 2023 18:04:04 +0200 Message-ID: X-Mailer: git-send-email 2.34.1 In-Reply-To: References: X-TMN: [sU0ck3ZOERYvMhDkpkqeZcYlTdOkrz86] X-ClientProxiedBy: FR3P281CA0140.DEUP281.PROD.OUTLOOK.COM (2603:10a6:d10:95::12) To AS8P250MB0744.EURP250.PROD.OUTLOOK.COM (2603:10a6:20b:541::14) X-Microsoft-Original-Message-ID: <20230929160404.2060077-1-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-TrafficTypeDiagnostic: AS8P250MB0744:EE_|AM8P250MB0197:EE_ X-MS-Office365-Filtering-Correlation-Id: 6146134b-e1d5-4a4f-6169-08dbc1058a76 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: HmSTpgJeFijLeZ6hP9MLru+ymFaKH3XwhH7QpwTQaVctsmeD9QFdBZxg3LmcIqF/6kRzx+yGZXDknN+Wpo3TI2f0bmFkPh+qrU4OK2+VVHkRd+txGDNuRyJXTXNwRC/PL5wa3el9jg67kVlfxHxp1goNe5gkQWVVKgvNpbt0dvXBCqIQ6Pr2SUkkHafOWUur1lC6b4Uik3nf3f7PNYKLZ0a4Djb0G5AsizDIbijkU3RPTwmI39qAjEnOhv3ByxospymQG+FI9eXGiW0xYB9+o/cmKAndMjzyTKOCVTntrteTMOeIghqeR8JDoghf6++aSPbKBDOTVFmr8380p/4SJe9syCl0gfNc+ZuE1RkzN5ZLrxJPgis0wNlLSGkcrAsbxUCyZZZ8Hg8Wgaur/eW/bIPw96xypcVCv03PDDUFD9wJXg8oBfLSZ7ndR1J6GgbALd78cD8FO9LAGsn0TpinXDglYtls+sruiWSR2KRnq5zsYCL/wieH+34lEILRqFSMBEXBP2cLcyHQIGNCK8Pc7kGrZE/e0J1a5r94F9J1w+6zryHKV1QWYdZoptAW22DLsIkCdKlIgCel0pm8LvV/nKBFD3qMcBVjzQ7arnJ++MuspSfgb1+vxjZtirWjKPQK X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: NcEHPX3tqJSEewOOvY+kEoW5Gj6euuERMJpf1L9ha7xvQSwj7r5XjKNYbNUf57VETMum2dtrnF3aMrIBTOx7e2UHkZUZMFtBnttQ9q4v8rtO3e3BNK1F5FsWAw/Vj3Qlgv8M2hr61QTwZqz3KtbgtAsFul4eYu7JndNnRc52B4yo677Xjn9WpIKIbpdv5gbC09k4sc+JiMIubL6HThhFUluBDnpoRyWYPF3Jncw5zF+qVWtnd9qcVM3HryNh17wPemidqn0p6mjKRx4EjTKNgU5q5FoeX+4Pj8FvroKjf8Rv+AlY3hCUhRvWF4f75jLMqjH8lCdjo3ZBIzsfQVX8h0iyv3vl5RXPDPubEWNWI3arO8FT9GR4UhOQiEI3p+6CJ9MqWAvZ43l9F2kdt2kBB06thMLurjfugGDkG1c/qRHmc50IL2uz5k16AH3PVk6KdilfETzQrOYZQbFjTeo9tIBXYYHIziJzcxuo4xrJtwuWwR313LTJL8PlW7XIVz7f3VRUVVynUBJVzOxE69cbbc/C34Z6UFPvMk8XxzOjOJqKYcGKFmt+wG1hREoSP6Md3shrjTOzl2RaNf5RfptUcIbvy8e/DdpHV62k6AN3R1kqx8/kb913Y3rE1WYNfXU/DFAFW0DLwq4PmBZzhKAnMUh9uBDHmYiMu06D7N/bPXxvWHHzSxN3r0BGLFI2YSRlKDcV/6Z4WNHmwBAE/Jn6la6NfqA7TI3nvMbqFIw/dekpn4M/hjpvUJN+MKy3s97DldkF8AaQ76/RWag+2Hqee7LX7BB2+/B0emagFjIr07mYBg7v+a+Hvc5OR7mDPWuCaIMKcWGSDQWcsZUUsMdH0bAUxC2rgAiowVNVzhFL9MiPQIK8P8ozIb1MXIpb0u5GKjNQisY4KgnGjr9PuvOmOYljPtPh7hVKzhPjdVSH1RbjuVDp97lf6HwmWL/wFNjaR10d67YoENnavlqD1bqqoA4c68uGw3T7ePPtcspLcUTzfCCv/0A2YSGNYv9dE5Ozc5dligcu7UP8K57roPhL//+GIc1o1d7Q/XCcYKoZGDxRVSNxiZzvyxRw4Zkm/yacaNvIFXT1hHgiAcMi3ibTwJk0eVpjAiPLKa+A5Ng4ugU6Yl7X3Gv4PlXx5tT5TAhISnT+2eiWqThywINEJfpwkRzWaEVl8dk3gyK2oup1MODbWM9CDxa66z8TmpmCdZwnDgl4CZR/kR/zw+p0uHA8hrNWTpZuIK8dy7IGkuD5MENUJwb0OYoTvnjbab3VsqGo X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 6146134b-e1d5-4a4f-6169-08dbc1058a76 X-MS-Exchange-CrossTenant-AuthSource: AS8P250MB0744.EURP250.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Sep 2023 16:02:54.7504 (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: AM8P250MB0197 Subject: [FFmpeg-devel] [PATCH 2/2] avformat/matroskaenc: Write default duration for audio 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: kkP/Fn1K9NGN This is easily possible for those codecs with a fixed frame-size (in samples). Signed-off-by: Andreas Rheinhardt --- btw: Presumably AVCodecParameters.framerate should be preferred over AVStream.avg_frame_rate if set? libavformat/matroskaenc.c | 7 ++++ tests/ref/fate/matroska-avoid-negative-ts | 4 +-- tests/ref/fate/matroska-encoding-delay | 14 ++++---- tests/ref/fate/matroska-mpegts-remux | 4 +-- tests/ref/lavf/mka | 4 +-- tests/ref/lavf/mkv | 4 +-- tests/ref/lavf/mkv_attachment | 4 +-- tests/ref/seek/lavf-mkv | 44 +++++++++++------------ 8 files changed, 46 insertions(+), 39 deletions(-) diff --git a/libavformat/matroskaenc.c b/libavformat/matroskaenc.c index 9286932a08..9d1c8946cd 100644 --- a/libavformat/matroskaenc.c +++ b/libavformat/matroskaenc.c @@ -61,6 +61,7 @@ #include "libavcodec/av1.h" #include "libavcodec/bytestream.h" #include "libavcodec/codec_desc.h" +#include "libavcodec/codec_par.h" #include "libavcodec/defs.h" #include "libavcodec/xiph.h" #include "libavcodec/mpeg4audio.h" @@ -1926,6 +1927,8 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, switch (par->codec_type) { AVRational frame_rate; + int audio_frame_samples; + case AVMEDIA_TYPE_VIDEO: mkv->have_video = 1; put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_VIDEO); @@ -1991,6 +1994,10 @@ static int mkv_write_track(AVFormatContext *s, MatroskaMuxContext *mkv, put_ebml_uint(pb, MATROSKA_ID_TRACKTYPE, MATROSKA_TRACK_TYPE_AUDIO); + audio_frame_samples = av_get_audio_frame_duration2(par, 0); + if (audio_frame_samples) + mkv_write_default_duration(track, pb, (AVRational){ audio_frame_samples, + par->sample_rate }); if (!native_id) // no mkv-specific ID, use ACM mode put_ebml_string(pb, MATROSKA_ID_CODECID, "A_MS/ACM"); diff --git a/tests/ref/fate/matroska-avoid-negative-ts b/tests/ref/fate/matroska-avoid-negative-ts index 05821cbf09..880d53e1b0 100644 --- a/tests/ref/fate/matroska-avoid-negative-ts +++ b/tests/ref/fate/matroska-avoid-negative-ts @@ -1,5 +1,5 @@ -dede1d72a28c7eb0a849acf230b08247 *tests/data/fate/matroska-avoid-negative-ts.matroska -973072 tests/data/fate/matroska-avoid-negative-ts.matroska +fb4e7a969ef65f61c4c45d5976188aa2 *tests/data/fate/matroska-avoid-negative-ts.matroska +973080 tests/data/fate/matroska-avoid-negative-ts.matroska #extradata 0: 22, 0x2885037c #tb 0: 1/1000 #media_type 0: video diff --git a/tests/ref/fate/matroska-encoding-delay b/tests/ref/fate/matroska-encoding-delay index d2ff2d07be..f1085e9752 100644 --- a/tests/ref/fate/matroska-encoding-delay +++ b/tests/ref/fate/matroska-encoding-delay @@ -1,5 +1,5 @@ -156c5c615bee0c55e76275df8d84e505 *tests/data/fate/matroska-encoding-delay.matroska -961238 tests/data/fate/matroska-encoding-delay.matroska +604531e6d08cb35b2f3eec838ac45b80 *tests/data/fate/matroska-encoding-delay.matroska +961252 tests/data/fate/matroska-encoding-delay.matroska #extradata 0: 22, 0x32ea0490 #tb 0: 1/1000 #media_type 0: video @@ -32,7 +32,7 @@ dts_time=-0.010000 duration=24 duration_time=0.024000 size=1152 -pos=1255 +pos=1263 flags=K__ [/PACKET] [PACKET] @@ -45,7 +45,7 @@ dts_time=0.000000 duration=40 duration_time=0.040000 size=237628 -pos=2415 +pos=2423 flags=K__ [/PACKET] [PACKET] @@ -58,7 +58,7 @@ dts_time=0.014000 duration=24 duration_time=0.024000 size=1152 -pos=240050 +pos=240058 flags=K__ [/PACKET] [PACKET] @@ -71,7 +71,7 @@ dts_time=0.038000 duration=24 duration_time=0.024000 size=1152 -pos=241225 +pos=241233 flags=K__ [/PACKET] [PACKET] @@ -84,7 +84,7 @@ dts_time=0.040000 duration=40 duration_time=0.040000 size=238066 -pos=242385 +pos=242393 flags=K__ [/PACKET] [STREAM] diff --git a/tests/ref/fate/matroska-mpegts-remux b/tests/ref/fate/matroska-mpegts-remux index c6b7d324b0..4fcc4e6c38 100644 --- a/tests/ref/fate/matroska-mpegts-remux +++ b/tests/ref/fate/matroska-mpegts-remux @@ -1,5 +1,5 @@ -52e030428110a8c1b74c03c7ad31a6ca *tests/data/fate/matroska-mpegts-remux.matroska -6500 tests/data/fate/matroska-mpegts-remux.matroska +48fcc343d88d0ffaba9223150fb0a195 *tests/data/fate/matroska-mpegts-remux.matroska +6516 tests/data/fate/matroska-mpegts-remux.matroska #tb 0: 1/1000 #media_type 0: audio #codec_id 0: ac3 diff --git a/tests/ref/lavf/mka b/tests/ref/lavf/mka index 135fade76c..6f9a56b24a 100644 --- a/tests/ref/lavf/mka +++ b/tests/ref/lavf/mka @@ -1,3 +1,3 @@ -4fede420f36a21bbb3ae4e5d6a884267 *tests/data/lavf/lavf.mka -43572 tests/data/lavf/lavf.mka +b9c2d23dffba449cf1111f062b93c93f *tests/data/lavf/lavf.mka +43588 tests/data/lavf/lavf.mka tests/data/lavf/lavf.mka CRC=0x3a1da17e diff --git a/tests/ref/lavf/mkv b/tests/ref/lavf/mkv index 1b25aea6aa..a8c3fd13e8 100644 --- a/tests/ref/lavf/mkv +++ b/tests/ref/lavf/mkv @@ -1,3 +1,3 @@ -d5f719b715ad5eb6860c85f0d8202b8e *tests/data/lavf/lavf.mkv -320426 tests/data/lavf/lavf.mkv +6224bc0893bd0bb8a789e74bbd38c9c7 *tests/data/lavf/lavf.mkv +320440 tests/data/lavf/lavf.mkv tests/data/lavf/lavf.mkv CRC=0xec6c3c68 diff --git a/tests/ref/lavf/mkv_attachment b/tests/ref/lavf/mkv_attachment index 3a599c6ed5..4c958af162 100644 --- a/tests/ref/lavf/mkv_attachment +++ b/tests/ref/lavf/mkv_attachment @@ -1,3 +1,3 @@ -7681b6ece94f20684838bcbba2458c58 *tests/data/lavf/lavf.mkv_attachment -472576 tests/data/lavf/lavf.mkv_attachment +05132b99d16128e552c1a6f1619be8b7 *tests/data/lavf/lavf.mkv_attachment +472590 tests/data/lavf/lavf.mkv_attachment tests/data/lavf/lavf.mkv_attachment CRC=0xec6c3c68 diff --git a/tests/ref/seek/lavf-mkv b/tests/ref/seek/lavf-mkv index 78c2b13b46..b8028dd075 100644 --- a/tests/ref/seek/lavf-mkv +++ b/tests/ref/seek/lavf-mkv @@ -1,48 +1,48 @@ -ret: 0 st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos: 674 size: 208 +ret: 0 st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos: 682 size: 208 ret: 0 st:-1 flags:0 ts:-1.000000 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 890 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 898 size: 27837 ret: 0 st:-1 flags:1 ts: 1.894167 -ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 292306 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 292314 size: 27834 ret: 0 st: 0 flags:0 ts: 0.788000 -ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 292306 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 292314 size: 27834 ret: 0 st: 0 flags:1 ts:-0.317000 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 890 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 898 size: 27837 ret:-1 st: 1 flags:0 ts: 2.577000 ret: 0 st: 1 flags:1 ts: 1.471000 -ret: 0 st: 1 flags:1 dts: 0.982000 pts: 0.982000 pos: 320147 size: 209 +ret: 0 st: 1 flags:1 dts: 0.982000 pts: 0.982000 pos: 320158 size: 209 ret: 0 st:-1 flags:0 ts: 0.365002 -ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 146858 size: 27925 +ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 146866 size: 27925 ret: 0 st:-1 flags:1 ts:-0.740831 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 890 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 898 size: 27837 ret:-1 st: 0 flags:0 ts: 2.153000 ret: 0 st: 0 flags:1 ts: 1.048000 -ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 292306 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 292314 size: 27834 ret: 0 st: 1 flags:0 ts:-0.058000 -ret: 0 st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos: 674 size: 208 +ret: 0 st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos: 682 size: 208 ret: 0 st: 1 flags:1 ts: 2.836000 -ret: 0 st: 1 flags:1 dts: 0.982000 pts: 0.982000 pos: 320147 size: 209 +ret: 0 st: 1 flags:1 dts: 0.982000 pts: 0.982000 pos: 320158 size: 209 ret:-1 st:-1 flags:0 ts: 1.730004 ret: 0 st:-1 flags:1 ts: 0.624171 -ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 146858 size: 27925 +ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 146866 size: 27925 ret: 0 st: 0 flags:0 ts:-0.482000 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 890 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 898 size: 27837 ret: 0 st: 0 flags:1 ts: 2.413000 -ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 292306 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 292314 size: 27834 ret:-1 st: 1 flags:0 ts: 1.307000 ret: 0 st: 1 flags:1 ts: 0.201000 -ret: 0 st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos: 674 size: 208 +ret: 0 st: 1 flags:1 dts:-0.011000 pts:-0.011000 pos: 682 size: 208 ret: 0 st:-1 flags:0 ts:-0.904994 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 890 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 898 size: 27837 ret: 0 st:-1 flags:1 ts: 1.989173 -ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 292306 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 292314 size: 27834 ret: 0 st: 0 flags:0 ts: 0.883000 -ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 292306 size: 27834 +ret: 0 st: 0 flags:1 dts: 0.960000 pts: 0.960000 pos: 292314 size: 27834 ret: 0 st: 0 flags:1 ts:-0.222000 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 890 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 898 size: 27837 ret:-1 st: 1 flags:0 ts: 2.672000 ret: 0 st: 1 flags:1 ts: 1.566000 -ret: 0 st: 1 flags:1 dts: 0.982000 pts: 0.982000 pos: 320147 size: 209 +ret: 0 st: 1 flags:1 dts: 0.982000 pts: 0.982000 pos: 320158 size: 209 ret: 0 st:-1 flags:0 ts: 0.460008 -ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 146858 size: 27925 +ret: 0 st: 0 flags:1 dts: 0.480000 pts: 0.480000 pos: 146866 size: 27925 ret: 0 st:-1 flags:1 ts:-0.645825 -ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 890 size: 27837 +ret: 0 st: 0 flags:1 dts: 0.000000 pts: 0.000000 pos: 898 size: 27837