Skip to content
Snippets Groups Projects
Commit e77a1f60 authored by Xiang Li's avatar Xiang Li
Browse files

Merge branch 'Bugfix_Ticket1095' into 'master'

Bugfix and code cleanup for Ticket #1095.

See merge request !1661
parents b2b3dcc3 ee56857d
No related branches found
No related tags found
1 merge request!1661Bugfix and code cleanup for Ticket #1095.
Pipeline #5639 passed
...@@ -1621,7 +1621,18 @@ void EncSlice::encodeCtus( Picture* pcPic, const bool bCompressEntireSlice, cons ...@@ -1621,7 +1621,18 @@ void EncSlice::encodeCtus( Picture* pcPic, const bool bCompressEntireSlice, cons
#if WCG_EXT #if WCG_EXT
pRdCost->saveUnadjustedLambda(); pRdCost->saveUnadjustedLambda();
#endif #endif
for (uint32_t compIdx = 1; compIdx < MAX_NUM_COMPONENT; compIdx++)
{
const ComponentID compID = ComponentID(compIdx);
int chromaQPOffset = pcSlice->getPPS()->getQpOffset(compID) + pcSlice->getSliceChromaQpDelta(compID);
int qpc = pcSlice->getSPS()->getMappedChromaQpValue(compID, estQP) + chromaQPOffset;
double tmpWeight = pow(2.0, (estQP - qpc) / 3.0); // takes into account of the chroma qp mapping and chroma qp Offset
if (m_pcCfg->getDepQuantEnabledFlag())
{
tmpWeight *= (m_pcCfg->getGOPSize() >= 8 ? pow(2.0, 0.1 / 3.0) : pow(2.0, 0.2 / 3.0)); // increase chroma weight for dependent quantization (in order to reduce bit rate shift from chroma to luma)
}
m_pcRdCost->setDistortionWeight(compID, tmpWeight);
}
#if RDOQ_CHROMA_LAMBDA #if RDOQ_CHROMA_LAMBDA
const double lambdaArray[MAX_NUM_COMPONENT] = {estLambda / m_pcRdCost->getDistortionWeight (COMPONENT_Y), const double lambdaArray[MAX_NUM_COMPONENT] = {estLambda / m_pcRdCost->getDistortionWeight (COMPONENT_Y),
estLambda / m_pcRdCost->getDistortionWeight (COMPONENT_Cb), estLambda / m_pcRdCost->getDistortionWeight (COMPONENT_Cb),
...@@ -1742,6 +1753,19 @@ void EncSlice::encodeCtus( Picture* pcPic, const bool bCompressEntireSlice, cons ...@@ -1742,6 +1753,19 @@ void EncSlice::encodeCtus( Picture* pcPic, const bool bCompressEntireSlice, cons
actualQP = cu->qp; actualQP = cu->qp;
} }
pRdCost->setLambda(oldLambda, pcSlice->getSPS()->getBitDepths()); pRdCost->setLambda(oldLambda, pcSlice->getSPS()->getBitDepths());
int estQP = pcSlice->getSliceQp();
for (uint32_t compIdx = 1; compIdx < MAX_NUM_COMPONENT; compIdx++)
{
const ComponentID compID = ComponentID(compIdx);
int chromaQPOffset = pcSlice->getPPS()->getQpOffset(compID) + pcSlice->getSliceChromaQpDelta(compID);
int qpc = pcSlice->getSPS()->getMappedChromaQpValue(compID, estQP) + chromaQPOffset;
double tmpWeight = pow(2.0, (estQP - qpc) / 3.0); // takes into account of the chroma qp mapping and chroma qp Offset
if (m_pcCfg->getDepQuantEnabledFlag())
{
tmpWeight *= (m_pcCfg->getGOPSize() >= 8 ? pow(2.0, 0.1 / 3.0) : pow(2.0, 0.2 / 3.0)); // increase chroma weight for dependent quantization (in order to reduce bit rate shift from chroma to luma)
}
m_pcRdCost->setDistortionWeight(compID, tmpWeight);
}
pRateCtrl->getRCPic()->updateAfterCTU(pRateCtrl->getRCPic()->getLCUCoded(), actualBits, actualQP, actualLambda, skipRatio, pRateCtrl->getRCPic()->updateAfterCTU(pRateCtrl->getRCPic()->getLCUCoded(), actualBits, actualQP, actualLambda, skipRatio,
pcSlice->isIRAP() ? 0 : pCfg->getLCULevelRC()); pcSlice->isIRAP() ? 0 : pCfg->getLCULevelRC());
} }
......
...@@ -969,13 +969,12 @@ double EncRCPic::getLCUTargetBpp(bool isIRAP) ...@@ -969,13 +969,12 @@ double EncRCPic::getLCUTargetBpp(bool isIRAP)
if (isIRAP) if (isIRAP)
{ {
int noOfLCUsLeft = m_numberOfLCU - LCUIdx + 1; int bitrateWindow = min(4, m_LCULeft);
int bitrateWindow = min(4,noOfLCUsLeft);
double MAD = getLCU(LCUIdx).m_costIntra; double MAD = getLCU(LCUIdx).m_costIntra;
if (m_remainingCostIntra > 0.1 ) if (m_remainingCostIntra > 0.1 )
{ {
double weightedBitsLeft = (m_bitsLeft*bitrateWindow+(m_bitsLeft-getLCU(LCUIdx).m_targetBitsLeft)*noOfLCUsLeft)/(double)bitrateWindow; double weightedBitsLeft = (m_bitsLeft*bitrateWindow+(m_bitsLeft-getLCU(LCUIdx).m_targetBitsLeft)*m_LCULeft)/(double)bitrateWindow;
avgBits = int( MAD*weightedBitsLeft/m_remainingCostIntra ); avgBits = int( MAD*weightedBitsLeft/m_remainingCostIntra );
} }
else else
...@@ -1117,62 +1116,12 @@ void EncRCPic::updateAfterCTU(int LCUIdx, int bits, int QP, double lambda, doubl ...@@ -1117,62 +1116,12 @@ void EncRCPic::updateAfterCTU(int LCUIdx, int bits, int QP, double lambda, doubl
return; return;
} }
double alpha = m_encRCSeq->getLCUPara( m_frameLevel, LCUIdx ).m_alpha;
double beta = m_encRCSeq->getLCUPara( m_frameLevel, LCUIdx ).m_beta;
int LCUActualBits = m_LCUs[LCUIdx].m_actualBits; int LCUActualBits = m_LCUs[LCUIdx].m_actualBits;
int LCUTotalPixels = m_LCUs[LCUIdx].m_numberOfPixel; int LCUTotalPixels = m_LCUs[LCUIdx].m_numberOfPixel;
double bpp = ( double )LCUActualBits/( double )LCUTotalPixels; double bpp = ( double )LCUActualBits/( double )LCUTotalPixels;
double calLambda = alpha * pow( bpp, beta );
double inputLambda = m_LCUs[LCUIdx].m_lambda; double inputLambda = m_LCUs[LCUIdx].m_lambda;
if( inputLambda < 0.01 || calLambda < 0.01 || bpp < 0.0001 )
{
alpha *= ( 1.0 - m_encRCSeq->getAlphaUpdate() / 2.0 );
beta *= ( 1.0 - m_encRCSeq->getBetaUpdate() / 2.0 );
alpha = clipRcAlpha( m_encRCSeq->getbitDepth(), alpha );
beta = clipRcBeta( beta );
TRCParameter rcPara;
rcPara.m_alpha = alpha;
rcPara.m_beta = beta;
rcPara.m_skipRatio = skipRatio;
if (QP == g_RCInvalidQPValue && m_encRCSeq->getAdaptiveBits() == 1)
{
rcPara.m_validPix = 0;
}
else
{
rcPara.m_validPix = LCUTotalPixels;
}
double MSE = m_LCUs[LCUIdx].m_actualMSE;
double updatedK = MSE > 0 ? bpp * inputLambda / MSE : 0.0;
double updatedC = MSE / pow(bpp, -updatedK);
rcPara.m_alpha = updatedC * updatedK;
rcPara.m_beta = -updatedK - 1.0;
if (MSE > 0)
{
rcPara.m_alpha = clipRcAlpha( m_encRCSeq->getbitDepth(), rcPara.m_alpha );
rcPara.m_beta = clipRcBeta( rcPara.m_beta );
m_encRCSeq->setLCUPara(m_frameLevel, LCUIdx, rcPara);
}
return;
}
calLambda = Clip3( inputLambda / 10.0, inputLambda * 10.0, calLambda );
alpha += m_encRCSeq->getAlphaUpdate() * ( log( inputLambda ) - log( calLambda ) ) * alpha;
double lnbpp = log( bpp );
lnbpp = Clip3( -5.0, -0.1, lnbpp );
beta += m_encRCSeq->getBetaUpdate() * ( log( inputLambda ) - log( calLambda ) ) * lnbpp;
alpha = clipRcAlpha( m_encRCSeq->getbitDepth(), alpha );
beta = clipRcBeta( beta );
TRCParameter rcPara; TRCParameter rcPara;
rcPara.m_alpha = alpha;
rcPara.m_beta = beta;
rcPara.m_skipRatio = skipRatio; rcPara.m_skipRatio = skipRatio;
if (QP == g_RCInvalidQPValue && m_encRCSeq->getAdaptiveBits() == 1) if (QP == g_RCInvalidQPValue && m_encRCSeq->getAdaptiveBits() == 1)
{ {
...@@ -1292,87 +1241,38 @@ void EncRCPic::updateAfterPicture( int actualHeaderBits, int actualTotalBits, do ...@@ -1292,87 +1241,38 @@ void EncRCPic::updateAfterPicture( int actualHeaderBits, int actualTotalBits, do
if (isIRAP) if (isIRAP)
{ {
updateAlphaBetaIntra(&alpha, &beta); updateAlphaBetaIntra(&alpha, &beta);
TRCParameter rcPara;
rcPara.m_skipRatio = skipRatio;
rcPara.m_validPix = m_validPixelsInPic;
rcPara.m_alpha = alpha;
rcPara.m_beta = beta;
m_encRCSeq->setPicPara(m_frameLevel, rcPara);
} }
else else
{ {
// update parameters // update parameters
double picActualBits = ( double )m_picActualBits; double picActualBits = ( double )m_picActualBits;
double picActualBpp = m_validPixelsInPic > 0 ? picActualBits / (double)m_validPixelsInPic : 0.001; double picActualBpp = m_validPixelsInPic > 0 ? picActualBits / (double)m_validPixelsInPic : 0.001;
double calLambda = alpha * pow( picActualBpp, beta ); TRCParameter rcPara;
double inputLambda = m_picLambda; rcPara.m_skipRatio = skipRatio;
rcPara.m_validPix = m_validPixelsInPic;
if ( inputLambda < 0.01 || calLambda < 0.01 || picActualBpp < 0.0001 ) double avgMSE = getPicMSE();
{ double updatedK = picActualBpp * averageLambda / avgMSE;
alpha *= ( 1.0 - m_encRCSeq->getAlphaUpdate() / 2.0 ); double updatedC = avgMSE / pow(picActualBpp, -updatedK);
beta *= ( 1.0 - m_encRCSeq->getBetaUpdate() / 2.0 );
alpha = clipRcAlpha( m_encRCSeq->getbitDepth(), alpha );
beta = clipRcBeta( beta );
TRCParameter rcPara;
rcPara.m_alpha = alpha;
rcPara.m_beta = beta;
rcPara.m_skipRatio = skipRatio;
double avgMSE = getPicMSE();
double updatedK = picActualBpp * averageLambda / avgMSE;
double updatedC = avgMSE / pow(picActualBpp, -updatedK);
if (m_frameLevel > 0) //only use for level > 0
{
rcPara.m_alpha = updatedC * updatedK;
rcPara.m_beta = -updatedK - 1.0;
}
rcPara.m_validPix = m_validPixelsInPic;
if (m_validPixelsInPic > 0)
{
rcPara.m_alpha = clipRcAlpha( m_encRCSeq->getbitDepth(), rcPara.m_alpha );
rcPara.m_beta = clipRcBeta( rcPara.m_beta );
m_encRCSeq->setPicPara(m_frameLevel, rcPara);
}
return;
}
calLambda = Clip3( inputLambda / 10.0, inputLambda * 10.0, calLambda );
alpha += m_encRCSeq->getAlphaUpdate() * ( log( inputLambda ) - log( calLambda ) ) * alpha;
double lnbpp = log( picActualBpp );
lnbpp = Clip3( -5.0, -0.1, lnbpp );
beta += m_encRCSeq->getBetaUpdate() * ( log( inputLambda ) - log( calLambda ) ) * lnbpp;
alpha = clipRcAlpha( m_encRCSeq->getbitDepth(), alpha );
beta = clipRcBeta( beta );
}
TRCParameter rcPara;
rcPara.m_alpha = alpha;
rcPara.m_beta = beta;
rcPara.m_skipRatio = skipRatio;
double picActualBpp = m_validPixelsInPic > 0 ? m_picActualBits / (double)m_validPixelsInPic : 0.001;
double avgMSE = getPicMSE();
double updatedK = picActualBpp * averageLambda / avgMSE;
double updatedC = avgMSE / pow(picActualBpp, -updatedK);
if (m_frameLevel > 0) //only use for level > 0
{
rcPara.m_alpha = updatedC * updatedK; rcPara.m_alpha = updatedC * updatedK;
rcPara.m_beta = -updatedK - 1.0; rcPara.m_beta = -updatedK - 1.0;
} if (m_validPixelsInPic > 0)
{
rcPara.m_validPix = m_validPixelsInPic; rcPara.m_alpha = clipRcAlpha(m_encRCSeq->getbitDepth(), rcPara.m_alpha);
rcPara.m_beta = clipRcBeta( rcPara.m_beta );
if (m_validPixelsInPic > 0) m_encRCSeq->setPicPara(m_frameLevel, rcPara);
{ }
rcPara.m_alpha = clipRcAlpha(m_encRCSeq->getbitDepth(), rcPara.m_alpha); if ( m_frameLevel == 1 )
rcPara.m_beta = clipRcBeta( rcPara.m_beta ); {
m_encRCSeq->setPicPara(m_frameLevel, rcPara); double currLambda = Clip3(m_encRCGOP->getMinEstLambda(), m_encRCGOP->getMaxEstLambda(), m_picLambda);
} double updateLastLambda = g_RCWeightHistoryLambda * m_encRCSeq->getLastLambda() + g_RCWeightCurrentLambda * currLambda;
m_encRCSeq->setLastLambda( updateLastLambda );
if ( m_frameLevel == 1 ) }
{
double currLambda = Clip3(m_encRCGOP->getMinEstLambda(), m_encRCGOP->getMaxEstLambda(), m_picLambda);
double updateLastLambda = g_RCWeightHistoryLambda * m_encRCSeq->getLastLambda() + g_RCWeightCurrentLambda * currLambda;
m_encRCSeq->setLastLambda( updateLastLambda );
} }
} }
...@@ -1416,7 +1316,7 @@ double EncRCPic::calculateLambdaIntra(double alpha, double beta, double MADPerPi ...@@ -1416,7 +1316,7 @@ double EncRCPic::calculateLambdaIntra(double alpha, double beta, double MADPerPi
void EncRCPic::updateAlphaBetaIntra(double *alpha, double *beta) void EncRCPic::updateAlphaBetaIntra(double *alpha, double *beta)
{ {
double lnbpp = log(pow(m_totalCostIntra / (double)m_numberOfPixel, BETA1)); double lnbpp = log(pow(m_totalCostIntra / (double)m_numberOfPixel, BETA1)) - log((double)m_picActualBits / (double)m_numberOfPixel);
double diffLambda = (*beta)*(log((double)m_picActualBits)-log((double)m_targetBits)); double diffLambda = (*beta)*(log((double)m_picActualBits)-log((double)m_targetBits));
diffLambda = Clip3(-0.125, 0.125, 0.25*diffLambda); diffLambda = Clip3(-0.125, 0.125, 0.25*diffLambda);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment