LCOV - code coverage report
Current view: top level - media/libav/libavutil - common.h (source / functions) Hit Total Coverage
Test: output.info Lines: 0 3 0.0 %
Date: 2017-07-14 16:53:18 Functions: 0 0 -
Legend: Lines: hit not hit

          Line data    Source code
       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           0 :     if      (a < amin) return amin;
      96           0 :     else if (a > amax) return amax;
      97           0 :     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

Generated by: LCOV version 1.13