common.h 13.6 KB
Newer Older
1 2 3
/*
 * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
 *
4 5 6
 * This file is part of FFmpeg.
 *
 * FFmpeg 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
 * FFmpeg 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 FFmpeg; 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 30 31 32
#if defined(__cplusplus) && !defined(__STDC_CONSTANT_MACROS) && !defined(UINT64_C)
#error missing -D__STDC_CONSTANT_MACROS / #define __STDC_CONSTANT_MACROS
#endif

33
#include <errno.h>
34
#include <inttypes.h>
35 36
#include <limits.h>
#include <math.h>
37
#include <stdint.h>
38 39 40
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
41

42
#include "attributes.h"
43
#include "version.h"
Måns Rullgård's avatar
Måns Rullgård committed
44
#include "libavutil/avconfig.h"
45 46

#if AV_HAVE_BIGENDIAN
47
#   define AV_NE(be, le) (be)
48
#else
49
#   define AV_NE(be, le) (le)
50
#endif
51

52
//rounded division & shift
Michael Niedermayer's avatar
Michael Niedermayer committed
53
#define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b))
54 55
/* assume b>0 */
#define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b))
56
/* assume a>0 and b>0 */
57 58
#define FF_CEIL_RSHIFT(a,b) (!av_builtin_constant_p(b) ? -((-(a)) >> (b)) \
                                                       : ((a) + (1<<(b)) - 1) >> (b))
59 60
#define FFUDIV(a,b) (((a)>0 ?(a):(a)-(b)+1) / (b))
#define FFUMOD(a,b) ((a)-(b)*FFUDIV(a,b))
61
#define FFABS(a) ((a) >= 0 ? (a) : (-(a)))
62
#define FFSIGN(a) ((a) > 0 ? 1 : -1)
63

64
#define FFMAX(a,b) ((a) > (b) ? (a) : (b))
65
#define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c)
66
#define FFMIN(a,b) ((a) > (b) ? (b) : (a))
Baptiste Coudurier's avatar
Baptiste Coudurier committed
67
#define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c)
68

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

Fabrice Bellard's avatar
Fabrice Bellard committed
73 74
/* misc math functions */

75 76 77
/**
 * Reverse the order of the bits of an 8-bits unsigned integer.
 */
78 79 80
#if FF_API_AV_REVERSE
extern attribute_deprecated const uint8_t av_reverse[256];
#endif
81

82 83 84 85 86
#ifdef HAVE_AV_CONFIG_H
#   include "config.h"
#   include "intmath.h"
#endif

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

90 91 92 93 94 95 96 97
#ifndef av_log2
av_const int av_log2(unsigned v);
#endif

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

98
/**
99
 * Clip a signed integer value into the amin-amax range.
100 101 102
 * @param a value to clip
 * @param amin minimum value of the clip range
 * @param amax maximum value of the clip range
103
 * @return clipped value
104
 */
105
static av_always_inline av_const int av_clip_c(int a, int amin, int amax)
106
{
107
#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
108 109
    if (amin > amax) abort();
#endif
Diego Biurrun's avatar
Diego Biurrun committed
110
    if      (a < amin) return amin;
Michael Niedermayer's avatar
Michael Niedermayer committed
111 112
    else if (a > amax) return amax;
    else               return a;
113 114
}

115 116 117 118 119 120 121 122 123
/**
 * Clip a signed 64bit integer value into the amin-amax range.
 * @param a value to clip
 * @param amin minimum value of the clip range
 * @param amax maximum value of the clip range
 * @return clipped value
 */
static av_always_inline av_const int64_t av_clip64_c(int64_t a, int64_t amin, int64_t amax)
{
124
#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
125 126
    if (amin > amax) abort();
#endif
127 128 129 130 131
    if      (a < amin) return amin;
    else if (a > amax) return amax;
    else               return a;
}

132
/**
133
 * Clip a signed integer value into the 0-255 range.
134
 * @param a value to clip
135
 * @return clipped value
136
 */
137
static av_always_inline av_const uint8_t av_clip_uint8_c(int a)
138
{
139
    if (a&(~0xFF)) return (-a)>>31;
140
    else           return a;
141 142
}

143
/**
144
 * Clip a signed integer value into the -128,127 range.
145 146 147
 * @param a value to clip
 * @return clipped value
 */
148
static av_always_inline av_const int8_t av_clip_int8_c(int a)
149 150 151 152 153
{
    if ((a+0x80) & ~0xFF) return (a>>31) ^ 0x7F;
    else                  return a;
}

154
/**
155
 * Clip a signed integer value into the 0-65535 range.
156 157 158
 * @param a value to clip
 * @return clipped value
 */
159
static av_always_inline av_const uint16_t av_clip_uint16_c(int a)
160
{
161
    if (a&(~0xFFFF)) return (-a)>>31;
162
    else             return a;
163 164
}

165
/**
166
 * Clip a signed integer value into the -32768,32767 range.
167 168 169
 * @param a value to clip
 * @return clipped value
 */
170
static av_always_inline av_const int16_t av_clip_int16_c(int a)
171
{
172
    if ((a+0x8000) & ~0xFFFF) return (a>>31) ^ 0x7FFF;
173
    else                      return a;
174 175
}

176
/**
177
 * Clip a signed 64-bit integer value into the -2147483648,2147483647 range.
178 179 180
 * @param a value to clip
 * @return clipped value
 */
181
static av_always_inline av_const int32_t av_clipl_int32_c(int64_t a)
182
{
183
    if ((a+0x80000000u) & ~UINT64_C(0xFFFFFFFF)) return (int32_t)((a>>63) ^ 0x7FFFFFFF);
184
    else                                         return (int32_t)a;
185 186
}

