common.h 11.5 KB
Newer Older
1 2 3
/*
 * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
 *
4
 * This file is part of Libav.
5
 *
6
 * Libav is free software; you can redistribute it and/or
7 8
 * modify it under the terms of the GNU Lesser General Public
 * 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
 * Libav is distributed in the hope that it will be useful,
12 13 14 15 16
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
17
 * License along with Libav; if not, write to the Free Software
18 19 20
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

Michael Niedermayer's avatar
Michael Niedermayer committed
21
/**
22
 * @file
Diego Biurrun's avatar
Diego Biurrun committed
23
 * common internal and external API header
Michael Niedermayer's avatar
Michael Niedermayer committed
24 25
 */

26 27
#ifndef AVUTIL_COMMON_H
#define AVUTIL_COMMON_H
Fabrice Bellard's avatar
Fabrice Bellard committed
28

29
#include <errno.h>
30
#include <inttypes.h>
31 32 33 34 35
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
36

37
#include "attributes.h"
38
#include "version.h"
Måns Rullgård's avatar
Måns Rullgård committed
39
#include "libavutil/avconfig.h"
40 41

#if AV_HAVE_BIGENDIAN
42
#   define AV_NE(be, le) (be)
43
#else
44
#   define AV_NE(be, le) (le)
45
#endif
46

47
//rounded division & shift
Michael Niedermayer's avatar
Michael Niedermayer committed
48
#define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b))
49 50
/* assume b>0 */
#define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b))
51
#define FFABS(a) ((a) >= 0 ? (a) : (-(a)))
52
#define FFSIGN(a) ((a) > 0 ? 1 : -1)
53

54
#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
55
#define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c)
56
#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
Baptiste Coudurier's avatar
Baptiste Coudurier committed
57
#define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c)
58

59
#define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0)
60
#define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
61
#define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1))
Michael Niedermayer's avatar
Michael Niedermayer committed
62

Fabrice Bellard's avatar
Fabrice Bellard committed
63 64
/* misc math functions */

65 66 67
#if FF_API_AV_REVERSE
extern attribute_deprecated const uint8_t av_reverse[256];
#endif
68

69 70 71 72 73
#ifdef HAVE_AV_CONFIG_H
#   include "config.h"
#   include "intmath.h"
#endif

74 75
/* Pull in unguarded fallback defines at the end of this file. */
#include "common.h"
Fabrice Bellard's avatar
Fabrice Bellard committed
76

77 78 79 80 81 82 83 84
#ifndef av_log2
av_const int av_log2(unsigned v);
#endif

#ifndef av_log2_16bit
av_const int av_log2_16bit(unsigned v);
#endif

85
/**
86
 * Clip a signed integer value into the amin-amax range.
87 88 89
 * @param a value to clip
 * @param amin minimum value of the clip range
 * @param amax maximum value of the clip range
90
 * @return clipped value
91
 */
92
static av_always_inline av_const int av_clip_c(int a, int amin, int amax)
93
{
Diego Biurrun's avatar
Diego Biurrun committed
94
    if      (a < amin) return amin;
Michael Niedermayer's avatar
Michael Niedermayer committed
95 96
    else if (a > amax) return amax;
    else               return a;
97 98
}

99
/**
100
 * Clip a signed integer value into the 0-255 range.
101
 * @param a value to clip
102
 * @return clipped value
103
 */
104
static av_always_inline av_const uint8_t av_clip_uint8_c(int a)
105
{
106
    if (a&(~0xFF)) return (-a)>>31;
107
    else           return a;
108 109
}

110
/**
111
 * Clip a signed integer value into the -128,127 range.
112 113 114
 * @param a value to clip
 * @return clipped value
 */
115
static av_always_inline av_const int8_t av_clip_int8_c(int a)
116 117 118 119 120
{
    if ((a+0x80) & ~0xFF) return (a>>31) ^ 0x7F;
    else                  return a;
}

121
/**
122
 * Clip a signed integer value into the 0-65535 range.
123 124 125
 * @param a value to clip
 * @return clipped value
 */
126
static av_always_inline av_const uint16_t av_clip_uint16_c(int a)
127
{
128
    if (a&(~0xFFFF)) return (-a)>>31;
129
    else             return a;
130 131
}

132
/**
133
 * Clip a signed integer value into the -32768,32767 range.
134 135 136
 * @param a value to clip
 * @return clipped value
 */
137
static av_always_inline av_const int16_t av_clip_int16_c(int a)
138
{
139
    if ((a+0x8000) & ~0xFFFF) return (a>>31) ^ 0x7FFF;
140
    else                      return a;
141 142
}

