move memory functions from avcodec to avutil
[ffmpeg.git] / libavutil / common.h
1 /*
2  * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the Free Software
16  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
17  */
18
19 /**
20  * @file common.h
21  * common internal and external api header.
22  */
23
24 #ifndef COMMON_H
25 #define COMMON_H
26
27 #ifndef M_PI
28 #define M_PI    3.14159265358979323846
29 #endif
30
31 #ifdef HAVE_AV_CONFIG_H
32 /* only include the following when compiling package */
33 #    include "config.h"
34
35 #    include <stdlib.h>
36 #    include <stdio.h>
37 #    include <string.h>
38 #    include <ctype.h>
39 #    include <limits.h>
40 #    ifndef __BEOS__
41 #        include <errno.h>
42 #    else
43 #        include "berrno.h"
44 #    endif
45 #    include <math.h>
46 #endif /* HAVE_AV_CONFIG_H */
47
48 /* Suppress restrict if it was not defined in config.h.  */
49 #ifndef restrict
50 #    define restrict
51 #endif
52
53 #ifndef always_inline
54 #if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0)
55 #    define always_inline __attribute__((always_inline)) inline
56 #else
57 #    define always_inline inline
58 #endif
59 #endif
60
61 #ifndef attribute_used
62 #if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0)
63 #    define attribute_used __attribute__((used))
64 #else
65 #    define attribute_used
66 #endif
67 #endif
68
69 #ifndef attribute_unused
70 #if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0)
71 #    define attribute_unused __attribute__((unused))
72 #else
73 #    define attribute_unused
74 #endif
75 #endif
76
77 #ifndef attribute_deprecated
78 #if defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ > 0)
79 #    define attribute_deprecated __attribute__((deprecated))
80 #else
81 #    define attribute_deprecated
82 #endif
83 #endif
84
85 #ifndef EMULATE_INTTYPES
86 #   include <inttypes.h>
87 #else
88     typedef signed char  int8_t;
89     typedef signed short int16_t;
90     typedef signed int   int32_t;
91     typedef unsigned char  uint8_t;
92     typedef unsigned short uint16_t;
93     typedef unsigned int   uint32_t;
94     typedef signed long long   int64_t;
95     typedef unsigned long long uint64_t;
96 #endif /* EMULATE_INTTYPES */
97
98 #ifndef PRId64
99 #define PRId64 "lld"
100 #endif
101
102 #ifndef PRIu64
103 #define PRIu64 "llu"
104 #endif
105
106 #ifndef PRIx64
107 #define PRIx64 "llx"
108 #endif
109
110 #ifndef PRId32
111 #define PRId32 "d"
112 #endif
113
114 #ifndef PRIdFAST16
115 #define PRIdFAST16 PRId32
116 #endif
117
118 #ifndef PRIdFAST32
119 #define PRIdFAST32 PRId32
120 #endif
121
122 #ifndef INT16_MIN
123 #define INT16_MIN       (-0x7fff-1)
124 #endif
125
126 #ifndef INT16_MAX
127 #define INT16_MAX       0x7fff
128 #endif
129
130 #ifndef INT32_MIN
131 #define INT32_MIN       (-0x7fffffff-1)
132 #endif
133
134 #ifndef INT32_MAX
135 #define INT32_MAX       0x7fffffff
136 #endif
137
138 #ifndef UINT32_MAX
139 #define UINT32_MAX      0xffffffff
140 #endif
141
142 #ifndef INT64_MIN
143 #define INT64_MIN       (-0x7fffffffffffffffLL-1)
144 #endif
145
146 #ifndef INT64_MAX
147 #define INT64_MAX int64_t_C(9223372036854775807)
148 #endif
149
150 #ifndef UINT64_MAX
151 #define UINT64_MAX uint64_t_C(0xFFFFFFFFFFFFFFFF)
152 #endif
153
154 #ifdef EMULATE_FAST_INT
155 typedef signed char int_fast8_t;
156 typedef signed int  int_fast16_t;
157 typedef signed int  int_fast32_t;
158 typedef unsigned char uint_fast8_t;
159 typedef unsigned int  uint_fast16_t;
160 typedef unsigned int  uint_fast32_t;
161 typedef uint64_t      uint_fast64_t;
162 #endif
163
164 #ifndef INT_BIT
165 #    if INT_MAX != 2147483647
166 #        define INT_BIT 64
167 #    else
168 #        define INT_BIT 32
169 #    endif
170 #endif
171
172 #ifndef int64_t_C
173 #define int64_t_C(c)     (c ## LL)
174 #define uint64_t_C(c)    (c ## ULL)
175 #endif
176
177 #if defined(__MINGW32__) && !defined(BUILD_AVUTIL) && defined(BUILD_SHARED_AV)
178 #  define FF_IMPORT_ATTR __declspec(dllimport)
179 #else
180 #  define FF_IMPORT_ATTR
181 #endif
182
183
184 #ifdef HAVE_AV_CONFIG_H
185 /* only include the following when compiling package */
186 #    include "internal.h"
187 #endif
188
189 //rounded divison & shift
190 #define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b))
191 /* assume b>0 */
192 #define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b))
193 #define ABS(a) ((a) >= 0 ? (a) : (-(a)))
194
195 #define FFMAX(a,b) ((a) > (b) ? (a) : (b))
196 #define FFMIN(a,b) ((a) > (b) ? (b) : (a))
197
198 #define SWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0)
199
200 /* misc math functions */
201 extern FF_IMPORT_ATTR const uint8_t ff_log2_tab[256];
202
203 static inline int av_log2(unsigned int v)
204 {
205     int n;
206
207     n = 0;
208     if (v & 0xffff0000) {
209         v >>= 16;
210         n += 16;
211     }
212     if (v & 0xff00) {
213         v >>= 8;
214         n += 8;
215     }
216     n += ff_log2_tab[v];
217
218     return n;
219 }
220
221 static inline int av_log2_16bit(unsigned int v)
222 {
223     int n;
224
225     n = 0;
226     if (v & 0xff00) {
227         v >>= 8;
228         n += 8;
229     }
230     n += ff_log2_tab[v];
231
232     return n;
233 }
234
235 /* median of 3 */
236 static inline int mid_pred(int a, int b, int c)
237 {
238 #if (defined(ARCH_X86) && __CPU__ >= 686 || defined(ARCH_X86_64)) && !defined(RUNTIME_CPUDETECT)
239     int i=b;
240     asm volatile(
241         "cmp    %2, %1 \n\t"
242         "cmovg  %1, %0 \n\t"
243         "cmovg  %2, %1 \n\t"
244         "cmp    %3, %1 \n\t"
245         "cmovl  %3, %1 \n\t"
246         "cmp    %1, %0 \n\t"
247         "cmovg  %1, %0 \n\t"
248         :"+&r"(i), "+&r"(a)
249         :"r"(b), "r"(c)
250     );
251     return i;
252 #elif 0
253     int t= (a-b)&((a-b)>>31);
254     a-=t;
255     b+=t;
256     b-= (b-c)&((b-c)>>31);
257     b+= (a-b)&((a-b)>>31);
258
259     return b;
260 #else
261     if(a>b){
262         if(c>b){
263             if(c>a) b=a;
264             else    b=c;
265         }
266     }else{
267         if(b>c){
268             if(c>a) b=c;
269             else    b=a;
270         }
271     }
272     return b;
273 #endif
274 }
275
276 /**
277  * clip a signed integer value into the amin-amax range
278  * @param a value to clip
279  * @param amin minimum value of the clip range
280  * @param amax maximum value of the clip range
281  * @return cliped value
282  */
283 static inline int clip(int a, int amin, int amax)
284 {
285     if (a < amin)      return amin;
286     else if (a > amax) return amax;
287     else               return a;
288 }
289
290 /**
291  * clip a signed integer value into the 0-255 range
292  * @param a value to clip
293  * @return cliped value
294  */
295 static inline uint8_t clip_uint8(int a)
296 {
297     if (a&(~255)) return (-a)>>31;
298     else          return a;
299 }
300
301 /* math */
302 int64_t ff_gcd(int64_t a, int64_t b);
303
304 /**
305  * converts fourcc string to int
306  */
307 static inline int ff_get_fourcc(const char *s){
308 #ifdef HAVE_AV_CONFIG_H
309     assert( strlen(s)==4 );
310 #endif
311
312     return (s[0]) + (s[1]<<8) + (s[2]<<16) + (s[3]<<24);
313 }
314
315 #define MKTAG(a,b,c,d) (a | (b << 8) | (c << 16) | (d << 24))
316 #define MKBETAG(a,b,c,d) (d | (c << 8) | (b << 16) | (a << 24))
317
318
319 #define GET_UTF8(val, GET_BYTE, ERROR)\
320     val= GET_BYTE;\
321     {\
322         int ones= 7 - av_log2(val ^ 255);\
323         if(ones==1)\
324             ERROR\
325         val&= 127>>ones;\
326         while(--ones > 0){\
327             int tmp= GET_BYTE - 128;\
328             if(tmp>>6)\
329                 ERROR\
330             val= (val<<6) + tmp;\
331         }\
332     }
333
334 #if defined(ARCH_X86) || defined(ARCH_X86_64) || defined(ARCH_POWERPC)
335 #if defined(ARCH_X86_64)
336 static inline uint64_t read_time(void)
337 {
338         uint64_t a, d;
339         asm volatile(   "rdtsc\n\t"
340                 : "=a" (a), "=d" (d)
341         );
342         return (d << 32) | (a & 0xffffffff);
343 }
344 #elif defined(ARCH_X86)
345 static inline long long read_time(void)
346 {
347         long long l;
348         asm volatile(   "rdtsc\n\t"
349                 : "=A" (l)
350         );
351         return l;
352 }
353 #else //FIXME check ppc64
354 static inline uint64_t read_time(void)
355 {
356     uint32_t tbu, tbl, temp;
357
358      /* from section 2.2.1 of the 32-bit PowerPC PEM */
359      __asm__ __volatile__(
360          "1:\n"
361          "mftbu  %2\n"
362          "mftb   %0\n"
363          "mftbu  %1\n"
364          "cmpw   %2,%1\n"
365          "bne    1b\n"
366      : "=r"(tbl), "=r"(tbu), "=r"(temp)
367      :
368      : "cc");
369
370      return (((uint64_t)tbu)<<32) | (uint64_t)tbl;
371 }
372 #endif
373
374 #define START_TIMER \
375 uint64_t tend;\
376 uint64_t tstart= read_time();\
377
378 #define STOP_TIMER(id) \
379 tend= read_time();\
380 {\
381   static uint64_t tsum=0;\
382   static int tcount=0;\
383   static int tskip_count=0;\
384   if(tcount<2 || tend - tstart < 8*tsum/tcount){\
385       tsum+= tend - tstart;\
386       tcount++;\
387   }else\
388       tskip_count++;\
389   if(((tcount+tskip_count)&(tcount+tskip_count-1))==0){\
390       av_log(NULL, AV_LOG_DEBUG, "%"PRIu64" dezicycles in %s, %d runs, %d skips\n", tsum*10/tcount, id, tcount, tskip_count);\
391   }\
392 }
393 #else
394 #define START_TIMER
395 #define STOP_TIMER(id) {}
396 #endif
397
398 /* memory */
399
400 #ifdef __GNUC__
401   #define DECLARE_ALIGNED(n,t,v)       t v __attribute__ ((aligned (n)))
402 #else
403   #define DECLARE_ALIGNED(n,t,v)      __declspec(align(n)) t v
404 #endif
405
406 /* memory */
407 void *av_malloc(unsigned int size);
408 void *av_realloc(void *ptr, unsigned int size);
409 void av_free(void *ptr);
410
411 void *av_mallocz(unsigned int size);
412 char *av_strdup(const char *s);
413 void av_freep(void *ptr);
414
415 #endif /* COMMON_H */