VLC  2.1.0-git
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros Groups Pages
Data Structures | Macros | Typedefs | Functions
vlc_block.h File Reference

This file implements functions and structures to handle blocks of data in vlc. More...

Include dependency graph for vlc_block.h:

Go to the source code of this file.

Data Structures

struct  block_t

Macros

#define BLOCK_FLAG_DISCONTINUITY   0x0001
 The content doesn't follow the last block, or is probably broken.
#define BLOCK_FLAG_TYPE_I   0x0002
 Intra frame.
#define BLOCK_FLAG_TYPE_P   0x0004
 Inter frame with backward reference only.
#define BLOCK_FLAG_TYPE_B   0x0008
 Inter frame with backward and forward reference.
#define BLOCK_FLAG_TYPE_PB   0x0010
 For inter frame when you don't know the real type.
#define BLOCK_FLAG_HEADER   0x0020
 Warn that this block is a header one.
#define BLOCK_FLAG_END_OF_FRAME   0x0040
 This is the last block of the frame.
#define BLOCK_FLAG_NO_KEYFRAME   0x0080
 This is not a key frame for bitrate shaping.
#define BLOCK_FLAG_END_OF_SEQUENCE   0x0100
 This block contains the last part of a sequence.
#define BLOCK_FLAG_CLOCK   0x0200
 This block contains a clock reference.
#define BLOCK_FLAG_SCRAMBLED   0x0400
 This block is scrambled.
#define BLOCK_FLAG_PREROLL   0x0800
 This block has to be decoded but not be displayed.
#define BLOCK_FLAG_CORRUPTED   0x1000
 This block is corrupted and/or there is data loss.
#define BLOCK_FLAG_TOP_FIELD_FIRST   0x2000
 This block contains an interlaced picture with top field first.
#define BLOCK_FLAG_BOTTOM_FIELD_FIRST   0x4000
 This block contains an interlaced picture with bottom field first.
#define BLOCK_FLAG_INTERLACED_MASK   (BLOCK_FLAG_TOP_FIELD_FIRST|BLOCK_FLAG_BOTTOM_FIELD_FIRST)
 This block contains an interlaced picture.
#define BLOCK_FLAG_TYPE_MASK   (BLOCK_FLAG_TYPE_I|BLOCK_FLAG_TYPE_P|BLOCK_FLAG_TYPE_B|BLOCK_FLAG_TYPE_PB)
#define BLOCK_FLAG_CORE_PRIVATE_MASK   0x00ff0000
#define BLOCK_FLAG_CORE_PRIVATE_SHIFT   16
#define BLOCK_FLAG_PRIVATE_MASK   0xff000000
#define BLOCK_FLAG_PRIVATE_SHIFT   24
#define block_cleanup_push(block)   vlc_cleanup_push (block_Cleanup, block)

Typedefs

typedef void(* block_free_t )(block_t *)

Functions

void block_Init (block_t *, void *, size_t)
block_tblock_Alloc (size_t)
block_tblock_Realloc (block_t *, ssize_t i_pre, size_t i_body)
static void block_CopyProperties (block_t *dst, block_t *src)
static block_tblock_Duplicate (block_t *p_block)
static void block_Release (block_t *p_block)
block_tblock_heap_Alloc (void *, size_t)
 Creates a block from a heap allocation.
block_tblock_mmap_Alloc (void *addr, size_t length)
block_tblock_shm_Alloc (void *addr, size_t length)
block_tblock_File (int fd)
 Loads a file into a block of memory through a file descriptor.
block_tblock_FilePath (const char *)
 Loads a file into a block of memory from the file path.
static void block_Cleanup (void *block)
static void block_ChainAppend (block_t **pp_list, block_t *p_block)
static void block_ChainLastAppend (block_t ***ppp_last, block_t *p_block)
static void block_ChainRelease (block_t *p_block)
static size_t block_ChainExtract (block_t *p_list, void *p_data, size_t i_max)
static void block_ChainProperties (block_t *p_list, int *pi_count, size_t *pi_size, mtime_t *pi_length)
static block_tblock_ChainGather (block_t *p_list)
block_fifo_tblock_FifoNew (void)
void block_FifoRelease (block_fifo_t *)
void block_FifoPace (block_fifo_t *fifo, size_t max_depth, size_t max_size)
 Wait until the FIFO gets below a certain size (if needed).
void block_FifoEmpty (block_fifo_t *)
size_t block_FifoPut (block_fifo_t *, block_t *)
 Immediately queue one block at the end of a FIFO.
void block_FifoWake (block_fifo_t *)
block_tblock_FifoGet (block_fifo_t *)
 Dequeue the first block from the FIFO.
block_tblock_FifoShow (block_fifo_t *)
 Peeks the first block in the FIFO.
size_t block_FifoSize (const block_fifo_t *p_fifo)
size_t block_FifoCount (const block_fifo_t *p_fifo)

Detailed Description

This file implements functions and structures to handle blocks of data in vlc.

Macro Definition Documentation

#define block_cleanup_push (   block)    vlc_cleanup_push (block_Cleanup, block)

Referenced by block_File().

#define BLOCK_FLAG_BOTTOM_FIELD_FIRST   0x4000

This block contains an interlaced picture with bottom field first.

#define BLOCK_FLAG_CLOCK   0x0200

This block contains a clock reference.

#define BLOCK_FLAG_CORE_PRIVATE_MASK   0x00ff0000

Referenced by DecoderProcess().

#define BLOCK_FLAG_CORE_PRIVATE_SHIFT   16
#define BLOCK_FLAG_CORRUPTED   0x1000

This block is corrupted and/or there is data loss.

Referenced by DecoderBlockFlushNew(), and EsOutSend().

#define BLOCK_FLAG_DISCONTINUITY   0x0001

The content doesn't follow the last block, or is probably broken.

Referenced by aout_DecPlay(), DecoderBlockFlushNew(), DecoderUpdatePreroll(), and EsOutSend().

#define BLOCK_FLAG_END_OF_FRAME   0x0040

This is the last block of the frame.

#define BLOCK_FLAG_END_OF_SEQUENCE   0x0100

This block contains the last part of a sequence.

#define BLOCK_FLAG_HEADER   0x0020

Warn that this block is a header one.

#define BLOCK_FLAG_INTERLACED_MASK   (BLOCK_FLAG_TOP_FIELD_FIRST|BLOCK_FLAG_BOTTOM_FIELD_FIRST)

This block contains an interlaced picture.

#define BLOCK_FLAG_NO_KEYFRAME   0x0080

This is not a key frame for bitrate shaping.

#define BLOCK_FLAG_PREROLL   0x0800

This block has to be decoded but not be displayed.

Referenced by DecoderUpdatePreroll(), and EsOutSend().

#define BLOCK_FLAG_PRIVATE_MASK   0xff000000
#define BLOCK_FLAG_PRIVATE_SHIFT   24
#define BLOCK_FLAG_SCRAMBLED   0x0400

This block is scrambled.

#define BLOCK_FLAG_TOP_FIELD_FIRST   0x2000

This block contains an interlaced picture with top field first.

#define BLOCK_FLAG_TYPE_B   0x0008

Inter frame with backward and forward reference.

#define BLOCK_FLAG_TYPE_I   0x0002

Intra frame.

#define BLOCK_FLAG_TYPE_P   0x0004

Inter frame with backward reference only.

#define BLOCK_FLAG_TYPE_PB   0x0010

For inter frame when you don't know the real type.

Typedef Documentation

typedef void(* block_free_t)(block_t *)

Function Documentation

block_t* block_Alloc ( size_t  )
static void block_ChainAppend ( block_t **  pp_list,
block_t p_block 
)
inlinestatic

References block_t::p_next.

Referenced by block_BytestreamPush().

static size_t block_ChainExtract ( block_t p_list,
void *  p_data,
size_t  i_max 
)
static
static block_t* block_ChainGather ( block_t p_list)
inlinestatic
static void block_ChainLastAppend ( block_t ***  ppp_last,
block_t p_block 
)
inlinestatic

References block_t::p_next.

static void block_ChainProperties ( block_t p_list,
int *  pi_count,
size_t *  pi_size,
mtime_t pi_length 
)
inlinestatic
static void block_ChainRelease ( block_t p_block)
inlinestatic
static void block_Cleanup ( void *  block)
inlinestatic

References block_Release().

static void block_CopyProperties ( block_t dst,
block_t src 
)
inlinestatic

Referenced by block_Duplicate().

static block_t* block_Duplicate ( block_t p_block)
inlinestatic
size_t block_FifoCount ( const block_fifo_t p_fifo)
void block_FifoEmpty ( block_fifo_t )
block_t* block_FifoGet ( block_fifo_t p_fifo)
block_fifo_t* block_FifoNew ( void  )
void block_FifoPace ( block_fifo_t fifo,
size_t  max_depth,
size_t  max_size 
)

