[SCM] libav/experimental: lavc: add avcodec_free_context().

siretart at users.alioth.debian.org siretart at users.alioth.debian.org
Sun Aug 10 16:03:10 UTC 2014


The following commit has been merged in the experimental branch:
commit fd056029f45a9f6d213d9fce8165632042511d4f
Author: Anton Khirnov <anton at khirnov.net>
Date:   Sat Apr 5 08:36:00 2014 +0200

    lavc: add avcodec_free_context().
    
    Right now, the caller has to manually manage some allocated
    AVCodecContext fields, like extradata or subtitle_header. This is
    fragile and prone to leaks, especially if we want to add more such
    fields in the future.
    
    The only reason for this behaviour is so that the AVStream codec context
    can be reused for decoding. Such reuse is discouraged anyway, so this
    commit is the first step to deprecating it.

diff --git a/doc/APIchanges b/doc/APIchanges
index 57ef04f..c6242ee 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -13,6 +13,10 @@ libavutil:     2013-12-xx
 
 API changes, most recent first:
 
+2014-04-xx - xxxxxxx - lavc 55.52.0 - avcodec.h
+  Add avcodec_free_context(). From now on it should be used for freeing
+  AVCodecContext.
+
 2014-05-xx - xxxxxxx - lavf 55.17.0 - avformat.h
   Add AVMFT_FLAG_BITEXACT flag. Muxers now use it instead of checking
   CODEC_FLAG_BITEXACT on the first stream.
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index c76ee04..5640710 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -3146,9 +3146,8 @@ void avcodec_register(AVCodec *codec);
 void avcodec_register_all(void);
 
 /**
- * Allocate an AVCodecContext and set its fields to default values.  The
- * resulting struct can be deallocated by calling avcodec_close() on it followed
- * by av_free().
+ * Allocate an AVCodecContext and set its fields to default values. The
+ * resulting struct should be freed with avcodec_free_context().
  *
  * @param codec if non-NULL, allocate private data and initialize defaults
  *              for the given codec. It is illegal to then call avcodec_open2()
@@ -3163,6 +3162,12 @@ void avcodec_register_all(void);
 AVCodecContext *avcodec_alloc_context3(const AVCodec *codec);
 
 /**
+ * Free the codec context and everything associated with it and write NULL to
+ * the provided pointer.
+ */
+void avcodec_free_context(AVCodecContext **avctx);
+
+/**
  * Set the fields of the given AVCodecContext to default values corresponding
  * to the given codec (defaults may be codec-dependent).
  *
diff --git a/libavcodec/options.c b/libavcodec/options.c
index 85c1bec..e3ded73 100644
--- a/libavcodec/options.c
+++ b/libavcodec/options.c
@@ -135,6 +135,21 @@ AVCodecContext *avcodec_alloc_context3(const AVCodec *codec)
     return avctx;
 }
 
+void avcodec_free_context(AVCodecContext **pavctx)
+{
+    AVCodecContext *avctx = *pavctx;
+
+    if (!avctx)
+        return;
+
+    avcodec_close(avctx);
+
+    av_freep(&avctx->extradata);
+    av_freep(&avctx->subtitle_header);
+
+    av_freep(pavctx);
+}
+
 int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src)
 {
     const AVCodec *orig_codec = dest->codec;
diff --git a/libavcodec/version.h b/libavcodec/version.h
index 22343d5..d42e963 100644
--- a/libavcodec/version.h
+++ b/libavcodec/version.h
@@ -29,7 +29,7 @@
 #include "libavutil/version.h"
 
 #define LIBAVCODEC_VERSION_MAJOR 55
-#define LIBAVCODEC_VERSION_MINOR 51
+#define LIBAVCODEC_VERSION_MINOR 52
 #define LIBAVCODEC_VERSION_MICRO  0
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \

-- 
Libav/FFmpeg packaging



More information about the pkg-multimedia-commits mailing list