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