[x265] [PATCH] rc: recompute planned frame size when using vbv with --qpfile
aarthi at multicorewareinc.com
aarthi at multicorewareinc.com
Wed Mar 11 07:31:00 CET 2015
# HG changeset patch
# User Aarthi Thirumalai
# Date 1425994215 -19800
# Tue Mar 10 19:00:15 2015 +0530
# Node ID 9b7b93384e39e90cf2d4c0c0a53213abff362f70
# Parent 8f148ac8dbe4b68e88ceff84f40e33b29e888dc9
rc: recompute planned frame size when using vbv with --qpfile
diff -r 8f148ac8dbe4 -r 9b7b93384e39 source/encoder/ratecontrol.cpp
--- a/source/encoder/ratecontrol.cpp Tue Mar 10 15:46:36 2015 +0530
+++ b/source/encoder/ratecontrol.cpp Tue Mar 10 19:00:15 2015 +0530
@@ -1067,7 +1067,15 @@
{
m_qp = (int32_t)(curFrame->m_forceqp + 0.5) - 1;
m_qp = x265_clip3(QP_MIN, QP_MAX_MAX, m_qp);
- rce->qpaRc = curEncData.m_avgQpRc = curEncData.m_avgQpAq = m_qp;
+ rce->qpaRc =curEncData.m_avgQpRc = curEncData.m_avgQpAq = m_qp;
+ if (m_isAbr)
+ {
+ rce->qpNoVbv = rce->qpaRc;
+ m_lastQScaleFor[m_sliceType] = x265_qp2qScale(rce->qpaRc);
+ if (rce->poc == 0)
+ m_lastQScaleFor[P_SLICE] = m_lastQScaleFor[m_sliceType] * fabs(m_param->rc.ipFactor);
+ rce->frameSizePlanned = predictSize(&m_pred[m_sliceType], rce->qpaRc, (double)m_currentSatd);
+ }
}
// Do not increment m_startEndOrder here. Make rateControlEnd of previous thread
// to wait until rateControlUpdateStats of this frame is called
@@ -1360,13 +1368,14 @@
q += m_pbOffset;
double qScale = x265_qp2qScale(q);
+ double lmin = 0, lmax = 0;
if (m_isCbr)
{
qScale = tuneAbrQScaleFromFeedback(qScale);
if (!m_isAbrReset)
{
- double lmin = m_lastQScaleFor[P_SLICE] / m_lstep;
- double lmax = m_lastQScaleFor[P_SLICE] * m_lstep;
+ lmin = m_lastQScaleFor[P_SLICE] / m_lstep;
+ lmax = m_lastQScaleFor[P_SLICE] * m_lstep;
qScale = x265_clip3(lmin, lmax, qScale);
}
q = x265_qScale2qp(qScale);
@@ -1375,6 +1384,8 @@
if (!m_2pass && m_isVbv)
{
qScale = clipQscale(curFrame, rce, qScale);
+ if (m_pred[m_sliceType].count == 1)
+ qScale = x265_clip3(lmin, lmax, qScale);
m_lastQScaleFor[m_sliceType] = qScale;
rce->frameSizePlanned = predictSize(&m_pred[m_sliceType], qScale, (double)m_currentSatd);
}
@@ -1460,7 +1471,7 @@
* tolerances, the bit distribution approaches that of 2pass. */
double overflow = 1;
-
+ double lqmin = 0, lqmax = 0;
m_shortTermCplxSum *= 0.5;
m_shortTermCplxCount *= 0.5;
m_shortTermCplxSum += m_currentSatd / (CLIP_DURATION(m_frameDuration) / BASE_FRAME_DURATION);
@@ -1494,7 +1505,6 @@
{
if (m_param->rc.rateControlMode != X265_RC_CRF)
{
- double lqmin = 0, lqmax = 0;
lqmin = m_lastQScaleFor[m_sliceType] / m_lstep;
lqmax = m_lastQScaleFor[m_sliceType] * m_lstep;
if (!m_partialResidualFrames)
@@ -1520,6 +1530,8 @@
q = x265_clip3(MIN_QPSCALE, MAX_MAX_QPSCALE, q);
rce->qpNoVbv = x265_qScale2qp(q);
q = clipQscale(curFrame, rce, q);
+ if (m_pred[m_sliceType].count == 1 && m_framesDone > 0)
+ q = x265_clip3(lqmin, lqmax, q);
}
m_lastQScaleFor[m_sliceType] = q;
if ((m_curSlice->m_poc == 0 || m_lastQScaleFor[P_SLICE] < q) && !(m_2pass && !m_isVbv))
More information about the x265-devel
mailing list