📄 cabacwriter.cpp
字号:
}
else
{
uiSymbol = ( uiBlockMode ? 1 : 0 );
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 0 ) ) );
if( uiSymbol )
{
uiSymbol = (3 > uiBlockMode) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 1 ) ) );
if( uiSymbol )
{
uiSymbol = (7 > uiBlockMode) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 2 ) ) );
if( uiSymbol )
{
uiBlockMode -= 7;
uiSymbol = ( uiBlockMode >> 2 ) & 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 3 ) ) );
if( ! uiSymbol )
{
uiSymbol = ( uiBlockMode >> 1 ) & 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 3 ) ) );
}
uiSymbol = uiBlockMode & 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 3 ) ) );
uiBlockMode += 7; // just for correct trace file
}
else
{
uiSymbol = (5 > uiBlockMode) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 3 ) ) );
uiSymbol = ( 1 == (1 & uiBlockMode) ) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 3 ) ) );
}
}
else
{
uiSymbol = (1 == uiBlockMode) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cBlockTypeCCModel.get( 1, 3 ) ) );
}
}
}
ETRACE_T( "BlockMode" );
ETRACE_TY( "ae(v)" );
ETRACE_CODE(uiBlockMode);
ETRACE_N;
return Err::m_nOK;
}
ErrVal CabacWriter::skipFlag( MbDataAccess& rcMbDataAccess, Bool bNotAllowed )
{
ROTRS( m_pcSliceHeader->isIntra(), Err::m_nOK );
UInt uiSymbol = bNotAllowed ? 0 : rcMbDataAccess.isSkippedMb() ? 1 : 0;
if( m_pcSliceHeader->isInterB() )
{
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 7 + rcMbDataAccess.getCtxDirectMbWoCoeff() ) ) );
rcMbDataAccess.getMbData().setSkipFlag(uiSymbol!=0);
}
else
{
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, rcMbDataAccess.getCtxMbSkipped() ) ) );
}
ROTRS( 0 == uiSymbol, Err::m_nOK );
m_uiLastDQpNonZero = 0; // no DeltaQP for Skipped Macroblock
ETRACE_T( "MbMode" );
ETRACE_TY( "ae(v)" );
ETRACE_CODE( 0 );
ETRACE_N;
return Err::m_nOK;
}
ErrVal CabacWriter::BLSkipFlag( MbDataAccess& rcMbDataAccess )
{
UInt uiSymbol = rcMbDataAccess.getMbData().getBLSkipFlag() ? 1 : 0;
UInt uiCtx = rcMbDataAccess.getCtxBLSkipFlag();
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cBLSkipCCModel.get( 0, uiCtx ) ) );
ETRACE_T( "BLSkipFlag" );
ETRACE_TY( "ae(v)" );
ETRACE_CODE( uiSymbol );
ETRACE_N;
return Err::m_nOK;
}
#if JMVM_ONLY // JVT-W081
ErrVal CabacWriter::MotionSkipFlag( MbDataAccess& rcMbDataAccess )
{
UInt uiSymbol = rcMbDataAccess.getMbData().getMotionSkipFlag() ? 1 : 0;
UInt uiCtx = rcMbDataAccess.getCtxMotionSkipFlag();
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMotionSkipCCModel.get( 0, uiCtx ) ) );
ETRACE_T( "MotionSkipFlag" );
ETRACE_TY( "ae(v)" );
ETRACE_CODE( uiSymbol );
ETRACE_N;
return Err::m_nOK;
}
#endif // JVT-W081
#if JMVM_ONLY //JVT-Z021
ErrVal CabacWriter::MotionSkipOffset( MbDataAccess& rcMbDataAccess )
{
ListIdx eListIdx;
Mv cMv = rcMbDataAccess.getMbData().m_pcMbImsm->m_cOffset;
eListIdx = (rcMbDataAccess.getMbData().m_pcMbImsm->m_iListXFlag == (Int)LIST_0) ? LIST_0 : LIST_1;
RNOK( xWriteOffset( rcMbDataAccess, cMv, eListIdx ) );
return Err::m_nOK;
}
ErrVal CabacWriter::xWriteOffset( 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();
RNOK( xWriteOffsetComponent( sHor, cMvA.getAbsHor() + cMvB.getAbsHor(), 0 ) );
ETRACE_T( "Offset: x" );
ETRACE_TY( "ae(v)" );
ETRACE_V( sHor );
ETRACE_T( " above " );
ETRACE_V( cMvA.getHor() );
ETRACE_T( " left " );
ETRACE_V( cMvB.getHor() );
ETRACE_N;
RNOK( xWriteOffsetComponent( sVer, cMvA.getAbsVer() + cMvB.getAbsVer(), 5 ) );
ETRACE_T( "Offset: y" );
ETRACE_TY( "ae(v)" );
ETRACE_V( sVer );
ETRACE_T( " above " );
ETRACE_V( cMvA.getVer() );
ETRACE_T( " left " );
ETRACE_V( cMvB.getVer() );
ETRACE_N;
return Err::m_nOK;
}
ErrVal CabacWriter::xWriteOffsetComponent( Short sOffsetComp, UInt uiAbsSum, UInt uiCtx )
{
//--- set context ---
UInt uiLocalCtx = uiCtx;
if(uiAbsSum >= 3)
{
uiLocalCtx += ( uiAbsSum > 5) ? 3 : 2;
}
//--- first symbol: if non-zero ---
UInt uiSymbol = ( 0 == sOffsetComp) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cOffsetCCModel.get( 0, uiLocalCtx ) ) );
ROTRS( 0 == uiSymbol, Err::m_nOK );
//--- absolute value and sign
UInt uiSign = 0;
if( 0 > sOffsetComp )
{
uiSign = 1;
sOffsetComp = -sOffsetComp;
}
RNOK(CabaEncoder::writeMSuOffset(sOffsetComp-1,&m_cOffsetCCModel.get(1,uiCtx), 0, 3));
RNOK( CabaEncoder::writeEPSymbol( uiSign ) );
return Err::m_nOK;
}
ErrVal CabacWriter::MotionSkipListXFlag( MbDataAccess& rcMbDataAccess )
{
UInt uiSymbol;
if(rcMbDataAccess.getMbData().m_pcMbImsm->m_iListXFlag>=0)
{
uiSymbol = rcMbDataAccess.getMbData().m_pcMbImsm->m_iListXFlag
^ rcMbDataAccess.getMbDataLeft().m_pcMbImsm->m_iListXFlag;
}
else
printf("\n error cabac");
UInt uiCtx = rcMbDataAccess.getCtxMotionSkipListXFlag();
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMotionSkipListXFlagCCModel.get( 0, uiCtx ) ) );
ETRACE_T( "MotionSkipListXFlag" );
ETRACE_TY( "ae(v)" );
ETRACE_CODE( uiSymbol );
ETRACE_N;
return Err::m_nOK;
}
#endif //JVT-Z021
ErrVal CabacWriter::resPredFlag( MbDataAccess& rcMbDataAccess )
{
UInt uiSymbol = ( rcMbDataAccess.getMbData().getResidualPredFlag( PART_16x16 ) ? 1 : 0 );
UInt uiCtx = ( rcMbDataAccess.getMbData().getBLSkipFlag() ? 0 : 1 );
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cResPredFlagCCModel.get( 0, uiCtx ) ) );
ETRACE_T( "ResidualPredFlag " );
ETRACE_TY( "ae(v)" );
ETRACE_CODE( uiSymbol );
ETRACE_N;
return Err::m_nOK;
}
ErrVal CabacWriter::resPredFlag_FGS( MbDataAccess& rcMbDataAccess, Bool bBaseCoeff )
{
UInt uiSymbol = ( rcMbDataAccess.getMbData().getResidualPredFlag( PART_16x16 ) ? 1 : 0 );
UInt uiCtx = ( bBaseCoeff ? 2 : 3 );
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cResPredFlagCCModel.get( 0, uiCtx ) ) );
ETRACE_T( "ResidualPredFlag " );
ETRACE_TY( "ae(v)" );
ETRACE_CODE( uiSymbol );
ETRACE_N;
return Err::m_nOK;
}
//-- JVT-R091
ErrVal CabacWriter::smoothedRefFlag( MbDataAccess& rcMbDataAccess )
{
UInt uiSymbol = ( rcMbDataAccess.getMbData().getSmoothedRefFlag() ? 1 : 0 );
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cSRFlagCCModel.get( 0, 0 ) ) );
ETRACE_T( "SRFlag:" );
ETRACE_TY( "ae(v)" );
ETRACE_CODE( uiSymbol );
ETRACE_N;
return Err::m_nOK;
}
//--
ErrVal CabacWriter::mbMode( MbDataAccess& rcMbDataAccess )
{
UInt uiMbMode = rcMbDataAccess.getConvertMbType();
ETRACE_DECLARE( UInt uiOrigMbMode = uiMbMode );
if( m_pcSliceHeader->isIntra() )
{
UInt uiSymbol;
uiSymbol = ( 0 == uiMbMode) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 0, rcMbDataAccess.getCtxMbIntra4x4() ) ) );
if( uiSymbol )
{
uiSymbol = ( 25 == uiMbMode) ? 1 : 0;
RNOK( CabaEncoder::writeTerminatingBit( uiSymbol ) );
if( ! uiSymbol )
{
uiSymbol = ( 13 > uiMbMode) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 0, 4 ) ) );
uiMbMode -= 12* uiSymbol + 1;
uiSymbol = ( 4 > uiMbMode) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 0, 5 ) ) );
if( uiSymbol )
{
uiSymbol = ( 8 > uiMbMode) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 0, 6 ) ) );
}
uiSymbol = (uiMbMode>>1) & 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 0, 7 ) ) );
uiSymbol = uiMbMode & 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 0, 8 ) ) );
}
}
}
else
{
UInt uiSymbol, uiIntra16x16Symbol = 0;
if( ! m_pcSliceHeader->isInterB() )
{
uiSymbol = ( 6 > uiMbMode) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 4 ) ) );
if( uiSymbol )
{
uiSymbol = ( 6 == uiMbMode) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 7 ) ) );
if( uiSymbol )
{
uiIntra16x16Symbol = uiMbMode - 6;
}
}
else
{
uiSymbol = (uiMbMode>>1) & 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 5 ) ) );
if( uiSymbol )
{
uiSymbol = 1-(uiMbMode&1);
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 7 ) ) );
}
else
{
uiSymbol = 1-(uiMbMode&1);
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 6 ) ) );
}
}
}
else
{
ROFRS( uiMbMode, Err::m_nERR );
uiMbMode--;
uiSymbol = ( uiMbMode ? 1 : 0 );
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, rcMbDataAccess.getCtxMbType() ) ) );
if( uiSymbol )
{
uiSymbol = ( 3 > uiMbMode) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 4 ) ) );
if( uiSymbol )
{
uiSymbol = ( 11 > uiMbMode) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 5 ) ) );
if( uiSymbol )
{
if( ( uiSymbol = ( 22 == uiMbMode ) ) || 11 == uiMbMode )
{
RNOK( CabaEncoder::writeSymbol( 1, m_cMbTypeCCModel.get( 2, 6 ) ) );
RNOK( CabaEncoder::writeSymbol( 1, m_cMbTypeCCModel.get( 2, 6 ) ) );
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
}
else
{
if( uiMbMode < 23 )
{
uiMbMode -= 12;
}
else if( uiMbMode < 24 )
{
uiMbMode -= 13;
}
else
{
uiIntra16x16Symbol = uiMbMode - 23;
uiMbMode = 11;
}
uiSymbol = (uiMbMode>>3) & 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
uiSymbol = (uiMbMode>>2) & 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
uiSymbol = (uiMbMode>>1) & 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
uiSymbol = uiMbMode & 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
}
}
else
{
uiMbMode -= 3;
uiSymbol = (uiMbMode>>2) & 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
uiSymbol = (uiMbMode>>1) & 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
uiSymbol = uiMbMode & 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
}
}
else
{
uiSymbol = uiMbMode >> 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 2, 6 ) ) );
}
}
}
if( uiIntra16x16Symbol )
{
uiSymbol = ( 25 == uiIntra16x16Symbol) ? 1 : 0;
RNOK( CabaEncoder::writeTerminatingBit( uiSymbol ) );
if( ! uiSymbol )
{
uiSymbol = ( uiIntra16x16Symbol < 13 ? 0 : 1 );
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 8 ) ) );
uiIntra16x16Symbol -= ( 12 * uiSymbol + 1 );
uiSymbol = ( 4 > uiIntra16x16Symbol) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 9 ) ) );
if( uiSymbol )
{
uiSymbol = ( 8 > uiIntra16x16Symbol) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 9 ) ) );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -