diff --git a/libavformat/avidec.c b/libavformat/avidec.c index 2814b89d22..5dac749fc5 100644 --- a/libavformat/avidec.c +++ b/libavformat/avidec.c @@ -73,6 +73,7 @@ typedef struct { int odml_depth; int use_odml; #define MAX_ODML_DEPTH 1000 + int64_t dts_max; } AVIContext; @@ -1168,6 +1169,16 @@ resync: } ast->seek_pos= 0; + if(!avi->non_interleaved && st->nb_index_entries>1){ + int64_t dts= av_rescale_q(pkt->dts, st->time_base, AV_TIME_BASE_Q); + + if(avi->dts_max - dts > 2*AV_TIME_BASE){ + avi->non_interleaved= 1; + av_log(s, AV_LOG_INFO, "Switching to NI mode, due to poor interleaving\n"); + }else if(avi->dts_max < dts) + avi->dts_max = dts; + } + return size; } @@ -1407,6 +1418,7 @@ static int avi_read_seek(AVFormatContext *s, int stream_index, int64_t timestamp /* do the seek */ avio_seek(s->pb, pos_min, SEEK_SET); avi->stream_index= -1; + avi->dts_max= INT_MIN; return 0; }