From 76e67e8c53b1caf652415befb696371cb988e389 Mon Sep 17 00:00:00 2001 From: Gildas Bazin Date: Thu, 29 Apr 2004 14:43:12 +0000 Subject: [PATCH] * modules/demux/avi/avi.c: Fixed infinite loop in the AVI demux on broken/incomplete files --- NEWS | 1 + modules/demux/avi/avi.c | 15 +++++++++++++++ 2 files changed, 16 insertions(+) diff --git a/NEWS b/NEWS index d25d36ec07..0196cbe5f9 100644 --- a/NEWS +++ b/NEWS @@ -29,6 +29,7 @@ Input: Demux: * Annodex (http://www.annodex.net) support. * mmsh streaming fixes. + * Fixed infinite loop in the AVI demux on broken/incomplete files. Subtitles: * Subviewer and subviewer v2 subtitles support. diff --git a/modules/demux/avi/avi.c b/modules/demux/avi/avi.c index 9b5347d0e8..d98bbab62d 100644 --- a/modules/demux/avi/avi.c +++ b/modules/demux/avi/avi.c @@ -693,6 +693,8 @@ static int Demux_Seekable( demux_t *p_demux ) if( i_pos == -1 ) { + int i_loop_count = 0; + /* no valid index, we will parse directly the stream * in case we fail we will disable all finished stream */ if( p_sys->i_movi_lastchunk_pos >= p_sys->i_movi_begin + 12 ) @@ -727,6 +729,19 @@ static int Demux_Seekable( demux_t *p_demux ) "cannot skip packet, track disabled" ); return( AVI_TrackStopFinishedStreams( p_demux ) ? 0 : 1 ); } + + /* Prevents from eating all the CPU with broken files. + * This value should be low enough so that it doesn't + * affect the reading speed too much. */ + if( !(++i_loop_count % 1024) ) + { + if( p_demux->b_die ) return -1; + msleep( 10000 ); + + if( !(i_loop_count % (1024 * 10)) ) + msg_Warn( p_demux, + "doesn't seem to find any data..." ); + } continue; } else