<div dir="ltr"><br><div class="gmail_extra"><br><br><div class="gmail_quote">On Wed, Oct 30, 2013 at 4:47 AM,  <span dir="ltr"><<a href="mailto:deepthidevaki@multicorewareinc.com" target="_blank">deepthidevaki@multicorewareinc.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"># HG changeset patch<br>
# User Deepthi Devaki <<a href="mailto:deepthidevaki@multicorewareinc.com">deepthidevaki@multicorewareinc.com</a>><br>
# Date 1383126419 -19800<br>
# Node ID 77db80a67f4e55f22bc02ed02930a269bfac6b50<br>
# Parent  74bf8634037ce3e673b21738a5ffaf1c14381414<br>
no-rdo: use bit estimates from ME to calculate RDcost.<br>
<br>
bits estimated in ME stored in CU and used for calculating rdcost along with distortion. This results in better bitrate with no-rdo, with small drop in PSNR.<br></blockquote><div><br></div><div>I see this has been already pushed, but I'm not certain this is an unambiguously good trade-off:</div>
<div><br></div><div>x265 sintel_trailer_2k_480p24.y4m out.hevc --rd 0  --b-adapt 2 -b3 --hash 1<br></div><div><br></div><div>before:</div><div>encoded 1253 frames in 262.32s (4.78 fps), 143.50 kb/s, Global PSNR: 48.745<br>
</div><div><br></div><div>after:</div><div>encoded 1253 frames in 259.50s (4.83 fps), 142.36 kb/s, Global PSNR: 48.655<br></div><div><br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">

diff -r 74bf8634037c -r 77db80a67f4e source/Lib/TLibEncoder/TEncSearch.cpp<br>
--- a/source/Lib/TLibEncoder/TEncSearch.cpp     Wed Oct 30 13:44:16 2013 +0530<br>
+++ b/source/Lib/TLibEncoder/TEncSearch.cpp     Wed Oct 30 15:16:59 2013 +0530<br>
@@ -2115,7 +2115,7 @@<br>
  * \param bValid<br>
  * \returns void<br>
  */<br>
-void TEncSearch::xMergeEstimation(TComDataCU* cu, int puIdx, uint32_t& interDir, TComMvField* mvField, uint32_t& mergeIndex, uint32_t& outCost, TComMvField* mvFieldNeighbours, UChar* interDirNeighbours, int& numValidMergeCand)<br>

