# HG changeset patch # User Aruna Matheswaran <ar...@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 */
# HG changeset patch # User Aruna Matheswaran <ar...@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 */
_______________________________________________ x265-devel mailing list x265-devel@videolan.org https://mailman.videolan.org/listinfo/x265-devel