lavc: preserve the original private data in avcodec_copy_context()
authorAnton Khirnov <anton@khirnov.net>
Sat, 5 Apr 2014 05:38:16 +0000 (07:38 +0200)
committerAnton Khirnov <anton@khirnov.net>
Thu, 15 May 2014 05:51:16 +0000 (07:51 +0200)
If a non-NULL codec was passed to avcodec_alloc_context3(), private data
will be already allocated in dest.

libavcodec/options.c

index 2e41ce4..c28cbeb 100644 (file)
@@ -137,6 +137,9 @@ AVCodecContext *avcodec_alloc_context3(const AVCodec *codec)
 
 int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src)
 {
+    const AVCodec *orig_codec = dest->codec;
+    uint8_t *orig_priv_data = dest->priv_data;
+
     if (avcodec_is_open(dest)) { // check that the dest context is uninitialized
         av_log(dest, AV_LOG_ERROR,
                "Tried to copy AVCodecContext %p into already-initialized %p\n",
@@ -145,9 +148,10 @@ int avcodec_copy_context(AVCodecContext *dest, const AVCodecContext *src)
     }
     memcpy(dest, src, sizeof(*dest));
 
+    dest->priv_data       = orig_priv_data;
+    dest->codec           = orig_codec;
+
     /* set values specific to opened codecs back to their default state */
-    dest->priv_data       = NULL;
-    dest->codec           = NULL;
     dest->slice_offset    = NULL;
     dest->hwaccel         = NULL;
     dest->internal        = NULL;