]> git.sesse.net Git - vlc/commitdiff
* src/input/decoder.c: don't let the decoder/packetizer fifo grow too much because...
authorGildas Bazin <gbazin@videolan.org>
Thu, 29 Jul 2004 08:50:52 +0000 (08:50 +0000)
committerGildas Bazin <gbazin@videolan.org>
Thu, 29 Jul 2004 08:50:52 +0000 (08:50 +0000)
include/vlc_block.h
src/input/decoder.c
src/misc/block.c

index 399fa504575141d6eb31dba8699cb2d15b5d7eca..e3e74c057fed5d75466deaeb74da83c6106735db 100644 (file)
@@ -243,6 +243,7 @@ struct block_fifo_t
     int                 i_depth;
     block_t             *p_first;
     block_t             **pp_last;
+    int                 i_size;
 };
 
 
index 1001dc8cb29145047a1b83e39991db934a0442cf..3e40f4cc81f972bd7ba19ae81742600ba1755ab3 100644 (file)
@@ -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
     {
index 0404793f78667a73346abdf7b35425ac4ab4e8c3..0cf8345ddba3151a39eaefb28a73f8c7fa72cf11 100644 (file)
@@ -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 )