From 3144440004941aa22ffea9933f5e5dfe826df654 Mon Sep 17 00:00:00 2001 From: Lukasz Marek Date: Sun, 23 Feb 2014 23:19:23 +0100 Subject: lavu/buffer: add release function new function allows to unref buffer and obtain its data. Signed-off-by: Lukasz Marek Signed-off-by: Michael Niedermayer --- libavutil/buffer.c | 29 +++++++++++++++++++++++++++++ libavutil/buffer.h | 12 ++++++++++++ 2 files changed, 41 insertions(+) (limited to 'libavutil') diff --git a/libavutil/buffer.c b/libavutil/buffer.c index e9bf54b96c..e8ec2c97e0 100644 --- a/libavutil/buffer.c +++ b/libavutil/buffer.c @@ -117,6 +117,35 @@ void av_buffer_unref(AVBufferRef **buf) } } +int av_buffer_release(AVBufferRef **buf, uint8_t **data) +{ + AVBuffer *b; + int ret = 0; + + if (data) + *data = NULL; + if (!buf || !*buf) + return 0; + b = (*buf)->buffer; + av_freep(buf); + + if (data && avpriv_atomic_int_get(&b->refcount) > 1) { + *data = av_memdup(b->data, b->size); + if (!*data) + ret = AVERROR(ENOMEM); + } + + if (!avpriv_atomic_int_add_and_fetch(&b->refcount, -1)) { + if (data && !*data) { + ret = 0; + *data = b->data; + } else + b->free(b->opaque, b->data); + av_freep(&b); + } + return ret; +} + int av_buffer_is_writable(const AVBufferRef *buf) { if (buf->buffer->flags & AV_BUFFER_FLAG_READONLY) diff --git a/libavutil/buffer.h b/libavutil/buffer.h index b4399fd39f..8cf2cbf302 100644 --- a/libavutil/buffer.h +++ b/libavutil/buffer.h @@ -154,6 +154,18 @@ AVBufferRef *av_buffer_ref(AVBufferRef *buf); */ void av_buffer_unref(AVBufferRef **buf); +/** + * Free a given reference and pass underlaying data to user provided pointer. + * If there is more than one reference then data is copied. + * + * @param buf the reference to be released. The pointer is set to NULL on return. + * @param data pointer to be passed with underlaying data. + * @return 0 on success, a negative AVERROR on failure. + * + * @note on error buffer is properly released and *data is set to NULL. + */ +int av_buffer_release(AVBufferRef **buf, uint8_t **data); + /** * @return 1 if the caller may write to the data referred to by buf (which is * true if and only if buf is the only reference to the underlying AVBuffer). -- cgit v1.2.3