From 4feb30d653fd402f5fd27f6df7fcd24f0c0d20c3 Mon Sep 17 00:00:00 2001 From: Gildas Bazin Date: Thu, 29 Jul 2004 08:50:52 +0000 Subject: [PATCH] * src/input/decoder.c: don't let the decoder/packetizer fifo grow too much because this leads to a steady increase in memory useage when the data isn't consumed quickly enough. (not the best fix, but should be better than nothing) --- include/vlc_block.h | 1 + src/input/decoder.c | 12 ++++++++++-- src/misc/block.c | 8 +++++--- 3 files changed, 16 insertions(+), 5 deletions(-) diff --git a/include/vlc_block.h b/include/vlc_block.h index 399fa50457..e3e74c057f 100644 --- a/include/vlc_block.h +++ b/include/vlc_block.h @@ -243,6 +243,7 @@ struct block_fifo_t int i_depth; block_t *p_first; block_t **pp_last; + int i_size; }; diff --git a/src/input/decoder.c b/src/input/decoder.c index 1001dc8cb2..3e40f4cc81 100644 --- a/src/input/decoder.c +++ b/src/input/decoder.c @@ -207,8 +207,6 @@ void input_DecoderDecode( decoder_t * p_dec, block_t *p_block ) { if( p_dec->p_owner->b_own_thread ) { - block_FifoPut( p_dec->p_owner->p_fifo, p_block ); - if( p_dec->p_owner->p_input->b_out_pace_control ) { /* FIXME !!!!! */ @@ -218,6 +216,16 @@ void input_DecoderDecode( decoder_t * p_dec, block_t *p_block ) msleep( 1000 ); } } + else if( p_dec->p_owner->p_fifo->i_size > 50000000 /* 50 MB */ ) + { + /* FIXME: ideally we would check the time amount of data + * in the fifo instead of its size. */ + msg_Warn( p_dec, "decoder/packetizer fifo full (data not " + "consummed quickly enough), resetting fifo!" ); + block_FifoEmpty( p_dec->p_owner->p_fifo ); + } + + block_FifoPut( p_dec->p_owner->p_fifo, p_block ); } else { diff --git a/src/misc/block.c b/src/misc/block.c index 0404793f78..0cf8345ddb 100644 --- a/src/misc/block.c +++ b/src/misc/block.c @@ -147,7 +147,7 @@ block_fifo_t *__block_FifoNew( vlc_object_t *p_obj ) p_fifo = malloc( sizeof( vlc_object_t ) ); vlc_mutex_init( p_obj, &p_fifo->lock ); vlc_cond_init( p_obj, &p_fifo->wait ); - p_fifo->i_depth = 0; + p_fifo->i_depth = p_fifo->i_size = 0; p_fifo->p_first = NULL; p_fifo->pp_last = &p_fifo->p_first; @@ -176,7 +176,7 @@ void block_FifoEmpty( block_fifo_t *p_fifo ) b = p_next; } - p_fifo->i_depth = 0; + p_fifo->i_depth = p_fifo->i_size = 0; p_fifo->p_first = NULL; p_fifo->pp_last = &p_fifo->p_first; vlc_mutex_unlock( &p_fifo->lock ); @@ -194,6 +194,7 @@ int block_FifoPut( block_fifo_t *p_fifo, block_t *p_block ) *p_fifo->pp_last = p_block; p_fifo->pp_last = &p_block->p_next; p_fifo->i_depth++; + p_fifo->i_size += p_block->i_buffer; p_block = p_block->p_next; @@ -224,6 +225,7 @@ block_t *block_FifoGet( block_fifo_t *p_fifo ) p_fifo->p_first = b->p_next; p_fifo->i_depth--; + p_fifo->i_size -= b->i_buffer; if( p_fifo->p_first == NULL ) { @@ -233,7 +235,7 @@ block_t *block_FifoGet( block_fifo_t *p_fifo ) vlc_mutex_unlock( &p_fifo->lock ); b->p_next = NULL; - return( b ); + return b; } block_t *block_FifoShow( block_fifo_t *p_fifo ) -- 2.39.2