<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Mon, Oct 21, 2013 at 7:37 AM, Min Chen <span dir="ltr"><<a href="mailto:chenm003@163.com" target="_blank">chenm003@163.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"># HG changeset patch<br>
# User Min Chen <<a href="mailto:chenm003@163.com">chenm003@163.com</a>><br>
# Date 1382359024 -28800<br>
# Node ID 881dea872e800800f2c987e5212a4554ff0abb6a<br>
# Parent  8fc308449916b49cea8b0839690d91cebcfb528b<br>
merge multiple encodeBinEP to encodeBinsEP<br>
<br>
diff -r 8fc308449916 -r 881dea872e80 source/Lib/TLibCommon/TComDataCU.cpp<br>
--- a/source/Lib/TLibCommon/TComDataCU.cpp      Mon Oct 21 14:09:12 2013 +0530<br>
+++ b/source/Lib/TLibCommon/TComDataCU.cpp      Mon Oct 21 20:37:04 2013 +0800<br>
@@ -1317,12 +1317,11 @@<br>
 *\param   piMode          it is set with MPM mode in case both MPM are equal. It is used to restrict RD search at encode side.<br>
 *\returns Number of MPM<br>
 */<br>
-int TComDataCU::getIntraDirLumaPredictor(UInt absPartIdx, int* intraDirPred, int* modes)<br>
+void TComDataCU::getIntraDirLumaPredictor(UInt absPartIdx, int* intraDirPred, int* modes)<br>
 {<br>
     TComDataCU* tempCU;<br>
     UInt        tempPartIdx;<br>
     int         leftIntraDir, aboveIntraDir;<br>
-    int         predNum = 0;<br>
<br>
     // Get intra direction of left PU<br>
     tempCU = getPULeft(tempPartIdx, m_absIdxInLCU + absPartIdx);<br>
@@ -1334,7 +1333,6 @@<br>
<br>
     aboveIntraDir = tempCU ? (tempCU->isIntra(tempPartIdx) ? tempCU->getLumaIntraDir(tempPartIdx) : DC_IDX) : DC_IDX;<br>
<br>
-    predNum = 3;<br>
     if (leftIntraDir == aboveIntraDir)<br>
     {<br>
         if (modes)<br>
@@ -1373,8 +1371,6 @@<br>
             intraDirPred[2] =  (leftIntraDir + aboveIntraDir) < 2 ? VER_IDX : DC_IDX;<br>
         }<br>
     }<br>
-<br>
-    return predNum;<br>
 }<br>
<br>
 UInt TComDataCU::getCtxSplitFlag(UInt absPartIdx, UInt depth)<br>
diff -r 8fc308449916 -r 881dea872e80 source/Lib/TLibCommon/TComDataCU.h<br>
--- a/source/Lib/TLibCommon/TComDataCU.h        Mon Oct 21 14:09:12 2013 +0530<br>
+++ b/source/Lib/TLibCommon/TComDataCU.h        Mon Oct 21 20:37:04 2013 +0800<br>
@@ -490,7 +490,7 @@<br>
     UInt          getIntraSizeIdx(UInt absPartIdx);<br>
<br>
     void          getAllowedChromaDir(UInt absPartIdx, UInt* modeList);<br>
-    int           getIntraDirLumaPredictor(UInt absPartIdx, int* intraDirPred, int* mode = NULL);<br>
+    void          getIntraDirLumaPredictor(UInt absPartIdx, int* intraDirPred, int* mode = NULL);<br>
<br>
     // -------------------------------------------------------------------------------------------------------------------<br>
     // member functions for SBAC context<br>
diff -r 8fc308449916 -r 881dea872e80 source/Lib/TLibEncoder/TEncSbac.cpp<br>
--- a/source/Lib/TLibEncoder/TEncSbac.cpp       Mon Oct 21 14:09:12 2013 +0530<br>
+++ b/source/Lib/TLibEncoder/TEncSbac.cpp       Mon Oct 21 20:37:04 2013 +0800<br>
@@ -529,21 +529,15 @@<br>
<br>
     if (numCand > 1)<br>
     {<br>
-        for (UInt ui = 0; ui < numCand - 1; ++ui)<br>
+        m_binIf->encodeBin((unaryIdx != 0), m_contextModels[OFF_MERGE_IDX_EXT_CTX]);<br>
+<br>
+        assert(unaryIdx < numCand);<br>
+<br>
+        if (unaryIdx != 0)<br>
         {<br>
-            const UInt symbol = ui == unaryIdx ? 0 : 1;<br>
-            if (ui == 0)<br>
-            {<br>
-                m_binIf->encodeBin(symbol, m_contextModels[OFF_MERGE_IDX_EXT_CTX]);<br>
-            }<br>
-            else<br>
-            {<br>
-                m_binIf->encodeBinEP(symbol);<br>
-            }<br>
-            if (symbol == 0)<br>
-            {<br>
-                break;<br>
-            }<br>
+            UInt mask = (1 << unaryIdx) - 2;<br>
+            mask >>= (unaryIdx == numCand - 1) ? 1 : 0;<br>
+            m_binIf->encodeBinsEP(mask, unaryIdx - (unaryIdx == numCand - 1));<br>
         }<br>
     }<br>
     DTRACE_CABAC_VL(g_nSymbolCounter++);<br>
