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

santhoshini at multicorewareinc.com santhoshini at multicorewareinc.com
Fri Sep 12 14:35:48 CEST 2014


# 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)
+                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


More information about the x265-devel mailing list