lavu/buffer: add a convenience function for replacing buffers

A common pattern e.g. in libavcodec is replacing/updating buffer
references: unref old one, ref new one. This function allows simplifying
such code and avoiding unnecessary refs+unrefs if the references are
already equivalent.
This commit is contained in:
Anton Khirnov 2020-06-05 11:17:49 +02:00
parent 5bbf58ab87
commit 68918d3b7f
4 changed files with 46 additions and 1 deletions

View File

@ -15,6 +15,9 @@ libavutil: 2017-10-21
API changes, most recent first:
2020-xx-xx - xxxxxxxxxx - lavu 56.60.100 - buffer.h
Add a av_buffer_replace() convenience function.
2020-09-xx - xxxxxxxxxx - lavu 56.59.100 - timecode.h
Add av_timecode_make_smpte_tc_string2.

View File

@ -216,6 +216,32 @@ int av_buffer_realloc(AVBufferRef **pbuf, int size)
return 0;
}
int av_buffer_replace(AVBufferRef **pdst, AVBufferRef *src)
{
AVBufferRef *dst = *pdst;
AVBufferRef *tmp;
if (!src) {
av_buffer_unref(pdst);
return 0;
}
if (dst && dst->buffer == src->buffer) {
/* make sure the data pointers match */
dst->data = src->data;
dst->size = src->size;
return 0;
}
tmp = av_buffer_ref(src);
if (!tmp)
return AVERROR(ENOMEM);
av_buffer_unref(pdst);
*pdst = tmp;
return 0;
}
AVBufferPool *av_buffer_pool_init2(int size, void *opaque,
AVBufferRef* (*alloc)(void *opaque, int size),
void (*pool_free)(void *opaque))

View File

@ -197,6 +197,22 @@ int av_buffer_make_writable(AVBufferRef **buf);
*/
int av_buffer_realloc(AVBufferRef **buf, int size);
/**
* Ensure dst refers to the same data as src.
*
* When *dst is already equivalent to src, do nothing. Otherwise unreference dst
* and replace it with a new reference to src.
*
* @param dst Pointer to either a valid buffer reference or NULL. On success,
* this will point to a buffer reference equivalent to src. On
* failure, dst will be left untouched.
* @param src A buffer reference to replace dst with. May be NULL, then this
* function is equivalent to av_buffer_unref(dst).
* @return 0 on success
* AVERROR(ENOMEM) on memory allocation failure.
*/
int av_buffer_replace(AVBufferRef **dst, AVBufferRef *src);
/**
* @}
*/

View File

@ -79,7 +79,7 @@
*/
#define LIBAVUTIL_VERSION_MAJOR 56
#define LIBAVUTIL_VERSION_MINOR 59
#define LIBAVUTIL_VERSION_MINOR 60
#define LIBAVUTIL_VERSION_MICRO 100
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \