From patchwork Sat Dec 19 23:13:19 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: =?utf-8?q?Martin_Storsj=C3=B6?= X-Patchwork-Id: 24591 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 8D5AF44B490 for ; Sun, 20 Dec 2020 01:21:37 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 6561068A920; Sun, 20 Dec 2020 01:21:37 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f43.google.com (mail-wm1-f43.google.com [209.85.128.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F344368A78B for ; Sun, 20 Dec 2020 01:21:30 +0200 (EET) Received: by mail-wm1-f43.google.com with SMTP id v14so6249727wml.1 for ; Sat, 19 Dec 2020 15:21:30 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=martin-st.20150623.gappssmtp.com; s=20150623; h=from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=/fm0Bt3HvmZcw8MCOsNTxmU0uY3zTAU4RbwJQnuZmIg=; b=tQnfp0Vp9kKP0+VidCn0cR+woabZHCWPLquwEmwymzXYDB5zXp/9L63Qxl1Ku0mL9r 0N2thkQ6td78ZgJM1jwWuOOagu34mi5CS0yGQMT/3ff4XGvGq4wDIXxMA2f8k73ANu4C NfniGm9TMZqGxNEgr9Qcu//Sqv8AMslClDH4v1wDptmIYI7Aw0uC6/srVINB/yOs9Vlg A8qiaG5lUUY3OoSGJDQ4Ety0OSpBzflY7U1LP0DS+cqlAmi/AKgKRvjPWeXyyRO5hikY rXENRlW7ILaqizYeL5AEZGYGxu9lb5VDS2J2HFhGgmd0MJljNjsBJW1XTzyF9NHLM4tp xuEw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=/fm0Bt3HvmZcw8MCOsNTxmU0uY3zTAU4RbwJQnuZmIg=; b=Dpd5so652hU+zIdjAVM/an8MNlKU1ZLmQkQuK/RGUs0Iec2vRpaMY15HHbjELsw39b knA8U/QXt1/4KsuIjSX+UzeDKMSoL48uI6iBsh/Msh+wYCf7CXcMiugOPECBH/xsRUw3 jvPu5i9djMFNYhbuSLQdJGFk6YNPrSCoi4OOvyWXAa0lNpIhPASGU9elCd8Z8KGOW7mq Nm/OYYjgm0D22BNXZYWMsjyUrChDETvzQiAD2ZcTKabTlYw2f0iqnMRwv3SlrQ9Jejl2 ++kIvFz8maFPRZpwON2tm2s16T6nQhS4qt/TevnXBKDC2zlW/BvGWRV9Vuk/L0h45fA8 PEvA== X-Gm-Message-State: AOAM533tJjTaSFuuIHV4qH3ANOMZGnPRZZvocpXObUJQ5NLx7hMNLvth Hbz3KJibvdx/AzfYtHBS5aPhC/Kw28jBXgjs X-Google-Smtp-Source: ABdhPJxsR+KG4d/ECQokN8cEc+OarCueoqy69qqxp67mob7y8XWzyUHAIuagD8FuHhm2mt4Z4Ia4Cg== X-Received: by 2002:a1c:e342:: with SMTP id a63mr10021205wmh.64.1608419601184; Sat, 19 Dec 2020 15:13:21 -0800 (PST) Received: from localhost (host-96-177.parnet.fi. [77.234.96.177]) by smtp.gmail.com with ESMTPSA id g191sm18519955wmg.39.2020.12.19.15.13.20 for (version=TLS1 cipher=AES128-SHA bits=128/128); Sat, 19 Dec 2020 15:13:20 -0800 (PST) From: =?utf-8?q?Martin_Storsj=C3=B6?= To: ffmpeg-devel@ffmpeg.org Date: Sun, 20 Dec 2020 01:13:19 +0200 Message-Id: <20201219231319.56995-1-martin@martin.st> X-Mailer: git-send-email 2.24.3 (Apple Git-128) MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] movenc: Present durations in mvhd/tkhd/mdhd as they are after edits X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 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 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" If the edit lists remove parts of the output timeline, or add a delay to it, this should be included in the mvhd/tkhd/mdhd durations, which should correspond to the edit lists. For tracks starting with pts < 0, the edit list trims out the segment before pts=0. For tracks starting with pts > 0, a delay element is added in the edit list, delaying the start of the track data. In both cases, the practical effect is that the post-edit output is as if the track had started with pts = 0. Thus calculate the range from pts=0 to end_pts, for the purposes of mvhd/tkhd/mdhd, unless edit lists explicitly are disabled. mov_write_edts_tag needs to operate on the actual pts duration of the track samples, not the duration that already takes the edit list effect into account. --- libavformat/movenc.c | 41 +++++++++++++++++--- tests/ref/fate/copy-trac3074 | 2 +- tests/ref/fate/gaplessenc-itunes-to-ipod-aac | 2 +- tests/ref/fate/gaplessenc-pcm-to-mov-aac | 2 +- tests/ref/fate/movenc | 2 +- 5 files changed, 39 insertions(+), 10 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index 18fa3f9b5e..372c04295d 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -2904,21 +2904,50 @@ static int mov_write_minf_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext return update_size(pb, pos); } -static int64_t calc_pts_duration(MOVMuxContext *mov, MOVTrack *track) +static void get_pts_range(MOVMuxContext *mov, MOVTrack *track, + int64_t *start, int64_t *end) { if (track->tag == MKTAG('t','m','c','d') && mov->nb_meta_tmcd) { // tmcd tracks gets track_duration set in mov_write_moov_tag from // another track's duration, while the end_pts may be left at zero. // Calculate the pts duration for that track instead. - return av_rescale(calc_pts_duration(mov, &mov->tracks[track->src_track]), - track->timescale, mov->tracks[track->src_track].timescale); + get_pts_range(mov, &mov->tracks[track->src_track], start, end); + *start = av_rescale(*start, track->timescale, + mov->tracks[track->src_track].timescale); + *end = av_rescale(*end, track->timescale, + mov->tracks[track->src_track].timescale); + return; } if (track->end_pts != AV_NOPTS_VALUE && track->start_dts != AV_NOPTS_VALUE && track->start_cts != AV_NOPTS_VALUE) { - return track->end_pts - (track->start_dts + track->start_cts); + *start = track->start_dts + track->start_cts; + *end = track->end_pts; + return; } - return track->track_duration; + *start = 0; + *end = track->track_duration; +} + +static int64_t calc_samples_pts_duration(MOVMuxContext *mov, MOVTrack *track) +{ + int64_t start, end; + get_pts_range(mov, track, &start, &end); + return end - start; +} + +// Calculate the actual duration of the track, after edits. +// If it starts with a pts < 0, that is removed by the edit list. +// If it starts with a pts > 0, the edit list adds a delay before that. +// Thus, with edit lists enabled, the post-edit output of the file is +// starting with pts=0. +static int64_t calc_pts_duration(MOVMuxContext *mov, MOVTrack *track) +{ + int64_t start, end; + get_pts_range(mov, track, &start, &end); + if (mov->use_editlist != 0) + start = 0; + return end - start; } static int mov_write_mdhd_tag(AVIOContext *pb, MOVMuxContext *mov, @@ -3145,7 +3174,7 @@ static int mov_write_tapt_tag(AVIOContext *pb, MOVTrack *track) static int mov_write_edts_tag(AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track) { - int64_t duration = av_rescale_rnd(calc_pts_duration(mov, track), + int64_t duration = av_rescale_rnd(calc_samples_pts_duration(mov, track), MOV_TIMESCALE, track->timescale, AV_ROUND_UP); int version = duration < INT32_MAX ? 0 : 1; diff --git a/tests/ref/fate/copy-trac3074 b/tests/ref/fate/copy-trac3074 index b5b0b6a60b..78b6015ae8 100644 --- a/tests/ref/fate/copy-trac3074 +++ b/tests/ref/fate/copy-trac3074 @@ -1,4 +1,4 @@ -620e3ab4ee6241bec55ea2ec4ef42908 *tests/data/fate/copy-trac3074.mp4 +da6122873fb83ce4340cf5d0ab8d475e *tests/data/fate/copy-trac3074.mp4 334012 tests/data/fate/copy-trac3074.mp4 #tb 0: 1/48000 #media_type 0: audio diff --git a/tests/ref/fate/gaplessenc-itunes-to-ipod-aac b/tests/ref/fate/gaplessenc-itunes-to-ipod-aac index 76cbf22358..95b167bda6 100644 --- a/tests/ref/fate/gaplessenc-itunes-to-ipod-aac +++ b/tests/ref/fate/gaplessenc-itunes-to-ipod-aac @@ -5,7 +5,7 @@ duration_ts=103326 [/STREAM] [FORMAT] start_time=0.000000 -duration=2.367000 +duration=2.344000 [/FORMAT] packet|pts=-1024|dts=-1024|duration=1024|flags=KDside_data| diff --git a/tests/ref/fate/gaplessenc-pcm-to-mov-aac b/tests/ref/fate/gaplessenc-pcm-to-mov-aac index 2b17956e2b..bfd47be10f 100644 --- a/tests/ref/fate/gaplessenc-pcm-to-mov-aac +++ b/tests/ref/fate/gaplessenc-pcm-to-mov-aac @@ -5,7 +5,7 @@ duration_ts=529200 [/STREAM] [FORMAT] start_time=0.000000 -duration=12.024000 +duration=12.000000 [/FORMAT] packet|pts=-1024|dts=-1024|duration=1024|flags=KDside_data| diff --git a/tests/ref/fate/movenc b/tests/ref/fate/movenc index 602639106d..81ea75f372 100644 --- a/tests/ref/fate/movenc +++ b/tests/ref/fate/movenc @@ -7,7 +7,7 @@ write_data len 36, time nopts, type header atom ftyp write_data len 2761, time nopts, type header atom - write_data len 908, time 966667, type sync atom moof write_data len 110, time nopts, type trailer atom - -5b6e4211a45cd5dac99c8b90752a03d7 3815 non-empty-moov-elst +caf0876986b5f033efc0958c338289cc 3815 non-empty-moov-elst write_data len 36, time nopts, type header atom ftyp write_data len 2669, time nopts, type header atom - write_data len 908, time 1000000, type sync atom moof