📄 fgscoder.cpp
字号:
pcCoefMap[ui] = SIGNIFICANT;
ucBlockSig = SIGNIFICANT;
if (piCoeff[pucScan[ui]] < 0)
pcCoefMap[ui] |= BASE_SIGN;
}
if( !( pcCoefMap[ui] & (SIGNIFICANT|CODED) ) && rucScanPos == 16 )
rucScanPos = ui;
}
rcMbFGSCoefMap.getChromaACBlockMap( cCIdx ) = ucBlockSig;
}
}
return Err::m_nOK;
}
ErrVal
FGSCoder::xUpdateCodingPath()
{
for( UInt uiMbY = 0; uiMbY < m_uiHeightInMB; uiMbY++ )
for( UInt uiMbX = 0; uiMbX < m_uiWidthInMB; uiMbX++ )
{
MbDataAccess* pcMbDataAccessBL = 0;
MbDataAccess* pcMbDataAccessEL = 0;
RNOK( m_pcCurrMbDataCtrl->initMb( pcMbDataAccessBL, uiMbY, uiMbX ) );
RNOK( m_cMbDataCtrlEL .initMb( pcMbDataAccessEL, uiMbY, uiMbX ) );
//===== scale enhancement layer coefficients =====
pcMbDataAccessEL->getMbData().setTransformSize8x8( pcMbDataAccessBL->getMbData().isTransformSize8x8() );
RNOK( xScaleTCoeffs( *pcMbDataAccessEL, false ) );
//===== update coefficients, CBP, QP =====
RNOK( xUpdateMacroblock( *pcMbDataAccessBL, *pcMbDataAccessEL, uiMbY, uiMbX ) );
}
return Err::m_nOK;
}
ErrVal FGSCoder::xClearCodingPath()
{
for( UInt uiMbY = 0; uiMbY < m_uiHeightInMB; uiMbY++ )
{
for( UInt uiMbX = 0; uiMbX < m_uiWidthInMB; uiMbX++ )
{
MbDataAccess* pcMbDataAccessBL = 0;
RNOK( m_pcCurrMbDataCtrl->initMb( pcMbDataAccessBL, uiMbY, uiMbX ) );
MbData& rcMbData = pcMbDataAccessBL->getMbData();
UInt uiMbIndex = uiMbY * m_uiWidthInMB + uiMbX;
Bool bIntra4x4 = rcMbData.isIntra4x4 ();
Bool bIsSigLuma = ( ( rcMbData.getMbCbp() & 0xFF ) > 0 );
Bool b8x8Present = ( pcMbDataAccessBL->getSH().getPPS().getTransform8x8ModeFlag() &&
rcMbData.is8x8TrafoFlagPresent( pcMbDataAccessBL->getSH().getSPS().getDirect8x8InferenceFlag()) );
Bool b8x8Transform = ( b8x8Present && ( bIsSigLuma || bIntra4x4 ) && rcMbData.isTransformSize8x8() );
UInt uiMbCbp = pcMbDataAccessBL->getAutoCbp();
//===== set macroblock mode =====
MbFGSCoefMap &rcMbFGSCoefMap = m_pcCoefMap[uiMbIndex];
rcMbFGSCoefMap.resetNumCoded();
rcMbFGSCoefMap.getMbMap() &= SIGNIFICANT | TRANSFORM_SPECIFIED;
//--- LUMA ---
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
rcMbFGSCoefMap.getB8x8Map( c8x8Idx ) = ( ( uiMbCbp & ( 1 << c8x8Idx.b8x8Index() ) ) > 0 ? SIGNIFICANT : CLEAR );
if( b8x8Transform )
{
if( pcMbDataAccessBL->getSH().getPPS().getEntropyCodingModeFlag() )
{
for( S4x4Idx cIdx( c8x8Idx ); cIdx.isLegal( c8x8Idx ); cIdx++ )
{
rcMbFGSCoefMap.getLumaScanPos( cIdx ) = ((cIdx.x()%2) == 0 && (cIdx.y()%2) == 0) ? 64:0;
rcMbFGSCoefMap.getB4x4Map( cIdx ) &= ~CODED;
}
}
else
{
for( S4x4Idx cIdx( c8x8Idx ); cIdx.isLegal( c8x8Idx ); cIdx++ )
{
rcMbFGSCoefMap.getLumaScanPos( cIdx ) = 16;
rcMbFGSCoefMap.getB4x4Map( cIdx ) &= ~CODED;
}
}
//===== set transform coefficients =====
UInt ui8x8ScanIndex;
CoefMap* pcCoefMap = rcMbFGSCoefMap.getCoefMap( c8x8Idx );
for( ui8x8ScanIndex = 0; ui8x8ScanIndex < 64; ui8x8ScanIndex++ )
{
pcCoefMap[ui8x8ScanIndex] &= ~CODED & ~NEWSIG;
}
for( ui8x8ScanIndex = 0; ui8x8ScanIndex < 64; ui8x8ScanIndex++ )
{
if( pcMbDataAccessBL->getSH().getPPS().getEntropyCodingModeFlag() )
{
S4x4Idx cIdx2 = S4x4Idx( c8x8Idx );
if( !( pcCoefMap[ui8x8ScanIndex] & (SIGNIFICANT|CODED) ) && rcMbFGSCoefMap.getLumaScanPos( cIdx2 ) == 64 )
rcMbFGSCoefMap.getLumaScanPos( cIdx2 ) = ui8x8ScanIndex;
}
else
{
S4x4Idx cIdx2 = S4x4Idx( c8x8Idx ) + (ui8x8ScanIndex & 3);
if( !( pcCoefMap[ui8x8ScanIndex] & (SIGNIFICANT|CODED) ) && rcMbFGSCoefMap.getLumaScanPos( cIdx2 ) == 16 )
rcMbFGSCoefMap.getLumaScanPos( cIdx2 ) = ui8x8ScanIndex >> 2;
}
}
}
else
{
for( S4x4Idx cIdx( c8x8Idx ); cIdx.isLegal( c8x8Idx ); cIdx++ )
{
UInt uiScanIndex;
CoefMap* pcCoefMap = rcMbFGSCoefMap.getCoefMap( cIdx );
for( uiScanIndex = 0; uiScanIndex < 16; uiScanIndex++ )
pcCoefMap[uiScanIndex] &= ~CODED & ~NEWSIG;
UChar &rucScanPos = rcMbFGSCoefMap.getLumaScanPos( cIdx );
rucScanPos = 16;
for( uiScanIndex = 0; uiScanIndex < 16; uiScanIndex++ )
if( !( pcCoefMap[uiScanIndex] & (SIGNIFICANT|CODED) ) && rucScanPos == 16 )
rucScanPos = uiScanIndex;
rcMbFGSCoefMap.getB4x4Map( cIdx ) &= ~CODED;
}
}
}
//--- CHROMA DC ---
for( CPlaneIdx cCPlaneIdx; cCPlaneIdx.isLegal(); ++cCPlaneIdx )
{
UChar &rucScanPos = rcMbFGSCoefMap.getChromaDCScanPos( cCPlaneIdx );
rucScanPos = 4;
for( CIdx cCIdx( cCPlaneIdx ); cCIdx.isLegal( cCPlaneIdx ); cCIdx++ )
{
rcMbFGSCoefMap.getCoefMap( cCIdx )[0] &= ~CODED & ~NEWSIG;
if( !( rcMbFGSCoefMap.getCoefMap( cCIdx )[0] & (SIGNIFICANT|CODED) ) && rucScanPos == 4 )
rucScanPos = cCIdx&3;
}
rcMbFGSCoefMap.getChromaDCMbMap( cCPlaneIdx ) &= ~CODED;
}
//--- CHROMA AC ---
for( CIdx cCIdx; cCIdx.isLegal(); cCIdx++ )
{
UInt ui;
UChar &rucScanPos = rcMbFGSCoefMap.getChromaACScanPos( cCIdx );
rucScanPos = 16;
CoefMap *pcCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx );
for( ui = 1; ui < 16; ui++ )
{
pcCoefMap[ui] &= ~CODED & ~NEWSIG;
if( !( pcCoefMap[ui] & (SIGNIFICANT|CODED) ) && rucScanPos == 16 )
rucScanPos = ui;
}
rcMbFGSCoefMap.getChromaACBlockMap( cCIdx ) &= ~CODED;
}
}
}
return Err::m_nOK;
}
ErrVal
FGSCoder::xUpdateMacroblock( MbDataAccess& rcMbDataAccessBL,
MbDataAccess& rcMbDataAccessEL,
UInt uiMbY,
UInt uiMbX )
{
UInt uiExtCbp = 0;
Bool b8x8 = rcMbDataAccessBL.getMbData().isTransformSize8x8();
UInt uiMbIndex = uiMbY*m_uiWidthInMB + uiMbX;
MbFGSCoefMap &rcMbFGSCoefMap = m_pcCoefMap[uiMbIndex];
const Bool bFrame = (FRAME == rcMbDataAccessBL.getMbPicType());
if( ! rcMbDataAccessBL.getMbData().isIntra() && ! rcMbDataAccessEL.getMbData().getBLSkipFlag() )
{
//----- update motion parameters -----
rcMbDataAccessBL.getMbData().copyFrom ( rcMbDataAccessEL.getMbData() );
rcMbDataAccessBL.getMbData().copyMotion( rcMbDataAccessEL.getMbData() );
}
//===== luma =====
if( b8x8 )
{
const UChar* pucScan64 = (bFrame) ? g_aucFrameScan64 : g_aucFieldScan64;
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
Bool bSig = false;
TCoeff* piCoeffBL = rcMbDataAccessBL.getMbTCoeffs().get8x8( c8x8Idx );
TCoeff* piCoeffEL = rcMbDataAccessEL.getMbTCoeffs().get8x8( c8x8Idx );
CoefMap *pcCoefMap = rcMbFGSCoefMap.getCoefMap( c8x8Idx );
for( UInt ui8x8ScanIdx = 0; ui8x8ScanIdx < 64; ui8x8ScanIdx++ )
{
UInt uiPos = pucScan64[ui8x8ScanIdx];
if( m_bUpdateWithoutMap || (pcCoefMap[ui8x8ScanIdx] & CODED ) )
{
xUpdateCoefMap(piCoeffBL[uiPos], piCoeffEL[uiPos], pcCoefMap[ui8x8ScanIdx] );
}
if( piCoeffBL[uiPos] )
{
bSig = true;
}
}
if( bSig )
{
uiExtCbp |= ( 0x33 << c8x8Idx.b4x4() );
}
}
}
else
{
const UChar* pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
for( S4x4Idx c4x4Idx; c4x4Idx.isLegal(); c4x4Idx++ )
{
Bool bSig = false;
TCoeff* piCoeffBL = rcMbDataAccessBL.getMbTCoeffs().get( c4x4Idx );
TCoeff* piCoeffEL = rcMbDataAccessEL.getMbTCoeffs().get( c4x4Idx );
CoefMap* pcCoefMap = rcMbFGSCoefMap.getCoefMap( c4x4Idx );
for( UInt uiScanIdx = 0; uiScanIdx < 16; uiScanIdx++ )
{
UInt uiPos = pucScan[uiScanIdx];
if( m_bUpdateWithoutMap || pcCoefMap[uiScanIdx] & CODED )
{
xUpdateCoefMap(piCoeffBL[uiPos], piCoeffEL[uiPos], pcCoefMap[uiScanIdx] );
}
if( piCoeffBL[uiPos] )
{
bSig = true;
}
}
if( bSig )
{
uiExtCbp |= ( 1 << c4x4Idx );
}
}
}
//===== chroma DC =====
Bool bSigDC = false;
for( CIdx cCIdx2; cCIdx2.isLegal(); cCIdx2++ )
{
CoefMap &rcCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx2)[0];
TCoeff &riCoeffBL = rcMbDataAccessBL.getMbTCoeffs().get( cCIdx2 )[0];
if( m_bUpdateWithoutMap || rcCoefMap & CODED )
{
TCoeff &riCoeffEL = rcMbDataAccessEL.getMbTCoeffs().get( cCIdx2 )[0];
xUpdateCoefMap( riCoeffBL, riCoeffEL, rcCoefMap );
}
if( riCoeffBL )
bSigDC = true;
}
//===== chroma AC =====
Bool bSigAC = false;
const UChar* pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
for( CIdx cCIdx; cCIdx.isLegal(); cCIdx++ )
{
TCoeff* piCoeffBL = rcMbDataAccessBL.getMbTCoeffs().get( cCIdx );
TCoeff* piCoeffEL = rcMbDataAccessEL.getMbTCoeffs().get( cCIdx );
CoefMap* piCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx );
for( UInt uiScanIdx = 1; uiScanIdx < 16; uiScanIdx++ )
{
UInt uiPos = pucScan[uiScanIdx];
if( m_bUpdateWithoutMap || piCoefMap[uiScanIdx] & CODED )
xUpdateCoefMap( piCoeffBL[uiPos], piCoeffEL[uiPos], piCoefMap[uiScanIdx] );
if( piCoeffBL[uiPos] )
{
bSigAC = true;
}
}
}
//===== set CBP =====
UInt uiChromaCBP = ( bSigAC ? 2 : bSigDC ? 1 : 0 );
uiExtCbp |= ( uiChromaCBP << 16 );
rcMbDataAccessBL.getMbData().setAndConvertMbExtCbp( uiExtCbp );
//===== set QP =====
Int iELQP = rcMbDataAccessEL.getMbData().getQp();
Int iNumCoded = rcMbFGSCoefMap.getNumCoded();
Int iQPDelta = ( 384 - iNumCoded ) / 64;
Int iQP = min( 51, iELQP + iQPDelta );
if( ! ( rcMbFGSCoefMap.getMbMap() & SIGNIFICANT ) )
{
iQP = rcMbDataAccessEL.getSH().getPicQp();
}
rcMbDataAccessBL.getMbData().setQp( iQP );
return Err::m_nOK;
}
ErrVal
FGSCoder::xScale4x4Block( TCoeff* piCoeff,
const UChar* pucScale,
UInt uiStart,
const QpParameter& rcQP )
{
if( pucScale )
{
Int iAdd = ( rcQP.per() <= 3 ? ( 1 << ( 3 - rcQP.per() ) ) : 0 );
for( UInt ui = uiStart; ui < 16; ui++ )
{
piCoeff[ui] = ( ( piCoeff[ui] * g_aaiDequantCoef[rcQP.rem()][ui] * pucScale[ui] + iAdd ) << rcQP.per() ) >> 4;
}
}
else
{
for( UInt ui = uiStart; ui < 16; ui++ )
{
piCoeff[ui] *= ( g_aaiDequantCoef[rcQP.rem()][ui] << rcQP.per() );
}
}
return Err::m_nOK;
}
ErrVal
FGSCoder::xScale8x8Block( TCoeff* piCoeff,
const UChar* pucScale,
const QpParameter& rcQP )
{
Int iAdd = ( rcQP.per() <= 5 ? ( 1 << ( 5 - rcQP.per() ) ) : 0 );
if( pucScale )
{
for( UInt ui = 0; ui < 64; ui++ )
{
piCoeff[ui] = ( ( piCoeff[ui] * g_aaiDequantCoef64[rcQP.rem()][ui] * pucScale[ui] + iAdd ) << rcQP.per() ) >> 6;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -