common.h 14.1 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
    if ((a+0x80U) & ~0xFF) return (a>>31) ^ 0x7F;
151 152 153
    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+0x8000U) & ~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 199 200
/**
 * Clip a signed integer into the -(2^p),(2^p-1) range.
 * @param  a value to clip
 * @param  p bit position to clip at
 * @return clipped value
 */
static av_always_inline av_const int av_clip_intp2_c(int a, int p)
{
    if ((a + (1 << p)) & ~((1 << (p + 1)) - 1))
        return (a >> 31) ^ ((1 << p) - 1);
    else
        return a;
}

201 202 203 204 205 206 207 208 209 210 211 212
/**
 * 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;
}

213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236
/**
 * 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));
}

237
/**
238
 * Clip a float value into the amin-amax range.
239 240 241 242 243
 * @param a value to clip
 * @param amin minimum value of the clip range
 * @param amax maximum value of the clip range
 * @return clipped value
 */
244
static av_always_inline av_const float av_clipf_c(float a, float amin, float amax)
245
{
246
#if defined(HAVE_AV_CONFIG_H) && defined(ASSERT_LEVEL) && ASSERT_LEVEL >= 2
247 248
    if (amin > amax) abort();
#endif
249 250 251 252 253
    if      (a < amin) return amin;
    else if (a > amax) return amax;
    else               return a;
}

Paul B Mahol's avatar
Paul B Mahol committed
254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270
/**
 * 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;
}

271
/** Compute ceil(log2(x)).
272 273 274
 * @param x value used to compute ceil(log2(x))
 * @return computed ceiling of log2(x)
 */
275
static av_always_inline av_const int av_ceil_log2_c(int x)
276 277 278 279
{
    return av_log2((x - 1) << 1);
}

280 281 282 283 284
/**
 * 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
 */
285
static av_always_inline av_const int av_popcount_c(uint32_t x)
286 287 288 289 290 291 292 293
{
    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
294 295 296 297 298 299 300
/**
 * 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)
{
301
    return av_popcount((uint32_t)x) + av_popcount((uint32_t)(x >> 32));
Daniel Verkamp's avatar
Daniel Verkamp committed
302 303
}

304 305
#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))
306

307 308 309 310 311 312 313 314 315 316
/**
 * 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.
317 318 319 320 321
 *
 * @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.
322
 */
323 324 325
#define GET_UTF8(val, GET_BYTE, ERROR)\
    val= GET_BYTE;\
    {\
326
        uint32_t top = (val & 128) >> 1;\
327
        if ((val & 0xc0) == 0x80 || val >= 0xFE)\
328
            ERROR\
329
        while (val & top) {\
330 331 332 333
            int tmp= GET_BYTE - 128;\
            if(tmp>>6)\
                ERROR\
            val= (val<<6) + tmp;\
334
            top <<= 5;\
335
        }\
336
        val &= (top << 1) - 1;\
337
    }
338

339 340 341 342 343 344 345 346
/**
 * 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.
347 348 349 350 351 352 353 354 355 356 357 358 359
 */
#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;\
        }\
    }\

360 361
/**
 * @def PUT_UTF8(val, tmp, PUT_BYTE)
362
 * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long).
363
 * @param val is an input-only argument and should be of type uint32_t. It holds
364 365
 * 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.
366
 * @param tmp is a temporary variable and should be of type uint8_t. It
367
 * represents an intermediate value during conversion that is to be
368
 * output by PUT_BYTE.
369
 * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination.
370 371
 * 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
372
 * executed up to 4 times for values in the valid UTF-8 range and up to
373
 * 7 times in the general case, depending on the length of the converted
374
 * Unicode character.
375
 */
376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395
#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\
            }\
        }\
    }

396 397
/**
 * @def PUT_UTF16(val, tmp, PUT_16BIT)
398
 * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes).
399
 * @param val is an input-only argument and should be of type uint32_t. It holds
Anton Khirnov's avatar
Anton Khirnov committed
400 401
 * 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.
402
 * @param tmp is a temporary variable and should be of type uint16_t. It
Anton Khirnov's avatar
Anton Khirnov committed
403 404
 * represents an intermediate value during conversion that is to be
 * output by PUT_16BIT.
405
 * @param PUT_16BIT writes the converted UTF-16 data to any proper destination
Anton Khirnov's avatar
Anton Khirnov committed
406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425
 * 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\
        }\
    }\



426 427
#include "mem.h"

428 429 430 431
#ifdef HAVE_AV_CONFIG_H
#    include "internal.h"
#endif /* HAVE_AV_CONFIG_H */

432
#endif /* AVUTIL_COMMON_H */
433 434 435 436 437 438

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

439 440 441 442 443 444
#ifndef av_ceil_log2
#   define av_ceil_log2     av_ceil_log2_c
#endif
#ifndef av_clip
#   define av_clip          av_clip_c
#endif
445 446 447
#ifndef av_clip64
#   define av_clip64        av_clip64_c
#endif
448 449 450 451 452 453 454 455 456 457 458 459 460 461 462
#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
463 464 465
#ifndef av_clip_intp2
#   define av_clip_intp2    av_clip_intp2_c
#endif
466 467 468
#ifndef av_clip_uintp2
#   define av_clip_uintp2   av_clip_uintp2_c
#endif
469 470 471 472 473 474
#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
475 476 477
#ifndef av_clipf
#   define av_clipf         av_clipf_c
#endif
Paul B Mahol's avatar
Paul B Mahol committed
478 479 480
#ifndef av_clipd
#   define av_clipd         av_clipd_c
#endif
481 482 483
#ifndef av_popcount
#   define av_popcount      av_popcount_c
#endif
Daniel Verkamp's avatar
Daniel Verkamp committed
484 485 486
#ifndef av_popcount64
#   define av_popcount64    av_popcount64_c
#endif