common.h
上传用户:chinavct
上传日期:2022-06-20
资源大小:330k
文件大小:16k
源码类别:

流媒体/Mpeg4/MP4

开发平台:

Visual C++

  1. /*
  2.  * copyright (c) 2006 Michael Niedermayer <michaelni@gmx.at>
  3.  *
  4.  * This file is part of FFmpeg.
  5.  *
  6.  * FFmpeg 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.  * FFmpeg 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 FFmpeg; if not, write to the Free Software
  18.  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  19.  */
  20. /**
  21.  * @file common.h
  22.  * common internal and external API header
  23.  */
  24. #ifndef AVUTIL_COMMON_H
  25. #define AVUTIL_COMMON_H
  26. //#include <inttypes.h>
  27. #ifndef _SIZE_T_DEFINED
  28. #define size_t unsigned int
  29. #define _SIZE_T_DEFINED
  30. #endif
  31. #ifdef WIN32
  32. #define inline __inline
  33. #endif
  34. #ifndef NULL
  35. #define NULL (void*)0
  36. #endif
  37. #if defined(WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)
  38. #    define CONFIG_WIN32
  39. #endif
  40. #if defined(WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__) && !defined(EMULATE_INTTYPES)
  41. #    define EMULATE_INTTYPES
  42. #endif
  43. #ifndef M_PI
  44. #define M_PI    3.14159265358979323846
  45. #endif
  46. #include "config.h"
  47. #include <stdlib.h>
  48. #include <stdio.h>
  49. #include <string.h>
  50. #include <ctype.h>
  51. #include <limits.h>
  52. #ifndef __BEOS__
  53. #   include <errno.h>
  54. #else
  55. #   include "berrno.h"
  56. #endif
  57. #include <math.h>
  58. #include <stddef.h>
  59. #ifndef offsetof
  60. # define offsetof(T,F) ((unsigned int)((char *)&((T *)0)->F))
  61. #endif
  62. #define AVOPTION_CODEC_BOOL(name, help, field) 
  63.     { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_BOOL }
  64. #define AVOPTION_CODEC_DOUBLE(name, help, field, minv, maxv, defval) 
  65.     { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_DOUBLE, minv, maxv, defval }
  66. #define AVOPTION_CODEC_FLAG(name, help, field, flag, defval) 
  67.     { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_FLAG, flag, 0, defval }
  68. #define AVOPTION_CODEC_INT(name, help, field, minv, maxv, defval) 
  69.     { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_INT, minv, maxv, defval }
  70. #define AVOPTION_CODEC_STRING(name, help, field, str, val) 
  71.     { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_STRING, .defval = val, .defstr = str }
  72. #define AVOPTION_CODEC_RCOVERRIDE(name, help, field) 
  73.     { name, help, offsetof(AVCodecContext, field), FF_OPT_TYPE_RCOVERRIDE, .defval = 0, .defstr = NULL }
  74. #define AVOPTION_SUB(ptr) { .name = NULL, .help = (const char*)ptr }
  75. #define AVOPTION_END() AVOPTION_SUB(NULL)
  76. typedef signed char  int8_t;
  77. typedef signed short int16_t;
  78. typedef signed int   int32_t;
  79. typedef unsigned char  uint8_t;
  80. typedef unsigned short uint16_t;
  81. typedef unsigned int   uint32_t;
  82. #ifdef CONFIG_WIN32
  83. typedef signed __int64   int64_t;
  84. typedef unsigned __int64 uint64_t;
  85. #else /* other OS */
  86. typedef signed long long   int64_t;
  87. typedef unsigned long long uint64_t;
  88. #endif /* other OS */
  89. #ifndef PRId64
  90. #define PRId64 "lld"
  91. #endif
  92. #ifndef PRIu64
  93. #define PRIu64 "llu"
  94. #endif
  95. #ifndef PRIx64
  96. #define PRIx64 "llx"
  97. #endif
  98. #ifndef PRId32
  99. #define PRId32 "d"
  100. #endif
  101. #ifndef PRIdFAST16
  102. #define PRIdFAST16 PRId32
  103. #endif
  104. #ifndef PRIdFAST32
  105. #define PRIdFAST32 PRId32
  106. #endif
  107. #ifndef INT16_MIN
  108. #define INT16_MIN       (-0x7fff-1)
  109. #endif
  110. #ifndef INT16_MAX
  111. #define INT16_MAX       0x7fff
  112. #endif
  113. #ifndef INT32_MIN
  114. #define INT32_MIN       (-0x7fffffff-1)
  115. #endif
  116. #ifndef INT32_MAX
  117. #define INT32_MAX       0x7fffffff
  118. #endif
  119. #ifndef UINT32_MAX
  120. #define UINT32_MAX      0xffffffff
  121. #endif
  122. #ifndef INT64_MIN
  123. #define INT64_MIN       (-1-(int64_t)0x7fffffffffffffff)
  124. #endif
  125. #ifndef INT64_MAX
  126. #define INT64_MAX int64_t_C(9223372036854775807)
  127. #endif
  128. #ifndef UINT64_MAX
  129. #define UINT64_MAX uint64_t_C(0xFFFFFFFFFFFFFFFF)
  130. #endif
  131. typedef signed char int_fast8_t;
  132. typedef signed int  int_fast16_t;
  133. typedef signed int  int_fast32_t;
  134. typedef unsigned char uint_fast8_t;
  135. typedef unsigned int  uint_fast16_t;
  136. typedef unsigned int  uint_fast32_t;
  137. typedef uint64_t      uint_fast64_t;
  138. #ifndef INT_BIT
  139. #    if INT_MAX != 2147483647
  140. #        define INT_BIT 64
  141. #    else
  142. #        define INT_BIT 32
  143. #    endif
  144. #endif
  145. #if defined(CONFIG_OS2) || defined(CONFIG_SUNOS)
  146. static inline float floorf(float f) 
  147. {
  148.     return floor(f);
  149. }
  150. #endif
  151. #ifdef CONFIG_WIN32 /* windows */
  152. #    if !defined(__MINGW32__) && !defined(__CYGWIN__)
  153. #        define int64_t_C(c)     (c ## i64)
  154. #        define uint64_t_C(c)    (c ## i64)
  155. #        define INT64_C(c)  (c ## i64)
  156. #        define UINT64_C(c)  (c ## i64)
  157. #    ifdef HAVE_AV_CONFIG_H
  158. #            define inline __inline
  159. #    endif
  160. #    else
  161. #        define int64_t_C(c)     (c ## LL)
  162. #        define uint64_t_C(c)    (c ## ULL)
  163. #    endif /* __MINGW32__ */
  164. #    define snprintf _snprintf
  165. #    define vsnprintf _vsnprintf
  166. #else /* unix */
  167. #ifndef int64_t_C
  168. #define int64_t_C(c)     (c ## LL)
  169. #define uint64_t_C(c)    (c ## ULL)
  170. #endif
  171. #ifdef USE_FASTMEMCPY
  172. #  include "fastmemcpy.h"
  173. # endif
  174. #endif /* !CONFIG_WIN32 && !CONFIG_OS2 */
  175. #    include "bswap.h"
  176. // Use rip-relative addressing if compiling PIC code on x86-64.
  177. #    if defined(__MINGW32__) || defined(__CYGWIN__) || 
  178.         defined(__OS2__) || (defined (__OpenBSD__) && !defined(__ELF__))
  179. #        if defined(ARCH_X86_64) && defined(PIC)
  180. #            define MANGLE(a) "_" #a"(%%rip)"
  181. #        else
  182. #            define MANGLE(a) "_" #a
  183. #        endif
  184. #    else
  185. #        if defined(ARCH_X86_64) && defined(PIC)
  186. #            define MANGLE(a) #a"(%%rip)"
  187. #        elif defined(CONFIG_DARWIN)
  188. #            define MANGLE(a) "_" #a
  189. #        else
  190. //#            define MANGLE(a) #a
  191. #        endif
  192. #    endif
  193. /* debug stuff */
  194. #include <assert.h>
  195. /* dprintf macros */
  196. #    if defined(CONFIG_WIN32) && !defined(__MINGW32__) && !defined(__CYGWIN__)
  197. inline void dprintf(const char* fmt,...) {}
  198. #    else
  199. #        ifdef DEBUG
  200. #            define dprintf(fmt,...) av_log(NULL, AV_LOG_DEBUG, fmt, __VA_ARGS__)
  201. #        else
  202. #            define dprintf(fmt,...)
  203. #        endif
  204. #    endif /* !CONFIG_WIN32 */
  205. #ifdef HAVE_AV_CONFIG_H
  206. /* only include the following when compiling package */
  207. #    include "config.h"
  208. #    include <stdlib.h>
  209. #    include <stdio.h>
  210. #    include <string.h>
  211. #    include <ctype.h>
  212. #    include <limits.h>
  213. #    include <errno.h>
  214. #    include <math.h>
  215. #endif /* HAVE_AV_CONFIG_H */
  216. #define AV_GCC_VERSION_AT_LEAST(x,y) (defined(__GNUC__) && (__GNUC__ > x || __GNUC__ == x && __GNUC_MINOR__ >= y))
  217. #ifndef av_always_inline
  218. #if AV_GCC_VERSION_AT_LEAST(3,1)
  219. #    define av_always_inline __attribute__((always_inline)) inline
  220. #else
  221. #    define av_always_inline inline
  222. #endif
  223. #endif
  224. #ifndef av_noinline
  225. #if AV_GCC_VERSION_AT_LEAST(3,1)
  226. #    define av_noinline __attribute__((noinline))
  227. #else
  228. #    define av_noinline
  229. #endif
  230. #endif
  231. #ifndef av_pure
  232. #if AV_GCC_VERSION_AT_LEAST(3,1)
  233. #    define av_pure __attribute__((pure))
  234. #else
  235. #    define av_pure
  236. #endif
  237. #endif
  238. #ifndef av_const
  239. #if AV_GCC_VERSION_AT_LEAST(2,6)
  240. #    define av_const __attribute__((const))
  241. #else
  242. #    define av_const
  243. #endif
  244. #endif
  245. #ifndef av_cold
  246. #if (!defined(__ICC) || __ICC > 1100) && AV_GCC_VERSION_AT_LEAST(4,3)
  247. #    define av_cold __attribute__((cold))
  248. #else
  249. #    define av_cold
  250. #endif
  251. #endif
  252. #ifdef HAVE_AV_CONFIG_H
  253. #    include "internal.h"
  254. #endif /* HAVE_AV_CONFIG_H */
  255. #ifndef attribute_deprecated
  256. #if AV_GCC_VERSION_AT_LEAST(3,1)
  257. #    define attribute_deprecated __attribute__((deprecated))
  258. #else
  259. #    define attribute_deprecated
  260. #endif
  261. #endif
  262. #ifndef av_unused
  263. #if defined(__GNUC__)
  264. #    define av_unused __attribute__((unused))
  265. #else
  266. #    define av_unused
  267. #endif
  268. #endif
  269. #include "mem.h"
  270. //rounded divison & shift
  271. #define RSHIFT(a,b) ((a) > 0 ? ((a) + ((1<<(b))>>1))>>(b) : ((a) + ((1<<(b))>>1)-1)>>(b))
  272. /* assume b>0 */
  273. #define ROUNDED_DIV(a,b) (((a)>0 ? (a) + ((b)>>1) : (a) - ((b)>>1))/(b))
  274. #define FFABS(a) ((a) >= 0 ? (a) : (-(a)))
  275. #define FFSIGN(a) ((a) > 0 ? 1 : -1)
  276. #define FFMAX(a,b) ((a) > (b) ? (a) : (b))
  277. #define FFMAX3(a,b,c) FFMAX(FFMAX(a,b),c)
  278. #define FFMIN(a,b) ((a) > (b) ? (b) : (a))
  279. #define FFMIN3(a,b,c) FFMIN(FFMIN(a,b),c)
  280. #define FFSWAP(type,a,b) do{type SWAP_tmp= b; b= a; a= SWAP_tmp;}while(0)
  281. #define FF_ARRAY_ELEMS(a) (sizeof(a) / sizeof((a)[0]))
  282. /* misc math functions */
  283. extern const uint8_t ff_log2_tab[256];
  284. static inline av_const int av_log2(unsigned int v)
  285. {
  286.     int n = 0;
  287.     if (v & 0xffff0000) {
  288.         v >>= 16;
  289.         n += 16;
  290.     }
  291.     if (v & 0xff00) {
  292.         v >>= 8;
  293.         n += 8;
  294.     }
  295.     n += ff_log2_tab[v];
  296.     return n;
  297. }
  298. static inline av_const int av_log2_16bit(unsigned int v)
  299. {
  300.     int n = 0;
  301.     if (v & 0xff00) {
  302.         v >>= 8;
  303.         n += 8;
  304.     }
  305.     n += ff_log2_tab[v];
  306.     return n;
  307. }
  308. /* median of 3 */
  309. static inline av_const int mid_pred(int a, int b, int c)
  310. {
  311. #ifdef HAVE_CMOV
  312.     int i=b;
  313.     __asm__ volatile(
  314.         "cmp    %2, %1 nt"
  315.         "cmovg  %1, %0 nt"
  316.         "cmovg  %2, %1 nt"
  317.         "cmp    %3, %1 nt"
  318.         "cmovl  %3, %1 nt"
  319.         "cmp    %1, %0 nt"
  320.         "cmovg  %1, %0 nt"
  321.         :"+&r"(i), "+&r"(a)
  322.         :"r"(b), "r"(c)
  323.     );
  324.     return i;
  325. #elif 0
  326.     int t= (a-b)&((a-b)>>31);
  327.     a-=t;
  328.     b+=t;
  329.     b-= (b-c)&((b-c)>>31);
  330.     b+= (a-b)&((a-b)>>31);
  331.     return b;
  332. #else
  333.     if(a>b){
  334.         if(c>b){
  335.             if(c>a) b=a;
  336.             else    b=c;
  337.         }
  338.     }else{
  339.         if(b>c){
  340.             if(c>a) b=c;
  341.             else    b=a;
  342.         }
  343.     }
  344.     return b;
  345. #endif
  346. }
  347. /**
  348.  * clip a signed integer value into the amin-amax range
  349.  * @param a value to clip
  350.  * @param amin minimum value of the clip range
  351.  * @param amax maximum value of the clip range
  352.  * @return clipped value
  353.  */
  354. static inline av_const int av_clip(int a, int amin, int amax)
  355. {
  356.     if      (a < amin) return amin;
  357.     else if (a > amax) return amax;
  358.     else               return a;
  359. }
  360. /**
  361.  * clip a signed integer value into the 0-255 range
  362.  * @param a value to clip
  363.  * @return clipped value
  364.  */
  365. static inline av_const uint8_t av_clip_uint8(int a)
  366. {
  367.     if (a&(~255)) return (-a)>>31;
  368.     else          return a;
  369. }
  370. /**
  371.  * clip a signed integer value into the -32768,32767 range
  372.  * @param a value to clip
  373.  * @return clipped value
  374.  */
  375. static inline av_const int16_t av_clip_int16(int a)
  376. {
  377.     if ((a+32768) & ~65535) return (a>>31) ^ 32767;
  378.     else                    return a;
  379. }
  380. /**
  381.  * clip a float value into the amin-amax range
  382.  * @param a value to clip
  383.  * @param amin minimum value of the clip range
  384.  * @param amax maximum value of the clip range
  385.  * @return clipped value
  386.  */
  387. static inline av_const float av_clipf(float a, float amin, float amax)
  388. {
  389.     if      (a < amin) return amin;
  390.     else if (a > amax) return amax;
  391.     else               return a;
  392. }
  393. /**
  394.  * converts fourcc string to int
  395.  */
  396. static inline av_pure int ff_get_fourcc(const char *s){
  397. #ifdef HAVE_AV_CONFIG_H
  398.     assert( strlen(s)==4 );
  399. #endif
  400.     return (s[0]) + (s[1]<<8) + (s[2]<<16) + (s[3]<<24);
  401. }
  402. #define MKTAG(a,b,c,d) (a | (b << 8) | (c << 16) | (d << 24))
  403. #define MKBETAG(a,b,c,d) (d | (c << 8) | (b << 16) | (a << 24))
  404. /*!
  405.  * def GET_UTF8(val, GET_BYTE, ERROR)
  406.  * converts a UTF-8 character (up to 4 bytes long) to its 32-bit UCS-4 encoded form
  407.  * param val is the output and should be of type uint32_t. It holds the converted
  408.  * UCS-4 character and should be a left value.
  409.  * param GET_BYTE gets UTF-8 encoded bytes from any proper source. It can be
  410.  * a function or a statement whose return value or evaluated value is of type
  411.  * uint8_t. It will be executed up to 4 times for values in the valid UTF-8 range,
  412.  * and up to 7 times in the general case.
  413.  * param ERROR action that should be taken when an invalid UTF-8 byte is returned
  414.  * from GET_BYTE. It should be a statement that jumps out of the macro,
  415.  * like exit(), goto, return, break, or continue.
  416.  */
  417. #define GET_UTF8(val, GET_BYTE, ERROR)
  418.     val= GET_BYTE;
  419.     {
  420.         int ones= 7 - av_log2(val ^ 255);
  421.         if(ones==1)
  422.             ERROR
  423.         val&= 127>>ones;
  424.         while(--ones > 0){
  425.             int tmp= GET_BYTE - 128;
  426.             if(tmp>>6)
  427.                 ERROR
  428.             val= (val<<6) + tmp;
  429.         }
  430.     }
  431. /*!
  432.  * def PUT_UTF8(val, tmp, PUT_BYTE)
  433.  * converts a 32-bit unicode character to its UTF-8 encoded form (up to 4 bytes long).
  434.  * param val is an input only argument and should be of type uint32_t. It holds
  435.  * a ucs4 encoded unicode character that is to be converted to UTF-8. If
  436.  * val is given as a function it's executed only once.
  437.  * param tmp is a temporary variable and should be of type uint8_t. It
  438.  * represents an intermediate value during conversion that is to be
  439.  * outputted by PUT_BYTE.
  440.  * param PUT_BYTE writes the converted UTF-8 bytes to any proper destination.
  441.  * It could be a function or a statement, and uses tmp as the input byte.
  442.  * For example, PUT_BYTE could be "*output++ = tmp;" PUT_BYTE will be
  443.  * executed up to 4 times for values in the valid UTF-8 range and up to
  444.  * 7 times in the general case, depending on the length of the converted
  445.  * unicode character.
  446.  */
  447. #define PUT_UTF8(val, tmp, PUT_BYTE)
  448.     {
  449.         int bytes, shift;
  450.         uint32_t in = val;
  451.         if (in < 0x80) {
  452.             tmp = in;
  453.             PUT_BYTE
  454.         } else {
  455.             bytes = (av_log2(in) + 4) / 5;
  456.             shift = (bytes - 1) * 6;
  457.             tmp = (256 - (256 >> bytes)) | (in >> shift);
  458.             PUT_BYTE
  459.             while (shift >= 6) {
  460.                 shift -= 6;
  461.                 tmp = 0x80 | ((in >> shift) & 0x3f);
  462.                 PUT_BYTE
  463.             }
  464.         }
  465.     }
  466. #if defined(ARCH_X86) || defined(ARCH_PPC) || defined(ARCH_BFIN)
  467. #define AV_READ_TIME read_time
  468. #if defined(ARCH_X86)
  469. static inline uint64_t read_time(void)
  470. {
  471.     uint32_t a, d;
  472.     __asm__ volatile("rdtscnt"
  473.                  : "=a" (a), "=d" (d));
  474.     return ((uint64_t)d << 32) + a;
  475. }
  476. #elif ARCH_BFIN
  477. static inline uint64_t read_time(void)
  478. {
  479.     union {
  480.         struct {
  481.             unsigned lo;
  482.             unsigned hi;
  483.         } p;
  484.         unsigned long long c;
  485.     } t;
  486.     __asm__ volatile ("%0=cycles; %1=cycles2;" : "=d" (t.p.lo), "=d" (t.p.hi));
  487.     return t.c;
  488. }
  489. #else //FIXME check ppc64
  490. static inline uint64_t read_time(void)
  491. {
  492.     uint32_t tbu, tbl, temp;
  493.      /* from section 2.2.1 of the 32-bit PowerPC PEM */
  494.      __asm__ volatile(
  495.          "1:n"
  496.          "mftbu  %2n"
  497.          "mftb   %0n"
  498.          "mftbu  %1n"
  499.          "cmpw   %2,%1n"
  500.          "bne    1bn"
  501.      : "=r"(tbl), "=r"(tbu), "=r"(temp)
  502.      :
  503.      : "cc");
  504.      return (((uint64_t)tbu)<<32) | (uint64_t)tbl;
  505. }
  506. #endif
  507. #elif defined(HAVE_GETHRTIME)
  508. #define AV_READ_TIME gethrtime
  509. #endif
  510. #ifdef AV_READ_TIME
  511. #define START_TIMER 
  512. uint64_t tend;
  513. uint64_t tstart= AV_READ_TIME();
  514. #define STOP_TIMER(id) 
  515. tend= AV_READ_TIME();
  516. {
  517.     static uint64_t tsum=0;
  518.     static int tcount=0;
  519.     static int tskip_count=0;
  520.     if(tcount<2 || tend - tstart < FFMAX(8*tsum/tcount, 2000)){
  521.         tsum+= tend - tstart;
  522.         tcount++;
  523.     }else
  524.         tskip_count++;
  525.     if(((tcount+tskip_count)&(tcount+tskip_count-1))==0){
  526.         av_log(NULL, AV_LOG_ERROR, "%"PRIu64" dezicycles in %s, %d runs, %d skipsn",
  527.                tsum*10/tcount, id, tcount, tskip_count);
  528.     }
  529. }
  530. #else
  531. #define START_TIMER
  532. #define STOP_TIMER(id) {}
  533. #endif
  534. /**
  535.  * Returns NULL if CONFIG_SMALL is defined otherwise the argument
  536.  * without modifications, used to disable the definition of strings
  537.  * (for example AVCodec long_names).
  538.  */
  539. #ifdef CONFIG_SMALL
  540. #   define NULL_IF_CONFIG_SMALL(x) NULL
  541. #else
  542. #   define NULL_IF_CONFIG_SMALL(x) x
  543. #endif
  544. inline long long llrint(double x)
  545. {
  546.     return (__int64)(x + (x < 0 ? -0.5 : 0.5));
  547. }
  548. #endif /* AVUTIL_COMMON_H */