mirror of
https://github.com/FFmpeg/FFmpeg.git
synced 2024-12-23 12:43:46 +02:00
lavu/mem: reimplement the dynarray functions with the macro.
Signed-off-by: Nicolas George <george@nsup.org> Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
This commit is contained in:
parent
7b9a310d0e
commit
b0dcf76530
@ -39,6 +39,7 @@
|
|||||||
#include "avassert.h"
|
#include "avassert.h"
|
||||||
#include "avutil.h"
|
#include "avutil.h"
|
||||||
#include "common.h"
|
#include "common.h"
|
||||||
|
#include "dynarray.h"
|
||||||
#include "intreadwrite.h"
|
#include "intreadwrite.h"
|
||||||
#include "mem.h"
|
#include "mem.h"
|
||||||
|
|
||||||
@ -279,65 +280,33 @@ void *av_memdup(const void *p, size_t size)
|
|||||||
|
|
||||||
void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem)
|
void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem)
|
||||||
{
|
{
|
||||||
/* see similar ffmpeg.c:grow_array() */
|
intptr_t *tab = *(intptr_t**)tab_ptr;
|
||||||
int nb, nb_alloc;
|
|
||||||
intptr_t *tab;
|
|
||||||
|
|
||||||
nb = *nb_ptr;
|
AV_DYNARRAY_ADD(INT_MAX, sizeof(*tab), tab, *nb_ptr, {
|
||||||
tab = *(intptr_t**)tab_ptr;
|
tab[*nb_ptr] = (intptr_t)elem;
|
||||||
if ((nb & (nb - 1)) == 0) {
|
|
||||||
if (nb == 0) {
|
|
||||||
nb_alloc = 1;
|
|
||||||
} else {
|
|
||||||
if (nb > INT_MAX / (2 * sizeof(intptr_t)))
|
|
||||||
goto fail;
|
|
||||||
nb_alloc = nb * 2;
|
|
||||||
}
|
|
||||||
tab = av_realloc(tab, nb_alloc * sizeof(intptr_t));
|
|
||||||
if (!tab)
|
|
||||||
goto fail;
|
|
||||||
*(intptr_t **)tab_ptr = tab;
|
*(intptr_t **)tab_ptr = tab;
|
||||||
}
|
}, {
|
||||||
tab[nb++] = (intptr_t)elem;
|
|
||||||
*nb_ptr = nb;
|
|
||||||
return;
|
|
||||||
|
|
||||||
fail:
|
|
||||||
av_freep(tab_ptr);
|
|
||||||
*nb_ptr = 0;
|
*nb_ptr = 0;
|
||||||
|
av_freep(tab_ptr);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void *av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size,
|
void *av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size,
|
||||||
const uint8_t *elem_data)
|
const uint8_t *elem_data)
|
||||||
{
|
{
|
||||||
int nb = *nb_ptr, nb_alloc;
|
uint8_t *tab_elem_data = NULL;
|
||||||
uint8_t *tab = *tab_ptr, *tab_elem_data;
|
|
||||||
|
|
||||||
if ((nb & (nb - 1)) == 0) {
|
AV_DYNARRAY_ADD(INT_MAX, elem_size, *tab_ptr, *nb_ptr, {
|
||||||
if (nb == 0) {
|
tab_elem_data = (uint8_t *)*tab_ptr + (*nb_ptr) * elem_size;
|
||||||
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)
|
if (elem_data)
|
||||||
memcpy(tab_elem_data, elem_data, elem_size);
|
memcpy(tab_elem_data, elem_data, elem_size);
|
||||||
else if (CONFIG_MEMORY_POISONING)
|
else if (CONFIG_MEMORY_POISONING)
|
||||||
memset(tab_elem_data, FF_MEMORY_POISON, elem_size);
|
memset(tab_elem_data, FF_MEMORY_POISON, elem_size);
|
||||||
return tab_elem_data;
|
}, {
|
||||||
|
|
||||||
fail:
|
|
||||||
av_freep(tab_ptr);
|
av_freep(tab_ptr);
|
||||||
*nb_ptr = 0;
|
*nb_ptr = 0;
|
||||||
return NULL;
|
});
|
||||||
|
return tab_elem_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fill16(uint8_t *dst, int len)
|
static void fill16(uint8_t *dst, int len)
|
||||||
|
Loading…
Reference in New Issue
Block a user