📄 cabacreader.cpp
字号:
UInt uiSymbol;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cMvdCCModel.get( 0, uiLocalCtx ) ) );
ROTRS( 0 == uiSymbol, Err::m_nOK )
RNOKCABAC( CabaDecoder::getExGolombMvd( uiSymbol, &m_cMvdCCModel.get( 1, uiCtx ), 3 ) );
uiSymbol++;
UInt uiSign;
RNOKCABAC( CabaDecoder::getEpSymbol( uiSign ) );
rsMvdComp = ( 0 != uiSign ) ? -(Int)uiSymbol : (Int)uiSymbol;
return Err::m_nOK;
}
ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx )
{
Mv cMv;
DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(0), eLstIdx ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv );
return Err::m_nOK;
}
ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx16x8 eParIdx )
{
Mv cMv;
DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx), eLstIdx ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx );
return Err::m_nOK;
}
ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x16 eParIdx )
{
Mv cMv;
DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx), eLstIdx ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx );
return Err::m_nOK;
}
ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx )
{
Mv cMv;
DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx), eLstIdx ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx );
return Err::m_nOK;
}
ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx, SParIdx8x4 eSParIdx )
{
Mv cMv;
DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx+eSParIdx), eLstIdx ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx, eSParIdx );
return Err::m_nOK;
}
ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx, SParIdx4x8 eSParIdx )
{
Mv cMv;
DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx+eSParIdx), eLstIdx ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx, eSParIdx );
return Err::m_nOK;
}
ErrVal CabacReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx, SParIdx4x4 eSParIdx )
{
Mv cMv;
DECRNOK( xGetMvd( rcMbDataAccess, cMv, B4x4Idx(eParIdx+eSParIdx), eLstIdx ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx, eSParIdx );
return Err::m_nOK;
}
ErrVal CabacReader::xGetMvd( MbDataAccess& rcMbDataAccess, Mv& rcMv, LumaIdx cIdx, ListIdx eLstIdx )
{
Mv cMvA;
Mv cMvB;
Short sMvdComponent;
rcMbDataAccess.getMvdAbove( cMvA, eLstIdx, cIdx );
rcMbDataAccess.getMvdLeft ( cMvB, eLstIdx, cIdx );
DECRNOK( xGetMvdComponent( sMvdComponent, cMvA.getAbsHor() + cMvB.getAbsHor(), 0 ) );
rcMv.setHor( sMvdComponent );
DTRACE_T( "Mvd: x" );
DTRACE_TY( "ae(v)" );
DTRACE_V( sMvdComponent );
DTRACE_T( " above " );
DTRACE_V( cMvA.getHor() );
DTRACE_T( " left " );
DTRACE_V( cMvB.getHor() );
DTRACE_N;
DECRNOK( xGetMvdComponent( sMvdComponent, cMvA.getAbsVer() + cMvB.getAbsVer(), 5 ) );
rcMv.setVer( sMvdComponent );
DTRACE_T( "Mvd: y" );
DTRACE_TY( "ae(v)" );
DTRACE_V( sMvdComponent );
DTRACE_T( " above " );
DTRACE_V( cMvA.getVer() );
DTRACE_T( " left " );
DTRACE_V( cMvB.getVer() );
DTRACE_N;
return Err::m_nOK;
}
#if JMVM_ONLY // JVT-U052
ErrVal CabacReader::Icpd( MbDataAccess& rcMbDataAccess )
{
UInt uiIcAct;
Icp cIcp;
DECRNOK( xGetIcAct( rcMbDataAccess, uiIcAct ) );
cIcp.setIcAct( uiIcAct );
if (uiIcAct)
{
DECRNOK( xGetIcpd( cIcp ) );
}
rcMbDataAccess.getMbData().getMbIcp().setAllIcp( cIcp );
return Err::m_nOK;
}
ErrVal CabacReader::xGetIcAct( MbDataAccess& rcMbDataAccess, UInt& uiIcAct )
{
UInt a, b;
UInt act_ctx;
const MbData& cMbDataA = rcMbDataAccess.getMbDataLeft();
const MbData& cMbDataB = rcMbDataAccess.getMbDataAbove();
MbMode cMbModeA = cMbDataA.getMbMode();
MbMode cMbModeB = cMbDataB.getMbMode();
bool bIsIcA = rcMbDataAccess.isAvailableLeft() &&
( (cMbModeA==MODE_16x16) ||
(cMbModeA==MODE_SKIP &&
rcMbDataAccess.getSH().getSliceType()==B_SLICE &&
!cMbDataA.getSkipFlag()) ) && //JVT-W031
cMbDataA.getMbIcp().getIcAct();
bool bIsIcB = rcMbDataAccess.isAvailableAbove() &&
( (cMbModeB==MODE_16x16) ||
(cMbModeB==MODE_SKIP && rcMbDataAccess.getSH().getSliceType()==B_SLICE &&
!cMbDataB.getSkipFlag()) ) && //JVT-W031
cMbDataB.getMbIcp().getIcAct();
a = bIsIcA ? 1 : 0;
b = bIsIcB ? 1 : 0;
act_ctx = a + b;
RNOK( CabacReader::getSymbol( uiIcAct, m_cIcActCCModel.get(0, act_ctx) ) );
DTRACE_T( "IcAct" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( uiIcAct );
DTRACE_T( " a" );
DTRACE_V( a );
DTRACE_T( " b" );
DTRACE_V( b );
DTRACE_T( " act_ctx" );
DTRACE_V( act_ctx );
DTRACE_N;
return Err::m_nOK;
}
ErrVal CabacReader::xGetIcpd( Icp& cIcp )
{
Short sSymOffset;
xGetICSymbol( sSymOffset );
cIcp.setSymbolOffset( sSymOffset );
DTRACE_T( "Icpd: offsetSym" );
DTRACE_TY( "ae(v)" );
DTRACE_V( sSymOffset );
DTRACE_T( " offset " );
DTRACE_V( cIcp.getOffset() );
DTRACE_T( " pred " );
DTRACE_V( cIcp.getPredOffset() );
DTRACE_N;
return Err::m_nOK;
}
ErrVal CabacReader::xGetICSymbol( Short& rsOffset )
{
rsOffset = 0;
UInt uiSymbol;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cIcSymbolCCModel.get( 0, 0 ) ) );
ROTRS( 0 == uiSymbol, Err::m_nOK )
RNOKCABAC( CabaDecoder::getExGolombLevel( uiSymbol, m_cIcSymbolCCModel.get( 0, 1 ) ) );
uiSymbol++;
UInt uiSign;
RNOKCABAC( CabaDecoder::getEpSymbol( uiSign ) );
rsOffset = ( 0 != uiSign ) ? -(Int)uiSymbol : (Int)uiSymbol;
return Err::m_nOK;
}
#endif
ErrVal CabacReader::intraPredModeChroma( MbDataAccess& rcMbDataAccess )
{
UInt uiSymbol;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cChromaPredCCModel.get( 0, rcMbDataAccess.getCtxChromaPredMode() ) ) );
if( uiSymbol )
{
RNOKCABAC( CabaDecoder::getUnaryMaxSymbol( uiSymbol, m_cChromaPredCCModel.get( 0 ) + 3, 0, 2 ) );
uiSymbol++;
}
rcMbDataAccess.getMbData().setChromaPredMode( uiSymbol );
DTRACE_T( "IntraPredModeChroma" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( uiSymbol );
DTRACE_N;
return Err::m_nOK;
}
ErrVal CabacReader::intraPredModeLuma( MbDataAccess& rcMbDataAccess, LumaIdx cIdx )
{
UInt uiSymbol;
UInt uiIPredMode;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 0 ) ) );
if( ! uiSymbol )
{
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 1 ) ) );
uiIPredMode = uiSymbol;
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 1 ) ) );
uiIPredMode |= (uiSymbol << 1);
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 1 ) ) );
rcMbDataAccess.getMbData().intraPredMode( cIdx ) = ( uiIPredMode | (uiSymbol << 2) );
}
else
{
rcMbDataAccess.getMbData().intraPredMode( cIdx ) = -1;
}
DTRACE_T( "IntraPredModeLuma" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( rcMbDataAccess.getMbData().intraPredMode( cIdx ) );
DTRACE_N;
return Err::m_nOK;
}
ErrVal CabacReader::cbp( MbDataAccess& rcMbDataAccess )
{
UInt uiCbp;
UInt uiBit;
UInt uiCtx = 0, a, b;
a = rcMbDataAccess.getLeftLumaCbp ( B4x4Idx( 0 ) );
b = rcMbDataAccess.getAboveLumaCbp( B4x4Idx( 0 ) ) << 1;
RNOKCABAC( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
uiCbp = uiBit;
a = uiCbp & 1;
b = rcMbDataAccess.getAboveLumaCbp( B4x4Idx( 2 ) ) << 1;
RNOKCABAC( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
uiCbp += uiBit << 1;
a = rcMbDataAccess.getLeftLumaCbp ( B4x4Idx( 8 ) );
b = (uiCbp << 1) & 2;
RNOKCABAC( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
uiCbp += uiBit << 2;
a = ( uiCbp >> 2 ) & 1;
b = uiCbp & 2;
RNOKCABAC( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
uiCbp += uiBit << 3;
uiCtx = 1;
UInt uiLeftChromaCbp = rcMbDataAccess.getLeftChromaCbp ();
UInt uiAboveChromaCbp = rcMbDataAccess.getAboveChromaCbp();
a = uiLeftChromaCbp > 0 ? 1 : 0;
b = uiAboveChromaCbp > 0 ? 2 : 0;
RNOKCABAC( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( uiCtx, a + b ) ) );
if( uiBit )
{
a = uiLeftChromaCbp > 1 ? 1 : 0;
b = uiAboveChromaCbp > 1 ? 2 : 0;
RNOKCABAC( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( ++uiCtx, a + b ) ) );
uiCbp += (1 == uiBit) ? 32 : 16;
}
if( !uiCbp )
{
m_uiLastDQpNonZero = 0; // no DeltaQP for Macroblocks with zero Cbp
}
AOF_DBG( 48 >= uiCbp );
DTRACE_T( "Cbp" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( uiCbp );
DTRACE_N;
rcMbDataAccess.getMbData().setMbCbp( uiCbp );
return Err::m_nOK;
}
ErrVal CabacReader::residualBlock( MbDataAccess& rcMbDataAccess,
LumaIdx cIdx,
ResidualMode eResidualMode,
UInt& ruiMbExtCbp )
{
const UChar* pucScan = ( eResidualMode==LUMA_I16_DC ? g_aucLumaFrameDCScan : g_aucFrameScan );
Bool bCoded;
DTRACE_T( "LUMA:" );
DTRACE_V( cIdx );
DTRACE_N;
DECRNOK( xReadBCbp( rcMbDataAccess, bCoded, eResidualMode, cIdx ) );
if( ! bCoded )
{
ruiMbExtCbp &= ~(1 << cIdx.b4x4() );
return Err::m_nOK;
}
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get( cIdx );
DECRNOK( xReadCoeff( piCoeff, eResidualMode, pucScan ) );
return Err::m_nOK;
}
ErrVal CabacReader::residualBlock( MbDataAccess& rcMbDataAccess,
ChromaIdx cIdx,
ResidualMode eResidualMode
)
{
const UChar* pucScan = ( eResidualMode == CHROMA_DC ? g_aucIndexChromaDCScan : g_aucFrameScan );
Bool bCoded;
DTRACE_T( eResidualMode == CHROMA_DC ? "CHROMA_DC:" : "CHROMA_AC:" );
DTRACE_V( cIdx );
DTRACE_N;
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get( cIdx );
DECRNOK( xReadBCbp( rcMbDataAccess, bCoded, eResidualMode, cIdx ) );
ROTRS( ! bCoded, Err::m_nOK );
DECRNOK( xReadCoeff( piCoeff, eResidualMode, pucScan ) );
return Err::m_nOK;
}
ErrVal CabacReader::deltaQp( MbDataAccess& rcMbDataAccess )
{
UInt uiDQp;
Int iDQp = 0;
UInt uiCtx = m_uiLastDQpNonZero;
RNOKCABAC( CabaDecoder::getSymbol( uiDQp, m_cDeltaQpCCModel.get( 0, uiCtx ) ) );
m_uiLastDQpNonZero = uiDQp;
if( uiDQp )
{
RNOKCABAC( CabaDecoder::getUnarySymbol( uiDQp, &m_cDeltaQpCCModel.get( 0, 2 ), 1 ) );
iDQp = (uiDQp + 2) / 2;
if( uiDQp & 1 )
{
iDQp = -iDQp;
}
}
DTRACE_T( "DQp" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE ( iDQp );
DTRACE_N;
rcMbDataAccess.addDeltaQp( iDQp );
Quantizer::setQp( rcMbDataAccess, false );
return Err::m_nOK;
}
Bool CabacReader::isEndOfSlice()
{
UInt uiEOS;
CabaDecoder::getTerminateBufferBit( uiEOS );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -