📄 cabacwriter.cpp
字号:
}
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;
}
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;
}
#if JMVM_ONLY // JVT-U052
ErrVal CabacWriter::Icpd( MbDataAccess& rcMbDataAccess )
{
UInt uiIcAct = rcMbDataAccess.getMbData().getMbIcp().getIcAct();
Icp cIcp = rcMbDataAccess.getMbData().getMbIcp().getIcp();
RNOK( xWriteIcAct( rcMbDataAccess, uiIcAct ) );
if (uiIcAct)
RNOK( xWriteIcpd( cIcp ) );
return Err::m_nOK;
}
ErrVal CabacWriter::xWriteIcAct( 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( CabaEncoder::writeSymbol( uiIcAct, m_cIcActCCModel.get(0, act_ctx) ) );
ETRACE_T( "IcAct" );
ETRACE_TY( "ae(v)" );
ETRACE_CODE( uiIcAct );
ETRACE_T( " a" );
ETRACE_V( a );
ETRACE_T( " b" );
ETRACE_V( b );
ETRACE_T( " act_ctx" );
ETRACE_V( act_ctx );
ETRACE_N;
return Err::m_nOK;
}
ErrVal CabacWriter::xWriteIcpd( Icp cIcp )
{
Short sSymOffset = cIcp.getSymbolOffset();
RNOK( xWriteIcSymbol( sSymOffset ) );
ETRACE_T( "Icpd: offsetSym" );
ETRACE_TY( "ae(v)" );
ETRACE_V( sSymOffset );
ETRACE_T( " offset " );
ETRACE_V( cIcp.getOffset() );
ETRACE_T( " pred " );
ETRACE_V( cIcp.getPredOffset() );
ETRACE_N;
return Err::m_nOK;
}
ErrVal CabacWriter::xWriteIcSymbol( Short sOffset )
{
//--- first symbol: if non-zero ---
UInt uiSymbol = ( 0 == sOffset) ? 0 : 1;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cIcSymbolCCModel.get( 0, 0 ) ) );
ROTRS( 0 == uiSymbol, Err::m_nOK );
//--- absolute value and sign
UInt uiSign = 0;
if( 0 > sOffset )
{
uiSign = 1;
sOffset = -sOffset;
}
RNOK( CabaEncoder::writeExGolombIcSymbol( sOffset-1, m_cIcSymbolCCModel.get( 0, 1 ) ) );
RNOK( CabaEncoder::writeEPSymbol( uiSign ) );
return Err::m_nOK;
}
#endif
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 uiCbp = rcMbDataAccess.getMbData().getMbCbp();
UInt uiCtx = 0, a, b;
a = rcMbDataAccess.getLeftLumaCbp ( B4x4Idx( 0 ) );
b = rcMbDataAccess.getAboveLumaCbp( B4x4Idx( 0 ) ) << 1;
RNOK( CabaEncoder::writeSymbol( uiCbp & 1, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
a = uiCbp & 1;
b = rcMbDataAccess.getAboveLumaCbp( B4x4Idx( 2 ) ) << 1;
RNOK( CabaEncoder::writeSymbol( (uiCbp>>1) & 1, m_cCbpCCModel.get( uiCtx, 3 - (a + b) ) ) );
a = rcMbDataAccess.getLeftLumaCbp ( B4x4Idx( 8 ) );
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 ();
UInt uiAboveChromaCbp = rcMbDataAccess.getAboveChromaCbp();
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 )
{
const UChar* pucScan = g_aucFrameScan;
switch( eResidualMode )
{
case LUMA_I16_DC:
{
pucScan = g_aucLumaFrameDCScan;
break;
}
case LUMA_SCAN:
case LUMA_I16_AC:
{
break;
}
default:
{
AF();
return Err::m_nERR;
}
}
ETRACE_T( "LUMA:" );
ETRACE_V( cIdx );
ETRACE_N;
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get( cIdx );
UInt uiNumSig = xGetNumberOfSigCoeff( piCoeff, eResidualMode, pucScan );
RNOK( xWriteBCbp( rcMbDataAccess, uiNumSig, eResidualMode, cIdx ) );
if( uiNumSig )
{
RNOK( xWriteCoeff( uiNumSig, piCoeff, eResidualMode, pucScan ) );
}
return Err::m_nOK;
}
ErrVal CabacWriter::residualBlock( MbDataAccess& rcMbDataAccess,
ChromaIdx cIdx,
ResidualMode eResidualMode )
{
const UChar* pucScan;
switch( eResidualMode )
{
case CHROMA_DC:
{
ETRACE_T( "CHROMA_DC:" );
pucScan = g_aucIndexChromaDCScan;
break;
}
case CHROMA_AC:
{
ETRACE_T( "CHROMA_AC:" );
pucScan = g_aucFrameScan;
break;
}
default:
{
AF();
return Err::m_nERR;
}
}
ETRACE_V( cIdx );
ETRACE_N;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -