ffmpeg / libavutil / common.h @ 410bf273
History | View | Annotate | Download (8.79 KB)
1 | 04d7f601 | Diego Biurrun | /*
|
---|---|---|---|
2 | * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
|
||
3 | *
|
||
4 | b78e7197 | Diego Biurrun | * This file is part of FFmpeg.
|
5 | *
|
||
6 | * FFmpeg is free software; you can redistribute it and/or
|
||
7 | 04d7f601 | Diego Biurrun | * modify it under the terms of the GNU Lesser General Public
|
8 | * License as published by the Free Software Foundation; either
|
||
9 | b78e7197 | Diego Biurrun | * version 2.1 of the License, or (at your option) any later version.
|
10 | 04d7f601 | Diego Biurrun | *
|
11 | b78e7197 | Diego Biurrun | * FFmpeg is distributed in the hope that it will be useful,
|
12 | 04d7f601 | Diego Biurrun | * 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 | b78e7197 | Diego Biurrun | * License along with FFmpeg; if not, write to the Free Software
|
18 | 04d7f601 | Diego Biurrun | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
|
19 | */
|
||
20 | |||
21 | 983e3246 | Michael Niedermayer | /**
|
22 | * @file common.h
|
||
23 | 05020c89 | Reimar Döffinger | * common internal and external api header.
|
24 | 983e3246 | Michael Niedermayer | */
|
25 | |||
26 | de6d9b64 | Fabrice Bellard | #ifndef COMMON_H
|
27 | #define COMMON_H
|
||
28 | |||
29 | 1845bf1f | Måns Rullgård | #include <inttypes.h> |
30 | |||
31 | 420b073b | Fabrice Bellard | #ifdef HAVE_AV_CONFIG_H
|
32 | 1a565432 | Fabrice Bellard | /* only include the following when compiling package */
|
33 | 9b59c92f | Michael Niedermayer | # include "config.h" |
34 | |||
35 | # include <stdlib.h> |
||
36 | # include <stdio.h> |
||
37 | # include <string.h> |
||
38 | 56c4a184 | Fabrice Bellard | # include <ctype.h> |
39 | 9ff18a70 | Michael Niedermayer | # include <limits.h> |
40 | 8fa36ae0 | François Revol | # include <errno.h> |
41 | 9b59c92f | Michael Niedermayer | # include <math.h> |
42 | 849f1035 | Måns Rullgård | #endif /* HAVE_AV_CONFIG_H */ |
43 | |||
44 | #ifndef av_always_inline
|
||
45 | #if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0) |
||
46 | # define av_always_inline __attribute__((always_inline)) inline |
||
47 | 410bf273 | Michael Niedermayer | # define av_noinline __attribute__((noinline))
|
48 | 849f1035 | Måns Rullgård | #else
|
49 | # define av_always_inline inline |
||
50 | 410bf273 | Michael Niedermayer | # define av_noinline
|
51 | 849f1035 | Måns Rullgård | #endif
|
52 | #endif
|
||
53 | |||
54 | #ifdef HAVE_AV_CONFIG_H
|
||
55 | 1845bf1f | Måns Rullgård | # include "internal.h" |
56 | 44f27b3a | Fabrice Bellard | #endif /* HAVE_AV_CONFIG_H */ |
57 | 1a565432 | Fabrice Bellard | |
58 | 955ab9a4 | Michael Niedermayer | #ifndef attribute_deprecated
|
59 | #if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0) |
||
60 | # define attribute_deprecated __attribute__((deprecated))
|
||
61 | #else
|
||
62 | # define attribute_deprecated
|
||
63 | #endif
|
||
64 | #endif
|
||
65 | |||
66 | 8da9266c | Måns Rullgård | #ifndef INT64_C
|
67 | #define INT64_C(c) (c ## LL) |
||
68 | #define UINT64_C(c) (c ## ULL) |
||
69 | 0339e2b4 | Måns Rullgård | #endif
|
70 | 1a565432 | Fabrice Bellard | |
71 | 073b013d | Michael Niedermayer | //rounded divison & shift
|
72 | 10f3005f | Michael Niedermayer | #define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b)) |
73 | d7e9533a | Michael Niedermayer | /* assume b>0 */
|
74 | #define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b)) |
||
75 | c26abfa5 | Diego Biurrun | #define FFABS(a) ((a) >= 0 ? (a) : (-(a))) |
76 | 02305ff3 | Diego Biurrun | #define FFSIGN(a) ((a) > 0 ? 1 : -1) |
77 | 75460b0c | Michael Niedermayer | |
78 | b8a78f41 | Michael Niedermayer | #define FFMAX(a,b) ((a) > (b) ? (a) : (b))
|
79 | #define FFMIN(a,b) ((a) > (b) ? (b) : (a))
|
||
80 | d7e9533a | Michael Niedermayer | |
81 | 1345f4ed | Diego Biurrun | #define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0) |
82 | 67eca72d | Michael Niedermayer | |
83 | de6d9b64 | Fabrice Bellard | /* misc math functions */
|
84 | a77caa4d | Måns Rullgård | extern const uint8_t ff_log2_tab[256]; |
85 | de6d9b64 | Fabrice Bellard | |
86 | a822a479 | Nick Kurshev | static inline int av_log2(unsigned int v) |
87 | de6d9b64 | Fabrice Bellard | { |
88 | int n;
|
||
89 | |||
90 | n = 0;
|
||
91 | if (v & 0xffff0000) { |
||
92 | v >>= 16;
|
||
93 | n += 16;
|
||
94 | } |
||
95 | if (v & 0xff00) { |
||
96 | v >>= 8;
|
||
97 | n += 8;
|
||
98 | } |
||
99 | c81f0349 | Michael Niedermayer | n += ff_log2_tab[v]; |
100 | |||
101 | return n;
|
||
102 | } |
||
103 | |||
104 | static inline int av_log2_16bit(unsigned int v) |
||
105 | { |
||
106 | int n;
|
||
107 | |||
108 | n = 0;
|
||
109 | if (v & 0xff00) { |
||
110 | v >>= 8;
|
||
111 | n += 8;
|
||
112 | de6d9b64 | Fabrice Bellard | } |
113 | c81f0349 | Michael Niedermayer | n += ff_log2_tab[v]; |
114 | |||
115 | de6d9b64 | Fabrice Bellard | return n;
|
116 | } |
||
117 | |||
118 | 45870f57 | Michael Niedermayer | /* median of 3 */
|
119 | static inline int mid_pred(int a, int b, int c) |
||
120 | { |
||
121 | d0b456ba | Christophe Mutricy | #ifdef HAVE_CMOV
|
122 | 7e611a0e | Loren Merritt | int i=b;
|
123 | 93a319f1 | Loren Merritt | asm volatile( |
124 | 7e611a0e | Loren Merritt | "cmp %2, %1 \n\t"
|
125 | "cmovg %1, %0 \n\t"
|
||
126 | "cmovg %2, %1 \n\t"
|
||
127 | "cmp %3, %1 \n\t"
|
||
128 | 93a319f1 | Loren Merritt | "cmovl %3, %1 \n\t"
|
129 | 7e611a0e | Loren Merritt | "cmp %1, %0 \n\t"
|
130 | "cmovg %1, %0 \n\t"
|
||
131 | :"+&r"(i), "+&r"(a) |
||
132 | :"r"(b), "r"(c) |
||
133 | 93a319f1 | Loren Merritt | ); |
134 | return i;
|
||
135 | #elif 0 |
||
136 | 7a62e94a | Michael Niedermayer | int t= (a-b)&((a-b)>>31); |
137 | a-=t; |
||
138 | b+=t; |
||
139 | b-= (b-c)&((b-c)>>31);
|
||
140 | b+= (a-b)&((a-b)>>31);
|
||
141 | |||
142 | return b;
|
||
143 | #else
|
||
144 | if(a>b){
|
||
145 | if(c>b){
|
||
146 | if(c>a) b=a;
|
||
147 | else b=c;
|
||
148 | } |
||
149 | }else{
|
||
150 | if(b>c){
|
||
151 | if(c>a) b=c;
|
||
152 | else b=a;
|
||
153 | } |
||
154 | } |
||
155 | return b;
|
||
156 | #endif
|
||
157 | 45870f57 | Michael Niedermayer | } |
158 | |||
159 | 77177335 | Aurelien Jacobs | /**
|
160 | * clip a signed integer value into the amin-amax range
|
||
161 | * @param a value to clip
|
||
162 | * @param amin minimum value of the clip range
|
||
163 | * @param amax maximum value of the clip range
|
||
164 | c6c36725 | Diego Biurrun | * @return clipped value
|
165 | 77177335 | Aurelien Jacobs | */
|
166 | 91029be7 | Michael Niedermayer | static inline int clip(int a, int amin, int amax) |
167 | { |
||
168 | 18769c0a | Michael Niedermayer | if (a < amin) return amin; |
169 | else if (a > amax) return amax; |
||
170 | else return a; |
||
171 | 91029be7 | Michael Niedermayer | } |
172 | |||
173 | 77177335 | Aurelien Jacobs | /**
|
174 | * clip a signed integer value into the 0-255 range
|
||
175 | * @param a value to clip
|
||
176 | c6c36725 | Diego Biurrun | * @return clipped value
|
177 | 77177335 | Aurelien Jacobs | */
|
178 | 3a1fda0a | Panagiotis Issaris | static inline uint8_t clip_uint8(int a) |
179 | 3ebc7e04 | Michael Niedermayer | { |
180 | if (a&(~255)) return (-a)>>31; |
||
181 | else return a; |
||
182 | } |
||
183 | |||
184 | 9dbcbd92 | Michael Niedermayer | /* math */
|
185 | 14bea432 | Michael Niedermayer | int64_t ff_gcd(int64_t a, int64_t b); |
186 | 9dbcbd92 | Michael Niedermayer | |
187 | 202ef8b8 | Michael Niedermayer | /**
|
188 | * converts fourcc string to int
|
||
189 | */
|
||
190 | 6a85ec8d | Zdenek Kabelac | static inline int ff_get_fourcc(const char *s){ |
191 | 05020c89 | Reimar Döffinger | #ifdef HAVE_AV_CONFIG_H
|
192 | 202ef8b8 | Michael Niedermayer | assert( strlen(s)==4 );
|
193 | 05020c89 | Reimar Döffinger | #endif
|
194 | 966df5b6 | Mike Melanson | |
195 | 202ef8b8 | Michael Niedermayer | return (s[0]) + (s[1]<<8) + (s[2]<<16) + (s[3]<<24); |
196 | } |
||
197 | |||
198 | e8750b00 | Fred Rothganger | #define MKTAG(a,b,c,d) (a | (b << 8) | (c << 16) | (d << 24)) |
199 | #define MKBETAG(a,b,c,d) (d | (c << 8) | (b << 16) | (a << 24)) |
||
200 | |||
201 | d73427e3 | Guillaume Poirier | /*!
|
202 | * \def GET_UTF8(val, GET_BYTE, ERROR)
|
||
203 | * converts a utf-8 character (up to 4 bytes long) to its 32-bit ucs-4 encoded form
|
||
204 | * \param val is the output and should be of type uint32_t. It holds the converted
|
||
205 | * ucs-4 character and should be a left value.
|
||
206 | * \param GET_BYTE gets utf-8 encoded bytes from any proper source. It can be
|
||
207 | * a function or a statement whose return value or evaluated value is of type
|
||
208 | 40a08c7e | Reimar Döffinger | * uint8_t. It will be executed up to 4 times for values in the valid utf-8 range,
|
209 | * and up to 7 times in the general case.
|
||
210 | d73427e3 | Guillaume Poirier | * \param ERROR action that should be taken when an invalid utf-8 byte is returned
|
211 | * from GET_BYTE. It should be a statement that jumps out of the macro,
|
||
212 | * like exit(), goto, return, break, or continue.
|
||
213 | */
|
||
214 | 9d82b0dd | Michael Niedermayer | #define GET_UTF8(val, GET_BYTE, ERROR)\
|
215 | val= GET_BYTE;\ |
||
216 | {\ |
||
217 | int ones= 7 - av_log2(val ^ 255);\ |
||
218 | if(ones==1)\ |
||
219 | ERROR\ |
||
220 | val&= 127>>ones;\
|
||
221 | while(--ones > 0){\ |
||
222 | int tmp= GET_BYTE - 128;\ |
||
223 | if(tmp>>6)\ |
||
224 | ERROR\ |
||
225 | val= (val<<6) + tmp;\
|
||
226 | }\ |
||
227 | } |
||
228 | 2ad1516a | Michael Niedermayer | |
229 | 0e8c148b | Guillaume Poirier | /*!
|
230 | 34d33769 | Guillaume Poirier | * \def PUT_UTF8(val, tmp, PUT_BYTE)
|
231 | d73427e3 | Guillaume Poirier | * converts a 32-bit unicode character to its utf-8 encoded form (up to 4 bytes long).
|
232 | 0e8c148b | Guillaume Poirier | * \param val is an input only argument and should be of type uint32_t. It holds
|
233 | * a ucs4 encoded unicode character that is to be converted to utf-8. If
|
||
234 | * val is given as a function it's executed only once.
|
||
235 | * \param tmp is a temporary variable and should be of type uint8_t. It
|
||
236 | * represents an intermediate value during conversion that is to be
|
||
237 | * outputted by PUT_BYTE.
|
||
238 | * \param PUT_BYTE writes the converted utf-8 bytes to any proper destination.
|
||
239 | * It could be a function or a statement, and uses tmp as the input byte.
|
||
240 | * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be
|
||
241 | 40a08c7e | Reimar Döffinger | * executed up to 4 times for values in the valid utf-8 range and up to
|
242 | * 7 times in the general case, depending on the length of the converted
|
||
243 | 0e8c148b | Guillaume Poirier | * unicode character.
|
244 | */
|
||
245 | 360932f7 | Zuxy Meng | #define PUT_UTF8(val, tmp, PUT_BYTE)\
|
246 | {\ |
||
247 | int bytes, shift;\
|
||
248 | uint32_t in = val;\ |
||
249 | if (in < 0x80) {\ |
||
250 | tmp = in;\ |
||
251 | PUT_BYTE\ |
||
252 | } else {\
|
||
253 | bytes = (av_log2(in) + 4) / 5;\ |
||
254 | shift = (bytes - 1) * 6;\ |
||
255 | tmp = (256 - (256 >> bytes)) | (in >> shift);\ |
||
256 | PUT_BYTE\ |
||
257 | while (shift >= 6) {\ |
||
258 | shift -= 6;\
|
||
259 | tmp = 0x80 | ((in >> shift) & 0x3f);\ |
||
260 | PUT_BYTE\ |
||
261 | }\ |
||
262 | }\ |
||
263 | } |
||
264 | |||
265 | 3cd52279 | Diego Biurrun | #if defined(ARCH_X86) || defined(ARCH_POWERPC)
|
266 | 8230cf02 | Aurelien Jacobs | #if defined(ARCH_X86_64)
|
267 | 0775c88f | Michael Niedermayer | static inline uint64_t read_time(void) |
268 | 8230cf02 | Aurelien Jacobs | { |
269 | bb270c08 | Diego Biurrun | uint64_t a, d; |
270 | asm volatile( "rdtsc\n\t" |
||
271 | : "=a" (a), "=d" (d) |
||
272 | ); |
||
273 | return (d << 32) | (a & 0xffffffff); |
||
274 | 8230cf02 | Aurelien Jacobs | } |
275 | 419b8784 | Diego Biurrun | #elif defined(ARCH_X86_32)
|
276 | 0775c88f | Michael Niedermayer | static inline long long read_time(void) |
277 | b534c7f9 | Michael Niedermayer | { |
278 | bb270c08 | Diego Biurrun | long long l; |
279 | asm volatile( "rdtsc\n\t" |
||
280 | : "=A" (l)
|
||
281 | ); |
||
282 | return l;
|
||
283 | b534c7f9 | Michael Niedermayer | } |
284 | 0775c88f | Michael Niedermayer | #else //FIXME check ppc64 |
285 | static inline uint64_t read_time(void) |
||
286 | { |
||
287 | uint32_t tbu, tbl, temp; |
||
288 | |||
289 | /* from section 2.2.1 of the 32-bit PowerPC PEM */
|
||
290 | __asm__ __volatile__( |
||
291 | "1:\n"
|
||
292 | "mftbu %2\n"
|
||
293 | "mftb %0\n"
|
||
294 | "mftbu %1\n"
|
||
295 | "cmpw %2,%1\n"
|
||
296 | "bne 1b\n"
|
||
297 | : "=r"(tbl), "=r"(tbu), "=r"(temp) |
||
298 | : |
||
299 | : "cc");
|
||
300 | |||
301 | return (((uint64_t)tbu)<<32) | (uint64_t)tbl; |
||
302 | } |
||
303 | 8230cf02 | Aurelien Jacobs | #endif
|
304 | b534c7f9 | Michael Niedermayer | |
305 | #define START_TIMER \
|
||
306 | uint64_t tend;\ |
||
307 | 0775c88f | Michael Niedermayer | uint64_t tstart= read_time();\ |
308 | b534c7f9 | Michael Niedermayer | |
309 | #define STOP_TIMER(id) \
|
||
310 | 0775c88f | Michael Niedermayer | tend= read_time();\ |
311 | d705e4a6 | Michael Niedermayer | {\ |
312 | static uint64_t tsum=0;\ |
||
313 | static int tcount=0;\ |
||
314 | static int tskip_count=0;\ |
||
315 | 9b0dfb27 | Michael Niedermayer | if(tcount<2 || tend - tstart < FFMAX(8*tsum/tcount, 2000)){\ |
316 | d705e4a6 | Michael Niedermayer | tsum+= tend - tstart;\ |
317 | tcount++;\ |
||
318 | }else\
|
||
319 | tskip_count++;\ |
||
320 | 8e06f20a | Loren Merritt | if(((tcount+tskip_count)&(tcount+tskip_count-1))==0){\ |
321 | e852beee | Alexander Strasser | av_log(NULL, AV_LOG_DEBUG, "%"PRIu64" dezicycles in %s, %d runs, %d skips\n", tsum*10/tcount, id, tcount, tskip_count);\ |
322 | d705e4a6 | Michael Niedermayer | }\ |
323 | b534c7f9 | Michael Niedermayer | } |
324 | 0187e903 | Michael Niedermayer | #else
|
325 | 115329f1 | Diego Biurrun | #define START_TIMER
|
326 | 0187e903 | Michael Niedermayer | #define STOP_TIMER(id) {}
|
327 | b534c7f9 | Michael Niedermayer | #endif
|
328 | |||
329 | cea8f6f3 | Luca Abeni | /* memory */
|
330 | 98145875 | Luca Barbato | |
331 | #ifdef __GNUC__
|
||
332 | #define DECLARE_ALIGNED(n,t,v) t v __attribute__ ((aligned (n)))
|
||
333 | #else
|
||
334 | #define DECLARE_ALIGNED(n,t,v) __declspec(align(n)) t v
|
||
335 | #endif
|
||
336 | |||
337 | 79e47000 | Luca Barbato | /* memory */
|
338 | cea8f6f3 | Luca Abeni | void *av_malloc(unsigned int size); |
339 | void *av_realloc(void *ptr, unsigned int size); |
||
340 | void av_free(void *ptr); |
||
341 | |||
342 | 79e47000 | Luca Barbato | void *av_mallocz(unsigned int size); |
343 | char *av_strdup(const char *s); |
||
344 | void av_freep(void *ptr); |
||
345 | |||
346 | 96707bb7 | Fabrice Bellard | #endif /* COMMON_H */ |