tor-browser

The Tor Browser
git clone https://git.dasho.dev/tor-browser.git
Log | Files | Refs | README | LICENSE

common.h (11759B)


      1 /*
      2 * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
      3 *
      4 * This file is part of Libav.
      5 *
      6 * Libav is free software; you can redistribute it and/or
      7 * modify it under the terms of the GNU Lesser General Public
      8 * 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 * 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
     17 * License along with Libav; if not, write to the Free Software
     18 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
     19 */
     20 
     21 /**
     22 * @file
     23 * common internal and external API header
     24 */
     25 
     26 #ifndef AVUTIL_COMMON_H
     27 #define AVUTIL_COMMON_H
     28 
     29 #include <errno.h>
     30 #include <inttypes.h>
     31 #include <limits.h>
     32 #include <math.h>
     33 #include <stdint.h>
     34 #include <stdio.h>
     35 #include <stdlib.h>
     36 #include <string.h>
     37 
     38 #include "attributes.h"
     39 #include "version.h"
     40 #include "libavutil/avconfig.h"
     41 
     42 #if AV_HAVE_BIGENDIAN
     43 #   define AV_NE(be, le) (be)
     44 #else
     45 #   define AV_NE(be, le) (le)
     46 #endif
     47 
     48 //rounded division & shift
     49 #define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b))
     50 /* assume b>0 */
     51 #define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b))
     52 #define FFABS(a) ((a) >= 0 ? (a) : (-(a)))
     53 #define FFSIGN(a) ((a) > 0 ? 1 : -1)
     54 
     55 #define FFMAX(a,b) ((a) > (b) ? (a) : (b))
     56 #define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c)
     57 #define FFMIN(a,b) ((a) > (b) ? (b) : (a))
     58 #define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c)
     59 
     60 #define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0)
     61 #define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
     62 #define FFALIGN(x, a) (((x)+(a)-1)&~((a)-1))
     63 
     64 /* misc math functions */
     65 
     66 #if FF_API_AV_REVERSE
     67 extern attribute_deprecated const uint8_t av_reverse[256];
     68 #endif
     69 
     70 #ifdef HAVE_AV_CONFIG_H
     71 #   include "config.h"
     72 #   include "intmath.h"
     73 #endif
     74 
     75 /* Pull in unguarded fallback defines at the end of this file. */
     76 #include "common.h"
     77 
     78 #ifndef av_log2
     79 av_const int av_log2(unsigned v);
     80 #endif
     81 
     82 #ifndef av_log2_16bit
     83 av_const int av_log2_16bit(unsigned v);
     84 #endif
     85 
     86 /**
     87 * Clip a signed integer value into the amin-amax range.
     88 * @param a value to clip
     89 * @param amin minimum value of the clip range
     90 * @param amax maximum value of the clip range
     91 * @return clipped value
     92 */
     93 static av_always_inline av_const int av_clip_c(int a, int amin, int amax)
     94 {
     95    if      (a < amin) return amin;
     96    else if (a > amax) return amax;
     97    else               return a;
     98 }
     99 
    100 /**
    101 * Clip a signed integer value into the 0-255 range.
    102 * @param a value to clip
    103 * @return clipped value
    104 */
    105 static av_always_inline av_const uint8_t av_clip_uint8_c(int a)
    106 {
    107    if (a&(~0xFF)) return (-a)>>31;
    108    else           return a;
    109 }
    110 
    111 /**
    112 * Clip a signed integer value into the -128,127 range.
    113 * @param a value to clip
    114 * @return clipped value
    115 */
    116 static av_always_inline av_const int8_t av_clip_int8_c(int a)
    117 {
    118    if ((a+0x80) & ~0xFF) return (a>>31) ^ 0x7F;
    119    else                  return a;
    120 }
    121 
    122 /**
    123 * Clip a signed integer value into the 0-65535 range.
    124 * @param a value to clip
    125 * @return clipped value
    126 */
    127 static av_always_inline av_const uint16_t av_clip_uint16_c(int a)
    128 {
    129    if (a&(~0xFFFF)) return (-a)>>31;
    130    else             return a;
    131 }
    132 
    133 /**
    134 * Clip a signed integer value into the -32768,32767 range.
    135 * @param a value to clip
    136 * @return clipped value
    137 */
    138 static av_always_inline av_const int16_t av_clip_int16_c(int a)
    139 {
    140    if ((a+0x8000) & ~0xFFFF) return (a>>31) ^ 0x7FFF;
    141    else                      return a;
    142 }
    143 
    144 /**
    145 * Clip a signed 64-bit integer value into the -2147483648,2147483647 range.
    146 * @param a value to clip
    147 * @return clipped value
    148 */
    149 static av_always_inline av_const int32_t av_clipl_int32_c(int64_t a)
    150 {
    151    if ((a+0x80000000u) & ~UINT64_C(0xFFFFFFFF)) return (a>>63) ^ 0x7FFFFFFF;
    152    else                                         return a;
    153 }
    154 
    155 /**
    156 * Clip a signed integer to an unsigned power of two range.
    157 * @param  a value to clip
    158 * @param  p bit position to clip at
    159 * @return clipped value
    160 */
    161 static av_always_inline av_const unsigned av_clip_uintp2_c(int a, int p)
    162 {
    163    if (a & ~((1<<p) - 1)) return -a >> 31 & ((1<<p) - 1);
    164    else                   return  a;
    165 }
    166 
    167 /**
    168 * Add two signed 32-bit values with saturation.
    169 *
    170 * @param  a one value
    171 * @param  b another value
    172 * @return sum with signed saturation
    173 */
    174 static av_always_inline int av_sat_add32_c(int a, int b)
    175 {
    176    return av_clipl_int32((int64_t)a + b);
    177 }
    178 
    179 /**
    180 * Add a doubled value to another value with saturation at both stages.
    181 *
    182 * @param  a first value
    183 * @param  b value doubled and added to a
    184 * @return sum with signed saturation
    185 */
    186 static av_always_inline int av_sat_dadd32_c(int a, int b)
    187 {
    188    return av_sat_add32(a, av_sat_add32(b, b));
    189 }
    190 
    191 /**
    192 * Clip a float value into the amin-amax range.
    193 * @param a value to clip
    194 * @param amin minimum value of the clip range
    195 * @param amax maximum value of the clip range
    196 * @return clipped value
    197 */
    198 static av_always_inline av_const float av_clipf_c(float a, float amin, float amax)
    199 {
    200    if      (a < amin) return amin;
    201    else if (a > amax) return amax;
    202    else               return a;
    203 }
    204 
    205 /** Compute ceil(log2(x)).
    206 * @param x value used to compute ceil(log2(x))
    207 * @return computed ceiling of log2(x)
    208 */
    209 static av_always_inline av_const int av_ceil_log2_c(int x)
    210 {
    211    return av_log2((x - 1) << 1);
    212 }
    213 
    214 /**
    215 * Count number of bits set to one in x
    216 * @param x value to count bits of
    217 * @return the number of bits set to one in x
    218 */
    219 static av_always_inline av_const int av_popcount_c(uint32_t x)
    220 {
    221    x -= (x >> 1) & 0x55555555;
    222    x = (x & 0x33333333) + ((x >> 2) & 0x33333333);
    223    x = (x + (x >> 4)) & 0x0F0F0F0F;
    224    x += x >> 8;
    225    return (x + (x >> 16)) & 0x3F;
    226 }
    227 
    228 /**
    229 * Count number of bits set to one in x
    230 * @param x value to count bits of
    231 * @return the number of bits set to one in x
    232 */
    233 static av_always_inline av_const int av_popcount64_c(uint64_t x)
    234 {
    235    return av_popcount(x) + av_popcount(x >> 32);
    236 }
    237 
    238 #define MKTAG(a,b,c,d) ((a) | ((b) << 8) | ((c) << 16) | ((unsigned)(d) << 24))
    239 #define MKBETAG(a,b,c,d) ((d) | ((c) << 8) | ((b) << 16) | ((unsigned)(a) << 24))
    240 
    241 /**
    242 * Convert a UTF-8 character (up to 4 bytes) to its 32-bit UCS-4 encoded form.
    243 *
    244 * @param val      Output value, must be an lvalue of type uint32_t.
    245 * @param GET_BYTE Expression reading one byte from the input.
    246 *                 Evaluated up to 7 times (4 for the currently
    247 *                 assigned Unicode range).  With a memory buffer
    248 *                 input, this could be *ptr++.
    249 * @param ERROR    Expression to be evaluated on invalid input,
    250 *                 typically a goto statement.
    251 */
    252 #define GET_UTF8(val, GET_BYTE, ERROR)\
    253    val= GET_BYTE;\
    254    {\
    255        uint32_t top = (val & 128) >> 1;\
    256        if ((val & 0xc0) == 0x80)\
    257            ERROR\
    258        while (val & top) {\
    259            int tmp= GET_BYTE - 128;\
    260            if(tmp>>6)\
    261                ERROR\
    262            val= (val<<6) + tmp;\
    263            top <<= 5;\
    264        }\
    265        val &= (top << 1) - 1;\
    266    }
    267 
    268 /**
    269 * Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form.
    270 *
    271 * @param val       Output value, must be an lvalue of type uint32_t.
    272 * @param GET_16BIT Expression returning two bytes of UTF-16 data converted
    273 *                  to native byte order.  Evaluated one or two times.
    274 * @param ERROR     Expression to be evaluated on invalid input,
    275 *                  typically a goto statement.
    276 */
    277 #define GET_UTF16(val, GET_16BIT, ERROR)\
    278    val = GET_16BIT;\
    279    {\
    280        unsigned int hi = val - 0xD800;\
    281        if (hi < 0x800) {\
    282            val = GET_16BIT - 0xDC00;\
    283            if (val > 0x3FFU || hi > 0x3FFU)\
    284                ERROR\
    285            val += (hi<<10) + 0x10000;\
    286        }\
    287    }\
    288 
    289 /**
    290 * @def PUT_UTF8(val, tmp, PUT_BYTE)
    291 * Convert a 32-bit Unicode character to its UTF-8 encoded form (up to 4 bytes long).
    292 * @param val is an input-only argument and should be of type uint32_t. It holds
    293 * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If
    294 * val is given as a function it is executed only once.
    295 * @param tmp is a temporary variable and should be of type uint8_t. It
    296 * represents an intermediate value during conversion that is to be
    297 * output by PUT_BYTE.
    298 * @param PUT_BYTE writes the converted UTF-8 bytes to any proper destination.
    299 * It could be a function or a statement, and uses tmp as the input byte.
    300 * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be
    301 * executed up to 4 times for values in the valid UTF-8 range and up to
    302 * 7 times in the general case, depending on the length of the converted
    303 * Unicode character.
    304 */
    305 #define PUT_UTF8(val, tmp, PUT_BYTE)\
    306    {\
    307        int bytes, shift;\
    308        uint32_t in = val;\
    309        if (in < 0x80) {\
    310            tmp = in;\
    311            PUT_BYTE\
    312        } else {\
    313            bytes = (av_log2(in) + 4) / 5;\
    314            shift = (bytes - 1) * 6;\
    315            tmp = (256 - (256 >> bytes)) | (in >> shift);\
    316            PUT_BYTE\
    317            while (shift >= 6) {\
    318                shift -= 6;\
    319                tmp = 0x80 | ((in >> shift) & 0x3f);\
    320                PUT_BYTE\
    321            }\
    322        }\
    323    }
    324 
    325 /**
    326 * @def PUT_UTF16(val, tmp, PUT_16BIT)
    327 * Convert a 32-bit Unicode character to its UTF-16 encoded form (2 or 4 bytes).
    328 * @param val is an input-only argument and should be of type uint32_t. It holds
    329 * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If
    330 * val is given as a function it is executed only once.
    331 * @param tmp is a temporary variable and should be of type uint16_t. It
    332 * represents an intermediate value during conversion that is to be
    333 * output by PUT_16BIT.
    334 * @param PUT_16BIT writes the converted UTF-16 data to any proper destination
    335 * in desired endianness. It could be a function or a statement, and uses tmp
    336 * as the input byte.  For example, PUT_BYTE could be "*output++ = tmp;"
    337 * PUT_BYTE will be executed 1 or 2 times depending on input character.
    338 */
    339 #define PUT_UTF16(val, tmp, PUT_16BIT)\
    340    {\
    341        uint32_t in = val;\
    342        if (in < 0x10000) {\
    343            tmp = in;\
    344            PUT_16BIT\
    345        } else {\
    346            tmp = 0xD800 | ((in - 0x10000) >> 10);\
    347            PUT_16BIT\
    348            tmp = 0xDC00 | ((in - 0x10000) & 0x3FF);\
    349            PUT_16BIT\
    350        }\
    351    }\
    352 
    353 
    354 
    355 #include "mem.h"
    356 
    357 #ifdef HAVE_AV_CONFIG_H
    358 #    include "internal.h"
    359 #endif /* HAVE_AV_CONFIG_H */
    360 
    361 #endif /* AVUTIL_COMMON_H */
    362 
    363 /*
    364 * The following definitions are outside the multiple inclusion guard
    365 * to ensure they are immediately available in intmath.h.
    366 */
    367 
    368 #ifndef av_ceil_log2
    369 #   define av_ceil_log2     av_ceil_log2_c
    370 #endif
    371 #ifndef av_clip
    372 #   define av_clip          av_clip_c
    373 #endif
    374 #ifndef av_clip_uint8
    375 #   define av_clip_uint8    av_clip_uint8_c
    376 #endif
    377 #ifndef av_clip_int8
    378 #   define av_clip_int8     av_clip_int8_c
    379 #endif
    380 #ifndef av_clip_uint16
    381 #   define av_clip_uint16   av_clip_uint16_c
    382 #endif
    383 #ifndef av_clip_int16
    384 #   define av_clip_int16    av_clip_int16_c
    385 #endif
    386 #ifndef av_clipl_int32
    387 #   define av_clipl_int32   av_clipl_int32_c
    388 #endif
    389 #ifndef av_clip_uintp2
    390 #   define av_clip_uintp2   av_clip_uintp2_c
    391 #endif
    392 #ifndef av_sat_add32
    393 #   define av_sat_add32     av_sat_add32_c
    394 #endif
    395 #ifndef av_sat_dadd32
    396 #   define av_sat_dadd32    av_sat_dadd32_c
    397 #endif
    398 #ifndef av_clipf
    399 #   define av_clipf         av_clipf_c
    400 #endif
    401 #ifndef av_popcount
    402 #   define av_popcount      av_popcount_c
    403 #endif
    404 #ifndef av_popcount64
    405 #   define av_popcount64    av_popcount64_c
    406 #endif