From patchwork Wed Jan 19 21:29:39 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Rheinhardt X-Patchwork-Id: 33669 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:cd86:0:0:0:0:0 with SMTP id d128csp5187647iog; Wed, 19 Jan 2022 13:30:29 -0800 (PST) X-Google-Smtp-Source: ABdhPJynbVVVynkyAWfgr/pLGXvG8SyrHfxybJtx/ov0yKmzyAvAFJnqYL0qZ5GKwa58AZvc3Ncd X-Received: by 2002:a17:907:7212:: with SMTP id dr18mr26847583ejc.646.1642627828954; Wed, 19 Jan 2022 13:30:28 -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 he43si634423ejc.723.2022.01.19.13.30.28; Wed, 19 Jan 2022 13:30:28 -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=sDJ0+7QZ; 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 F1D6E68B191; Wed, 19 Jan 2022 23:30:02 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from EUR04-VI1-obe.outbound.protection.outlook.com (mail-oln040092075047.outbound.protection.outlook.com [40.92.75.47]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 7149D68B192 for ; Wed, 19 Jan 2022 23:30:00 +0200 (EET) ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=LDQpMIVMOynhCzMWyjj+De0mo+kTG9g2UtmsfMqKKEg+sWT+VI1vClZu26/kHEtbi3rJaIJSP/4OWez8zlZ2GMhrVKwhE4g0UJiGoNv0yw0kfjpESJiY8qVsfcXRiFwvw6u3gbPY2bWIhWSrcb49dxXlSWCqvTq/BqMqNtig2Z21ky6fj2w/j0U8OpRbpREqyywuXXEtJL7IPkT/WFaZPoMytDU70EYZtdNxylrcwsU2qclWBs1g2uw63IrEEY8tGo+A7k/UlgWKgBBm1Emsez9M/lx9F5frgNH01yCUWTvXMpvP89ItQYKkJmkcp496w1DA5OeR0d7zLobIoRs5Kw== 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=0Xw0jHmpENJjN4f6a0BLjZdKs2jKmiXrj+7JAR3Y1ZE=; b=GfkZFvpx4NLr7b+Oo+0HitwpCUaOe1GNdIuMGVsmN1J54M0O++kOgusXLtmOTgn6lwpg3bGv3f6Z/t0FnRQYvmLwS3tPgx9uEwFZTtj2YHLFQHAkHzyWosj3doW6giR9ZRlnv7m70pYfTVZQR3cnTKMTzMOtjULgY+cRmK9u0tji/Bt3ns58a0hIB2gV7EnD2NM3gzZEoPrbBO01f22WSHOcH4tlaHaosPk5C/3f/YPdcZYm80EeThGN4nfIgGYfPp3JcKSfodrMf9xbDnCeLY7CW2WzZW7QjeOAuXwYXyqCEEieHRDXpe/8edqUl0r5kQws55S6bior6ReBIP3QYQ== 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=0Xw0jHmpENJjN4f6a0BLjZdKs2jKmiXrj+7JAR3Y1ZE=; b=sDJ0+7QZJUFGqtCyzs97BWh00uPUWzBt0NhS9Y4xRGLXntl8+ONADomVmsdi59lj8anKVSXz50gPbQEFAdnXmPkyupHSXNk6nsKwr8fyiIs9pV+Ix8Z0izDhCz2z1ccHPenj4jTt946qp0fReA0l/8tn5rbyPpICZC/tznoEG/sUu2a/+jYKA0LWIpH60Cq6vCiHzySqo03/ckddj7XFVy8Rs8Jz/IPzwakh8VsjaNQdrkMYURCXhpGfIP6gmeUfwLRnyC2gLRIyLW8z+XtRL6qOwaHaXnFx8BEjt9WQ2sl6mc9+C572hUvk5FknPbTFOZRcQvF8lxbHgXDdyGx9GQ== Received: from AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) by DBBPR03MB6796.eurprd03.prod.outlook.com (2603:10a6:10:207::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4909.7; Wed, 19 Jan 2022 21:29:58 +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.4909.008; Wed, 19 Jan 2022 21:29:56 +0000 From: Andreas Rheinhardt To: ffmpeg-devel@ffmpeg.org Date: Wed, 19 Jan 2022 22:29:39 +0100 Message-ID: X-Mailer: git-send-email 2.32.0 In-Reply-To: <20220119212940.1071477-1-andreas.rheinhardt@outlook.com> References: <20220119212940.1071477-1-andreas.rheinhardt@outlook.com> X-TMN: [12q8DxsQRL7rlOkzQ8euk28vOcMbuIOd] X-ClientProxiedBy: AM8P191CA0030.EURP191.PROD.OUTLOOK.COM (2603:10a6:20b:21a::35) To AM7PR03MB6660.eurprd03.prod.outlook.com (2603:10a6:20b:1c1::22) X-Microsoft-Original-Message-ID: <20220119212940.1071477-4-andreas.rheinhardt@outlook.com> MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 28ec0f0e-cea3-4965-c48e-08d9db92d6df X-MS-Exchange-SLBlob-MailProps: gjx25WM8ZNWEWN7T2ifwOOBerboM6zGymGJr9DniNZjWeCgkFf3ITtHCdx1b3IKMmof9kTveunq0cFT7Q/Ij8U2PGDDHXv4KT3EOAuw0gLXXS7ehG2OefAKok7Edh3s+n/5MoEAu3N+BsBpATEMf+xyfZnF+mT29xUBU3zlCmQaQX5u1FFbvunVnnp94cE8SBApv/TYjzdwIx3mi3ZT3BvSx8XrG2YBKO5AgPOeZKsT7fb2XWkRgVHtcI7t3aD9lSsRy6JcGNLORuUEQYKmoUKJi8h4XF+LDea8+eguFnPNnjpPHYPz0PFYXVibNlt0/7RS1mNdi0ZIa3lED3RsuxifjED4571J83rVRI2C6dcn2hZWCxk46Vte/uLbdswAogfYb5EatpCl7YfX/zcdnVl6D3FKmcKetAsAifFx6sB4c3smMuMo4oicZAm8Dr+oNTmDqdHYM57C3+ZWuBWTJH23QZiHaNSdQDUpJyaK6OgAN5Y5/YZzS5BJbQjwc/UyRjL+VkqDOPF2vRO4DE2O2AHFh6QJPJgz8qaeiPFj68CCNJSIqF3IuqH89gFuT6tRbzkQsBhBh0zp3FIzHlYwVNX5v6Sln1W6z00TuqVY2MXxf2+DGdbCbC/+dhaL4mJsHbmWl+wAlBAJtVLnEGSEU8Ijq562r2hXlgijrcKDV3YotY1u8Yb0sEnvmZoK+bIMmzgdTpdUudwlIYD0NDCjBqjXss9c+YM9VyUD+9+J06qs= X-MS-TrafficTypeDiagnostic: DBBPR03MB6796:EE_ X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: 4bVqZj+nKUNoPllfzA6ZPQ5lBOq2uKvvh9DCV0wIbCe2zg34D5D1WyGU/mq0ujqzImDAExIWBwMHDEgs5HcLVu6cgELr9wV+HE3e8hbD8YhIGC53OOwwQnNN5QDTTsVv8/OWm6TZZfXSKchV8bu6VfAb8U15txwb5J7Lb9F2FXgVe7ft5HfiBateJVcslniPF3PH+K7ksD5CmvNKhO/yhAS851HrEiDzEuSA1ZX38uAMKPZpkPLkIsH0OkP0oTaBRwOL/EPu3ZbiUPkA+LI8RnVata/tEYdB/OzYnEG0BXV7Iofg/1dusWDVg5YXY1UoRLAGmCPiSJqMaQMqsIxBmVv/mPd9PUdCtY8yrNZboPgrCJmwzv3Wcvm5X1t65Y8Z2+DK9inNSvv/o7ghpGwTvtCarIoYcjlMYbPwU9W3LKtJ/KzPmnlRBL3gbYdphgxJM+HOaIeiBt7yUoqMrSNUaQh2tUVdRAALM0R/syEOUl7tgRzrVNEyXYmLVdbZ8cF4tZ/6kGYibDqx19nUgd/+jHPskHOWnAyhlX6b8f2IamZ4G9fB7g/x6EILVjeJ31LE6rwj0SgTRYgxnhFfhLrcQw== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: QKijWQpx7JOzxeeLoO2y7d6Rrmd1LAmrUDl42ANX0I0rVIhWKIr7AengyQhis6EJtjZcXLgSQTZh6UKqhMXmjm+k6JuTdkYJckD3RhqakTlP0PBdOOSYChEfNh4p+WM4l3hQYwrU8Nh4EyCiyoy8CIh+gI3Kn/kfbtUXBcJ+0QQEogv1Qpyum1BOp8OSpTHMrvr5MLD8TTlZrYUcqk2J92++ea3BIQ3YYdZbI2svaW8PVvJkKVH7TW6OcttWyOKfvcNWT6+tGBcGNKPGkCqFjLVjwdneXvpESQEPcIt2VsAbuwYAuOCrpquXe7iytQzB8YjRmZkvp1UggRi/AwGcw1RxH6dwmcysGLUYiLgaluetzF592jhLJL+93nhMDp0UYGfA0iP0kdbyn/WBPejjBl7lgq4c1s7RPI6OLV3q2Hh/+T+9KtjZ+s/Qz419sU/L/KXt++mjAEuCHCcMVDBuaRDyVamGqLQ8dAUrqAhRJbbPnusKpDBc4qrR4TAfck/Oirntmo8jsrbsBNcMi8Ezt3HFAVWwCILXbuHbSKqnDaG/SSNqD2OnTUexJ0wF6zDbe3xcFDYu0IoWMXGNa6xF0INF2LBaAz1wA20a0jyMs39DH7TJnBV0h6mQw5N/MnO31YS7higxjds4Y3uQfqEOkf1PCZdb2YcKV0nTxHpNAPSyItqnPEOUh9NMdGp9AiZwGqFlnBeFQ8/9AC1d6cENC8F0ng4rl9p1s8+9dAKe9Sry09dugDVFR4kLIQryuIubKjAIWvBsf2qhK14ivA6BT6RfOiE2MnkPM1uoobB4kg7qmx0wNBmq5mcqAo1agMlk0LxkB2x8pamn3EvK3BCP7nts8HMZZQnc7+nfibg3zFOWKXV7BNLVPtUnzKWKar3paCZD2ug3sSqu8m7wRaWYEzLQDcWLyica+07Uwn7U3SWqW6FfyaRCO9Xgk/U7xsmQj6Q5UgjxjYZpHAPkoh1Rng== X-OriginatorOrg: outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: 28ec0f0e-cea3-4965-c48e-08d9db92d6df X-MS-Exchange-CrossTenant-AuthSource: AM7PR03MB6660.eurprd03.prod.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 19 Jan 2022 21:29:56.8676 (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: DBBPR03MB6796 Subject: [FFmpeg-devel] [PATCH v2 5/6] avformat/mux: Peek into the muxing queue for avoid_negative_ts 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: LIuxZhKY+c14 Peeking into the muxing queue can improve the estimate of the lowest timestamp needed for avoid_negative_ts in case the lowest timestamp is in a packet other than the first packet to be muxed. This fixes tickets #4536 and #5784 as well as the output from the matroska-avoid-negative-ts FATE-test. Signed-off-by: Andreas Rheinhardt --- libavformat/avformat.h | 2 +- libavformat/mux.c | 21 +++++++++++++++++++-- tests/fate/matroska.mak | 2 -- tests/ref/fate/matroska-avoid-negative-ts | 2 +- 4 files changed, 21 insertions(+), 6 deletions(-) diff --git a/libavformat/avformat.h b/libavformat/avformat.h index cd253fb28e..b4b8075ae6 100644 --- a/libavformat/avformat.h +++ b/libavformat/avformat.h @@ -1527,7 +1527,7 @@ typedef struct AVFormatContext { /** * Avoid negative timestamps during muxing. * Any value of the AVFMT_AVOID_NEG_TS_* constants. - * Note, this only works when using av_interleaved_write_frame. (interleave_packet_per_dts is in use) + * Note, this works better when using av_interleaved_write_frame(). * - muxing: Set by user * - demuxing: unused */ diff --git a/libavformat/mux.c b/libavformat/mux.c index 0810b674a7..53eb56f0af 100644 --- a/libavformat/mux.c +++ b/libavformat/mux.c @@ -655,16 +655,33 @@ static void handle_avoid_negative_ts(FFFormatContext *si, FFStream *sti, if (si->avoid_negative_ts_status == AVOID_NEGATIVE_TS_UNKNOWN) { int use_pts = si->avoid_negative_ts_use_pts; int64_t ts = use_pts ? pkt->pts : pkt->dts; + AVRational tb = sti->pub.time_base; if (ts == AV_NOPTS_VALUE) return; + + /* Peek into the muxing queue to improve our estimate + * of the lowest timestamp if av_interleaved_write_frame() is used. */ + for (const PacketListEntry *pktl = si->packet_buffer.head; + pktl; pktl = pktl->next) { + AVRational cmp_tb = s->streams[pktl->pkt.stream_index]->time_base; + int64_t cmp_ts = use_pts ? pktl->pkt.pts : pktl->pkt.dts; + if (cmp_ts == AV_NOPTS_VALUE) + continue; + if (s->output_ts_offset) + cmp_ts += av_rescale_q(s->output_ts_offset, AV_TIME_BASE_Q, cmp_tb); + if (av_compare_ts(cmp_ts, cmp_tb, ts, tb) < 0) { + ts = cmp_ts; + tb = cmp_tb; + } + } + if (ts < 0 || ts > 0 && s->avoid_negative_ts == AVFMT_AVOID_NEG_TS_MAKE_ZERO) { for (unsigned i = 0; i < s->nb_streams; i++) { AVStream *const st2 = s->streams[i]; FFStream *const sti2 = ffstream(st2); - sti2->mux_ts_offset = av_rescale_q_rnd(-ts, - sti->pub.time_base, + sti2->mux_ts_offset = av_rescale_q_rnd(-ts, tb, st2->time_base, AV_ROUND_UP); } diff --git a/tests/fate/matroska.mak b/tests/fate/matroska.mak index da1fdbd5ea..784b55f6e0 100644 --- a/tests/fate/matroska.mak +++ b/tests/fate/matroska.mak @@ -94,8 +94,6 @@ fate-matroska-dovi-write-config7: CMD = transcode mov $(TARGET_SAMPLES)/mov/dovi # the first packet (with the overall lowest dts) is a video packet, # whereas an audio packet to be muxed later has the overall lowest pts # which happens to be negative and therefore needs to be shifted. -# This is currently buggy (the timestamps are not shifted properly: -# the first audio packet has negative pts). # (-ss 1.09 ensures that a video frame has the lowest dts of all packets; # yet there is an audio packet with the overall lowest pts. output_ts_offset # makes the pts of the audio packet, but not the leading video packet negative diff --git a/tests/ref/fate/matroska-avoid-negative-ts b/tests/ref/fate/matroska-avoid-negative-ts index 1b9b2f2786..02790a3985 100644 --- a/tests/ref/fate/matroska-avoid-negative-ts +++ b/tests/ref/fate/matroska-avoid-negative-ts @@ -1,4 +1,4 @@ -90cf5a330659140d47ec11208f525908 *tests/data/fate/matroska-avoid-negative-ts.matroska +804842437b2be0a1604ce33c6b08c800 *tests/data/fate/matroska-avoid-negative-ts.matroska 973070 tests/data/fate/matroska-avoid-negative-ts.matroska #extradata 0: 22, 0x2885037c #tb 0: 1/1000