📄 cabacreader.cpp
字号:
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 3 ) ) );
if( 0 != uiSymbol )
{
uiBlockMode = 10;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 3 ) ) );
uiBlockMode += uiSymbol;
}
else
{
uiBlockMode = 6;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 3 ) ) );
uiBlockMode += uiSymbol << 1;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 3 ) ) );
uiBlockMode += uiSymbol;
}
}
else
{
uiBlockMode = 2;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 3 ) ) );
uiBlockMode += uiSymbol << 1;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 3 ) ) );
uiBlockMode += uiSymbol;
}
}
else
{
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 3 ) ) );
uiBlockMode = uiSymbol;
}
uiBlockMode++;
}
}
DTRACE_T( "BlockMode" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE(uiBlockMode);
DTRACE_N;
rcMbDataAccess.setConvertBlkMode( c8x8Idx.b8x8Index(), uiBlockMode );
}
return Err::m_nOK;
}
#if JMVM_ONLY //JVT-Z021
ErrVal CabacReader::MotionSkipOffset( MbDataAccess& rcMbDataAccess )
{
ListIdx eListIdx;
eListIdx = (rcMbDataAccess.getMbData().m_pcMbImsm->m_iListXFlag == (Int)LIST_0) ? LIST_0 : LIST_1;
Mv cMv;
DECRNOK( xReadOffset( rcMbDataAccess, cMv, eListIdx ) );
rcMbDataAccess.getMbData().m_pcMbImsm->m_cOffset = cMv;
return Err::m_nOK;
}
ErrVal CabacReader::xReadOffset( MbDataAccess& rcMbDataAccess, Mv& cMv, ListIdx eLstIdx )
{
Mv cMvA;
Mv cMvB;
rcMbDataAccess.getOffsetAbove( cMvA, eLstIdx );
rcMbDataAccess.getOffsetLeft ( cMvB, eLstIdx );
Short sHor = cMv.getHor();
Short sVer = cMv.getVer();
DECRNOK( xReadOffsetComponent( sHor, cMvA.getAbsHor() + cMvB.getAbsHor(), 0 ) );
cMv.setHor(sHor);
DTRACE_T( "Offset: x" );
DTRACE_TY( "ae(v)" );
DTRACE_V( sHor );
DTRACE_T( " above " );
DTRACE_V( cMvA.getHor() );
DTRACE_T( " left " );
DTRACE_V( cMvB.getHor() );
DTRACE_N;
DECRNOK( xReadOffsetComponent( sVer, cMvA.getAbsVer() + cMvB.getAbsVer(), 5 ) );
cMv.setVer(sVer);
DTRACE_T( "Offset: y" );
DTRACE_TY( "ae(v)" );
DTRACE_V( sVer );
DTRACE_T( " above " );
DTRACE_V( cMvA.getVer() );
DTRACE_T( " left " );
DTRACE_V( cMvB.getVer() );
DTRACE_N;
return Err::m_nOK;
}
ErrVal CabacReader::xReadOffsetComponent( Short& rsOffsetComp, UInt uiAbsSum, UInt uiCtx )
{
UInt uiLocalCtx = uiCtx;
if(uiAbsSum >= 3)
{
uiLocalCtx += ( uiAbsSum > 5) ? 3 : 2;
}
rsOffsetComp = 0;
UInt uiSymbol;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cOffsetCCModel.get( 0, uiLocalCtx ) ) );
ROTRS( 0 == uiSymbol, Err::m_nOK );
RNOKCABAC(CabaDecoder::getMSuOffset(uiSymbol,&m_cOffsetCCModel.get(1,uiCtx),0, 3));
uiSymbol++;
UInt uiSign;
RNOKCABAC( CabaDecoder::getEpSymbol( uiSign ) );
rsOffsetComp = ( 0 != uiSign ) ? -(Int)uiSymbol : (Int)uiSymbol;
return Err::m_nOK;
}
ErrVal CabacReader::MotionSkipListXFlag( MbDataAccess& rcMbDataAccess )
{
UInt uiSymbol = 0;
UInt uiCtx = rcMbDataAccess.getCtxMotionSkipListXFlag();
CabaDecoder::getSymbol( uiSymbol, m_cMotionSkipListXFlagCCModel.get( 0, uiCtx ) );
uiSymbol ^= rcMbDataAccess.getMbDataLeft().m_pcMbImsm->m_iListXFlag;
DTRACE_T( "MotionSkipListXFlag" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( uiSymbol );
DTRACE_N;
rcMbDataAccess.getMbData().m_pcMbImsm->m_iListXFlag = uiSymbol;
return Err::m_nOK;
}
#endif //JVT-Z021
Bool CabacReader::isMbSkipped( MbDataAccess& rcMbDataAccess )
{
ROTRS( rcMbDataAccess.getSH().isIntra(), false );
UInt uiSymbol;
if( rcMbDataAccess.getSH().isInterB() )
{
CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 7 + rcMbDataAccess.getCtxDirectMbWoCoeff() ) );
rcMbDataAccess.getMbData().setSkipFlag(0!=uiSymbol);
}
else
{
CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, rcMbDataAccess.getCtxMbSkipped() ) );
}
ROTRS( 0 == uiSymbol, false );
m_uiLastDQpNonZero = 0; // no DeltaQP for Skipped Macroblock
DTRACE_T( "MbMode" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( 0 );
DTRACE_N;
return true;
}
Bool CabacReader::isBLSkipped( MbDataAccess& rcMbDataAccess )
{
UInt uiSymbol = 0;
UInt uiCtx = rcMbDataAccess.getCtxBLSkipFlag();
CabaDecoder::getSymbol( uiSymbol, m_cBLSkipCCModel.get( 0, uiCtx ) );
DTRACE_T( "BLSkipFlag" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( uiSymbol );
DTRACE_N;
rcMbDataAccess.getMbData().setBLSkipFlag( ( uiSymbol != 0 ) );
return rcMbDataAccess.getMbData().getBLSkipFlag();
}
#if JMVM_ONLY // JVT-W081
Bool CabacReader::isMotionSkipped( MbDataAccess& rcMbDataAccess )
{
UInt uiSymbol = 0;
UInt uiCtx = rcMbDataAccess.getCtxMotionSkipFlag();
CabaDecoder::getSymbol( uiSymbol, m_cMotionSkipCCModel.get( 0, uiCtx ) );
DTRACE_T( "MotionSKipFlag" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( uiSymbol );
DTRACE_N;
rcMbDataAccess.getMbData().setMotionSkipFlag(( uiSymbol != 0 ) );
return rcMbDataAccess.getMbData().getMotionSkipFlag();
}
#endif // JVT-W081
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::resPredFlag_FGS( MbDataAccess& rcMbDataAccess, Bool bBaseCoeff )
{
UInt uiSymbol;
UInt uiCtx = ( bBaseCoeff ? 2 : 3 );
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;
}
//-- JVT-R091
ErrVal CabacReader::smoothedRefFlag( MbDataAccess& rcMbDataAccess )
{
UInt uiSymbol;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cSRFlagCCModel.get( 0, 0 ) ) );
rcMbDataAccess.getMbData().setSmoothedRefFlag( (uiSymbol!=0) );
DTRACE_T( "SmoothedRefFlag:" );
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().isIntra() )
{
RNOKCABAC( CabaDecoder::getSymbol( act_sym, m_cMbTypeCCModel.get( 0, rcMbDataAccess.getCtxMbIntra4x4() ) ) );
if( 0 != act_sym )
{
RNOKCABAC( CabaDecoder::getTerminateBufferBit( act_sym ) )
if( 0 != act_sym )
{
act_sym = 25;
}
else
{
RNOKCABAC( CabaDecoder::getSymbol( act_sym, m_cMbTypeCCModel.get( 0, 4 ) ) );
act_sym = 12* act_sym + 1;
RNOKCABAC( CabaDecoder::getSymbol( mod_sym, m_cMbTypeCCModel.get( 0, 5 ) ) );
if( 0 != mod_sym )
{
RNOKCABAC( CabaDecoder::getSymbol( mod_sym, m_cMbTypeCCModel.get( 0, 6 ) ) );
act_sym += ++mod_sym << 2;
}
RNOKCABAC( CabaDecoder::getSymbol( mod_sym, m_cMbTypeCCModel.get( 0, 7 ) ) );
act_sym += mod_sym << 1;
RNOKCABAC( CabaDecoder::getSymbol( mod_sym, m_cMbTypeCCModel.get( 0, 8 ) ) );
act_sym += mod_sym;
}
}
uiMbMode = act_sym;
}
else
{
uiMbMode = 0;
UInt uiSymbol;
if( ! rcMbDataAccess.getSH().isInterB() )
{
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 4 ) ) );
if( 0 != uiSymbol )
{
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 7 ) ) );
uiMbMode = ( 0 != uiSymbol ) ? 7 : 6;
}
else
{
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 5 ) ) );
if( 0 != uiSymbol )
{
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 7 ) ) );
uiMbMode = ( 0 != uiSymbol ) ? 2 : 3;
}
else
{
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 6 ) ) );
uiMbMode = ( 0 != uiSymbol ) ? 4 : 1;
}
}
}
else
{
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, rcMbDataAccess.getCtxMbType() ) ) );
if( 0 != uiSymbol )
{
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 4 ) ) );
if( 0 != uiSymbol )
{
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 5 ) ) );
if( 0 != uiSymbol )
{
uiMbMode = 12;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
uiMbMode += uiSymbol << 3;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
uiMbMode += uiSymbol << 2;
RNOKCABAC( 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;
}
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
uiMbMode += uiSymbol;
}
}
}
else
{
uiMbMode = 3;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
uiMbMode += uiSymbol << 2;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
uiMbMode += uiSymbol << 1;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
uiMbMode += uiSymbol;
}
}
else
{
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
uiMbMode = ( 0 != uiSymbol ) ? 2 : 1;
}
}
}
if( ! ( uiMbMode <= 6 || (rcMbDataAccess.getSH().isInterB() && uiMbMode <= 23) ) )
{
RNOKCABAC( CabaDecoder::getTerminateBufferBit( uiSymbol ) )
if( 0 != uiSymbol )
{
uiMbMode += ( rcMbDataAccess.getSH().isInterB() ) ? 22 : 24;
}
else
{
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 8 ) ) );
uiMbMode += ( 0 != uiSymbol ) ? 12 : 0;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 9 ) ) );
if( 0 != uiSymbol )
{
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 9 ) ) );
uiMbMode += ( 0 != uiSymbol ) ? 8 : 4;
}
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 10 ) ) );
uiMbMode += uiSymbol << 1;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 10 ) ) );
uiMbMode += uiSymbol;
}
}
if( ! rcMbDataAccess.getSH().isInterB() )
{
uiMbMode--;
}
}
rcMbDataAccess.setConvertMbType( uiMbMode );
DTRACE_T( "MbMode" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( ( ! rcMbDataAccess.getSH().isIntra()) ? 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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -