[x265] qtLayer in reverse order

Satoshi Nakagawa nakagawa424 at oki.com
Thu Jul 24 03:51:48 CEST 2014


# HG changeset patch
# User Satoshi Nakagawa <nakagawa424 at oki.com>
# Date 1406166493 -32400
#      Thu Jul 24 10:48:13 2014 +0900
# Node ID 737648a21e98a7ea339e1b659175c1f229d77c8c
# Parent  342d72f0b61322f31bec35634cc893e4e2b04be3
qtLayer in reverse order

diff -r 342d72f0b613 -r 737648a21e98 source/Lib/TLibEncoder/TEncSearch.cpp
--- a/source/Lib/TLibEncoder/TEncSearch.cpp	Wed Jul 23 17:47:16 2014 -0500
+++ b/source/Lib/TLibEncoder/TEncSearch.cpp	Thu Jul 24 10:48:13 2014 +0900
@@ -51,9 +51,7 @@
 
 TEncSearch::TEncSearch()
 {
-    m_qtTempCoeff[0] = NULL;
-    m_qtTempCoeff[1] = NULL;
-    m_qtTempCoeff[2] = NULL;
+    memset(m_qtTempCoeff, 0, sizeof(m_qtTempCoeff));
     m_qtTempTrIdx = NULL;
     m_qtTempShortYuv = NULL;
     for (int i = 0; i < 3; i++)
@@ -80,7 +78,6 @@
     X265_FREE(m_qtTempCbf[0]);
     X265_FREE(m_qtTempTransformSkipFlag[0]);
 
-    delete[] m_qtTempCoeff[0];
     delete[] m_qtTempShortYuv;
 }
 
@@ -94,9 +91,6 @@
      * available for motion reference.  See refLagRows in FrameEncoder::compressCTURows() */
     m_refLagPixels = m_bFrameParallel ? m_param->searchRange : m_param->sourceHeight;
 
-    m_qtTempCoeff[0] = new coeff_t*[m_numLayers * 3];
-    m_qtTempCoeff[1] = m_qtTempCoeff[0] + m_numLayers;
-    m_qtTempCoeff[2] = m_qtTempCoeff[0] + m_numLayers * 2;
     m_qtTempShortYuv = new ShortYuv[m_numLayers];
     uint32_t sizeL = 1 << (g_maxLog2CUSize * 2);
     uint32_t sizeC = sizeL >> (CHROMA_H_SHIFT(m_csp) + CHROMA_V_SHIFT(m_csp));
@@ -239,7 +233,7 @@
     }
 
     uint32_t log2TrSize = g_maxLog2CUSize - fullDepth;
-    uint32_t qtLayer    = cu->m_slice->m_sps->quadtreeTULog2MaxSize - log2TrSize;
+    uint32_t qtLayer    = log2TrSize - 2;
     uint32_t log2UnitSize = cu->m_pic->getLog2UnitSize();
     uint32_t coeffOffset = absPartIdx << (log2UnitSize * 2);
     coeff_t* coeff = m_qtTempCoeff[ttype][qtLayer] + coeffOffset;
@@ -266,8 +260,6 @@
     }
 
     uint32_t log2TrSize = g_maxLog2CUSize - fullDepth;
-    uint32_t qtLayer    = cu->m_slice->m_sps->quadtreeTULog2MaxSize - log2TrSize;
-    uint32_t log2UnitSize = cu->m_pic->getLog2UnitSize();
 
     uint32_t trDepthC = trDepth;
     int hChromaShift = CHROMA_H_SHIFT(m_csp);
@@ -286,6 +278,9 @@
         }
     }
 
+    uint32_t qtLayer    = log2TrSize - 2;
+    uint32_t log2UnitSize = cu->m_pic->getLog2UnitSize();
+
     if (m_csp != CHROMA_422)
     {
         uint32_t shift = (m_csp == CHROMA_420) ? 2 : 0;
@@ -560,7 +555,6 @@
     bool     bCheckFull  = (log2TrSize <= cu->m_slice->m_sps->quadtreeTULog2MaxSize);
     bool     bCheckSplit = (log2TrSize > cu->getQuadtreeTULog2MinSizeInCU(absPartIdx));
 
-    int maxTuSize = cu->m_slice->m_sps->quadtreeTULog2MaxSize;
     int isIntraSlice = (cu->m_slice->m_sliceType == I_SLICE);
 
     // don't check split if TU size is less or equal to max TU size
@@ -568,6 +562,7 @@
 
     if (m_param->rdPenalty && !isIntraSlice)
     {
+        int maxTuSize = cu->m_slice->m_sps->quadtreeTULog2MaxSize;
         // in addition don't check split if TU size is less or equal to 16x16 TU size for non-intra slice
         noSplitIntraMaxTuSize = (log2TrSize <= X265_MIN(maxTuSize, 4));
 
@@ -613,7 +608,7 @@
 
         cu->setTrIdxSubParts(trDepth, absPartIdx, fullDepth);
 
-        uint32_t qtLayer        = cu->m_slice->m_sps->quadtreeTULog2MaxSize - log2TrSize;
+        uint32_t qtLayer        = log2TrSize - 2;
         uint32_t coeffOffsetY   = absPartIdx << cu->m_pic->getLog2UnitSize() * 2;
         coeff_t* coeffY         = m_qtTempCoeff[0][qtLayer] + coeffOffsetY;
         int16_t* reconQt        = m_qtTempShortYuv[qtLayer].getLumaAddr(absPartIdx);
@@ -793,7 +788,7 @@
         cu->setTransformSkipSubParts(bestModeId, TEXT_LUMA, absPartIdx, fullDepth);
 
         //--- set reconstruction for next intra prediction blocks ---
-        uint32_t qtLayer   = cu->m_slice->m_sps->quadtreeTULog2MaxSize - log2TrSize;
+        uint32_t qtLayer   = log2TrSize - 2;
         uint32_t zorder    = cu->getZorderIdxInCU() + absPartIdx;
         int16_t* reconQt   = m_qtTempShortYuv[qtLayer].getLumaAddr(absPartIdx);
         X265_CHECK(m_qtTempShortYuv[qtLayer].m_width == MAX_CU_SIZE, "width is not max CU size\n");
@@ -823,12 +818,14 @@
     bool     bCheckFull  = (log2TrSize <= cu->m_slice->m_sps->quadtreeTULog2MaxSize);
     bool     bCheckSplit = (log2TrSize > cu->getQuadtreeTULog2MinSizeInCU(absPartIdx));
 
-    int maxTuSize = cu->m_slice->m_sps->quadtreeTULog2MaxSize;
     int isIntraSlice = (cu->m_slice->m_sliceType == I_SLICE);
 
     if (m_param->rdPenalty == 2 && !isIntraSlice)
+    {
+        int maxTuSize = cu->m_slice->m_sps->quadtreeTULog2MaxSize;
         // if maximum RD-penalty don't check TU size 32x32
         bCheckFull = (log2TrSize <= X265_MIN(maxTuSize, 4));
+    }
 
     if (bCheckFull)
     {
@@ -923,7 +920,7 @@
     if (trMode == trDepth)
     {
         uint32_t log2TrSize = g_maxLog2CUSize - fullDepth;
-        uint32_t qtLayer    = cu->m_slice->m_sps->quadtreeTULog2MaxSize - log2TrSize;
+        uint32_t qtLayer    = log2TrSize - 2;
 
         //===== copy transform coefficients =====
         uint32_t coeffOffsetY = absPartIdx << cu->m_pic->getLog2UnitSize() * 2;
@@ -1032,6 +1029,7 @@
                 return;
         }
 
+        uint32_t qtLayer = log2TrSize - 2;
         uint32_t log2UnitSize = cu->m_pic->getLog2UnitSize();
         uint32_t tuSize = 1 << log2TrSizeC;
         uint32_t stride = fencYuv->getCStride();
@@ -1041,8 +1039,6 @@
                                    log2TrSizeC <= MAX_LOG2_TS_SIZE &&
                                    !cu->getCUTransquantBypass(0));
 
-        uint32_t qtLayer = cu->m_slice->m_sps->quadtreeTULog2MaxSize - log2TrSize;
-
         if (m_param->bEnableTSkipFast)
         {
             checkTransformSkip &= (log2TrSize <= MAX_LOG2_TS_SIZE);
@@ -1225,7 +1221,6 @@
     {
         uint32_t log2TrSize = g_maxLog2CUSize - fullDepth;
         uint32_t log2TrSizeC = log2TrSize - hChromaShift;
-        uint32_t qtLayer    = cu->m_slice->m_sps->quadtreeTULog2MaxSize - log2TrSize;
 
         if ((log2TrSize == 2) && !(m_csp == CHROMA_444))
         {
@@ -1242,6 +1237,7 @@
         uint32_t numCoeffC = 1 << (log2TrSizeC * 2 + (m_csp == CHROMA_422));
         uint32_t coeffOffsetC = absPartIdx << (cu->m_pic->getLog2UnitSize() * 2 - (hChromaShift + vChromaShift));
 
+        uint32_t qtLayer   = log2TrSize - 2;
         coeff_t* coeffSrcU = m_qtTempCoeff[1][qtLayer] + coeffOffsetC;
         coeff_t* coeffSrcV = m_qtTempCoeff[2][qtLayer] + coeffOffsetC;
         coeff_t* coeffDstU = cu->getCoeffCb()          + coeffOffsetC;
@@ -2699,12 +2695,12 @@
         uint32_t trSizeC = 1 << log2TrSizeC;
         int sizeIdx  = log2TrSize - 2;
         int sizeIdxC = log2TrSizeC - 2;
-        const uint32_t qtLayer = cu->m_slice->m_sps->quadtreeTULog2MaxSize - log2TrSize;
+        const uint32_t qtLayer = log2TrSize - 2;
         uint32_t coeffOffsetY = absPartIdx << cu->m_pic->getLog2UnitSize() * 2;
         uint32_t coeffOffsetC = coeffOffsetY >> (hChromaShift + vChromaShift);
-        coeff_t *coeffCurY = m_qtTempCoeff[0][qtLayer] + coeffOffsetY;
-        coeff_t *coeffCurU = m_qtTempCoeff[1][qtLayer] + coeffOffsetC;
-        coeff_t *coeffCurV = m_qtTempCoeff[2][qtLayer] + coeffOffsetC;
+        coeff_t* coeffCurY = m_qtTempCoeff[0][qtLayer] + coeffOffsetY;
+        coeff_t* coeffCurU = m_qtTempCoeff[1][qtLayer] + coeffOffsetC;
+        coeff_t* coeffCurV = m_qtTempCoeff[2][qtLayer] + coeffOffsetC;
 
         cu->setTrIdxSubParts(depth - cu->getDepth(0), absPartIdx, depth);
         bool checkTransformSkip   = cu->m_slice->m_pps->bTransformSkipEnabled && !cu->getCUTransquantBypass(0);
@@ -3512,9 +3508,9 @@
     if (!bSubdiv)
     {
         //Luma
-        const uint32_t qtLayer = cu->m_slice->m_sps->quadtreeTULog2MaxSize - log2TrSize;
+        const uint32_t qtLayer = log2TrSize - 2;
         uint32_t coeffOffsetY = absPartIdx << cu->m_pic->getLog2UnitSize() * 2;
-        coeff_t *coeffCurY = m_qtTempCoeff[0][qtLayer] + coeffOffsetY;
+        coeff_t* coeffCurY = m_qtTempCoeff[0][qtLayer] + coeffOffsetY;
 
         //Chroma
         bool bCodeChroma = true;
@@ -3537,8 +3533,8 @@
             if (bCodeChroma)
             {
                 uint32_t coeffOffsetC = coeffOffsetY >> (hChromaShift + vChromaShift);
-                coeff_t *coeffCurU = m_qtTempCoeff[1][qtLayer] + coeffOffsetC;
-                coeff_t *coeffCurV = m_qtTempCoeff[2][qtLayer] + coeffOffsetC;
+                coeff_t* coeffCurU = m_qtTempCoeff[1][qtLayer] + coeffOffsetC;
+                coeff_t* coeffCurV = m_qtTempCoeff[2][qtLayer] + coeffOffsetC;
 
                 if (!splitIntoSubTUs)
                 {
@@ -3592,7 +3588,7 @@
     if (curTrMode == trMode)
     {
         const uint32_t log2TrSize = g_maxLog2CUSize - depth;
-        const uint32_t qtLayer    = cu->m_slice->m_sps->quadtreeTULog2MaxSize - log2TrSize;
+        const uint32_t qtLayer    = log2TrSize - 2;
 
         uint32_t log2TrSizeC = log2TrSize - hChromaShift;
         bool bCodeChroma = true;
@@ -3608,7 +3604,6 @@
         if (bSpatial)
         {
             m_qtTempShortYuv[qtLayer].copyPartToPartLuma(resiYuv, absPartIdx, log2TrSize);
-
             if (bCodeChroma)
                 m_qtTempShortYuv[qtLayer].copyPartToPartChroma(resiYuv, absPartIdx, log2TrSizeC + hChromaShift);
         }
diff -r 342d72f0b613 -r 737648a21e98 source/Lib/TLibEncoder/TEncSearch.h
--- a/source/Lib/TLibEncoder/TEncSearch.h	Wed Jul 23 17:47:16 2014 -0500
+++ b/source/Lib/TLibEncoder/TEncSearch.h	Thu Jul 24 10:48:13 2014 +0900
@@ -51,6 +51,7 @@
 #include "rdcost.h"
 
 #define MVP_IDX_BITS 1
+#define NUM_LAYERS 4
 
 namespace x265 {
 // private namespace
@@ -108,7 +109,7 @@
 
     ShortYuv*       m_qtTempShortYuv;
 
-    coeff_t**       m_qtTempCoeff[3];
+    coeff_t*        m_qtTempCoeff[3][NUM_LAYERS];
     uint8_t*        m_qtTempTrIdx;
     uint8_t*        m_qtTempCbf[3];
 
diff -r 342d72f0b613 -r 737648a21e98 source/encoder/analysis.cpp
--- a/source/encoder/analysis.cpp	Wed Jul 23 17:47:16 2014 -0500
+++ b/source/encoder/analysis.cpp	Thu Jul 24 10:48:13 2014 +0900
@@ -64,7 +64,7 @@
     m_rdCost.setPsyRdScale(m_param->psyRd);
     m_bEnableRDOQ = top->m_bEnableRDOQ;
     m_bFrameParallel = m_param->frameNumThreads > 1;
-    m_numLayers = top->m_quadtreeTULog2MaxSize - top->m_quadtreeTULog2MinSize + 1;
+    m_numLayers = top->m_quadtreeTULog2MaxSize - 2 + 1;
 
     return initSearch();
 }


More information about the x265-devel mailing list