mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
lavu/mem: add av_dynarray2_add()
Based on a patch by Clément Bœsch. See thread: From: Clément Bœsch <ubitux@gmail.com> Subject: [FFmpeg-devel] [PATCH 1/5] lavu: add av_dynarray_alloc_elem(). Date: Sun, 14 Apr 2013 03:07:54 +0200
This commit is contained in:
parent
84be806982
commit
e3984166a4
@ -15,6 +15,9 @@ libavutil: 2012-10-22
|
|||||||
|
|
||||||
API changes, most recent first:
|
API changes, most recent first:
|
||||||
|
|
||||||
|
2013-05-13 - xxxxxxx - lavu 52.31.100 - mem.h
|
||||||
|
Add av_dynarray2_add().
|
||||||
|
|
||||||
2013-05-12 - xxxxxxx - lavfi 3.65.100
|
2013-05-12 - xxxxxxx - lavfi 3.65.100
|
||||||
Add AVFILTER_FLAG_SUPPORT_TIMELINE* filter flags.
|
Add AVFILTER_FLAG_SUPPORT_TIMELINE* filter flags.
|
||||||
|
|
||||||
|
@ -270,6 +270,39 @@ fail:
|
|||||||
*nb_ptr = 0;
|
*nb_ptr = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size,
|
||||||
|
const uint8_t *elem_data)
|
||||||
|
{
|
||||||
|
int nb = *nb_ptr, nb_alloc;
|
||||||
|
uint8_t *tab = *tab_ptr, *tab_elem_data;
|
||||||
|
|
||||||
|
if ((nb & (nb - 1)) == 0) {
|
||||||
|
if (nb == 0) {
|
||||||
|
nb_alloc = 1;
|
||||||
|
} else {
|
||||||
|
if (nb > INT_MAX / (2 * elem_size))
|
||||||
|
goto fail;
|
||||||
|
nb_alloc = nb * 2;
|
||||||
|
}
|
||||||
|
tab = av_realloc(tab, nb_alloc * elem_size);
|
||||||
|
if (!tab)
|
||||||
|
goto fail;
|
||||||
|
*tab_ptr = tab;
|
||||||
|
}
|
||||||
|
*nb_ptr = nb + 1;
|
||||||
|
tab_elem_data = tab + nb*elem_size;
|
||||||
|
if (elem_data)
|
||||||
|
memcpy(tab_elem_data, elem_data, elem_size);
|
||||||
|
else if (CONFIG_MEMORY_POISONING)
|
||||||
|
memset(tab_elem_data, FF_MEMORY_POISON, elem_size);
|
||||||
|
return tab_elem_data;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
av_freep(tab_ptr);
|
||||||
|
*nb_ptr = 0;
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
static void fill16(uint8_t *dst, int len)
|
static void fill16(uint8_t *dst, int len)
|
||||||
{
|
{
|
||||||
uint32_t v = AV_RN16(dst - 2);
|
uint32_t v = AV_RN16(dst - 2);
|
||||||
|
@ -215,9 +215,34 @@ void av_freep(void *ptr);
|
|||||||
* @param tab_ptr pointer to the array to grow
|
* @param tab_ptr pointer to the array to grow
|
||||||
* @param nb_ptr pointer to the number of elements in the array
|
* @param nb_ptr pointer to the number of elements in the array
|
||||||
* @param elem element to add
|
* @param elem element to add
|
||||||
|
* @see av_dynarray2_add()
|
||||||
*/
|
*/
|
||||||
void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem);
|
void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add an element of size elem_size to a dynamic array.
|
||||||
|
*
|
||||||
|
* The array is reallocated when its number of elements reaches powers of 2.
|
||||||
|
* Therefore, the amortized cost of adding an element is constant.
|
||||||
|
*
|
||||||
|
* In case of success, the pointer to the array is updated in order to
|
||||||
|
* point to the new grown array, and the number pointed to by nb_ptr
|
||||||
|
* is incremented.
|
||||||
|
* In case of failure, the array is freed, *tab_ptr is set to NULL and
|
||||||
|
* *nb_ptr is set to 0.
|
||||||
|
*
|
||||||
|
* @param tab_ptr pointer to the array to grow
|
||||||
|
* @param nb_ptr pointer to the number of elements in the array
|
||||||
|
* @param elem_size size in bytes of the elements in the array
|
||||||
|
* @param elem_data pointer to the data of the element to add. If NULL, the space of
|
||||||
|
* the new added element is not filled.
|
||||||
|
* @return pointer to the data of the element to copy in the new allocated space.
|
||||||
|
* If NULL, the new allocated space is left uninitialized."
|
||||||
|
* @see av_dynarray_add()
|
||||||
|
*/
|
||||||
|
void *av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size,
|
||||||
|
const uint8_t *elem_data);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Multiply two size_t values checking for overflow.
|
* Multiply two size_t values checking for overflow.
|
||||||
* @return 0 if success, AVERROR(EINVAL) if overflow.
|
* @return 0 if success, AVERROR(EINVAL) if overflow.
|
||||||
|
@ -75,7 +75,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#define LIBAVUTIL_VERSION_MAJOR 52
|
#define LIBAVUTIL_VERSION_MAJOR 52
|
||||||
#define LIBAVUTIL_VERSION_MINOR 30
|
#define LIBAVUTIL_VERSION_MINOR 31
|
||||||
#define LIBAVUTIL_VERSION_MICRO 100
|
#define LIBAVUTIL_VERSION_MICRO 100
|
||||||
|
|
||||||
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
|
#define LIBAVUTIL_VERSION_INT AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
|
||||||
|
Loading…
Reference in New Issue
Block a user