?? fgssubbanddecoder.cpp
字號:
m_pauiMacroblockMap[uiMbIndex] |= CHROMA_CBP_CODED;
if( !bSigCBP )
{
//----- chroma DC -----
for( UInt uiCP = 0; uiCP < 2; uiCP++ )
{
m_apaucChromaDCBlockMap[uiCP][uiMbIndex] |= CODED;
m_apaucScanPosMap[uiCP + 1][uiMbIndex] = 4;
for( UInt ui = 0; ui < 4; ui++ )
{
if( ! ( m_aapaucChromaDCCoefMap[uiCP][ui][uiMbIndex] & SIGNIFICANT ) )
{
m_aapaucChromaDCCoefMap[uiCP][ui][uiMbIndex] |= CODED;
m_pauiMacroblockMap[uiMbIndex] += ( 1 << NUM_COEFF_SHIFT );
ROT( (m_pauiMacroblockMap[uiMbIndex]>>NUM_COEFF_SHIFT) > 384 );
}
}
}
//----- chroma AC -----
for( CIdx cCIdx; cCIdx.isLegal(); cCIdx++ )
{
UInt uiCP = cCIdx.plane();
UInt uiBlk = ( uiMbYIdx*2 + cCIdx.y() ) * 2 * m_uiWidthInMB + ( uiMbXIdx*2 + cCIdx.x() );
m_apaucChromaACBlockMap[uiCP][uiBlk] |= CODED;
m_apaucScanPosMap[uiCP + 3][uiBlk] = 16;
for( UInt ui = 1; ui < 16; ui++ )
{
if( ! ( m_aapaucChromaACCoefMap[uiCP][ui][uiBlk] & SIGNIFICANT ) )
{
m_aapaucChromaACCoefMap[uiCP][ui][uiBlk] |= CODED;
m_pauiMacroblockMap[uiMbIndex] += ( 1 << NUM_COEFF_SHIFT );
ROT( (m_pauiMacroblockMap[uiMbIndex]>>NUM_COEFF_SHIFT) > 384 );
}
}
}
return Err::m_nOK;
}
//===== DELTA QP =====
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;
}
}
}
if( ! ( m_apaucChromaDCBlockMap[uiPlane][uiMbIndex] & CODED ) )
{
Bool bSigBCBP = m_pcSymbolReader->RQdecodeBCBP_ChromaDC( *pcMbDataAccessBL, CIdx(4*uiPlane) );
m_apaucChromaDCBlockMap[uiPlane][uiMbIndex] |= CODED;
if( bSigBCBP )
{
m_apaucChromaDCBlockMap[uiPlane][uiMbIndex] |= SIGNIFICANT;
}
if( ! bSigBCBP )
{
m_apaucScanPosMap[uiPlane + 1][uiMbIndex] = 4;
for( UInt ui = 0; ui < 4; ui++ )
{
if( ! ( m_aapaucChromaDCCoefMap[uiPlane][ui][uiMbIndex] & SIGNIFICANT ) )
{
m_aapaucChromaDCCoefMap[uiPlane][ui][uiMbIndex] |= CODED;
m_pauiMacroblockMap[uiMbIndex] += ( 1 << NUM_COEFF_SHIFT );
ROT( (m_pauiMacroblockMap[uiMbIndex]>>NUM_COEFF_SHIFT) > 384 );
}
}
return Err::m_nOK;
}
}
// Encode EOB marker?
UInt uiNumCoefRead;
RNOK( m_pcSymbolReader->RQdecodeNewTCoeff_Chroma( *pcMbDataAccessEL, *pcMbDataAccessBL,
CHROMA_DC, CIdx(4*uiPlane), uiDCIdx, bNeedEob, uiNumCoefRead ) );
for ( UInt ui = 0; uiDCIdx < 4 && ( ui < uiNumCoefRead || bNeedEob ); uiDCIdx++ )
{
if( ! ( m_aapaucChromaDCCoefMap[uiPlane][uiDCIdx][uiMbIndex] & SIGNIFICANT ) )
{
if( pcMbDataAccessEL->getMbTCoeffs().get( CIdx(4*uiPlane) )[g_aucIndexChromaDCScan[uiDCIdx]] )
{
m_aapaucChromaDCCoefMap[uiPlane][uiDCIdx][uiMbIndex] |= SIGNIFICANT;
m_aapaucChromaDCCoefMap[uiPlane][uiDCIdx][uiMbIndex] |= NEWSIG;
}
m_aapaucChromaDCCoefMap[uiPlane][uiDCIdx][uiMbIndex] |= CODED;
m_pauiMacroblockMap[uiMbIndex] += ( 1 << NUM_COEFF_SHIFT );
ROT( (m_pauiMacroblockMap[uiMbIndex]>>NUM_COEFF_SHIFT) > 384 );
ui++;
}
}
m_apaucScanPosMap[uiPlane+1][uiMbIndex] = uiDCIdx;
while( ( m_aapaucChromaDCCoefMap[uiPlane][uiDCIdx][uiMbIndex] & SIGNIFICANT ) && uiDCIdx < 4 )
m_apaucScanPosMap[uiPlane+1][uiMbIndex] = ++uiDCIdx;
return Err::m_nOK;
}
ErrVal
RQFGSDecoder::xDecodeNewCoefficientChromaAC ( UInt uiPlane,
UInt uiB8YIdx,
UInt uiB8XIdx,
Int& riLastQP,
UInt uiChromaScanIndex )
{
UInt uiB8Index = (uiB8YIdx ) * 2 * m_uiWidthInMB + (uiB8XIdx );
UInt uiMbIndex = (uiB8YIdx/2) * 1 * m_uiWidthInMB + (uiB8XIdx/2);
UInt uiCIdx = 4*uiPlane + 2*(uiB8YIdx%2) + (uiB8XIdx%2);
CIdx cChromaIdx(uiCIdx);
UInt uiScanIndex = 16;
UInt uiStartIndex = 1;
UInt uiIndex;
for( uiIndex = 1; uiIndex < 16; uiIndex++ )
{
if( !( m_aapaucChromaACCoefMap[uiPlane][uiIndex][uiB8Index] & SIGNIFICANT ) || ( m_aapaucChromaACCoefMap[uiPlane][uiIndex][uiB8Index] & NEWSIG ) )
{
uiStartIndex = uiIndex;
break;
}
}
uiScanIndex = m_apaucScanPosMap[uiPlane+3][uiB8Index];
ROTRS(uiScanIndex == 16, Err::m_nOK);
ROTRS(uiScanIndex > uiChromaScanIndex, Err::m_nOK);
Bool bNeedEob = (uiScanIndex > uiStartIndex );
MbDataAccess* pcMbDataAccessEL = 0;
MbDataAccess* pcMbDataAccessBL = 0;
RNOK( m_cMbDataCtrlEL .initMb( pcMbDataAccessEL, uiB8YIdx/2, uiB8XIdx/2 ) );
RNOK( m_pcCurrMbDataCtrl ->initMb( pcMbDataAccessBL, uiB8YIdx/2, uiB8XIdx/2 ) );
if( ! ( m_pauiMacroblockMap[uiMbIndex] & CHROMA_CBP_CODED ) )
{
//===== CHROMA CBP =====
Bool bSigCBP = m_pcSymbolReader->RQdecodeCBP_Chroma( *pcMbDataAccessEL, *pcMbDataAccessBL );
m_pauiMacroblockMap[uiMbIndex] |= CHROMA_CBP_CODED;
if( !bSigCBP )
{
//----- chroma DC -----
for( UInt uiCP = 0; uiCP < 2; uiCP++ )
{
m_apaucChromaDCBlockMap[uiCP][uiMbIndex] |= CODED;
m_apaucScanPosMap[uiCP+1][uiMbIndex] = 4;
for( UInt ui = 0; ui < 4; ui++ )
{
if( ! ( m_aapaucChromaDCCoefMap[uiCP][ui][uiMbIndex] & SIGNIFICANT ) )
{
m_aapaucChromaDCCoefMap[uiCP][ui][uiMbIndex] |= CODED;
m_pauiMacroblockMap[uiMbIndex] += ( 1 << NUM_COEFF_SHIFT );
ROT( (m_pauiMacroblockMap[uiMbIndex]>>NUM_COEFF_SHIFT) > 384 );
}
}
}
//----- chroma AC -----
for( CIdx cCIdx; cCIdx.isLegal(); cCIdx++ )
{
UInt uiCP = cCIdx.plane();
UInt uiBlk = ( (uiB8YIdx/2)*2 + cCIdx.y() ) * 2 * m_uiWidthInMB + ( (uiB8XIdx/2)*2 + cCIdx.x() );
m_apaucChromaACBlockMap[uiCP][uiBlk] |= CODED;
m_apaucScanPosMap[uiCP+3][uiBlk] = 16;
for( UInt ui = 1; ui < 16; ui++ )
{
if( ! ( m_aapaucChromaACCoefMap[uiCP][ui][uiBlk] & SIGNIFICANT ) )
{
m_aapaucChromaACCoefMap[uiCP][ui][uiBlk] |= CODED;
m_pauiMacroblockMap[uiMbIndex] += ( 1 << NUM_COEFF_SHIFT );
ROT( (m_pauiMacroblockMap[uiMbIndex]>>NUM_COEFF_SHIFT) > 384 );
}
}
}
return Err::m_nOK;
}
//===== DELTA QP =====
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;
}
}
}
if( ! ( m_pauiMacroblockMap[uiMbIndex] & CHROMA_CBP_AC_CODED ) )
{
//===== CHROMA CBP =====
Bool bSigCBP = m_pcSymbolReader->RQdecodeCBP_ChromaAC( *pcMbDataAccessEL, *pcMbDataAccessBL );
m_pauiMacroblockMap[uiMbIndex] |= CHROMA_CBP_AC_CODED;
if( !bSigCBP )
{
for( CIdx cCIdx; cCIdx.isLegal(); cCIdx++ )
{
UInt uiCP = cCIdx.plane();
UInt uiBlk = ( (uiB8YIdx/2)*2 + cCIdx.y() ) * 2 * m_uiWidthInMB + ( (uiB8XIdx/2)*2 + cCIdx.x() );
m_apaucChromaACBlockMap[uiCP][uiBlk] |= CODED;
m_apaucScanPosMap[uiCP+3][uiBlk] = 16;
for( UInt ui = 1; ui < 16; ui++ )
{
if( ! ( m_aapaucChromaACCoefMap[uiCP][ui][uiBlk] & SIGNIFICANT ) )
{
m_aapaucChromaACCoefMap[uiCP][ui][uiBlk] |= CODED;
m_pauiMacroblockMap[uiMbIndex] += ( 1 << NUM_COEFF_SHIFT );
ROT( (m_pauiMacroblockMap[uiMbIndex]>>NUM_COEFF_SHIFT) > 384 );
}
}
}
return Err::m_nOK;
}
}
if( ! ( m_apaucChromaACBlockMap[uiPlane][uiB8Index] & CODED ) )
{
Bool bSigBCBP = m_pcSymbolReader->RQdecodeBCBP_ChromaAC( *pcMbDataAccessBL, cChromaIdx );
m_apaucChromaACBlockMap[uiPlane][uiB8Index] |= CODED;
if( bSigBCBP )
{
m_apaucChromaACBlockMap[uiPlane][uiB8Index] |= SIGNIFICANT;
}
if( ! bSigBCBP )
{
m_apaucScanPosMap[uiPlane+3][uiB8Index] = 16;
for( UInt ui = 1; ui < 16; ui++ )
{
if( ! ( m_aapaucChromaACCoefMap[uiPlane][ui][uiB8Index] & SIGNIFICANT ) )
{
m_aapaucChromaACCoefMap[uiPlane][ui][uiB8Index] |= CODED;
m_pauiMacroblockMap[uiMbIndex] += ( 1 << NUM_COEFF_SHIFT );
ROT( (m_pauiMacroblockMap[uiMbIndex]>>NUM_COEFF_SHIFT) > 384 );
}
}
return Err::m_nOK;
}
}
UInt uiNumCoefRead;
RNOK( m_pcSymbolReader->RQdecodeNewTCoeff_Chroma( *pcMbDataAccessEL, *pcMbDataAccessBL,
CHROMA_AC, cChromaIdx, uiScanIndex, bNeedEob, uiNumCoefRead ) );
for ( UInt ui = 0; uiScanIndex < 16 && ( ui < uiNumCoefRead || bNeedEob ); uiScanIndex++ )
{
if( ! ( m_aapaucChromaACCoefMap[uiPlane][uiScanIndex][uiB8Index] & SIGNIFICANT ) )
{
if( pcMbDataAccessEL->getMbTCoeffs().get( cChromaIdx )[g_aucFrameScan[uiScanIndex]] )
{
m_aapaucChromaACCoefMap[uiPlane][uiScanIndex][uiB8Index] |= SIGNIFICANT;
m_aapaucChromaACCoefMap[uiPlane][uiScanIndex][uiB8Index] |= NEWSIG;
}
m_aapaucChromaACCoefMap[uiPlane][uiScanIndex][uiB8Index] |= CODED;
m_pauiMacroblockMap[uiMbIndex] += ( 1 << NUM_COEFF_SHIFT );
ROT( (m_pauiMacroblockMap[uiMbIndex]>>NUM_COEFF_SHIFT) > 384 );
ui++;
}
}
m_apaucScanPosMap[uiPlane+3][uiB8Index] = uiScanIndex;
while( ( m_aapaucChromaACCoefMap[uiPlane][uiScanIndex][uiB8Index] & SIGNIFICANT ) && uiScanIndex < 16 )
m_apaucScanPosMap[uiPlane+3][uiB8Index] = ++uiScanIndex;
return Err::m_nOK;
}
ErrVal
RQFGSDecoder::xDecodeCoefficientLumaRef( UInt uiBlockYIndex,
UInt uiBlockXIndex,
UInt uiScanIndex )
{
UInt uiMbIndex = (uiBlockYIndex/4) * 1 * m_uiWidthInMB + (uiBlockXIndex/4);
UInt uiBlockIndex = uiBlockYIndex * 4 * m_uiWidthInMB + uiBlockXIndex;
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);
//===== check if coefficient is not significant or was already coded =====
ROFRS( m_apaucLumaCoefMap[uiScanIndex][uiBlockIndex] & SIGNIFICANT, Err::m_nOK );
ROTRS( m_apaucLumaCoefMap[uiScanIndex][uiBlockIndex] & CODED, Err::m_nOK );
MbDataAccess* pcMbDataAccessEL = 0;
MbDataAccess* pcMbDataAccessBL = 0;
RNOK( m_cMbDataCtrlEL .initMb( pcMbDataAccessEL, uiBlockYIndex/4, uiBlockXIndex/4 ) );
RNOK( m_pcCurrMbDataCtrl ->initMb( pcMbDataAccessBL, uiBlockYIndex/4, uiBlockXIndex/4 ) );
if( pcMbDataAccessBL->getMbData().isTransformSize8x8() )
{
UInt ui8x8ScanIndex = 4*uiScanIndex + 2*( uiBlockYIndex % 2 ) + ( uiBlockXIndex % 2 );
RNOK( m_pcSymbolReader->RQdecodeTCoeffRef_8x8( *pcMbDataAccessEL, *pcMbDataAccessBL,
c8x8Idx, ui8x8ScanIndex ) );
}
else
{
RNOK( m_pcSymbolReader->RQdecodeTCoeffRef_Luma( *pcMbDataAccessEL, *pcMbDataAccessBL, c4x4Idx, uiScanIndex ) );
}
m_apaucLumaCoefMap[uiScanIndex][uiBlockIndex] |= CODED;
m_pauiMacroblockMap[uiMbIndex] += ( 1 << NUM_COEFF_SHIFT );
ROT( (m_pauiMacroblockMap[uiMbIndex]>>NUM_COEFF_SHIFT) > 384 );
return Err::m_nOK;
}
ErrVal
RQFGSDecoder::xDecodeCoefficientChromaDCRef ( UInt uiPlane,
UInt uiMbYIdx,
UInt uiMbXIdx,
UInt uiDCIdx )
{
UInt uiMbIndex = uiMbYIdx * m_uiWidthInMB + uiMbXIdx;
//===== check if coefficient is not significant or was already coded =====
ROFRS( m_aapaucChromaDCCoefMap[uiPlane][uiDCIdx][uiMbIndex] & SIGNIFICANT, Err::m_nOK );
ROTRS( m_aapaucChromaDCCoefMap[uiPlane][uiDCIdx][uiMbIndex] & CODED, Err::m_nOK );
MbDataAccess* pcMbDataAccessEL = 0;
MbDataAccess* pcMbDataAccessBL = 0;
RNOK( m_cMbDataCtrlEL .initMb( pcMbDataAccessEL, uiMbYIdx, uiMbXIdx ) );
RNOK( m_pcCurrMbDataCtrl ->initMb( pcMbDataAccessBL, uiMbYIdx, uiMbXIdx ) );
RNOK( m_pcSymbolReader->RQdecodeTCoeffRef_Chroma( *pcMbDataAccessEL, *pcMbDataAccessBL,
CHROMA_DC, CIdx(4*uiPlane), uiDCIdx ) );
m_aapaucChromaDCCoefMap[uiPlane][uiDCIdx][uiMbIndex] |= CODED;
m_pauiMacroblockMap[uiMbIndex] += ( 1 << NUM_COEFF_SHIFT );
ROT( (m_pauiMacroblockMap[uiMbIndex]>>NUM_COEFF_SHIFT) > 384 );
return Err::m_nOK;
}
ErrVal
RQFGSDecoder::xDecodeCoefficientChromaACRef ( UInt uiPlane,
UInt uiB8YIdx,
UInt uiB8XIdx,
UInt uiScanIdx )
{
UInt uiB8Index = (uiB8YIdx ) * 2 * m_uiWidthInMB + (uiB8XIdx );
UInt uiMbIndex = (uiB8YIdx/2) * 1 * m_uiWidthInMB + (uiB8XIdx/2);
UInt uiChromaIdx = 4*uiPlane + 2*(uiB8YIdx%2) + (uiB8XIdx%2);
CIdx cChromaIdx(uiChromaIdx);
//===== check if coefficient is not significant or was already coded =====
ROFRS( m_aapaucChromaACCoefMap[uiPlane][uiScanIdx][uiB8Index] & SIGNIFICANT, Err::m_nOK );
ROTRS( m_aapaucChromaACCoefMap[uiPlane][uiScanIdx][uiB8Index] & CODED, Err::m_nOK );
MbDataAccess* pcMbDataAccessEL = 0;
MbDataAccess* pcMbDataAccessBL = 0;
RNOK( m_cMbDataCtrlEL .initMb( pcMbDataAccessEL, uiB8YIdx/2, uiB8XIdx/2 ) );
RNOK( m_pcCurrMbDataCtrl ->initMb( pcMbDataAccessBL, uiB8YIdx/2, uiB8XIdx/2 ) );
RNOK( m_pcSymbolReader->RQdecodeTCoeffRef_Chroma( *pcMbDataAccessEL, *pcMbDataAccessBL,
CHROMA_AC, cChromaIdx, uiScanIdx ) );
m_aapaucChromaACCoefMap[uiPlane][uiScanIdx][uiB8Index] |= CODED;
m_pauiMacroblockMap[uiMbIndex] += ( 1 << NUM_COEFF_SHIFT );
ROT( (m_pauiMacroblockMap[uiMbIndex]>>NUM_COEFF_SHIFT) > 384 );
return Err::m_nOK;
}
H264AVC_NAMESPACE_END
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -