<div dir="ltr">Ignore this cleanup patch. Something went wrong.<br></div><div class="gmail_extra"><br><div class="gmail_quote">On Sun, Apr 5, 2015 at 10:25 PM,  <span dir="ltr"><<a href="mailto:deepthi@multicorewareinc.com" target="_blank">deepthi@multicorewareinc.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 Deepthi Nandakumar <<a href="mailto:deepthi@multicorewareinc.com">deepthi@multicorewareinc.com</a>><br>
# Date 1428252902 -19800<br>
#      Sun Apr 05 22:25:02 2015 +0530<br>
# Node ID 9c48cb93a0b0dcc67697257fd227edda8e690c60<br>
# Parent  d6e059bd8a9cd0cb9aad7444b1a141a59ac01193<br>
AQ/VBV: separate VBV cost accumulation from QP averaging for AQ<br>
<br>
diff -r d6e059bd8a9c -r 9c48cb93a0b0 source/encoder/analysis.cpp<br>
--- a/source/encoder/analysis.cpp       Mon Mar 23 14:23:42 2015 +0530<br>
+++ b/source/encoder/analysis.cpp       Sun Apr 05 22:25:02 2015 +0530<br>
@@ -129,7 +129,7 @@<br>
 {<br>
     m_slice = ctu.m_slice;<br>
     m_frame = &frame;<br>
-<br>
+    FrameData& curEncData = *m_frame->m_encData;<br>
 #if _DEBUG || CHECKED_BUILD<br>
     for (uint32_t i = 0; i <= g_maxCUDepth; i++)<br>
         for (uint32_t j = 0; j < MAX_PRED_TYPES; j++)<br>
@@ -159,6 +159,7 @@<br>
         }<br>
         this->setQP(*m_slice, m_qp[0][0]);<br>
         m_qp[0][0] = x265_clip3(QP_MIN, QP_MAX_SPEC, m_qp[0][0]);<br>
+        curEncData.m_rowStat[ctu.m_cuAddr % m_slice->m_sps->numCuInWidth].sumQpAq += m_qp[0][0];<br>
         ctu.setQPSubParts((int8_t)m_qp[0][0], 0, 0);<br>
     }<br>
     else<br>
diff -r d6e059bd8a9c -r 9c48cb93a0b0 source/encoder/frameencoder.cpp<br>
--- a/source/encoder/frameencoder.cpp   Mon Mar 23 14:23:42 2015 +0530<br>
+++ b/source/encoder/frameencoder.cpp   Sun Apr 05 22:25:02 2015 +0530<br>
@@ -849,14 +849,9 @@<br>
         else<br>
             curEncData.m_cuStat[cuAddr].baseQp = curEncData.m_avgQpRc;<br>
<br>
-        if (m_param->rc.aqMode || bIsVbv)<br>
-        {<br>
-            int qp = calcQpForCu(cuAddr, curEncData.m_cuStat[cuAddr].baseQp);<br>
-            qp = x265_clip3(QP_MIN, QP_MAX_SPEC, qp);<br>
-            curEncData.m_rowStat[row].sumQpAq += qp;<br>
-        }<br>
-        else<br>
-            tld.analysis.setQP(*slice, slice->m_sliceQp);<br>
+        if (bIsVbv)<br>
+            accumVBVCosts(cuAddr);<br>
+<br>
<br>
         if (m_param->bEnableWavefront && !col && row)<br>
         {<br>
@@ -1196,53 +1191,31 @@<br>
     }<br>
 }<br>
<br>
-int FrameEncoder::calcQpForCu(uint32_t ctuAddr, double baseQp)<br>
+void FrameEncoder::accumVBVCosts(uint32_t ctuAddr)<br>
 {<br>
     x265_emms();<br>
-    double qp = baseQp;<br>
<br>
     FrameData& curEncData = *m_frame->m_encData;<br>
-    /* clear cuCostsForVbv from when vbv row reset was triggered */<br>
-    bool bIsVbv = m_param->rc.vbvBufferSize > 0 && m_param->rc.vbvMaxBitrate > 0;<br>
-    if (bIsVbv)<br>
-    {<br>
-        curEncData.m_cuStat[ctuAddr].vbvCost = 0;<br>
-        curEncData.m_cuStat[ctuAddr].intraVbvCost = 0;<br>
-    }<br>
<br>
-    /* Derive qpOffet for each CU by averaging offsets for all 16x16 blocks in the cu. */<br>
-    double qp_offset = 0;<br>
+    curEncData.m_cuStat[ctuAddr].vbvCost = 0;<br>
+    curEncData.m_cuStat[ctuAddr].intraVbvCost = 0;<br>
+<br>
     uint32_t maxBlockCols = (m_frame->m_fencPic->m_picWidth + (16 - 1)) / 16;<br>
     uint32_t maxBlockRows = (m_frame->m_fencPic->m_picHeight + (16 - 1)) / 16;<br>
     uint32_t noOfBlocks = g_maxCUSize / 16;<br>
     uint32_t block_y = (ctuAddr / curEncData.m_slice->m_sps->numCuInWidth) * noOfBlocks;<br>
     uint32_t block_x = (ctuAddr * noOfBlocks) - block_y * curEncData.m_slice->m_sps->numCuInWidth;<br>
<br>
-    /* Use cuTree offsets if cuTree enabled and frame is referenced, else use AQ offsets */<br>
-    bool isReferenced = IS_REFERENCED(m_frame);<br>
-    double *qpoffs = (isReferenced && m_param->rc.cuTree) ? m_frame->m_lowres.qpCuTreeOffset : m_frame->m_lowres.qpAqOffset;<br>
-<br>
-    uint32_t cnt = 0, idx = 0;<br>
+    uint32_t idx = 0;<br>
     for (uint32_t h = 0; h < noOfBlocks && block_y < maxBlockRows; h++, block_y++)<br>
     {<br>
         for (uint32_t w = 0; w < noOfBlocks && (block_x + w) < maxBlockCols; w++)<br>
         {<br>
             idx = block_x + w + (block_y * maxBlockCols);<br>
-            if (m_param->rc.aqMode)<br>
-                qp_offset += qpoffs[idx];<br>
-            if (bIsVbv)<br>
-            {<br>
-                curEncData.m_cuStat[ctuAddr].vbvCost += m_frame->m_lowres.lowresCostForRc[idx] & LOWRES_COST_MASK;<br>
-                curEncData.m_cuStat[ctuAddr].intraVbvCost += m_frame->m_lowres.intraCost[idx];<br>
-            }<br>
-            cnt++;<br>
+            curEncData.m_cuStat[ctuAddr].vbvCost += m_frame->m_lowres.lowresCostForRc[idx] & LOWRES_COST_MASK;<br>
+            curEncData.m_cuStat[ctuAddr].intraVbvCost += m_frame->m_lowres.intraCost[idx];<br>
         }<br>
     }<br>
-<br>
-    qp_offset /= cnt;<br>
-    qp += qp_offset;<br>
-<br>
-    return x265_clip3(QP_MIN, QP_MAX_MAX, (int)(qp + 0.5));<br>
 }<br>
<br>
 Frame *FrameEncoder::getEncodedPicture(NALList& output)<br>
diff -r d6e059bd8a9c -r 9c48cb93a0b0 source/encoder/frameencoder.h<br>
--- a/source/encoder/frameencoder.h     Mon Mar 23 14:23:42 2015 +0530<br>
+++ b/source/encoder/frameencoder.h     Sun Apr 05 22:25:02 2015 +0530<br>
@@ -226,7 +226,7 @@<br>
     void encodeSlice();<br>
<br>
     void threadMain();<br>
-    int  calcQpForCu(uint32_t cuAddr, double baseQp);<br>
+    void  accumVBVCosts(uint32_t cuAddr);<br>
     void collectCTUStatistics(CUData& ctu);<br>
     void noiseReductionUpdate();<br>
<br>
</blockquote></div><br></div>