diff --git a/doc/APIchanges b/doc/APIchanges
index 83c08ba754716c5ea8562b9e7e179e31c85c3631..6ea235e671433356dc31f76e779fef03f36ed999 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -15,6 +15,10 @@ libavutil:     2012-10-22
 
 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 - lavu 52.84.100 - time.h
   Add av_gettime_relative() av_gettime_relative_is_monotonic()
 
diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h
index 9a24c9663326a6210732bc9d8b12280d2465dfaa..45a9a7de20ce92c1cc297a5be7262c2b546de8b4 100644
--- a/libavcodec/avcodec.h
+++ b/libavcodec/avcodec.h
@@ -3455,9 +3455,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()
@@ -3471,6 +3470,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 b31483baa3aefcc343de0199cf0940f607d63b05..694e1c3f3b0935d70e807c6731bf61e6aa7b48f2 100644
--- a/libavcodec/options.c
+++ b/libavcodec/options.c
@@ -154,6 +154,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 680c0603256e4bd38810a350f1d79704eb98c6d5..4e344a4aa74a7ab1832518cfacb443d9b5329edf 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  62
+#define LIBAVCODEC_VERSION_MINOR  63
 #define LIBAVCODEC_VERSION_MICRO 100
 
 #define LIBAVCODEC_VERSION_INT  AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \