Skip to content

Commit

Permalink
lavf/mov.c: Set st->start_time for video streams explicitly.
Browse files Browse the repository at this point in the history
If start_time is not set, ffmpeg takes the duration from the global
movie instead of the per stream duration.
Signed-off-by: Sasi Inguva <isasi@google.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
  • Loading branch information
isasi authored and michaelni committed Jun 5, 2018
1 parent 318d0fc commit fe6c4f0
Show file tree
Hide file tree
Showing 4 changed files with 54 additions and 5 deletions.
20 changes: 16 additions & 4 deletions libavformat/mov.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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);
}

Expand Down
4 changes: 4 additions & 0 deletions tests/fate/mov.mak
Original file line number Diff line number Diff line change
Expand Up @@ -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 \
Expand Down Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion tests/ref/fate/mov-neg-firstpts-discard
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
[STREAM]
start_time=N/A
start_time=0.000000
[/STREAM]
33 changes: 33 additions & 0 deletions tests/ref/fate/mov-stream-shorter-than-movie
Original file line number Diff line number Diff line change
@@ -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

0 comments on commit fe6c4f0

Please sign in to comment.