Commit d8f85cc1 authored by Christophe Massiot's avatar Christophe Massiot

* modules/codec/ffmpeg: More locking around avcodec_open() and avcodec_close().

parent 5d1c2af0
...@@ -181,6 +181,9 @@ int E_(OpenEncoder)( vlc_object_t *p_this ) ...@@ -181,6 +181,9 @@ int E_(OpenEncoder)( vlc_object_t *p_this )
int i_codec_id, i_cat; int i_codec_id, i_cat;
char *psz_namecodec; char *psz_namecodec;
vlc_value_t val; vlc_value_t val;
vlc_value_t lockval;
var_Get( p_enc->p_libvlc, "avcodec", &lockval );
if( !E_(GetFfmpegCodec)( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id, if( !E_(GetFfmpegCodec)( p_enc->fmt_out.i_codec, &i_cat, &i_codec_id,
&psz_namecodec ) ) &psz_namecodec ) )
...@@ -523,8 +526,10 @@ int E_(OpenEncoder)( vlc_object_t *p_this ) ...@@ -523,8 +526,10 @@ int E_(OpenEncoder)( vlc_object_t *p_this )
p_context->extradata = NULL; p_context->extradata = NULL;
p_context->flags |= CODEC_FLAG_GLOBAL_HEADER; p_context->flags |= CODEC_FLAG_GLOBAL_HEADER;
vlc_mutex_lock( lockval.p_address );
if( avcodec_open( p_context, p_codec ) ) if( avcodec_open( p_context, p_codec ) )
{ {
vlc_mutex_unlock( lockval.p_address );
if( p_enc->fmt_in.i_cat == AUDIO_ES && if( p_enc->fmt_in.i_cat == AUDIO_ES &&
(p_context->channels > 2 || i_codec_id == CODEC_ID_MP2 (p_context->channels > 2 || i_codec_id == CODEC_ID_MP2
|| i_codec_id == CODEC_ID_MP3) ) || i_codec_id == CODEC_ID_MP3) )
...@@ -574,8 +579,10 @@ int E_(OpenEncoder)( vlc_object_t *p_this ) ...@@ -574,8 +579,10 @@ int E_(OpenEncoder)( vlc_object_t *p_this )
} }
p_context->codec = NULL; p_context->codec = NULL;
vlc_mutex_lock( lockval.p_address );
if( avcodec_open( p_context, p_codec ) ) if( avcodec_open( p_context, p_codec ) )
{ {
vlc_mutex_unlock( lockval.p_address );
msg_Err( p_enc, "cannot open encoder" ); msg_Err( p_enc, "cannot open encoder" );
free( p_sys ); free( p_sys );
return VLC_EGENERIC; return VLC_EGENERIC;
...@@ -588,6 +595,7 @@ int E_(OpenEncoder)( vlc_object_t *p_this ) ...@@ -588,6 +595,7 @@ int E_(OpenEncoder)( vlc_object_t *p_this )
return VLC_EGENERIC; return VLC_EGENERIC;
} }
} }
vlc_mutex_unlock( lockval.p_address );
p_enc->fmt_out.i_extra = p_context->extradata_size; p_enc->fmt_out.i_extra = p_context->extradata_size;
p_enc->fmt_out.p_extra = p_context->extradata; p_enc->fmt_out.p_extra = p_context->extradata;
...@@ -999,6 +1007,9 @@ void E_(CloseEncoder)( vlc_object_t *p_this ) ...@@ -999,6 +1007,9 @@ void E_(CloseEncoder)( vlc_object_t *p_this )
{ {
encoder_t *p_enc = (encoder_t *)p_this; encoder_t *p_enc = (encoder_t *)p_this;
encoder_sys_t *p_sys = p_enc->p_sys; encoder_sys_t *p_sys = p_enc->p_sys;
vlc_value_t lockval;
var_Get( p_enc->p_libvlc, "avcodec", &lockval );
#if LIBAVCODEC_BUILD >= 4702 #if LIBAVCODEC_BUILD >= 4702
if ( p_sys->b_inited && p_enc->i_threads >= 1 ) if ( p_sys->b_inited && p_enc->i_threads >= 1 )
...@@ -1020,7 +1031,9 @@ void E_(CloseEncoder)( vlc_object_t *p_this ) ...@@ -1020,7 +1031,9 @@ void E_(CloseEncoder)( vlc_object_t *p_this )
} }
#endif #endif
vlc_mutex_lock( lockval.p_address );
avcodec_close( p_sys->p_context ); avcodec_close( p_sys->p_context );
vlc_mutex_unlock( lockval.p_address );
av_free( p_sys->p_context ); av_free( p_sys->p_context );
if( p_sys->p_buffer ) free( p_sys->p_buffer ); if( p_sys->p_buffer ) free( p_sys->p_buffer );
......
...@@ -293,6 +293,9 @@ static void CloseDecoder( vlc_object_t *p_this ) ...@@ -293,6 +293,9 @@ static void CloseDecoder( vlc_object_t *p_this )
{ {
decoder_t *p_dec = (decoder_t *)p_this; decoder_t *p_dec = (decoder_t *)p_this;
decoder_sys_t *p_sys = p_dec->p_sys; decoder_sys_t *p_sys = p_dec->p_sys;
vlc_value_t lockval;
var_Get( p_dec->p_libvlc, "avcodec", &lockval );
switch( p_sys->i_cat ) switch( p_sys->i_cat )
{ {
...@@ -309,7 +312,9 @@ static void CloseDecoder( vlc_object_t *p_this ) ...@@ -309,7 +312,9 @@ static void CloseDecoder( vlc_object_t *p_this )
if( p_sys->p_context->extradata ) if( p_sys->p_context->extradata )
free( p_sys->p_context->extradata ); free( p_sys->p_context->extradata );
vlc_mutex_lock( lockval.p_address );
avcodec_close( p_sys->p_context ); avcodec_close( p_sys->p_context );
vlc_mutex_unlock( lockval.p_address );
msg_Dbg( p_dec, "ffmpeg codec (%s) stopped", p_sys->psz_namecodec ); msg_Dbg( p_dec, "ffmpeg codec (%s) stopped", p_sys->psz_namecodec );
av_free( p_sys->p_context ); av_free( p_sys->p_context );
} }
......
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