Commit | Line | Data |
---|---|---|
04d7f601 DB |
1 | /* |
2 | * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at> | |
3 | * | |
b78e7197 DB |
4 | * This file is part of FFmpeg. |
5 | * | |
6 | * FFmpeg is free software; you can redistribute it and/or | |
04d7f601 DB |
7 | * modify it under the terms of the GNU Lesser General Public |
8 | * License as published by the Free Software Foundation; either | |
b78e7197 | 9 | * version 2.1 of the License, or (at your option) any later version. |
04d7f601 | 10 | * |
b78e7197 | 11 | * FFmpeg is distributed in the hope that it will be useful, |
04d7f601 DB |
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 | |
b78e7197 | 17 | * License along with FFmpeg; if not, write to the Free Software |
04d7f601 DB |
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
19 | */ | |
20 | ||
983e3246 MN |
21 | /** |
22 | * @file common.h | |
7ce68923 | 23 | * common internal and external API header |
983e3246 MN |
24 | */ |
25 | ||
98790382 SS |
26 | #ifndef AVUTIL_COMMON_H |
27 | #define AVUTIL_COMMON_H | |
de6d9b64 | 28 | |
1845bf1f MR |
29 | #include <inttypes.h> |
30 | ||
420b073b | 31 | #ifdef HAVE_AV_CONFIG_H |
1a565432 | 32 | /* only include the following when compiling package */ |
9b59c92f MN |
33 | # include "config.h" |
34 | ||
35 | # include <stdlib.h> | |
36 | # include <stdio.h> | |
37 | # include <string.h> | |
56c4a184 | 38 | # include <ctype.h> |
9ff18a70 | 39 | # include <limits.h> |
8fa36ae0 | 40 | # include <errno.h> |
9b59c92f | 41 | # include <math.h> |
849f1035 MR |
42 | #endif /* HAVE_AV_CONFIG_H */ |
43 | ||
52476c1b CEH |
44 | #define AV_GCC_VERSION_AT_LEAST(x,y) (defined(__GNUC__) && (__GNUC__ > x || __GNUC__ == x && __GNUC_MINOR__ >= y)) |
45 | ||
849f1035 | 46 | #ifndef av_always_inline |
52476c1b | 47 | #if AV_GCC_VERSION_AT_LEAST(3,1) |
849f1035 MR |
48 | # define av_always_inline __attribute__((always_inline)) inline |
49 | #else | |
50 | # define av_always_inline inline | |
b9c684a2 AJ |
51 | #endif |
52 | #endif | |
53 | ||
54 | #ifndef av_noinline | |
52476c1b | 55 | #if AV_GCC_VERSION_AT_LEAST(3,1) |
b9c684a2 AJ |
56 | # define av_noinline __attribute__((noinline)) |
57 | #else | |
410bf273 | 58 | # define av_noinline |
849f1035 MR |
59 | #endif |
60 | #endif | |
61 | ||
85074d3c | 62 | #ifndef av_pure |
52476c1b | 63 | #if AV_GCC_VERSION_AT_LEAST(3,1) |
85074d3c ZM |
64 | # define av_pure __attribute__((pure)) |
65 | #else | |
66 | # define av_pure | |
67 | #endif | |
68 | #endif | |
69 | ||
70 | #ifndef av_const | |
52476c1b | 71 | #if AV_GCC_VERSION_AT_LEAST(2,6) |
85074d3c ZM |
72 | # define av_const __attribute__((const)) |
73 | #else | |
74 | # define av_const | |
75 | #endif | |
76 | #endif | |
77 | ||
98a6fff9 | 78 | #ifndef av_cold |
af4c0bcb | 79 | #if (!defined(__ICC) || __ICC > 1100) && AV_GCC_VERSION_AT_LEAST(4,3) |
98a6fff9 ZM |
80 | # define av_cold __attribute__((cold)) |
81 | #else | |
82 | # define av_cold | |
83 | #endif | |
84 | #endif | |
85 | ||
955ab9a4 | 86 | #ifndef attribute_deprecated |
52476c1b | 87 | #if AV_GCC_VERSION_AT_LEAST(3,1) |
955ab9a4 MN |
88 | # define attribute_deprecated __attribute__((deprecated)) |
89 | #else | |
90 | # define attribute_deprecated | |
91 | #endif | |
92 | #endif | |
93 | ||
154e30f6 CEH |
94 | #ifndef av_unused |
95 | #if defined(__GNUC__) | |
96 | # define av_unused __attribute__((unused)) | |
97 | #else | |
98 | # define av_unused | |
99 | #endif | |
100 | #endif | |
101 | ||
792098c2 PI |
102 | #include "mem.h" |
103 | ||
073b013d | 104 | //rounded divison & shift |
10f3005f | 105 | #define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b)) |
d7e9533a MN |
106 | /* assume b>0 */ |
107 | #define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b)) | |
c26abfa5 | 108 | #define FFABS(a) ((a) >= 0 ? (a) : (-(a))) |
02305ff3 | 109 | #define FFSIGN(a) ((a) > 0 ? 1 : -1) |
75460b0c | 110 | |
b8a78f41 | 111 | #define FFMAX(a,b) ((a) > (b) ? (a) : (b)) |
159ef4b0 | 112 | #define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c) |
b8a78f41 | 113 | #define FFMIN(a,b) ((a) > (b) ? (b) : (a)) |
b842ecbe | 114 | #define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c) |
d7e9533a | 115 | |
1345f4ed | 116 | #define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0) |
ac809e81 | 117 | #define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0])) |
67eca72d | 118 | |
de6d9b64 | 119 | /* misc math functions */ |
a77caa4d | 120 | extern const uint8_t ff_log2_tab[256]; |
de6d9b64 | 121 | |
85074d3c | 122 | static inline av_const int av_log2(unsigned int v) |
de6d9b64 | 123 | { |
89ef2c29 | 124 | int n = 0; |
de6d9b64 FB |
125 | if (v & 0xffff0000) { |
126 | v >>= 16; | |
127 | n += 16; | |
128 | } | |
129 | if (v & 0xff00) { | |
130 | v >>= 8; | |
131 | n += 8; | |
132 | } | |
c81f0349 MN |
133 | n += ff_log2_tab[v]; |
134 | ||
135 | return n; | |
136 | } | |
137 | ||
85074d3c | 138 | static inline av_const int av_log2_16bit(unsigned int v) |
c81f0349 | 139 | { |
89ef2c29 | 140 | int n = 0; |
c81f0349 MN |
141 | if (v & 0xff00) { |
142 | v >>= 8; | |
143 | n += 8; | |
de6d9b64 | 144 | } |
c81f0349 MN |
145 | n += ff_log2_tab[v]; |
146 | ||
de6d9b64 FB |
147 | return n; |
148 | } | |
149 | ||
77177335 AJ |
150 | /** |
151 | * clip a signed integer value into the amin-amax range | |
152 | * @param a value to clip | |
153 | * @param amin minimum value of the clip range | |
154 | * @param amax maximum value of the clip range | |
c6c36725 | 155 | * @return clipped value |
77177335 | 156 | */ |
85074d3c | 157 | static inline av_const int av_clip(int a, int amin, int amax) |
91029be7 | 158 | { |
27af15dc | 159 | if (a < amin) return amin; |
18769c0a MN |
160 | else if (a > amax) return amax; |
161 | else return a; | |
91029be7 MN |
162 | } |
163 | ||
77177335 AJ |
164 | /** |
165 | * clip a signed integer value into the 0-255 range | |
166 | * @param a value to clip | |
c6c36725 | 167 | * @return clipped value |
77177335 | 168 | */ |
85074d3c | 169 | static inline av_const uint8_t av_clip_uint8(int a) |
3ebc7e04 MN |
170 | { |
171 | if (a&(~255)) return (-a)>>31; | |
172 | else return a; | |
173 | } | |
174 | ||
ddb8ebe7 AJ |
175 | /** |
176 | * clip a signed integer value into the -32768,32767 range | |
177 | * @param a value to clip | |
178 | * @return clipped value | |
179 | */ | |
85074d3c | 180 | static inline av_const int16_t av_clip_int16(int a) |
ddb8ebe7 AJ |
181 | { |
182 | if ((a+32768) & ~65535) return (a>>31) ^ 32767; | |
183 | else return a; | |
184 | } | |
185 | ||
4138ad96 VS |
186 | /** |
187 | * clip a float value into the amin-amax range | |
188 | * @param a value to clip | |
189 | * @param amin minimum value of the clip range | |
190 | * @param amax maximum value of the clip range | |
191 | * @return clipped value | |
192 | */ | |
193 | static inline av_const float av_clipf(float a, float amin, float amax) | |
194 | { | |
195 | if (a < amin) return amin; | |
196 | else if (a > amax) return amax; | |
197 | else return a; | |
198 | } | |
199 | ||
e8750b00 FR |
200 | #define MKTAG(a,b,c,d) (a | (b << 8) | (c << 16) | (d << 24)) |
201 | #define MKBETAG(a,b,c,d) (d | (c << 8) | (b << 16) | (a << 24)) | |
202 | ||
d73427e3 GP |
203 | /*! |
204 | * \def GET_UTF8(val, GET_BYTE, ERROR) | |
90b5b51e | 205 | * converts a UTF-8 character (up to 4 bytes long) to its 32-bit UCS-4 encoded form |
d73427e3 | 206 | * \param val is the output and should be of type uint32_t. It holds the converted |
90b5b51e DB |
207 | * UCS-4 character and should be a left value. |
208 | * \param GET_BYTE gets UTF-8 encoded bytes from any proper source. It can be | |
d73427e3 | 209 | * a function or a statement whose return value or evaluated value is of type |
90b5b51e | 210 | * uint8_t. It will be executed up to 4 times for values in the valid UTF-8 range, |
40a08c7e | 211 | * and up to 7 times in the general case. |
90b5b51e | 212 | * \param ERROR action that should be taken when an invalid UTF-8 byte is returned |
d73427e3 GP |
213 | * from GET_BYTE. It should be a statement that jumps out of the macro, |
214 | * like exit(), goto, return, break, or continue. | |
215 | */ | |
9d82b0dd MN |
216 | #define GET_UTF8(val, GET_BYTE, ERROR)\ |
217 | val= GET_BYTE;\ | |
218 | {\ | |
219 | int ones= 7 - av_log2(val ^ 255);\ | |
220 | if(ones==1)\ | |
221 | ERROR\ | |
222 | val&= 127>>ones;\ | |
223 | while(--ones > 0){\ | |
224 | int tmp= GET_BYTE - 128;\ | |
225 | if(tmp>>6)\ | |
226 | ERROR\ | |
227 | val= (val<<6) + tmp;\ | |
228 | }\ | |
229 | } | |
2ad1516a | 230 | |
0e8c148b | 231 | /*! |
34d33769 | 232 | * \def PUT_UTF8(val, tmp, PUT_BYTE) |
90b5b51e | 233 | * converts a 32-bit unicode character to its UTF-8 encoded form (up to 4 bytes long). |
0e8c148b | 234 | * \param val is an input only argument and should be of type uint32_t. It holds |
90b5b51e | 235 | * a ucs4 encoded unicode character that is to be converted to UTF-8. If |
0e8c148b GP |
236 | * val is given as a function it's executed only once. |
237 | * \param tmp is a temporary variable and should be of type uint8_t. It | |
238 | * represents an intermediate value during conversion that is to be | |
239 | * outputted by PUT_BYTE. | |
90b5b51e | 240 | * \param PUT_BYTE writes the converted UTF-8 bytes to any proper destination. |
0e8c148b GP |
241 | * It could be a function or a statement, and uses tmp as the input byte. |
242 | * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be | |
90b5b51e | 243 | * executed up to 4 times for values in the valid UTF-8 range and up to |
40a08c7e | 244 | * 7 times in the general case, depending on the length of the converted |
0e8c148b GP |
245 | * unicode character. |
246 | */ | |
360932f7 ZM |
247 | #define PUT_UTF8(val, tmp, PUT_BYTE)\ |
248 | {\ | |
249 | int bytes, shift;\ | |
250 | uint32_t in = val;\ | |
251 | if (in < 0x80) {\ | |
252 | tmp = in;\ | |
253 | PUT_BYTE\ | |
254 | } else {\ | |
255 | bytes = (av_log2(in) + 4) / 5;\ | |
256 | shift = (bytes - 1) * 6;\ | |
257 | tmp = (256 - (256 >> bytes)) | (in >> shift);\ | |
258 | PUT_BYTE\ | |
259 | while (shift >= 6) {\ | |
260 | shift -= 6;\ | |
261 | tmp = 0x80 | ((in >> shift) & 0x3f);\ | |
262 | PUT_BYTE\ | |
263 | }\ | |
264 | }\ | |
265 | } | |
266 | ||
6b8b7258 DB |
267 | #ifdef HAVE_AV_CONFIG_H |
268 | # include "internal.h" | |
269 | #endif /* HAVE_AV_CONFIG_H */ | |
270 | ||
98790382 | 271 | #endif /* AVUTIL_COMMON_H */ |