[vlc-commits] transcode: use semaphore to limit how many pictures are in picture pool in threading case
Ilkka Ollakka
git at videolan.org
Sat Sep 24 18:15:33 CEST 2016
vlc | branch: master | Ilkka Ollakka <ileoo at videolan.org> | Sat Sep 24 19:04:41 2016 +0300| [8f851fb2d61771f0d26f9e21c4a639ba3484ad00] | committer: Ilkka Ollakka
transcode: use semaphore to limit how many pictures are in picture pool in threading case
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=8f851fb2d61771f0d26f9e21c4a639ba3484ad00
---
modules/stream_out/transcode/transcode.c | 8 +++++++-
modules/stream_out/transcode/transcode.h | 2 ++
modules/stream_out/transcode/video.c | 6 ++++++
3 files changed, 15 insertions(+), 1 deletion(-)
diff --git a/modules/stream_out/transcode/transcode.c b/modules/stream_out/transcode/transcode.c
index 912205e..25e5bd5 100644
--- a/modules/stream_out/transcode/transcode.c
+++ b/modules/stream_out/transcode/transcode.c
@@ -131,6 +131,9 @@
#define HP_LONGTEXT N_( \
"Runs the optional encoder thread at the OUTPUT priority instead of " \
"VIDEO." )
+#define POOL_TEXT N_("Picture pool size")
+#define POOL_LONGTEXT N_( "Defines how many pictures we allow to be in pool "\
+ "between decoder/encoder threads when threads > 0" )
static const char *const ppsz_deinterlace_type[] =
@@ -216,6 +219,8 @@ vlc_module_begin ()
set_section( N_("Miscellaneous"), NULL )
add_integer( SOUT_CFG_PREFIX "threads", 0, THREADS_TEXT,
THREADS_LONGTEXT, true )
+ add_integer( SOUT_CFG_PREFIX "pool-size", 10, POOL_TEXT, POOL_LONGTEXT, true )
+ change_integer_range( 1, 1000 )
add_bool( SOUT_CFG_PREFIX "high-priority", false, HP_TEXT, HP_LONGTEXT,
true )
@@ -226,7 +231,7 @@ static const char *const ppsz_sout_options[] = {
"scale", "fps", "width", "height", "vfilter", "deinterlace",
"deinterlace-module", "threads", "aenc", "acodec", "ab", "alang",
"afilter", "samplerate", "channels", "senc", "scodec", "soverlay",
- "sfilter", "osd", "high-priority", "maxwidth", "maxheight",
+ "sfilter", "osd", "high-priority", "maxwidth", "maxheight", "pool-size",
NULL
};
@@ -374,6 +379,7 @@ static int Open( vlc_object_t *p_this )
free( psz_string );
p_sys->i_threads = var_GetInteger( p_stream, SOUT_CFG_PREFIX "threads" );
+ p_sys->pool_size = var_GetInteger( p_stream, SOUT_CFG_PREFIX "pool-size" );
p_sys->b_high_priority = var_GetBool( p_stream, SOUT_CFG_PREFIX "high-priority" );
if( p_sys->i_vcodec )
diff --git a/modules/stream_out/transcode/transcode.h b/modules/stream_out/transcode/transcode.h
index ab1904c..eca3298 100644
--- a/modules/stream_out/transcode/transcode.h
+++ b/modules/stream_out/transcode/transcode.h
@@ -22,6 +22,8 @@ struct sout_stream_sys_t
vlc_cond_t cond;
bool b_abort;
picture_fifo_t *pp_pics;
+ vlc_sem_t picture_pool_has_room;
+ uint32_t pool_size;
vlc_thread_t thread;
/* Audio */
diff --git a/modules/stream_out/transcode/video.c b/modules/stream_out/transcode/video.c
index 50f98f0..349d56e 100644
--- a/modules/stream_out/transcode/video.c
+++ b/modules/stream_out/transcode/video.c
@@ -81,6 +81,7 @@ static void* EncoderThread( void *obj )
while( !p_sys->b_abort &&
(p_pic = picture_fifo_Pop( p_sys->pp_pics )) == NULL )
vlc_cond_wait( &p_sys->cond, &p_sys->lock_out );
+ vlc_sem_post( &p_sys->picture_pool_has_room );
if( p_pic )
{
@@ -100,6 +101,7 @@ static void* EncoderThread( void *obj )
/*Encode what we have in the buffer on closing*/
while( (p_pic = picture_fifo_Pop( p_sys->pp_pics )) != NULL )
{
+ vlc_sem_post( &p_sys->picture_pool_has_room );
p_block = id->p_encoder->pf_encode_video( id->p_encoder, p_pic );
picture_Release( p_pic );
block_ChainAppend( &p_sys->p_buffers, p_block );
@@ -227,6 +229,9 @@ int transcode_video_new( sout_stream_t *p_stream, sout_stream_id_sys_t *id )
free( id->p_decoder->p_owner );
return VLC_ENOMEM;
}
+ /* We allow at max 500 pictures in pool before we wait for room */
+ vlc_sem_init( &p_sys->picture_pool_has_room, p_sys->pool_size );
+
vlc_mutex_init( &p_sys->lock_out );
vlc_cond_init( &p_sys->cond );
p_sys->p_buffers = NULL;
@@ -705,6 +710,7 @@ static void OutputFrame( sout_stream_t *p_stream, picture_t *p_pic, sout_stream_
if( p_sys->i_threads )
{
+ vlc_sem_wait( &p_sys->picture_pool_has_room );
vlc_mutex_lock( &p_sys->lock_out );
picture_fifo_Push( p_sys->pp_pics, p_pic );
vlc_cond_signal( &p_sys->cond );
More information about the vlc-commits
mailing list