diff options
author | John Stebbins <stebbins@jetheaddev.com> | 2011-07-01 08:57:42 -0700 |
---|---|---|
committer | Reinhard Tartler <siretart@tauware.de> | 2011-07-16 13:49:34 +0200 |
commit | c29c609e0f4bf3fea29104c689c11f7dda499135 (patch) | |
tree | c0d584152e6335ee2687f3caf1851f0f19f20bdd | |
parent | 9459390f29ec6df63ff1878f13b7b4343811948a (diff) | |
download | ffmpeg-c29c609e0f4bf3fea29104c689c11f7dda499135.tar.gz |
matroskadec: matroska_read_seek after after EBML_STOP leads to failure.
EBML_STOP leaves matroska->current_id set. Then matroska_read_seek changes
the stream position without resetting current_id. The next
matroska_parse_cluster fails due to calculation of incorrect pos. So clear
current_id when avio_seek happens in matroska_read_seek.
Signed-off-by: Ronald S. Bultje <rsbultje@gmail.com>
(cherry picked from commit cdc2c1c57616956d975c57b4b69eb73865f513f5)
-rw-r--r-- | libavformat/matroskadec.c | 2 |
1 files changed, 2 insertions, 0 deletions
diff --git a/libavformat/matroskadec.c b/libavformat/matroskadec.c index 57a8f624b8..60f6c6985b 100644 --- a/libavformat/matroskadec.c +++ b/libavformat/matroskadec.c @@ -1903,6 +1903,7 @@ static int matroska_read_seek(AVFormatContext *s, int stream_index, if ((index = av_index_search_timestamp(st, timestamp, flags)) < 0) { avio_seek(s->pb, st->index_entries[st->nb_index_entries-1].pos, SEEK_SET); + matroska->current_id = 0; while ((index = av_index_search_timestamp(st, timestamp, flags)) < 0) { matroska_clear_queue(matroska); if (matroska_parse_cluster(matroska) < 0) @@ -1931,6 +1932,7 @@ static int matroska_read_seek(AVFormatContext *s, int stream_index, } avio_seek(s->pb, st->index_entries[index_min].pos, SEEK_SET); + matroska->current_id = 0; matroska->skip_to_keyframe = !(flags & AVSEEK_FLAG_ANY); matroska->skip_to_timecode = st->index_entries[index].timestamp; matroska->done = 0; |