summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorwm4 <nfxjfg@googlemail.com>2017-02-02 11:27:54 +0100
committerAnton Khirnov <anton@khirnov.net>2017-02-11 11:37:45 +0100
commit04f3bd349651694f30feeb8c4ed9bc58106fca54 (patch)
treed48fd34fb20bcc877e24a4bb6fd7f4cff10edb67
parent4de220d2e3751c459f8739a08ac6ca52e63eba30 (diff)
AVFrame: add an opaque_ref field
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>
-rw-r--r--doc/APIchanges3
-rw-r--r--libavutil/frame.c9
-rw-r--r--libavutil/frame.h11
-rw-r--r--libavutil/version.h4
4 files changed, 25 insertions, 2 deletions
diff --git a/doc/APIchanges b/doc/APIchanges
index 9b9f46ef49..e7a0b14038 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -13,6 +13,9 @@ libavutil: 2015-08-28
API changes, most recent first:
+2017-02-11 - xxxxxxx - lavu 55.32.0 - frame.h
+ Add AVFrame.opaque_ref.
+
2017-02-xx - xxxxxxx - lavu 55.31.1 - frame.h
Allow passing the value of 0 (meaning "automatic") as the required alignment
to av_frame_get_buffer().
diff --git a/libavutil/frame.c b/libavutil/frame.c
index aa5820c0e9..9cd5f9ab37 100644
--- a/libavutil/frame.c
+++ b/libavutil/frame.c
@@ -317,6 +317,8 @@ void av_frame_unref(AVFrame *frame)
av_buffer_unref(&frame->hw_frames_ctx);
+ av_buffer_unref(&frame->opaque_ref);
+
get_frame_defaults(frame);
}
@@ -440,6 +442,13 @@ FF_ENABLE_DEPRECATION_WARNINGS
av_dict_copy(&sd_dst->metadata, sd_src->metadata, 0);
}
+ 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;
}
diff --git a/libavutil/frame.h b/libavutil/frame.h
index 4f63fb0249..f9ffb5bbbf 100644
--- a/libavutil/frame.h
+++ b/libavutil/frame.h
@@ -395,6 +395,17 @@ typedef struct AVFrame {
/**
* @}
*/
+
+ /**
+ * AVBufferRef for free use by the API user. Libav will never check the
+ * contents of the buffer ref. Libav 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;
/**
diff --git a/libavutil/version.h b/libavutil/version.h
index 0768f9fe99..5dbc57cc1b 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -54,8 +54,8 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 55
-#define LIBAVUTIL_VERSION_MINOR 31
-#define LIBAVUTIL_VERSION_MICRO 1
+#define LIBAVUTIL_VERSION_MINOR 32
+#define LIBAVUTIL_VERSION_MICRO 0
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
LIBAVUTIL_VERSION_MINOR, \