[x265] [PATCH] Add vbv-end tolerance check
aruna at multicorewareinc.com
aruna at multicorewareinc.com
Fri Jun 8 12:39:56 CEST 2018
# HG changeset patch
# User Aruna Matheswaran <aruna at multicorewareinc.com>
# Date 1523005500 -19800
# Fri Apr 06 14:35:00 2018 +0530
# Node ID ed853c4af6710a991d0cdf4bf68e00fe32edaacb
# Parent 182914e1d201395d152e310db7f5cf29ab3c787e
Add vbv-end tolerance check
This will attempt to keep the desired fraction of the target buffer ( specified
by vbv-end ) empty within a defined error margin of 5%.
diff -r 182914e1d201 -r ed853c4af671 source/encoder/ratecontrol.cpp
--- a/source/encoder/ratecontrol.cpp Wed Mar 14 12:30:28 2018 +0530
+++ b/source/encoder/ratecontrol.cpp Fri Apr 06 14:35:00 2018 +0530
@@ -1282,6 +1282,12 @@
m_predictedBits = m_totalBits;
updateVbvPlan(enc);
rce->bufferFill = m_bufferFill;
+ rce->vbvEndAdj = false;
+ if (m_param->vbvBufferEnd && rce->encodeOrder >= m_param->vbvEndFrameAdjust * m_param->totalFrames)
+ {
+ rce->vbvEndAdj = true;
+ rce->targetFill = 0;
+ }
int mincr = enc->m_vps.ptl.minCrForLevel;
/* Profiles above Main10 don't require maxAU size check, so just set the maximum to a large value. */
@@ -2173,12 +2179,12 @@
curBits = predictSize(&m_pred[predType], frameQ[type], (double)satd);
bufferFillCur -= curBits;
}
- if (m_param->vbvBufferEnd && rce->encodeOrder >= m_param->vbvEndFrameAdjust * m_param->totalFrames)
+ if (rce->vbvEndAdj)
{
bool loopBreak = false;
double bufferDiff = m_param->vbvBufferEnd - (m_bufferFill / m_bufferSize);
- targetFill = m_bufferFill + m_bufferSize * (bufferDiff / (m_param->totalFrames - rce->encodeOrder));
- if (bufferFillCur < targetFill)
+ rce->targetFill = m_bufferFill + m_bufferSize * (bufferDiff / (m_param->totalFrames - rce->encodeOrder));
+ if (bufferFillCur < rce->targetFill)
{
q *= 1.01;
loopTerminate |= 1;
@@ -2421,6 +2427,7 @@
double rcTol = bufferLeftPlanned / m_param->frameNumThreads * m_rateTolerance;
int32_t encodedBitsSoFar = 0;
double accFrameBits = predictRowsSizeSum(curFrame, rce, qpVbv, encodedBitsSoFar);
+ double vbvEndBias = 0.95;
/* * Don't increase the row QPs until a sufficent amount of the bits of
* the frame have been processed, in case a flat area at the top of the
@@ -2442,7 +2449,8 @@
while (qpVbv < qpMax
&& (((accFrameBits > rce->frameSizePlanned + rcTol) ||
(rce->bufferFill - accFrameBits < bufferLeftPlanned * 0.5) ||
- (accFrameBits > rce->frameSizePlanned && qpVbv < rce->qpNoVbv))
+ (accFrameBits > rce->frameSizePlanned && qpVbv < rce->qpNoVbv) ||
+ (rce->vbvEndAdj && ((rce->bufferFill - accFrameBits) < (rce->targetFill * vbvEndBias))))
&& (!m_param->rc.bStrictCbr ? 1 : abrOvershoot > 0.1)))
{
qpVbv += stepSize;
@@ -2453,7 +2461,8 @@
while (qpVbv > qpMin
&& (qpVbv > curEncData.m_rowStat[0].rowQp || m_singleFrameVbv)
&& (((accFrameBits < rce->frameSizePlanned * 0.8f && qpVbv <= prevRowQp)
- || accFrameBits < (rce->bufferFill - m_bufferSize + m_bufferRate) * 1.1)
+ || accFrameBits < (rce->bufferFill - m_bufferSize + m_bufferRate) * 1.1
+ || (rce->vbvEndAdj && ((rce->bufferFill - accFrameBits) > (rce->targetFill * vbvEndBias))))
&& (!m_param->rc.bStrictCbr ? 1 : abrOvershoot < 0)))
{
qpVbv -= stepSize;
diff -r 182914e1d201 -r ed853c4af671 source/encoder/ratecontrol.h
--- a/source/encoder/ratecontrol.h Wed Mar 14 12:30:28 2018 +0530
+++ b/source/encoder/ratecontrol.h Fri Apr 06 14:35:00 2018 +0530
@@ -82,6 +82,8 @@
double rowCplxrSum;
double qpNoVbv;
double bufferFill;
+ double targetFill;
+ bool vbvEndAdj;
double frameDuration;
double clippedDuration;
double frameSizeEstimated; /* hold frameSize, updated from cu level vbv rc */
-------------- next part --------------
A non-text attachment was scrubbed...
Name: x265-clone.patch
Type: text/x-patch
Size: 4256 bytes
Desc: not available
URL: <http://mailman.videolan.org/pipermail/x265-devel/attachments/20180608/6d2a8bfb/attachment.bin>
More information about the x265-devel
mailing list