OSDN Git Service

avidec: correct frame_offset for seeking
authorMichael Niedermayer <michaelni@gmx.at>
Fri, 6 May 2011 01:52:16 +0000 (03:52 +0200)
committerMichael Niedermayer <michaelni@gmx.at>
Fri, 6 May 2011 01:54:35 +0000 (03:54 +0200)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavformat/avidec.c

index 98b3be6..7e97b7b 100644 (file)
@@ -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;
     }