[x265] [PATCH 2 of 3] rc: accumulate mv bits, coeff bits per frame

aarthi at multicorewareinc.com aarthi at multicorewareinc.com
Wed Jun 25 19:24:17 CEST 2014


# HG changeset patch
# User Aarthi Thirumalai<aarthi at multicorewareinc.com>
# Date 1403716735 -19800
#      Wed Jun 25 22:48:55 2014 +0530
# Node ID 0995efabd44470c1192994e1aceeb40ae606467f
# Parent  e71e34d02d7777e228eab43edf1910a71a44417d
rc: accumulate mv bits, coeff bits per frame.

diff -r e71e34d02d77 -r 0995efabd444 source/Lib/TLibEncoder/TEncCu.cpp
--- a/source/Lib/TLibEncoder/TEncCu.cpp	Wed Jun 25 22:46:45 2014 +0530
+++ b/source/Lib/TLibEncoder/TEncCu.cpp	Wed Jun 25 22:48:55 2014 +0530
@@ -555,6 +555,7 @@
         m_entropyCoder->resetBits();
         m_entropyCoder->encodeSplitFlag(outBestCU, 0, depth);
         outBestCU->m_totalBits += m_entropyCoder->getNumberOfWrittenBits(); // split bits
+
         if (m_rdCost->psyRdEnabled())
         {
             outBestCU->m_totalPsyCost = m_rdCost->calcPsyRdCost(outBestCU->m_totalDistortion, outBestCU->m_totalBits, 
@@ -616,7 +617,7 @@
             m_entropyCoder->encodeSplitFlag(outTempCU, 0, depth);
             outTempCU->m_totalBits += m_entropyCoder->getNumberOfWrittenBits(); // split bits
         }
-        
+
         if (m_rdCost->psyRdEnabled())
         {
             outTempCU->m_totalPsyCost = m_rdCost->calcPsyRdCost(outTempCU->m_totalDistortion, outTempCU->m_totalBits, 
@@ -907,6 +908,7 @@
         m_entropyCoder->resetBits();
         m_entropyCoder->encodeSplitFlag(outBestCU, 0, depth);
         outBestCU->m_totalBits += m_entropyCoder->getNumberOfWrittenBits(); // split bits
+
         if (m_rdCost->psyRdEnabled())
         {
             outBestCU->m_totalPsyCost = m_rdCost->calcPsyRdCost(outBestCU->m_totalDistortion, outBestCU->m_totalBits,
@@ -1168,6 +1170,7 @@
         return;
     }
 
+
     if (slice->getPPS()->getTransquantBypassEnableFlag())
     {
         m_entropyCoder->encodeCUTransquantBypassFlag(cu, absPartIdx);
@@ -1390,12 +1393,14 @@
     m_entropyCoder->encodePartSize(outTempCU, 0, depth);
     m_entropyCoder->encodePredInfo(outTempCU, 0);
     m_entropyCoder->encodeIPCMInfo(outTempCU, 0);
+    outTempCU->m_mvBits = m_entropyCoder->getNumberOfWrittenBits();
 
     // Encode Coefficients
     bool bCodeDQP = getdQPFlag();
     m_entropyCoder->encodeCoeff(outTempCU, 0, depth, outTempCU->getCUSize(0), bCodeDQP);
     m_rdGoOnSbacCoder->store(m_rdSbacCoders[depth][CI_TEMP_BEST]);
     outTempCU->m_totalBits = m_entropyCoder->getNumberOfWrittenBits();
+    outTempCU->m_coeffBits = outTempCU->m_totalBits - outTempCU->m_mvBits;
 
     if (m_rdCost->psyRdEnabled())
     {
@@ -1437,12 +1442,13 @@
     m_entropyCoder->encodePartSize(outTempCU, 0, depth);
     m_entropyCoder->encodePredInfo(outTempCU, 0);
     m_entropyCoder->encodeIPCMInfo(outTempCU, 0);
-
+    outTempCU->m_mvBits = m_entropyCoder->getNumberOfWrittenBits();
     // Encode Coefficients
     bool bCodeDQP = getdQPFlag();
     m_entropyCoder->encodeCoeff(outTempCU, 0, depth, outTempCU->getCUSize(0), bCodeDQP);
     m_rdGoOnSbacCoder->store(m_rdSbacCoders[depth][CI_TEMP_BEST]);
     outTempCU->m_totalBits = m_entropyCoder->getNumberOfWrittenBits();
+    outTempCU->m_coeffBits = outTempCU->m_totalBits - outTempCU->m_mvBits;
 
     if (m_rdCost->psyRdEnabled())
     {
@@ -1492,12 +1498,14 @@
     m_entropyCoder->encodeSkipFlag(outTempCU, 0);
     m_entropyCoder->encodePredMode(outTempCU, 0);
     m_entropyCoder->encodePartSize(outTempCU, 0, depth);
+    outTempCU->m_mvBits = m_entropyCoder->getNumberOfWrittenBits();
     m_entropyCoder->encodeIPCMInfo(outTempCU, 0);
 
     m_rdGoOnSbacCoder->store(m_rdSbacCoders[depth][CI_TEMP_BEST]);
 
     outTempCU->m_totalBits = m_entropyCoder->getNumberOfWrittenBits();
     outTempCU->m_totalRDCost = m_rdCost->calcRdCost(outTempCU->m_totalDistortion, outTempCU->m_totalBits);
+    outTempCU->m_coeffBits = outTempCU->m_totalBits - outTempCU->m_mvBits;
 
     xCheckDQP(outTempCU);
     xCheckBestMode(outBestCU, outTempCU, depth);
diff -r e71e34d02d77 -r 0995efabd444 source/Lib/TLibEncoder/TEncSearch.cpp
--- a/source/Lib/TLibEncoder/TEncSearch.cpp	Wed Jun 25 22:46:45 2014 +0530
+++ b/source/Lib/TLibEncoder/TEncSearch.cpp	Wed Jun 25 22:48:55 2014 +0530
@@ -4211,6 +4211,7 @@
         }
         m_entropyCoder->encodeSkipFlag(cu, 0);
         m_entropyCoder->encodeMergeIndex(cu, 0);
+        cu->m_mvBits = m_entropyCoder->getNumberOfWrittenBits();
         return m_entropyCoder->getNumberOfWrittenBits();
     }
     else
@@ -4225,8 +4226,11 @@
         m_entropyCoder->encodePartSize(cu, 0, cu->getDepth(0));
         m_entropyCoder->encodePredInfo(cu, 0);
         bool bDummy = false;
+        cu->m_mvBits = m_entropyCoder->getNumberOfWrittenBits();
         m_entropyCoder->encodeCoeff(cu, 0, cu->getDepth(0), cu->getCUSize(0), bDummy);
-        return m_entropyCoder->getNumberOfWrittenBits();
+        int totalBits = m_entropyCoder->getNumberOfWrittenBits();
+        cu->m_coeffBits = totalBits - cu->m_mvBits;
+        return totalBits;
     }
 }
 
diff -r e71e34d02d77 -r 0995efabd444 source/encoder/compress.cpp
--- a/source/encoder/compress.cpp	Wed Jun 25 22:46:45 2014 +0530
+++ b/source/encoder/compress.cpp	Wed Jun 25 22:48:55 2014 +0530
@@ -64,6 +64,7 @@
     m_entropyCoder->encodePartSize(cu, 0, depth);
     m_entropyCoder->encodePredInfo(cu, 0);
     m_entropyCoder->encodeIPCMInfo(cu, 0);
+    cu->m_mvBits += m_entropyCoder->getNumberOfWrittenBits();
 
     // Encode Coefficients
     bool bCodeDQP = getdQPFlag();
@@ -72,6 +73,7 @@
     m_rdGoOnSbacCoder->store(m_rdSbacCoders[depth][CI_TEMP_BEST]);
 
     cu->m_totalBits = m_entropyCoder->getNumberOfWrittenBits();
+    cu->m_coeffBits = cu->m_totalBits - cu->m_mvBits;
     cu->m_totalRDCost = m_rdCost->calcRdCost(cu->m_totalDistortion, cu->m_totalBits);
 }
 
@@ -625,7 +627,7 @@
                 m_entropyCoder->resetBits();
                 m_entropyCoder->encodeSplitFlag(outBestCU, 0, depth);
                 outBestCU->m_totalBits += m_entropyCoder->getNumberOfWrittenBits(); // split bits
-                outBestCU->m_totalRDCost  = m_rdCost->calcRdCost(outBestCU->m_totalDistortion, outBestCU->m_totalBits);
+                outBestCU->m_totalRDCost = m_rdCost->calcRdCost(outBestCU->m_totalDistortion, outBestCU->m_totalBits);
             }
 
             // copy original YUV samples to PCM buffer
diff -r e71e34d02d77 -r 0995efabd444 source/encoder/frameencoder.cpp
--- a/source/encoder/frameencoder.cpp	Wed Jun 25 22:46:45 2014 +0530
+++ b/source/encoder/frameencoder.cpp	Wed Jun 25 22:48:55 2014 +0530
@@ -694,6 +694,11 @@
         // Store probabilities of second LCU in line into buffer
         if (col == 1 && m_param->bEnableWavefront)
             getBufferSBac(lin)->loadContexts(getSbacCoder(subStrm));
+
+        // Collect Frame Stats for 2 pass
+        m_frame->m_stats.mvBits += cu->m_mvBits;
+        m_frame->m_stats.coeffBits += cu->m_coeffBits;
+        m_frame->m_stats.miscBits += cu->m_totalBits - (cu->m_mvBits + cu->m_coeffBits);
     }
 
     if (slice->getPPS()->getCabacInitPresentFlag())


More information about the x265-devel mailing list