diff mbox series

[FFmpeg-devel] avformat/movenc: fix duration in mdhd box

Message ID tencent_44A0555A2767B88B960E4D1AA02ECDF9CF07@qq.com
State New
Headers show
Series [FFmpeg-devel] avformat/movenc: fix duration in mdhd box | expand

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 fail Make fate failed
andriy/make_ppc success Make finished
andriy/make_fate_ppc fail Make fate failed

Commit Message

Zhao Zhili Dec. 17, 2021, 1:34 p.m. UTC
It's the duration of this media, should not take account of
editlist.
---
 libavformat/movenc.c  | 9 +++++++--
 tests/ref/fate/movenc | 2 +-
 2 files changed, 8 insertions(+), 3 deletions(-)

Comments

Martin Storsjö Dec. 17, 2021, 1:43 p.m. UTC | #1
On Fri, 17 Dec 2021, Zhao Zhili wrote:

> It's the duration of this media, should not take account of
> editlist.
> ---
> libavformat/movenc.c  | 9 +++++++--
> tests/ref/fate/movenc | 2 +-
> 2 files changed, 8 insertions(+), 3 deletions(-)
>
> diff --git a/libavformat/movenc.c b/libavformat/movenc.c
> index 0f912dd012..643beac6f2 100644
> --- a/libavformat/movenc.c
> +++ b/libavformat/movenc.c
> @@ -2970,8 +2970,13 @@ static int64_t calc_pts_duration(MOVMuxContext *mov, MOVTrack *track)
> static int mov_write_mdhd_tag(AVIOContext *pb, MOVMuxContext *mov,
>                               MOVTrack *track)
> {
> -    int64_t duration = calc_pts_duration(mov, track);
> -    int version = duration < INT32_MAX ? 0 : 1;
> +    int64_t start, end;
> +    int64_t duration;
> +    int version;
> +
> +    get_pts_range(mov, track, &start, &end);
> +    duration = end - start;
> +    version = duration < INT32_MAX ? 0 : 1;

Isn't this equal to what calc_samples_pts_duration() returns?

It'd be good to point out in the commit message, that 
c2424b1f35a1c6c06f1f9fe5f77a7157ed84e1cd was incorrect in this 
aspect. It'd also be good to really spell it out clearly, that (if I 
understand it correctly), mvhd and tkhd should present the post-editlist 
duration, while mdhd should have the pre-editlist duration?

// Martin
diff mbox series

Patch

diff --git a/libavformat/movenc.c b/libavformat/movenc.c
index 0f912dd012..643beac6f2 100644
--- a/libavformat/movenc.c
+++ b/libavformat/movenc.c
@@ -2970,8 +2970,13 @@  static int64_t calc_pts_duration(MOVMuxContext *mov, MOVTrack *track)
 static int mov_write_mdhd_tag(AVIOContext *pb, MOVMuxContext *mov,
                               MOVTrack *track)
 {
-    int64_t duration = calc_pts_duration(mov, track);
-    int version = duration < INT32_MAX ? 0 : 1;
+    int64_t start, end;
+    int64_t duration;
+    int version;
+
+    get_pts_range(mov, track, &start, &end);
+    duration = end - start;
+    version = duration < INT32_MAX ? 0 : 1;
 
     if (track->mode == MODE_ISM)
         version = 1;
diff --git a/tests/ref/fate/movenc b/tests/ref/fate/movenc
index 81ea75f372..19e4e291b8 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 -
-caf0876986b5f033efc0958c338289cc 3815 non-empty-moov-elst
+9d260d424e9de4626163fd25ccce5bab 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