📄 cabacwriter.cpp
字号:
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::fieldFlag( MbDataAccess& rcMbDataAccess )
{
UInt uiSymbol = rcMbDataAccess.getMbData().getFieldFlag() ? 1 : 0;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cFieldFlagCCModel.get( 0, rcMbDataAccess.getCtxFieldFlag() ) ) );
ETRACE_T( "FieldFlag:" );
ETRACE_TY( "ae(v)" );
ETRACE_CODE( rcMbDataAccess.getMbData().getFieldFlag() );
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.getCtxMbSkipped() ) ) );
}
else
{
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, rcMbDataAccess.getCtxMbSkipped() ) ) );
}
rcMbDataAccess.getMbData().setSkipFlag(uiSymbol!=0);
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;
}
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 ) ) );
}
uiSymbol = (uiIntra16x16Symbol>>1) & 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 10 ) ) );
uiSymbol = uiIntra16x16Symbol & 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMbTypeCCModel.get( 1, 10 ) ) );
}
}
}
ETRACE_T( "MbMode" );
ETRACE_TY( "ae(v)" );
ETRACE_CODE( uiOrigMbMode );
ETRACE_N;
return Err::m_nOK;
}
ErrVal CabacWriter::xWriteMvdComponent( Short sMvdComp, UInt uiAbsSum, UInt uiCtx )
{
//--- set context ---
UInt uiLocalCtx = uiCtx;
if( uiAbsSum >= 3)
{
uiLocalCtx += ( uiAbsSum > 32) ? 3 : 2;
}
//--- first symbol: if non-zero ---
UInt uiSymbol = ( 0 == sMvdComp) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cMvdCCModel.get( 0, uiLocalCtx ) ) );
ROTRS( 0 == uiSymbol, Err::m_nOK );
//--- absolute value and sign
UInt uiSign = 0;
if( 0 > sMvdComp )
{
uiSign = 1;
sMvdComp = -sMvdComp;
}
RNOK( CabaEncoder::writeExGolombMvd( sMvdComp-1, &m_cMvdCCModel.get( 1, uiCtx ), 3 ) );
RNOK( CabaEncoder::writeEPSymbol( uiSign ) );
return Err::m_nOK;
}
ErrVal CabacWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx )
{
Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv();
RNOK( xWriteMvd( rcMbDataAccess, cMv, B4x4Idx(0), eLstIdx ) );
return Err::m_nOK;
}
ErrVal CabacWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx16x8 eParIdx )
{
Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv( eParIdx );
RNOK( xWriteMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx), eLstIdx ) );
return Err::m_nOK;
}
ErrVal CabacWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x16 eParIdx )
{
Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv( eParIdx );
RNOK( xWriteMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx), eLstIdx ) );
return Err::m_nOK;
}
ErrVal CabacWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx )
{
Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv( eParIdx );
RNOK( xWriteMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx), eLstIdx ) );
return Err::m_nOK;
}
ErrVal CabacWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx, SParIdx8x4 eSParIdx )
{
Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv( eParIdx, eSParIdx );
RNOK( xWriteMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx+eSParIdx), eLstIdx ) );
return Err::m_nOK;
}
ErrVal CabacWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx, SParIdx4x8 eSParIdx )
{
Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv( eParIdx, eSParIdx );
RNOK( xWriteMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx+eSParIdx), eLstIdx ) );
return Err::m_nOK;
}
ErrVal CabacWriter::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx, SParIdx4x4 eSParIdx )
{
Mv cMv = rcMbDataAccess.getMbMvdData( eLstIdx ).getMv( eParIdx, eSParIdx );
RNOK( xWriteMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx+eSParIdx), eLstIdx ) );
return Err::m_nOK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -