/*****************************************************************************
* vlc_block.h: Data blocks management functions
*****************************************************************************
- * Copyright (C) 2003 VideoLAN
+ * Copyright (C) 2003 the VideoLAN team
* $Id$
*
* Authors: Laurent Aimar <fenrir@via.ecp.fr>
#define BLOCK_FLAG_HEADER 0x0020
/** This is the last block of the frame */
#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 a clock reference */
+#define BLOCK_FLAG_CLOCK 0x0200
+/** This block is scrambled */
+#define BLOCK_FLAG_SCRAMBLED 0x0400
+/** This block has to be decoded but not be displayed */
+#define BLOCK_FLAG_PREROLL 0x0800
+/** This block is corrupted and/or there is data loss */
+#define BLOCK_FLAG_CORRUPTED 0x1000
#define BLOCK_FLAG_PRIVATE_MASK 0xffff0000
#define BLOCK_FLAG_PRIVATE_SHIFT 16
struct block_t
{
block_t *p_next;
+ block_t *p_prev;
uint32_t i_flags;
int i_samples; /* Used for audio */
int i_rate;
+ uint16_t i_seqno; /* Used for RTP */
+
int i_buffer;
uint8_t *p_buffer;
{
block_t *p_dup = block_New( p_block->p_manager, p_block->i_buffer );
+ p_dup->i_dts = p_block->i_dts;
+ p_dup->i_pts = p_block->i_pts;
+ p_dup->i_flags = p_block->i_flags;
+ p_dup->i_length = p_block->i_length;
+ p_dup->i_rate = p_block->i_rate;
+ p_dup->i_samples = p_block->i_samples;
+
if( p_dup && p_block->i_buffer > 0 )
memcpy( p_dup->p_buffer, p_block->p_buffer, p_block->i_buffer );
static inline block_t *block_ChainGather( block_t *p_list )
{
int i_total = 0;
+ mtime_t i_length = 0;
block_t *b, *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;
+ }
g = block_New( p_list->p_manager, i_total );
block_ChainExtract( p_list, g->p_buffer, g->i_buffer );
g->i_flags = p_list->i_flags;
g->i_pts = p_list->i_pts;
g->i_dts = p_list->i_dts;
+ g->i_length = i_length;
/* free p_list */
block_ChainRelease( p_list );