📄 cabacwriter.cpp
字号:
ETRACE_N;
return Err::m_nOK;
}
ErrVal CabacWriter::blockModes( MbDataAccess& rcMbDataAccess )
{
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
RNOK( xWriteBlockMode( rcMbDataAccess.getConvertBlkMode( c8x8Idx.b8x8Index() ) ) )
}
return Err::m_nOK;
}
ErrVal CabacWriter::xWriteBlockMode( UInt uiBlockMode )
{
UInt uiSymbol;
if( ! m_pcSliceHeader->isBSlice() )
{
uiSymbol = (0 == uiBlockMode) ? 1 : 0;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cBlockTypeCCModel.get( 0, 1 ) ) );
if( !uiSymbol )
{
uiSymbol = (1 == uiBlockMode) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cBlockTypeCCModel.get( 0, 3 ) ) );
if( uiSymbol )
{
uiSymbol = (2 == uiBlockMode) ? 1:0;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cBlockTypeCCModel.get( 0, 4 ) ) );
}
}
}
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::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->isIntraSlice(), Err::m_nOK );
UInt uiSymbol = bNotAllowed ? 0 : rcMbDataAccess.isSkippedMb() ? 1 : 0;
if( m_pcSliceHeader->isBSlice() )
{
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() ? 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::mbMode( MbDataAccess& rcMbDataAccess )
{
UInt uiMbMode = rcMbDataAccess.getConvertMbType();
ETRACE_DECLARE( UInt uiOrigMbMode = uiMbMode );
if( m_pcSliceHeader->isIntraSlice() )
{
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->isBSlice() )
{
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;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -