[FFmpeg-devel] [PATCH] lavf/mov.c: Guess video codec delay based on PTS while parsing MOV header.
Sasi Inguva
isasi at google.com
Tue Nov 14 04:15:05 EET 2017
Signed-off-by: Sasi Inguva <isasi at google.com>
---
libavformat/mov.c | 48 ++++++++++++++++++++++++++++++++++++++++
tests/fate/mov.mak | 5 +++++
tests/ref/fate/mov-guess-delay-1 | 3 +++
tests/ref/fate/mov-guess-delay-2 | 3 +++
4 files changed, 59 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..91c6987a96 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -3213,6 +3213,52 @@ 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 (msc->ctts_data) {
+ 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 = FFMAX(st->codecpar->video_delay, num_swaps);
+ 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 +3892,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
More information about the ffmpeg-devel
mailing list