📄 cabacreader.cpp
字号:
DTRACE_TY( "ae(v)" );
DTRACE_V( sMvdComponent );
DTRACE_T( " above " );
DTRACE_V( cMvA.getVer() );
DTRACE_T( " left " );
DTRACE_V( cMvB.getVer() );
DTRACE_N;
return Err::m_nOK;
}
ErrVal CabacReader::fieldFlag( MbDataAccess& rcMbDataAccess )
{
UInt uiSymbol;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cFieldFlagCCModel.get( 0, rcMbDataAccess.getCtxFieldFlag() ) ) );
rcMbDataAccess.setFieldMode( uiSymbol != 0 );
DTRACE_T( "FieldFlag:" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( uiSymbol );
DTRACE_N;
return Err::m_nOK;
}
ErrVal CabacReader::intraPredModeChroma( MbDataAccess& rcMbDataAccess )
{
UInt uiSymbol;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cChromaPredCCModel.get( 0, rcMbDataAccess.getCtxChromaPredMode() ) ) );
if( uiSymbol )
{
RNOKCABAC( CabaDecoder::getUnaryMaxSymbol( uiSymbol, m_cChromaPredCCModel.get( 0 ) + 3, 0, 2 ) );
uiSymbol++;
}
rcMbDataAccess.getMbData().setChromaPredMode( uiSymbol );
DTRACE_T( "IntraPredModeChroma" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( uiSymbol );
DTRACE_N;
return Err::m_nOK;
}
ErrVal CabacReader::intraPredModeLuma( MbDataAccess& rcMbDataAccess, LumaIdx cIdx )
{
UInt uiSymbol;
UInt uiIPredMode;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 0 ) ) );
if( ! uiSymbol )
{
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 1 ) ) );
uiIPredMode = uiSymbol;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 1 ) ) );
uiIPredMode |= (uiSymbol << 1);
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 1 ) ) );
rcMbDataAccess.getMbData().intraPredMode( cIdx ) = ( uiIPredMode | (uiSymbol << 2) );
}
else
{
rcMbDataAccess.getMbData().intraPredMode( cIdx ) = -1;
}
DTRACE_T( "IntraPredModeLuma" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( rcMbDataAccess.getMbData().intraPredMode( cIdx ) );
DTRACE_N;
return Err::m_nOK;
}
ErrVal CabacReader::cbp( MbDataAccess& rcMbDataAccess )
{
UInt uiCbp;
UInt uiBit;
UInt uiCtx = 0, a, b;
a = rcMbDataAccess.getLeftLumaCbp ( B4x4Idx( 0 ) );
b = rcMbDataAccess.getAboveLumaCbp( B4x4Idx( 0 ) ) << 1;
RNOKCABAC( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
uiCbp = uiBit;
a = uiCbp & 1;
b = rcMbDataAccess.getAboveLumaCbp( B4x4Idx( 2 ) ) << 1;
RNOKCABAC( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
uiCbp += uiBit << 1;
a = rcMbDataAccess.getLeftLumaCbp ( B4x4Idx( 8 ) );
b = (uiCbp << 1) & 2;
RNOKCABAC( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
uiCbp += uiBit << 2;
a = ( uiCbp >> 2 ) & 1;
b = uiCbp & 2;
RNOKCABAC( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
uiCbp += uiBit << 3;
uiCtx = 1;
UInt uiLeftChromaCbp = rcMbDataAccess.getLeftChromaCbp ();
UInt uiAboveChromaCbp = rcMbDataAccess.getAboveChromaCbp();
a = uiLeftChromaCbp > 0 ? 1 : 0;
b = uiAboveChromaCbp > 0 ? 2 : 0;
RNOKCABAC( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( uiCtx, a + b ) ) );
if( uiBit )
{
a = uiLeftChromaCbp > 1 ? 1 : 0;
b = uiAboveChromaCbp > 1 ? 2 : 0;
RNOKCABAC( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( ++uiCtx, a + b ) ) );
uiCbp += (1 == uiBit) ? 32 : 16;
}
if( !uiCbp )
{
m_uiLastDQpNonZero = 0; // no DeltaQP for Macroblocks with zero Cbp
}
AOF_DBG( 48 >= uiCbp );
DTRACE_T( "Cbp" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( uiCbp );
DTRACE_N;
rcMbDataAccess.getMbData().setMbCbp( uiCbp );
return Err::m_nOK;
}
ErrVal CabacReader::residualBlock( MbDataAccess& rcMbDataAccess,
LumaIdx cIdx,
ResidualMode eResidualMode,
UInt& ruiMbExtCbp )
{
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType() );
const UChar* pucScan = ( eResidualMode == LUMA_I16_DC ? ((bFrame) ? g_aucLumaFrameDCScan : g_aucLumaFieldDCScan) : ((bFrame) ? g_aucFrameScan : g_aucFieldScan) );
Bool bCoded;
DTRACE_T( "LUMA:" );
DTRACE_V( cIdx );
DTRACE_N;
DECRNOK( xReadBCbp( rcMbDataAccess, bCoded, eResidualMode, cIdx ) );
if( ! bCoded )
{
ruiMbExtCbp &= ~(1 << cIdx.b4x4() );
return Err::m_nOK;
}
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get( cIdx );
DECRNOK( xReadCoeff( piCoeff, eResidualMode, pucScan, bFrame ) );
return Err::m_nOK;
}
ErrVal CabacReader::residualBlock( MbDataAccess& rcMbDataAccess,
ChromaIdx cIdx,
ResidualMode eResidualMode
)
{
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType() );
const UChar* pucScan = ( eResidualMode == CHROMA_DC ? g_aucIndexChromaDCScan : ((bFrame) ? g_aucFrameScan : g_aucFieldScan) );
Bool bCoded;
DTRACE_T( eResidualMode == CHROMA_DC ? "CHROMA_DC:" : "CHROMA_AC:" );
DTRACE_V( cIdx );
DTRACE_N;
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get( cIdx );
DECRNOK( xReadBCbp( rcMbDataAccess, bCoded, eResidualMode, cIdx ) );
ROTRS( ! bCoded, Err::m_nOK );
DECRNOK( xReadCoeff( piCoeff, eResidualMode, pucScan, bFrame ) );
return Err::m_nOK;
}
ErrVal CabacReader::deltaQp( MbDataAccess& rcMbDataAccess )
{
UInt uiDQp;
Int iDQp = 0;
UInt uiCtx = m_uiLastDQpNonZero;
RNOKCABAC( CabaDecoder::getSymbol( uiDQp, m_cDeltaQpCCModel.get( 0, uiCtx ) ) );
m_uiLastDQpNonZero = uiDQp;
if( uiDQp )
{
RNOKCABAC( CabaDecoder::getUnarySymbol( uiDQp, &m_cDeltaQpCCModel.get( 0, 2 ), 1 ) );
iDQp = (uiDQp + 2) / 2;
if( uiDQp & 1 )
{
iDQp = -iDQp;
}
}
DTRACE_T( "DQp" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE ( iDQp );
DTRACE_N;
rcMbDataAccess.addDeltaQp( iDQp );
Quantizer::setQp( rcMbDataAccess, false );
return Err::m_nOK;
}
Bool CabacReader::isEndOfSlice()
{
UInt uiEOS;
CabaDecoder::getTerminateBufferBit( uiEOS );
DTRACE_T( "EOS" );
DTRACE_CODE( uiEOS );
DTRACE_N;
return (uiEOS == 1);
}
ErrVal CabacReader::xReadBCbp( MbDataAccess& rcMbDataAccess, Bool& rbCoded, ResidualMode eResidualMode, ChromaIdx cIdx )
{
UInt uiBitPos;
if( CHROMA_AC == eResidualMode )
{
uiBitPos = 16 + cIdx;
}
else if( CHROMA_DC == eResidualMode )
{
uiBitPos = 24 + cIdx.plane();
}
else
{
// full stop
AF();
return Err::m_nERR;
}
UInt uiCtx = rcMbDataAccess.getCtxCodedBlockBit( uiBitPos );
UInt uiBit;
RNOKCABAC( CabaDecoder::getSymbol( uiBit, m_cBCbpCCModel.get( type2ctx1[ eResidualMode ], uiCtx) ) );
rbCoded = ( uiBit == 1 );
rcMbDataAccess.getMbData().setBCBP( uiBitPos, uiBit);
return Err::m_nOK;
}
ErrVal CabacReader::xReadBCbp( MbDataAccess& rcMbDataAccess, Bool& rbCoded, ResidualMode eResidualMode, LumaIdx cIdx )
{
UInt uiBitPos;
if( LUMA_SCAN == eResidualMode || LUMA_I16_AC == eResidualMode )
{
uiBitPos = cIdx;
}
else if( LUMA_I16_DC == eResidualMode )
{
uiBitPos = 26;
}
else
{
// full stop
AF();
return Err::m_nERR;
}
UInt uiCtx = rcMbDataAccess.getCtxCodedBlockBit( uiBitPos );
UInt uiBit;
RNOKCABAC( CabaDecoder::getSymbol( uiBit, m_cBCbpCCModel.get( type2ctx1[ eResidualMode ], uiCtx) ) );
rbCoded = ( uiBit == 1 );
rcMbDataAccess.getMbData().setBCBP( uiBitPos, uiBit);
return Err::m_nOK;
}
ErrVal CabacReader::xReadCoeff( TCoeff* piCoeff,
ResidualMode eResidualMode,
const UChar* pucScan,
Bool bFrame )
{
CabacContextModel2DBuffer& rcMapCCModel = ( (bFrame) ? m_cMapCCModel : m_cFldMapCCModel );
CabacContextModel2DBuffer& rcLastCCModel = ( (bFrame) ? m_cLastCCModel : m_cFldLastCCModel );
UInt uiStart = 0;
UInt uiStop = 15;
if( CHROMA_AC == eResidualMode ||
LUMA_I16_AC == eResidualMode )
{
uiStart = 1;
}
if( CHROMA_DC == eResidualMode )
{
uiStop = 3;
}
UInt ui;
for( ui = uiStart; ui < uiStop; ui++ ) // if last coeff is reached, it has to be significant
{
UInt uiSig;
//--- read significance symbol ---
RNOKCABAC( CabaDecoder::getSymbol( uiSig, rcMapCCModel.get( type2ctx2[eResidualMode], ui ) ) );
if( uiSig )
{
piCoeff[pucScan[ui]] = uiSig;
UInt uiLast;
RNOKCABAC( CabaDecoder::getSymbol( uiLast, rcLastCCModel.get( type2ctx2[eResidualMode], ui ) ) );
if( uiLast )
{
break;
}
}
}
//--- last coefficient must be significant if no last symbol was received ---
if( ui == uiStop )
{
piCoeff[pucScan[ui]] = 1;
}
int c1 = 1;
int c2 = 0;
ui++;
while( (ui--) != uiStart )
{
UInt uiCoeff = piCoeff[pucScan[ui]];
if( uiCoeff )
{
UInt uiCtx = min (c1,4);
RNOKCABAC( CabaDecoder::getSymbol( uiCoeff, m_cOneCCModel.get( type2ctx1[eResidualMode], uiCtx ) ) );
if( 1 == uiCoeff )
{
uiCtx = min (c2,4);
RNOKCABAC( CabaDecoder::getExGolombLevel( uiCoeff, m_cAbsCCModel.get( type2ctx1[eResidualMode], uiCtx ) ) );
uiCoeff += 2;
c1=0;
c2++;
}
else if (c1)
{
uiCoeff++;
c1++;
}
else
{
uiCoeff++;
}
UInt uiSign;
RNOKCABAC( CabaDecoder::getEpSymbol( uiSign ) );
piCoeff[pucScan[ui]] = ( uiSign ? -(Int)uiCoeff : (Int)uiCoeff );
}
}
return Err::m_nOK;
}
ErrVal CabacReader::samplesPCM( MbDataAccess& rcMbDataAccess )
{
RNOK( CabaDecoder::finish() );
DTRACE_POS;
DTRACE_T( " PCM SAMPLES: " );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -