2 * default memory allocator for libavutil
3 * Copyright (c) 2002 Fabrice Bellard
5 * This file is part of Libav.
7 * Libav is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * Libav is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with Libav; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
24 * default memory allocator for libavutil
39 #include "intreadwrite.h"
44 #define malloc AV_JOIN(MALLOC_PREFIX, malloc)
45 #define memalign AV_JOIN(MALLOC_PREFIX, memalign)
46 #define posix_memalign AV_JOIN(MALLOC_PREFIX, posix_memalign)
47 #define realloc AV_JOIN(MALLOC_PREFIX, realloc)
48 #define free AV_JOIN(MALLOC_PREFIX, free)
50 void *malloc(size_t size
);
51 void *memalign(size_t align
, size_t size
);
52 int posix_memalign(void **ptr
, size_t align
, size_t size
);
53 void *realloc(void *ptr
, size_t size
);
56 #endif /* MALLOC_PREFIX */
58 /* You can redefine av_malloc and av_free in your project to use your
59 * memory allocator. You do not need to suppress this file because the
60 * linker will do it automatically. */
62 void *av_malloc(size_t size
)
66 /* let's disallow possibly ambiguous cases */
67 if (size
> (INT_MAX
- 32) || !size
)
70 #if HAVE_POSIX_MEMALIGN
71 if (posix_memalign(&ptr
, 32, size
))
73 #elif HAVE_ALIGNED_MALLOC
74 ptr
= _aligned_malloc(size
, 32);
76 ptr
= memalign(32, size
);
78 * Indeed, we should align it:
81 * on 32 for 586, PPro - K6-III
82 * on 64 for K7 (maybe for P3 too).
83 * Because L1 and L2 caches are aligned on those values.
84 * But I don't want to code such logic here!
87 * For AVX ASM. SSE / NEON needs only 16.
88 * Why not larger? Because I did not see a difference in benchmarks ...
91 * memalign(64) + 1 3071, 3051, 3032
92 * memalign(64) + 2 3051, 3032, 3041
93 * memalign(64) + 4 2911, 2896, 2915
94 * memalign(64) + 8 2545, 2554, 2550
95 * memalign(64) + 16 2543, 2572, 2563
96 * memalign(64) + 32 2546, 2545, 2571
97 * memalign(64) + 64 2570, 2533, 2558
99 * BTW, malloc seems to do 8-byte alignment by default here.
107 void *av_realloc(void *ptr
, size_t size
)
109 /* let's disallow possibly ambiguous cases */
110 if (size
> (INT_MAX
- 16))
113 #if HAVE_ALIGNED_MALLOC
114 return _aligned_realloc(ptr
, size
, 32);
116 return realloc(ptr
, size
);
120 int av_reallocp(void *ptr
, size_t size
)
129 memcpy(&val
, ptr
, sizeof(val
));
130 val
= av_realloc(val
, size
);
134 return AVERROR(ENOMEM
);
137 memcpy(ptr
, &val
, sizeof(val
));
141 void *av_malloc_array(size_t nmemb
, size_t size
)
143 if (!size
|| nmemb
>= INT_MAX
/ size
)
145 return av_malloc(nmemb
* size
);
148 void *av_mallocz_array(size_t nmemb
, size_t size
)
150 if (!size
|| nmemb
>= INT_MAX
/ size
)
152 return av_mallocz(nmemb
* size
);
155 void *av_realloc_array(void *ptr
, size_t nmemb
, size_t size
)
157 if (!size
|| nmemb
>= INT_MAX
/ size
)
159 return av_realloc(ptr
, nmemb
* size
);
162 int av_reallocp_array(void *ptr
, size_t nmemb
, size_t size
)
166 if (!size
|| nmemb
>= INT_MAX
/ size
)
167 return AVERROR(ENOMEM
);
173 memcpy(&val
, ptr
, sizeof(val
));
174 val
= av_realloc(val
, nmemb
* size
);
177 return AVERROR(ENOMEM
);
180 memcpy(ptr
, &val
, sizeof(val
));
184 void av_free(void *ptr
)
186 #if HAVE_ALIGNED_MALLOC
193 void av_freep(void *arg
)
197 memcpy(&val
, arg
, sizeof(val
));
198 memcpy(arg
, &(void *){ NULL
}, sizeof(val
));
202 void *av_mallocz(size_t size
)
204 void *ptr
= av_malloc(size
);
206 memset(ptr
, 0, size
);
210 char *av_strdup(const char *s
)
214 int len
= strlen(s
) + 1;
215 ptr
= av_realloc(NULL
, len
);
222 char *av_strndup(const char *s
, size_t len
)
224 char *ret
= NULL
, *end
;
229 end
= memchr(s
, 0, len
);
233 ret
= av_realloc(NULL
, len
+ 1);
242 static void fill16(uint8_t *dst
, int len
)
244 uint32_t v
= AV_RN16(dst
- 2);
260 static void fill24(uint8_t *dst
, int len
)
263 uint32_t v
= AV_RB24(dst
- 3);
264 uint32_t a
= v
<< 8 | v
>> 16;
265 uint32_t b
= v
<< 16 | v
>> 8;
266 uint32_t c
= v
<< 24 | v
;
268 uint32_t v
= AV_RL24(dst
- 3);
269 uint32_t a
= v
| v
<< 24;
270 uint32_t b
= v
>> 8 | v
<< 16;
271 uint32_t c
= v
>> 16 | v
<< 8;
300 static void fill32(uint8_t *dst
, int len
)
302 uint32_t v
= AV_RN32(dst
- 4);
316 void av_memcpy_backptr(uint8_t *dst
, int back
, int cnt
)
318 const uint8_t *src
= &dst
[-back
];
323 memset(dst
, *src
, cnt
);
324 } else if (back
== 2) {
326 } else if (back
== 3) {
328 } else if (back
== 4) {
333 while (cnt
> blocklen
) {
334 memcpy(dst
, src
, blocklen
);
339 memcpy(dst
, src
, cnt
);
343 AV_COPY32U(dst
, src
);
344 AV_COPY32U(dst
+ 4, src
+ 4);
350 AV_COPY32U(dst
, src
);
356 AV_COPY16U(dst
, src
);
366 void *av_fast_realloc(void *ptr
, unsigned int *size
, size_t min_size
)
368 if (min_size
< *size
)
371 min_size
= FFMAX(17 * min_size
/ 16 + 32, min_size
);
373 ptr
= av_realloc(ptr
, min_size
);
374 /* we could set this to the unmodified min_size but this is safer
375 * if the user lost the ptr and uses NULL now
385 void av_fast_malloc(void *ptr
, unsigned int *size
, size_t min_size
)
388 if (min_size
< *size
)
390 min_size
= FFMAX(17 * min_size
/ 16 + 32, min_size
);
392 *p
= av_malloc(min_size
);