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:
Stefano Sabatini
2013-04-14 03:07:54 +02:00
parent 84be806982
commit e3984166a4
4 changed files with 62 additions and 1 deletions

View File

@@ -270,6 +270,39 @@ fail:
*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)
{
uint32_t v = AV_RN16(dst - 2);