ref: 8ff579bc9fd33692aa8139f06eb1060dc0a43f84
dir: /codec/common/inc/wels_common_defs.h/
/*! * \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_DEPTH_PARAM = 16, // NAL_UNIT_RESV_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_MVC_SLICE_EXT = 21, // NAL_UNIT_RESV_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_AU_DELIMITER_NAL(t) ( (t) == NAL_UNIT_AU_DELIMITER ) #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 }; enum EVuiVideoFormat { VUI_COMPONENT = 0, VUI_PAL = 1, VUI_NTSC = 2, VUI_SECAM = 3, VUI_MAC = 4, VUI_UNSPECIFIED = 5, VUI_RESERVED1 = 6, VUI_RESERVED2 = 7 }; /* * 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__