Signed-off-by: Sasi Inguva <is...@google.com> --- libavformat/mov.c | 52 ++++++++++++++++++++++++++++++++++++++++ tests/fate/mov.mak | 5 ++++ tests/ref/fate/mov-guess-delay-1 | 3 +++ tests/ref/fate/mov-guess-delay-2 | 3 +++ 4 files changed, 63 insertions(+) create mode 100644 tests/ref/fate/mov-guess-delay-1 create mode 100644 tests/ref/fate/mov-guess-delay-2
diff --git a/libavformat/mov.c b/libavformat/mov.c index fd170baa57..687297be33 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -3213,6 +3213,56 @@ static int64_t add_ctts_entry(MOVStts** ctts_data, unsigned int* ctts_count, uns return *ctts_count; } +static void mov_guess_video_delay(MOVContext *c, AVStream* st) { + MOVStreamContext *msc = st->priv_data; + int ind; + int ctts_ind = 0; + int ctts_sample = 0; + int64_t curr_pts = AV_NOPTS_VALUE; + int64_t prev_pts = AV_NOPTS_VALUE; + int64_t prev_max_pts = AV_NOPTS_VALUE; + int num_swaps = 0; + + if (st->codecpar->video_delay <= 0 && msc->ctts_data && + (st->codecpar->codec_id == AV_CODEC_ID_MPEG2VIDEO || + st->codecpar->codec_id == AV_CODEC_ID_H263 || + st->codecpar->codec_id == AV_CODEC_ID_H264 || + st->codecpar->codec_id == AV_CODEC_ID_HEVC)) { + st->codecpar->video_delay = 0; + for(ind = 0; ind < st->nb_index_entries && ctts_ind < msc->ctts_count; ++ind) { + curr_pts = st->index_entries[ind].timestamp + msc->ctts_data[ctts_ind].duration; + + // This is used as an indication that the previous GOP has ended and a + // new GOP has started. + if (curr_pts > prev_max_pts) { + st->codecpar->video_delay = FFMIN(FFMAX(st->codecpar->video_delay, num_swaps), 16); + num_swaps = 0; + prev_max_pts = curr_pts; + } + + // Compute delay as the no. of "drop"s in PTS inside a GOP. + // Frames: I0 I1 B0 B1 B2 + // PTS: 0 4 1 2 3 -> num_swaps = delay = 1 (4->1) + // + // Frames: I0 I1 B1 B0 B2 + // PTS: 0 4 2 1 3 -> num_swaps = delay = 2 (4->2, 2->1) + if (prev_pts != AV_NOPTS_VALUE) { + if (curr_pts < prev_pts) + ++num_swaps; + } + + prev_pts = curr_pts; + ctts_sample++; + if (ctts_sample == msc->ctts_data[ctts_ind].count) { + ctts_ind++; + ctts_sample = 0; + } + } + av_log(c->fc, AV_LOG_DEBUG, "Setting codecpar->delay to %d for stream st: %d\n", + st->codecpar->video_delay, st->index); + } +} + static void mov_current_sample_inc(MOVStreamContext *sc) { sc->current_sample++; @@ -3846,6 +3896,8 @@ static void mov_build_index(MOVContext *mov, AVStream *st) // Fix index according to edit lists. mov_fix_index(mov, st); } + + mov_guess_video_delay(mov, st); } static int test_same_origin(const char *src, const char *ref) { diff --git a/tests/fate/mov.mak b/tests/fate/mov.mak index 76f66ff498..ef89e62096 100644 --- a/tests/fate/mov.mak +++ b/tests/fate/mov.mak @@ -11,6 +11,8 @@ FATE_MOV = fate-mov-3elist \ fate-mov-440hz-10ms \ fate-mov-ibi-elst-starts-b \ fate-mov-elst-ends-betn-b-and-i \ + fate-mov-guess-delay-1 \ + fate-mov-guess-delay-2 \ FATE_MOV_FFPROBE = fate-mov-aac-2048-priming \ fate-mov-zombie \ @@ -72,3 +74,6 @@ fate-mov-spherical-mono: CMD = run ffprobe$(PROGSSUF)$(EXESUF) -show_entries str fate-mov-gpmf-remux: CMD = md5 -i $(TARGET_SAMPLES)/mov/fake-gp-media-with-real-gpmf.mp4 -map 0 -c copy -fflags +bitexact -f mp4 fate-mov-gpmf-remux: CMP = oneline fate-mov-gpmf-remux: REF = 8f48e435ee1f6b7e173ea756141eabf3 + +fate-mov-guess-delay-1: CMD = run ffprobe$(PROGSSUF)$(EXESUF) -show_entries stream=has_b_frames -select_streams v $(TARGET_SAMPLES)/h264/h264_3bf_nopyramid_nobsrestriction.mp4 +fate-mov-guess-delay-2: CMD = run ffprobe$(PROGSSUF)$(EXESUF) -show_entries stream=has_b_frames -select_streams v $(TARGET_SAMPLES)/h264/h264_3bf_pyramid_nobsrestriction.mp4 \ No newline at end of file diff --git a/tests/ref/fate/mov-guess-delay-1 b/tests/ref/fate/mov-guess-delay-1 new file mode 100644 index 0000000000..96cb67be0c --- /dev/null +++ b/tests/ref/fate/mov-guess-delay-1 @@ -0,0 +1,3 @@ +[STREAM] +has_b_frames=1 +[/STREAM] diff --git a/tests/ref/fate/mov-guess-delay-2 b/tests/ref/fate/mov-guess-delay-2 new file mode 100644 index 0000000000..248de1c3ea --- /dev/null +++ b/tests/ref/fate/mov-guess-delay-2 @@ -0,0 +1,3 @@ +[STREAM] +has_b_frames=2 +[/STREAM] -- 2.15.0.448.gf294e3d99a-goog _______________________________________________ ffmpeg-devel mailing list ffmpeg-devel@ffmpeg.org http://ffmpeg.org/mailman/listinfo/ffmpeg-devel