]> git.sesse.net Git - vlc/blobdiff - include/vlc_block.h
Qt: sorry guys, record works very fine actually...
[vlc] / include / vlc_block.h
index fda20ce6434cf440ba271a54156dcd921b2a76d4..5ce9ab428c731e044d22528203b76e5469c18f94 100644 (file)
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
  *****************************************************************************/
 
-#if !defined( __LIBVLC__ )
-  #error You are not libvlc or one of its plugins. You cannot include this file
-#endif
+#ifndef VLC_BLOCK_H
+#define VLC_BLOCK_H 1
 
-#ifndef _VLC_BLOCK_H
-#define _VLC_BLOCK_H 1
+/**
+ * \file
+ * This file implements functions and structures to handle blocks of data in vlc
+ *
+ */
 
 /****************************************************************************
  * block:
@@ -66,6 +68,8 @@ typedef struct block_sys_t block_sys_t;
 #define BLOCK_FLAG_END_OF_FRAME  0x0040
 /** This is not a key frame for bitrate shaping */
 #define BLOCK_FLAG_NO_KEYFRAME   0x0080
+/** This block contains the last part of a sequence  */
+#define BLOCK_FLAG_END_OF_SEQUENCE 0x0100
 /** This block contains a clock reference */
 #define BLOCK_FLAG_CLOCK         0x0200
 /** This block is scrambled */
@@ -75,6 +79,9 @@ typedef struct block_sys_t block_sys_t;
 /** This block is corrupted and/or there is data loss  */
 #define BLOCK_FLAG_CORRUPTED     0x1000
 
+#define BLOCK_FLAG_TYPE_MASK \
+    (BLOCK_FLAG_TYPE_I|BLOCK_FLAG_TYPE_P|BLOCK_FLAG_TYPE_B|BLOCK_FLAG_TYPE_PB)
+
 #define BLOCK_FLAG_PRIVATE_MASK  0xffff0000
 #define BLOCK_FLAG_PRIVATE_SHIFT 16
 
@@ -104,9 +111,9 @@ struct block_t
 /****************************************************************************
  * Blocks functions:
  ****************************************************************************
- * - block_New : create a new block with the requested size ( >= 0 ), return
+ * - block_Alloc : create a new block with the requested size ( >= 0 ), return
  *      NULL for failure.
- * - block_Release : release a block allocated with block_New.
+ * - block_Release : release a block allocated with block_Alloc.
  * - block_Realloc : realloc a block,
  *      i_pre: how many bytes to insert before body if > 0, else how many
  *      bytes of body to skip (the latter can be done without using
@@ -118,18 +125,15 @@ struct block_t
  * - block_Duplicate : create a copy of a block.
  ****************************************************************************/
 VLC_EXPORT( void,      block_Init,    ( block_t *, void *, size_t ) );
-VLC_EXPORT( block_t *, block_Alloc,   ( size_t ) );
-VLC_EXPORT( block_t *, block_Realloc, ( block_t *, ssize_t i_pre, size_t i_body ) );
+VLC_EXPORT( block_t *, block_Alloc,   ( size_t ) LIBVLC_USED );
+VLC_EXPORT( block_t *, block_Realloc, ( block_t *, ssize_t i_pre, size_t i_body ) LIBVLC_USED );
 
-static inline block_t *block_New( void *dummy, size_t size )
-{
-    (void)dummy;
-    return block_Alloc (size);
-}
+#define block_New( dummy, size ) block_Alloc(size)
 
+LIBVLC_USED
 static inline block_t *block_Duplicate( block_t *p_block )
 {
-    block_t *p_dup = block_New( NULL, p_block->i_buffer );
+    block_t *p_dup = block_Alloc( p_block->i_buffer );
     if( p_dup == NULL )
         return NULL;
 
@@ -143,34 +147,32 @@ static inline block_t *block_Duplicate( block_t *p_block )
 
     return p_dup;
 }
+
 static inline void block_Release( block_t *p_block )
 {
     p_block->pf_release( p_block );
 }
 
