[x265] [PATCH 4 of 8] fast RD path on encode coeff remain code in codeCoeffNxN()

Min Chen chenm003 at 163.com
Thu Apr 30 12:49:36 CEST 2015


# HG changeset patch
# User Min Chen <chenm003 at 163.com>
# Date 1430390937 -28800
# Node ID 1980f573179d5aab749fcce40c9e4c8a7bdc10d6
# Parent  62549ea896fe857e2470a23b79af4356fa5af792
fast RD path on encode coeff remain code in codeCoeffNxN()
---
 source/encoder/entropy.cpp |   63 ++++++++++++++++++++++++++++++++++++-------
 1 files changed, 52 insertions(+), 11 deletions(-)

diff -r 62549ea896fe -r 1980f573179d source/encoder/entropy.cpp
--- a/source/encoder/entropy.cpp	Thu Apr 30 18:48:53 2015 +0800
+++ b/source/encoder/entropy.cpp	Thu Apr 30 18:48:57 2015 +0800
@@ -1518,7 +1518,6 @@
     uint8_t * const baseCoeffGroupCtx = &m_contextState[OFF_SIG_CG_FLAG_CTX + (bIsLuma ? 0 : NUM_SIG_CG_FLAG_CTX)];
     uint8_t * const baseCtx = bIsLuma ? &m_contextState[OFF_SIG_FLAG_CTX] : &m_contextState[OFF_SIG_FLAG_CTX + NUM_SIG_FLAG_CTX_LUMA];
     uint32_t c1 = 1;
-    uint32_t goRiceParam = 0;
     int scanPosSigOff = scanPosLast - (lastScanSet << MLS_CG_SIZE) - 1;
     int absCoeff[1 << MLS_CG_SIZE];
     int numNonZero = 1;
@@ -1532,7 +1531,6 @@
         const uint32_t subCoeffFlag = coeffFlag[subSet];
         uint32_t scanFlagMask = subCoeffFlag;
         int subPosBase = subSet << MLS_CG_SIZE;
-        goRiceParam    = 0;
         
         if (subSet == lastScanSet)
         {
@@ -1768,21 +1766,64 @@
             const int hiddenShift = (bHideFirstSign && signHidden) ? 1 : 0;
             encodeBinsEP((coeffSigns >> hiddenShift), numNonZero - hiddenShift);
 
-            int firstCoeff2 = 1;
             if (!c1 || numNonZero > C1FLAG_NUMBER)
             {
-                for (int idx = 0; idx < numNonZero; idx++)
+                uint32_t goRiceParam = 0;
+                int firstCoeff2 = 1;
+
+                if (!m_bitIf)
                 {
-                    int baseLevel = (idx < C1FLAG_NUMBER) ? (2 + firstCoeff2) : 1;
+                    // FastRd path
+                    for (int idx = 0; idx < numNonZero; idx++)
+                    {
+                        int baseLevel = (idx < C1FLAG_NUMBER) ? (2 + firstCoeff2) : 1;
+                        int codeNumber = absCoeff[idx] - baseLevel;
 
-                    if (absCoeff[idx] >= baseLevel)
+                        if (codeNumber >= 0)
+                        {
+                            //writeCoefRemainExGolomb(absCoeff[idx] - baseLevel, goRiceParam);
+                            uint32_t length = 0;
+
+                            if (((uint32_t)codeNumber >> goRiceParam) < COEF_REMAIN_BIN_REDUCTION)
+                            {
+                                length = (uint32_t)codeNumber >> goRiceParam;
+                                m_fracBits += (length + 1 + goRiceParam) << 15;
+                            }
+                            else
+                            {
+                                codeNumber = ((uint32_t)codeNumber >> goRiceParam) - COEF_REMAIN_BIN_REDUCTION;
+                                if (codeNumber != 0)
+                                {
+                                    unsigned long idx;
+                                    CLZ(idx, codeNumber + 1);
+                                    length = idx;
+                                }
+                                m_fracBits += (COEF_REMAIN_BIN_REDUCTION + length + 1 + goRiceParam + length) << 15;
+                            }
+
+                            if (absCoeff[idx] > 3 * (1 << goRiceParam))
+                                goRiceParam = std::min<uint32_t>(goRiceParam + 1, 4);
+                        }
+                        if (absCoeff[idx] >= 2)
+                            firstCoeff2 = 0;
+                    }
+                }
+                else
+                {
+                    // Standard path
+                    for (int idx = 0; idx < numNonZero; idx++)
                     {
-                        writeCoefRemainExGolomb(absCoeff[idx] - baseLevel, goRiceParam);
-                        if (absCoeff[idx] > 3 * (1 << goRiceParam))
-                            goRiceParam = std::min<uint32_t>(goRiceParam + 1, 4);
+                        int baseLevel = (idx < C1FLAG_NUMBER) ? (2 + firstCoeff2) : 1;
+
+                        if (absCoeff[idx] >= baseLevel)
+                        {
+                            writeCoefRemainExGolomb(absCoeff[idx] - baseLevel, goRiceParam);
+                            if (absCoeff[idx] > 3 * (1 << goRiceParam))
+                                goRiceParam = std::min<uint32_t>(goRiceParam + 1, 4);
+                        }
+                        if (absCoeff[idx] >= 2)
+                            firstCoeff2 = 0;
                     }
-                    if (absCoeff[idx] >= 2)
-                        firstCoeff2 = 0;
                 }
             }
         }



More information about the x265-devel mailing list