[x265] [x265 - PATCH] vbv: fix incorrect target fill
Aruna Matheswaran
aruna at multicorewareinc.com
Wed Sep 30 20:14:16 CEST 2020
>From e56e88cc54e6c5fc8c8997937e3b46744e9de66a Mon Sep 17 00:00:00 2001
From: Aruna <aruna at multicorewareinc.com>
Date: Wed, 30 Sep 2020 23:38:34 +0530
Subject: [PATCH] vbv: fix incorrect target fill
---
source/encoder/ratecontrol.cpp | 8 +++++---
source/encoder/ratecontrol.h | 2 ++
2 files changed, 7 insertions(+), 3 deletions(-)
diff --git a/source/encoder/ratecontrol.cpp b/source/encoder/ratecontrol.cpp
index 4e7d52419..515d9e543 100644
--- a/source/encoder/ratecontrol.cpp
+++ b/source/encoder/ratecontrol.cpp
@@ -356,6 +356,8 @@ bool RateControl::init(const SPS& sps)
m_bufferFillFinal = m_bufferSize * m_param->rc.vbvBufferInit;
m_bufferFillActual = m_bufferFillFinal;
m_bufferExcess = 0;
+ m_minBufferFill = m_param->minVbvFullness / 100;
+ m_maxBufferFill = 1 - (m_param->maxVbvFullness / 100);
m_initVbv = true;
}
@@ -2380,7 +2382,7 @@ double RateControl::clipQscale(Frame* curFrame,
RateControlEntry* rce, double q)
{
finalDur = x265_clip3(0.4, 1.0, totalDuration);
}
- targetFill = X265_MIN(m_bufferFill + totalDuration *
m_vbvMaxRate * 0.5, m_bufferSize * ((m_param->minVbvFullness / 100) *
finalDur));
+ targetFill = X265_MIN(m_bufferFill + totalDuration *
m_vbvMaxRate * 0.5, m_bufferSize * (1 - m_minBufferFill * finalDur));
if (bufferFillCur < targetFill)
{
q *= 1.01;
@@ -2389,7 +2391,7 @@ double RateControl::clipQscale(Frame* curFrame,
RateControlEntry* rce, double q)
}
/* Try to get the buffer not more than 80% filled, but
don't set an impossible goal. */
- targetFill = x265_clip3(m_bufferSize *
((m_param->maxVbvFullness / 100) * finalDur), m_bufferSize, m_bufferFill -
totalDuration * m_vbvMaxRate * 0.5);
+ targetFill = x265_clip3(m_bufferSize * (1 -
m_maxBufferFill * finalDur), m_bufferSize, m_bufferFill - totalDuration *
m_vbvMaxRate * 0.5);
if ((m_isCbr || m_2pass) && bufferFillCur > targetFill
&& !m_isSceneTransition)
{
q /= 1.01;
@@ -2406,7 +2408,7 @@ double RateControl::clipQscale(Frame* curFrame,
RateControlEntry* rce, double q)
/* Fallback to old purely-reactive algorithm: no lookahead. */
if ((m_sliceType == P_SLICE || m_sliceType == B_SLICE ||
(m_sliceType == I_SLICE && m_lastNonBPictType ==
I_SLICE)) &&
- m_bufferFill / m_bufferSize < (m_param->minVbvFullness /
100))
+ m_bufferFill / m_bufferSize < m_minBufferFill)
{
q /= x265_clip3(0.5, 1.0, 2.0 * m_bufferFill /
m_bufferSize);
}
diff --git a/source/encoder/ratecontrol.h b/source/encoder/ratecontrol.h
index 809e0c620..449cb218b 100644
--- a/source/encoder/ratecontrol.h
+++ b/source/encoder/ratecontrol.h
@@ -164,6 +164,8 @@ public:
double m_avgPFrameQp;
double m_bufferFillActual;
double m_bufferExcess;
+ double m_minBufferFill;
+ double m_maxBufferFill;
bool m_isFirstMiniGop;
Predictor m_pred[4]; /* Slice predictors to preidct bits for
each Slice type - I,P,Bref and B */
int64_t m_leadingNoBSatd;
--
2.20.1.windows.1
--
Regards,
*Aruna Matheswaran,*
Video Codec Engineer,
Media & AI analytics BU,
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20200930/de1fdda1/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: x265.diff
Type: application/octet-stream
Size: 3378 bytes
Desc: not available
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20200930/de1fdda1/attachment-0001.obj>
More information about the x265-devel
mailing list