macros.h
来自「AMLOGIC DPF source code」· C头文件 代码 · 共 781 行 · 第 1/2 页
H
781 行
/*************************************************************************
Copyright (C) Microsoft Corporation, 1996 - 1999
Module Name:
Macros.h
Abstract:
Processor-specific macros, defines, and data types.
Author:
Raymond Cheng (raych) Jul 29, 1999
Revision History:
*************************************************************************/
#ifndef __COMMON_MACROS_H
#define __COMMON_MACROS_H
#ifndef DISABLE_ASSERTS
#define DISABLE_ASSERTS
#endif // DISABLE_ASSERTS
// If BUILD_INTEGER or BUILD_INT_FLOAT is not defined by project set default state
#ifdef SDE_WANTS_ASSERTS
// This should be defined only when an SDE is watching and never when checking in or for builds.
// a compiler warning message is on wmaos.c
# ifdef DISABLE_ASSERTS
# undef DISABLE_ASSERTS
# endif
#elif !defined(DISABLE_ASSERTS)
// DISABLE ASSERTS because of a known issue. V4-encoded streams can contain garbage
// at the end which we will detect as an invalid bitstream.
# define DISABLE_ASSERTS
#endif
//#include "constants.h"
// rainrca
// The following are ANSI C includes, and so should be safe for all platforms
#include <assert.h> // If this doesn't exist, you must write an "assert" macro
#include <string.h>
#include <stdlib.h>
#ifdef DISABLE_ASSERTS
#undef assert
#define assert(a)
#endif // DISABLE_ASSERTS
// ======================================================
// ANSI-C version (no platform-specific details
// ======================================================
#define WMA_TARGET_ANSI
// Default endian
#if !defined(LITTLE_ENDIAN) && !defined(BIG_ENDIAN)
#define LITTLE_ENDIAN
#endif
// **************************************************************************
// Default Fundamental Typedefs
// **************************************************************************
typedef unsigned long int U32;
typedef long int I32;
typedef unsigned short U16;
typedef short I16;
typedef unsigned char U8;
typedef signed char I8;
// **************************************************************************
// Common Typedefs (not expected to change by platform)
// **************************************************************************
#ifndef _WMARESULT_DEFINED
#define _WMARESULT_DEFINED
typedef I32 WMARESULT;
// SUCCESS codes
static const WMARESULT WMA_OK = 0x00000000;
static const WMARESULT WMA_S_FALSE = 0x00000001;
static const WMARESULT WMA_S_BUFUNDERFLOW = 0x00000002;
static const WMARESULT WMA_S_NEWPACKET = 0x00000003;
static const WMARESULT WMA_S_NO_MORE_FRAME = 0x00000004;
static const WMARESULT WMA_S_DEFAULT = 0x00000005;
static const WMARESULT WMA_S_SWITCHCHMODE = 0x00000006; // Internal error, corrected internally
// ERROR codes
static const WMARESULT WMA_E_FAIL = 0x80004005;
static const WMARESULT WMA_E_OUTOFMEMORY = 0x8007000E;
static const WMARESULT WMA_E_INVALIDARG = 0x80070057;
static const WMARESULT WMA_E_NOTSUPPORTED = 0x80040000;
static const WMARESULT WMA_E_LOSTPACKET = 0x80040001;
static const WMARESULT WMA_E_BROKEN_FRAME = 0x80040002;
static const WMARESULT WMA_E_BUFFEROVERFLOW = 0x80040003;
static const WMARESULT WMA_E_ONHOLD = 0x80040004;
//ON_HOLD: the decoder can't continue operating because of sth, most
// likely no more data for flushing, getbits or peekbits. all functions
// stop *immediately*.
static const WMARESULT WMA_E_BUFFERUNDERFLOW =0x80040005;
static const WMARESULT WMA_E_INVALIDRECHDR = 0x80040006;
static const WMARESULT WMA_E_SYNCERROR = 0x80040007;
static const WMARESULT WMA_E_NOTIMPL = 0x80040008;
static const WMARESULT WMA_E_FLUSHOVERFLOW = 0x80040009; // Too much input data provided to flush
static const WMARESULT WMA_E_NOMOREINPUT = 0x8004000A; // Streaming mode: absolutely no more data (returned via GetMoreData callback)
#endif // _WMARESULT_DEFINED
#define WMAB_TRUE 1
#define WMAB_FALSE 0
#define own // used as "reserved word" to indicate ownership or transfer to distinguish from const
typedef double Double;
typedef float Float;
typedef void Void;
typedef U32 UInt;
typedef I32 Int;
typedef I32 Bool; // In Win32, BOOL is an "int" == 4 bytes. Keep it this way to reduce problems.
// **************************************************************************
// Overridable Compiler Directives
// **************************************************************************
// This should hopefully work for most compilers. It works for VC
#define COMPILER_MESSAGE(x) message(x)
#define COMPILER_PACKALIGN(x) pack(x)
#define COMPILER_PACKALIGN_DEFAULT pack()
#define MSVC_DISABLE_WARNING(x)
#define MSVC_RESTORE_WARNING(x)
#define MSVC_CDECL
//#define INLINE static
#ifdef INLINE
#undef INLINE
#endif
#define INLINE _Inline
// **************************************************************************
// Macros Common to All Platforms
// **************************************************************************
// If you need to override the following for just one platform, #define a
// switch to override as in the case for ROUNDF/ROUNDD above in the
// platform-specific #ifdefs so that it is plain to see.
#define MULT_HI(a,b) (MULT_HI_DWORD(a,b)<<1)
#define max(a,b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define checkRange(x, a, b) (((x) < (a)) ? (a) : (((x) > (b)) ? (b) : (x)))
#define DELETE_ARRAY(ptr) if (ptr!=NULL) auFree (ptr); ptr = NULL;
#define DELETE_PTR(ptr) if (ptr!=NULL) auFree (ptr); ptr = NULL;
#define ARRAY_SIZE(ar) (sizeof(ar)/sizeof((ar)[0]))
# ifdef DEBUG_ONLY
// WCE already has this macro defined in the same way, avoid warning messages
# undef DEBUG_ONLY
# endif
#ifdef _DEBUG
#define DEBUG_ONLY(x) x
#else // _DEBUG
#define DEBUG_ONLY(x)
#endif // _DEBUG
#if defined(LITTLE_ENDIAN)
#define DEFAULTENDIAN_TO_BIGENDIAN(i) ByteSwap(i)
#define BIGENDIAN_TO_DEFAULTENDIAN(i) ByteSwap(i)
#elif defined(BIG_ENDIAN)
#define DEFAULTENDIAN_TO_BIGENDIAN(i) (i)
#define BIGENDIAN_TO_DEFAULTENDIAN(i) (i)
#else
#error Must define the endian of the target platform
#endif // ENDIAN
#define SWAP_WORD( w ) (w) = ((w) << 8) | ((w) >> 8)
#define SWAP_DWORD( dw ) (dw) = ((dw) << 24) | ( ((dw) & 0xFF00) << 8 ) | ( ((dw) & 0xFF0000) >> 8 ) | ( ((dw) & 0xFF000000) >> 24);
// WMARESULT macros (stolen from winerror.h)
#define WMA_SUCCEEDED(Status) ((WMARESULT)(Status) >= 0)
#define WMA_FAILED(Status) ((WMARESULT)(Status)<0)
// Create types which are change implementation between BUILD_INTEGER and BUILD_INT_FLOAT
// Some platforms, like the X86 and the SH4, can implement either build efficently.
// Other platforms, with only emulated floating point support, are typically only build with BUILD_INTEGER
//
// Each type defined below is either a float (BUILD_INT_FLOAT) and an I32 with some number of fractional bits (BUILD_INTEGER)
// Use float or and I32 with five fractional bits
// And create a type for trig functions (Float or I32 with 30 fractional bits)
// Coefficents type (output of inverse quantization, transformed by DCT and overlapped/added)
// Range is +/- 2^26 with five fractional bits
typedef I32 CoefType;
# define COEF_FRAC_BITS 5
# define COEF_FRAC_SCALE (1<<COEF_FRAC_BITS)
# define COEF_FROM_FLOAT(flt) ((CoefType)(flt*COEF_FRAC_SCALE))
# define FLOAT_FROM_COEF(coef) (coef/((Float)COEF_FRAC_SCALE))
# define COEF_FROM_INT(i) ((i)<<COEF_FRAC_BITS)
# define INT_FROM_COEF(cf) ((cf)>>COEF_FRAC_BITS)
// Fractional Type with range -2.0 <= x < 2.0 used by FFT Trig Recurrsion
typedef I32 BP2Type;
# define BP2_FRAC_BITS 30
# define BP2_FRAC_SCALE NF2BP2
# define BP2_FROM_FLOAT(flt) ((BP2Type)(flt*BP2_FRAC_SCALE))
# define FLOAT_FROM_BP2(bp2) (bp2/((Float)BP2_FRAC_SCALE))
# define BP2_FROM_BP1(bp1) ((bp1)>>1)
#ifndef RAIN_MULTCOUNT
# define MULT_BP2(a,b) MULT_HI_DWORD_DOWN((a),(b))
#else
extern int multcount;
extern I32 MULT_BP2(I32 a, I32 b);
#endif
// Fractional type with range -1.0 <= x < 1.0 used by DCT Trig Recurrsion
typedef I32 BP1Type;
# define BP1_FRAC_BITS 31
# define BP1_FRAC_SCALE NF2BP1
# define BP1_FROM_FLOAT(flt) ((BP2Type)(flt*BP1_FRAC_SCALE))
# define FLOAT_FROM_BP1(bp1) (bp1/((Float)BP1_FRAC_SCALE))
# define MULT_BP1(a,b) MULT_HI((a),(b))
// Fraction is stored at 2^32 (BP0)
#define UBP0_FROM_FLOAT(x) ((U32)(x*4294967296.0F))
typedef I32 FracBitsType;
typedef struct {
//I8 exponent; Old exponent was shift from binary point at 24th position
FracBitsType iFracBits;
I32 iFraction;
} FastFloat;
// Type for holding quantization magnitide returned by prvWeightedQuantization
typedef FastFloat QuantFloat;
//****************************************************************************
// Types, constants related to LPC.
// Lot of these could be moved to constants.h or lpcConst.h for cleanliness
//****************************************************************************
// LSP (aka LSF), used for inverse quantized LSF.
typedef Int LspType;
# define FRACT_BITS_LSP 30
# define LSP_SCALE (1<<FRACT_BITS_LSP)
# define LSP_FROM_FLOAT(a) ((LpType)((a)*LSP_SCALE))
# define MULT_LSP(a,b) (I32)((((I64)(a))*((I64)(b)))>>FRACT_BITS_LSP)
// MULT_LSP may be redefined by processor specific code in macros_cpu.h
// LP, used for P, Q, and LPC values
typedef Int LpType;
# ifndef MATCH_ARM_WAY
# define FRACT_BITS_LP 27
# else
# define FRACT_BITS_LP 26
# endif
# define LP_SCALE (1<<FRACT_BITS_LP)
# define FLOAT_FROM_LP(a) ((Float)((a)*(1.0f/LP_SCALE)))
# define LP_FROM_FLOAT(a) ((LpType)((a)*LP_SCALE))
// LP Spectrum: used during FFT of LPC values
// LP Spectrum power: sum-squares of FFT output
typedef Int LpSpecType;
#if defined (LPCPOWER32)
// Uses 32-bit intermediates
// LPC scale is 2^21. Making it any larger causes overflows in the square(x) function
// in LPC_TO_SPECTRUM. But would like more frac bits, because the small values of the
// spectrum yield larger WeightFactors. And float version on the same sound uses
// IQR(1.575e-7) = 75.5795. Largest IQR of 1/LPC_SCALE is 38 or the result for values
// less than that which is 1/(2*LPC_SCALE) => 45.25.
# define FRACT_BITS_LP_SPEC 21
typedef UInt LpSpecPowerType;
# define BITS_LP_SPEC_POWER 32
# define FRACT_BITS_LP_SPEC_POWER 21
# define QR_FRACTION_FRAC_BITS 27
# define QR_EXPONENT_FRAC_BITS 25
#else // !LPCPOWER32
// Uses 64-bit intermediates
# ifndef MATCH_ARM_WAY
# define FRACT_BITS_LP_SPEC 25
# else
// ARM's use of 26 instead of 25 produces BIG relative errors compared to LPC_COMPARE
// at least when using the old version of the Lpc code.
//# define FRACT_BITS_LP_SPEC 26
# define FRACT_BITS_LP_SPEC 25
# endif
# define BITS_LP_SPEC_POWER 64
# define FRACT_BITS_LP_SPEC_POWER 30
# define QR_FRACTION_FRAC_BITS 24
# define QR_EXPONENT_FRAC_BITS 29
#endif // LPCPOWER32
# define LP_SPEC_SCALE (1<<FRACT_BITS_LP_SPEC)
# define LP_SPEC_POWER_SCALE ((float)(1L<<FRACT_BITS_LP_SPEC_POWER))
# define LP_SPEC_FROM_FLOAT(a) ((LpSpecType)((a)*LP_SPEC_SCALE))
# define LP_SPEC_POWER_FROM_FLOAT(a) ((LpSpecType)((a)*LP_SPEC_POWER_SCALE))
# define FLOAT_FROM_LP_SPEC(a) ((Float)((a)*(1.0f/LP_SPEC_SCALE)))
# define LP_SPEC_FROM_LP(a) ((LpSpecType)((a)>>(FRACT_BITS_LP-FRACT_BITS_LP_SPEC)))
// Weights, computed from LPC (and Bark?).
typedef UInt WeightType;
// We see weight factor values upto 64.53440857: 7 bits enough to cover integer part,
// leaving upto 25 bits for fraction. However, only 21 bits of fraction are generated
// upstream, making other 4 bits zero, even if used.
#if defined (LPCPOWER32)
# define WEIGHTFACTOR_FRACT_BITS 20
#else
# ifndef MATCH_ARM_WAY
# define WEIGHTFACTOR_FRACT_BITS 21
# else
# define WEIGHTFACTOR_FRACT_BITS 25
# endif
#endif
# define WEIGHT_FROM_FLOAT(a) ((WeightType)((a)*(1<<WEIGHTFACTOR_FRACT_BITS)))
# define FLOAT_FROM_WEIGHT(a) ((Float)((a)*(1.0f/(1<<WEIGHTFACTOR_FRACT_BITS))))
//****************************************************************************
// End of types, constants related to LPC.
//****************************************************************************
// Some utility functions with obvious meaning
# define DIV2(a) ((a)>>1)
# define MUL2(a) ((a)<<1)
# define DIV4(a) ((a)>>2)
# define MUL4(a) ((a)<<2)
# define MUL8(a) ((a)<<3)
# define INTEGER_ONLY(a) a
# define INTEGER_OR_INT_FLOAT(a,b) a
// some utility macros that are type specific to avoid the compiler's type conversion rules.
#define COEF_ABS(a) (((a)<0) ? -(a) : (a))
#define BPX_ABS(a) (((a)<0) ? -(a) : (a))
#if !(defined(REFERENCE_RAND_24) || defined(REFERENCE_RAND_16))
//****************************************************************************
// quick and dirty rand generator, assuming low word multiply, only works for
// 32-bit machines see Numerical Recipes p.284.
// Note this is the referenced generator but the 24-bit or 16-bit versions can
// be used for compliance comparisions with 24-bit or 16-bit implementations.
//****************************************************************************
typedef struct tagRandState {
I32 iPrior; // prior value
U32 uiRand; // current value
} tRandState;
static INLINE I32 quickRand(tRandState* ptRandState)
{
const U32 a = 1664525;
const U32 c = 1013904223;
I32 iTemp, iTemp1;
//a*x + c has to be done with unsigned 32 bit
ptRandState->uiRand = a * ptRandState->uiRand + c;
// uiRand values starting from a 0 seed are: 0x3c6ef35f, 0x47502932, 0xd1ccf6e9, 0xaaf95334, 0x6252e503, 0x9f2ec686, 0x57fe6c2d, ...
// do not change the above - this reference generator has been extensively tested and has excellent randomness properties
// a truism in the world of random number generator theory and practice is:
// "any change, no matter how small, can and will change the properties of the generator and must be fully tested"
// In case you don't know, it can easily take a person-month to fully test a generator.
// Notwithstanding the above, it is fair to take a function of a random number to shape its range or distribution.
// This we do below to give it a triangular distrbution between -2.5 and 2.5 to roughly approximate a Guassian distribution.
// cast and shift to make the range (-1, 1) with Binary Point 3.
iTemp = ((I32)(ptRandState->uiRand)) >> 2;
// *1.25 to make the range (-1.25, 1.25)
iTemp += (iTemp>>2);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?