Ok, thanks. please send a follow-on patch cleaning up both encodeCU and compressCu functions.
On Tue, Sep 16, 2014 at 11:32 AM, Santhoshini Sekar < santhosh...@multicorewareinc.com> wrote: > > > On Tue, Sep 16, 2014 at 10:56 AM, Deepthi Nandakumar < > deep...@multicorewareinc.com> wrote: > >> >> >> On Tue, Sep 16, 2014 at 9:45 AM, <santhosh...@multicorewareinc.com> >> wrote: >> >>> # HG changeset patch >>> # User Santhoshini Sekar <santhosh...@multicorewareinc.com> >>> # Date 1410840429 -19800 >>> # Tue Sep 16 09:37:09 2014 +0530 >>> # Node ID 50505472d3e33b775c70f2f373e1c15d17e47e66 >>> # Parent 7e29b10982d2eb7fd79f581d99996f04184522ba >>> analysis: add CU specific details to encodeCU() >>> >>> diff -r 7e29b10982d2 -r 50505472d3e3 source/encoder/analysis.cpp >>> --- a/source/encoder/analysis.cpp Thu Sep 11 19:24:28 2014 +0530 >>> +++ b/source/encoder/analysis.cpp Tue Sep 16 09:37:09 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 50505472d3e3 source/encoder/entropy.cpp >>> --- a/source/encoder/entropy.cpp Thu Sep 11 19:24:28 2014 +0530 >>> +++ b/source/encoder/entropy.cpp Tue Sep 16 09:37:09 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,24 @@ >>> if (depth <= slice->m_pps->maxCuDQPDepth && slice->m_pps->bUseDQP) >>> bEncodeDQP = true; >>> >>> - if (!bInsidePicture) >>> + int cuSplitFlag = !(cuData->flags & CU::LEAF); >>> + int cuUnsplitFlag = !(cuData->flags & CU::SPLIT_MANDATORY); >>> + >>> + if (!cuUnsplitFlag) >>> { >>> - 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; >>> + int cuPresentFlagChild = !(childCU->flags & CU::PRESENT); >>> + if (!cuPresentFlagChild) >>> + encodeCU(cu, absPartIdx, depth + 1, bEncodeDQP, >>> childCU); >>> } >>> + return; >>> } >>> >>> // We need to split, so don't try these modes. >>> - if (bInsidePicture && depth < g_maxCUDepth) >>> + if (cuSplitFlag) >>> codeSplitFlag(cu, absPartIdx, depth); >>> >>> if (depth < cu->getDepth(absPartIdx) && depth < g_maxCUDepth) >>> @@ -527,7 +521,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 50505472d3e3 source/encoder/entropy.h >>> --- a/source/encoder/entropy.h Thu Sep 11 19:24:28 2014 +0530 >>> +++ b/source/encoder/entropy.h Tue Sep 16 09:37:09 2014 +0530 >>> @@ -148,7 +148,7 @@ >>> void codeShortTermRefPicSet(RPS* rps); >>> void finishSlice() { encodeBinTrm(1); finish(); >>> dynamic_cast<Bitstream*>(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& bEncodeDQP, CU *cuData); >>> void finishCU(TComDataCU* cu, uint32_t absPartIdx, uint32_t depth); >>> >>> void writeOut(); >>> diff -r 7e29b10982d2 -r 50505472d3e3 source/encoder/frameencoder.cpp >>> --- a/source/encoder/frameencoder.cpp Thu Sep 11 19:24:28 2014 +0530 >>> +++ b/source/encoder/frameencoder.cpp Tue Sep 16 09:37:09 2014 +0530 >>> @@ -470,8 +470,9 @@ >>> } >>> } >>> >>> + m_tld.cuCoder.loadCTUData(cu); >>> // final coding (bitstream generation) for this CU >>> - m_entropyCoder.encodeCTU(cu); >>> + m_entropyCoder.encodeCTU(cu, cu->m_CULocalData); >>> >>> Ok. This is the same in compressCU functions as well, but any reason >> cu->m_CULocalData cant just be accessed inside? >> > > No, we can directly access cu->m_CULocalData inside encodeCTU() and pass > it to encodeCU().No particular reason for doing it in this way. > >> >> >>> if (m_param->bEnableWavefront) >>> { >>> @@ -689,12 +690,13 @@ >>> // load current best state from go-on entropy coder >>> curRow.rdEntropyCoders[0][CI_CURR_BEST].load(rowCoder); >>> >>> + tld.cuCoder.loadCTUData(cu); >>> tld.cuCoder.m_quant.setQPforQuant(cu); >>> tld.cuCoder.compressCU(cu); // Does all the CU analysis >>> >>> /* advance top-level row coder to include the context of this >>> CTU. >>> * if SAO is disabled, rowCoder writes the final CTU bitstream >>> */ >>> - rowCoder.encodeCTU(cu); >>> + rowCoder.encodeCTU(cu, cu->m_CULocalData); >>> >>> if (m_param->bEnableWavefront && col == 1) >>> // Save CABAC state for next row >>> _______________________________________________ >>> x265-devel mailing list >>> x265-devel@videolan.org >>> https://mailman.videolan.org/listinfo/x265-devel >>> >> >> >> _______________________________________________ >> x265-devel mailing list >> x265-devel@videolan.org >> https://mailman.videolan.org/listinfo/x265-devel >> >> > > _______________________________________________ > x265-devel mailing list > x265-devel@videolan.org > https://mailman.videolan.org/listinfo/x265-devel > >
_______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel