[FFmpeg-devel] [PATCH] lavf/mov.c: Set st->start_time for video streams explicitly.

Sasi Inguva isasi at google.com
Wed May 30 01:39:40 EEST 2018


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 at rodete-desktop-imager.corp.google.com>
---
 libavformat/mov.c                            | 20 +++++++++---
 tests/fate/mov.mak                           |  4 +++
 tests/ref/fate/mov-neg-firstpts-discard      |  2 +-
 tests/ref/fate/mov-stream-shorter-than-movie | 33 ++++++++++++++++++++
 4 files changed, 54 insertions(+), 5 deletions(-)
 create mode 100644 tests/ref/fate/mov-stream-shorter-than-movie

diff --git a/libavformat/mov.c b/libavformat/mov.c
index f2a540ad50..1915be5fb5 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -3672,11 +3672,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
@@ -4012,6 +4016,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..c1d399e5c0 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
-- 
2.17.0.921.gf22659ad46-goog



More information about the ffmpeg-devel mailing list