Re: [x265] [PATCH RFC] analysis: add CU specific details to encodeCU()
On Fri, Sep 12, 2014 at 6:05 PM, santhosh...@multicorewareinc.com wrote: # HG changeset patch # User Santhoshini Sekar santhosh...@multicorewareinc.com # Date 1410525310 -19800 # Fri Sep 12 18:05:10 2014 +0530 # Node ID bf4ebe5df0cab013e4462597b55bd505b2a6a71a # Parent 7e29b10982d2eb7fd79f581d6f04184522ba analysis: add CU specific details to encodeCU() diff -r 7e29b10982d2 -r bf4ebe5df0ca source/encoder/analysis.cpp --- a/source/encoder/analysis.cpp Thu Sep 11 19:24:28 2014 +0530 +++ b/source/encoder/analysis.cpp Fri Sep 12 18:05:10 2014 +0530 @@ -301,7 +301,6 @@ { if (cu-m_slice-m_pps-bUseDQP) m_bEncodeDQP = true; -loadCTUData(cu); // initialize CU data m_bestCU[0]-initCU(cu-m_pic, cu-getAddr()); diff -r 7e29b10982d2 -r bf4ebe5df0ca source/encoder/entropy.cpp --- a/source/encoder/entropy.cppThu Sep 11 19:24:28 2014 +0530 +++ b/source/encoder/entropy.cppFri Sep 12 18:05:10 2014 +0530 @@ -481,14 +481,14 @@ } } -void Entropy::encodeCTU(TComDataCU* cu) +void Entropy::encodeCTU(TComDataCU* cu, CU* cuData) { bool bEncodeDQP = cu-m_slice-m_pps-bUseDQP; -encodeCU(cu, 0, 0, false, bEncodeDQP); +encodeCU(cu, 0, 0, bEncodeDQP, cuData); } /* encode a CU block recursively */ -void Entropy::encodeCU(TComDataCU* cu, uint32_t absPartIdx, uint32_t depth, bool bInsidePicture, bool bEncodeDQP) +void Entropy::encodeCU(TComDataCU* cu, uint32_t absPartIdx, uint32_t depth, bool bEncodeDQP, CU* cuData) { Frame* pic = cu-m_pic; Slice* slice = cu-m_slice; @@ -496,30 +496,26 @@ if (depth = slice-m_pps-maxCuDQPDepth slice-m_pps-bUseDQP) bEncodeDQP = true; -if (!bInsidePicture) +int cu_split_flag = !(cuData-flags CU::LEAF); +int cu_unsplit_flag = !(cuData-flags CU::SPLIT_MANDATORY); + +uint32_t xmax = slice-m_sps-picWidthInLumaSamples - cu-getCUPelX(); +uint32_t ymax = slice-m_sps-picHeightInLumaSamples - cu-getCUPelY(); + +if (!cu_unsplit_flag) { -uint32_t xmax = slice-m_sps-picWidthInLumaSamples - cu-getCUPelX(); -uint32_t ymax = slice-m_sps-picHeightInLumaSamples - cu-getCUPelY(); -uint32_t cuSize = g_maxCUSize depth; - -bInsidePicture = (g_zscanToPelX[absPartIdx] + cuSize = xmax - g_zscanToPelY[absPartIdx] + cuSize = ymax); - -if (!bInsidePicture) +uint32_t qNumParts = (pic-getNumPartInCU() (depth 1)) 2; +for (uint32_t partUnitIdx = 0; partUnitIdx 4; partUnitIdx++, absPartIdx += qNumParts) { -uint32_t qNumParts = (pic-getNumPartInCU() (depth 1)) 2; -for (uint32_t partUnitIdx = 0; partUnitIdx 4; partUnitIdx++, absPartIdx += qNumParts) -{ -if (g_zscanToPelX[absPartIdx] xmax g_zscanToPelY[absPartIdx] ymax) -encodeCU(cu, absPartIdx, depth + 1, bInsidePicture, bEncodeDQP); -} - -return; +CU *childCU = cu-m_CULocalData + cuData-childIdx + partUnitIdx; +if (g_zscanToPelX[absPartIdx] xmax g_zscanToPelY[absPartIdx] ymax) Most of the patch looks correct, but can't the above if-check also replaced by one of the childCU flags? +encodeCU(cu, absPartIdx, depth + 1, bEncodeDQP, childCU); } +return; } // We need to split, so don't try these modes. -if (bInsidePicture depth g_maxCUDepth) +if (cu_split_flag) codeSplitFlag(cu, absPartIdx, depth); if (depth cu-getDepth(absPartIdx) depth g_maxCUDepth) @@ -527,7 +523,10 @@ uint32_t qNumParts = (pic-getNumPartInCU() (depth 1)) 2; for (uint32_t partUnitIdx = 0; partUnitIdx 4; partUnitIdx++, absPartIdx += qNumParts) -encodeCU(cu, absPartIdx, depth + 1, bInsidePicture, bEncodeDQP); +{ +CU *childCU = cu-m_CULocalData + cuData-childIdx + partUnitIdx; +encodeCU(cu, absPartIdx, depth + 1, bEncodeDQP, childCU); +} return; } diff -r 7e29b10982d2 -r bf4ebe5df0ca source/encoder/entropy.h --- a/source/encoder/entropy.h Thu Sep 11 19:24:28 2014 +0530 +++ b/source/encoder/entropy.h Fri Sep 12 18:05:10 2014 +0530 @@ -148,7 +148,7 @@ void codeShortTermRefPicSet(RPS* rps); void finishSlice() { encodeBinTrm(1); finish(); dynamic_castBitstream*(m_bitIf)-writeByteAlignment(); } -void encodeCTU(TComDataCU* cu); +void encodeCTU(TComDataCU* cu, CU *cuData); void codeSaoOffset(SaoLcuParam* saoLcuParam, uint32_t compIdx); void codeSaoUnitInterleaving(int compIdx, bool saoFlag, int rx, int ry, SaoLcuParam* saoLcuParam, int cuAddrInSlice, int cuAddrUpInSlice, int allowMergeLeft, int allowMergeUp); void codeSaoMerge(uint32_t code) { encodeBin(code, m_contextState[OFF_SAO_MERGE_FLAG_CTX]); } @@ -193,7 +193,7 @@ void
[x265] [PATCH RFC] analysis: add CU specific details to encodeCU()
# HG changeset patch # User Santhoshini Sekar santhosh...@multicorewareinc.com # Date 1410525310 -19800 # Fri Sep 12 18:05:10 2014 +0530 # Node ID bf4ebe5df0cab013e4462597b55bd505b2a6a71a # Parent 7e29b10982d2eb7fd79f581d6f04184522ba analysis: add CU specific details to encodeCU() diff -r 7e29b10982d2 -r bf4ebe5df0ca source/encoder/analysis.cpp --- a/source/encoder/analysis.cpp Thu Sep 11 19:24:28 2014 +0530 +++ b/source/encoder/analysis.cpp Fri Sep 12 18:05:10 2014 +0530 @@ -301,7 +301,6 @@ { if (cu-m_slice-m_pps-bUseDQP) m_bEncodeDQP = true; -loadCTUData(cu); // initialize CU data m_bestCU[0]-initCU(cu-m_pic, cu-getAddr()); diff -r 7e29b10982d2 -r bf4ebe5df0ca source/encoder/entropy.cpp --- a/source/encoder/entropy.cppThu Sep 11 19:24:28 2014 +0530 +++ b/source/encoder/entropy.cppFri Sep 12 18:05:10 2014 +0530 @@ -481,14 +481,14 @@ } } -void Entropy::encodeCTU(TComDataCU* cu) +void Entropy::encodeCTU(TComDataCU* cu, CU* cuData) { bool bEncodeDQP = cu-m_slice-m_pps-bUseDQP; -encodeCU(cu, 0, 0, false, bEncodeDQP); +encodeCU(cu, 0, 0, bEncodeDQP, cuData); } /* encode a CU block recursively */ -void Entropy::encodeCU(TComDataCU* cu, uint32_t absPartIdx, uint32_t depth, bool bInsidePicture, bool bEncodeDQP) +void Entropy::encodeCU(TComDataCU* cu, uint32_t absPartIdx, uint32_t depth, bool bEncodeDQP, CU* cuData) { Frame* pic = cu-m_pic; Slice* slice = cu-m_slice; @@ -496,30 +496,26 @@ if (depth = slice-m_pps-maxCuDQPDepth slice-m_pps-bUseDQP) bEncodeDQP = true; -if (!bInsidePicture) +int cu_split_flag = !(cuData-flags CU::LEAF); +int cu_unsplit_flag = !(cuData-flags CU::SPLIT_MANDATORY); + +uint32_t xmax = slice-m_sps-picWidthInLumaSamples - cu-getCUPelX(); +uint32_t ymax = slice-m_sps-picHeightInLumaSamples - cu-getCUPelY(); + +if (!cu_unsplit_flag) { -uint32_t xmax = slice-m_sps-picWidthInLumaSamples - cu-getCUPelX(); -uint32_t ymax = slice-m_sps-picHeightInLumaSamples - cu-getCUPelY(); -uint32_t cuSize = g_maxCUSize depth; - -bInsidePicture = (g_zscanToPelX[absPartIdx] + cuSize = xmax - g_zscanToPelY[absPartIdx] + cuSize = ymax); - -if (!bInsidePicture) +uint32_t qNumParts = (pic-getNumPartInCU() (depth 1)) 2; +for (uint32_t partUnitIdx = 0; partUnitIdx 4; partUnitIdx++, absPartIdx += qNumParts) { -uint32_t qNumParts = (pic-getNumPartInCU() (depth 1)) 2; -for (uint32_t partUnitIdx = 0; partUnitIdx 4; partUnitIdx++, absPartIdx += qNumParts) -{ -if (g_zscanToPelX[absPartIdx] xmax g_zscanToPelY[absPartIdx] ymax) -encodeCU(cu, absPartIdx, depth + 1, bInsidePicture, bEncodeDQP); -} - -return; +CU *childCU = cu-m_CULocalData + cuData-childIdx + partUnitIdx; +if (g_zscanToPelX[absPartIdx] xmax g_zscanToPelY[absPartIdx] ymax) +encodeCU(cu, absPartIdx, depth + 1, bEncodeDQP, childCU); } +return; } // We need to split, so don't try these modes. -if (bInsidePicture depth g_maxCUDepth) +if (cu_split_flag) codeSplitFlag(cu, absPartIdx, depth); if (depth cu-getDepth(absPartIdx) depth g_maxCUDepth) @@ -527,7 +523,10 @@ uint32_t qNumParts = (pic-getNumPartInCU() (depth 1)) 2; for (uint32_t partUnitIdx = 0; partUnitIdx 4; partUnitIdx++, absPartIdx += qNumParts) -encodeCU(cu, absPartIdx, depth + 1, bInsidePicture, bEncodeDQP); +{ +CU *childCU = cu-m_CULocalData + cuData-childIdx + partUnitIdx; +encodeCU(cu, absPartIdx, depth + 1, bEncodeDQP, childCU); +} return; } diff -r 7e29b10982d2 -r bf4ebe5df0ca source/encoder/entropy.h --- a/source/encoder/entropy.h Thu Sep 11 19:24:28 2014 +0530 +++ b/source/encoder/entropy.h Fri Sep 12 18:05:10 2014 +0530 @@ -148,7 +148,7 @@ void codeShortTermRefPicSet(RPS* rps); void finishSlice() { encodeBinTrm(1); finish(); dynamic_castBitstream*(m_bitIf)-writeByteAlignment(); } -void encodeCTU(TComDataCU* cu); +void encodeCTU(TComDataCU* cu, CU *cuData); void codeSaoOffset(SaoLcuParam* saoLcuParam, uint32_t compIdx); void codeSaoUnitInterleaving(int compIdx, bool saoFlag, int rx, int ry, SaoLcuParam* saoLcuParam, int cuAddrInSlice, int cuAddrUpInSlice, int allowMergeLeft, int allowMergeUp); void codeSaoMerge(uint32_t code) { encodeBin(code, m_contextState[OFF_SAO_MERGE_FLAG_CTX]); } @@ -193,7 +193,7 @@ void encodeBinsEP(uint32_t binValues, int numBins); void encodeBinTrm(uint32_t binValue); -void encodeCU(TComDataCU* cu, uint32_t absPartIdx, uint32_t depth, bool bInsidePicture, bool bEncodeDQP); +void encodeCU(TComDataCU* cu, uint32_t absPartIdx, uint32_t depth, bool