]> git.sesse.net Git - vlc/blobdiff - src/misc/block.c
Write accessor for relevant block_fifo_t state
[vlc] / src / misc / block.c
index 0404793f78667a73346abdf7b35425ac4ab4e8c3..9bc03c6178f54c09760be685e38c9ac7e7a0e601 100644 (file)
@@ -1,7 +1,7 @@
 /*****************************************************************************
  * block.c: Data blocks management functions
  *****************************************************************************
- * Copyright (C) 2003-2004 VideoLAN
+ * Copyright (C) 2003-2004 the VideoLAN team
  * $Id$
  *
  * Authors: Laurent Aimar <fenrir@videolan.org>
  *
  * You should have received a copy of the GNU General Public License
  * along with this program; if not, write to the Free Software
- * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111, USA.
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
 /*****************************************************************************
  * Preamble
  *****************************************************************************/
-#include <stdlib.h>
-
 #include <vlc/vlc.h>
 #include "vlc_block.h"
 
@@ -47,11 +45,12 @@ block_t *__block_New( vlc_object_t *p_obj, int i_size )
     /* We do only one malloc
      * TODO bench if doing 2 malloc but keeping a pool of buffer is better
      * 16 -> align on 16
-     * 2*BLOCK_PADDING_SIZE -> pre + post padding
+     * 2 * BLOCK_PADDING_SIZE -> pre + post padding
      */
-    const int    i_alloc = i_size + 2*BLOCK_PADDING_SIZE + 16;
-    block_t     *p_block = malloc( sizeof( block_t ) + sizeof( block_sys_t ) + i_alloc );
     block_sys_t *p_sys;
+    const int i_alloc = i_size + 2 * BLOCK_PADDING_SIZE + 16;
+    block_t *p_block =
+        malloc( sizeof( block_t ) + sizeof( block_sys_t ) + i_alloc );
 
     if( p_block == NULL )
         return NULL;
@@ -59,19 +58,25 @@ block_t *__block_New( vlc_object_t *p_obj, int i_size )
     /* Fill opaque data */
     p_sys = (block_sys_t*)( (uint8_t*)p_block + sizeof( block_t ) );
     p_sys->i_allocated_buffer = i_alloc;
-    p_sys->p_allocated_buffer = (uint8_t*)p_block + sizeof( block_t ) + sizeof( block_sys_t );
+    p_sys->p_allocated_buffer = (uint8_t*)p_block + sizeof( block_t ) +
+        sizeof( block_sys_t );
 
     /* Fill all fields */
     p_block->p_next         = NULL;
+    p_block->p_prev         = NULL;
     p_block->i_flags        = 0;
     p_block->i_pts          = 0;
     p_block->i_dts          = 0;
     p_block->i_length       = 0;
     p_block->i_rate         = 0;
     p_block->i_buffer       = i_size;
-    p_block->p_buffer       = &p_sys->p_allocated_buffer[32+15-((long)p_sys->p_allocated_buffer % 16 )];
+    p_block->p_buffer       =
+        &p_sys->p_allocated_buffer[BLOCK_PADDING_SIZE +
+            16 - ((uintptr_t)p_sys->p_allocated_buffer % 16 )];
     p_block->pf_release     = BlockRelease;
-    p_block->p_manager      = VLC_OBJECT( p_obj->p_vlc );   /* Is ok, as no comunication between p_vlc */
+
+    /* Is ok, as no comunication between p_vlc */
+    p_block->p_manager      = VLC_OBJECT( p_obj->p_libvlc );
     p_block->p_sys          = p_sys;
 
     return p_block;
@@ -87,17 +92,23 @@ block_t *block_Realloc( block_t *p_block, int i_prebody, int i_body )
          * TODO if used one day, them implement it in a smarter way */
         block_t *p_dup = block_Duplicate( p_block );
         block_Release( p_block );
+        if( !p_dup )
+            return NULL;
 
         p_block = p_dup;
     }
 
     i_buffer_size = i_prebody + i_body;
 
-    if( i_body < 0 || i_buffer_size <= 0 ) return NULL;
+    if( i_body < 0 || i_buffer_size <= 0 )
+    {
+        block_Release( p_block );
+        return NULL;
+    }
 
-    if( i_prebody < ( p_block->p_buffer - p_block->p_sys->p_allocated_buffer +
-                      p_block->p_sys->i_allocated_buffer ) ||
-        p_block->p_buffer - i_prebody > p_block->p_sys->p_allocated_buffer )
+    if( p_block->p_buffer - i_prebody > p_block->p_sys->p_allocated_buffer &&
+        p_block->p_buffer - i_prebody < p_block->p_sys->p_allocated_buffer +
+        p_block->p_sys->i_allocated_buffer )
     {
         p_block->p_buffer -= i_prebody;
         p_block->i_buffer += i_prebody;
@@ -114,14 +125,18 @@ block_t *block_Realloc( block_t *p_block, int i_prebody, int i_body )
     {
         block_t *p_rea = block_New( p_block->p_manager, i_buffer_size );
 
-        p_rea->i_dts   = p_block->i_dts;
-        p_rea->i_pts   = p_block->i_pts;
-        p_rea->i_flags = p_block->i_flags;
-        p_rea->i_length= p_block->i_length;
-        p_rea->i_rate  = p_block->i_rate;
+        if( p_rea )
+        {
+            p_rea->i_dts     = p_block->i_dts;
+            p_rea->i_pts     = p_block->i_pts;
+            p_rea->i_flags   = p_block->i_flags;
+            p_rea->i_length  = p_block->i_length;
+            p_rea->i_rate    = p_block->i_rate;
+            p_rea->i_samples = p_block->i_samples;
 
-        memcpy( p_rea->p_buffer + i_prebody, p_block->p_buffer,
-                __MIN( p_block->i_buffer, p_rea->i_buffer - i_prebody ) );
+            memcpy( p_rea->p_buffer + i_prebody, p_block->p_buffer,
+                    __MIN( p_block->i_buffer, p_rea->i_buffer - i_prebody ) );
+        }
 
         block_Release( p_block );
 
@@ -140,14 +155,27 @@ static void BlockRelease( block_t *p_block )
 /*****************************************************************************
  * block_fifo_t management
  *****************************************************************************/
+#if 0
+struct block_fifo_t
+{
+    vlc_mutex_t         lock;                         /* fifo data lock */
+    vlc_cond_t          wait;         /* fifo data conditional variable */
+
+    int                 i_depth;
+    block_t             *p_first;
+    block_t             **pp_last;
+    int                 i_size;
+};
+#endif
+
 block_fifo_t *__block_FifoNew( vlc_object_t *p_obj )
 {
     block_fifo_t *p_fifo;
 
-    p_fifo = malloc( sizeof( vlc_object_t ) );
+    p_fifo = malloc( sizeof( block_fifo_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 +204,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 +222,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 +253,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 +263,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 )
@@ -252,6 +282,14 @@ block_t *block_FifoShow( block_fifo_t *p_fifo )
     vlc_mutex_unlock( &p_fifo->lock );
 
     return( b );
+}
 
+size_t block_FifoSize( const block_fifo_t *p_fifo )
+{
+    return p_fifo->i_size;
 }
 
+size_t block_FifoCount( const block_fifo_t *p_fifo )
+{
+    return p_fifo->i_depth;
+}