support seeking in RenderAvi.avi (audio stream == single huge chunk)
authorMichael Niedermayer <michaelni@gmx.at>
Wed, 1 Mar 2006 15:42:07 +0000 (15:42 +0000)
committerMichael Niedermayer <michaelni@gmx.at>
Wed, 1 Mar 2006 15:42:07 +0000 (15:42 +0000)
Originally committed as revision 5087 to svn://svn.ffmpeg.org/ffmpeg/trunk

libavformat/avidec.c

index aee27ec..8f321fa 100644 (file)
@@ -147,6 +147,31 @@ static int read_braindead_odml_indx(AVFormatContext *s, int frame_num){
     return 0;
 }
 
+static void clean_index(AVFormatContext *s){
+    int i, j;
+
+    for(i=0; i<s->nb_streams; i++){
+        AVStream *st = s->streams[i];
+        AVIStream *ast = st->priv_data;
+        int n= st->nb_index_entries;
+        int max= ast->sample_size;
+        int64_t pos, size, ts;
+
+        if(n != 1 || ast->sample_size==0)
+            continue;
+
+        while(max < 1024) max+=max;
+
+        pos= st->index_entries[0].pos;
+        size= st->index_entries[0].size;
+        ts= st->index_entries[0].timestamp;
+
+        for(j=0; j<size; j+=max){
+            av_add_index_entry(st, pos+j, ts + j/ast->sample_size, FFMIN(max, size-j), 0, AVINDEX_KEYFRAME);
+        }
+    }
+}
+
 static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
 {
     AVIContext *avi = s->priv_data;
@@ -419,6 +444,8 @@ static int avi_read_header(AVFormatContext *s, AVFormatParameters *ap)
         avi_load_index(s);
     avi->index_loaded = 1;
     avi->non_interleaved |= guess_ni_flag(s);
+    if(avi->non_interleaved)
+        clean_index(s);
 
     return 0;
 }