📄 cabacwriter.cpp
字号:
}
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;
}
ErrVal CabacWriter::xWriteMvd( MbDataAccess& rcMbDataAccess, Mv cMv, LumaIdx cIdx, ListIdx eLstIdx )
{
Mv cMvA;
Mv cMvB;
rcMbDataAccess.getMvdAbove( cMvA, eLstIdx, cIdx );
rcMbDataAccess.getMvdLeft ( cMvB, eLstIdx, cIdx );
Short sHor = cMv.getHor();
Short sVer = cMv.getVer();
RNOK( xWriteMvdComponent( sHor, cMvA.getAbsHor() + cMvB.getAbsHor(), 0 ) );
ETRACE_T( "Mvd: 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( xWriteMvdComponent( sVer, cMvA.getAbsVer() + cMvB.getAbsVer(), 5 ) );
ETRACE_T( "Mvd: 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::intraPredModeChroma( MbDataAccess& rcMbDataAccess )
{
UInt uiCtx = rcMbDataAccess.getCtxChromaPredMode();
UInt uiIntraPredModeChroma = rcMbDataAccess.getMbData().getChromaPredMode();
if( 0 == uiIntraPredModeChroma )
{
CabaEncoder::writeSymbol( 0, m_cChromaPredCCModel.get( 0, uiCtx ) );
}
else
{
CabaEncoder::writeSymbol( 1, m_cChromaPredCCModel.get( 0, uiCtx ) );
CabaEncoder::writeUnaryMaxSymbol( uiIntraPredModeChroma - 1,
m_cChromaPredCCModel.get( 0 ) + 3,
0, 2 );
}
ETRACE_T( "IntraPredModeChroma" );
ETRACE_TY( "ae(v)" );
ETRACE_CODE( uiIntraPredModeChroma );
ETRACE_N;
return Err::m_nOK;
}
ErrVal CabacWriter::intraPredModeLuma( MbDataAccess& rcMbDataAccess, LumaIdx cIdx )
{
Int iIntraPredModeLuma = rcMbDataAccess.encodeIntraPredMode(cIdx);
RNOK( CabaEncoder::writeSymbol( iIntraPredModeLuma >= 0 ? 0 : 1, m_cIntraPredCCModel.get( 0, 0 ) ) );
if( iIntraPredModeLuma >= 0 )
{
RNOK( CabaEncoder::writeSymbol( (iIntraPredModeLuma & 0x01) , m_cIntraPredCCModel.get( 0, 1 ) ) );
RNOK( CabaEncoder::writeSymbol( (iIntraPredModeLuma & 0x02) >> 1, m_cIntraPredCCModel.get( 0, 1 ) ) );
RNOK( CabaEncoder::writeSymbol( (iIntraPredModeLuma & 0x04) >> 2, m_cIntraPredCCModel.get( 0, 1 ) ) );
}
ETRACE_T( "IntraPredModeLuma" );
ETRACE_TY( "ae(v)" );
ETRACE_CODE( iIntraPredModeLuma );
ETRACE_N;
return Err::m_nOK;
}
ErrVal CabacWriter::cbp( MbDataAccess& rcMbDataAccess, UInt uiStart, UInt uiStop )
{
Bool bInterlaced = FRAME != rcMbDataAccess.getMbPicType();
ROF( bInterlaced == rcMbDataAccess.getMbData().getFieldFlag() );
UInt uiCbp = rcMbDataAccess.getMbData().calcMbCbp( uiStart, uiStop );
UInt uiCtx = 0, a, b;
a = rcMbDataAccess.getLeftLumaCbp ( B4x4Idx( 0 ), uiStart, uiStop );
b = rcMbDataAccess.getAboveLumaCbp( B4x4Idx( 0 ), uiStart, uiStop ) << 1;
RNOK( CabaEncoder::writeSymbol( uiCbp & 1, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
a = uiCbp & 1;
b = rcMbDataAccess.getAboveLumaCbp( B4x4Idx( 2 ), uiStart, uiStop ) << 1;
RNOK( CabaEncoder::writeSymbol( (uiCbp>>1) & 1, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
a = rcMbDataAccess.getLeftLumaCbp ( B4x4Idx( 8 ), uiStart, uiStop );
b = (uiCbp << 1) & 2;
RNOK( CabaEncoder::writeSymbol( (uiCbp>>2) & 1, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
a = ( uiCbp >> 2 ) & 1;
b = uiCbp & 2;
RNOK( CabaEncoder::writeSymbol( (uiCbp>>3) & 1, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
uiCtx = 1;
UInt uiLeftChromaCbp = rcMbDataAccess.getLeftChromaCbp ( uiStart, uiStop );
UInt uiAboveChromaCbp = rcMbDataAccess.getAboveChromaCbp( uiStart, uiStop );
a = uiLeftChromaCbp > 0 ? 1 : 0;
b = uiAboveChromaCbp > 0 ? 2 : 0;
UInt uiBit = ( 0 == (uiCbp>>4)) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiBit, m_cCbpCCModel.get( uiCtx, a + b ) ) );
if( uiBit )
{
a = uiLeftChromaCbp > 1 ? 1 : 0;
b = uiAboveChromaCbp > 1 ? 2 : 0;
uiBit = ( 0 == (uiCbp>>5)) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiBit, m_cCbpCCModel.get( ++uiCtx, a + b ) ) );
}
if( !uiCbp )
{
m_uiLastDQpNonZero = 0;
}
AOF_DBG( 48 >= uiCbp );
ETRACE_T( "Cbp" );
ETRACE_TY( "ae(v)" );
ETRACE_CODE( uiCbp );
ETRACE_N;
return Err::m_nOK;
}
ErrVal CabacWriter::residualBlock( MbDataAccess& rcMbDataAccess,
LumaIdx cIdx,
ResidualMode eResidualMode,
UInt uiStart,
UInt uiStop )
{
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType());
const UChar* pucScan = ( eResidualMode==LUMA_I16_DC ? ((bFrame) ? g_aucLumaFrameDCScan : g_aucLumaFieldDCScan) : ((bFrame) ? g_aucFrameScan : g_aucFieldScan) );
ETRACE_T( "LUMA:" );
ETRACE_V( cIdx );
ETRACE_N;
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get( cIdx );
ROT( uiStart == uiStop );
UInt uiNumSig = xGetNumberOfSigCoeff( piCoeff, eResidualMode, pucScan, uiStart, uiStop );
RNOK( xWriteBCbp( rcMbDataAccess, uiNumSig, eResidualMode, cIdx, uiStart, uiStop ) );
if( uiNumSig )
{
RNOK( xWriteCoeff( uiNumSig, piCoeff, eResidualMode, pucScan, bFrame, uiStart, uiStop ) );
}
return Err::m_nOK;
}
ErrVal CabacWriter::residualBlock( MbDataAccess& rcMbDataAccess,
ChromaIdx cIdx,
ResidualMode eResidualMode,
UInt uiStart,
UInt uiStop )
{
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType());
const UChar* pucScan;
switch( eResidualMode )
{
case CHROMA_DC:
{
ETRACE_T( "CHROMA_DC:" );
pucScan = g_aucIndexChromaDCScan;
break;
}
case CHROMA_AC:
{
ETRACE_T( "CHROMA_AC:" );
pucScan = (bFrame ? g_aucFrameScan : g_aucFieldScan);
break;
}
default:
{
AF();
return Err::m_nERR;
}
}
ETRACE_V( cIdx );
ETRACE_N;
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get( cIdx );
ROT( uiStart == uiStop );
UInt uiNumSig = xGetNumberOfSigCoeff( piCoeff, eResidualMode, pucScan, uiStart, uiStop );
RNOK( xWriteBCbp( rcMbDataAccess, uiNumSig, eResidualMode, cIdx, uiStart, uiStop ) );
if( uiNumSig )
{
RNOK( xWriteCoeff( uiNumSig, piCoeff, eResidualMode, pucScan, bFrame, uiStart, uiStop ) );
}
return Err::m_nOK;
}
ErrVal CabacWriter::xWriteBCbp( MbDataAccess& rcMbDataAccess, UInt uiNumSig, ResidualMode eResidualMode, LumaIdx cIdx, UInt uiStart, UInt uiStop )
{
UInt uiBitPos = 0;
if( LUMA_SCAN == eResidualMode || LUMA_I16_AC == eResidualMode )
{
uiBitPos = cIdx;
}
else if( LUMA_I16_DC == eResidualMode )
{
uiBitPos = 26;
}
else
{
// full stop
AF();
}
UInt uiCtx = rcMbDataAccess.getCtxCodedBlockBit( uiBitPos, uiStart, uiStop );
UInt uiBit = uiNumSig ? 1 : 0;
RNOK( CabaEncoder::writeSymbol( uiBit, m_cBCbpCCModel.get( type2ctx1[ eResidualMode ], uiCtx) ) );
rcMbDataAccess.getMbData().setBCBP( uiBitPos, uiBit);
return Err::m_nOK;
}
ErrVal CabacWriter::xWriteBCbp( MbDataAccess& rcMbDataAccess, UInt uiNumSig, ResidualMode eResidualMode, ChromaIdx cIdx, UInt uiStart, UInt uiStop )
{
UInt uiBitPos;
if( CHROMA_AC == eResidualMode )
{
uiBitPos = 16 + cIdx;
}
else if( CHROMA_DC == eResidualMode )
{
uiBitPos = 24 + cIdx.plane();
}
else
{
AF();
return Err::m_nERR;
}
UInt uiCtx = rcMbDataAccess.getCtxCodedBlockBit( uiBitPos, uiStart, uiStop );
UInt uiBit = uiNumSig ? 1 : 0;
RNOK( CabaEncoder::writeSymbol( uiBit, m_cBCbpCCModel.get( type2ctx1[ eResidualMode ], uiCtx) ) );
rcMbDataAccess.getMbData().setBCBP( uiBitPos, uiBit);
return Err::m_nOK;
}
UInt CabacWriter::xGetNumberOfSigCoeff( TCoeff* piCoeff, ResidualMode eResidualMode, const UChar* pucScan, UInt uiStart, UInt uiStop )
{
UInt uiNumSig = 0;
if( CHROMA_DC == eResidualMode || LUMA_I16_DC == eResidualMode )
{
if( uiStart == 0 && uiStop > 0 )
{
// process all DC coefficients if the range uiStart to uiStop demands the processing of scanpos 0
uiStop = CHROMA_DC == eResidualMode ? 4 : 16;
}
else
{
return 0;
}
}
else if( CHROMA_AC == eResidualMode || LUMA_I16_AC == eResidualMode )
{
if( uiStop > 1 )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -