📄 fgssubbanddecoder.cpp
字号:
}
ErrVal
RQFGSDecoder::xDecodeMotionData( UInt uiMbYIdx, UInt uiMbXIdx )
{
// ICU/ETRI FGS_MOT_USE
m_bFGSMotionUse[m_pcCurrSliceHeader->getLayerId()] = true;
DTRACE_DO( UInt uiMbIndex = uiMbYIdx * m_uiWidthInMB + uiMbXIdx );
MbDataAccess* pcMbDataAccessEL = 0;
MbDataAccess* pcMbDataAccessBL = 0;
RNOK( m_cMbDataCtrlEL .initMb( pcMbDataAccessEL, uiMbYIdx, uiMbXIdx ) );
RNOK( m_pcCurrMbDataCtrl ->initMb( pcMbDataAccessBL, uiMbYIdx, uiMbXIdx ) );
ROT ( pcMbDataAccessBL->getMbData().isIntra() );
DTRACE_NEWMB( uiMbIndex );
RNOK( m_pcMbParser ->readMotion( *pcMbDataAccessEL, pcMbDataAccessBL ) );
RNOK( m_pcMbDecoder->calcMv ( *pcMbDataAccessEL, pcMbDataAccessBL ) );
if( ! pcMbDataAccessEL->getMbData().getBLSkipFlag() && ! pcMbDataAccessEL->getMbData().getResidualPredFlag( PART_16x16 ) )
{
//----- motion refinement without residual prediction ===> clear base layer coeffs -----
UInt uiLayer = m_pcCurrSliceHeader->getLayerId();
YuvBufferCtrl* pcYuvBufferCtrl = m_papcYuvFullPelBufferCtrl[uiLayer];
RNOK( pcYuvBufferCtrl->initMb( uiMbYIdx, uiMbXIdx ) );
RNOK( xClearBaseCoeffs( *pcMbDataAccessEL, pcMbDataAccessBL ) );
}
return Err::m_nOK;
}
ErrVal
RQFGSDecoder::xInitializeMacroblockQPs()
{
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 ) );
MbDataAccess* pcMbDataAccessEL = 0;
RNOK( m_cMbDataCtrlEL .initMb( pcMbDataAccessEL, uiMbY, uiMbX ) );
//===== set QP for enhancement layer =====
Int iQpEL = max( 0, pcMbDataAccess->getMbData().getQp() - RQ_QP_DELTA );
pcMbDataAccessEL->getMbData().setQp( iQpEL );
RNOK( pcMbDataAccessEL->getMbData().copyMotion( pcMbDataAccess->getMbData() ) );
if( ! m_pcCurrSliceHeader->getAdaptivePredictionFlag() && ! pcMbDataAccess->getMbData().isIntra() )
pcMbDataAccessEL->getMbData().setBLSkipFlag( true );
}
return Err::m_nOK;
}
ErrVal
RQFGSDecoder::xDecodeNewCoefficientLumaMb( UInt uiMbYIdx,
UInt uiMbXIdx,
Int& riLastQp,
Int iLumaScanIdx,
UInt uiMaxPosLuma )
{
ROFRS( iLumaScanIdx < 16, Err::m_nOK );
MbDataAccess* pcMbDataAccessEL = 0;
MbDataAccess* pcMbDataAccessBL = 0;
for( UInt uiB8YIdx = 2 * uiMbYIdx; uiB8YIdx < 2 * uiMbYIdx + 2; uiB8YIdx++ )
for( UInt uiB8XIdx = 2 * uiMbXIdx; uiB8XIdx < 2 * uiMbXIdx + 2; uiB8XIdx++ )
{
//UInt uiBaseBlock = 2 * uiB8YIdx * 4 * m_uiWidthInMB + 2 * uiB8XIdx; // unused variable. mwi
for( UInt uiBlockYIdx = 2 * uiB8YIdx; uiBlockYIdx < 2 * uiB8YIdx + 2; uiBlockYIdx++ )
for( UInt uiBlockXIdx = 2 * uiB8XIdx; uiBlockXIdx < 2 * uiB8XIdx + 2; uiBlockXIdx++ )
{
UInt uiBlockIndex = uiBlockYIdx * 4 * m_uiWidthInMB + uiBlockXIdx;
if( iLumaScanIdx == 0 )
{
if ( !pcMbDataAccessBL )
{
RNOK( m_cMbDataCtrlEL .initMb( pcMbDataAccessEL, uiMbYIdx, uiMbXIdx ) );
RNOK( m_pcCurrMbDataCtrl ->initMb( pcMbDataAccessBL, uiMbYIdx, uiMbXIdx ) );
}
RNOK( xDecodeSigHeadersLuma( pcMbDataAccessBL, pcMbDataAccessEL, uiBlockYIdx, uiBlockXIdx, riLastQp ) );
}
for( UInt ui=iLumaScanIdx; ui<=uiMaxPosLuma && ui<16; ui++ )
{
if ( !pcMbDataAccessBL )
{
RNOK( m_cMbDataCtrlEL .initMb( pcMbDataAccessEL, uiMbYIdx, uiMbXIdx ) );
RNOK( m_pcCurrMbDataCtrl ->initMb( pcMbDataAccessBL, uiMbYIdx, uiMbXIdx ) );
}
while( m_apaucScanPosMap[0][uiBlockIndex] <= ui )
{
RNOK( xDecodeNewCoefficientLuma( pcMbDataAccessBL, pcMbDataAccessEL, uiBlockYIdx, uiBlockXIdx ) );
}
RNOK( xDecodeCoefficientLumaRef( uiBlockYIdx, uiBlockXIdx, ui ) );
}
} // 4x4 block iteration
} // 8x8 block iteration
return Err::m_nOK;
}
ErrVal
RQFGSDecoder::xDecodeSigHeadersLuma( MbDataAccess* pcMbDataAccessBL,
MbDataAccess* pcMbDataAccessEL,
UInt uiBlockYIndex,
UInt uiBlockXIndex,
Int& riLastQp )
{
UInt uiSubMbIndex = (uiBlockYIndex/2) * 2 * m_uiWidthInMB + (uiBlockXIndex/2);
UInt uiMbIndex = (uiBlockYIndex/4) * 1 * m_uiWidthInMB + (uiBlockXIndex/4);
UInt uiB8x8 = ((uiBlockYIndex%4)/2) * 2 + ((uiBlockXIndex%4)/2);
Par8x8 ePar8x8 = Par8x8(uiB8x8);
B8x8Idx c8x8Idx(ePar8x8);
if( ! ( m_paucSubMbMap[uiSubMbIndex] & CODED ) )
{
//===== CBP =====
Bool bSigCBP = m_pcSymbolReader->RQdecodeCBP_8x8( *pcMbDataAccessEL, *pcMbDataAccessBL, c8x8Idx );
m_paucSubMbMap[uiSubMbIndex] |= CODED;
if( bSigCBP )
{
m_paucSubMbMap[uiSubMbIndex] |= SIGNIFICANT;
}
if( !bSigCBP )
{
//===== set coefficient and block map =====
for( S4x4Idx cIdx(c8x8Idx); cIdx.isLegal(c8x8Idx); cIdx++ )
{
UInt uiBlk = ( (uiBlockYIndex/4)*4 + cIdx.y() ) * 4 * m_uiWidthInMB + ( (uiBlockXIndex/4)*4 + cIdx.x() );
m_paucBlockMap[uiBlk] |= CODED;
m_apaucScanPosMap[0][uiBlk] = 16;
for( UInt ui = 0; ui < 16; ui++ )
{
if( ! ( m_apaucLumaCoefMap[ui][uiBlk] & SIGNIFICANT ) )
{
m_apaucLumaCoefMap[ui][uiBlk] |= CODED;
m_pauiMacroblockMap[uiMbIndex] += ( 1 << NUM_COEFF_SHIFT );
ROT( (m_pauiMacroblockMap[uiMbIndex]>>NUM_COEFF_SHIFT) > 384 );
}
}
}
return Err::m_nOK;
}
//===== DELTA QP & TRANSFORM SIZE =====
if( ! ( m_pauiMacroblockMap[uiMbIndex] & CODED ) )
{
//===== delta QP =====
if( ! ( m_pauiMacroblockMap[uiMbIndex] & SIGNIFICANT ) )
{
pcMbDataAccessEL->setLastQp( riLastQp );
RNOK( m_pcSymbolReader->RQdecodeDeltaQp( *pcMbDataAccessEL ) );
riLastQp = pcMbDataAccessEL->getMbData().getQp();
m_pauiMacroblockMap[uiMbIndex] |= SIGNIFICANT;
}
//===== transform size =====
if( ! ( m_pauiMacroblockMap[uiMbIndex] & TRANSFORM_SPECIFIED ) )
{
RNOK( m_pcSymbolReader->RQdecode8x8Flag( *pcMbDataAccessEL, *pcMbDataAccessBL ) );
m_pauiMacroblockMap[uiMbIndex] |= TRANSFORM_SPECIFIED;
}
m_pauiMacroblockMap[uiMbIndex] |= CODED;
}
}
if( ! pcMbDataAccessBL->getMbData().isTransformSize8x8() )
{
for (UInt uiY=(uiBlockYIndex/2)*2; uiY<(uiBlockYIndex/2)*2+2; uiY++)
{
for (UInt uiX=(uiBlockXIndex/2)*2; uiX<(uiBlockXIndex/2)*2+2; uiX++)
{
UInt uiBlk = uiY * 4 * m_uiWidthInMB + uiX;
UInt uiB4x4 = (uiY%4) * 4 + (uiX%4);
B4x4Idx c4x4Tmp(uiB4x4);
if( ! ( m_paucBlockMap[uiBlk] & CODED ) )
{
Bool bSigBCBP = m_pcSymbolReader->RQdecodeBCBP_4x4( *pcMbDataAccessBL, c4x4Tmp );
m_paucBlockMap[uiBlk] |= CODED;
if( bSigBCBP )
{
m_paucBlockMap[uiBlk] |= SIGNIFICANT;
}
if( ! bSigBCBP )
{
m_apaucScanPosMap[0][uiBlk] = 16;
for( UInt ui = 0; ui < 16; ui++ )
{
if( ! ( m_apaucLumaCoefMap[ui][uiBlk] & SIGNIFICANT ) )
{
m_apaucLumaCoefMap[ui][uiBlk] |= CODED;
m_pauiMacroblockMap[uiMbIndex] += ( 1 << NUM_COEFF_SHIFT );
ROT( (m_pauiMacroblockMap[uiMbIndex]>>NUM_COEFF_SHIFT) > 384 );
}
}
}
}
}
}
}
return Err::m_nOK;
}
ErrVal
RQFGSDecoder::xDecodeNewCoefficientLuma( MbDataAccess* pcMbDataAccessBL,
MbDataAccess* pcMbDataAccessEL,
UInt uiBlockYIndex,
UInt uiBlockXIndex )
{
UInt uiBlockIndex = uiBlockYIndex * 4 * m_uiWidthInMB + uiBlockXIndex;
UInt uiMbIndex = (uiBlockYIndex/4) * 1 * m_uiWidthInMB + (uiBlockXIndex/4);
UInt uiB8x8 = ((uiBlockYIndex%4)/2) * 2 + ((uiBlockXIndex%4)/2);
UInt uiB4x4 = (uiBlockYIndex%4) * 4 + (uiBlockXIndex%4);
Par8x8 ePar8x8 = Par8x8(uiB8x8);
B8x8Idx c8x8Idx(ePar8x8);
B4x4Idx c4x4Idx(uiB4x4);
if( pcMbDataAccessBL->getMbData().isTransformSize8x8() )
{
UInt auiBlockIdx[4] = { ( (uiBlockYIndex/4)*4 + c8x8Idx.y() ) * 4 * m_uiWidthInMB + ( (uiBlockXIndex/4)*4 + c8x8Idx.x() ),
( (uiBlockYIndex/4)*4 + c8x8Idx.y() ) * 4 * m_uiWidthInMB + ( (uiBlockXIndex/4)*4 + c8x8Idx.x() + 1 ),
( (uiBlockYIndex/4)*4 + c8x8Idx.y() + 1 ) * 4 * m_uiWidthInMB + ( (uiBlockXIndex/4)*4 + c8x8Idx.x() ),
( (uiBlockYIndex/4)*4 + c8x8Idx.y() + 1 ) * 4 * m_uiWidthInMB + ( (uiBlockXIndex/4)*4 + c8x8Idx.x() + 1 ) };
UInt uiBlkIter8x8;
UInt uiBlockIdx = uiBlockYIndex * 4 * m_uiWidthInMB + uiBlockXIndex;
for( uiBlkIter8x8 = 0; uiBlkIter8x8 < 4; uiBlkIter8x8++ )
{
if( auiBlockIdx[uiBlkIter8x8] == uiBlockIdx )
break;
}
UInt uiStop = 64;
UInt ui8x8ScanIndex = m_apaucScanPosMap[0][auiBlockIdx[uiBlkIter8x8]] * 4 + uiBlkIter8x8;
ROTRS( ui8x8ScanIndex >= uiStop, Err::m_nOK );
if (uiMbIndex != m_uiLastMbNum)
{
UInt uiOffset;
UInt uiMin = 16;
UInt uiRemain = 0;
m_uiLastMbNum = uiMbIndex;
for( uiOffset=0; uiOffset<4; uiOffset++ )
{
uiMin = min( uiMin, m_apaucScanPosMap[0][auiBlockIdx[uiOffset]] );
if( m_apaucScanPosMap[0][auiBlockIdx[uiOffset]] < 16 )
uiRemain++;
}
if( ( uiRemain == 2 ) || ( uiMin > 10 && uiRemain == 3 ) )
{
Bool bIsEob = false;
m_pcSymbolReader->RQeo8b( bIsEob );
if (bIsEob)
{
//UInt uiOffset; // shadowes previous declaration. mwi
UInt ui8x8Index;
for( ui8x8Index = 0; ui8x8Index < uiStop; ui8x8Index++ )
{
UInt uiS = ui8x8Index / 4;
UInt uiB = auiBlockIdx[ui8x8Index%4];
if( ! ( m_apaucLumaCoefMap[uiS][uiB] & SIGNIFICANT ) && ! ( m_apaucLumaCoefMap[uiS][uiB] & CODED ) )
{
m_apaucLumaCoefMap[uiS][uiB] |= CODED;
m_pauiMacroblockMap[uiMbIndex] += ( 1 << NUM_COEFF_SHIFT );
ROT( (m_pauiMacroblockMap[uiMbIndex]>>NUM_COEFF_SHIFT) > 384 );
}
}
for( uiOffset=0; uiOffset<4; uiOffset++ )
{
m_apaucScanPosMap[0][auiBlockIdx[uiOffset]] = 16;
}
ui8x8ScanIndex = m_apaucScanPosMap[0][auiBlockIdx[uiBlkIter8x8]] * 4 + uiBlkIter8x8;
ROTRS( ui8x8ScanIndex >= uiStop, Err::m_nOK );
}
}
}
Bool bNeedEob = true;
UInt uiNumCoefRead = 0;
UInt uiStride = 4;
RNOK( m_pcSymbolReader->RQdecodeNewTCoeff_8x8( *pcMbDataAccessEL, *pcMbDataAccessBL,
c8x8Idx, ui8x8ScanIndex, bNeedEob, uiNumCoefRead ) );
for ( UInt ui8x8 = 0; ui8x8ScanIndex < 64 && ( ui8x8 < uiNumCoefRead || bNeedEob ); ui8x8ScanIndex+=uiStride )
{
UInt uiS = ui8x8ScanIndex/4;
UInt uiB = auiBlockIdx[ui8x8ScanIndex%4];
if( ! ( m_apaucLumaCoefMap[uiS][uiB] & SIGNIFICANT ) )
{
m_apaucLumaCoefMap[uiS][uiB] |= CODED;
if( pcMbDataAccessEL->getMbTCoeffs().get8x8( c8x8Idx )[g_aucFrameScan64[ui8x8ScanIndex]] )
{
m_apaucLumaCoefMap[uiS][uiB] |= SIGNIFICANT;
}
m_pauiMacroblockMap[uiMbIndex] += ( 1 << NUM_COEFF_SHIFT );
ROT( (m_pauiMacroblockMap[uiMbIndex]>>NUM_COEFF_SHIFT) > 384 );
if( m_apaucLumaCoefMap[uiS][uiB] & SIGNIFICANT )
m_apaucLumaCoefMap[uiS][uiB] |= NEWSIG;
ui8x8++;
}
}
if( m_apaucScanPosMap[0][auiBlockIdx[uiBlkIter8x8]] * 4 + uiBlkIter8x8 < ui8x8ScanIndex )
m_apaucScanPosMap[0][auiBlockIdx[uiBlkIter8x8]] = ui8x8ScanIndex / 4;
while( ui8x8ScanIndex < 64 && ( m_apaucLumaCoefMap[ui8x8ScanIndex/4][auiBlockIdx[ui8x8ScanIndex%4]] & SIGNIFICANT ) )
{
ui8x8ScanIndex += 4;
m_apaucScanPosMap[0][auiBlockIdx[uiBlkIter8x8]] = ui8x8ScanIndex / 4;
}
}
else
{
if (! m_pcSymbolReader->RQpeekCbp4x4( *pcMbDataAccessBL, c4x4Idx ) )
{
return Err::m_nOK;
}
UInt uiStop = 16;
UInt uiScanIndex = uiStop;
UInt uiStartIndex = uiStop;
UInt uiIndex;
for( uiIndex = 0; uiIndex < uiStop; uiIndex++ )
{
if( ! ( m_apaucLumaCoefMap[uiIndex][uiBlockIndex] & SIGNIFICANT ) || ( m_apaucLumaCoefMap[uiIndex][uiBlockIndex] & NEWSIG ) )
{
uiStartIndex = uiIndex;
break;
}
}
uiScanIndex = m_apaucScanPosMap[0][uiBlockIndex];
ROTRS(uiScanIndex == uiStop, Err::m_nOK);
Bool bNeedEob = ( uiScanIndex > uiStartIndex );
UInt uiNumCoefRead;
RNOK( m_pcSymbolReader->RQdecodeNewTCoeff_Luma( *pcMbDataAccessEL, *pcMbDataAccessBL,
LUMA_SCAN, c4x4Idx, uiScanIndex, bNeedEob, uiNumCoefRead ) );
for ( UInt ui = 0; uiScanIndex < 16 && ( ui < uiNumCoefRead || bNeedEob ); uiScanIndex++ )
{
if( ! ( m_apaucLumaCoefMap[uiScanIndex][uiBlockIndex] & SIGNIFICANT ) )
{
if( pcMbDataAccessEL->getMbTCoeffs().get( c4x4Idx )[g_aucFrameScan[uiScanIndex]] )
{
m_apaucLumaCoefMap[uiScanIndex][uiBlockIndex] |= SIGNIFICANT;
m_apaucLumaCoefMap[uiScanIndex][uiBlockIndex] |= NEWSIG;
}
m_apaucLumaCoefMap[uiScanIndex][uiBlockIndex] |= CODED;
m_pauiMacroblockMap[uiMbIndex] += ( 1 << NUM_COEFF_SHIFT );
ROT( (m_pauiMacroblockMap[uiMbIndex]>>NUM_COEFF_SHIFT) > 384 );
ui++;
}
}
m_apaucScanPosMap[0][uiBlockIndex] = uiScanIndex;
while( uiScanIndex < 16 && ( m_apaucLumaCoefMap[uiScanIndex][uiBlockIndex] & SIGNIFICANT ) )
m_apaucScanPosMap[0][uiBlockIndex] = ++uiScanIndex;
}
return Err::m_nOK;
}
ErrVal
RQFGSDecoder::xDecodeNewCoefficientChromaDC ( UInt uiPlane,
UInt uiMbYIdx,
UInt uiMbXIdx,
Int& riLastQP,
UInt uiChromaScanIndex )
{
UInt uiMbIndex = uiMbYIdx * m_uiWidthInMB + uiMbXIdx;
UInt uiDCIdx = 4;
UInt uiStartIdx = 4;
UInt uiIndex;
for( uiIndex = 0; uiIndex < 4; uiIndex++ )
{
if( ! ( m_aapaucChromaDCCoefMap[uiPlane][uiIndex][uiMbIndex] & SIGNIFICANT) || ( m_aapaucChromaDCCoefMap[uiPlane][uiIndex][uiMbIndex] & NEWSIG ) )
{
uiStartIdx = uiIndex;
break;
}
}
uiDCIdx = m_apaucScanPosMap[uiPlane+1][uiMbIndex];
ROTRS(uiDCIdx == 4, Err::m_nOK);
ROTRS(uiDCIdx > uiChromaScanIndex, Err::m_nOK);
Bool bNeedEob = ( uiDCIdx > uiStartIdx );
MbDataAccess* pcMbDataAccessEL = 0;
MbDataAccess* pcMbDataAccessBL = 0;
RNOK( m_cMbDataCtrlEL .initMb( pcMbDataAccessEL, uiMbYIdx, uiMbXIdx ) );
RNOK( m_pcCurrMbDataCtrl ->initMb( pcMbDataAccessBL, uiMbYIdx, uiMbXIdx ) );
if( ! ( m_pauiMacroblockMap[uiMbIndex] & CHROMA_CBP_CODED ) )
{
//===== CHROMA CBP =====
Bool bSigCBP = m_pcSymbolReader->RQdecodeCBP_Chroma( *pcMbDataAccessEL, *pcMbDataAccessBL );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -