📄 cabacreader.cpp
字号:
DTRACE_T( "BLSkipFlag" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( uiSymbol );
DTRACE_N;
rcMbDataAccess.getMbData().setBLSkipFlag( ( uiSymbol != 0 ) );
return rcMbDataAccess.getMbData().getBLSkipFlag();
}
ErrVal CabacReader::resPredFlag( MbDataAccess& rcMbDataAccess )
{
UInt uiSymbol;
UInt uiCtx = ( rcMbDataAccess.getMbData().getBLSkipFlag() ? 0 : 1 );
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cResPredFlagCCModel.get( 0, uiCtx ) ) );
rcMbDataAccess.getMbData().setResidualPredFlag( (uiSymbol!=0) );
DTRACE_T( "ResidualPredFlag" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( uiSymbol );
DTRACE_N;
return Err::m_nOK;
}
ErrVal CabacReader::mbMode( MbDataAccess& rcMbDataAccess )
{
rcMbDataAccess.getMbData().setBCBPAll( 0 );
UInt uiMbMode;
UInt act_sym;
UInt mod_sym;
if( rcMbDataAccess.getSH().isIntraSlice() )
{
RNOK( CabaDecoder::getSymbol( act_sym, m_cMbTypeCCModel.get( 0, rcMbDataAccess.getCtxMbIntra4x4() ) ) );
if( 0 != act_sym )
{
RNOK( CabaDecoder::getTerminateBufferBit( act_sym ) )
if( 0 != act_sym )
{
act_sym = 25;
}
else
{
RNOK( CabaDecoder::getSymbol( act_sym, m_cMbTypeCCModel.get( 0, 4 ) ) );
act_sym = 12* act_sym + 1;
RNOK( CabaDecoder::getSymbol( mod_sym, m_cMbTypeCCModel.get( 0, 5 ) ) );
if( 0 != mod_sym )
{
RNOK( CabaDecoder::getSymbol( mod_sym, m_cMbTypeCCModel.get( 0, 6 ) ) );
act_sym += ++mod_sym << 2;
}
RNOK( CabaDecoder::getSymbol( mod_sym, m_cMbTypeCCModel.get( 0, 7 ) ) );
act_sym += mod_sym << 1;
RNOK( CabaDecoder::getSymbol( mod_sym, m_cMbTypeCCModel.get( 0, 8 ) ) );
act_sym += mod_sym;
}
}
uiMbMode = act_sym;
}
else
{
uiMbMode = 0;
UInt uiSymbol;
if( ! rcMbDataAccess.getSH().isBSlice() )
{
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 4 ) ) );
if( 0 != uiSymbol )
{
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 7 ) ) );
uiMbMode = ( 0 != uiSymbol ) ? 7 : 6;
}
else
{
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 5 ) ) );
if( 0 != uiSymbol )
{
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 7 ) ) );
uiMbMode = ( 0 != uiSymbol ) ? 2 : 3;
}
else
{
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 6 ) ) );
uiMbMode = ( 0 != uiSymbol ) ? 4 : 1;
}
}
}
else
{
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, rcMbDataAccess.getCtxMbType() ) ) );
if( 0 != uiSymbol )
{
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 4 ) ) );
if( 0 != uiSymbol )
{
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 5 ) ) );
if( 0 != uiSymbol )
{
uiMbMode = 12;
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
uiMbMode += uiSymbol << 3;
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
uiMbMode += uiSymbol << 2;
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
uiMbMode += uiSymbol << 1;
if( 24 == uiMbMode)
{
uiMbMode = 11;
}
else
{
if( 26 == uiMbMode)
{
uiMbMode = 22;
}
else
{
if( 22 == uiMbMode)
{
uiMbMode = 23;
}
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
uiMbMode += uiSymbol;
}
}
}
else
{
uiMbMode = 3;
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
uiMbMode += uiSymbol << 2;
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
uiMbMode += uiSymbol << 1;
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
uiMbMode += uiSymbol;
}
}
else
{
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
uiMbMode = ( 0 != uiSymbol ) ? 2 : 1;
}
}
}
if( ! ( uiMbMode <= 6 || (rcMbDataAccess.getSH().isBSlice() && uiMbMode <= 23) ) )
{
RNOK( CabaDecoder::getTerminateBufferBit( uiSymbol ) )
if( 0 != uiSymbol )
{
uiMbMode += ( rcMbDataAccess.getSH().isBSlice() ) ? 22 : 24;
}
else
{
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 8 ) ) );
uiMbMode += ( 0 != uiSymbol ) ? 12 : 0;
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 9 ) ) );
if( 0 != uiSymbol )
{
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 9 ) ) );
uiMbMode += ( 0 != uiSymbol ) ? 8 : 4;
}
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 10 ) ) );
uiMbMode += uiSymbol << 1;
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 10 ) ) );
uiMbMode += uiSymbol;
}
}
if( ! rcMbDataAccess.getSH().isBSlice() )
{
uiMbMode--;
}
}
rcMbDataAccess.setConvertMbType( uiMbMode );
DTRACE_T( "MbMode" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( ( ! rcMbDataAccess.getSH().isIntraSlice()) ? uiMbMode+1:uiMbMode );
DTRACE_N;
return Err::m_nOK;
}
ErrVal CabacReader::xGetMvdComponent( Short& rsMvdComp, UInt uiAbsSum, UInt uiCtx )
{
UInt uiLocalCtx = uiCtx;
if( uiAbsSum >= 3)
{
uiLocalCtx += ( uiAbsSum > 32) ? 3 : 2;
}
rsMvdComp = 0;
UInt uiSymbol;
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cMvdCCModel.get( 0, uiLocalCtx ) ) );
ROTRS( 0 == uiSymbol, Err::m_nOK )
RNOK( CabaDecoder::getExGolombMvd( uiSymbol, &m_cMvdCCModel.get( 1, uiCtx ), 3 ) );
uiSymbol++;
UInt uiSign;
RNOK( CabaDecoder::getEpSymbol( uiSign ) );
rsMvdComp = ( 0 != uiSign ) ? -(Int)uiSymbol : (Int)uiSymbol;
return Err::m_nOK;
}
ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx )
{
Mv cMv;
DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(0), eLstIdx ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv );
return Err::m_nOK;
}
ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx16x8 eParIdx )
{
Mv cMv;
DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx), eLstIdx ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx );
return Err::m_nOK;
}
ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x16 eParIdx )
{
Mv cMv;
DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx), eLstIdx ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx );
return Err::m_nOK;
}
ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx )
{
Mv cMv;
DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx), eLstIdx ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx );
return Err::m_nOK;
}
ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx, SParIdx8x4 eSParIdx )
{
Mv cMv;
DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx+eSParIdx), eLstIdx ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx, eSParIdx );
return Err::m_nOK;
}
ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx, SParIdx4x8 eSParIdx )
{
Mv cMv;
DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx+eSParIdx), eLstIdx ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx, eSParIdx );
return Err::m_nOK;
}
ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx, SParIdx4x4 eSParIdx )
{
Mv cMv;
DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx+eSParIdx), eLstIdx ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx, eSParIdx );
return Err::m_nOK;
}
ErrVal CabacReader::xGetMvd( MbDataAccess& rcMbDataAccess, Mv& rcMv, LumaIdx cIdx, ListIdx eLstIdx )
{
Mv cMvA;
Mv cMvB;
Short sMvdComponent;
rcMbDataAccess.getMvdAbove( cMvA, eLstIdx, cIdx );
rcMbDataAccess.getMvdLeft ( cMvB, eLstIdx, cIdx );
DECRNOK( xGetMvdComponent( sMvdComponent, cMvA.getAbsHor() + cMvB.getAbsHor(), 0 ) );
rcMv.setHor( sMvdComponent );
DTRACE_T( "Mvd: x" );
DTRACE_TY( "ae(v)" );
DTRACE_V( sMvdComponent );
DTRACE_T( " above " );
DTRACE_V( cMvA.getHor() );
DTRACE_T( " left " );
DTRACE_V( cMvB.getHor() );
DTRACE_N;
DECRNOK( xGetMvdComponent( sMvdComponent, cMvA.getAbsVer() + cMvB.getAbsVer(), 5 ) );
rcMv.setVer( sMvdComponent );
DTRACE_T( "Mvd: y" );
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;
RNOK( 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;
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cChromaPredCCModel.get( 0, rcMbDataAccess.getCtxChromaPredMode() ) ) );
if( uiSymbol )
{
RNOK( 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;
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 0 ) ) );
if( ! uiSymbol )
{
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 1 ) ) );
uiIPredMode = uiSymbol;
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 1 ) ) );
uiIPredMode |= (uiSymbol << 1);
RNOK( 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 uiStart, UInt uiStop )
{
UInt uiCbp;
UInt uiBit;
UInt uiCtx = 0, a, b;
a = rcMbDataAccess.getLeftLumaCbp ( B4x4Idx( 0 ), 0, 16 );
b = rcMbDataAccess.getAboveLumaCbp( B4x4Idx( 0 ), 0, 16 ) << 1;
RNOK( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
uiCbp = uiBit;
a = uiCbp & 1;
b = rcMbDataAccess.getAboveLumaCbp( B4x4Idx( 2 ), 0, 16 ) << 1;
RNOK( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
uiCbp += uiBit << 1;
a = rcMbDataAccess.getLeftLumaCbp ( B4x4Idx( 8 ), 0, 16 );
b = (uiCbp << 1) & 2;
RNOK( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
uiCbp += uiBit << 2;
a = ( uiCbp >> 2 ) & 1;
b = uiCbp & 2;
RNOK( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
uiCbp += uiBit << 3;
uiCtx = 1;
UInt uiLeftChromaCbp = rcMbDataAccess.getLeftChromaCbp ( 0, 16 );
UInt uiAboveChromaCbp = rcMbDataAccess.getAboveChromaCbp( 0, 16 );
a = uiLeftChromaCbp > 0 ? 1 : 0;
b = uiAboveChromaCbp > 0 ? 2 : 0;
RNOK( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( uiCtx, a + b ) ) );
if( uiBit )
{
a = uiLeftChromaCbp > 1 ? 1 : 0;
b = uiAboveChromaCbp > 1 ? 2 : 0;
RNOK( 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,
UInt uiStart,
UInt uiStop )
{
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType() );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -