VLC  4.0.0-dev
Data Structures | Macros | Functions
picture_pool.c File Reference
Include dependency graph for picture_pool.c:

Data Structures

struct  picture_pool_t
 

Macros

#define POOL_MAX   (CHAR_BIT * sizeof (unsigned long long))
 

Functions

static void picture_pool_Destroy (picture_pool_t *pool)
 
void picture_pool_Release (picture_pool_t *pool)
 Releases a pool created by picture_pool_New() or picture_pool_NewFromFormat(). More...
 
static void picture_pool_ReleasePicture (picture_t *clone)
 
static picture_tpicture_pool_ClonePicture (picture_pool_t *pool, unsigned offset)
 
picture_pool_tpicture_pool_New (unsigned count, picture_t *const *tab)
 Creates a pool of preallocated pictures. More...
 
picture_pool_tpicture_pool_NewFromFormat (const video_format_t *fmt, unsigned count)
 Allocates pictures from the heap and creates a picture pool with them. More...
 
picture_pool_tpicture_pool_Reserve (picture_pool_t *master, unsigned count)
 Reserves pictures from a pool and creates a new pool with those. More...
 
picture_tpicture_pool_Get (picture_pool_t *pool)
 Obtains a picture from a pool if any is immediately available. More...
 
picture_tpicture_pool_Wait (picture_pool_t *pool)
 Obtains a picture from a pool. More...
 
void picture_pool_Cancel (picture_pool_t *pool, bool canceled)
 Cancel the picture pool. More...
 
unsigned picture_pool_GetSize (const picture_pool_t *pool)
 

Macro Definition Documentation

◆ POOL_MAX

#define POOL_MAX   (CHAR_BIT * sizeof (unsigned long long))

Function Documentation

◆ picture_pool_Cancel()

void picture_pool_Cancel ( picture_pool_t ,
bool  canceled 
)

Cancel the picture pool.

It won't return any pictures via picture_pool_Get or picture_pool_Wait if canceled is true. This function will also unblock picture_pool_Wait. picture_pool_Reset will also reset the cancel state to false.

References picture_pool_t::canceled, picture_pool_t::lock, picture_pool_t::refs, vlc_cond_broadcast(), vlc_mutex_lock(), vlc_mutex_unlock(), and picture_pool_t::wait.

Referenced by DecoderThread_AbortPictures(), DeleteDecoder(), and vlc_input_decoder_Delete().

◆ picture_pool_ClonePicture()

static picture_t* picture_pool_ClonePicture ( picture_pool_t pool,
unsigned  offset 
)
static

◆ picture_pool_Destroy()

static void picture_pool_Destroy ( picture_pool_t pool)
static

◆ picture_pool_Get()

picture_t* picture_pool_Get ( picture_pool_t )

Obtains a picture from a pool if any is immediately available.

The picture must be released with picture_Release().

Returns
a picture, or NULL if all pictures in the pool are allocated
Note
This function is thread-safe.

References picture_pool_t::available, picture_pool_t::canceled, ctz, picture_pool_t::lock, picture_t::p_next, picture_pool_ClonePicture(), picture_pool_t::refs, unlikely, vlc_mutex_lock(), and vlc_mutex_unlock().

Referenced by picture_pool_Reserve(), ThreadDisplayRenderPicture(), VideoBufferNew(), and VoutVideoFilterInteractiveNewPicture().

◆ picture_pool_GetSize()

unsigned picture_pool_GetSize ( const picture_pool_t )
Returns
the total number of pictures in the given pool
Note
This function is thread-safe.

References picture_pool_t::picture_count.

Referenced by vout_OpenWrapper().

◆ picture_pool_New()

picture_pool_t* picture_pool_New ( unsigned  count,
picture_t *const *  tab 
)

Creates a pool of preallocated pictures.

Free pictures can be allocated from the pool, and are returned to the pool when they are no longer referenced.

This avoids allocating and deallocationg pictures repeatedly, and ensures that memory consumption remains within limits.

To obtain a picture from the pool, use picture_pool_Get(). To increase and decrease the reference count, use picture_Hold() and picture_Release() respectively.

Parameters
countnumber of pictures in the array
tabarray of pictures
Returns
a pointer to the new pool on success, or NULL on error (pictures are not released on error)

References aligned_alloc(), picture_pool_t::available, picture_pool_t::canceled, count, picture_pool_t::lock, picture_pool_t::picture, picture_pool_t::picture_count, POOL_MAX, picture_pool_t::refs, unlikely, vlc_cond_init(), vlc_mutex_init(), and picture_pool_t::wait.

Referenced by picture_pool_NewFromFormat(), and picture_pool_Reserve().

◆ picture_pool_NewFromFormat()

picture_pool_t* picture_pool_NewFromFormat ( const video_format_t fmt,
unsigned  count 
)

Allocates pictures from the heap and creates a picture pool with them.

This is a convenience wrapper for picture_NewFromFormat() and picture_pool_New().

Parameters
fmtvideo format of pictures to allocate from the heap
countnumber of pictures to allocate
Returns
a pointer to the new pool on success, NULL on error

References count, picture_pool_t::picture, picture_NewFromFormat(), picture_pool_New(), and picture_Release().

Referenced by ModuleThread_UpdateVideoFormat(), vout_GetPool(), and vout_OpenWrapper().

◆ picture_pool_Release()

void picture_pool_Release ( picture_pool_t )

Releases a pool created by picture_pool_New() or picture_pool_NewFromFormat().

Note
If there are no pending references to the pooled pictures, and the picture_resource_t.pf_destroy callback was not NULL, it will be invoked. Otherwise the default callback will be used.
Warning
If there are pending references (a.k.a. late pictures), the pictures will remain valid until the all pending references are dropped by picture_Release().

References picture_pool_t::picture, picture_pool_t::picture_count, picture_pool_Destroy(), and picture_Release().

Referenced by CreateVoutIfNeeded(), DeleteDecoder(), vout_CloseWrapper(), vout_display_Delete(), vout_display_Reset(), and vout_OpenWrapper().

◆ picture_pool_ReleasePicture()

static void picture_pool_ReleasePicture ( picture_t clone)
static

◆ picture_pool_Reserve()

picture_pool_t* picture_pool_Reserve ( picture_pool_t ,
unsigned  count 
)

Reserves pictures from a pool and creates a new pool with those.

When the new pool is released, pictures are returned to the master pool. If the master pool was already released, pictures will be destroyed.

Parameters
countnumber of picture to reserve
Returns
the new pool, or NULL if there were not enough pictures available or on error
Note
This function is thread-safe (but it might return NULL if other threads have already allocated too many pictures).

References count, picture_pool_t::picture, picture_pool_Get(), picture_pool_New(), and picture_Release().

Referenced by vout_OpenWrapper().

◆ picture_pool_Wait()

picture_t* picture_pool_Wait ( picture_pool_t )

Obtains a picture from a pool.

The picture must be released with picture_Release().

Returns
a picture or NULL on memory error
Note
This function is thread-safe.

References picture_pool_t::available, picture_pool_t::canceled, ctz, picture_pool_t::lock, picture_t::p_next, picture_pool_ClonePicture(), picture_pool_t::refs, vlc_cond_wait(), vlc_mutex_lock(), vlc_mutex_unlock(), and picture_pool_t::wait.

Referenced by ModuleThread_NewVideoBuffer(), and vout_GetPicture().