# HG changeset patch # User Aarthi Thirumalai # Date 1410757433 -19800 # Mon Sep 15 10:33:53 2014 +0530 # Node ID 49c54a540cc237659416be7d5fb53241fb0094e4 # Parent 1de67321275e70d510f0df3d5b7d4b9d391a1e66 rc: fixes for 2 pass + vbv to calculate frameSizePlanned accurately.
diff -r 1de67321275e -r 49c54a540cc2 source/encoder/encoder.cpp --- a/source/encoder/encoder.cpp Mon Sep 15 15:00:13 2014 +0200 +++ b/source/encoder/encoder.cpp Mon Sep 15 10:33:53 2014 +0530 @@ -235,13 +235,10 @@ void Encoder::updateVbvPlan(RateControl* rc) { int encIdx, curIdx; - - curIdx = (m_curEncoder + m_param->frameNumThreads - 1) % m_param->frameNumThreads; - encIdx = (curIdx + 1) % m_param->frameNumThreads; - while (encIdx != curIdx) + for ( int i = 0; i < m_param->frameNumThreads; i++) { - FrameEncoder *encoder = &m_frameEncoder[encIdx]; - if (encoder->m_rce.isActive) + FrameEncoder *encoder = &m_frameEncoder[i]; + if (encoder->m_rce.isActive && encoder->m_rce.poc != rc->m_curSlice->m_poc) { int64_t bits = (int64_t) X265_MAX(encoder->m_rce.frameSizeEstimated, encoder->m_rce.frameSizePlanned); rc->m_bufferFill -= bits; @@ -251,7 +248,6 @@ if (rc->m_2pass) rc->m_predictedBits += bits; } - encIdx = (encIdx + 1) % m_param->frameNumThreads; } } diff -r 1de67321275e -r 49c54a540cc2 source/encoder/ratecontrol.cpp --- a/source/encoder/ratecontrol.cpp Mon Sep 15 15:00:13 2014 +0200 +++ b/source/encoder/ratecontrol.cpp Mon Sep 15 10:33:53 2014 +0530 @@ -1365,12 +1365,20 @@ q += m_pbOffset; rce->qpNoVbv = q; double qScale = x265_qp2qScale(q); - if (m_leadingBframes > 5 && m_isVbv) + + if (!m_2pass && m_isVbv) { - qScale = clipQscale(pic, qScale); - m_lastQScaleFor[m_sliceType] = qScale; + if (m_leadingBframes > 5) + { + qScale = clipQscale(pic, qScale); + m_lastQScaleFor[m_sliceType] = qScale; + } + rce->frameSizePlanned = predictSize(&m_predBfromP, qScale, (double)m_leadingNoBSatd); } - rce->frameSizePlanned = predictSize(&m_predBfromP, qScale, (double)m_leadingNoBSatd); + else if (m_2pass && m_isVbv) + { + rce->frameSizePlanned = qScale2bits(rce, qScale); + } rce->frameSizeEstimated = rce->frameSizePlanned; rce->newQScale = qScale; return qScale; @@ -1400,8 +1408,7 @@ diff = m_predictedBits - (int64_t)rce->expectedBits; q = rce->newQScale; q /= Clip3(0.5, 2.0, (double)(abrBuffer - diff) / abrBuffer); - if (((rce->encodeOrder + 1 - m_param->frameNumThreads) >= m_fps) && - (m_expectedBitsSum > 0)) + if (m_expectedBitsSum > 0) { /* Adjust quant based on the difference between * achieved and expected bitrate so far */ _______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel