AVFrame: add an opaque_ref field
authorwm4 <nfxjfg@googlemail.com>
Thu, 2 Feb 2017 10:27:54 +0000 (11:27 +0100)
committerwm4 <nfxjfg@googlemail.com>
Mon, 13 Feb 2017 07:01:20 +0000 (08:01 +0100)
This is an extended version of the AVFrame.opaque field, which can be
used to attach arbitrary user information to an AVFrame.

The usefulness of the opaque field is rather limited, because it can
store only up to 32 bits of information (or 64 bit on 64 bit systems).
It's not possible to set this field to a memory allocation, because
there is no way to deallocate it correctly.

The opaque_ref field circumvents this by letting the user set an
AVBuffer, which makes the user data refcounted.

Signed-off-by: Anton Khirnov <anton@khirnov.net>
Merges Libav commit 04f3bd349651.

doc/APIchanges
libavutil/frame.c
libavutil/frame.h
libavutil/version.h

index 8bca71ef36978a565de57a4534cad2ba6f186575..81e49c22b959fd343270ecb4158a8d125656af6b 100644 (file)
@@ -15,6 +15,9 @@ libavutil:     2015-08-28
 
 API changes, most recent first:
 
+2017-02-11 - xxxxxxx - lavu 55.47.100 - frame.h
+  Add AVFrame.opaque_ref.
+
 2017-01-31 - xxxxxxx - lavu 55.46.100 / 55.20.0 - cpu.h
   Add AV_CPU_FLAG_SSSE3SLOW.
 
index a08e0c539d6e4bd3a7dc5d4692c18cc9f917de4e..2913982e91debc4568a9d2ef563391a2cd297d6f 100644 (file)
@@ -379,6 +379,13 @@ FF_DISABLE_DEPRECATION_WARNINGS
 FF_ENABLE_DEPRECATION_WARNINGS
 #endif
 
+    av_buffer_unref(&dst->opaque_ref);
+    if (src->opaque_ref) {
+        dst->opaque_ref = av_buffer_ref(src->opaque_ref);
+        if (!dst->opaque_ref)
+            return AVERROR(ENOMEM);
+    }
+
     return 0;
 }
 
@@ -513,6 +520,8 @@ void av_frame_unref(AVFrame *frame)
 
     av_buffer_unref(&frame->hw_frames_ctx);
 
+    av_buffer_unref(&frame->opaque_ref);
+
     get_frame_defaults(frame);
 }
 
index b4500923af3e07d420fd552a5d8b50b34e7ac792..2b1dc2fee3ff17f69bfa7350a00d45f0b587293f 100644 (file)
@@ -538,6 +538,17 @@ typedef struct AVFrame {
      * AVHWFramesContext describing the frame.
      */
     AVBufferRef *hw_frames_ctx;
+
+    /**
+     * AVBufferRef for free use by the API user. FFmpeg will never check the
+     * contents of the buffer ref. FFmpeg calls av_buffer_unref() on it when
+     * the frame is unreferenced. av_frame_copy_props() calls create a new
+     * reference with av_buffer_ref() for the target frame's opaque_ref field.
+     *
+     * This is unrelated to the opaque field, although it serves a similar
+     * purpose.
+     */
+    AVBufferRef *opaque_ref;
 } AVFrame;
 
 /**
index 8866064aac4c168e41efbf4e86a7f5ed41ea15dc..a8b00bfc64bc3213df61f10754d544c8b6598437 100644 (file)
@@ -79,7 +79,7 @@
  */
 
 #define LIBAVUTIL_VERSION_MAJOR  55
-#define LIBAVUTIL_VERSION_MINOR  46
+#define LIBAVUTIL_VERSION_MINOR  47
 #define LIBAVUTIL_VERSION_MICRO 100
 
 #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \