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