📄 fgssubbanddecoder.cpp
字号:
Bool bNeedEob = ( uiScanIndex > uiStartIndex );
UInt uiNumCoefRead;
RNOKS( m_pcSymbolReader->RQdecodeNewTCoeff_Luma( *pcMbDataAccessEL, *pcMbDataAccessBL,
LUMA_SCAN, b8x8, rcIdx, uiScanIndex, bNeedEob, uiNumCoefRead ) );
if(b8x8)
{
UInt uiOffset = (rcIdx.y() % 2) * 2 + (rcIdx.x() % 2);
UInt ui8x8ScanIndex = uiOffset + uiScanIndex * 4;
for ( UInt ui8x8 = 0; ui8x8ScanIndex < 64 && ( ui8x8 < uiNumCoefRead || bNeedEob ); ui8x8ScanIndex += 4 )
{
if( ! ( pcCoefMap[ui8x8ScanIndex] & SIGNIFICANT ) )
{
if( pcMbDataAccessEL->getMbTCoeffs().get8x8( c8x8Idx )[ g_aucFrameScan64[ui8x8ScanIndex] ] )
{
rcMbFGSCoefMap.getRefCtx( c8x8Idx )[ui8x8ScanIndex] = 1;
pcCoefMap[ui8x8ScanIndex] |= SIGNIFICANT | NEWSIG;
}
pcCoefMap[ui8x8ScanIndex] |= CODED;
RNOKS( rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ) );
ui8x8++;
}
}
rcMbFGSCoefMap.getLumaScanPos( rcIdx ) = ui8x8ScanIndex / 4;
while( ui8x8ScanIndex < 64 && ( pcCoefMap[ui8x8ScanIndex] & SIGNIFICANT ) )
{
ui8x8ScanIndex += 4;
rcMbFGSCoefMap.getLumaScanPos( rcIdx ) = ui8x8ScanIndex / 4;
}
}
else
{
const UChar* pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
for ( UInt ui = 0; uiScanIndex < 16 && ( ui < uiNumCoefRead || bNeedEob ); uiScanIndex++ )
{
if( ! ( pcCoefMap[uiScanIndex] & SIGNIFICANT ) )
{
if( pcMbDataAccessEL->getMbTCoeffs().get( rcIdx )[pucScan[uiScanIndex]] )
{
rcMbFGSCoefMap.getRefCtx( rcIdx )[uiScanIndex] = 1;
pcCoefMap[uiScanIndex] |= SIGNIFICANT | NEWSIG;
}
pcCoefMap[uiScanIndex] |= CODED;
RNOKS( rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ) );
ui++;
}
}
rcMbFGSCoefMap.getLumaScanPos( rcIdx ) = uiScanIndex;
while( uiScanIndex < 16 && ( pcCoefMap[uiScanIndex] & SIGNIFICANT ) )
rcMbFGSCoefMap.getLumaScanPos( rcIdx ) = ++uiScanIndex;
}
}
return Err::m_nOK;
}
ErrVal
RQFGSDecoder::xDecodeNewCoefficientChromaDC ( MbDataAccess* pcMbDataAccessBL,
MbDataAccess* pcMbDataAccessEL,
MbFGSCoefMap& rcMbFGSCoefMap,
const CPlaneIdx &rcCPlaneIdx,
Int& riLastQP,
UInt uiChromaScanIndex )
{
UInt uiDCIdx = 4;
UInt uiStartIdx = 4;
UInt uiIndex;
for( uiIndex = 0; uiIndex < 4; uiIndex++ )
{
CoefMap cCoefMap = rcMbFGSCoefMap.getCoefMap( CIdx( rcCPlaneIdx ) + uiIndex )[0];
if( ! (cCoefMap & SIGNIFICANT) || (cCoefMap & NEWSIG) )
{
uiStartIdx = uiIndex;
break;
}
}
uiDCIdx = rcMbFGSCoefMap.getChromaDCScanPos( rcCPlaneIdx );
ROTRS(uiDCIdx == 4, Err::m_nOK);
ROTRS(uiDCIdx > uiChromaScanIndex, Err::m_nOK);
Bool bNeedEob = ( uiDCIdx > uiStartIdx );
if( !(rcMbFGSCoefMap.getChromaDCMbMap( rcCPlaneIdx ) & CODED ) )
{
UInt uiSymbol;
RNOKS( m_pcSymbolReader->RQdecodeBCBP_ChromaDC( *pcMbDataAccessEL, *pcMbDataAccessBL, CIdx(rcCPlaneIdx), uiSymbol ) );
Bool bSigBCBP = uiSymbol != 0;
rcMbFGSCoefMap.getChromaDCMbMap( rcCPlaneIdx ) |= CODED;
if( bSigBCBP )
rcMbFGSCoefMap.getChromaDCMbMap( rcCPlaneIdx ) |= SIGNIFICANT;
if( ! bSigBCBP )
{
rcMbFGSCoefMap.getChromaDCScanPos( rcCPlaneIdx ) = 4;
for( CIdx cCIdx( rcCPlaneIdx ); cCIdx.isLegal( rcCPlaneIdx ); cCIdx++ )
{
CoefMap &rcCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx )[0];
if( !(rcCoefMap & SIGNIFICANT) )
{
rcCoefMap |= CODED;
RNOK( rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ) );
}
}
return Err::m_nOK;
}
}
// Encode EOB marker?
UInt uiNumCoefRead;
RNOKS( m_pcSymbolReader->RQdecodeNewTCoeff_Chroma( *pcMbDataAccessEL, *pcMbDataAccessBL,
CHROMA_DC, CIdx(rcCPlaneIdx), uiDCIdx, bNeedEob, uiNumCoefRead ) );
for ( UInt ui = 0; uiDCIdx < 4 && ( ui < uiNumCoefRead || bNeedEob ); uiDCIdx++ )
{
CoefMap &rcCoefMap = rcMbFGSCoefMap.getCoefMap( CIdx( rcCPlaneIdx ) + uiDCIdx )[0];
if( !(rcCoefMap & SIGNIFICANT) )
{
if( pcMbDataAccessEL->getMbTCoeffs().get( CIdx( rcCPlaneIdx ) + uiDCIdx )[0] )
{
rcMbFGSCoefMap.getRefCtx( CIdx( rcCPlaneIdx ) + uiDCIdx )[0] = 1;
rcCoefMap |= SIGNIFICANT | NEWSIG;
}
rcCoefMap |= CODED;
RNOK( rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ) );
ui++;
}
}
rcMbFGSCoefMap.getChromaDCScanPos( rcCPlaneIdx ) = uiDCIdx;
while( (rcMbFGSCoefMap.getCoefMap( CIdx( rcCPlaneIdx ) + uiDCIdx )[0] & SIGNIFICANT ) && uiDCIdx < 4 )
rcMbFGSCoefMap.getChromaDCScanPos( rcCPlaneIdx ) = ++uiDCIdx;
return Err::m_nOK;
}
ErrVal
RQFGSDecoder::xDecodeNewCoefficientChromaAC ( MbDataAccess* pcMbDataAccessBL,
MbDataAccess* pcMbDataAccessEL,
MbFGSCoefMap& rcMbFGSCoefMap,
const CIdx &rcCIdx,
Int& riLastQP,
UInt uiChromaScanIndex,
Bool bFrame )
{
UInt uiScanIndex = 16;
UInt uiStartIndex = 1;
UInt uiIndex;
CoefMap *pcCoefMap = rcMbFGSCoefMap.getCoefMap( rcCIdx );
for( uiIndex = 1; uiIndex < 16; uiIndex++ )
{
if( !(pcCoefMap[uiIndex] & SIGNIFICANT) || (pcCoefMap[uiIndex] & NEWSIG) )
{
uiStartIndex = uiIndex;
break;
}
}
uiScanIndex = rcMbFGSCoefMap.getChromaACScanPos( rcCIdx );
ROTRS(uiScanIndex == 16, Err::m_nOK);
ROTRS(uiScanIndex > uiChromaScanIndex, Err::m_nOK);
Bool bNeedEob = (uiScanIndex > uiStartIndex );
if( !(rcMbFGSCoefMap.getChromaACBlockMap( rcCIdx ) & CODED ) )
{
UInt uiSymbol;
RNOKS( m_pcSymbolReader->RQdecodeBCBP_ChromaAC( *pcMbDataAccessEL, *pcMbDataAccessBL, rcCIdx, uiSymbol ) );
Bool bSigBCBP = uiSymbol != 0;
rcMbFGSCoefMap.getChromaACBlockMap( rcCIdx ) |= CODED;
if( bSigBCBP )
{
rcMbFGSCoefMap.getChromaACBlockMap( rcCIdx ) |= SIGNIFICANT;
}
if( ! bSigBCBP )
{
rcMbFGSCoefMap.getChromaACScanPos( rcCIdx ) = 16;
CoefMap *pcCoefMap2 = rcMbFGSCoefMap.getCoefMap( rcCIdx );
for( UInt ui = 1; ui < 16; ui++ )
{
if( !(pcCoefMap2[ui] & SIGNIFICANT) )
{
pcCoefMap2[ui] |= CODED;
RNOK( rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ) );
}
}
return Err::m_nOK;
}
}
UInt uiNumCoefRead;
RNOKS( m_pcSymbolReader->RQdecodeNewTCoeff_Chroma( *pcMbDataAccessEL, *pcMbDataAccessBL,
CHROMA_AC, rcCIdx, uiScanIndex, bNeedEob, uiNumCoefRead ) );
const UChar* pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
for ( UInt ui = 0; uiScanIndex < 16 && ( ui < uiNumCoefRead || bNeedEob ); uiScanIndex++ )
{
if( !(pcCoefMap[uiScanIndex] & SIGNIFICANT) )
{
if( pcMbDataAccessEL->getMbTCoeffs().get( rcCIdx )[pucScan[uiScanIndex]] )
{
rcMbFGSCoefMap.getRefCtx( rcCIdx )[uiScanIndex] = 1;
pcCoefMap[uiScanIndex] |= SIGNIFICANT | NEWSIG;
}
pcCoefMap[uiScanIndex] |= CODED;
RNOK( rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ) );
ui++;
}
}
rcMbFGSCoefMap.getChromaACScanPos( rcCIdx ) = uiScanIndex;
while( (pcCoefMap[uiScanIndex] & SIGNIFICANT ) && uiScanIndex < 16 )
rcMbFGSCoefMap.getChromaACScanPos( rcCIdx ) = ++uiScanIndex;
return Err::m_nOK;
}
ErrVal
RQFGSDecoder::xDecodeCoefficientLumaRef( MbDataAccess* pcMbDataAccessBL,
MbDataAccess* pcMbDataAccessEL,
MbFGSCoefMap &rcMbFGSCoefMap,
const S4x4Idx &rcIdx,
UInt uiScanIndex )
{
B8x8Idx c8x8Idx( rcIdx.getContainingPar8x8() );
CoefMap* pcCoefMap;
RefCtx* pcRefCtx;
if( pcMbDataAccessBL->getMbData().isTransformSize8x8() )
{
uiScanIndex = 4*uiScanIndex + (rcIdx.s4x4() & 3); // convert scan index into 8x8 scan index
pcCoefMap = &rcMbFGSCoefMap.getCoefMap( c8x8Idx )[uiScanIndex];
pcRefCtx = &rcMbFGSCoefMap.getRefCtx( c8x8Idx )[uiScanIndex];
}
else
{
pcCoefMap = &rcMbFGSCoefMap.getCoefMap( rcIdx )[uiScanIndex];
pcRefCtx = &rcMbFGSCoefMap.getRefCtx( rcIdx )[uiScanIndex];
}
//===== check if coefficient is not significant or was already coded =====
ROFRS( *pcCoefMap & SIGNIFICANT, Err::m_nOK );
ROTRS( *pcCoefMap & CODED, Err::m_nOK );
Int iCoeff;
if( pcMbDataAccessBL->getMbData().isTransformSize8x8() )
{
RNOKS( m_pcSymbolReader->RQdecodeTCoeffRef_8x8( *pcMbDataAccessEL, *pcMbDataAccessBL, c8x8Idx, uiScanIndex, *pcRefCtx ) );
iCoeff = pcMbDataAccessEL->getMbTCoeffs().get8x8( c8x8Idx )[g_aucFrameScan64[uiScanIndex]];
if( pcMbDataAccessBL->getMbTCoeffs().get8x8( c8x8Idx )[g_aucFrameScan64[uiScanIndex]] < 0 )
iCoeff = -iCoeff;
}
else
{
RNOKS( m_pcSymbolReader->RQdecodeTCoeffRef_Luma( *pcMbDataAccessEL, *pcMbDataAccessBL, rcIdx, uiScanIndex, *pcRefCtx ) );
iCoeff = pcMbDataAccessEL->getMbTCoeffs().get( rcIdx )[g_aucFrameScan[uiScanIndex]];
if( pcMbDataAccessBL->getMbTCoeffs().get( rcIdx )[g_aucFrameScan[uiScanIndex]] < 0 )
iCoeff = - iCoeff;
}
(*pcRefCtx) <<= 2;
if( iCoeff < 0 )
(*pcRefCtx)+= 2;
else if( iCoeff > 0 )
(*pcRefCtx)++;
*pcCoefMap |= CODED;
RNOKS( rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ) );
return Err::m_nOK;
}
ErrVal
RQFGSDecoder::xDecodeCoefficientChromaDCRef ( MbDataAccess *pcMbDataAccessBL,
MbDataAccess *pcMbDataAccessEL,
MbFGSCoefMap &rcMbFGSCoefMap,
const CPlaneIdx &rcCPlaneIdx,
UInt uiDCIdx )
{
CIdx cCIdx = CIdx( rcCPlaneIdx ) + uiDCIdx;
CoefMap &rcCoefMap = rcMbFGSCoefMap.getCoefMap( cCIdx )[0];
ROF( rcCoefMap & SIGNIFICANT );
ROT( rcCoefMap & CODED );
RefCtx &rcRefCtx = rcMbFGSCoefMap.getRefCtx( cCIdx )[0];
RNOK( m_pcSymbolReader->RQdecodeTCoeffRef_Chroma( *pcMbDataAccessEL, *pcMbDataAccessBL,
CHROMA_DC, CIdx(rcCPlaneIdx), uiDCIdx, rcRefCtx ) );
Int iCoeff = pcMbDataAccessEL->getMbTCoeffs().get( cCIdx )[0];
if( pcMbDataAccessBL->getMbTCoeffs().get( cCIdx )[0] < 0 )
iCoeff = -iCoeff;
rcRefCtx <<= 2;
if( iCoeff < 0 )
rcRefCtx += 2;
else if( iCoeff > 0 )
rcRefCtx++;
rcCoefMap |= CODED;
RNOK( rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ) );
return Err::m_nOK;
}
ErrVal
RQFGSDecoder::xDecodeCoefficientChromaACRef ( MbDataAccess *pcMbDataAccessBL,
MbDataAccess *pcMbDataAccessEL,
MbFGSCoefMap &rcMbFGSCoefMap,
const CIdx &rcCIdx,
UInt uiScanIdx )
{
CoefMap &rcCoefMap = rcMbFGSCoefMap.getCoefMap( rcCIdx )[uiScanIdx];
ROF( rcCoefMap & SIGNIFICANT );
ROT( rcCoefMap & CODED );
RefCtx &rcRefCtx = rcMbFGSCoefMap.getRefCtx( rcCIdx )[uiScanIdx];
RNOK( m_pcSymbolReader->RQdecodeTCoeffRef_Chroma( *pcMbDataAccessEL, *pcMbDataAccessBL,
CHROMA_AC, rcCIdx, uiScanIdx, rcRefCtx ) );
Int iCoeff = pcMbDataAccessEL->getMbTCoeffs().get( rcCIdx )[g_aucFrameScan[uiScanIdx]];
if( pcMbDataAccessBL->getMbTCoeffs().get( rcCIdx )[g_aucFrameScan[uiScanIdx]] < 0 )
iCoeff = -iCoeff;
rcRefCtx <<= 2;
if( iCoeff < 0 )
rcRefCtx += 2;
else if( iCoeff > 0 )
rcRefCtx++;
rcCoefMap |= CODED;
RNOK( rcMbFGSCoefMap.increaseAndCheckNumCoded( 1 ) );
return Err::m_nOK;
}
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -