shithub: openh264

ref: b2f1cbaae975ec783a75843cd403d194a2d84bac
dir: /codec/common/inc/wels_common_defs.h/

View raw version
/*!
 * \copy
 *     Copyright (c)  2013, Cisco Systems
 *     All rights reserved.
 *
 *     Redistribution and use in source and binary forms, with or without
 *     modification, are permitted provided that the following conditions
 *     are met:
 *
 *        * Redistributions of source code must retain the above copyright
 *          notice, this list of conditions and the following disclaimer.
 *
 *        * Redistributions in binary form must reproduce the above copyright
 *          notice, this list of conditions and the following disclaimer in
 *          the documentation and/or other materials provided with the
 *          distribution.
 *
 *     THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
 *     "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
 *     LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
 *     FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
 *     COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
 *     INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
 *     BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 *     LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
 *     CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 *     LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
 *     ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
 *     POSSIBILITY OF SUCH DAMAGE.
 *
 */

//wels_common_defs.h
#ifndef WELS_COMMON_DEFS_H__
#define WELS_COMMON_DEFS_H__

#include "typedefs.h"
#include "macros.h"
#include "codec_app_def.h"


namespace WelsCommon {
/*common use table*/

#define  CTX_NA 0
#define  WELS_CONTEXT_COUNT 460
#define LEVEL_NUMBER 17
typedef struct TagLevelLimits {
  ELevelIdc uiLevelIdc;  // level idc
  uint32_t uiMaxMBPS; // Max macroblock processing rate(MB/s)
  uint32_t uiMaxFS;   // Max frame sizea(MBs)
  uint32_t uiMaxDPBMbs;// Max decoded picture buffer size(MBs)
  uint32_t uiMaxBR; // Max video bit rate
  uint32_t uiMaxCPB; // Max CPB size
  int16_t iMinVmv; // Vertical MV component range upper bound
  int16_t iMaxVmv; // Vertical MV component range lower bound
  uint16_t uiMinCR;  // Min compression ration
  int16_t iMaxMvsPer2Mb; // Max number of motion vectors per two consecutive MBs
} SLevelLimits;

#define CpbBrNalFactor 1200  //baseline,main,and extended profiles.
extern const SLevelLimits g_ksLevelLimits[LEVEL_NUMBER];
extern const uint32_t g_kuiLevelMaps[LEVEL_NUMBER];
extern const uint8_t g_kuiMbCountScan4Idx[24];
extern const uint8_t g_kuiCache30ScanIdx[16];
extern const uint8_t g_kuiCache48CountScan4Idx[24];

extern const uint8_t g_kuiMatrixV[6][8][8];

extern const uint8_t g_kuiDequantScaling4x4Default[2][16];
extern const uint8_t g_kuiDequantScaling8x8Default[2][64];
extern const ALIGNED_DECLARE (uint16_t, g_kuiDequantCoeff[52][8], 16);
extern const ALIGNED_DECLARE (uint16_t, g_kuiDequantCoeff8x8[52][64], 16);
extern const uint8_t g_kuiChromaQpTable[52];

extern const uint8_t g_kuiCabacRangeLps[64][4];
extern const int8_t g_kiCabacGlobalContextIdx[WELS_CONTEXT_COUNT][4][2];
extern const uint8_t g_kuiStateTransTable[64][2];
extern const uint32_t g_kuiGolombUELength[256];
/*
 *	NAL Unit Type (5 Bits)
 */
enum EWelsNalUnitType {
  NAL_UNIT_UNSPEC_0             = 0,
  NAL_UNIT_CODED_SLICE		= 1,
  NAL_UNIT_CODED_SLICE_DPA	= 2,
  NAL_UNIT_CODED_SLICE_DPB	= 3,
  NAL_UNIT_CODED_SLICE_DPC	= 4,
  NAL_UNIT_CODED_SLICE_IDR	= 5,
  NAL_UNIT_SEI		        = 6,
  NAL_UNIT_SPS		        = 7,
  NAL_UNIT_PPS		        = 8,
  NAL_UNIT_AU_DELIMITER		= 9,
  NAL_UNIT_END_OF_SEQ		= 10,
  NAL_UNIT_END_OF_STR		= 11,
  NAL_UNIT_FILLER_DATA		= 12,
  NAL_UNIT_SPS_EXT		= 13,
  NAL_UNIT_PREFIX		= 14,
  NAL_UNIT_SUBSET_SPS		= 15,
  NAL_UNIT_RESV_16		= 16,
  NAL_UNIT_RESV_17		= 17,
  NAL_UNIT_RESV_18		= 18,
  NAL_UNIT_AUX_CODED_SLICE	= 19,
  NAL_UNIT_CODED_SLICE_EXT	= 20,
  NAL_UNIT_RESV_21		= 21,
  NAL_UNIT_RESV_22		= 22,
  NAL_UNIT_RESV_23		= 23,
  NAL_UNIT_UNSPEC_24		= 24,
  NAL_UNIT_UNSPEC_25		= 25,
  NAL_UNIT_UNSPEC_26		= 26,
  NAL_UNIT_UNSPEC_27		= 27,
  NAL_UNIT_UNSPEC_28		= 28,
  NAL_UNIT_UNSPEC_29		= 29,
  NAL_UNIT_UNSPEC_30		= 30,
  NAL_UNIT_UNSPEC_31		= 31
};

/*
 *	NAL Reference IDC (2 Bits)
 */

enum EWelsNalRefIdc {
  NRI_PRI_LOWEST	= 0,
  NRI_PRI_LOW		= 1,
  NRI_PRI_HIGH	        = 2,
  NRI_PRI_HIGHEST	= 3
};

/*
 * VCL TYPE
 */

enum EVclType {
  NON_VCL			= 0,
  VCL				= 1,
  NOT_APP			= 2
};

/*
 *	vcl type map for given NAL unit type and corresponding H264 type (0: AVC; 1: SVC).
 */
extern const EVclType g_keTypeMap[32][2];

#define IS_VCL_NAL(t, ext_idx)			(g_keTypeMap[t][ext_idx] == VCL)
#define IS_PARAM_SETS_NALS(t)			( (t) == NAL_UNIT_SPS || (t) == NAL_UNIT_PPS || (t) == NAL_UNIT_SUBSET_SPS )
#define IS_SPS_NAL(t)				( (t) == NAL_UNIT_SPS )
#define IS_SUBSET_SPS_NAL(t)			( (t) == NAL_UNIT_SUBSET_SPS )
#define IS_PPS_NAL(t)				( (t) == NAL_UNIT_PPS )
#define IS_SEI_NAL(t)				( (t) == NAL_UNIT_SEI )
#define IS_PREFIX_NAL(t)			( (t) == NAL_UNIT_PREFIX )
#define IS_SUBSET_SPS_USED(t)			( (t) == NAL_UNIT_SUBSET_SPS || (t) == NAL_UNIT_CODED_SLICE_EXT )
#define IS_VCL_NAL_AVC_BASE(t)			( (t) == NAL_UNIT_CODED_SLICE || (t) == NAL_UNIT_CODED_SLICE_IDR )
#define IS_NEW_INTRODUCED_SVC_NAL(t)            ( (t) == NAL_UNIT_PREFIX || (t) == NAL_UNIT_CODED_SLICE_EXT )


/* Base SSlice Types
 * Invalid in case of eSliceType exceeds 9,
 * Need trim when eSliceType > 4 as fixed SliceType(eSliceType-4),
 * meaning mapped version after eSliceType minus 4.
 */

enum EWelsSliceType {
  P_SLICE	= 0,
  B_SLICE	= 1,
  I_SLICE	= 2,
  SP_SLICE      = 3,
  SI_SLICE      = 4,
  UNKNOWN_SLICE = 5
};

/* SSlice Types in scalable extension */
enum ESliceTypeExt {
  EP_SLICE = 0,	// EP_SLICE: 0, 5
  EB_SLICE = 1,	// EB_SLICE: 1, 6
  EI_SLICE = 2	// EI_SLICE: 2, 7
};

/* List Index */
enum EListIndex {
  LIST_0	= 0,
  LIST_1	= 1,
  LIST_A	= 2
};



/* Motion Vector components */
enum EMvComp {
  MV_X	= 0,
  MV_Y	= 1,
  MV_A	= 2
};

/* Chroma Components */

enum EChromaComp {
  CHROMA_CB	= 0,
  CHROMA_CR	= 1,
  CHROMA_A	= 2
};



/*
 *	Memory Management Control Operation (MMCO) code
 */
enum EMmcoCode {
  MMCO_END		= 0,
  MMCO_SHORT2UNUSED	= 1,
  MMCO_LONG2UNUSED	= 2,
  MMCO_SHORT2LONG	= 3,
  MMCO_SET_MAX_LONG	= 4,
  MMCO_RESET		= 5,
  MMCO_LONG		= 6
};

/*
 *	Bit-stream auxiliary reading / writing
 */
typedef struct TagBitStringAux {
  uint8_t* pStartBuf;	// buffer to start position
  uint8_t* pEndBuf;	// buffer + length
  int32_t  iBits;       // count bits of overall bitstreaming input

  intX_t   iIndex;      //only for cavlc usage
  uint8_t* pCurBuf;	// current reading position
  uint32_t uiCurBits;
  int32_t  iLeftBits;	// count number of available bits left ([1, 8]),
  // need pointer to next byte start position in case 0 bit left then 8 instead
} SBitStringAux, *PBitStringAux;

/* NAL Unix Header in AVC, refer to Page 56 in JVT X201wcm */
typedef struct TagNalUnitHeader {
  uint8_t             uiForbiddenZeroBit;
  uint8_t             uiNalRefIdc;
  EWelsNalUnitType    eNalUnitType;
  uint8_t             uiReservedOneByte;		// only padding usage
} SNalUnitHeader, *PNalUnitHeader;

/* NAL Unit Header in scalable extension syntax, refer to Page 390 in JVT X201wcm */
typedef struct TagNalUnitHeaderExt {
  SNalUnitHeader	sNalUnitHeader;

  //	uint8_t		reserved_one_bit;
  bool      bIdrFlag;
  uint8_t   uiPriorityId;
  int8_t    iNoInterLayerPredFlag;	// change as int8_t to support 3 values probably in encoder
  uint8_t   uiDependencyId;

  uint8_t   uiQualityId;
  uint8_t   uiTemporalId;
  bool      bUseRefBasePicFlag;
  bool      bDiscardableFlag;

  bool      bOutputFlag;
  uint8_t   uiReservedThree2Bits;
  // Derived variable(s)
  uint8_t   uiLayerDqId;
  bool      bNalExtFlag;
} SNalUnitHeaderExt, *PNalUnitHeaderExt;

/* AVC MB types*/
#define MB_TYPE_INTRA4x4    0x00000001
#define MB_TYPE_INTRA16x16  0x00000002
#define MB_TYPE_INTRA8x8    0x00000004
#define MB_TYPE_16x16       0x00000008
#define MB_TYPE_16x8        0x00000010
#define MB_TYPE_8x16        0x00000020
#define MB_TYPE_8x8         0x00000040
#define MB_TYPE_8x8_REF0    0x00000080
#define MB_TYPE_SKIP        0x00000100
#define MB_TYPE_INTRA_PCM   0x00000200
#define MB_TYPE_INTRA_BL    0x00000400

#define MB_TYPE_DIRECT2     0x00004000

#define SUB_MB_TYPE_8x8     0x00000001
#define SUB_MB_TYPE_8x4     0x00000002
#define SUB_MB_TYPE_4x8     0x00000004
#define SUB_MB_TYPE_4x4     0x00000008

#define MB_TYPE_INTRA     (MB_TYPE_INTRA4x4 | MB_TYPE_INTRA16x16 | MB_TYPE_INTRA8x8 | MB_TYPE_INTRA_PCM)
#define MB_TYPE_INTER     (MB_TYPE_16x16 | MB_TYPE_16x8 | MB_TYPE_8x16 | MB_TYPE_8x8 | MB_TYPE_8x8_REF0 | MB_TYPE_SKIP)
#define IS_INTRA4x4(type) ( MB_TYPE_INTRA4x4 == (type) )
#define IS_INTRA8x8(type) ( MB_TYPE_INTRA8x8 == (type) )
#define IS_INTRANxN(type) ( MB_TYPE_INTRA4x4 == (type) || MB_TYPE_INTRA8x8 == (type) )
#define IS_INTRA16x16(type) ( MB_TYPE_INTRA16x16 == (type) )
#define IS_INTRA(type) ( (type)&MB_TYPE_INTRA )
#define IS_INTER(type) ( (type)&MB_TYPE_INTER )

#define IS_SKIP(type) ( (type) == MB_TYPE_SKIP )
#define IS_SVC_INTER(type) IS_INTER(type)
#define IS_I_BL(type) ( (type) == MB_TYPE_INTRA_BL )
#define IS_SVC_INTRA(type) ( IS_I_BL(type) || IS_INTRA(type) )
#define IS_Inter_8x8(type) ( (type) == MB_TYPE_8x8)

#define REF_NOT_AVAIL   -2
#define REF_NOT_IN_LIST -1  //intra

/////////intra16x16  Luma
#define I16_PRED_INVALID   -1
#define I16_PRED_V       0
#define I16_PRED_H       1
#define I16_PRED_DC      2
#define I16_PRED_P       3

#define I16_PRED_DC_L    4
#define I16_PRED_DC_T    5
#define I16_PRED_DC_128  6
#define I16_PRED_DC_A  7
//////////intra4x4   Luma
// Here, I8x8 also use these definitions
#define I4_PRED_INVALID    0
#define I4_PRED_V        0
#define I4_PRED_H        1
#define I4_PRED_DC       2
#define I4_PRED_DDL      3 //diagonal_down_left
#define I4_PRED_DDR      4 //diagonal_down_right
#define I4_PRED_VR       5 //vertical_right
#define I4_PRED_HD       6 //horizon_down
#define I4_PRED_VL       7 //vertical_left
#define I4_PRED_HU       8 //horizon_up

#define I4_PRED_DC_L     9
#define I4_PRED_DC_T     10
#define I4_PRED_DC_128   11

#define I4_PRED_DDL_TOP  12 //right-top replacing by padding rightmost pixel of top
#define I4_PRED_VL_TOP   13 //right-top replacing by padding rightmost pixel of top
#define I4_PRED_A   14

//////////intra Chroma
#define C_PRED_INVALID   -1
#define C_PRED_DC        0
#define C_PRED_H         1
#define C_PRED_V         2
#define C_PRED_P         3

#define C_PRED_DC_L      4
#define C_PRED_DC_T      5
#define C_PRED_DC_128    6
#define C_PRED_A    7
}
#endif//WELS_COMMON_DEFS_H__