[x265] [PATCH] rc: release RC lock after RateControlStart for CQP and CRF(without VBV)

aarthi at multicorewareinc.com aarthi at multicorewareinc.com
Tue Mar 17 12:35:37 CET 2015


# HG changeset patch
# User Aarthi Thirumalai
# Date 1426573364 -19800
#      Tue Mar 17 11:52:44 2015 +0530
# Node ID 447345368ddf982deb3cda4fdff36860e1364189
# Parent  b9948752d5516a72eeaf824e3ee6f0feb097381c
rc: release RC lock after RateControlStart for CQP and CRF(without VBV)

RateControlUpdateStats is not needed for CQP and CRF - without vbv,
prevent floating point divide by zero issue in CQP

diff -r b9948752d551 -r 447345368ddf source/encoder/frameencoder.cpp
--- a/source/encoder/frameencoder.cpp	Mon Mar 16 20:40:12 2015 -0500
+++ b/source/encoder/frameencoder.cpp	Tue Mar 17 11:52:44 2015 +0530
@@ -1042,24 +1042,24 @@
      * after refLagRows (the number of rows reference frames must have completed
      * before referencees may begin encoding) */
     uint32_t rowCount = 0;
-    if (m_param->rc.rateControlMode == X265_RC_ABR)
+    if (m_param->rc.rateControlMode == X265_RC_ABR || bIsVbv)
     {
         if ((uint32_t)m_rce.encodeOrder <= 2 * (m_param->fpsNum / m_param->fpsDenom))
             rowCount = X265_MIN((m_numRows + 1) / 2, m_numRows - 1);
         else
             rowCount = X265_MIN(m_refLagRows, m_numRows - 1);
-    }
-    if (row == rowCount)
-    {
-        m_rce.rowTotalBits = 0;
-        if (bIsVbv)
-            for (uint32_t i = 0; i < rowCount; i++)
-                m_rce.rowTotalBits += curEncData.m_rowStat[i].encodedBits;
-        else
-            for (uint32_t cuAddr = 0; cuAddr < rowCount * numCols; cuAddr++)
-                m_rce.rowTotalBits += curEncData.m_cuStat[cuAddr].totalBits;
+        if (row == rowCount)
+        {
+            m_rce.rowTotalBits = 0;
+            if (bIsVbv)
+                for (uint32_t i = 0; i < rowCount; i++)
+                    m_rce.rowTotalBits += curEncData.m_rowStat[i].encodedBits;
+            else
+                for (uint32_t cuAddr = 0; cuAddr < rowCount * numCols; cuAddr++)
+                    m_rce.rowTotalBits += curEncData.m_cuStat[cuAddr].totalBits;
 
-        m_top->m_rateControl->rateControlUpdateStats(&m_rce);
+            m_top->m_rateControl->rateControlUpdateStats(&m_rce);
+        }
     }
 
     /* flush row bitstream (if WPP and no SAO) or flush frame if no WPP and no SAO */
diff -r b9948752d551 -r 447345368ddf source/encoder/ratecontrol.cpp
--- a/source/encoder/ratecontrol.cpp	Mon Mar 16 20:40:12 2015 -0500
+++ b/source/encoder/ratecontrol.cpp	Tue Mar 17 11:52:44 2015 +0530
@@ -1077,9 +1077,20 @@
             rce->frameSizePlanned = predictSize(&m_pred[m_sliceType], m_qp, (double)m_currentSatd);
         }
     }
-    // Do not increment m_startEndOrder here. Make rateControlEnd of previous thread
-    // to wait until rateControlUpdateStats of this frame is called
     m_framesDone++;
+
+    /* CQP and CRF (without capped VBV) doesn't use mid-frame statistics to 
+     * tune RateControl parameters for other frames.
+     * Hence, for these modes, update m_startEndOrder and unlock RC for previous threads waiting in
+     * RateControlEnd here.those modes here. For the rest - ABR
+     * and VBV, unlock only after rateControlUpdateStats of this frame is called */
+    if (m_param->rc.rateControlMode != X265_RC_ABR && !m_isVbv)
+    {
+        m_startEndOrder.incr();
+
+        if (rce->encodeOrder < m_param->frameNumThreads - 1)
+            m_startEndOrder.incr(); // faked rateControlEnd calls for negative frames
+    }
     return m_qp;
 }
 
@@ -1588,10 +1599,13 @@
 
     /* do not allow the next frame to enter rateControlStart() until this
      * frame has updated its mid-frame statistics */
-    m_startEndOrder.incr();
+    if (m_param->rc.rateControlMode == X265_RC_ABR || m_isVbv)
+    {
+        m_startEndOrder.incr();
 
-    if (rce->encodeOrder < m_param->frameNumThreads - 1)
-        m_startEndOrder.incr(); // faked rateControlEnd calls for negative frames
+        if (rce->encodeOrder < m_param->frameNumThreads - 1)
+            m_startEndOrder.incr(); // faked rateControlEnd calls for negative frames
+    }
 }
 
 void RateControl::checkAndResetABR(RateControlEntry* rce, bool isFrameDone)


More information about the x265-devel mailing list