📄 cabacwriter.cpp
字号:
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 Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType());
const UChar* pucScan = (bFrame) ? g_aucFrameScan64 : g_aucFieldScan64;
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 = ( bFrame ? m_cMapCCModel : m_cFldMapCCModel);
CabacContextModel2DBuffer& rcLastCCModel = ( bFrame ? m_cLastCCModel : m_cFldLastCCModel);
UInt uiCodedSig = 0;
const Int* pos2ctx_map = (bFrame) ? pos2ctx_map8x8 : pos2ctx_map8x8i;
//----- 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,
Bool b8x8,
LumaIdx cIdx )
{
UInt uiSymbol = 0;
TCoeff* piCoeff = rcMbDataAccess. getMbTCoeffs().get( cIdx );
TCoeff* piBCoeff = rcMbDataAccessBase.getMbTCoeffs().get( cIdx );
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType());
const UChar* pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
for( UInt ui = 0; ui < 16; ui++ )
{
if( piCoeff[ pucScan[ui] ] && !piBCoeff[ pucScan[ui] ] )
{
uiSymbol = 1;
break;
}
}
return ( uiSymbol == 1 );
}
Bool
CabacWriter::RQencodeBCBP_4x4( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
Bool b8x8,
LumaIdx cIdx )
{
UInt uiCtx = rcMbDataAccessBase.getCtxCodedBlockBit( cIdx );
UInt uiSymbol = RQpeekCbp4x4(rcMbDataAccess, rcMbDataAccessBase, b8x8, cIdx);
ANOK( CabaEncoder::writeSymbol( uiSymbol, m_cBCbpCCModel.get( type2ctx1[LUMA_SCAN], uiCtx ) ) );
ETRACE_T( "BCBP_4x4" );
ETRACE_V( uiSymbol );
ETRACE_N;
rcMbDataAccess.getMbData() .setBCBP( cIdx, uiSymbol );
rcMbDataAccessBase.getMbData().setBCBP( cIdx, uiSymbol );
return ( uiSymbol == 1 );
}
Bool
CabacWriter::RQencodeBCBP_ChromaDC( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
ChromaIdx cIdx )
{
UInt uiSymbol = 0;
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get( cIdx );
UInt uiCtx = rcMbDataAccessBase.getCtxCodedBlockBit( 24 + cIdx.plane() );
// heiko.schwarz@hhi.de: take only new significants coefficient into account when determining the coded_block_flag
TCoeff* piBCoeff = rcMbDataAccessBase.getMbTCoeffs().get( cIdx );
for( UInt ui = 0; ui < 4; ui++ )
{
// heiko.schwarz@hhi.de: take only new significants coefficient into account when determining the coded_block_flag
//if( piCoeff[ g_aucIndexChromaDCScan[ui] ] )
if( piCoeff[ g_aucIndexChromaDCScan[ui] ] && !piBCoeff[ g_aucIndexChromaDCScan[ui] ] )
{
uiSymbol = 1;
break;
}
}
ANOK( CabaEncoder::writeSymbol( uiSymbol, m_cBCbpCCModel.get( type2ctx1[CHROMA_DC], uiCtx ) ) );
ETRACE_T( "BCBP_ChromaDC" );
ETRACE_V( uiSymbol );
ETRACE_N;
rcMbDataAccess. getMbData().setBCBP( 24 + cIdx.plane(), uiSymbol );
rcMbDataAccessBase.getMbData().setBCBP( 24 + cIdx.plane(), uiSymbol );
return ( uiSymbol == 1 );
}
Bool
CabacWriter::RQencodeBCBP_ChromaAC( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
ChromaIdx cIdx )
{
UInt uiSymbol = 0;
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get( cIdx );
UInt uiCtx = rcMbDataAccessBase.getCtxCodedBlockBit( 16 + cIdx );
// heiko.schwarz@hhi.de: take only new significants coefficient into account when determining the coded_block_flag
TCoeff* piBCoeff = rcMbDataAccessBase.getMbTCoeffs().get( cIdx );
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType());
const UChar* pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
for( UInt ui = 1; ui < 16; ui++ )
{
// heiko.schwarz@hhi.de: take only new significants coefficient into account when determining the coded_block_flag
if( piCoeff[ pucScan[ui] ] && !piBCoeff[ pucScan[ui] ] )
{
uiSymbol = 1;
break;
}
}
ANOK( CabaEncoder::writeSymbol( uiSymbol, m_cBCbpCCModel.get( type2ctx1[CHROMA_AC], uiCtx ) ) );
ETRACE_T( "BCBP_ChromaAC" );
ETRACE_V( uiSymbol );
ETRACE_N;
rcMbDataAccess. getMbData().setBCBP( 16 + cIdx, uiSymbol );
rcMbDataAccessBase.getMbData().setBCBP( 16 + cIdx, uiSymbol );
return ( uiSymbol == 1 );
}
Bool
CabacWriter::RQencodeCBP_Chroma( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase )
{
UInt uiSymbol = ( ( rcMbDataAccess.getMbData().getMbCbp() >> 4 ) ? 1 : 0 );
UInt uiLeftChromaCbp = rcMbDataAccessBase.getLeftChromaCbpFGS ();
UInt uiAboveChromaCbp = rcMbDataAccessBase.getAboveChromaCbpFGS();
UInt uiCtx = ( uiLeftChromaCbp > 0 ? 1 : 0 ) + ( uiAboveChromaCbp > 0 ? 2 : 0 );
ANOK( CabaEncoder::writeSymbol( uiSymbol, m_cCbpCCModel.get( 1, uiCtx ) ) );
ETRACE_T( "CBP_Chroma" );
ETRACE_V( uiSymbol );
ETRACE_N;
if( uiSymbol )
{
rcMbDataAccessBase.getMbData().setMbCbp( rcMbDataAccessBase.getMbData().getMbCbp() | 0x10 );
}
return ( uiSymbol == 1 );
}
Bool
CabacWriter::RQencodeCBP_ChromaAC( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase )
{
UInt uiSymbol = ( ( rcMbDataAccess.getMbData().getMbCbp() >> 5 ) ? 1 : 0 );
UInt uiLeftChromaCbp = rcMbDataAccessBase.getLeftChromaCbpFGS ();
UInt uiAboveChromaCbp = rcMbDataAccessBase.getAboveChromaCbpFGS();
UInt uiCtx = ( uiLeftChromaCbp > 1 ? 1 : 0 ) + ( uiAboveChromaCbp > 1 ? 2 : 0 );
ANOK( CabaEncoder::writeSymbol( uiSymbol, m_cCbpCCModel.get( 2, uiCtx ) ) );
ETRACE_T( "CBP_ChromaAC" );
ETRACE_V( uiSymbol );
ETRACE_N;
if( uiSymbol )
{
rcMbDataAccessBase.getMbData().setMbCbp( ( rcMbDataAccessBase.getMbData().getMbCbp() & 0xF ) | 0x20 );
}
return ( uiSymbol == 1 );
}
Bool
CabacWriter::RQencodeCBP_8x8( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
B8x8Idx c8x8Idx )
{
UInt uiSymbol = ( ( rcMbDataAccess.getMbData().getMbCbp() >> c8x8Idx.b8x8Index() ) & 1 ? 1 : 0 );
UInt uiCurrentCbp = rcMbDataAccessBase.getMbData().getMbCbp();
UInt uiLeftLumaCbp = rcMbDataAccessBase.getLeftLumaCbpFGS ( c8x8Idx );
UInt uiAboveLumaCbp = rcMbDataAccessBase.getAboveLumaCbpFGS( c8x8Idx );
UInt uiCtx = 0;
switch( c8x8Idx.b8x8Index() )
{
case 0: uiCtx = 3 - uiLeftLumaCbp - 2*uiAboveLumaCbp; break;
case 1: uiCtx = 3 - ( uiCurrentCbp &1) - 2*uiAboveLumaCbp; break;
case 2: uiCtx = 3 - uiLeftLumaCbp - ((uiCurrentCbp<<1)&2); break;
case 3: uiCtx = 3 - ((uiCurrentCbp>>2)&1) - ( uiCurrentCbp &2); break;
default: AF();
}
ANOK( CabaEncoder::writeSymbol( uiSymbol, m_cCbpCCModel.get( 0, uiCtx ) ) );
ETRACE_T( "CBP_Luma" );
ETRACE_V( uiSymbol );
ETRACE_N;
if( uiSymbol )
{
rcMbDataAccessBase.getMbData().setMbCbp( rcMbDataAccessBase.getMbData().getMbCbp() | ( 1 << c8x8Idx.b8x8Index() ) );
}
return ( uiSymbol == 1 );
}
ErrVal
CabacWriter::RQencodeDeltaQp( MbDataAccess& rcMbDataAccess)
{
Int iDQp = rcMbDataAccess.getDeltaQp();
UInt uiDQp = ( iDQp ? 1 : 0 );
UInt uiCtx = 0;
RNOK( CabaEncoder::writeSymbol( uiDQp, m_cDeltaQpCCModel.get( 0, uiCtx ) ) );
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_V( uiDQp );
ETRACE_N;
return Err::m_nOK;
}
ErrVal
CabacWriter::RQencode8x8Flag( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase )
{
UInt uiSymbol = rcMbDataAccess.getMbData().isTransformSize8x8() ? 1 : 0;
UInt uiCtx = rcMbDataAccessBase.getCtx8x8Flag();
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cTransSizeCCModel.get( 0, uiCtx ) ) );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -