[x265] [PATCH RFC] analysis: add CU specific details to encodeCU()

Deepthi Nandakumar deepthi at multicorewareinc.com
Sun Sep 14 12:53:36 CEST 2014


On Fri, Sep 12, 2014 at 6:05 PM, <santhoshini at multicorewareinc.com> wrote:

> # HG changeset patch
> # User Santhoshini Sekar <santhoshini at multicorewareinc.com>
> # Date 1410525310 -19800
> #      Fri Sep 12 18:05:10 2014 +0530
> # Node ID bf4ebe5df0cab013e4462597b55bd505b2a6a71a
> # Parent  7e29b10982d2eb7fd79f581d99996f04184522ba
> 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.cpp        Thu Sep 11 19:24:28 2014 +0530
> +++ b/source/encoder/entropy.cpp        Fri 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_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 bf4ebe5df0ca source/encoder/frameencoder.cpp
> --- a/source/encoder/frameencoder.cpp   Thu Sep 11 19:24:28 2014 +0530
> +++ b/source/encoder/frameencoder.cpp   Fri Sep 12 18:05:10 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);
>
>          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 at videolan.org
> https://mailman.videolan.org/listinfo/x265-devel
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20140914/17bac532/attachment.html>


More information about the x265-devel mailing list