]> git.sesse.net Git - vlc/commitdiff
avcodec: use avcodec_free_context() where applicable
authorRémi Denis-Courmont <remi@remlab.net>
Sat, 13 Sep 2014 09:48:17 +0000 (12:48 +0300)
committerRémi Denis-Courmont <remi@remlab.net>
Sat, 13 Sep 2014 09:48:36 +0000 (12:48 +0300)
Fix leak on error, fix mismatched free function on success.

modules/codec/avcodec/avcodec.c
modules/codec/avcodec/avcommon_compat.h

index 52ae465c030fb3e9f8397f239412be6002a5ac24..5190aae1d094791116714f571cf73e5b99095681 100644 (file)
@@ -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 );
 }
 
index 6b728da3539ee707c42ac3dca5448ce2ddb244e1..d6293d72279ab4074c86f0c7894c92c94007d639 100644 (file)
     ( (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