diff --git a/libavformat/avidec.c b/libavformat/avidec.c index aee27ec506..8f321fadc9 100644 --- a/libavformat/avidec.c +++ b/libavformat/avidec.c @@ -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; inb_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; jsample_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; }