Wait until the FIFO gets below a certain size (if needed).

Note that if more than one thread writes to the FIFO, you cannot assume that the FIFO is actually below the requested size upon return (since another thread could have refilled it already). This is typically not an issue, as this function is meant for (relaxed) congestion control.

This function may be a cancellation point and it is cancel-safe.

Parameters
fifoqueue to wait on
max_depthwait until the queue has no more than this many blocks (use SIZE_MAX to ignore this constraint)
max_sizewait until the queue has no more than this many bytes (use SIZE_MAX to ignore this constraint)
Returns
nothing.

References block_fifo_t::i_depth, block_fifo_t::i_size, block_fifo_t::lock, mutex_cleanup_push, vlc_cleanup_pop, vlc_cond_wait(), vlc_mutex_lock(), vlc_mutex_unlock(), vlc_testcancel(), and block_fifo_t::wait_room.

Referenced by input_DecoderDecode().

size_t block_FifoPut ( block_fifo_t p_fifo,
block_t p_block 
)

Immediately queue one block at the end of a FIFO.

Parameters
fifoqueue
blockhead of a block list to queue (may be NULL)
Returns
total number of bytes appended to the queue

References block_t::i_buffer, block_fifo_t::i_depth, block_fifo_t::i_size, block_fifo_t::lock, block_t::p_next, block_fifo_t::pp_last, vlc_cond_signal(), vlc_mutex_lock(), vlc_mutex_unlock(), and block_fifo_t::wait.

Referenced by DStreamDelete(), input_DecoderDecode(), sout_MuxSendBuffer(), stream_DemuxSend(), and VoutDisplayEventKey().

void block_FifoRelease ( block_fifo_t )
block_t* block_FifoShow ( block_fifo_t p_fifo)

Peeks the first block in the FIFO.

If necessary, wait until there is one block. This function is (always) a cancellation point.

Warning
This function leaves the block in the FIFO. You need to protect against concurrent threads who could dequeue the block. Preferrably, there should be only one thread reading from the FIFO.
Returns
a valid block.

References block_fifo_t::lock, mutex_cleanup_push, block_fifo_t::p_first, vlc_cleanup_run, vlc_cond_wait(), vlc_mutex_lock(), vlc_testcancel(), and block_fifo_t::wait.

Referenced by sout_MuxGetStream().

size_t block_FifoSize ( const block_fifo_t p_fifo)
void block_FifoWake ( block_fifo_t )
block_t* block_File ( int  fd)

Loads a file into a block of memory through a file descriptor.

If possible a private file mapping is created. Otherwise, the file is read normally. This function is a cancellation point.

Note
On 32-bits platforms, this function will not work for very large files, due to memory space constraints.
Parameters
fdfile descriptor to load from
Returns
a new block with the file content at p_buffer, and file length at i_buffer (release it with block_Release()), or NULL upon error (see errno).

References block_Alloc(), block_cleanup_push, block_mmap_Alloc(), block_Release(), block_t::p_buffer, S_TYPEISSHM, and vlc_cleanup_pop.

Referenced by block_FilePath(), and test_block_File().

block_t* block_FilePath ( const char *  path)

Loads a file into a block of memory from the file path.

See also block_File().

References block_File(), and vlc_open().

block_t* block_heap_Alloc ( void *  addr,
size_t  length 
)

Creates a block from a heap allocation.

This is provided by LibVLC so that manually heap-allocated blocks can safely be deallocated even after the origin plugin has been unloaded from memory.

When block_Release() is called, VLC will free() the specified pointer.

Parameters
ptrbase address of the heap allocation (will be free()'d)
lengthbytes length of the heap allocation
Returns
NULL in case of error (ptr free()'d in that case), or a valid block_t pointer.

References block_heap_Release(), block_Init(), and block_t::pf_release.

void block_Init ( block_t ,
void *  ,
size_t   
)
block_t* block_mmap_Alloc ( void *  addr,
size_t  length 
)

Referenced by block_File().

block_t* block_Realloc ( block_t ,
ssize_t  i_pre,
size_t  i_body 
)
static void block_Release ( block_t p_block)
inlinestatic
block_t* block_shm_Alloc ( void *  addr,
size_t  length 
)