345 lines
11 KiB
C++
345 lines
11 KiB
C++
/*!
|
|
* \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__
|