From patchwork Sun Dec 15 22:16:14 2019 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: 16809 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 7AE0C44A8DF for ; Mon, 16 Dec 2019 00:24:37 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 63B6768A5E5; Mon, 16 Dec 2019 00:24:37 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm1-f54.google.com (mail-wm1-f54.google.com [209.85.128.54]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 4F243689BCE for ; Mon, 16 Dec 2019 00:24:30 +0200 (EET) Received: by mail-wm1-f54.google.com with SMTP id b72so2618354wme.4 for ; Sun, 15 Dec 2019 14:24: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=11LfmRsRqDoTt3cgZBa9HQOazdqjQIyvleY+8u2D/D0=; b=Pgv3Q1Y3v1iMkbpvn8hfEEedFLpGC7vxMN/zNMgm2F6maaIMQx3IkIKR2oBv1/E4OH UCSgms11pRQOjNFo07BeKLPRwgSsdBqiIquTzE/PO7QNt3jRdu8ULyjf8sMlASf5p3tB E67fhevbfSaV3ztMw3l8xdLUkaiOnqJYSpl4m3uADrCV+KyyIDNFIB+vYxcQIZhXUAqb x8+PTYPsjFBjuSlO8A2g81oLh+dExsa3MCKgqGl894GS9MrTZINggZPpvUieoP3FiBIT qpQHx75cnKWzM7hP6nn5gU668ZNV60ESD4oyzMvuQ935qTNa6fA6OXs6AtLGSqKyONug CXNw== 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=11LfmRsRqDoTt3cgZBa9HQOazdqjQIyvleY+8u2D/D0=; b=U00VRPVc4Y7rvCnmtjhmtYXD8cXsRR6/b5Co0a2P1ttoUHCzhbazMw8ey3xuHLlz72 Y00YINHq3WIex3mUpq6OMalHeurtQcJNX64YpxxDybps0NBKhDV9vfd7jz7IsIptm7Dg 5NAGMoo0rgan9P/Kql5Ldg2fGX4c53bxp+U5uAqO7qOEmjYn6zfH18/JWAb7Gksaoj4p m7kBvNRd38qCth/MJW52c2qKzmCwbHAKjHTM1qCh6QdgWcblKEe6eIJNdQ2kdfwJhY++ euanu/21xrYAscln8SrqmFhRcFZxKuwxozaHC8IevrcVvh3XpKwaHXRLUjqZcxUGKgsz rZ1g== X-Gm-Message-State: APjAAAUlzJBk2icLDo8bF+lfHtEQL2V8hMfqHDtnGS9iT/BJRtZyfBRS COBdeiogxI8hkKDNOYeRx3u6ZnhXULM= X-Google-Smtp-Source: APXvYqy0Nwx+PL+VFuaS9Rr9PZZq8avsv+APzwjtw9O6NFMdzwMDcZkgU8FmfkRCc8SeqwwaTkFt8g== X-Received: by 2002:a7b:c0ce:: with SMTP id s14mr10480590wmh.117.1576448176947; Sun, 15 Dec 2019 14:16:16 -0800 (PST) Received: from localhost (host-96-177.parnet.fi. [77.234.96.177]) by smtp.gmail.com with ESMTPSA id u13sm3095013wmd.36.2019.12.15.14.16.16 for (version=TLS1 cipher=AES128-SHA bits=128/128); Sun, 15 Dec 2019 14:16:16 -0800 (PST) From: =?UTF-8?q?Martin=20Storsj=C3=B6?= To: ffmpeg-devel@ffmpeg.org Date: Mon, 16 Dec 2019 00:16:14 +0200 Message-Id: <20191215221614.51627-1-martin@martin.st> X-Mailer: git-send-email 2.21.0 (Apple Git-122.2) MIME-Version: 1.0 Subject: [FFmpeg-devel] [PATCH] movenc: Write durations based on pts into mvhd/mdhd/tkhd/elst 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" Keep all the existing data fields as they are (there's lots and lots of nontrivial calculation and heuristics based on them in their current form), but derive the duration as the difference between the pts of the first packet to the maximum pts+duration (not necessarily the last packet); use this duration in any box where the actual presentation duration is supposed to be. Fixes: 8420 --- libavformat/movenc.c | 21 ++++++++++++++++----- tests/ref/lavf/mov | 4 ++-- tests/ref/lavf/mp4 | 4 ++-- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/libavformat/movenc.c b/libavformat/movenc.c index dd144ae20a..24878746a1 100644 --- a/libavformat/movenc.c +++ b/libavformat/movenc.c @@ -2760,10 +2760,21 @@ static int mov_write_minf_tag(AVFormatContext *s, AVIOContext *pb, MOVMuxContext return update_size(pb, pos); } +static int64_t calc_pts_duration(MOVTrack *track) +{ + 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); + } + return track->track_duration; +} + static int mov_write_mdhd_tag(AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track) { - int version = track->track_duration < INT32_MAX ? 0 : 1; + int64_t duration = calc_pts_duration(track); + int version = duration < INT32_MAX ? 0 : 1; if (track->mode == MODE_ISM) version = 1; @@ -2785,7 +2796,7 @@ static int mov_write_mdhd_tag(AVIOContext *pb, MOVMuxContext *mov, else if (!track->entry) (version == 1) ? avio_wb64(pb, 0) : avio_wb32(pb, 0); else - (version == 1) ? avio_wb64(pb, track->track_duration) : avio_wb32(pb, track->track_duration); /* duration */ + (version == 1) ? avio_wb64(pb, duration) : avio_wb32(pb, duration); /* duration */ avio_wb16(pb, track->language); /* language */ avio_wb16(pb, 0); /* reserved (quality) */ @@ -2835,7 +2846,7 @@ static void write_matrix(AVIOContext *pb, int16_t a, int16_t b, int16_t c, static int mov_write_tkhd_tag(AVIOContext *pb, MOVMuxContext *mov, MOVTrack *track, AVStream *st) { - int64_t duration = av_rescale_rnd(track->track_duration, MOV_TIMESCALE, + int64_t duration = av_rescale_rnd(calc_pts_duration(track), MOV_TIMESCALE, track->timescale, AV_ROUND_UP); int version = duration < INT32_MAX ? 0 : 1; int flags = MOV_TKHD_FLAG_IN_MOVIE; @@ -2982,7 +2993,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(track->track_duration, MOV_TIMESCALE, + int64_t duration = av_rescale_rnd(calc_pts_duration(track), MOV_TIMESCALE, track->timescale, AV_ROUND_UP); int version = duration < INT32_MAX ? 0 : 1; int entry_size, entry_count, size; @@ -3269,7 +3280,7 @@ static int mov_write_mvhd_tag(AVIOContext *pb, MOVMuxContext *mov) for (i = 0; i < mov->nb_streams; i++) { if (mov->tracks[i].entry > 0 && mov->tracks[i].timescale) { - int64_t max_track_len_temp = av_rescale_rnd(mov->tracks[i].track_duration, + int64_t max_track_len_temp = av_rescale_rnd(calc_pts_duration(&mov->tracks[i]), MOV_TIMESCALE, mov->tracks[i].timescale, AV_ROUND_UP); diff --git a/tests/ref/lavf/mov b/tests/ref/lavf/mov index 75a0c4892d..71aad501d6 100644 --- a/tests/ref/lavf/mov +++ b/tests/ref/lavf/mov @@ -1,7 +1,7 @@ -11bd76730274924e02623172b82b5236 *tests/data/lavf/lavf.mov +a0d1d1b41830a46b91d1282ced7e7faf *tests/data/lavf/lavf.mov 357539 tests/data/lavf/lavf.mov tests/data/lavf/lavf.mov CRC=0xbb2b949b -6efa586655e3db043cb29668f5216610 *tests/data/lavf/lavf.mov +46a18d83ae4f9ecfc993f135e62d484d *tests/data/lavf/lavf.mov 366621 tests/data/lavf/lavf.mov tests/data/lavf/lavf.mov CRC=0xa9793231 c80c625ded376602e71d5aa6ac6fdb1c *tests/data/lavf/lavf.mov diff --git a/tests/ref/lavf/mp4 b/tests/ref/lavf/mp4 index 8482812380..74b286e537 100644 --- a/tests/ref/lavf/mp4 +++ b/tests/ref/lavf/mp4 @@ -1,7 +1,7 @@ -ebca72c186a4f3ba9bb17d9cb5b74fef *tests/data/lavf/lavf.mp4 +3a14053a4f655ac77850160f592ded17 *tests/data/lavf/lavf.mp4 312457 tests/data/lavf/lavf.mp4 tests/data/lavf/lavf.mp4 CRC=0x9d9a638a -9944512475d82d2d601f3c96101bdf9c *tests/data/lavf/lavf.mp4 +7568ed0224236ee9731b686708e098e0 *tests/data/lavf/lavf.mp4 321343 tests/data/lavf/lavf.mp4 tests/data/lavf/lavf.mp4 CRC=0xe8130120 7b3e71f294901067046c09f03a426bdc *tests/data/lavf/lavf.mp4