+void TEncSearch::xMergeEstimation(TComDataCU* cu, int puIdx, uint32_t& interDir, TComMvField* mvField, uint32_t& mergeIndex, uint32_t& outCost, uint32_t& outbits, TComMvField* mvFieldNeighbours, UChar* interDirNeighbours, int& numValidMergeCand)<br>

 {<br>
     uint32_t absPartIdx = 0;<br>
     int width = 0;<br>
@@ -2144,7 +2144,7 @@<br>
     {<br>
         uint32_t costCand = MAX_UINT;<br>
         uint32_t bitsCand = 0;<br>
-<br>
+<br>
         cu->getCUMvField(REF_PIC_LIST_0)->m_mv[absPartIdx] = mvFieldNeighbours[0 + 2 * mergeCand].mv;<br>
         cu->getCUMvField(REF_PIC_LIST_0)->m_refIdx[absPartIdx] = mvFieldNeighbours[0 + 2 * mergeCand].refIdx;<br>
         cu->getCUMvField(REF_PIC_LIST_1)->m_mv[absPartIdx] = mvFieldNeighbours[1 + 2 * mergeCand].mv;<br>
@@ -2160,6 +2160,7 @@<br>
         if (costCand < outCost)<br>
         {<br>
             outCost = costCand;<br>
+            outbits = bitsCand;<br>
             mvField[0] = mvFieldNeighbours[0 + 2 * mergeCand];<br>
             mvField[1] = mvFieldNeighbours[1 + 2 * mergeCand];<br>
             interDir = interDirNeighbours[mergeCand];<br>
@@ -2226,6 +2227,8 @@<br>
     UChar interDirNeighbours[MRG_MAX_NUM_CANDS];<br>
     int numValidMergeCand = 0;<br>
<br>
+    int totalmebits = 0;<br>
+<br>
     for (int partIdx = 0; partIdx < numPart; partIdx++)<br>
     {<br>
         uint32_t listCost[2] = { MAX_UINT, MAX_UINT };<br>
@@ -2495,7 +2498,8 @@<br>
<br>
             // find Merge result<br>
             uint32_t mrgCost = MAX_UINT;<br>
-            xMergeEstimation(cu, partIdx, mrgInterDir, mrgMvField, mrgIndex, mrgCost, mvFieldNeighbours, interDirNeighbours, numValidMergeCand);<br>
+            uint32_t mrgBits = 0;<br>
+            xMergeEstimation(cu, partIdx, mrgInterDir, mrgMvField, mrgIndex, mrgCost, mrgBits, mvFieldNeighbours, interDirNeighbours, numValidMergeCand);<br>
             if (mrgCost < meCost)<br>
             {<br>
                 // set Merge result<br>
@@ -2517,6 +2521,7 @@<br>
 #if CU_STAT_LOGFILE<br>
                 meCost += mrgCost;<br>
 #endif<br>
+                totalmebits += mrgBits;<br>
             }<br>
             else<br>
             {<br>
@@ -2530,11 +2535,18 @@<br>
 #if CU_STAT_LOGFILE<br>
                 meCost += meCost;<br>
 #endif<br>
+                totalmebits += mebits;<br>
             }<br>
         }<br>
+        else<br>
+        {<br>
+            totalmebits += mebits;<br>
+        }<br>
         motionCompensation(cu, predYuv, REF_PIC_LIST_X, partIdx, bLuma, bChroma);<br>
     }<br>
<br>
+    cu->m_totalBits = totalmebits;<br>
+<br>
     setWpScalingDistParam(cu, -1, REF_PIC_LIST_X);<br>
 }<br>
<br>
diff -r 74bf8634037c -r 77db80a67f4e source/Lib/TLibEncoder/TEncSearch.h<br>
--- a/source/Lib/TLibEncoder/TEncSearch.h       Wed Oct 30 13:44:16 2013 +0530<br>
+++ b/source/Lib/TLibEncoder/TEncSearch.h       Wed Oct 30 15:16:59 2013 +0530<br>
@@ -211,7 +211,7 @@<br>
     void xGetBlkBits(PartSize cuMode, bool bPSlice, int partIdx, uint32_t lastMode, uint32_t blockBit[3]);<br>
<br>
     void xMergeEstimation(TComDataCU* cu, int partIdx, uint32_t& uiInterDir,<br>
-                          TComMvField* pacMvField, uint32_t& mergeIndex, uint32_t& outCost,<br>
+                          TComMvField* pacMvField, uint32_t& mergeIndex, uint32_t& outCost, uint32_t& outbits,<br>
                           TComMvField* mvFieldNeighbors, UChar* interDirNeighbors, int& numValidMergeCand);<br>
<br>
     void xRestrictBipredMergeCand(TComDataCU* cu, uint32_t puIdx, TComMvField* mvFieldNeighbours,<br>
diff -r 74bf8634037c -r 77db80a67f4e source/encoder/compress.cpp<br>
--- a/source/encoder/compress.cpp       Wed Oct 30 13:44:16 2013 +0530<br>
+++ b/source/encoder/compress.cpp       Wed Oct 30 15:16:59 2013 +0530<br>
@@ -223,10 +223,12 @@<br>
     m_tmpResiYuv[depth]->clear();<br>
<br>
     //do motion compensation only for Luma since luma cost alone is calculated<br>
+    outTempCU->m_totalBits = 0;<br>
     m_search->predInterSearch(outTempCU, outPredYuv, bUseMRG, true, false);<br>
     int part = partitionFromSizes(outTempCU->getWidth(0), outTempCU->getHeight(0));<br>
-    outTempCU->m_totalCost = primitives.sse_pp[part](m_origYuv[depth]->getLumaAddr(), m_origYuv[depth]->getStride(),<br>
-                                                     outPredYuv->getLumaAddr(), outPredYuv->getStride());<br>
+    uint32_t distortion = primitives.sse_pp[part](m_origYuv[depth]->getLumaAddr(), m_origYuv[depth]->getStride(),<br>
+                                                  outPredYuv->getLumaAddr(), outPredYuv->getStride());<br>
+    outTempCU->m_totalCost = m_rdCost->calcRdCost(distortion, outTempCU->m_totalBits);<br>
 }<br>
<br>
 void TEncCu::xComputeCostMerge2Nx2N(TComDataCU*& outBestCU, TComDataCU*& outTempCU, bool* earlyDetectionSkip, TComYuv*& bestPredYuv, TComYuv*& yuvReconBest)<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>