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

Santhoshini Sekar santhoshini at multicorewareinc.com
Tue Sep 16 08:02:40 CEST 2014


On Tue, Sep 16, 2014 at 10:56 AM, Deepthi Nandakumar <
deepthi at multicorewareinc.com> wrote:

>
>
> On Tue, Sep 16, 2014 at 9:45 AM, <santhoshini at multicorewareinc.com> wrote:
>
>> # HG changeset patch
>> # User Santhoshini Sekar <santhoshini at 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 at videolan.org
>> https://mailman.videolan.org/listinfo/x265-devel
>>
>
>
> _______________________________________________
> 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/20140916/ad2395b9/attachment.html>


More information about the x265-devel mailing list