You've already forked FFmpeg
mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2025-08-15 14:13:16 +02:00
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@google.com> Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
This commit is contained in:
committed by
Michael Niedermayer
parent
7fb4b0368d
commit
f4544163b2
@@ -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)
|
|||||||
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;
|
||||||
|
Reference in New Issue
Block a user