diff --git a/libavformat/mov.c b/libavformat/mov.c index cab7247cc5..4ad19122b3 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -3673,11 +3673,15 @@ static void mov_fix_index(MOVContext *mov, AVStream *st) // If the minimum pts turns out to be greater than zero after fixing the index, then we subtract the // dts by that amount to make the first pts zero. - if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && msc->min_corrected_pts > 0) { - av_log(mov->fc, AV_LOG_DEBUG, "Offset DTS by %"PRId64" to make first pts zero.\n", msc->min_corrected_pts); - for (i = 0; i < st->nb_index_entries; ++i) { - st->index_entries[i].timestamp -= msc->min_corrected_pts; + if (st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO) { + if (msc->min_corrected_pts > 0) { + av_log(mov->fc, AV_LOG_DEBUG, "Offset DTS by %"PRId64" to make first pts zero.\n", msc->min_corrected_pts); + for (i = 0; i < st->nb_index_entries; ++i) { + st->index_entries[i].timestamp -= msc->min_corrected_pts; + } } + // Start time should be equal to zero or the duration of any empty edits. + st->start_time = empty_edits_sum_duration; } // Update av stream length, if it ends up shorter than the track's media duration @@ -4013,6 +4017,14 @@ static void mov_build_index(MOVContext *mov, AVStream *st) mov_fix_index(mov, st); } + // Update start time of the stream. + if (st->start_time == AV_NOPTS_VALUE && st->codecpar->codec_type == AVMEDIA_TYPE_VIDEO && st->nb_index_entries > 0) { + st->start_time = st->index_entries[0].timestamp + sc->dts_shift; + if (sc->ctts_data) { + st->start_time += sc->ctts_data[0].duration; + } + } + mov_estimate_video_delay(mov, st); } diff --git a/tests/fate/mov.mak b/tests/fate/mov.mak index eadee3abfa..960b1867dd 100644 --- a/tests/fate/mov.mak +++ b/tests/fate/mov.mak @@ -16,6 +16,7 @@ FATE_MOV = fate-mov-3elist \ fate-mov-frag-overlap \ fate-mov-bbi-elst-starts-b \ fate-mov-neg-firstpts-discard-frames \ + fate-mov-stream-shorter-than-movie \ FATE_MOV_FFPROBE = fate-mov-neg-firstpts-discard \ fate-mov-aac-2048-priming \ @@ -88,6 +89,9 @@ fate-mov-neg-firstpts-discard: CMD = run ffprobe$(PROGSSUF)$(EXESUF) -show_entri # Makes sure that expected frames are generated for mov_neg_first_pts_discard.mov with -vsync 1 fate-mov-neg-firstpts-discard-frames: CMD = framemd5 -flags +bitexact -i $(TARGET_SAMPLES)/mov/mov_neg_first_pts_discard.mov -vsync 1 +# Makes sure that no frame is dropped/duplicated with fps filter due to start_time / duration miscalculations. +fate-mov-stream-shorter-than-movie: CMD = framemd5 -flags +bitexact -i $(TARGET_SAMPLES)/mov/mov_stream_shorter_than_movie.mov -vf fps=fps=24 -an + fate-mov-aac-2048-priming: CMD = run ffprobe$(PROGSSUF)$(EXESUF) -show_packets -print_format compact $(TARGET_SAMPLES)/mov/aac-2048-priming.mov fate-mov-zombie: CMD = run ffprobe$(PROGSSUF)$(EXESUF) -show_streams -show_packets -show_frames -bitexact -print_format compact $(TARGET_SAMPLES)/mov/white_zombie_scrunch-part.mov diff --git a/tests/ref/fate/mov-neg-firstpts-discard b/tests/ref/fate/mov-neg-firstpts-discard index 7c982d3ffe..2e295e3b68 100644 --- a/tests/ref/fate/mov-neg-firstpts-discard +++ b/tests/ref/fate/mov-neg-firstpts-discard @@ -1,3 +1,3 @@ [STREAM] -start_time=N/A +start_time=0.000000 [/STREAM] diff --git a/tests/ref/fate/mov-stream-shorter-than-movie b/tests/ref/fate/mov-stream-shorter-than-movie new file mode 100644 index 0000000000..28f3ef378c --- /dev/null +++ b/tests/ref/fate/mov-stream-shorter-than-movie @@ -0,0 +1,33 @@ +#format: frame checksums +#version: 2 +#hash: MD5 +#tb 0: 1/24 +#media_type 0: video +#codec_id 0: rawvideo +#dimensions 0: 640x480 +#sar 0: 0/1 +#stream#, dts, pts, duration, size, hash +0, 0, 0, 1, 460800, 3a26ddfa53f09d535c701138027e49dc +0, 1, 1, 1, 460800, f09fe0d079ee81eb7db617b48ab5eecf +0, 2, 2, 1, 460800, 40a165b074c7f4d34a41f320400737fc +0, 3, 3, 1, 460800, 8ba73359c89ebc51e29847ef0e27f7c3 +0, 4, 4, 1, 460800, 0d783fcf3d37b99e7b41c0450e28f905 +0, 5, 5, 1, 460800, 7251de6f3e2ebccc2183aa7090dd59fb +0, 6, 6, 1, 460800, 5d2ab26df00d2ef9adf763480f9c0493 +0, 7, 7, 1, 460800, b545f2623d4f4b3bc5ba28ca842cb00e +0, 8, 8, 1, 460800, b3132e721028d0ccd0a734ef44fec5ff +0, 9, 9, 1, 460800, 354af9e99c0d5b9cb910b468e8afc89e +0, 10, 10, 1, 460800, 55452405c3cf6c44365d2dbe6cf37be3 +0, 11, 11, 1, 460800, 8ad58d19a00acc37536054706e235868 +0, 12, 12, 1, 460800, 833295be0a52fc2cf8dc7ae0375fd4f1 +0, 13, 13, 1, 460800, 3a943976671337231b962c659bb70f5c +0, 14, 14, 1, 460800, 1dddc5aae4adb42b582565bc19f3f464 +0, 15, 15, 1, 460800, 0562a855137f84269cbfaa94e7d0f623 +0, 16, 16, 1, 460800, e4a89894c47c7142fbc0b9122a7c0561 +0, 17, 17, 1, 460800, 31f4354cc10c6a9d3fc35c0123710528 +0, 18, 18, 1, 460800, c4cfbb24b55d09be1a9b6f1f3fe3ae33 +0, 19, 19, 1, 460800, 0643e1e9cf7e3a4494ad4b425e7dcce7 +0, 20, 20, 1, 460800, 1caf065c1fcb1541e5625d9d5e9d0944 +0, 21, 21, 1, 460800, f519db6dcb739a494e4b57bff2c3b021 +0, 22, 22, 1, 460800, 5bcd1c762ff8edf2b9a4e489be97f18d +0, 23, 23, 1, 460800, a818d6d3a94270294d6cf9432b19daa5