Commit 0eb8d331 authored by Laurent Aimar's avatar Laurent Aimar

Cosmetics (K&R of picture_pool).

parent 237a788b
...@@ -69,14 +69,14 @@ VLC_EXPORT( picture_pool_t *, picture_pool_NewExtended, ( const picture_pool_con ...@@ -69,14 +69,14 @@ VLC_EXPORT( picture_pool_t *, picture_pool_NewExtended, ( const picture_pool_con
* *
* It is provided as convenience. * It is provided as convenience.
*/ */
VLC_EXPORT( picture_pool_t *, picture_pool_New, ( int i_picture, picture_t *pp_picture[] ) ); VLC_EXPORT( picture_pool_t *, picture_pool_New, ( int picture_count, picture_t *picture[] ) );
/** /**
* It creates a picture_pool_t creating images using the given format. * It creates a picture_pool_t creating images using the given format.
* *
* Provided for convenience. * Provided for convenience.
*/ */
VLC_EXPORT( picture_pool_t *, picture_pool_NewFromFormat, ( const video_format_t *, int i_picture ) ); VLC_EXPORT( picture_pool_t *, picture_pool_NewFromFormat, ( const video_format_t *, int picture_count ) );
/** /**
* It destroys a pool created by picture_pool_New. * It destroys a pool created by picture_pool_New.
...@@ -104,7 +104,7 @@ VLC_EXPORT( picture_t *, picture_pool_Get, ( picture_pool_t * ) ); ...@@ -104,7 +104,7 @@ VLC_EXPORT( picture_t *, picture_pool_Get, ( picture_pool_t * ) );
* XXX it should be used with great care, the only reason you may need * XXX it should be used with great care, the only reason you may need
* it is to workaround a bug. * it is to workaround a bug.
*/ */
VLC_EXPORT( void, picture_pool_NonEmpty, ( picture_pool_t *, bool b_reset ) ); VLC_EXPORT( void, picture_pool_NonEmpty, ( picture_pool_t *, bool reset ) );
#endif /* VLC_PICTURE_POOL_H */ #endif /* VLC_PICTURE_POOL_H */
...@@ -37,182 +37,177 @@ ...@@ -37,182 +37,177 @@
/***************************************************************************** /*****************************************************************************
* *
*****************************************************************************/ *****************************************************************************/
struct picture_release_sys_t struct picture_release_sys_t {
{
/* Saved release */ /* Saved release */
void (*pf_release)( picture_t * ); void (*release)(picture_t *);
picture_release_sys_t *p_release_sys; picture_release_sys_t *release_sys;
/* */ /* */
int (*pf_lock)( picture_t * ); int (*lock)(picture_t *);
void (*pf_unlock)( picture_t * ); void (*unlock)(picture_t *);
/* */ /* */
int64_t i_tick; int64_t tick;
}; };
struct picture_pool_t struct picture_pool_t {
{ /* */
int64_t i_tick; int64_t tick;
/* */
int i_picture; int picture_count;
picture_t **pp_picture; picture_t **picture;
}; };
static void PicturePoolPictureRelease( picture_t * ); static void PicturePoolPictureRelease(picture_t *);
picture_pool_t *picture_pool_NewExtended( const picture_pool_configuration_t *cfg ) picture_pool_t *picture_pool_NewExtended(const picture_pool_configuration_t *cfg)
{ {
picture_pool_t *p_pool = calloc( 1, sizeof(*p_pool) ); picture_pool_t *pool = calloc(1, sizeof(*pool));
if( !p_pool ) if (!pool)
return NULL; return NULL;
p_pool->i_tick = 1; pool->tick = 1;
p_pool->i_picture = cfg->picture_count; pool->picture_count = cfg->picture_count;
p_pool->pp_picture = calloc( p_pool->i_picture, sizeof(*p_pool->pp_picture) ); pool->picture = calloc(pool->picture_count, sizeof(*pool->picture));
if( !p_pool->pp_picture ) if (!pool->picture) {
{ free(pool);
free( p_pool );
return NULL; return NULL;
} }
for( int i = 0; i < cfg->picture_count; i++ ) for (int i = 0; i < cfg->picture_count; i++) {
{ picture_t *picture = cfg->picture[i];
picture_t *p_picture = cfg->picture[i];
/* The pool must be the only owner of the picture */ /* The pool must be the only owner of the picture */
assert( p_picture->i_refcount == 1 ); assert(picture->i_refcount == 1);
/* Install the new release callback */ /* Install the new release callback */
picture_release_sys_t *p_release_sys = malloc( sizeof(*p_release_sys) ); picture_release_sys_t *release_sys = malloc(sizeof(*release_sys));
if( !p_release_sys ) if (!release_sys)
abort(); abort();
p_release_sys->pf_release = p_picture->pf_release; release_sys->release = picture->pf_release;
p_release_sys->p_release_sys = p_picture->p_release_sys; release_sys->release_sys = picture->p_release_sys;
p_release_sys->pf_lock = cfg->lock; release_sys->lock = cfg->lock;
p_release_sys->pf_unlock = cfg->unlock; release_sys->unlock = cfg->unlock;
p_release_sys->i_tick = 0; release_sys->tick = 0;
p_picture->i_refcount = 0; /* */
p_picture->pf_release = PicturePoolPictureRelease; picture->i_refcount = 0;
p_picture->p_release_sys = p_release_sys; picture->pf_release = PicturePoolPictureRelease;
picture->p_release_sys = release_sys;
/* */ /* */
p_pool->pp_picture[i] = p_picture; pool->picture[i] = picture;
} }
return p_pool; return pool;
} }
picture_pool_t *picture_pool_New( int i_picture, picture_t *pp_picture[] ) picture_pool_t *picture_pool_New(int picture_count, picture_t *picture[])
{ {
picture_pool_configuration_t cfg; picture_pool_configuration_t cfg;
memset( &cfg, 0, sizeof(cfg) ); memset(&cfg, 0, sizeof(cfg));
cfg.picture_count = i_picture; cfg.picture_count = picture_count;
cfg.picture = pp_picture; cfg.picture = picture;
return picture_pool_NewExtended( &cfg ); return picture_pool_NewExtended(&cfg);
} }
picture_pool_t *picture_pool_NewFromFormat( const video_format_t *p_fmt, int i_picture ) picture_pool_t *picture_pool_NewFromFormat(const video_format_t *fmt, int picture_count)
{ {
picture_t *pp_picture[i_picture]; picture_t *picture[picture_count];
for( int i = 0; i < i_picture; i++ ) for (int i = 0; i < picture_count; i++) {
{ picture[i] = picture_NewFromFormat(fmt);
pp_picture[i] = picture_New( p_fmt->i_chroma, if (!picture[i])
p_fmt->i_width, p_fmt->i_height,
p_fmt->i_aspect );
if( !pp_picture[i] )
goto error; goto error;
} }
picture_pool_t *p_pool = picture_pool_New( i_picture, pp_picture ); picture_pool_t *pool = picture_pool_New(picture_count, picture);
if( !p_pool ) if (!pool)
goto error; goto error;
return p_pool; return pool;
error: error:
for( int i = 0; i < i_picture; i++ ) for (int i = 0; i < picture_count; i++) {
{ if (!picture[i])
if( !pp_picture[i] )
break; break;
picture_Release( pp_picture[i] ); picture_Release(picture[i]);
} }
return NULL; return NULL;
} }
void picture_pool_Delete( picture_pool_t *p_pool ) void picture_pool_Delete(picture_pool_t *pool)
{ {
for( int i = 0; i < p_pool->i_picture; i++ ) for (int i = 0; i < pool->picture_count; i++) {
{ picture_t *picture = pool->picture[i];
picture_t *p_picture = p_pool->pp_picture[i]; picture_release_sys_t *release_sys = picture->p_release_sys;
picture_release_sys_t *p_release_sys = p_picture->p_release_sys;
assert( p_picture->i_refcount == 0 ); assert(picture->i_refcount == 0);
/* Restore old release callback */ /* Restore old release callback */
p_picture->i_refcount = 1; picture->i_refcount = 1;
p_picture->pf_release = p_release_sys->pf_release; picture->pf_release = release_sys->release;
p_picture->p_release_sys = p_release_sys->p_release_sys; picture->p_release_sys = release_sys->release_sys;
picture_Release( p_picture ); picture_Release(picture);
free( p_release_sys ); free(release_sys);
} }
free( p_pool->pp_picture ); free(pool->picture);
free( p_pool ); free(pool);
} }
picture_t *picture_pool_Get( picture_pool_t *p_pool ) picture_t *picture_pool_Get(picture_pool_t *pool)
{ {
for( int i = 0; i < p_pool->i_picture; i++ ) for (int i = 0; i < pool->picture_count; i++) {
{ picture_t *picture = pool->picture[i];
picture_t *p_picture = p_pool->pp_picture[i]; if (picture->i_refcount > 0)
if( p_picture->i_refcount > 0 )
continue; continue;
picture_release_sys_t *p_release_sys = p_picture->p_release_sys; picture_release_sys_t *release_sys = picture->p_release_sys;
if( p_release_sys->pf_lock && p_release_sys->pf_lock(p_picture) ) if (release_sys->lock && release_sys->lock(picture))
continue; continue;
/* */ /* */
p_picture->p_release_sys->i_tick = p_pool->i_tick++; picture->p_release_sys->tick = pool->tick++;
picture_Hold( p_picture ); picture_Hold(picture);
return p_picture; return picture;
} }
return NULL; return NULL;
} }
void picture_pool_NonEmpty( picture_pool_t *p_pool, bool b_reset ) void picture_pool_NonEmpty(picture_pool_t *pool, bool reset)
{ {
picture_t *p_old = NULL; picture_t *old = NULL;
for( int i = 0; i < p_pool->i_picture; i++ ) for (int i = 0; i < pool->picture_count; i++) {
{ picture_t *picture = pool->picture[i];
picture_t *p_picture = p_pool->pp_picture[i];
if( b_reset ) if (reset) {
p_picture->i_refcount = 0; /* TODO pf_unlock */
else if( p_picture->i_refcount == 0 ) picture->i_refcount = 0;
} else if (picture->i_refcount == 0) {
return; return;
else if( !p_old || p_picture->p_release_sys->i_tick < p_old->p_release_sys->i_tick ) } else if (!old || picture->p_release_sys->tick < old->p_release_sys->tick) {
p_old = p_picture; old = picture;
}
}
if (!reset && old) {
/* TODO pf_unlock */
old->i_refcount = 0;
} }
if( !b_reset && p_old )
p_old->i_refcount = 0;
} }
static void PicturePoolPictureRelease( picture_t *p_picture ) static void PicturePoolPictureRelease(picture_t *picture)
{ {
assert( p_picture->i_refcount > 0 ); assert(picture->i_refcount > 0);
if( --p_picture->i_refcount > 0 ) if (--picture->i_refcount > 0)
return; return;
picture_release_sys_t *p_release_sys = p_picture->p_release_sys; picture_release_sys_t *release_sys = picture->p_release_sys;
if( p_release_sys->pf_unlock ) if (release_sys->unlock)
p_release_sys->pf_unlock( p_picture ); release_sys->unlock(picture);
} }
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment