From 187528441ab936c102b8e72f38925cc10fc14abc Mon Sep 17 00:00:00 2001 From: Michael Niedermayer Date: Fri, 6 May 2011 03:52:16 +0200 Subject: [PATCH] avidec: correct frame_offset for seeking Signed-off-by: Michael Niedermayer --- libavformat/avidec.c | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/libavformat/avidec.c b/libavformat/avidec.c index 98b3be6738..7e97b7b4c9 100644 --- a/libavformat/avidec.c +++ b/libavformat/avidec.c @@ -1303,7 +1303,7 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp { AVIContext *avi = s->priv_data; AVStream *st; - int i, index; + int i, index, j; int64_t pos, pos_min; AVIStream *ast; @@ -1367,6 +1367,22 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp index=0; ast2->seek_pos= st2->index_entries[index].pos; pos_min= FFMIN(pos_min,ast2->seek_pos); + } + for(i = 0; i < s->nb_streams; i++) { + AVStream *st2 = s->streams[i]; + AVIStream *ast2 = st2->priv_data; + + if (ast2->sub_ctx || st2->nb_index_entries <= 0) + continue; + + index = av_index_search_timestamp( + st2, + av_rescale_q(timestamp, st->time_base, st2->time_base) * FFMAX(ast2->sample_size, 1), + flags | AVSEEK_FLAG_BACKWARD); + if(index<0) + index=0; + while(index>0 && st2->index_entries[index-1].pos >= pos_min) + index--; ast2->frame_offset = st2->index_entries[index].timestamp; }