lavu/buffer: add release function

new function allows to unref buffer and obtain its data.

Signed-off-by: Lukasz Marek <lukasz.m.luki@gmail.com>
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
pull/56/merge
Lukasz Marek 11 years ago committed by Michael Niedermayer
parent 774239be71
commit 3144440004
  1. 29
      libavutil/buffer.c
  2. 12
      libavutil/buffer.h

@ -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) int av_buffer_is_writable(const AVBufferRef *buf)
{ {
if (buf->buffer->flags & AV_BUFFER_FLAG_READONLY) if (buf->buffer->flags & AV_BUFFER_FLAG_READONLY)

@ -154,6 +154,18 @@ AVBufferRef *av_buffer_ref(AVBufferRef *buf);
*/ */
void av_buffer_unref(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 * @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). * true if and only if buf is the only reference to the underlying AVBuffer).

Loading…
Cancel
Save