@@ -583,7 +577,7 @@<br>
 {<br>
     UInt dir[4], j;<br>
     int preds[4][3] = { { -1, -1, -1 }, { -1, -1, -1 }, { -1, -1, -1 }, { -1, -1, -1 } };<br>
-    int predNum[4], predIdx[4] = { -1, -1, -1, -1 };<br>
+    int predIdx[4] = { -1, -1, -1, -1 };<br>
     PartSize mode = cu->getPartitionSize(absPartIdx);<br>
     UInt partNum = isMultiple ? (mode == SIZE_NxN ? 4 : 1) : 1;<br>
     UInt partOffset = (cu->getPic()->getNumPartInCU() >> (cu->getDepth(absPartIdx) << 1)) >> 2;<br>
@@ -591,8 +585,8 @@<br>
     for (j = 0; j < partNum; j++)<br>
     {<br>
         dir[j] = cu->getLumaIntraDir(absPartIdx + partOffset * j);<br>
-        predNum[j] = cu->getIntraDirLumaPredictor(absPartIdx + partOffset * j, preds[j]);<br>
-        for (UInt i = 0; i < predNum[j]; i++)<br>
+        cu->getIntraDirLumaPredictor(absPartIdx + partOffset * j, preds[j]);<br>
+        for (UInt i = 0; i < 3; i++)<br>
         {<br>
             if (dir[j] == preds[j][i])<br>
             {<br>
@@ -607,11 +601,13 @@<br>
     {<br>
         if (predIdx[j] != -1)<br>
         {<br>
-            m_binIf->encodeBinEP(predIdx[j] ? 1 : 0);<br>
-            if (predIdx[j])<br>
-            {<br>
-                m_binIf->encodeBinEP(predIdx[j] - 1);<br>
-            }<br>
+            assert((predIdx[j] >= 0) && (predIdx[j] <= 2));<br>
+            // NOTE: Mapping<br>
+            //       0 = 0<br>
+            //       1 = 10<br>
+            //       2 = 11<br>
+            int nonzero = (!!predIdx[j]);<br>
+            m_binIf->encodeBinsEP(predIdx[j] + nonzero, 1 + nonzero);<br>
         }<br>
         else<br>
         {<br>
@@ -627,10 +623,9 @@<br>
             {<br>
                 std::swap(preds[j][1], preds[j][2]);<br>
             }<br>
-            for (int i = (predNum[j] - 1); i >= 0; i--)<br>
-            {<br>
-                dir[j] = dir[j] > preds[j][i] ? dir[j] - 1 : dir[j];<br>
-            }<br>
+            dir[j] += (dir[j] > preds[j][2]) ? -1 : 0;<br>
+            dir[j] += (dir[j] > preds[j][1]) ? -1 : 0;<br>
+            dir[j] += (dir[j] > preds[j][0]) ? -1 : 0;<br>
<br>
             m_binIf->encodeBinsEP(dir[j], 5);<br>
         }<br>
@@ -692,6 +687,7 @@<br>
             UInt refNum = cu->getSlice()->getNumRefIdx(eRefList) - 2;<br>
             idx++;<br>
             refFrame--;<br>
+            // TODO: reference codeMergeIndex() to improvement<br>
             for (UInt i = 0; i < refNum; ++i)<br>
             {<br>
                 const UInt symbol = i == refFrame ? 0 : 1;<br>
@@ -1274,40 +1270,21 @@<br>
     }<br>
 }<br>
<br>
-/** code SAO offset sign<br>
- * \param code sign value<br>
- */<br>
-void TEncSbac::codeSAOSign(UInt code)<br>
-{<br>
-    m_binIf->encodeBinEP(code);<br>
-}<br>
-<br>
 void TEncSbac::codeSaoMaxUvlc(UInt code, UInt maxSymbol)<br>
 {<br>
-    if (maxSymbol == 0)<br>
+    assert(maxSymbol > 0);<br>
+<br>
+    UInt isCodeLast = (maxSymbol > code) ? 1 : 0;<br>
+    UInt isCodeNonZero = (code != 0) ? 1 : 0;<br>
+<br>
+    m_binIf->encodeBinEP(isCodeNonZero);<br>
+    if (isCodeNonZero)<br>
     {<br>
-        return;<br>
-    }<br>
+        UInt mask = (1 << (code - 1)) - 1;<br>
+        UInt len = code - 1 + isCodeLast;<br>
+        mask <<= isCodeLast;<br>
<br>
-    int i;<br>
-    bool bCodeLast = (maxSymbol > code);<br>
-<br>
-    if (code == 0)<br>
-    {<br>
-        m_binIf->encodeBinEP(0);<br>
-    }<br>
-    else<br>
-    {<br>
-        m_binIf->encodeBinEP(1);<br>
-        for (i = 0; i < code - 1; i++)<br>
-        {<br>
-            m_binIf->encodeBinEP(1);<br>
-        }<br>
-<br>
-        if (bCodeLast)<br>
-        {<br>
-            m_binIf->encodeBinEP(0);<br>
-        }<br>
+        m_binIf->encodeBinsEP(mask, len);<br>
     }<br>
 }<br>
<br>
diff -r 8fc308449916 -r 881dea872e80 source/Lib/TLibEncoder/TEncSbac.h<br>
--- a/source/Lib/TLibEncoder/TEncSbac.h Mon Oct 21 14:09:12 2013 +0530<br>
+++ b/source/Lib/TLibEncoder/TEncSbac.h Mon Oct 21 20:37:04 2013 +0800<br>
@@ -100,7 +100,15 @@<br>
     void  codeSaoMerge(UInt code);<br>
     void  codeSaoTypeIdx(UInt code);<br>
     void  codeSaoUflc(UInt length, UInt code);<br>
-    void  codeSAOSign(UInt code);<br>
+<br>
+    /** code SAO offset sign<br>
+     * \param code sign value<br>
+     */<br>
+    void TEncSbac::codeSAOSign(UInt code)<br></blockquote><div><br></div><div>GCC gave a warning for the TEncSbac:: qualification within a class declaration.</div><div><br></div><div>I've queued this patch with this fixed</div>
<div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+    {<br>
+        m_binIf->encodeBinEP(code);<br>
+    }<br>
+<br>
     void  codeScalingList(TComScalingList*) { assert(0); }<br>
<br>
 private:<br>
diff -r 8fc308449916 -r 881dea872e80 source/Lib/TLibEncoder/TEncSearch.cpp<br>
--- a/source/Lib/TLibEncoder/TEncSearch.cpp     Mon Oct 21 14:09:12 2013 +0530<br>
+++ b/source/Lib/TLibEncoder/TEncSearch.cpp     Mon Oct 21 20:37:04 2013 +0800<br>
@@ -1678,7 +1678,8 @@<br>
<br>
             int preds[3] = { -1, -1, -1 };<br>
             int mode = -1;<br>
-            int numCand = cu->getIntraDirLumaPredictor(partOffset, preds, &mode);<br>
+            int numCand = 3;<br>
+            cu->getIntraDirLumaPredictor(partOffset, preds, &mode);<br>
             if (mode >= 0)<br>
             {<br>
                 numCand = mode;<br>
<br>
_______________________________________________<br>
x265-devel mailing list<br>
<a href="mailto:x265-devel@videolan.org">x265-devel@videolan.org</a><br>
<a href="https://mailman.videolan.org/listinfo/x265-devel" target="_blank">https://mailman.videolan.org/listinfo/x265-devel</a><br>
</blockquote></div><br><br clear="all"><div><br></div>-- <br>Steve Borho
</div></div>