📄 fgscoder.cpp
字号:
rcMbFGSCoefMap.getB8x8Map( c8x8Idx ) = ( ( uiMbCbp & ( 1 << c8x8Idx.b8x8Index() ) ) > 0 ? SIGNIFICANT : CLEAR );
if( b8x8Transform )
{
if( pcMbDataAccess->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 ) = rcMbFGSCoefMap.getB8x8Map( c8x8Idx );
}
}
else
{
for( S4x4Idx cIdx( c8x8Idx ); cIdx.isLegal( c8x8Idx ); cIdx++ )
{
rcMbFGSCoefMap.getLumaScanPos( cIdx ) = 16;
rcMbFGSCoefMap.getB4x4Map( cIdx ) = rcMbFGSCoefMap.getB8x8Map( c8x8Idx );
}
}
//===== set transform coefficients =====
CoefMap *pcCoefMap = rcMbFGSCoefMap.getCoefMap( c8x8Idx );
TCoeff* piCoeff = rcMbData.getMbTCoeffs().get8x8( c8x8Idx );
for( UInt ui8x8ScanIndex = 0; ui8x8ScanIndex < 64; ui8x8ScanIndex++ )
{
if( 0 != piCoeff[g_aucFrameScan64[ui8x8ScanIndex]] )
{
pcCoefMap[ui8x8ScanIndex] = SIGNIFICANT;
if (piCoeff[g_aucFrameScan64[ui8x8ScanIndex]] < 0)
pcCoefMap[ui8x8ScanIndex] |= BASE_SIGN;
}
if( pcMbDataAccess->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++ )
{
TCoeff* piCoeff = rcMbData.getMbTCoeffs().get( cIdx );
UChar ucBlockSig = CLEAR;
UChar& rucScanPos = rcMbFGSCoefMap.getLumaScanPos( cIdx );
rucScanPos = 16;
CoefMap* pcCoefMap = rcMbFGSCoefMap.getCoefMap( cIdx );
//===== set transform coefficients =====
for( UInt uiScanIndex = 0; uiScanIndex < 16; uiScanIndex++ )
{
if( piCoeff[g_aucFrameScan[uiScanIndex]] )
{
pcCoefMap[uiScanIndex] = SIGNIFICANT;
ucBlockSig = SIGNIFICANT;
if (piCoeff[g_aucFrameScan[uiScanIndex]] < 0)
pcCoefMap[uiScanIndex] |= BASE_SIGN;
}
if( !( pcCoefMap[uiScanIndex] & (SIGNIFICANT|CODED) ) && rucScanPos == 16 )
rucScanPos = uiScanIndex;
}
//===== set block mode =====
rcMbFGSCoefMap.getB4x4Map( cIdx ) = ucBlockSig;
}
}
}
//--- CHROMA DC ---
for( CPlaneIdx cCPlaneIdx; cCPlaneIdx.isLegal(); ++cCPlaneIdx )
{
UChar ucBlockSig = CLEAR;
UChar &rucScanPos = rcMbFGSCoefMap.getChromaDCScanPos( cCPlaneIdx );
rucScanPos = 4;
for( CIdx cCIdx( cCPlaneIdx ); cCIdx.isLegal( cCPlaneIdx ); cCIdx++ )
{
TCoeff iCoeff = rcMbData.getMbTCoeffs().get( cCIdx )[0];
CoefMap& rcCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx )[0];
if( 0 != iCoeff )
{
rcCoefMap = SIGNIFICANT;
ucBlockSig = SIGNIFICANT;
if( iCoeff < 0 )
rcCoefMap |= BASE_SIGN;
}
if( !( rcCoefMap & (SIGNIFICANT|CODED) ) && rucScanPos == 4 )
rucScanPos = cCIdx&3;
}
rcMbFGSCoefMap.getChromaDCMbMap( cCPlaneIdx ) = ucBlockSig;
}
//--- CHROMA AC ---
for( CIdx cCIdx; cCIdx.isLegal(); cCIdx++ )
{
TCoeff* piCoeff = rcMbData.getMbTCoeffs().get( cCIdx );
UChar ucBlockSig = CLEAR;
CoefMap* pcCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx );
UChar &rucScanPos = rcMbFGSCoefMap.getChromaACScanPos( cCIdx );
rucScanPos = 16;
for( UInt ui = 1; ui < 16; ui++ )
{
if( piCoeff[g_aucFrameScan[ui]] )
{
pcCoefMap[ui] = SIGNIFICANT;
ucBlockSig = SIGNIFICANT;
if (piCoeff[g_aucFrameScan[ui]] < 0)
pcCoefMap[ui] |= BASE_SIGN;
}
if( !( pcCoefMap[ui] & (SIGNIFICANT|CODED) ) && rucScanPos == 16 )
rucScanPos = ui;
}
rcMbFGSCoefMap.getChromaACBlockMap( cCIdx ) = ucBlockSig;
}
//--ICU/ETRI FMO Implementation
if(pcSliceHeader !=NULL)
uiMbAddress = pcSliceHeader->getFMO()->getNextMBNr(uiMbAddress );
else
uiMbAddress ++;
}
}
return Err::m_nOK;
}
// FGS FMO ICU/ETRI
ErrVal
FGSCoder::xUpdateCodingPath(SliceHeader* pcSliceHeader)
{
//--ICU/ETRI FMO Implementation 1206
UInt uiFirstMbInSlice;
UInt uiLastMbInSlice;
if(pcSliceHeader !=NULL)
{
uiFirstMbInSlice = pcSliceHeader->getFirstMbInSlice();
uiLastMbInSlice = pcSliceHeader->getLastMbInSlice();
}
else
{
uiFirstMbInSlice =0;
uiLastMbInSlice = (m_uiWidthInMB*m_uiHeightInMB) -1;
}
for(UInt uiMbAddress= uiFirstMbInSlice ;uiMbAddress<=uiLastMbInSlice ;)
{
UInt uiMbY = uiMbAddress / m_uiWidthInMB;
UInt uiMbX = uiMbAddress % m_uiWidthInMB;
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 ) );
//--ICU/ETRI FMO Implementation
if(pcSliceHeader !=NULL)
uiMbAddress = pcSliceHeader->getFMO()->getNextMBNr(uiMbAddress );
else
uiMbAddress ++;
}
return Err::m_nOK;
}
ErrVal
FGSCoder::xInitializeCodingPath()
{
//===== loop over macroblocks =====
for( UInt uiMbY = 0; uiMbY < m_uiHeightInMB; uiMbY++ )
for( UInt uiMbX = 0; uiMbX < m_uiWidthInMB; uiMbX++ )
{
MbDataAccess* pcMbDataAccess = 0;
RNOK( m_pcCurrMbDataCtrl->initMb( pcMbDataAccess, uiMbY, uiMbX ) );
const Bool bFrame = (FRAME == pcMbDataAccess->getMbPicType());
MbData& rcMbData = pcMbDataAccess->getMbData();
UInt uiMbIndex = uiMbY * m_uiWidthInMB + uiMbX;
Bool bIntra4x4 = rcMbData.isIntra4x4 ();
Bool bIntra16x16 = rcMbData.isIntra16x16 ();
Bool bIsSignificant = ( rcMbData.getMbCbp() > 0 );
Bool bIsSigLuma = ( ( rcMbData.getMbCbp() & 0x0F ) > 0 );
Bool b8x8Present = ( pcMbDataAccess->getSH().getPPS().getTransform8x8ModeFlag() &&
rcMbData.is8x8TrafoFlagPresent( pcMbDataAccess->getSH().getSPS().getDirect8x8InferenceFlag()) );
Bool b8x8Transform = ( b8x8Present && ( bIsSigLuma || bIntra4x4 ) && rcMbData.isTransformSize8x8() );
UInt uiMbCbp = pcMbDataAccess->getAutoCbp();
if( ! pcMbDataAccess->getMbData().isIntra() )
pcMbDataAccess->getMbData().activateMotionRefinement();
//===== set macroblock mode =====
MbFGSCoefMap &rcMbFGSCoefMap = m_pcCoefMap[uiMbIndex];
rcMbFGSCoefMap.resetNumCoded();
rcMbFGSCoefMap.resetMbRefCtx();
rcMbFGSCoefMap.resetMbCoefMap();
rcMbFGSCoefMap.getMbMap() = ( bIntra16x16 || bIsSignificant ? SIGNIFICANT : CLEAR )
+ ( bIntra16x16 || bIntra4x4 || bIsSigLuma || !b8x8Present ? TRANSFORM_SPECIFIED : CLEAR );
//--- LUMA ---
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
rcMbFGSCoefMap.getB8x8Map( c8x8Idx ) = ( ( uiMbCbp & ( 1 << c8x8Idx.b8x8Index() ) ) > 0 ? SIGNIFICANT : CLEAR );
if( b8x8Transform )
{
TCoeff* piCoeff = rcMbData.getMbTCoeffs().get8x8( c8x8Idx );
if( pcMbDataAccess->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 ) = rcMbFGSCoefMap.getB8x8Map( c8x8Idx );
}
}
else
{
for( S4x4Idx cIdx( c8x8Idx ); cIdx.isLegal( c8x8Idx ); cIdx++ )
{
rcMbFGSCoefMap.getLumaScanPos( cIdx ) = 16;
rcMbFGSCoefMap.getB4x4Map( cIdx ) = rcMbFGSCoefMap.getB8x8Map( c8x8Idx );
}
}
const UChar* pucScan64 = (bFrame) ? g_aucFrameScan64 : g_aucFieldScan64;
CoefMap* pcCoefMap = rcMbFGSCoefMap.getCoefMap(c8x8Idx);
//===== set transform coefficients =====
for( UInt ui8x8ScanIndex = 0; ui8x8ScanIndex < 64; ui8x8ScanIndex++ )
{
if( 0 != piCoeff[pucScan64[ui8x8ScanIndex]] )
{
pcCoefMap[ui8x8ScanIndex] = SIGNIFICANT;
if( piCoeff[pucScan64[ui8x8ScanIndex]] < 0 )
pcCoefMap[ui8x8ScanIndex] |= BASE_SIGN;
}
if( pcMbDataAccess->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
{
const UChar* pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
for( S4x4Idx cIdx( c8x8Idx ); cIdx.isLegal( c8x8Idx ); cIdx++ )
{
TCoeff* piCoeff = rcMbData.getMbTCoeffs().get( cIdx );
UChar ucBlockSig = CLEAR;
UChar &rucScanPos = rcMbFGSCoefMap.getLumaScanPos( cIdx );
rucScanPos = 16;
CoefMap* pcCoefMap = rcMbFGSCoefMap.getCoefMap( cIdx );
//===== set transform coefficients =====
for( UInt uiScanIndex = 0; uiScanIndex < 16; uiScanIndex++ )
{
if( piCoeff[pucScan[uiScanIndex]] )
{
pcCoefMap[uiScanIndex] = SIGNIFICANT;
ucBlockSig = SIGNIFICANT;
if (piCoeff[pucScan[uiScanIndex]] < 0)
pcCoefMap[uiScanIndex] |= BASE_SIGN;
}
if( !( pcCoefMap[uiScanIndex] & (SIGNIFICANT|CODED) ) && rucScanPos == 16 )
rucScanPos = uiScanIndex;
}
//===== set block mode =====
rcMbFGSCoefMap.getB4x4Map( cIdx ) = ucBlockSig;
}
}
}
//--- CHROMA DC ---
for( CPlaneIdx cCPlaneIdx; cCPlaneIdx.isLegal(); ++cCPlaneIdx )
{
UChar ucBlockSig = CLEAR;
UChar &rucScanPos = rcMbFGSCoefMap.getChromaDCScanPos( cCPlaneIdx );
rucScanPos = 4;
for( CIdx cCIdx( cCPlaneIdx ); cCIdx.isLegal( cCPlaneIdx ); cCIdx++ )
{
TCoeff iCoeff = rcMbData.getMbTCoeffs().get( cCIdx )[0];
CoefMap& rcCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx )[0];
if( iCoeff )
{
rcCoefMap = SIGNIFICANT;
ucBlockSig = SIGNIFICANT;
if( iCoeff < 0 )
rcCoefMap |= BASE_SIGN;
}
if( !( rcCoefMap & (SIGNIFICANT|CODED) ) && rucScanPos == 4 )
rucScanPos = cCIdx&3;
}
rcMbFGSCoefMap.getChromaDCMbMap( cCPlaneIdx ) = ucBlockSig;
}
const UChar* pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
//--- CHROMA AC ---
for( CIdx cCIdx; cCIdx.isLegal(); cCIdx++ )
{
TCoeff* piCoeff = rcMbData.getMbTCoeffs().get( cCIdx );
CoefMap* pcCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx );
UChar ucBlockSig = CLEAR;
UChar &rucScanPos = rcMbFGSCoefMap.getChromaACScanPos( cCIdx );
rucScanPos = 16;
for( UInt ui = 1; ui < 16; ui++ )
{
if( piCoeff[pucScan[ui]] )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -