[FFmpeg-devel] [PATCH 2/2] lavu/mem: reimplement the dynarray functions with the macro.
Nicolas George
george at nsup.org
Sat Mar 8 21:27:00 CET 2014
Signed-off-by: Nicolas George <george at nsup.org>
---
libavutil/mem.c | 75 +++++++++++++++++----------------------------------------
1 file changed, 22 insertions(+), 53 deletions(-)
Notice that, not counting the licence boilerplate and documentation, the
number of actual lines of code decreases with these two patches.
diff --git a/libavutil/mem.c b/libavutil/mem.c
index 10b0137..7206ddc 100644
--- a/libavutil/mem.c
+++ b/libavutil/mem.c
@@ -39,6 +39,7 @@
#include "avassert.h"
#include "avutil.h"
#include "common.h"
+#include "dynarray.h"
#include "intreadwrite.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)
{
- /* see similar ffmpeg.c:grow_array() */
- int nb, nb_alloc;
- intptr_t *tab;
-
- nb = *nb_ptr;
- tab = *(intptr_t**)tab_ptr;
- 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;
- }
- tab[nb++] = (intptr_t)elem;
- *nb_ptr = nb;
- return;
-
-fail:
- av_freep(tab_ptr);
- *nb_ptr = 0;
+ intptr_t *tab = *(intptr_t**)tab_ptr;
+
+ AV_DYNARRAY_ADD(INT_MAX, sizeof(*tab), tab, *nb_ptr, {
+ tab[*nb_ptr] = (intptr_t)elem;
+ *(intptr_t **)tab_ptr = tab;
+ }, {
+ *nb_ptr = 0;
+ av_freep(tab_ptr);
+ });
}
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);
+ uint8_t *tab_elem_data = NULL;
+
+ AV_DYNARRAY_ADD(INT_MAX, elem_size, *tab_ptr, *nb_ptr, {
+ tab_elem_data = (uint8_t *)*tab_ptr + (*nb_ptr) * 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);
+ }, {
+ av_freep(tab_ptr);
+ *nb_ptr = 0;
+ });
return tab_elem_data;
-
-fail:
- av_freep(tab_ptr);
- *nb_ptr = 0;
- return NULL;
}
static void fill16(uint8_t *dst, int len)
--
1.9.0
More information about the ffmpeg-devel
mailing list