187 188 189 190 191 192 193 194 195 196 197 198
/**
 * 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;
}

199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
/**
 * 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));
}

223
/**
224
 * Clip a float value into the amin-amax range.
225 226 227 228 229
 * @param a value to clip
 * @param amin minimum value of the clip range
 * @param amax maximum value of the clip range
 * @return clipped value
 */
230
static av_always_inline av_const float av_clipf_c(float a, float amin, float amax)
231
{
232
#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
233 234
    if (amin > amax) abort();
#endif
235 236 237 238 239
    if      (a < amin) return amin;
    else if (a > amax) return amax;
    else               return a;
}

Paul B Mahol's avatar
Paul B Mahol committed
240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256
/**
 * Clip a double value into the amin-amax range.
 * @param a value to clip
 * @param amin minimum value of the clip range
 * @param amax maximum value of the clip range
 * @return clipped value
 */
static av_always_inline av_const double av_clipd_c(double a, double amin, double amax)
{
#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
    if (amin > amax) abort();
#endif
    if      (a < amin) return amin;
    else if (a > amax) return amax;
    else               return a;
}

257
/** Compute ceil(log2(x)).
258 259 260
 * @param x value used to compute ceil(log2(x))
 * @return computed ceiling of log2(x)
 */
261
static av_always_inline av_const int av_ceil_log2_c(int x)
262 263 264 265
{
    return av_log2((x - 1) << 1);
}

266 267 268 269 270
/**
 * 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
 */
271
static av_always_inline av_const int av_popcount_c(uint32_t x)
272 273 274 275 276 277 278 279
{
    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
280 281 282 283 284 285 286
/**
 * 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)
{
287
    return av_popcount((uint32_t)x) + av_popcount((uint32_t)(x >> 32));
Daniel Verkamp's avatar
Daniel Verkamp committed
288 289
}

290 291
#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))
292

293 294 295 296 297 298 299 300 301 302
/**
 * 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.
303 304 305 306 307
 *
 * @warning ERROR should not contain a loop control statement which
 * could interact with the internal while loop, and should force an
 * exit from the macro code (e.g. through a goto or a return) in order
 * to prevent undefined results.
308
 */
309 310 311
#define GET_UTF8(val, GET_BYTE, ERROR)\
    val= GET_BYTE;\
    {\
312
        uint32_t top = (val & 128) >> 1;\
313
        if ((val & 0xc0) == 0x80 || val >= 0xFE)\
314
            ERROR\
315
        while (val & top) {\
316 317 318 319
            int tmp= GET_BYTE - 128;\
            if(tmp>>6)\
                ERROR\
            val= (val<<6) + tmp;\
320
            top <<= 5;\
321
        }\
322
        val &= (top << 1) - 1;\
323
    }
324

325 326 327 328 329 330 331 332
/**
 * 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.
333 334 335 336 337 338 339 340 341 342 343 344 345
 */
#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;\
        }\
    }\

346 347
/**
 * @def PUT_UTF8(val, tmp, PUT_BYTE)
348
 * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long).
349
 * @param val is an input-only argument and should be of type uint32_t. It holds
350 351
 * 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.
352
 * @param tmp is a temporary variable and should be of type uint8_t. It
353
 * represents an intermediate value during conversion that is to be
354
 * output by PUT_BYTE.
355
 * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination.
356 357
 * 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
358
 * executed up to 4 times for values in the valid UTF-8 range and up to
359
 * 7 times in the general case, depending on the length of the converted
360
 * Unicode character.
361
 */
362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381
#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\
            }\
        }\
    }

382 383
/**
 * @def PUT_UTF16(val, tmp, PUT_16BIT)
384
 * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes).
385
 * @param val is an input-only argument and should be of type uint32_t. It holds
Anton Khirnov's avatar
Anton Khirnov committed
386 387
 * 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.
388
 * @param tmp is a temporary variable and should be of type uint16_t. It
Anton Khirnov's avatar
Anton Khirnov committed
389 390
 * represents an intermediate value during conversion that is to be
 * output by PUT_16BIT.
391
 * @param PUT_16BIT writes the converted UTF-16 data to any proper destination
Anton Khirnov's avatar
Anton Khirnov committed
392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411
 * 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\
        }\
    }\



412 413
#include "mem.h"

414 415 416 417
#ifdef HAVE_AV_CONFIG_H
#    include "internal.h"
#endif /* HAVE_AV_CONFIG_H */

418
#endif /* AVUTIL_COMMON_H */
419 420 421 422 423 424

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

425 426 427 428 429 430
#ifndef av_ceil_log2
#   define av_ceil_log2     av_ceil_log2_c
#endif
#ifndef av_clip
#   define av_clip          av_clip_c
#endif
431 432 433
#ifndef av_clip64
#   define av_clip64        av_clip64_c
#endif
434 435 436 437 438 439 440 441 442 443 444 445 446 447 448
#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
449 450 451
#ifndef av_clip_uintp2
#   define av_clip_uintp2   av_clip_uintp2_c
#endif
452 453 454 455 456 457
#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
458 459 460
#ifndef av_clipf
#   define av_clipf         av_clipf_c
#endif
Paul B Mahol's avatar
Paul B Mahol committed
461 462 463
#ifndef av_clipd
#   define av_clipd         av_clipd_c
#endif
464 465 466
#ifndef av_popcount
#   define av_popcount      av_popcount_c
#endif
Daniel Verkamp's avatar
Daniel Verkamp committed
467 468 469
#ifndef av_popcount64
#   define av_popcount64    av_popcount64_c
#endif