misc/winutils/include/libavutil/common.h
changeset 15388 262003f2e19a
parent 15387 90a79670de52
child 15389 7718bdf60d45
equal deleted inserted replaced
15387:90a79670de52 15388:262003f2e19a
     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 <ctype.h>
       
    30 #include <errno.h>
       
    31 #include <inttypes.h>
       
    32 #include <limits.h>
       
    33 #include <math.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         int ones= 7 - av_log2(val ^ 255);\
       
   256         if(ones==1)\
       
   257             ERROR\
       
   258         val&= 127>>ones;\
       
   259         while(--ones > 0){\
       
   260             int tmp= GET_BYTE - 128;\
       
   261             if(tmp>>6)\
       
   262                 ERROR\
       
   263             val= (val<<6) + tmp;\
       
   264         }\
       
   265     }
       
   266 
       
   267 /**
       
   268  * Convert a UTF-16 character (2 or 4 bytes) to its 32-bit UCS-4 encoded form.
       
   269  *
       
   270  * @param val       Output value, must be an lvalue of type uint32_t.
       
   271  * @param GET_16BIT Expression returning two bytes of UTF-16 data converted
       
   272  *                  to native byte order.  Evaluated one or two times.
       
   273  * @param ERROR     Expression to be evaluated on invalid input,
       
   274  *                  typically a goto statement.
       
   275  */
       
   276 #define GET_UTF16(val, GET_16BIT, ERROR)\
       
   277     val = GET_16BIT;\
       
   278     {\
       
   279         unsigned int hi = val - 0xD800;\
       
   280         if (hi < 0x800) {\
       
   281             val = GET_16BIT - 0xDC00;\
       
   282             if (val > 0x3FFU || hi > 0x3FFU)\
       
   283                 ERROR\
       
   284             val += (hi<<10) + 0x10000;\
       
   285         }\
       
   286     }\
       
   287 
       
   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  * a UCS-4 encoded Unicode character that is to be converted to UTF-8. If
       
   293  * 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  * It could be a function or a statement, and uses tmp as the input byte.
       
   299  * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be
       
   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 #define PUT_UTF8(val, tmp, PUT_BYTE)\
       
   305     {\
       
   306         int bytes, shift;\
       
   307         uint32_t in = val;\
       
   308         if (in < 0x80) {\
       
   309             tmp = in;\
       
   310             PUT_BYTE\
       
   311         } else {\
       
   312             bytes = (av_log2(in) + 4) / 5;\
       
   313             shift = (bytes - 1) * 6;\
       
   314             tmp = (256 - (256 >> bytes)) | (in >> shift);\
       
   315             PUT_BYTE\
       
   316             while (shift >= 6) {\
       
   317                 shift -= 6;\
       
   318                 tmp = 0x80 | ((in >> shift) & 0x3f);\
       
   319                 PUT_BYTE\
       
   320             }\
       
   321         }\
       
   322     }
       
   323 
       
   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
       
   328  * a UCS-4 encoded Unicode character that is to be converted to UTF-16. If
       
   329  * 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
       
   331  * represents an intermediate value during conversion that is to be
       
   332  * output by PUT_16BIT.
       
   333  * @param PUT_16BIT writes the converted UTF-16 data to any proper destination
       
   334  * in desired endianness. It could be a function or a statement, and uses tmp
       
   335  * as the input byte.  For example, PUT_BYTE could be "*output++ = tmp;"
       
   336  * PUT_BYTE will be executed 1 or 2 times depending on input character.
       
   337  */
       
   338 #define PUT_UTF16(val, tmp, PUT_16BIT)\
       
   339     {\
       
   340         uint32_t in = val;\
       
   341         if (in < 0x10000) {\
       
   342             tmp = in;\
       
   343             PUT_16BIT\
       
   344         } else {\
       
   345             tmp = 0xD800 | ((in - 0x10000) >> 10);\
       
   346             PUT_16BIT\
       
   347             tmp = 0xDC00 | ((in - 0x10000) & 0x3FF);\
       
   348             PUT_16BIT\
       
   349         }\
       
   350     }\
       
   351 
       
   352 
       
   353 
       
   354 #include "mem.h"
       
   355 
       
   356 #ifdef HAVE_AV_CONFIG_H
       
   357 #    include "internal.h"
       
   358 #endif /* HAVE_AV_CONFIG_H */
       
   359 
       
   360 #endif /* AVUTIL_COMMON_H */
       
   361 
       
   362 /*
       
   363  * The following definitions are outside the multiple inclusion guard
       
   364  * to ensure they are immediately available in intmath.h.
       
   365  */
       
   366 
       
   367 #ifndef av_ceil_log2
       
   368 #   define av_ceil_log2     av_ceil_log2_c
       
   369 #endif
       
   370 #ifndef av_clip
       
   371 #   define av_clip          av_clip_c
       
   372 #endif
       
   373 #ifndef av_clip_uint8
       
   374 #   define av_clip_uint8    av_clip_uint8_c
       
   375 #endif
       
   376 #ifndef av_clip_int8
       
   377 #   define av_clip_int8     av_clip_int8_c
       
   378 #endif
       
   379 #ifndef av_clip_uint16
       
   380 #   define av_clip_uint16   av_clip_uint16_c
       
   381 #endif
       
   382 #ifndef av_clip_int16
       
   383 #   define av_clip_int16    av_clip_int16_c
       
   384 #endif
       
   385 #ifndef av_clipl_int32
       
   386 #   define av_clipl_int32   av_clipl_int32_c
       
   387 #endif
       
   388 #ifndef av_clip_uintp2
       
   389 #   define av_clip_uintp2   av_clip_uintp2_c
       
   390 #endif
       
   391 #ifndef av_sat_add32
       
   392 #   define av_sat_add32     av_sat_add32_c
       
   393 #endif
       
   394 #ifndef av_sat_dadd32
       
   395 #   define av_sat_dadd32    av_sat_dadd32_c
       
   396 #endif
       
   397 #ifndef av_clipf
       
   398 #   define av_clipf         av_clipf_c
       
   399 #endif
       
   400 #ifndef av_popcount
       
   401 #   define av_popcount      av_popcount_c
       
   402 #endif
       
   403 #ifndef av_popcount64
       
   404 #   define av_popcount64    av_popcount64_c
       
   405 #endif