[vlc-commits] avcodec: use avcodec_free_context() where applicable
Rémi Denis-Courmont
git at videolan.org
Sat Sep 13 11:48:52 CEST 2014
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Sep 13 12:48:17 2014 +0300| [fbd4154ef2900670d30d49ed5f7a8e3582b2b838] | committer: Rémi Denis-Courmont
avcodec: use avcodec_free_context() where applicable
Fix leak on error, fix mismatched free function on success.
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=fbd4154ef2900670d30d49ed5f7a8e3582b2b838
---
modules/codec/avcodec/avcodec.c | 75 ++++++++++++++++---------------
modules/codec/avcodec/avcommon_compat.h | 7 +++
2 files changed, 46 insertions(+), 36 deletions(-)
diff --git a/modules/codec/avcodec/avcodec.c b/modules/codec/avcodec/avcodec.c
index 52ae465..5190aae 100644
--- a/modules/codec/avcodec/avcodec.c
+++ b/modules/codec/avcodec/avcodec.c
@@ -248,10 +248,9 @@ static int OpenDecoder( vlc_object_t *p_this )
{
decoder_t *p_dec = (decoder_t*) p_this;
unsigned i_codec_id;
- int i_cat, i_result;
+ int i_cat;
const char *psz_namecodec;
- AVCodecContext *p_context = NULL;
const AVCodec *p_codec = NULL;
/* *** determine codec type *** */
@@ -288,37 +287,44 @@ static int OpenDecoder( vlc_object_t *p_this )
}
/* *** get a p_context *** */
- p_context = avcodec_alloc_context3(p_codec);
- if( !p_context )
+ AVCodecContext *avctx = avcodec_alloc_context3(p_codec);
+ if( unlikely(avctx == NULL) )
return VLC_ENOMEM;
- p_context->debug = var_InheritInteger( p_dec, "avcodec-debug" );
- p_context->opaque = (void *)p_this;
- p_dec->b_need_packetized = true;
+ avctx->debug = var_InheritInteger( p_dec, "avcodec-debug" );
+ avctx->opaque = p_dec;
+
+ int ret;
+
switch( i_cat )
{
- case VIDEO_ES:
- i_result = InitVideoDec( p_dec, p_context, p_codec );
- break;
- case AUDIO_ES:
- i_result = InitAudioDec( p_dec, p_context, p_codec );
- break;
- case SPU_ES:
- i_result = InitSubtitleDec( p_dec, p_context, p_codec );
- break;
- default:
- return VLC_EGENERIC;
+ case VIDEO_ES:
+ ret = InitVideoDec( p_dec, avctx, p_codec );
+ break;
+ case AUDIO_ES:
+ ret = InitAudioDec( p_dec, avctx, p_codec );
+ break;
+ case SPU_ES:
+ ret = InitSubtitleDec( p_dec, avctx, p_codec );
+ break;
+ default:
+ ret = VLC_EGENERIC;
}
- if( i_result == VLC_SUCCESS )
+ if( ret != VLC_SUCCESS )
{
- if( p_context->profile != FF_PROFILE_UNKNOWN)
- p_dec->fmt_in.i_profile = p_context->profile;
- if( p_context->level != FF_LEVEL_UNKNOWN)
- p_dec->fmt_in.i_level = p_context->level;
+ avcodec_free_context( &avctx );
+ return ret;
}
- return i_result;
+ if( avctx->profile != FF_PROFILE_UNKNOWN)
+ p_dec->fmt_in.i_profile = avctx->profile;
+ if( avctx->level != FF_LEVEL_UNKNOWN)
+ p_dec->fmt_in.i_level = avctx->level;
+
+ p_dec->b_need_packetized = true;
+
+ return VLC_SUCCESS;
}
/*****************************************************************************
@@ -336,21 +342,18 @@ static void CloseDecoder( vlc_object_t *p_this )
break;
}
- if( p_sys->p_context )
- {
- av_free( p_sys->p_context->extradata );
- p_sys->p_context->extradata = NULL;
+ av_free( p_sys->p_context->extradata );
+ p_sys->p_context->extradata = NULL;
- 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 );
- av_free( p_sys->p_context );
+ 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 );
+ avcodec_free_context( &p_sys->p_context );
free( p_sys );
}
diff --git a/modules/codec/avcodec/avcommon_compat.h b/modules/codec/avcodec/avcommon_compat.h
index 6b728da..d6293d7 100644
--- a/modules/codec/avcodec/avcommon_compat.h
+++ b/modules/codec/avcodec/avcommon_compat.h
@@ -36,6 +36,13 @@
( (LIBAVCODEC_VERSION_MICRO < 100 && LIBAVCODEC_VERSION_INT >= AV_VERSION_INT( a, b, c ) ) || \
(LIBAVCODEC_VERSION_MICRO >= 100 && LIBAVCODEC_VERSION_INT >= AV_VERSION_INT( a, d, e ) ) )
+# if (LIBAVCODEC_VERSION_INT < AV_VERSION_INT(55, 52, 0))
+static inline void avcodec_free_context( AVCodecContext **ctx )
+{
+ av_freep( ctx );
+}
+#endif
+
#endif /* HAVE_LIBAVCODEC_AVCODEC_H */
#ifdef HAVE_LIBAVUTIL_AVUTIL_H
More information about the vlc-commits
mailing list