diff options
author | Sasi Inguva <isasi-at-google.com@ffmpeg.org> | 2016-11-09 10:51:13 -0800 |
---|---|---|
committer | Michael Niedermayer <michael@niedermayer.cc> | 2016-11-10 17:44:47 +0100 |
commit | c8dc11bb9ef92b8e90142a41e91b192346f4d7a0 (patch) | |
tree | 3fe325d797c80988b195c92e5e830acb4e8e0a1d /libavformat | |
parent | bd6fa80d56fcda385da1c8f21eb83282a7930899 (diff) | |
download | ffmpeg-c8dc11bb9ef92b8e90142a41e91b192346f4d7a0.tar.gz |
lavf/mov.c: Fallback to finding non-keyframe in fix_index, if keyframe search fails.
Signed-off-by: Sasi Inguva <isasi@google.com>
Reviewed-by: Derek Buitenhuis <derek.buitenhuis@gmail.com>
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
Diffstat (limited to 'libavformat')
-rw-r--r-- | libavformat/mov.c | 41 |
1 files changed, 30 insertions, 11 deletions
diff --git a/libavformat/mov.c b/libavformat/mov.c index ca978c282e..9ec7d030d3 100644 --- a/libavformat/mov.c +++ b/libavformat/mov.c @@ -2822,16 +2822,17 @@ static int get_edit_list_entry(MOVContext *mov, } /** - * Find the closest previous keyframe to the timestamp, in e_old index - * entries. + * Find the closest previous frame to the timestamp, in e_old index + * entries. Searching for just any frame / just key frames can be controlled by + * last argument 'flag'. * Returns the index of the entry in st->index_entries if successful, * else returns -1. */ -static int64_t find_prev_closest_keyframe_index(AVStream *st, - AVIndexEntry *e_old, - int nb_old, - int64_t timestamp, - int flag) +static int64_t find_prev_closest_index(AVStream *st, + AVIndexEntry *e_old, + int nb_old, + int64_t timestamp, + int flag) { AVIndexEntry *e_keep = st->index_entries; int nb_keep = st->nb_index_entries; @@ -3048,10 +3049,21 @@ static void mov_fix_index(MOVContext *mov, AVStream *st) search_timestamp = FFMAX(search_timestamp - msc->time_scale, e_old[0].timestamp); } - index = find_prev_closest_keyframe_index(st, e_old, nb_old, search_timestamp, 0); + index = find_prev_closest_index(st, e_old, nb_old, search_timestamp, 0); if (index == -1) { - av_log(mov->fc, AV_LOG_ERROR, "Missing key frame while reordering index according to edit list\n"); - continue; + av_log(mov->fc, AV_LOG_WARNING, + "st: %d edit list: %"PRId64" Missing key frame while searching for timestamp: %"PRId64"\n", + st->index, edit_list_index, search_timestamp); + index = find_prev_closest_index(st, e_old, nb_old, search_timestamp, AVSEEK_FLAG_ANY); + + if (index == -1) { + av_log(mov->fc, AV_LOG_WARNING, + "st: %d edit list %"PRId64" Cannot find an index entry before timestamp: %"PRId64".\n" + "Rounding edit list media time to zero.\n", + st->index, edit_list_index, search_timestamp); + index = 0; + edit_list_media_time = 0; + } } current = e_old + index; @@ -4443,7 +4455,14 @@ static int mov_read_elst(MOVContext *c, AVIOContext *pb, MOVAtom atom) } e->rate = avio_rb32(pb) / 65536.0; av_log(c->fc, AV_LOG_TRACE, "duration=%"PRId64" time=%"PRId64" rate=%f\n", - e->duration, e->time, e->rate); + e->duration, e->time, e->rate); + + if (e->time < 0 && e->time != -1 && + c->fc->strict_std_compliance >= FF_COMPLIANCE_STRICT) { + av_log(c->fc, AV_LOG_ERROR, "Track %d, edit %d: Invalid edit list media time=%"PRId64"\n", + c->fc->nb_streams-1, i, e->time); + return AVERROR_INVALIDDATA; + } } sc->elst_count = i; |