📄 transform.cpp
字号:
piQCoeff[0] = iLevel;
UInt uiAcAbs = 0;
for( Int n = 1; n < 16; n++ )
{
iLevel = piCoeff[n];
Int iSign = iLevel;
iLevel = abs( iLevel ) * g_aaiQuantCoef[rcQp.rem()][n];
if( pucScale )
{
iLevel = ( iLevel << 4 ) / pucScale[n];
}
iLevel = ( iLevel + rcQp.add() ) >> rcQp.bits();
if( 0 != iLevel )
{
iSign >>= 31;
Int iDeScale = g_aaiDequantCoef[rcQp.rem()][n];
uiAcAbs += iLevel;
iLevel ^= iSign;
iLevel -= iSign;
piQCoeff[n] = iLevel;
if( pucScale )
{
piCoeff[n] = ( ( iLevel*iDeScale*pucScale[n] + iAdd ) << rcQp.per() ) >> 4;
}
else
{
piCoeff[n] = iLevel*iDeScale << rcQp.per();
}
}
else
{
piQCoeff[n] = 0;
piCoeff [n] = 0;
}
}
ruiAcAbs += uiAcAbs;
return;
}
Void Transform::xQuantDequantNonUniformChroma( TCoeff* piQCoeff,
TCoeff* piCoeff,
RefCtx* pcRefCtx,
const QpParameter& rcQp,
const UChar* pucScale,
UInt& ruiDcAbs,
UInt& ruiAcAbs )
{
Int iAdd = ( 1 << 3 ) >> rcQp.per();
{
Int iLevel = piCoeff[0];
UInt uiSign = ((UInt)iLevel)>>31;
iLevel = ( abs( iLevel ) * g_aaiQuantCoef[ rcQp.rem() ][0] );
if( pucScale )
{
iLevel = ( iLevel << 4 ) / pucScale[0];
}
iLevel = ( iLevel + 2*rcQp.add() ) >> ( rcQp.bits() + 1 );
ruiDcAbs += iLevel;
iLevel = ( uiSign ? -iLevel : iLevel );
piQCoeff[0] = iLevel;
piCoeff [0] = iLevel;
if( pcRefCtx && iLevel )
pcRefCtx[0] = 1;
}
UInt uiAcAbs = 0;
for( int n = 1; n < 16; n++ )
{
Int iLevel = piCoeff[n];
Int iSign = iLevel;
iLevel = ( abs( iLevel ) * g_aaiQuantCoef[rcQp.rem()][n] );
if( pucScale )
{
iLevel = ( iLevel << 4 ) / pucScale[n];
}
iLevel = ( iLevel + rcQp.add() ) >> rcQp.bits();
if( 0 != iLevel )
{
if( pcRefCtx )
pcRefCtx[g_aucInvFrameScan[n]] = 1;
iSign >>= 31;
Int iDeScale = g_aaiDequantCoef[rcQp.rem()][n];
uiAcAbs += iLevel;
iLevel ^= iSign;
iLevel -= iSign;
piQCoeff[n] = iLevel;
if( pucScale )
{
piCoeff[n] = ( ( iLevel*iDeScale*pucScale[n] + iAdd ) << rcQp.per() ) >> 4;
}
else
{
piCoeff[n] = iLevel*iDeScale << rcQp.per();
}
}
else
{
piQCoeff[n] = 0;
piCoeff[n] = 0;
}
}
ruiAcAbs += uiAcAbs;
return;
}
Void Transform::xQuantDequantUniform4x4( TCoeff* piQCoeff,
TCoeff* piCoeff,
RefCtx* pcRefCtx,
const QpParameter& rcQp,
const UChar* pucScale,
UInt& ruiAbsSum )
{
Int n = 0;
ruiAbsSum = 0;
Int iAdd = ( 1 << 3 ) >> rcQp.per();
for( ; n < 16; n++ )
{
Int iLevel = piCoeff[n];
Int iSign = iLevel;
iLevel = abs( iLevel ) * g_aaiQuantCoef[rcQp.rem()][n];
if( pucScale )
{
iLevel = ( iLevel << 4 ) / pucScale[n];
}
iLevel = ( iLevel + rcQp.add() ) >> rcQp.bits();
if( 0 != iLevel )
{
iSign >>= 31;
Int iDeScale = g_aaiDequantCoef[ rcQp.rem() ][ n ];
ruiAbsSum += iLevel;
iLevel ^= iSign;
iLevel -= iSign;
piQCoeff[n] = iLevel;
if( pcRefCtx )
pcRefCtx[g_aucInvFrameScan[n]] = 1;
if( pucScale )
{
piCoeff[n] = ( ( iLevel*iDeScale*pucScale[n] + iAdd ) << rcQp.per() ) >> 4;
}
else
{
piCoeff[n] = iLevel*iDeScale << rcQp.per();
}
}
else
{
piQCoeff[n] = 0;
piCoeff [n] = 0;
}
}
}
// for SVC to AVC rewrite
ErrVal Transform::predict4x4Blk( TCoeff* piCoeff, TCoeff* piRefCoeff, UInt uiRefQp, UInt& ruiAbsSum )
{
// DECLARATIONS
TCoeff cPredCoeff[16];
// PREDICT THE COEFFICIENTS
ScaleCoeffLevels( cPredCoeff, piRefCoeff, getLumaQp().value(), uiRefQp, 16 );
// ADJUST THE TRANSMITTED COEFFICIENTS
for( Int n=0; n<16; n++ )
{
ruiAbsSum -= (piCoeff[n] >0) ? piCoeff[n].getCoeff() : (-1*piCoeff[n].getCoeff());
piCoeff[n] -= cPredCoeff[n];
ruiAbsSum += (piCoeff[n]>0) ? piCoeff[n].getCoeff() : (-1*piCoeff[n].getCoeff());
}
return Err::m_nOK;
}
ErrVal Transform::predict8x8Blk( TCoeff* piCoeff, TCoeff* piRefCoeff, UInt uiRefQp, UInt& ruiAbsSum )
{
// DECLARATIONS
TCoeff cPredCoeff[64];
// PREDICT THE COEFFICIENTS
ScaleCoeffLevels( cPredCoeff, piRefCoeff, getLumaQp().value(), uiRefQp, 64 );
// ADJUST THE TRANSMITTED COEFFICIENTS
for( Int n=0; n<64; n++ )
{
ruiAbsSum -= (piCoeff[n] >0) ? piCoeff[n].getCoeff() : -1*piCoeff[n].getCoeff();
piCoeff[n] -= cPredCoeff[n];
ruiAbsSum += (piCoeff[n]>0) ? piCoeff[n].getCoeff() : -1*piCoeff[n].getCoeff();
}
return Err::m_nOK;
}
ErrVal Transform::predictMb16x16( TCoeff* piCoeff, TCoeff* piRef, UInt uiRefQp, UInt& ruiDcAbs, UInt& ruiAcAbs )
{
UInt uiAbs = 0;
for( UInt n=0; n<16; n++ )
predict4x4Blk( &piCoeff[n<<4], &piRef[n<<4], uiRefQp, uiAbs );
return Err::m_nOK;
}
ErrVal Transform::predictChromaBlocks( TCoeff* piCoeff, TCoeff* piRef, UInt uiRefQp, UInt& ruiDcAbs, UInt& ruiAcAbs )
{
// DECLARATIONS
TCoeff cScaledRef[64];
for( UInt x=0; x<0x40; x+=0x10 )
{
ScaleCoeffLevels( &cScaledRef[x], &piRef[x], getChromaQp().value(), uiRefQp, 16 );
for( UInt n=0; n<16; n++ )
{
piCoeff[x+n] -= cScaledRef[x+n];
}
}
// RECOMPUTE THE COEFFICIENT COUNTS
ruiAcAbs = 0;
ruiDcAbs = 0;
for( int i=0; i<64; i++ )
ruiAcAbs += abs( (Int)piCoeff[i] );
for( i=0; i<64; i+=16 )
ruiDcAbs += abs( (Int)piCoeff[i] );
ruiAcAbs -= ruiDcAbs;
return Err::m_nOK;
}
ErrVal
Transform::predictScaledACCoeffs( TCoeff *piCoeff,
TCoeff *piRef,
UInt uiRefQp )
{
// DECLARATIONS
TCoeff cPredCoeff[64] = {0};
UInt uiDcAbs=0, uiAcAbs=0;
// Predict the chroma coefficients
predictChromaBlocks( cPredCoeff, piRef, uiRefQp, uiDcAbs, uiAcAbs );
for( UInt i=0; i<64; i++ )
cPredCoeff[i] = -cPredCoeff[i];
// Scale the coefficients
x4x4Dequant( &cPredCoeff[0x00], &cPredCoeff[0x00], m_cChromaQp );
x4x4Dequant( &cPredCoeff[0x10], &cPredCoeff[0x10], m_cChromaQp );
x4x4Dequant( &cPredCoeff[0x20], &cPredCoeff[0x20], m_cChromaQp );
x4x4Dequant( &cPredCoeff[0x30], &cPredCoeff[0x30], m_cChromaQp );
// Substitute
for( UInt x=0x00; x<0x40; x+=0x10 )
for( UInt n=1; n<16; n++ )
piCoeff[x+n] = cPredCoeff[x+n];
return Err::m_nOK;
}
ErrVal Transform::addPrediction4x4Blk( TCoeff* piCoeff, TCoeff* piRefCoeff, UInt uiQp, UInt uiRefQp, UInt &uiCoded )
{
// DECLARATIONS
TCoeff cPredCoeff[16];
// PREDICT THE COEFFICIENTS
ScaleCoeffLevels( cPredCoeff, piRefCoeff, uiQp, uiRefQp, 16 );
// ADJUST THE TRANSMITTED COEFFICIENTS
for( Int n=0; n<16; n++ )
{
piCoeff[n] += cPredCoeff[n];
if( piCoeff[n] )
uiCoded++;
}
return Err::m_nOK;
}
ErrVal Transform::addPrediction8x8Blk( TCoeff* piCoeff, TCoeff* piRefCoeff, UInt uiQp, UInt uiRefQp, Bool& bCoded )
{
// DECLARATIONS
TCoeff cPredCoeff[64];
// PREDICT THE COEFFICIENTS
ScaleCoeffLevels( cPredCoeff, piRefCoeff, uiQp, uiRefQp, 64 );
// ADJUST THE TRANSMITTED COEFFICIENTS
for( Int n=0; n<64; n++ )
{
piCoeff[n] += cPredCoeff[n];
if( piCoeff[n] )
bCoded = true;
}
return Err::m_nOK;
}
ErrVal Transform::addPredictionChromaBlocks( TCoeff* piCoeff, TCoeff* piRef, UInt uiQp, UInt uiRefQp, Bool& bDCflag, Bool& bACflag )
{
// DECLARATIONS
TCoeff cScaledRef[64];
for( UInt x=0; x<0x40; x+=0x10 )
{
ScaleCoeffLevels( &cScaledRef[x], &piRef[x], uiQp, uiRefQp, 16 );
for( UInt n=0; n<16; n++ )
{
piCoeff[x+n] += cScaledRef[x+n];
if( piCoeff[x+n] )
{
if( n%16 )
bACflag = true;
else
bDCflag = true;
}
}
}
return Err::m_nOK;
}
Void Transform::xRequantUniform4x4( TCoeff* piCoeff,
TCoeff* piCoeffBase,
RefCtx* pcRefCtx,
Bool bFirstIsDc,
const QpParameter& rcQp,
const UChar* pucScale,
UInt& ruiAbsSum )
{
Int normAdjust[] = { 4, 5, 4, 5 };
ruiAbsSum = 0;
for( Int m = bFirstIsDc ? 1 : 0; m < 16; m++ )
{
Int n = g_aucFrameScan[m];
Int iLevel = piCoeff[n];
Int iSign = iLevel;
iLevel -= ( normAdjust[n/4] * normAdjust[n%4] * (Int)piCoeffBase[n] + ( 1 << 5 ) ) >> 6;
iSign = iLevel >> 31;
Int iBaseSign = piCoeffBase[n] >> 15;
iLevel = abs( iLevel ) * g_aaiQuantCoef[rcQp.rem()][n];
if( pucScale )
{
iLevel = ( iLevel << 4 ) / pucScale[n];
}
Int iQLevel = ( iLevel + rcQp.add() ) >> rcQp.bits();
pcRefCtx[m] <<= 2;
if( iQLevel )
{
// Clip refinement symbols
if( piCoeffBase[n] )
iQLevel = 1;
ruiAbsSum += iQLevel;
iQLevel ^= iSign;
iQLevel -= iSign;
piCoeff[n] = iQLevel;
pcRefCtx[m] += 1;
if( piCoeffBase[n] )
pcRefCtx[m] += ( iSign ^ iBaseSign ) & 1;
}
else
{
piCoeff [n] = 0;
}
}
}
Void Transform::xRequantNonUniformChroma( TCoeff* piCoeff,
TCoeff* piCoeffBase,
RefCtx* pcRefCtx,
const QpParameter& rcQp,
const UChar* pucScale,
UInt& ruiDcAbs,
UInt& ruiAcAbs )
{
Int normAdjust[] = { 4, 5, 4, 5 };
Int iLevel = piCoeff[0];
iLevel -= ( (Int)piCoeffBase[0] + 1 ) >> 1;
Int iSign = iLevel >> 31;
Int iBaseSign = piCoeffBase[0] >> 15;
iLevel = ( abs( iLevel ) * g_aaiQuantCoef[ rcQp.rem() ][0] );
if( pucScale )
{
iLevel = ( iLevel << 4 ) / pucScale[0];
}
Int iQLevel = ( iLevel + ( rcQp.add() << 1 ) ) >> ( rcQp.bits() + 1 );
pcRefCtx[0] <<= 2;
if( iQLevel )
{
// Clip refinement symbols
if( piCoeffBase[0] )
iQLevel = 1;
ruiDcAbs += iQLevel;
iQLevel ^= iSign;
iQLevel -= iSign;
piCoeff[0] = iQLevel;
pcRefCtx[0] += 1;
if( piCoeffBase[0] )
pcRefCtx[0] += ( iSign ^ iBaseSign ) & 1;
}
else
{
piCoeff[0] = 0;
}
UInt uiAcAbs = 0;
for( Int m = 1; m < 16; m++ )
{
Int n = g_aucFrameScan[m];
iLevel = piCoeff[n];
iLevel -= ( normAdjust[n/4] * normAdjust[n%4] * (Int)piCoeffBase[n] + ( 1 << 5 ) ) >> 6;
iSign = iLevel >> 31;
iBaseSign = piCoeffBase[n] >> 15;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -