/src/vlc/contrib/contrib-build/bpg/libavutil/mem.h
Line | Count | Source |
1 | | /* |
2 | | * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> |
3 | | * |
4 | | * This file is part of FFmpeg. |
5 | | * |
6 | | * FFmpeg is free software; you can redistribute it and/or |
7 | | * modify it under the terms of the GNU Lesser General Public |
8 | | * License as published by the Free Software Foundation; either |
9 | | * version 2.1 of the License, or (at your option) any later version. |
10 | | * |
11 | | * FFmpeg is distributed in the hope that it will be useful, |
12 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
13 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
14 | | * Lesser General Public License for more details. |
15 | | * |
16 | | * You should have received a copy of the GNU Lesser General Public |
17 | | * License along with FFmpeg; if not, write to the Free Software |
18 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19 | | */ |
20 | | |
21 | | /** |
22 | | * @file |
23 | | * memory handling functions |
24 | | */ |
25 | | |
26 | | #ifndef AVUTIL_MEM_H |
27 | | #define AVUTIL_MEM_H |
28 | | |
29 | | #include <limits.h> |
30 | | #include <stdint.h> |
31 | | |
32 | | #include "attributes.h" |
33 | | #include "error.h" |
34 | | #include "avutil.h" |
35 | | |
36 | | /** |
37 | | * @addtogroup lavu_mem |
38 | | * @{ |
39 | | */ |
40 | | |
41 | | |
42 | | #if defined(__INTEL_COMPILER) && __INTEL_COMPILER < 1110 || defined(__SUNPRO_C) |
43 | | #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v |
44 | | #define DECLARE_ASM_CONST(n,t,v) const t __attribute__ ((aligned (n))) v |
45 | | #elif defined(__TI_COMPILER_VERSION__) |
46 | | #define DECLARE_ALIGNED(n,t,v) \ |
47 | | AV_PRAGMA(DATA_ALIGN(v,n)) \ |
48 | | t __attribute__((aligned(n))) v |
49 | | #define DECLARE_ASM_CONST(n,t,v) \ |
50 | | AV_PRAGMA(DATA_ALIGN(v,n)) \ |
51 | | static const t __attribute__((aligned(n))) v |
52 | | #elif defined(__GNUC__) |
53 | | #define DECLARE_ALIGNED(n,t,v) t __attribute__ ((aligned (n))) v |
54 | | #define DECLARE_ASM_CONST(n,t,v) static const t av_used __attribute__ ((aligned (n))) v |
55 | | #elif defined(_MSC_VER) |
56 | | #define DECLARE_ALIGNED(n,t,v) __declspec(align(n)) t v |
57 | | #define DECLARE_ASM_CONST(n,t,v) __declspec(align(n)) static const t v |
58 | | #else |
59 | | #define DECLARE_ALIGNED(n,t,v) t v |
60 | | #define DECLARE_ASM_CONST(n,t,v) static const t v |
61 | | #endif |
62 | | |
63 | | #if AV_GCC_VERSION_AT_LEAST(3,1) |
64 | | #define av_malloc_attrib __attribute__((__malloc__)) |
65 | | #else |
66 | | #define av_malloc_attrib |
67 | | #endif |
68 | | |
69 | | #if AV_GCC_VERSION_AT_LEAST(4,3) |
70 | | #define av_alloc_size(...) __attribute__((alloc_size(__VA_ARGS__))) |
71 | | #else |
72 | | #define av_alloc_size(...) |
73 | | #endif |
74 | | |
75 | | /** |
76 | | * Allocate a block of size bytes with alignment suitable for all |
77 | | * memory accesses (including vectors if available on the CPU). |
78 | | * @param size Size in bytes for the memory block to be allocated. |
79 | | * @return Pointer to the allocated block, NULL if the block cannot |
80 | | * be allocated. |
81 | | * @see av_mallocz() |
82 | | */ |
83 | | void *av_malloc(size_t size) av_malloc_attrib av_alloc_size(1); |
84 | | |
85 | | /** |
86 | | * Allocate a block of size * nmemb bytes with av_malloc(). |
87 | | * @param nmemb Number of elements |
88 | | * @param size Size of the single element |
89 | | * @return Pointer to the allocated block, NULL if the block cannot |
90 | | * be allocated. |
91 | | * @see av_malloc() |
92 | | */ |
93 | | av_alloc_size(1, 2) void *av_malloc_array(size_t nmemb, size_t size); |
94 | | |
95 | | /** |
96 | | * Allocate or reallocate a block of memory. |
97 | | * If ptr is NULL and size > 0, allocate a new block. If |
98 | | * size is zero, free the memory block pointed to by ptr. |
99 | | * @param ptr Pointer to a memory block already allocated with |
100 | | * av_realloc() or NULL. |
101 | | * @param size Size in bytes of the memory block to be allocated or |
102 | | * reallocated. |
103 | | * @return Pointer to a newly-reallocated block or NULL if the block |
104 | | * cannot be reallocated or the function is used to free the memory block. |
105 | | * @warning Pointers originating from the av_malloc() family of functions must |
106 | | * not be passed to av_realloc(). The former can be implemented using |
107 | | * memalign() (or other functions), and there is no guarantee that |
108 | | * pointers from such functions can be passed to realloc() at all. |
109 | | * The situation is undefined according to POSIX and may crash with |
110 | | * some libc implementations. |
111 | | * @see av_fast_realloc() |
112 | | */ |
113 | | void *av_realloc(void *ptr, size_t size) av_alloc_size(2); |
114 | | |
115 | | /** |
116 | | * Allocate or reallocate a block of memory. |
117 | | * This function does the same thing as av_realloc, except: |
118 | | * - It takes two arguments and checks the result of the multiplication for |
119 | | * integer overflow. |
120 | | * - It frees the input block in case of failure, thus avoiding the memory |
121 | | * leak with the classic "buf = realloc(buf); if (!buf) return -1;". |
122 | | */ |
123 | | void *av_realloc_f(void *ptr, size_t nelem, size_t elsize); |
124 | | |
125 | | /** |
126 | | * Allocate or reallocate a block of memory. |
127 | | * If *ptr is NULL and size > 0, allocate a new block. If |
128 | | * size is zero, free the memory block pointed to by ptr. |
129 | | * @param ptr Pointer to a pointer to a memory block already allocated |
130 | | * with av_realloc(), or pointer to a pointer to NULL. |
131 | | * The pointer is updated on success, or freed on failure. |
132 | | * @param size Size in bytes for the memory block to be allocated or |
133 | | * reallocated |
134 | | * @return Zero on success, an AVERROR error code on failure. |
135 | | * @warning Pointers originating from the av_malloc() family of functions must |
136 | | * not be passed to av_reallocp(). The former can be implemented using |
137 | | * memalign() (or other functions), and there is no guarantee that |
138 | | * pointers from such functions can be passed to realloc() at all. |
139 | | * The situation is undefined according to POSIX and may crash with |
140 | | * some libc implementations. |
141 | | */ |
142 | | int av_reallocp(void *ptr, size_t size); |
143 | | |
144 | | /** |
145 | | * Allocate or reallocate an array. |
146 | | * If ptr is NULL and nmemb > 0, allocate a new block. If |
147 | | * nmemb is zero, free the memory block pointed to by ptr. |
148 | | * @param ptr Pointer to a memory block already allocated with |
149 | | * av_realloc() or NULL. |
150 | | * @param nmemb Number of elements |
151 | | * @param size Size of the single element |
152 | | * @return Pointer to a newly-reallocated block or NULL if the block |
153 | | * cannot be reallocated or the function is used to free the memory block. |
154 | | * @warning Pointers originating from the av_malloc() family of functions must |
155 | | * not be passed to av_realloc(). The former can be implemented using |
156 | | * memalign() (or other functions), and there is no guarantee that |
157 | | * pointers from such functions can be passed to realloc() at all. |
158 | | * The situation is undefined according to POSIX and may crash with |
159 | | * some libc implementations. |
160 | | */ |
161 | | av_alloc_size(2, 3) void *av_realloc_array(void *ptr, size_t nmemb, size_t size); |
162 | | |
163 | | /** |
164 | | * Allocate or reallocate an array through a pointer to a pointer. |
165 | | * If *ptr is NULL and nmemb > 0, allocate a new block. If |
166 | | * nmemb is zero, free the memory block pointed to by ptr. |
167 | | * @param ptr Pointer to a pointer to a memory block already allocated |
168 | | * with av_realloc(), or pointer to a pointer to NULL. |
169 | | * The pointer is updated on success, or freed on failure. |
170 | | * @param nmemb Number of elements |
171 | | * @param size Size of the single element |
172 | | * @return Zero on success, an AVERROR error code on failure. |
173 | | * @warning Pointers originating from the av_malloc() family of functions must |
174 | | * not be passed to av_realloc(). The former can be implemented using |
175 | | * memalign() (or other functions), and there is no guarantee that |
176 | | * pointers from such functions can be passed to realloc() at all. |
177 | | * The situation is undefined according to POSIX and may crash with |
178 | | * some libc implementations. |
179 | | */ |
180 | | av_alloc_size(2, 3) int av_reallocp_array(void *ptr, size_t nmemb, size_t size); |
181 | | |
182 | | /** |
183 | | * Free a memory block which has been allocated with av_malloc(z)() or |
184 | | * av_realloc(). |
185 | | * @param ptr Pointer to the memory block which should be freed. |
186 | | * @note ptr = NULL is explicitly allowed. |
187 | | * @note It is recommended that you use av_freep() instead. |
188 | | * @see av_freep() |
189 | | */ |
190 | | void av_free(void *ptr); |
191 | | |
192 | | /** |
193 | | * Allocate a block of size bytes with alignment suitable for all |
194 | | * memory accesses (including vectors if available on the CPU) and |
195 | | * zero all the bytes of the block. |
196 | | * @param size Size in bytes for the memory block to be allocated. |
197 | | * @return Pointer to the allocated block, NULL if it cannot be allocated. |
198 | | * @see av_malloc() |
199 | | */ |
200 | | void *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1); |
201 | | |
202 | | /** |
203 | | * Allocate a block of nmemb * size bytes with alignment suitable for all |
204 | | * memory accesses (including vectors if available on the CPU) and |
205 | | * zero all the bytes of the block. |
206 | | * The allocation will fail if nmemb * size is greater than or equal |
207 | | * to INT_MAX. |
208 | | * @param nmemb |
209 | | * @param size |
210 | | * @return Pointer to the allocated block, NULL if it cannot be allocated. |
211 | | */ |
212 | | void *av_calloc(size_t nmemb, size_t size) av_malloc_attrib; |
213 | | |
214 | | /** |
215 | | * Allocate a block of size * nmemb bytes with av_mallocz(). |
216 | | * @param nmemb Number of elements |
217 | | * @param size Size of the single element |
218 | | * @return Pointer to the allocated block, NULL if the block cannot |
219 | | * be allocated. |
220 | | * @see av_mallocz() |
221 | | * @see av_malloc_array() |
222 | | */ |
223 | | av_alloc_size(1, 2) void *av_mallocz_array(size_t nmemb, size_t size); |
224 | | |
225 | | /** |
226 | | * Duplicate the string s. |
227 | | * @param s string to be duplicated |
228 | | * @return Pointer to a newly-allocated string containing a |
229 | | * copy of s or NULL if the string cannot be allocated. |
230 | | */ |
231 | | char *av_strdup(const char *s) av_malloc_attrib; |
232 | | |
233 | | /** |
234 | | * Duplicate a substring of the string s. |
235 | | * @param s string to be duplicated |
236 | | * @param len the maximum length of the resulting string (not counting the |
237 | | * terminating byte). |
238 | | * @return Pointer to a newly-allocated string containing a |
239 | | * copy of s or NULL if the string cannot be allocated. |
240 | | */ |
241 | | char *av_strndup(const char *s, size_t len) av_malloc_attrib; |
242 | | |
243 | | /** |
244 | | * Duplicate the buffer p. |
245 | | * @param p buffer to be duplicated |
246 | | * @return Pointer to a newly allocated buffer containing a |
247 | | * copy of p or NULL if the buffer cannot be allocated. |
248 | | */ |
249 | | void *av_memdup(const void *p, size_t size); |
250 | | |
251 | | /** |
252 | | * Free a memory block which has been allocated with av_malloc(z)() or |
253 | | * av_realloc() and set the pointer pointing to it to NULL. |
254 | | * @param ptr Pointer to the pointer to the memory block which should |
255 | | * be freed. |
256 | | * @note passing a pointer to a NULL pointer is safe and leads to no action. |
257 | | * @see av_free() |
258 | | */ |
259 | | void av_freep(void *ptr); |
260 | | |
261 | | /** |
262 | | * Add an element to a dynamic array. |
263 | | * |
264 | | * The array to grow is supposed to be an array of pointers to |
265 | | * structures, and the element to add must be a pointer to an already |
266 | | * allocated structure. |
267 | | * |
268 | | * The array is reallocated when its size reaches powers of 2. |
269 | | * Therefore, the amortized cost of adding an element is constant. |
270 | | * |
271 | | * In case of success, the pointer to the array is updated in order to |
272 | | * point to the new grown array, and the number pointed to by nb_ptr |
273 | | * is incremented. |
274 | | * In case of failure, the array is freed, *tab_ptr is set to NULL and |
275 | | * *nb_ptr is set to 0. |
276 | | * |
277 | | * @param tab_ptr pointer to the array to grow |
278 | | * @param nb_ptr pointer to the number of elements in the array |
279 | | * @param elem element to add |
280 | | * @see av_dynarray_add_nofree(), av_dynarray2_add() |
281 | | */ |
282 | | void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem); |
283 | | |
284 | | /** |
285 | | * Add an element to a dynamic array. |
286 | | * |
287 | | * Function has the same functionality as av_dynarray_add(), |
288 | | * but it doesn't free memory on fails. It returns error code |
289 | | * instead and leave current buffer untouched. |
290 | | * |
291 | | * @param tab_ptr pointer to the array to grow |
292 | | * @param nb_ptr pointer to the number of elements in the array |
293 | | * @param elem element to add |
294 | | * @return >=0 on success, negative otherwise. |
295 | | * @see av_dynarray_add(), av_dynarray2_add() |
296 | | */ |
297 | | int av_dynarray_add_nofree(void *tab_ptr, int *nb_ptr, void *elem); |
298 | | |
299 | | /** |
300 | | * Add an element of size elem_size to a dynamic array. |
301 | | * |
302 | | * The array is reallocated when its number of elements reaches powers of 2. |
303 | | * Therefore, the amortized cost of adding an element is constant. |
304 | | * |
305 | | * In case of success, the pointer to the array is updated in order to |
306 | | * point to the new grown array, and the number pointed to by nb_ptr |
307 | | * is incremented. |
308 | | * In case of failure, the array is freed, *tab_ptr is set to NULL and |
309 | | * *nb_ptr is set to 0. |
310 | | * |
311 | | * @param tab_ptr pointer to the array to grow |
312 | | * @param nb_ptr pointer to the number of elements in the array |
313 | | * @param elem_size size in bytes of the elements in the array |
314 | | * @param elem_data pointer to the data of the element to add. If NULL, the space of |
315 | | * the new added element is not filled. |
316 | | * @return pointer to the data of the element to copy in the new allocated space. |
317 | | * If NULL, the new allocated space is left uninitialized." |
318 | | * @see av_dynarray_add(), av_dynarray_add_nofree() |
319 | | */ |
320 | | void *av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size, |
321 | | const uint8_t *elem_data); |
322 | | |
323 | | /** |
324 | | * Multiply two size_t values checking for overflow. |
325 | | * @return 0 if success, AVERROR(EINVAL) if overflow. |
326 | | */ |
327 | | static inline int av_size_mult(size_t a, size_t b, size_t *r) |
328 | 0 | { |
329 | 0 | size_t t = a * b; |
330 | | /* Hack inspired from glibc: only try the division if nelem and elsize |
331 | | * are both greater than sqrt(SIZE_MAX). */ |
332 | 0 | if ((a | b) >= ((size_t)1 << (sizeof(size_t) * 4)) && a && t / a != b) |
333 | 0 | return AVERROR(EINVAL); |
334 | 0 | *r = t; |
335 | 0 | return 0; |
336 | 0 | } Unexecuted instantiation: hevc_cabac.c:av_size_mult Unexecuted instantiation: hevc_filter.c:av_size_mult Unexecuted instantiation: hevc.c:av_size_mult Unexecuted instantiation: hevcpred.c:av_size_mult Unexecuted instantiation: hevc_refs.c:av_size_mult Unexecuted instantiation: hevcdsp.c:av_size_mult Unexecuted instantiation: hevc_mvs.c:av_size_mult Unexecuted instantiation: hevc_ps.c:av_size_mult Unexecuted instantiation: hevc_sei.c:av_size_mult Unexecuted instantiation: utils.c:av_size_mult Unexecuted instantiation: cabac.c:av_size_mult Unexecuted instantiation: golomb.c:av_size_mult Unexecuted instantiation: videodsp.c:av_size_mult Unexecuted instantiation: mem.c:av_size_mult Unexecuted instantiation: buffer.c:av_size_mult Unexecuted instantiation: frame.c:av_size_mult Unexecuted instantiation: pixdesc.c:av_size_mult Unexecuted instantiation: md5.c:av_size_mult Unexecuted instantiation: libbpg.c:av_size_mult |
337 | | |
338 | | /** |
339 | | * Set the maximum size that may me allocated in one block. |
340 | | */ |
341 | | void av_max_alloc(size_t max); |
342 | | |
343 | | /** |
344 | | * deliberately overlapping memcpy implementation |
345 | | * @param dst destination buffer |
346 | | * @param back how many bytes back we start (the initial size of the overlapping window), must be > 0 |
347 | | * @param cnt number of bytes to copy, must be >= 0 |
348 | | * |
349 | | * cnt > back is valid, this will copy the bytes we just copied, |
350 | | * thus creating a repeating pattern with a period length of back. |
351 | | */ |
352 | | void av_memcpy_backptr(uint8_t *dst, int back, int cnt); |
353 | | |
354 | | /** |
355 | | * Reallocate the given block if it is not large enough, otherwise do nothing. |
356 | | * |
357 | | * @see av_realloc |
358 | | */ |
359 | | void *av_fast_realloc(void *ptr, unsigned int *size, size_t min_size); |
360 | | |
361 | | /** |
362 | | * Allocate a buffer, reusing the given one if large enough. |
363 | | * |
364 | | * Contrary to av_fast_realloc the current buffer contents might not be |
365 | | * preserved and on error the old buffer is freed, thus no special |
366 | | * handling to avoid memleaks is necessary. |
367 | | * |
368 | | * @param ptr pointer to pointer to already allocated buffer, overwritten with pointer to new buffer |
369 | | * @param size size of the buffer *ptr points to |
370 | | * @param min_size minimum size of *ptr buffer after returning, *ptr will be NULL and |
371 | | * *size 0 if an error occurred. |
372 | | */ |
373 | | void av_fast_malloc(void *ptr, unsigned int *size, size_t min_size); |
374 | | |
375 | | /** |
376 | | * @} |
377 | | */ |
378 | | |
379 | | #endif /* AVUTIL_MEM_H */ |