143
/**
144
 * Clip a signed 64-bit integer value into the -2147483648,2147483647 range.
145 146 147
 * @param a value to clip
 * @return clipped value
 */
148
static av_always_inline av_const int32_t av_clipl_int32_c(int64_t a)
149
{
150
    if ((a+0x80000000u) & ~UINT64_C(0xFFFFFFFF)) return (a>>63) ^ 0x7FFFFFFF;
151
    else                                         return a;
152 153
}

154 155 156 157 158 159 160 161 162 163 164 165
/**
 * Clip a signed integer to an unsigned power of two range.
 * @param  a value to clip
 * @param  p bit position to clip at
 * @return clipped value
 */
static av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p)
{
    if (a & ~((1<<p) - 1)) return -a >> 31 & ((1<<p) - 1);
    else                   return  a;
}

166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189
/**
 * Add two signed 32-bit values with saturation.
 *
 * @param  a one value
 * @param  b another value
 * @return sum with signed saturation
 */
static av_always_inline int av_sat_add32_c(int a, int b)
{
    return av_clipl_int32((int64_t)a + b);
}

/**
 * Add a doubled value to another value with saturation at both stages.
 *
 * @param  a first value
 * @param  b value doubled and added to a
 * @return sum with signed saturation
 */
static av_always_inline int av_sat_dadd32_c(int a, int b)
{
    return av_sat_add32(a, av_sat_add32(b, b));
}

190
/**
191
 * Clip a float value into the amin-amax range.
192 193 194 195 196
 * @param a value to clip
 * @param amin minimum value of the clip range
 * @param amax maximum value of the clip range
 * @return clipped value
 */
197
static av_always_inline av_const float av_clipf_c(float a, float amin, float amax)
198 199 200 201 202 203
{
    if      (a < amin) return amin;
    else if (a > amax) return amax;
    else               return a;
}

204
/** Compute ceil(log2(x)).
205 206 207
 * @param x value used to compute ceil(log2(x))
 * @return computed ceiling of log2(x)
 */
208
static av_always_inline av_const int av_ceil_log2_c(int x)
209 210 211 212
{
    return av_log2((x - 1) << 1);
}

213 214 215 216 217
/**
 * Count number of bits set to one in x
 * @param x value to count bits of
 * @return the number of bits set to one in x
 */
218
static av_always_inline av_const int av_popcount_c(uint32_t x)
219 220 221 222 223 224 225 226
{
    x -= (x >> 1) & 0x55555555;
    x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
    x = (x + (x >> 4)) & 0x0F0F0F0F;
    x += x >> 8;
    return (x + (x >> 16)) & 0x3F;
}

Daniel Verkamp's avatar
Daniel Verkamp committed
227 228 229 230 231 232 233 234 235 236
/**
 * Count number of bits set to one in x
 * @param x value to count bits of
 * @return the number of bits set to one in x
 */
static av_always_inline av_const int av_popcount64_c(uint64_t x)
{
    return av_popcount(x) + av_popcount(x >> 32);
}

237 238
#define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24))
#define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24))
239

240 241 242 243 244 245 246 247 248 249
/**
 * Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form.
 *
 * @param val      Output value, must be an lvalue of type uint32_t.
 * @param GET_BYTE Expression reading one byte from the input.
 *                 Evaluated up to 7 times (4 for the currently
 *                 assigned Unicode range).  With a memory buffer
 *                 input, this could be *ptr++.
 * @param ERROR    Expression to be evaluated on invalid input,
 *                 typically a goto statement.
250
 */
251 252 253
#define GET_UTF8(val, GET_BYTE, ERROR)\
    val= GET_BYTE;\
    {\
254 255
        uint32_t top = (val & 128) >> 1;\
        if ((val & 0xc0) == 0x80)\
256
            ERROR\
257
        while (val & top) {\
258 259 260 261
            int tmp= GET_BYTE - 128;\
            if(tmp>>6)\
                ERROR\
            val= (val<<6) + tmp;\
262
            top <<= 5;\
263
        }\
264
        val &= (top << 1) - 1;\
265
    }
266

267 268 269 270 271 272 273 274
/**
 * Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form.
 *
 * @param val       Output value, must be an lvalue of type uint32_t.
 * @param GET_16BIT Expression returning two bytes of UTF-16 data converted
 *                  to native byte order.  Evaluated one or two times.
 * @param ERROR     Expression to be evaluated on invalid input,
 *                  typically a goto statement.
275 276 277 278 279 280 281 282 283 284 285 286 287
 */
#define GET_UTF16(val, GET_16BIT, ERROR)\
    val = GET_16BIT;\
    {\
        unsigned int hi = val - 0xD800;\
        if (hi < 0x800) {\
            val = GET_16BIT - 0xDC00;\
            if (val > 0x3FFU || hi > 0x3FFU)\
                ERROR\
            val += (hi<<10) + 0x10000;\
        }\
    }\

