From 1888fba3360a7e2824b918e61960b81838edd47a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Martin=20Storsj=C3=B6?= Date: Thu, 26 Jun 2014 14:57:06 +0300 Subject: [PATCH] Move pfCavlcParamCal into the function pointer list This avoids using a global variable for this function. --- codec/encoder/core/inc/set_mb_syn_cavlc.h | 16 ++++--------- codec/encoder/core/inc/svc_set_mb_syn_cavlc.h | 2 +- codec/encoder/core/inc/wels_func_ptr_def.h | 5 ++++ codec/encoder/core/src/encoder.cpp | 2 +- codec/encoder/core/src/set_mb_syn_cavlc.cpp | 12 +++++----- .../encoder/core/src/svc_set_mb_syn_cavlc.cpp | 24 +++++++++---------- 6 files changed, 29 insertions(+), 32 deletions(-) diff --git a/codec/encoder/core/inc/set_mb_syn_cavlc.h b/codec/encoder/core/inc/set_mb_syn_cavlc.h index be74e9d4..bac2567b 100644 --- a/codec/encoder/core/inc/set_mb_syn_cavlc.h +++ b/codec/encoder/core/inc/set_mb_syn_cavlc.h @@ -43,6 +43,7 @@ #include "typedefs.h" #include "bit_stream.h" +#include "wels_func_ptr_def.h" namespace WelsSVCEnc { @@ -59,25 +60,16 @@ CHROMA_AC = 4 #define LUMA_DC_AC 0x04 -typedef int32_t (*PCavlcParamCalFunc) (int16_t* pCoff, uint8_t* pRun, int16_t* pLevel, int32_t* pTotalCoeffs, - int32_t iEndIdx); - -typedef struct TagCoeffFunc { -PCavlcParamCalFunc pfCavlcParamCal; -} SCoeffFunc; - -/* For CAVLC */ -extern SCoeffFunc sCoeffFunc; - typedef struct TagCavlcTableItem { uint16_t uiBits; uint8_t uiLen; uint8_t uiSuffixLength; } SCavlcTableItem; -void InitCoeffFunc (const uint32_t uiCpuFlag); +void InitCoeffFunc (SWelsFuncPtrList* pFuncList, const uint32_t uiCpuFlag); -int32_t WriteBlockResidualCavlc (int16_t* pCoffLevel, int32_t iEndIdx, int32_t iCalRunLevelFlag, +int32_t WriteBlockResidualCavlc (SWelsFuncPtrList* pFuncList, int16_t* pCoffLevel, int32_t iEndIdx, + int32_t iCalRunLevelFlag, int32_t iResidualProperty, int8_t iNC, SBitStringAux* pBs); #if defined(__cplusplus) diff --git a/codec/encoder/core/inc/svc_set_mb_syn_cavlc.h b/codec/encoder/core/inc/svc_set_mb_syn_cavlc.h index c03a29ba..de2311fe 100644 --- a/codec/encoder/core/inc/svc_set_mb_syn_cavlc.h +++ b/codec/encoder/core/inc/svc_set_mb_syn_cavlc.h @@ -50,7 +50,7 @@ namespace WelsSVCEnc { -int32_t WelsWriteMbResidual (SMbCache* sMbCacheInfo, SMB* pCurMb, SBitStringAux* pBs); +int32_t WelsWriteMbResidual (SWelsFuncPtrList* pFuncList, SMbCache* sMbCacheInfo, SMB* pCurMb, SBitStringAux* pBs); void WelsSpatialWriteSubMbPred (sWelsEncCtx* pEncCtx, SSlice* pSlice, SMB* pCurMb); diff --git a/codec/encoder/core/inc/wels_func_ptr_def.h b/codec/encoder/core/inc/wels_func_ptr_def.h index ed048037..4e824cfb 100644 --- a/codec/encoder/core/inc/wels_func_ptr_def.h +++ b/codec/encoder/core/inc/wels_func_ptr_def.h @@ -191,6 +191,9 @@ typedef bool (*PBuildRefListFunc) (void* pCtx, const int32_t iPOC, int32_t iBest typedef void (*PMarkPicFunc) (void* pCtx); typedef bool (*PUpdateRefListFunc) (void* pCtx); +typedef int32_t (*PCavlcParamCalFunc) (int16_t* pCoff, uint8_t* pRun, int16_t* pLevel, int32_t* pTotalCoeffs, + int32_t iEndIdx); + struct TagWelsFuncPointerList { SExpandPicFunc sExpandPicFunc; PFillInterNeighborCacheFunc pfFillInterNeighborCache; @@ -280,6 +283,8 @@ struct TagWelsFuncPointerList { PBuildRefListFunc pBuildRefList; PMarkPicFunc pMarkPic; PUpdateRefListFunc pUpdateRefList; + + PCavlcParamCalFunc pfCavlcParamCal; }; } //end of namespace WelsSVCEnc { diff --git a/codec/encoder/core/src/encoder.cpp b/codec/encoder/core/src/encoder.cpp index 9ce7d751..d511eda1 100644 --- a/codec/encoder/core/src/encoder.cpp +++ b/codec/encoder/core/src/encoder.cpp @@ -200,7 +200,7 @@ int32_t InitFunctionPointers (SWelsFuncPtrList* pFuncList, SWelsSvcCodingParam* /*init pixel average function*/ /*get one column or row pixel when refinement*/ WelsInitMcFuncs (pFuncList, uiCpuFlag); - InitCoeffFunc (uiCpuFlag); + InitCoeffFunc (pFuncList, uiCpuFlag); WelsInitEncodingFuncs (pFuncList, uiCpuFlag); WelsInitReconstructionFuncs (pFuncList, uiCpuFlag); diff --git a/codec/encoder/core/src/set_mb_syn_cavlc.cpp b/codec/encoder/core/src/set_mb_syn_cavlc.cpp index 708e93f9..bbf491f5 100644 --- a/codec/encoder/core/src/set_mb_syn_cavlc.cpp +++ b/codec/encoder/core/src/set_mb_syn_cavlc.cpp @@ -44,7 +44,6 @@ #include "wels_const.h" namespace WelsSVCEnc { -SCoeffFunc sCoeffFunc; const ALIGNED_DECLARE (uint8_t, g_kuiZeroLeftMap[16], 16) = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 7, 7, 7, 7, 7, 7, 7 @@ -74,7 +73,8 @@ int32_t CavlcParamCal_c (int16_t* pCoffLevel, uint8_t* pRun, int16_t* pLevel, in return iTotalZeros; } -int32_t WriteBlockResidualCavlc (int16_t* pCoffLevel, int32_t iEndIdx, int32_t iCalRunLevelFlag, +int32_t WriteBlockResidualCavlc (SWelsFuncPtrList* pFuncList, int16_t* pCoffLevel, int32_t iEndIdx, + int32_t iCalRunLevelFlag, int32_t iResidualProperty, int8_t iNC, SBitStringAux* pBs) { ENFORCE_STACK_ALIGN_1D (int16_t, iLevel, 16, 16) ENFORCE_STACK_ALIGN_1D (uint8_t, uiRun, 16, 16) @@ -95,7 +95,7 @@ int32_t WriteBlockResidualCavlc (int16_t* pCoffLevel, int32_t iEndIdx, int32_t if (iCalRunLevelFlag) { int32_t iCount = 0; - iTotalZeros = sCoeffFunc.pfCavlcParamCal (pCoffLevel, uiRun, iLevel, &iTotalCoeffs, iEndIdx); + iTotalZeros = pFuncList->pfCavlcParamCal (pCoffLevel, uiRun, iLevel, &iTotalCoeffs, iEndIdx); iCount = (iTotalCoeffs > 3) ? 3 : iTotalCoeffs; for (i = 0; i < iCount ; i++) { if (WELS_ABS (iLevel[i]) == 1) { @@ -200,12 +200,12 @@ int32_t WriteBlockResidualCavlc (int16_t* pCoffLevel, int32_t iEndIdx, int32_t } -void InitCoeffFunc (const uint32_t uiCpuFlag) { - sCoeffFunc.pfCavlcParamCal = CavlcParamCal_c; +void InitCoeffFunc (SWelsFuncPtrList* pFuncList, const uint32_t uiCpuFlag) { + pFuncList->pfCavlcParamCal = CavlcParamCal_c; #if defined(X86_ASM) if (uiCpuFlag & WELS_CPU_SSE2) { - // sCoeffFunc.pfCavlcParamCal = CavlcParamCal_sse2; + // pFuncList->pfCavlcParamCal = CavlcParamCal_sse2; } #endif } diff --git a/codec/encoder/core/src/svc_set_mb_syn_cavlc.cpp b/codec/encoder/core/src/svc_set_mb_syn_cavlc.cpp index 96e9de91..ad13f5ee 100644 --- a/codec/encoder/core/src/svc_set_mb_syn_cavlc.cpp +++ b/codec/encoder/core/src/svc_set_mb_syn_cavlc.cpp @@ -244,7 +244,7 @@ int32_t WelsSpatialWriteMbSyn (sWelsEncCtx* pEncCtx, SSlice* pSlice, SMB* pCurMb pSlice->uiLastMbQp = pCurMb->uiLumaQp; BsWriteSE (pBs, kiDeltaQp); - if (WelsWriteMbResidual (pMbCache, pCurMb, pBs)) + if (WelsWriteMbResidual (pEncCtx->pFuncList, pMbCache, pCurMb, pBs)) return ENC_RETURN_VLCOVERFLOWFOUND; } else { pCurMb->uiLumaQp = pSlice->uiLastMbQp; @@ -256,7 +256,7 @@ int32_t WelsSpatialWriteMbSyn (sWelsEncCtx* pEncCtx, SSlice* pSlice, SMB* pCurMb return CheckBitstreamBuffer (pSlice->uiSliceIdx, pEncCtx, pBs); } -int32_t WelsWriteMbResidual (SMbCache* sMbCacheInfo, SMB* pCurMb, SBitStringAux* pBs) { +int32_t WelsWriteMbResidual (SWelsFuncPtrList* pFuncList, SMbCache* sMbCacheInfo, SMB* pCurMb, SBitStringAux* pBs) { int32_t i; Mb_Type uiMbType = pCurMb->uiMbType; const int32_t kiCbpChroma = pCurMb->uiCbp >> 4; @@ -270,7 +270,7 @@ int32_t WelsWriteMbResidual (SMbCache* sMbCacheInfo, SMB* pCurMb, SBitStringAux* iA = pNonZeroCoeffCount[8]; iB = pNonZeroCoeffCount[ 1]; WELS_NON_ZERO_COUNT_AVERAGE (iC, iA, iB); - if (WriteBlockResidualCavlc (sMbCacheInfo->pDct->iLumaI16x16Dc, 15, 1, LUMA_4x4, iC, pBs)) + if (WriteBlockResidualCavlc (pFuncList, sMbCacheInfo->pDct->iLumaI16x16Dc, 15, 1, LUMA_4x4, iC, pBs)) return ENC_RETURN_VLCOVERFLOWFOUND; /* AC Luma */ @@ -282,7 +282,7 @@ int32_t WelsWriteMbResidual (SMbCache* sMbCacheInfo, SMB* pCurMb, SBitStringAux* iA = pNonZeroCoeffCount[iIdx - 1]; iB = pNonZeroCoeffCount[iIdx - 8]; WELS_NON_ZERO_COUNT_AVERAGE (iC, iA, iB); - if (WriteBlockResidualCavlc (pBlock, 14, pNonZeroCoeffCount[iIdx] > 0, LUMA_AC, iC, pBs)) + if (WriteBlockResidualCavlc (pFuncList, pBlock, 14, pNonZeroCoeffCount[iIdx] > 0, LUMA_AC, iC, pBs)) return ENC_RETURN_VLCOVERFLOWFOUND; pBlock += 16; } @@ -302,25 +302,25 @@ int32_t WelsWriteMbResidual (SMbCache* sMbCacheInfo, SMB* pCurMb, SBitStringAux* iA = pNonZeroCoeffCount[iIdx - 1]; iB = pNonZeroCoeffCount[iIdx - 8]; WELS_NON_ZERO_COUNT_AVERAGE (iC, iA, iB); - if (WriteBlockResidualCavlc (pBlock, 15, kiA > 0, LUMA_4x4, iC, pBs)) + if (WriteBlockResidualCavlc (pFuncList, pBlock, 15, kiA > 0, LUMA_4x4, iC, pBs)) return ENC_RETURN_VLCOVERFLOWFOUND; iA = kiA; iB = pNonZeroCoeffCount[iIdx - 7]; WELS_NON_ZERO_COUNT_AVERAGE (iC, iA, iB); - if (WriteBlockResidualCavlc (pBlock + 16, 15, kiB > 0, LUMA_4x4, iC, pBs)) + if (WriteBlockResidualCavlc (pFuncList, pBlock + 16, 15, kiB > 0, LUMA_4x4, iC, pBs)) return ENC_RETURN_VLCOVERFLOWFOUND; iA = pNonZeroCoeffCount[iIdx + 7]; iB = kiA; WELS_NON_ZERO_COUNT_AVERAGE (iC, iA, iB); - if (WriteBlockResidualCavlc (pBlock + 32, 15, kiC > 0, LUMA_4x4, iC, pBs)) + if (WriteBlockResidualCavlc (pFuncList, pBlock + 32, 15, kiC > 0, LUMA_4x4, iC, pBs)) return ENC_RETURN_VLCOVERFLOWFOUND; iA = kiC; iB = kiB; WELS_NON_ZERO_COUNT_AVERAGE (iC, iA, iB); - if (WriteBlockResidualCavlc (pBlock + 48, 15, kiD > 0, LUMA_4x4, iC, pBs)) + if (WriteBlockResidualCavlc (pFuncList, pBlock + 48, 15, kiD > 0, LUMA_4x4, iC, pBs)) return ENC_RETURN_VLCOVERFLOWFOUND; } pBlock += 64; @@ -331,11 +331,11 @@ int32_t WelsWriteMbResidual (SMbCache* sMbCacheInfo, SMB* pCurMb, SBitStringAux* if (kiCbpChroma) { /* Chroma DC residual present */ pBlock = sMbCacheInfo->pDct->iChromaDc[0]; // Cb - if (WriteBlockResidualCavlc (pBlock, 3, 1, CHROMA_DC, CHROMA_DC_NC_OFFSET, pBs)) + if (WriteBlockResidualCavlc (pFuncList, pBlock, 3, 1, CHROMA_DC, CHROMA_DC_NC_OFFSET, pBs)) return ENC_RETURN_VLCOVERFLOWFOUND; pBlock += 4; // Cr - if (WriteBlockResidualCavlc (pBlock, 3, 1, CHROMA_DC, CHROMA_DC_NC_OFFSET, pBs)) + if (WriteBlockResidualCavlc (pFuncList, pBlock, 3, 1, CHROMA_DC, CHROMA_DC_NC_OFFSET, pBs)) return ENC_RETURN_VLCOVERFLOWFOUND; /* Chroma AC residual present */ @@ -348,7 +348,7 @@ int32_t WelsWriteMbResidual (SMbCache* sMbCacheInfo, SMB* pCurMb, SBitStringAux* iA = pNonZeroCoeffCount[iIdx - 1]; iB = pNonZeroCoeffCount[iIdx - 8]; WELS_NON_ZERO_COUNT_AVERAGE (iC, iA, iB); - if (WriteBlockResidualCavlc (pBlock, 14, pNonZeroCoeffCount[iIdx] > 0, CHROMA_AC, iC, pBs)) + if (WriteBlockResidualCavlc (pFuncList, pBlock, 14, pNonZeroCoeffCount[iIdx] > 0, CHROMA_AC, iC, pBs)) return ENC_RETURN_VLCOVERFLOWFOUND; pBlock += 16; } @@ -360,7 +360,7 @@ int32_t WelsWriteMbResidual (SMbCache* sMbCacheInfo, SMB* pCurMb, SBitStringAux* iA = pNonZeroCoeffCount[iIdx - 1]; iB = pNonZeroCoeffCount[iIdx - 8]; WELS_NON_ZERO_COUNT_AVERAGE (iC, iA, iB); - if (WriteBlockResidualCavlc (pBlock, 14, pNonZeroCoeffCount[iIdx] > 0, CHROMA_AC, iC, pBs)) + if (WriteBlockResidualCavlc (pFuncList, pBlock, 14, pNonZeroCoeffCount[iIdx] > 0, CHROMA_AC, iC, pBs)) return ENC_RETURN_VLCOVERFLOWFOUND; pBlock += 16; }