/* *** determine codec type *** */
if( !GetFfmpegCodec( p_dec->fmt_in.i_codec, &i_cat, &i_codec_id,
- &psz_namecodec ) )
+ &psz_namecodec )
+ || i_cat == UNKNOWN_ES )
{
return VLC_EGENERIC;
}
static void CloseDecoder( vlc_object_t *p_this )
{
decoder_t *p_dec = (decoder_t *)p_this;
- decoder_sys_t *p_sys = p_dec->p_sys;
- switch( p_dec->fmt_out.i_cat )
- {
- case VIDEO_ES:
- EndVideoDec ( p_dec );
- break;
- }
+ if( p_dec->fmt_out.i_cat == VIDEO_ES )
+ EndVideoDec( p_dec );
+ else
+ ffmpeg_CloseCodec( p_dec );
- if( !p_sys->b_delayed_open )
- {
- vlc_avcodec_lock();
- avcodec_close( p_sys->p_context );
- vlc_avcodec_unlock();
- msg_Dbg( p_dec, "ffmpeg codec (%s) stopped", p_sys->p_codec->name );
- }
+ decoder_sys_t *p_sys = p_dec->p_sys;
- av_freep( &p_sys->p_context->extradata );
avcodec_free_context( &p_sys->p_context );
free( p_sys );
}
p_sys->b_delayed_open = false;
return VLC_SUCCESS;
}
+
+void ffmpeg_CloseCodec( decoder_t *p_dec )
+{
+ decoder_sys_t *p_sys = p_dec->p_sys;
+
+ if( p_sys->b_delayed_open )
+ return;
+
+ vlc_avcodec_lock();
+ avcodec_close( p_sys->p_context );
+ vlc_avcodec_unlock();
+ msg_Dbg( p_dec, "ffmpeg codec (%s) stopped", p_sys->p_codec->name );
+}