288 289
/**
 * @def PUT_UTF8(val, tmp, PUT_BYTE)
290
 * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long).
291
 * @param val is an input-only argument and should be of type uint32_t. It holds
292 293
 * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If
 * val is given as a function it is executed only once.
294
 * @param tmp is a temporary variable and should be of type uint8_t. It
295
 * represents an intermediate value during conversion that is to be
296
 * output by PUT_BYTE.
297
 * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination.
298 299
 * It could be a function or a statement, and uses tmp as the input byte.
 * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be
Diego Biurrun's avatar
Diego Biurrun committed
300
 * executed up to 4 times for values in the valid UTF-8 range and up to
301
 * 7 times in the general case, depending on the length of the converted
302
 * Unicode character.
303
 */
304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323
#define PUT_UTF8(val, tmp, PUT_BYTE)\
    {\
        int bytes, shift;\
        uint32_t in = val;\
        if (in < 0x80) {\
            tmp = in;\
            PUT_BYTE\
        } else {\
            bytes = (av_log2(in) + 4) / 5;\
            shift = (bytes - 1) * 6;\
            tmp = (256 - (256 >> bytes)) | (in >> shift);\
            PUT_BYTE\
            while (shift >= 6) {\
                shift -= 6;\
                tmp = 0x80 | ((in >> shift) & 0x3f);\
                PUT_BYTE\
            }\
        }\
    }

324 325
/**
 * @def PUT_UTF16(val, tmp, PUT_16BIT)
326
 * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes).
327
 * @param val is an input-only argument and should be of type uint32_t. It holds
Anton Khirnov's avatar
Anton Khirnov committed
328 329
 * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If
 * val is given as a function it is executed only once.
330
 * @param tmp is a temporary variable and should be of type uint16_t. It
Anton Khirnov's avatar
Anton Khirnov committed
331 332
 * represents an intermediate value during conversion that is to be
 * output by PUT_16BIT.
333
 * @param PUT_16BIT writes the converted UTF-16 data to any proper destination
Anton Khirnov's avatar
Anton Khirnov committed
334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353
 * in desired endianness. It could be a function or a statement, and uses tmp
 * as the input byte.  For example, PUT_BYTE could be "*output++ = tmp;"
 * PUT_BYTE will be executed 1 or 2 times depending on input character.
 */
#define PUT_UTF16(val, tmp, PUT_16BIT)\
    {\
        uint32_t in = val;\
        if (in < 0x10000) {\
            tmp = in;\
            PUT_16BIT\
        } else {\
            tmp = 0xD800 | ((in - 0x10000) >> 10);\
            PUT_16BIT\
            tmp = 0xDC00 | ((in - 0x10000) & 0x3FF);\
            PUT_16BIT\
        }\
    }\



354 355
#include "mem.h"

356 357 358 359
#ifdef HAVE_AV_CONFIG_H
#    include "internal.h"
#endif /* HAVE_AV_CONFIG_H */

360
#endif /* AVUTIL_COMMON_H */
361 362 363 364 365 366

/*
 * The following definitions are outside the multiple inclusion guard
 * to ensure they are immediately available in intmath.h.
 */

367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387
#ifndef av_ceil_log2
#   define av_ceil_log2     av_ceil_log2_c
#endif
#ifndef av_clip
#   define av_clip          av_clip_c
#endif
#ifndef av_clip_uint8
#   define av_clip_uint8    av_clip_uint8_c
#endif
#ifndef av_clip_int8
#   define av_clip_int8     av_clip_int8_c
#endif
#ifndef av_clip_uint16
#   define av_clip_uint16   av_clip_uint16_c
#endif
#ifndef av_clip_int16
#   define av_clip_int16    av_clip_int16_c
#endif
#ifndef av_clipl_int32
#   define av_clipl_int32   av_clipl_int32_c
#endif
388 389 390
#ifndef av_clip_uintp2
#   define av_clip_uintp2   av_clip_uintp2_c
#endif
391 392 393 394 395 396
#ifndef av_sat_add32
#   define av_sat_add32     av_sat_add32_c
#endif
#ifndef av_sat_dadd32
#   define av_sat_dadd32    av_sat_dadd32_c
#endif
397 398 399
#ifndef av_clipf
#   define av_clipf         av_clipf_c
#endif
400 401 402
#ifndef av_popcount
#   define av_popcount      av_popcount_c
#endif
Daniel Verkamp's avatar
Daniel Verkamp committed
403 404 405
#ifndef av_popcount64
#   define av_popcount64    av_popcount64_c
#endif