-/**
- * Creates a block from a virtual address memory mapping (mmap).
- * This is provided by LibVLC so that mmap blocks can safely be deallocated
- * even after the allocating plugin has been unloaded from memory.
- *
- * @param addr base address of the mapping (as returned by mmap)
- * @param length length (bytes) of the mapping (as passed to mmap)
- * @return NULL if addr is MAP_FAILED, or an error occurred (in the later
- * case, munmap(addr, length) is invoked before returning).
- */
-VLC_EXPORT( block_t *, block_mmap_Alloc, (void *addr, size_t length) );
+VLC_EXPORT( block_t *, block_mmap_Alloc, (void *addr, size_t length) LIBVLC_USED );
+VLC_EXPORT( block_t *, block_File, (int fd) LIBVLC_USED );
+
+static inline void block_Cleanup (void *block)
+{
+    block_Release ((block_t *)block);
+}
+#define block_cleanup_push( block ) vlc_cleanup_push (block_Cleanup, block)
 
 /****************************************************************************
  * Chains of blocks functions helper
  ****************************************************************************
- * - block_ChainAppend : append a block the the last block of a chain. Try to
+ * - block_ChainAppend : append a block to the last block of a chain. Try to
  *      avoid using with a lot of data as it's really slow, prefer
  *      block_ChainLastAppend
  * - block_ChainLastAppend : use a pointer over a pointer to the next blocks,
  *      and update it.
  * - block_ChainRelease : release a chain of block
  * - block_ChainExtract : extract data from a chain, return real bytes counts
- * - block_ChainGather : gather a chain, free it and return a block.
+ * - block_ChainGather : gather a chain, free it and return one block.
  ****************************************************************************/
 static inline void block_ChainAppend( block_t **pp_list, block_t *p_block )
 {
@@ -187,7 +189,7 @@ static inline void block_ChainAppend( block_t **pp_list, block_t *p_block )
     }
 }
 
-static inline void block_ChainLastAppend( block_t ***ppp_last, block_t *p_block  )
+static inline void block_ChainLastAppend( block_t ***ppp_last, block_t *p_block )
 {
     block_t *p_last = p_block;
 
@@ -225,22 +227,41 @@ static size_t block_ChainExtract( block_t *p_list, void *p_data, size_t i_max )
     return i_total;
 }
 
+static inline void block_ChainProperties( block_t *p_list, int *pi_count, size_t *pi_size, mtime_t *pi_length )
+{
+    size_t i_size = 0;
+    mtime_t i_length = 0;
+    int i_count;
+
+    while( p_list )
+    {
+        i_size += p_list->i_buffer;
+        i_length += p_list->i_length;
+        i_count++;
+
+        p_list = p_list->p_next;
+    }
+
+    if( pi_size )
+        *pi_size = i_size;
+    if( pi_length )
+        *pi_length = i_length;
+    if( pi_count )
+        *pi_count = i_count;
+}
+
 static inline block_t *block_ChainGather( block_t *p_list )
 {
     size_t  i_total = 0;
     mtime_t i_length = 0;
-    block_t *b, *g;
+    block_t *g;
 
     if( p_list->p_next == NULL )
         return p_list;  /* Already gathered */
 
-    for( b = p_list; b != NULL; b = b->p_next )
-    {
-        i_total += b->i_buffer;
-        i_length += b->i_length;
-    }
+    block_ChainProperties( p_list, NULL, &i_total, &i_length );
 
-    g = block_New( NULL, i_total );
+    g = block_Alloc( i_total );
     block_ChainExtract( p_list, g->p_buffer, g->i_buffer );
 
     g->i_flags = p_list->i_flags;
@@ -253,7 +274,6 @@ static inline block_t *block_ChainGather( block_t *p_list )
     return g;
 }
 
-
 /****************************************************************************
  * Fifos of blocks.
  ****************************************************************************
@@ -269,17 +289,18 @@ static inline block_t *block_ChainGather( block_t *p_list )
  * - block_FifoSize : how many cumulated bytes are waiting in the fifo
  * - block_FifoWake : wake ups a thread with block_FifoGet() = NULL
  *   (this is used to wakeup a thread when there is no data to queue)
+ *
+ * block_FifoGet and block_FifoShow are cancellation points.
  ****************************************************************************/
 
-#define block_FifoNew( a ) __block_FifoNew( VLC_OBJECT(a) )
-VLC_EXPORT( block_fifo_t *, __block_FifoNew,    ( vlc_object_t * ) );
+VLC_EXPORT( block_fifo_t *, block_FifoNew,      ( void ) LIBVLC_USED );
 VLC_EXPORT( void,           block_FifoRelease,  ( block_fifo_t * ) );
 VLC_EXPORT( void,           block_FifoEmpty,    ( block_fifo_t * ) );
 VLC_EXPORT( size_t,         block_FifoPut,      ( block_fifo_t *, block_t * ) );
 VLC_EXPORT( void,           block_FifoWake,     ( block_fifo_t * ) );
-VLC_EXPORT( block_t *,      block_FifoGet,      ( block_fifo_t * ) );
+VLC_EXPORT( block_t *,      block_FifoGet,      ( block_fifo_t * ) LIBVLC_USED );
 VLC_EXPORT( block_t *,      block_FifoShow,     ( block_fifo_t * ) );
-VLC_EXPORT( size_t,         block_FifoSize,     ( const block_fifo_t *p_fifo ) );
-VLC_EXPORT( size_t,         block_FifoCount,    ( const block_fifo_t *p_fifo ) );
+VLC_EXPORT( size_t,         block_FifoSize,     ( const block_fifo_t *p_fifo ) LIBVLC_USED );
+VLC_EXPORT( size_t,         block_FifoCount,    ( const block_fifo_t *p_fifo ) LIBVLC_USED );
 
 #endif /* VLC_BLOCK_H */