[FFmpeg-cvslog] libavformat/mov: Fix inserting frames before current_frame.

Jacob Trimble git at videolan.org
Fri Aug 18 04:59:28 EEST 2017


ffmpeg | branch: master | Jacob Trimble <modmaker-at-google.com at ffmpeg.org> | Thu Jul 27 10:34:32 2017 -0700| [f4544163b27615ecfff1b42d6acdb3672ac92399] | committer: Michael Niedermayer

libavformat/mov: Fix inserting frames before current_frame.

When using streaming input, it may be possible to see frames that appear
before the current_frame.  When these frames are inserted into the
index, the current_frame needs to be updated so it is still pointing
at the same frame.

Signed-off-by: Jacob Trimble <modmaker at google.com>
Signed-off-by: Michael Niedermayer <michael at niedermayer.cc>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=f4544163b27615ecfff1b42d6acdb3672ac92399
---

 libavformat/mov.c | 12 +++++++++---
 1 file changed, 9 insertions(+), 3 deletions(-)

diff --git a/libavformat/mov.c b/libavformat/mov.c
index c02caf6719..522ce60c2d 100644
--- a/libavformat/mov.c
+++ b/libavformat/mov.c
@@ -4262,7 +4262,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
     int64_t dts;
     int data_offset = 0;
     unsigned entries, first_sample_flags = frag->flags;
-    int flags, distance, i, err;
+    int flags, distance, i, err, old_nb_index_entries;
 
     for (i = 0; i < c->fc->nb_streams; i++) {
         if (c->fc->streams[i]->id == frag->track_id) {
@@ -4355,13 +4355,19 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
                                   MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES));
         if (keyframe)
             distance = 0;
+        old_nb_index_entries = st->nb_index_entries;
         err = av_add_index_entry(st, offset, dts, sample_size, distance,
                                  keyframe ? AVINDEX_KEYFRAME : 0);
         if (err < 0) {
             av_log(c->fc, AV_LOG_ERROR, "Failed to add index entry\n");
+        } else if (err <= sc->current_sample && err + 1 != st->nb_index_entries &&
+            st->nb_index_entries != old_nb_index_entries) {
+            // if we inserted a new item before the current sample, move the
+            // counter ahead so it is still pointing to the same sample.
+            sc->current_sample++;
         }
-        av_log(c->fc, AV_LOG_TRACE, "AVIndex stream %d, sample %u, offset %"PRIx64", dts %"PRId64", "
-                "size %u, distance %d, keyframe %d\n", st->index, sc->sample_count+i,
+        av_log(c->fc, AV_LOG_TRACE, "AVIndex stream %d, sample %d, offset %"PRIx64", dts %"PRId64", "
+                "size %u, distance %d, keyframe %d\n", st->index, err,
                 offset, dts, sample_size, distance, keyframe);
         distance++;
         dts += sample_duration;



More information about the ffmpeg-cvslog mailing list