📄 cabacwriter.cpp
字号:
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::xWriteBCbp( MbDataAccess& rcMbDataAccess, UInt uiNumSig, ResidualMode eResidualMode, LumaIdx cIdx )
{
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 );
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 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 );
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 uiNumSig = 0;
UInt uiStart = ( CHROMA_AC == eResidualMode || LUMA_I16_AC == eResidualMode ) ? 1 : 0 ;
UInt uiStop = ( CHROMA_DC == eResidualMode ) ? 4 : 16;
for( UInt ui = uiStart; ui < uiStop; ui++ )
{
if( piCoeff[ pucScan[ ui ] ] )
{
uiNumSig++;
}
}
return uiNumSig;
}
ErrVal CabacWriter::xWriteCoeff( UInt uiNumSig,
TCoeff* piCoeff,
ResidualMode eResidualMode,
const UChar* pucScan )
{
CabacContextModel2DBuffer& rcMapCCModel = m_cMapCCModel;
CabacContextModel2DBuffer& rcLastCCModel = m_cLastCCModel;
UInt uiCodedSig = 0;
UInt uiStart = 0;
UInt uiStop = 15;
if( CHROMA_AC == eResidualMode || LUMA_I16_AC == eResidualMode )
{
uiStart = 1;
}
if( CHROMA_DC == eResidualMode )
{
uiStop = 3;
}
else if( LUMA_I16_DC == eResidualMode)
{
uiStop = 15;
}
UInt ui;
//----- encode significance map -----
for( ui = uiStart; ui < uiStop; ui++ ) // if last coeff is reached, it has to be significant
{
UInt uiSig = piCoeff[ pucScan[ ui ] ] ? 1 : 0;
RNOK( CabaEncoder::writeSymbol( uiSig, rcMapCCModel.get( type2ctx2 [eResidualMode], ui ) ) );
if( uiSig )
{
UInt uiLast = (++uiCodedSig == uiNumSig ? 1 : 0);
RNOK( CabaEncoder::writeSymbol( uiLast, rcLastCCModel.get( type2ctx2 [eResidualMode], ui ) ) );
if( uiLast)
{
break;
}
}
}
int c1 = 1;
int c2 = 0;
//----- encode significant coefficients -----
ui++;
while( (ui--) != uiStart )
{
UInt uiAbs, uiSign;
Int iCoeff = piCoeff[ pucScan[ ui ] ];
if( iCoeff )
{
if( iCoeff > 0) { uiAbs = static_cast<UInt>( iCoeff); uiSign = 0; }
else { uiAbs = static_cast<UInt>(-iCoeff); uiSign = 1; }
UInt uiCtx = min (c1, 4);
UInt uiSymbol = uiAbs > 1 ? 1 : 0;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cOneCCModel.get( type2ctx1 [eResidualMode], uiCtx ) ) );
if( uiSymbol )
{
uiCtx = min (c2,4);
uiAbs -= 2;
c1 = 0;
c2++;
RNOK( CabaEncoder::writeExGolombLevel( uiAbs, m_cAbsCCModel.get( type2ctx1 [eResidualMode], uiCtx ) ) );
}
else if( c1 )
{
c1++;
}
RNOK( CabaEncoder::writeEPSymbol( uiSign ) );
}
}
return Err::m_nOK;
}
ErrVal CabacWriter::terminatingBit ( UInt uiIsLast )
{
RNOK( CabaEncoder::writeTerminatingBit( uiIsLast ) );
ETRACE_T( "EOS" );
ETRACE_CODE( uiIsLast );
ETRACE_N;
return Err::m_nOK;
}
ErrVal CabacWriter::deltaQp( MbDataAccess& rcMbDataAccess )
{
Int iDQp = rcMbDataAccess.getDeltaQp();
UInt uiCtx = m_uiLastDQpNonZero;
UInt uiDQp = ( iDQp ? 1 : 0 );
RNOK( CabaEncoder::writeSymbol( uiDQp, m_cDeltaQpCCModel.get( 0, uiCtx ) ) );
m_uiLastDQpNonZero = ( 0 != uiDQp ? 1 : 0 );
if( uiDQp )
{
uiDQp = (UInt)( iDQp > 0 ? ( 2 * iDQp - 2 ) : ( -2 * iDQp - 1 ) );
RNOK( CabaEncoder::writeUnarySymbol( uiDQp, &m_cDeltaQpCCModel.get( 0, 2 ), 1 ) );
}
ETRACE_T( "DQp" );
ETRACE_TY( "ae(v)" );
ETRACE_CODE ( iDQp );
ETRACE_N;
return Err::m_nOK;
}
ErrVal CabacWriter::samplesPCM( MbDataAccess& rcMbDataAccess )
{
ETRACE_POS;
ETRACE_T( " PCM SAMPLES: " );
RNOK( CabaEncoder::finish() );
RNOK( m_pcBitWriteBufferIf->write(1) );
RNOK( m_pcBitWriteBufferIf->writeAlignZero() );
rcMbDataAccess.getMbData().setBCBPAll( 1 );
AOF_DBG( rcMbDataAccess.getMbData().isPCM() );
Pel* pSrc = rcMbDataAccess.getMbTCoeffs().getPelBuffer();
const UInt uiFactor = 8*8;
const UInt uiSize = uiFactor*2*3;
RNOK( m_pcBitWriteBufferIf->samples( pSrc, uiSize ) );
ETRACE_N;
RNOK( CabaEncoder::start() );
return Err::m_nOK;
}
UInt CabacWriter::getNumberOfWrittenBits()
{
return CabaEncoder::getWrittenBits();
}
ErrVal CabacWriter::transformSize8x8Flag( MbDataAccess& rcMbDataAccess )
{
UInt uiSymbol = rcMbDataAccess.getMbData().isTransformSize8x8() ? 1 : 0;
UInt uiCtx = rcMbDataAccess.getCtx8x8Flag();
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cTransSizeCCModel.get( 0, uiCtx ) ) );
ETRACE_T( "transformSize8x8Flag:" );
ETRACE_TY( "ae(v)" );
ETRACE_CODE( rcMbDataAccess.getMbData().isTransformSize8x8() );
ETRACE_N;
return Err::m_nOK;
}
ErrVal CabacWriter::residualBlock8x8( MbDataAccess& rcMbDataAccess,
B8x8Idx c8x8Idx,
ResidualMode eResidualMode )
{
const UChar* pucScan = g_aucFrameScan64;
switch( eResidualMode )
{
case LUMA_SCAN:
{
break;
}
default:
{
AF();
return Err::m_nERR;
}
}
ETRACE_T( "LUMA_8x8:" );
ETRACE_V( c8x8Idx.b8x8Index() );
ETRACE_N;
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get8x8( c8x8Idx );
UInt ui;
UInt uiNumSig = 0;
for( UInt uiC = 0; uiC < 64; uiC++ )
{
if( piCoeff[ uiC ] )
{
uiNumSig++;
}
}
UInt uiBitPos = c8x8Idx.b4x4();
rcMbDataAccess.getMbData().setBCBP( uiBitPos, 1);
rcMbDataAccess.getMbData().setBCBP( uiBitPos+1, 1);
rcMbDataAccess.getMbData().setBCBP( uiBitPos+4, 1);
rcMbDataAccess.getMbData().setBCBP( uiBitPos+5, 1);
const UInt uiCtxOffset = 2;
CabacContextModel2DBuffer& rcMapCCModel = m_cMapCCModel;
CabacContextModel2DBuffer& rcLastCCModel = m_cLastCCModel;
UInt uiCodedSig = 0;
const Int* pos2ctx_map = pos2ctx_map8x8;
//----- encode significance map -----
for( ui = 0; ui < 63; ui++ ) // if last coeff is reached, it has to be significant
{
UInt uiSig = piCoeff[ pucScan[ ui ] ] ? 1 : 0;
RNOK( CabaEncoder::writeSymbol( uiSig, rcMapCCModel.get( uiCtxOffset, pos2ctx_map[ui] ) ) );
if( uiSig )
{
UInt uiLast = (++uiCodedSig == uiNumSig ? 1 : 0);
RNOK( CabaEncoder::writeSymbol( uiLast, rcLastCCModel.get( uiCtxOffset, pos2ctx_last8x8[ui] ) ) );
if( uiLast)
{
break;
}
}
}
int c1 = 1;
int c2 = 0;
//----- encode significant coefficients -----
ui++;
while( (ui--) != 0 )
{
UInt uiAbs, uiSign;
Int iCoeff = piCoeff[ pucScan[ ui ] ];
if( iCoeff )
{
if( iCoeff > 0) { uiAbs = static_cast<UInt>( iCoeff); uiSign = 0; }
else { uiAbs = static_cast<UInt>(-iCoeff); uiSign = 1; }
UInt uiCtx = min (c1, 4);
UInt uiSymbol = uiAbs > 1 ? 1 : 0;
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cOneCCModel.get( uiCtxOffset, uiCtx ) ) );
if( uiSymbol )
{
uiCtx = min (c2,4);
uiAbs -= 2;
c1 = 0;
c2++;
RNOK( CabaEncoder::writeExGolombLevel( uiAbs, m_cAbsCCModel.get( uiCtxOffset, uiCtx ) ) );
}
else if( c1 )
{
c1++;
}
RNOK( CabaEncoder::writeEPSymbol( uiSign ) );
}
}
return Err::m_nOK;
}
Bool
CabacWriter::RQpeekCbp4x4( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
LumaIdx cIdx )
{
UInt uiSymbol = 0;
TCoeff* piCoeff = rcMbDataAccess. getMbTCoeffs().get( cIdx );
TCoeff* piBCoeff = rcMbDataAccessBase.getMbTCoeffs().get( cIdx );
for( UInt ui = 0; ui < 16; ui++ )
{
if( piCoeff[ g_aucFrameScan[ui] ] && !piBCoeff[ g_aucFrameScan[ui] ] )
{
uiSymbol = 1;
break;
}
}
return ( uiSymbol == 1 );
}
Bool
CabacWriter::RQencodeBCBP_4x4( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
LumaIdx cIdx )
{
UInt uiCtx = rcMbDataAccessBase.getCtxCodedBlockBit( cIdx );
UInt uiSymbol = RQpeekCbp4x4(rcMbDataAccess, rcMbDataAccessBase, cIdx);
ANOK( CabaEncoder::writeSymbol( uiSymbol, m_cBCbpCCModel.get( type2ctx1[LUMA_SCAN], uiCtx ) ) );
ETRACE_T( "BCBP_4x4" );
ETRACE_V( uiSymbol );
ETRACE_N;
rcMbDataAccessBase.getMbData().setBCBP( cIdx, uiSymbol );
return ( uiSymbol == 1 );
}
Bool
CabacWriter::RQencodeBCBP_ChromaDC( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
ChromaIdx cIdx )
{
UInt uiSymbol = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -