Move internal.h #include to the end of the file so that it is after
[libav.git] / libavutil / common.h
CommitLineData
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 120extern const uint8_t ff_log2_tab[256];
de6d9b64 121
85074d3c 122static 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 138static 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 157static 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 169static 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 180static 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 */
193static 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 */