Commit f4544163 authored by Jacob Trimble's avatar Jacob Trimble Committed by 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: 's avatarJacob Trimble <modmaker@google.com>
Signed-off-by: 's avatarMichael Niedermayer <michael@niedermayer.cc>
parent 7fb4b036
...@@ -4262,7 +4262,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) ...@@ -4262,7 +4262,7 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
int64_t dts; int64_t dts;
int data_offset = 0; int data_offset = 0;
unsigned entries, first_sample_flags = frag->flags; 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++) { for (i = 0; i < c->fc->nb_streams; i++) {
if (c->fc->streams[i]->id == frag->track_id) { if (c->fc->streams[i]->id == frag->track_id) {
...@@ -4355,13 +4355,19 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom) ...@@ -4355,13 +4355,19 @@ static int mov_read_trun(MOVContext *c, AVIOContext *pb, MOVAtom atom)
MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES)); MOV_FRAG_SAMPLE_FLAG_DEPENDS_YES));
if (keyframe) if (keyframe)
distance = 0; distance = 0;
old_nb_index_entries = st->nb_index_entries;
err = av_add_index_entry(st, offset, dts, sample_size, distance, err = av_add_index_entry(st, offset, dts, sample_size, distance,
keyframe ? AVINDEX_KEYFRAME : 0); keyframe ? AVINDEX_KEYFRAME : 0);
if (err < 0) { if (err < 0) {
av_log(c->fc, AV_LOG_ERROR, "Failed to add index entry\n"); 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", " 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, sc->sample_count+i, "size %u, distance %d, keyframe %d\n", st->index, err,
offset, dts, sample_size, distance, keyframe); offset, dts, sample_size, distance, keyframe);
distance++; distance++;
dts += sample_duration; dts += sample_duration;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment