[x265] [PATCH] analysis: add CU specific details to encodeCU()
Steve Borho
steve at borho.org
Tue Sep 16 14:10:54 CEST 2014
On 09/16, santhoshini at multicorewareinc.com wrote:
> # HG changeset patch
> # User Santhoshini Sekar <santhoshini at multicorewareinc.com>
> # Date 1410848612 -19800
> # Tue Sep 16 11:53:32 2014 +0530
> # Node ID 74b5192133a548c492b8b2cb34dde8242107900e
> # Parent 7e29b10982d2eb7fd79f581d99996f04184522ba
> analysis: add CU specific details to encodeCU()
>
> diff -r 7e29b10982d2 -r 74b5192133a5 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 11:53:32 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 74b5192133a5 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 11:53:32 2014 +0530
> @@ -484,11 +484,11 @@
> void Entropy::encodeCTU(TComDataCU* cu)
> {
> bool bEncodeDQP = cu->m_slice->m_pps->bUseDQP;
> - encodeCU(cu, 0, 0, false, bEncodeDQP);
> + encodeCU(cu, 0, 0, bEncodeDQP, cu->m_CULocalData );
queued with this white-space nit fixed
> }
>
> /* 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 74b5192133a5 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 11:53:32 2014 +0530
> @@ -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 74b5192133a5 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 11:53:32 2014 +0530
> @@ -470,6 +470,7 @@
> }
> }
>
> + m_tld.cuCoder.loadCTUData(cu);
> // final coding (bitstream generation) for this CU
> m_entropyCoder.encodeCTU(cu);
>
> @@ -689,6 +690,7 @@
> // 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
>
> _______________________________________________
> x265-devel mailing list
> x265-devel at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
--
Steve Borho
More information about the x265-devel
mailing list