Line | Branch | Exec | 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 | * common internal and external API header | ||
24 | */ | ||
25 | |||
26 | #ifndef AVUTIL_COMMON_H | ||
27 | #define AVUTIL_COMMON_H | ||
28 | |||
29 | #if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) && !defined(UINT64_C) | ||
30 | #error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS | ||
31 | #endif | ||
32 | |||
33 | #include <errno.h> | ||
34 | #include <inttypes.h> | ||
35 | #include <limits.h> | ||
36 | #include <math.h> | ||
37 | #include <stdint.h> | ||
38 | #include <stdio.h> | ||
39 | #include <stdlib.h> | ||
40 | #include <string.h> | ||
41 | |||
42 | #include "attributes.h" | ||
43 | #include "error.h" | ||
44 | #include "macros.h" | ||
45 | #include "version.h" | ||
46 | |||
47 | #ifdef HAVE_AV_CONFIG_H | ||
48 | # include "config.h" | ||
49 | # include "intmath.h" | ||
50 | # include "internal.h" | ||
51 | #else | ||
52 | # include "mem.h" | ||
53 | #endif /* HAVE_AV_CONFIG_H */ | ||
54 | |||
55 | //rounded division & shift | ||
56 | #define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b)) | ||
57 | /* assume b>0 */ | ||
58 | #define ROUNDED_DIV(a,b) (((a)>=0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b)) | ||
59 | /* Fast a/(1<<b) rounded toward +inf. Assume a>=0 and b>=0 */ | ||
60 | #define AV_CEIL_RSHIFT(a,b) (!av_builtin_constant_p(b) ? -((-(a)) >> (b)) \ | ||
61 | : ((a) + (1<<(b)) - 1) >> (b)) | ||
62 | /* Backwards compat. */ | ||
63 | #define FF_CEIL_RSHIFT AV_CEIL_RSHIFT | ||
64 | |||
65 | #define FFUDIV(a,b) (((a)>0 ?(a):(a)-(b)+1) / (b)) | ||
66 | #define FFUMOD(a,b) ((a)-(b)*FFUDIV(a,b)) | ||
67 | |||
68 | /** | ||
69 | * Absolute value, Note, INT_MIN / INT64_MIN result in undefined behavior as they | ||
70 | * are not representable as absolute values of their type. This is the same | ||
71 | * as with *abs() | ||
72 | * @see FFNABS() | ||
73 | */ | ||
74 | #define FFABS(a) ((a) >= 0 ? (a) : (-(a))) | ||
75 | #define FFSIGN(a) ((a) > 0 ? 1 : -1) | ||
76 | |||
77 | /** | ||
78 | * Negative Absolute value. | ||
79 | * this works for all integers of all types. | ||
80 | * As with many macros, this evaluates its argument twice, it thus must not have | ||
81 | * a sideeffect, that is FFNABS(x++) has undefined behavior. | ||
82 | */ | ||
83 | #define FFNABS(a) ((a) <= 0 ? (a) : (-(a))) | ||
84 | |||
85 | /** | ||
86 | * Unsigned Absolute value. | ||
87 | * This takes the absolute value of a signed int and returns it as a unsigned. | ||
88 | * This also works with INT_MIN which would otherwise not be representable | ||
89 | * As with many macros, this evaluates its argument twice. | ||
90 | */ | ||
91 | #define FFABSU(a) ((a) <= 0 ? -(unsigned)(a) : (unsigned)(a)) | ||
92 | #define FFABS64U(a) ((a) <= 0 ? -(uint64_t)(a) : (uint64_t)(a)) | ||
93 | |||
94 | /* misc math functions */ | ||
95 | |||
96 | #ifndef av_ceil_log2 | ||
97 | # define av_ceil_log2 av_ceil_log2_c | ||
98 | #endif | ||
99 | #ifndef av_clip | ||
100 | # define av_clip av_clip_c | ||
101 | #endif | ||
102 | #ifndef av_clip64 | ||
103 | # define av_clip64 av_clip64_c | ||
104 | #endif | ||
105 | #ifndef av_clip_uint8 | ||
106 | # define av_clip_uint8 av_clip_uint8_c | ||
107 | #endif | ||
108 | #ifndef av_clip_int8 | ||
109 | # define av_clip_int8 av_clip_int8_c | ||
110 | #endif | ||
111 | #ifndef av_clip_uint16 | ||
112 | # define av_clip_uint16 av_clip_uint16_c | ||
113 | #endif | ||
114 | #ifndef av_clip_int16 | ||
115 | # define av_clip_int16 av_clip_int16_c | ||
116 | #endif | ||
117 | #ifndef av_clipl_int32 | ||
118 | # define av_clipl_int32 av_clipl_int32_c | ||
119 | #endif | ||
120 | #ifndef av_clip_intp2 | ||
121 | # define av_clip_intp2 av_clip_intp2_c | ||
122 | #endif | ||
123 | #ifndef av_clip_uintp2 | ||
124 | # define av_clip_uintp2 av_clip_uintp2_c | ||
125 | #endif | ||
126 | #ifndef av_sat_add32 | ||
127 | # define av_sat_add32 av_sat_add32_c | ||
128 | #endif | ||
129 | #ifndef av_sat_dadd32 | ||
130 | # define av_sat_dadd32 av_sat_dadd32_c | ||
131 | #endif | ||
132 | #ifndef av_sat_sub32 | ||
133 | # define av_sat_sub32 av_sat_sub32_c | ||
134 | #endif | ||
135 | #ifndef av_sat_dsub32 | ||
136 | # define av_sat_dsub32 av_sat_dsub32_c | ||
137 | #endif | ||
138 | #ifndef av_sat_add64 | ||
139 | # define av_sat_add64 av_sat_add64_c | ||
140 | #endif | ||
141 | #ifndef av_sat_sub64 | ||
142 | # define av_sat_sub64 av_sat_sub64_c | ||
143 | #endif | ||
144 | #ifndef av_clipf | ||
145 | # define av_clipf av_clipf_c | ||
146 | #endif | ||
147 | #ifndef av_clipd | ||
148 | # define av_clipd av_clipd_c | ||
149 | #endif | ||
150 | #ifndef av_zero_extend | ||
151 | # define av_zero_extend av_zero_extend_c | ||
152 | #endif | ||
153 | #ifndef av_popcount | ||
154 | # define av_popcount av_popcount_c | ||
155 | #endif | ||
156 | #ifndef av_popcount64 | ||
157 | # define av_popcount64 av_popcount64_c | ||
158 | #endif | ||
159 | #ifndef av_parity | ||
160 | # define av_parity av_parity_c | ||
161 | #endif | ||
162 | |||
163 | #ifndef av_log2 | ||
164 | av_const int av_log2(unsigned v); | ||
165 | #endif | ||
166 | |||
167 | #ifndef av_log2_16bit | ||
168 | av_const int av_log2_16bit(unsigned v); | ||
169 | #endif | ||
170 | |||
171 | /** | ||
172 | * Clip a signed integer value into the amin-amax range. | ||
173 | * @param a value to clip | ||
174 | * @param amin minimum value of the clip range | ||
175 | * @param amax maximum value of the clip range | ||
176 | * @return clipped value | ||
177 | */ | ||
178 | 13061959669 | static av_always_inline av_const int av_clip_c(int a, int amin, int amax) | |
179 | { | ||
180 | #if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 | ||
181 | if (amin > amax) abort(); | ||
182 | #endif | ||
183 |
2/2✓ Branch 0 taken 547610188 times.
✓ Branch 1 taken 12514349481 times.
|
13061959669 | if (a < amin) return amin; |
184 |
2/2✓ Branch 0 taken 569397519 times.
✓ Branch 1 taken 11944951962 times.
|
12514349481 | else if (a > amax) return amax; |
185 | 11944951962 | else return a; | |
186 | } | ||
187 | |||
188 | /** | ||
189 | * Clip a signed 64bit integer value into the amin-amax range. | ||
190 | * @param a value to clip | ||
191 | * @param amin minimum value of the clip range | ||
192 | * @param amax maximum value of the clip range | ||
193 | * @return clipped value | ||
194 | */ | ||
195 | 30191628 | static av_always_inline av_const int64_t av_clip64_c(int64_t a, int64_t amin, int64_t amax) | |
196 | { | ||
197 | #if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 | ||
198 | if (amin > amax) abort(); | ||
199 | #endif | ||
200 |
2/2✓ Branch 0 taken 144 times.
✓ Branch 1 taken 30191484 times.
|
30191628 | if (a < amin) return amin; |
201 |
2/2✓ Branch 0 taken 1823 times.
✓ Branch 1 taken 30189661 times.
|
30191484 | else if (a > amax) return amax; |
202 | 30189661 | else return a; | |
203 | } | ||
204 | |||
205 | /** | ||
206 | * Clip a signed integer value into the 0-255 range. | ||
207 | * @param a value to clip | ||
208 | * @return clipped value | ||
209 | */ | ||
210 | 32931232943 | static av_always_inline av_const uint8_t av_clip_uint8_c(int a) | |
211 | { | ||
212 |
2/2✓ Branch 0 taken 116930386 times.
✓ Branch 1 taken 32814302557 times.
|
32931232943 | if (a&(~0xFF)) return (~a)>>31; |
213 | 32814302557 | else return a; | |
214 | } | ||
215 | |||
216 | /** | ||
217 | * Clip a signed integer value into the -128,127 range. | ||
218 | * @param a value to clip | ||
219 | * @return clipped value | ||
220 | */ | ||
221 | 7874596 | static av_always_inline av_const int8_t av_clip_int8_c(int a) | |
222 | { | ||
223 |
2/2✓ Branch 0 taken 18 times.
✓ Branch 1 taken 7874578 times.
|
7874596 | if ((a+0x80U) & ~0xFF) return (a>>31) ^ 0x7F; |
224 | 7874578 | else return a; | |
225 | } | ||
226 | |||
227 | /** | ||
228 | * Clip a signed integer value into the 0-65535 range. | ||
229 | * @param a value to clip | ||
230 | * @return clipped value | ||
231 | */ | ||
232 | 733803708 | static av_always_inline av_const uint16_t av_clip_uint16_c(int a) | |
233 | { | ||
234 |
2/2✓ Branch 0 taken 477906 times.
✓ Branch 1 taken 733325802 times.
|
733803708 | if (a&(~0xFFFF)) return (~a)>>31; |
235 | 733325802 | else return a; | |
236 | } | ||
237 | |||
238 | /** | ||
239 | * Clip a signed integer value into the -32768,32767 range. | ||
240 | * @param a value to clip | ||
241 | * @return clipped value | ||
242 | */ | ||
243 | 3570005405 | static av_always_inline av_const int16_t av_clip_int16_c(int a) | |
244 | { | ||
245 |
2/2✓ Branch 0 taken 3226419 times.
✓ Branch 1 taken 3566778986 times.
|
3570005405 | if ((a+0x8000U) & ~0xFFFF) return (a>>31) ^ 0x7FFF; |
246 | 3566778986 | else return a; | |
247 | } | ||
248 | |||
249 | /** | ||
250 | * Clip a signed 64-bit integer value into the -2147483648,2147483647 range. | ||
251 | * @param a value to clip | ||
252 | * @return clipped value | ||
253 | */ | ||
254 | 467407045 | static av_always_inline av_const int32_t av_clipl_int32_c(int64_t a) | |
255 | { | ||
256 |
2/2✓ Branch 0 taken 14567 times.
✓ Branch 1 taken 467392478 times.
|
467407045 | if ((a+UINT64_C(0x80000000)) & ~UINT64_C(0xFFFFFFFF)) return (int32_t)((a>>63) ^ 0x7FFFFFFF); |
257 | 467392478 | else return (int32_t)a; | |
258 | } | ||
259 | |||
260 | /** | ||
261 | * Clip a signed integer into the -(2^p),(2^p-1) range. | ||
262 | * @param a value to clip | ||
263 | * @param p bit position to clip at | ||
264 | * @return clipped value | ||
265 | */ | ||
266 | 195730276 | static av_always_inline av_const int av_clip_intp2_c(int a, int p) | |
267 | { | ||
268 |
2/2✓ Branch 0 taken 363340 times.
✓ Branch 1 taken 195366936 times.
|
195730276 | if (((unsigned)a + (1U << p)) & ~((2U << p) - 1)) |
269 | 363340 | return (a >> 31) ^ ((1 << p) - 1); | |
270 | else | ||
271 | 195366936 | return a; | |
272 | } | ||
273 | |||
274 | /** | ||
275 | * Clip a signed integer to an unsigned power of two range. | ||
276 | * @param a value to clip | ||
277 | * @param p bit position to clip at | ||
278 | * @return clipped value | ||
279 | */ | ||
280 | 11000022363 | static av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p) | |
281 | { | ||
282 |
2/2✓ Branch 0 taken 965579080 times.
✓ Branch 1 taken 10034443283 times.
|
11000022363 | if (a & ~((1U<<p) - 1)) return (~a) >> 31 & ((1U<<p) - 1); |
283 | 10034443283 | else return a; | |
284 | } | ||
285 | |||
286 | /** | ||
287 | * Clear high bits from an unsigned integer starting with specific bit position | ||
288 | * @param a value to clip | ||
289 | * @param p bit position to clip at. Must be between 0 and 31. | ||
290 | * @return clipped value | ||
291 | */ | ||
292 | 1014332264 | static av_always_inline av_const unsigned av_zero_extend_c(unsigned a, unsigned p) | |
293 | { | ||
294 | #if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 | ||
295 |
1/2✗ Branch 0 not taken.
✓ Branch 1 taken 43 times.
|
43 | if (p > 31) abort(); |
296 | #endif | ||
297 | 1014332264 | return a & ((1U << p) - 1); | |
298 | } | ||
299 | |||
300 | #if FF_API_MOD_UINTP2 | ||
301 | #ifndef av_mod_uintp2 | ||
302 | # define av_mod_uintp2 av_mod_uintp2_c | ||
303 | #endif | ||
304 | attribute_deprecated | ||
305 | static av_always_inline av_const unsigned av_mod_uintp2_c(unsigned a, unsigned p) | ||
306 | { | ||
307 | return av_zero_extend_c(a, p); | ||
308 | } | ||
309 | #endif | ||
310 | |||
311 | /** | ||
312 | * Add two signed 32-bit values with saturation. | ||
313 | * | ||
314 | * @param a one value | ||
315 | * @param b another value | ||
316 | * @return sum with signed saturation | ||
317 | */ | ||
318 | 1929578 | static av_always_inline int av_sat_add32_c(int a, int b) | |
319 | { | ||
320 | 1929578 | return av_clipl_int32((int64_t)a + b); | |
321 | } | ||
322 | |||
323 | /** | ||
324 | * Add a doubled value to another value with saturation at both stages. | ||
325 | * | ||
326 | * @param a first value | ||
327 | * @param b value doubled and added to a | ||
328 | * @return sum sat(a + sat(2*b)) with signed saturation | ||
329 | */ | ||
330 | 566200 | static av_always_inline int av_sat_dadd32_c(int a, int b) | |
331 | { | ||
332 | 566200 | return av_sat_add32(a, av_sat_add32(b, b)); | |
333 | } | ||
334 | |||
335 | /** | ||
336 | * Subtract two signed 32-bit values with saturation. | ||
337 | * | ||
338 | * @param a one value | ||
339 | * @param b another value | ||
340 | * @return difference with signed saturation | ||
341 | */ | ||
342 | 1470722 | static av_always_inline int av_sat_sub32_c(int a, int b) | |
343 | { | ||
344 | 1470722 | return av_clipl_int32((int64_t)a - b); | |
345 | } | ||
346 | |||
347 | /** | ||
348 | * Subtract a doubled value from another value with saturation at both stages. | ||
349 | * | ||
350 | * @param a first value | ||
351 | * @param b value doubled and subtracted from a | ||
352 | * @return difference sat(a - sat(2*b)) with signed saturation | ||
353 | */ | ||
354 | static av_always_inline int av_sat_dsub32_c(int a, int b) | ||
355 | { | ||
356 | return av_sat_sub32(a, av_sat_add32(b, b)); | ||
357 | } | ||
358 | |||
359 | /** | ||
360 | * Add two signed 64-bit values with saturation. | ||
361 | * | ||
362 | * @param a one value | ||
363 | * @param b another value | ||
364 | * @return sum with signed saturation | ||
365 | */ | ||
366 | 37446 | static av_always_inline int64_t av_sat_add64_c(int64_t a, int64_t b) { | |
367 | #if (!defined(__INTEL_COMPILER) && AV_GCC_VERSION_AT_LEAST(5,1)) || AV_HAS_BUILTIN(__builtin_add_overflow) | ||
368 | int64_t tmp; | ||
369 |
1/4✓ Branch 0 taken 37446 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
37446 | return !__builtin_add_overflow(a, b, &tmp) ? tmp : (tmp < 0 ? INT64_MAX : INT64_MIN); |
370 | #else | ||
371 | int64_t s = a+(uint64_t)b; | ||
372 | if ((int64_t)(a^b | ~s^b) >= 0) | ||
373 | return INT64_MAX ^ (b >> 63); | ||
374 | return s; | ||
375 | #endif | ||
376 | } | ||
377 | |||
378 | /** | ||
379 | * Subtract two signed 64-bit values with saturation. | ||
380 | * | ||
381 | * @param a one value | ||
382 | * @param b another value | ||
383 | * @return difference with signed saturation | ||
384 | */ | ||
385 | 77305 | static av_always_inline int64_t av_sat_sub64_c(int64_t a, int64_t b) { | |
386 | #if (!defined(__INTEL_COMPILER) && AV_GCC_VERSION_AT_LEAST(5,1)) || AV_HAS_BUILTIN(__builtin_sub_overflow) | ||
387 | int64_t tmp; | ||
388 |
1/4✓ Branch 0 taken 77305 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✗ Branch 3 not taken.
|
77305 | return !__builtin_sub_overflow(a, b, &tmp) ? tmp : (tmp < 0 ? INT64_MAX : INT64_MIN); |
389 | #else | ||
390 | if (b <= 0 && a >= INT64_MAX + b) | ||
391 | return INT64_MAX; | ||
392 | if (b >= 0 && a <= INT64_MIN + b) | ||
393 | return INT64_MIN; | ||
394 | return a - b; | ||
395 | #endif | ||
396 | } | ||
397 | |||
398 | /** | ||
399 | * Clip a float value into the amin-amax range. | ||
400 | * If a is nan or -inf amin will be returned. | ||
401 | * If a is +inf amax will be returned. | ||
402 | * @param a value to clip | ||
403 | * @param amin minimum value of the clip range | ||
404 | * @param amax maximum value of the clip range | ||
405 | * @return clipped value | ||
406 | */ | ||
407 | 196608 | static av_always_inline av_const float av_clipf_c(float a, float amin, float amax) | |
408 | { | ||
409 | #if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 | ||
410 | if (amin > amax) abort(); | ||
411 | #endif | ||
412 |
3/6✓ Branch 0 taken 196608 times.
✗ Branch 1 not taken.
✗ Branch 2 not taken.
✓ Branch 3 taken 196608 times.
✓ Branch 4 taken 196608 times.
✗ Branch 5 not taken.
|
196608 | return FFMIN(FFMAX(a, amin), amax); |
413 | } | ||
414 | |||
415 | /** | ||
416 | * Clip a double value into the amin-amax range. | ||
417 | * If a is nan or -inf amin will be returned. | ||
418 | * If a is +inf amax will be returned. | ||
419 | * @param a value to clip | ||
420 | * @param amin minimum value of the clip range | ||
421 | * @param amax maximum value of the clip range | ||
422 | * @return clipped value | ||
423 | */ | ||
424 | static av_always_inline av_const double av_clipd_c(double a, double amin, double amax) | ||
425 | { | ||
426 | #if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2 | ||
427 | if (amin > amax) abort(); | ||
428 | #endif | ||
429 | return FFMIN(FFMAX(a, amin), amax); | ||
430 | } | ||
431 | |||
432 | /** Compute ceil(log2(x)). | ||
433 | * @param x value used to compute ceil(log2(x)) | ||
434 | * @return computed ceiling of log2(x) | ||
435 | */ | ||
436 | 1134525 | static av_always_inline av_const int av_ceil_log2_c(int x) | |
437 | { | ||
438 | 1134525 | return av_log2((x - 1U) << 1); | |
439 | } | ||
440 | |||
441 | /** | ||
442 | * Count number of bits set to one in x | ||
443 | * @param x value to count bits of | ||
444 | * @return the number of bits set to one in x | ||
445 | */ | ||
446 | 741829 | static av_always_inline av_const int av_popcount_c(uint32_t x) | |
447 | { | ||
448 | 741829 | x -= (x >> 1) & 0x55555555; | |
449 | 741829 | x = (x & 0x33333333) + ((x >> 2) & 0x33333333); | |
450 | 741829 | x = (x + (x >> 4)) & 0x0F0F0F0F; | |
451 | 741829 | x += x >> 8; | |
452 | 741829 | return (x + (x >> 16)) & 0x3F; | |
453 | } | ||
454 | |||
455 | /** | ||
456 | * Count number of bits set to one in x | ||
457 | * @param x value to count bits of | ||
458 | * @return the number of bits set to one in x | ||
459 | */ | ||
460 | 331743 | static av_always_inline av_const int av_popcount64_c(uint64_t x) | |
461 | { | ||
462 | 331743 | return av_popcount((uint32_t)x) + av_popcount((uint32_t)(x >> 32)); | |
463 | } | ||
464 | |||
465 | static av_always_inline av_const int av_parity_c(uint32_t v) | ||
466 | { | ||
467 | return av_popcount(v) & 1; | ||
468 | } | ||
469 | |||
470 | /** | ||
471 | * Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form. | ||
472 | * | ||
473 | * @param val Output value, must be an lvalue of type uint32_t. | ||
474 | * @param GET_BYTE Expression reading one byte from the input. | ||
475 | * Evaluated up to 7 times (4 for the currently | ||
476 | * assigned Unicode range). With a memory buffer | ||
477 | * input, this could be *ptr++, or if you want to make sure | ||
478 | * that *ptr stops at the end of a NULL terminated string then | ||
479 | * *ptr ? *ptr++ : 0 | ||
480 | * @param ERROR Expression to be evaluated on invalid input, | ||
481 | * typically a goto statement. | ||
482 | * | ||
483 | * @warning ERROR should not contain a loop control statement which | ||
484 | * could interact with the internal while loop, and should force an | ||
485 | * exit from the macro code (e.g. through a goto or a return) in order | ||
486 | * to prevent undefined results. | ||
487 | */ | ||
488 | #define GET_UTF8(val, GET_BYTE, ERROR)\ | ||
489 | val= (GET_BYTE);\ | ||
490 | {\ | ||
491 | uint32_t top = (val & 128) >> 1;\ | ||
492 | if ((val & 0xc0) == 0x80 || val >= 0xFE)\ | ||
493 | {ERROR}\ | ||
494 | while (val & top) {\ | ||
495 | unsigned int tmp = (GET_BYTE) - 128;\ | ||
496 | if(tmp>>6)\ | ||
497 | {ERROR}\ | ||
498 | val= (val<<6) + tmp;\ | ||
499 | top <<= 5;\ | ||
500 | }\ | ||
501 | val &= (top << 1) - 1;\ | ||
502 | } | ||
503 | |||
504 | /** | ||
505 | * Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form. | ||
506 | * | ||
507 | * @param val Output value, must be an lvalue of type uint32_t. | ||
508 | * @param GET_16BIT Expression returning two bytes of UTF-16 data converted | ||
509 | * to native byte order. Evaluated one or two times. | ||
510 | * @param ERROR Expression to be evaluated on invalid input, | ||
511 | * typically a goto statement. | ||
512 | */ | ||
513 | #define GET_UTF16(val, GET_16BIT, ERROR)\ | ||
514 | val = (GET_16BIT);\ | ||
515 | {\ | ||
516 | unsigned int hi = val - 0xD800;\ | ||
517 | if (hi < 0x800) {\ | ||
518 | val = (GET_16BIT) - 0xDC00;\ | ||
519 | if (val > 0x3FFU || hi > 0x3FFU)\ | ||
520 | {ERROR}\ | ||
521 | val += (hi<<10) + 0x10000;\ | ||
522 | }\ | ||
523 | }\ | ||
524 | |||
525 | /** | ||
526 | * @def PUT_UTF8(val, tmp, PUT_BYTE) | ||
527 | * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long). | ||
528 | * @param val is an input-only argument and should be of type uint32_t. It holds | ||
529 | * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If | ||
530 | * val is given as a function it is executed only once. | ||
531 | * @param tmp is a temporary variable and should be of type uint8_t. It | ||
532 | * represents an intermediate value during conversion that is to be | ||
533 | * output by PUT_BYTE. | ||
534 | * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination. | ||
535 | * It could be a function or a statement, and uses tmp as the input byte. | ||
536 | * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be | ||
537 | * executed up to 4 times for values in the valid UTF-8 range and up to | ||
538 | * 7 times in the general case, depending on the length of the converted | ||
539 | * Unicode character. | ||
540 | */ | ||
541 | #define PUT_UTF8(val, tmp, PUT_BYTE)\ | ||
542 | {\ | ||
543 | int bytes, shift;\ | ||
544 | uint32_t in = val;\ | ||
545 | if (in < 0x80) {\ | ||
546 | tmp = in;\ | ||
547 | PUT_BYTE\ | ||
548 | } else {\ | ||
549 | bytes = (av_log2(in) + 4) / 5;\ | ||
550 | shift = (bytes - 1) * 6;\ | ||
551 | tmp = (256 - (256 >> bytes)) | (in >> shift);\ | ||
552 | PUT_BYTE\ | ||
553 | while (shift >= 6) {\ | ||
554 | shift -= 6;\ | ||
555 | tmp = 0x80 | ((in >> shift) & 0x3f);\ | ||
556 | PUT_BYTE\ | ||
557 | }\ | ||
558 | }\ | ||
559 | } | ||
560 | |||
561 | /** | ||
562 | * @def PUT_UTF16(val, tmp, PUT_16BIT) | ||
563 | * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes). | ||
564 | * @param val is an input-only argument and should be of type uint32_t. It holds | ||
565 | * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If | ||
566 | * val is given as a function it is executed only once. | ||
567 | * @param tmp is a temporary variable and should be of type uint16_t. It | ||
568 | * represents an intermediate value during conversion that is to be | ||
569 | * output by PUT_16BIT. | ||
570 | * @param PUT_16BIT writes the converted UTF-16 data to any proper destination | ||
571 | * in desired endianness. It could be a function or a statement, and uses tmp | ||
572 | * as the input byte. For example, PUT_BYTE could be "*output++ = tmp;" | ||
573 | * PUT_BYTE will be executed 1 or 2 times depending on input character. | ||
574 | */ | ||
575 | #define PUT_UTF16(val, tmp, PUT_16BIT)\ | ||
576 | {\ | ||
577 | uint32_t in = val;\ | ||
578 | if (in < 0x10000) {\ | ||
579 | tmp = in;\ | ||
580 | PUT_16BIT\ | ||
581 | } else {\ | ||
582 | tmp = 0xD800 | ((in - 0x10000) >> 10);\ | ||
583 | PUT_16BIT\ | ||
584 | tmp = 0xDC00 | ((in - 0x10000) & 0x3FF);\ | ||
585 | PUT_16BIT\ | ||
586 | }\ | ||
587 | }\ | ||
588 | |||
589 | #endif /* AVUTIL_COMMON_H */ | ||
590 |