Mercurial > mm7
comparison lib/libavutil/mem.h @ 2134:992d2e6f907d
preparation for libavcodec
author | zipi |
---|---|
date | Tue, 31 Dec 2013 14:52:14 +0000 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
2133:e378232bfd36 | 2134:992d2e6f907d |
---|---|
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 * Helper function to allocate a block of size * nmemb bytes with | |
87 * using av_malloc() | |
88 * @param nmemb Number of elements | |
89 * @param size Size of the single element | |
90 * @return Pointer to the allocated block, NULL if the block cannot | |
91 * be allocated. | |
92 * @see av_malloc() | |
93 */ | |
94 av_alloc_size(1, 2) static inline void *av_malloc_array(size_t nmemb, size_t size) | |
95 { | |
96 if (size <= 0 || nmemb >= INT_MAX / size) | |
97 return NULL; | |
98 return av_malloc(nmemb * size); | |
99 } | |
100 | |
101 /** | |
102 * Allocate or reallocate a block of memory. | |
103 * If ptr is NULL and size > 0, allocate a new block. If | |
104 * size is zero, free the memory block pointed to by ptr. | |
105 * @param ptr Pointer to a memory block already allocated with | |
106 * av_malloc(z)() or av_realloc() or NULL. | |
107 * @param size Size in bytes for the memory block to be allocated or | |
108 * reallocated. | |
109 * @return Pointer to a newly reallocated block or NULL if the block | |
110 * cannot be reallocated or the function is used to free the memory block. | |
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 * Free a memory block which has been allocated with av_malloc(z)() or | |
127 * av_realloc(). | |
128 * @param ptr Pointer to the memory block which should be freed. | |
129 * @note ptr = NULL is explicitly allowed. | |
130 * @note It is recommended that you use av_freep() instead. | |
131 * @see av_freep() | |
132 */ | |
133 void av_free(void *ptr); | |
134 | |
135 /** | |
136 * Allocate a block of size bytes with alignment suitable for all | |
137 * memory accesses (including vectors if available on the CPU) and | |
138 * zero all the bytes of the block. | |
139 * @param size Size in bytes for the memory block to be allocated. | |
140 * @return Pointer to the allocated block, NULL if it cannot be allocated. | |
141 * @see av_malloc() | |
142 */ | |
143 void *av_mallocz(size_t size) av_malloc_attrib av_alloc_size(1); | |
144 | |
145 /** | |
146 * Allocate a block of nmemb * size bytes with alignment suitable for all | |
147 * memory accesses (including vectors if available on the CPU) and | |
148 * zero all the bytes of the block. | |
149 * The allocation will fail if nmemb * size is greater than or equal | |
150 * to INT_MAX. | |
151 * @param nmemb | |
152 * @param size | |
153 * @return Pointer to the allocated block, NULL if it cannot be allocated. | |
154 */ | |
155 void *av_calloc(size_t nmemb, size_t size) av_malloc_attrib; | |
156 | |
157 /** | |
158 * Helper function to allocate a block of size * nmemb bytes with | |
159 * using av_mallocz() | |
160 * @param nmemb Number of elements | |
161 * @param size Size of the single element | |
162 * @return Pointer to the allocated block, NULL if the block cannot | |
163 * be allocated. | |
164 * @see av_mallocz() | |
165 * @see av_malloc_array() | |
166 */ | |
167 av_alloc_size(1, 2) static inline void *av_mallocz_array(size_t nmemb, size_t size) | |
168 { | |
169 if (size <= 0 || nmemb >= INT_MAX / size) | |
170 return NULL; | |
171 return av_mallocz(nmemb * size); | |
172 } | |
173 | |
174 /** | |
175 * Duplicate the string s. | |
176 * @param s string to be duplicated | |
177 * @return Pointer to a newly allocated string containing a | |
178 * copy of s or NULL if the string cannot be allocated. | |
179 */ | |
180 char *av_strdup(const char *s) av_malloc_attrib; | |
181 | |
182 /** | |
183 * Duplicate the buffer p. | |
184 * @param p buffer to be duplicated | |
185 * @return Pointer to a newly allocated buffer containing a | |
186 * copy of p or NULL if the buffer cannot be allocated. | |
187 */ | |
188 void *av_memdup(const void *p, size_t size); | |
189 | |
190 /** | |
191 * Free a memory block which has been allocated with av_malloc(z)() or | |
192 * av_realloc() and set the pointer pointing to it to NULL. | |
193 * @param ptr Pointer to the pointer to the memory block which should | |
194 * be freed. | |
195 * @see av_free() | |
196 */ | |
197 void av_freep(void *ptr); | |
198 | |
199 /** | |
200 * Add an element to a dynamic array. | |
201 * | |
202 * The array to grow is supposed to be an array of pointers to | |
203 * structures, and the element to add must be a pointer to an already | |
204 * allocated structure. | |
205 * | |
206 * The array is reallocated when its size reaches powers of 2. | |
207 * Therefore, the amortized cost of adding an element is constant. | |
208 * | |
209 * In case of success, the pointer to the array is updated in order to | |
210 * point to the new grown array, and the number pointed to by nb_ptr | |
211 * is incremented. | |
212 * In case of failure, the array is freed, *tab_ptr is set to NULL and | |
213 * *nb_ptr is set to 0. | |
214 * | |
215 * @param tab_ptr pointer to the array to grow | |
216 * @param nb_ptr pointer to the number of elements in the array | |
217 * @param elem element to add | |
218 * @see av_dynarray2_add() | |
219 */ | |
220 void av_dynarray_add(void *tab_ptr, int *nb_ptr, void *elem); | |
221 | |
222 /** | |
223 * Add an element of size elem_size to a dynamic array. | |
224 * | |
225 * The array is reallocated when its number of elements reaches powers of 2. | |
226 * Therefore, the amortized cost of adding an element is constant. | |
227 * | |
228 * In case of success, the pointer to the array is updated in order to | |
229 * point to the new grown array, and the number pointed to by nb_ptr | |
230 * is incremented. | |
231 * In case of failure, the array is freed, *tab_ptr is set to NULL and | |
232 * *nb_ptr is set to 0. | |
233 * | |
234 * @param tab_ptr pointer to the array to grow | |
235 * @param nb_ptr pointer to the number of elements in the array | |
236 * @param elem_size size in bytes of the elements in the array | |
237 * @param elem_data pointer to the data of the element to add. If NULL, the space of | |
238 * the new added element is not filled. | |
239 * @return pointer to the data of the element to copy in the new allocated space. | |
240 * If NULL, the new allocated space is left uninitialized." | |
241 * @see av_dynarray_add() | |
242 */ | |
243 void *av_dynarray2_add(void **tab_ptr, int *nb_ptr, size_t elem_size, | |
244 const uint8_t *elem_data); | |
245 | |
246 /** | |
247 * Multiply two size_t values checking for overflow. | |
248 * @return 0 if success, AVERROR(EINVAL) if overflow. | |
249 */ | |
250 static inline int av_size_mult(size_t a, size_t b, size_t *r) | |
251 { | |
252 size_t t = a * b; | |
253 /* Hack inspired from glibc: only try the division if nelem and elsize | |
254 * are both greater than sqrt(SIZE_MAX). */ | |
255 if ((a | b) >= ((size_t)1 << (sizeof(size_t) * 4)) && a && t / a != b) | |
256 return AVERROR(EINVAL); | |
257 *r = t; | |
258 return 0; | |
259 } | |
260 | |
261 /** | |
262 * Set the maximum size that may me allocated in one block. | |
263 */ | |
264 void av_max_alloc(size_t max); | |
265 | |
266 /** | |
267 * @brief deliberately overlapping memcpy implementation | |
268 * @param dst destination buffer | |
269 * @param back how many bytes back we start (the initial size of the overlapping window), must be > 0 | |
270 * @param cnt number of bytes to copy, must be >= 0 | |
271 * | |
272 * cnt > back is valid, this will copy the bytes we just copied, | |
273 * thus creating a repeating pattern with a period length of back. | |
274 */ | |
275 void av_memcpy_backptr(uint8_t *dst, int back, int cnt); | |
276 | |
277 /** | |
278 * @} | |
279 */ | |
280 | |
281 #endif /* AVUTIL_MEM_H */ |