vlc | branch: master | Francois Cartegnie <[email protected]> | Mon Aug 26 16:10:56 2019 +0200| [6a63336a0b01a1b4c3ac9e8aff10473c5c9ee474] | committer: Francois Cartegnie
sout: transcode: add mutex on cross id ressource not thread safe on deletion > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=6a63336a0b01a1b4c3ac9e8aff10473c5c9ee474 --- modules/stream_out/transcode/transcode.c | 35 ++++++++++++++++++++++++-------- modules/stream_out/transcode/transcode.h | 6 ++++-- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/modules/stream_out/transcode/transcode.c b/modules/stream_out/transcode/transcode.c index 9dfb4a2c05..4b5fc230e5 100644 --- a/modules/stream_out/transcode/transcode.c +++ b/modules/stream_out/transcode/transcode.c @@ -463,6 +463,7 @@ static int Open( vlc_object_t *p_this ) /* Set default size for TEXT spu non overlay conversion / updater */ p_sys->senc_cfg.spu.i_width = (p_sys->venc_cfg.video.i_width) ? p_sys->venc_cfg.video.i_width : 1280; p_sys->senc_cfg.spu.i_height = (p_sys->venc_cfg.video.i_height) ? p_sys->venc_cfg.video.i_height : 720; + vlc_mutex_init( &p_sys->lock ); p_stream->pf_add = Add; p_stream->pf_del = Del; @@ -489,6 +490,8 @@ static void Close( vlc_object_t * p_this ) transcode_encoder_config_clean( &p_sys->senc_cfg ); + vlc_mutex_destroy( &p_sys->lock ); + free( p_sys ); } @@ -505,32 +508,38 @@ static void SendSpuToVideoCallback( void *cbdata, subpicture_t *p_subpicture ) { sout_stream_t *p_stream = cbdata; sout_stream_sys_t *p_sys = p_stream->p_sys; + vlc_mutex_lock( &p_sys->lock ); if( !p_sys->id_video ) subpicture_Delete( p_subpicture ); else transcode_video_push_spu( p_stream, p_sys->id_video, p_subpicture ); + vlc_mutex_unlock( &p_sys->lock ); } static int GetVideoDimensions( void *cbdata, unsigned *w, unsigned *h ) { sout_stream_t *p_stream = cbdata; sout_stream_sys_t *p_sys = p_stream->p_sys; - if( !p_sys->id_video ) - return VLC_EGENERIC; - return transcode_video_get_output_dimensions( p_stream, - p_sys->id_video, w, h ); + int i_ret = VLC_EGENERIC; + vlc_mutex_lock( &p_sys->lock ); + if( p_sys->id_video ) + i_ret = transcode_video_get_output_dimensions( p_stream, + p_sys->id_video, w, h ); + vlc_mutex_unlock( &p_sys->lock ); + return i_ret; } static vlc_tick_t GetMasterDrift( void *cbdata ) { sout_stream_t *p_stream = cbdata; sout_stream_sys_t *p_sys = p_stream->p_sys; + vlc_mutex_lock( &p_sys->lock ); + vlc_tick_t drift = 0; if( p_sys->id_master_sync ) - { - return p_sys->id_master_sync->i_drift; - } - return 0; + drift = p_sys->id_master_sync->i_drift; + vlc_mutex_unlock( &p_sys->lock ); + return drift; } static int ValidateDrift( void *cbdata, vlc_tick_t i_drift ) @@ -630,14 +639,18 @@ static void *Add( sout_stream_t *p_stream, const es_format_t *p_fmt ) if( p_fmt->i_cat == AUDIO_ES && id->p_enccfg->i_codec ) { success = !transcode_audio_init(p_stream, p_fmt, id); + vlc_mutex_lock( &p_sys->lock ); if( success && p_sys->b_master_sync && !p_sys->id_master_sync ) p_sys->id_master_sync = id; + vlc_mutex_unlock( &p_sys->lock ); } else if( p_fmt->i_cat == VIDEO_ES && id->p_enccfg->i_codec ) { success = !transcode_video_init(p_stream, p_fmt, id); + vlc_mutex_lock( &p_sys->lock ); if( success && !p_sys->id_video ) p_sys->id_video = id; + vlc_mutex_unlock( &p_sys->lock ); } else if( ( p_fmt->i_cat == SPU_ES ) && ( id->p_enccfg->i_codec || p_sys->b_soverlay ) ) @@ -676,15 +689,19 @@ static void Del( sout_stream_t *p_stream, void *_id ) case AUDIO_ES: Send( p_stream, id, NULL ); decoder_Destroy( id->p_decoder ); - transcode_audio_clean( p_stream, id ); + vlc_mutex_lock( &p_sys->lock ); if( id == p_sys->id_master_sync ) p_sys->id_master_sync = NULL; + vlc_mutex_unlock( &p_sys->lock ); + transcode_audio_clean( p_stream, id ); break; case VIDEO_ES: Send( p_stream, id, NULL ); decoder_Destroy( id->p_decoder ); + vlc_mutex_lock( &p_sys->lock ); if( id == p_sys->id_video ) p_sys->id_video = NULL; + vlc_mutex_unlock( &p_sys->lock ); transcode_video_clean( p_stream, id ); break; case SPU_ES: diff --git a/modules/stream_out/transcode/transcode.h b/modules/stream_out/transcode/transcode.h index adb2b635f8..0cce7eea97 100644 --- a/modules/stream_out/transcode/transcode.h +++ b/modules/stream_out/transcode/transcode.h @@ -42,8 +42,6 @@ typedef struct sout_stream_id_sys_t sout_stream_id_sys_t; typedef struct { - sout_stream_id_sys_t *id_video; - bool b_soverlay; /* Audio */ @@ -57,9 +55,13 @@ typedef struct /* SPU */ transcode_encoder_config_t senc_cfg; + /* Shared betweeen streams */ + vlc_mutex_t lock; /* Sync */ bool b_master_sync; sout_stream_id_sys_t *id_master_sync; + /* Spu's video */ + sout_stream_id_sys_t *id_video; } sout_stream_sys_t; _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
