📄 cabacwriter.cpp
字号:
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;
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 );
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[ g_aucFrameScan[ui] ] )
if( piCoeff[ g_aucFrameScan[ui] ] && !piBCoeff[ g_aucFrameScan[ui] ] )
{
uiSymbol = 1;
break;
}
}
ANOK( CabaEncoder::writeSymbol( uiSymbol, m_cBCbpCCModel.get( type2ctx1[CHROMA_AC], uiCtx ) ) );
ETRACE_T( "BCBP_ChromaAC" );
ETRACE_V( uiSymbol );
ETRACE_N;
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 ) ) );
ETRACE_T( "TRAFO_8x8" );
ETRACE_V( uiSymbol );
ETRACE_N;
rcMbDataAccessBase.getMbData().setTransformSize8x8( rcMbDataAccess.getMbData().isTransformSize8x8() );
return Err::m_nOK;
}
ErrVal
CabacWriter::RQencodeTermBit ( UInt uiBit )
{
RNOK( CabaEncoder::writeTerminatingBit( uiBit ) );
ETRACE_T( "EOS" );
ETRACE_V( uiBit );
ETRACE_N;
return Err::m_nOK;
}
ErrVal
CabacWriter::RQeo8b( Bool& bEob )
{
bEob = false;
return Err::m_nOK;
}
ErrVal
CabacWriter::RQencodeNewTCoeff_8x8( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
B8x8Idx c8x8Idx,
UInt uiScanIndex,
Bool& rbLast,
UInt& ruiNumCoefWritten )
{
TCoeff* piCoeff = rcMbDataAccess .getMbTCoeffs().get8x8( c8x8Idx );
TCoeff* piCoeffBase = rcMbDataAccessBase.getMbTCoeffs().get8x8( c8x8Idx );
const UChar* pucScan = g_aucFrameScan64;
ROT( piCoeffBase[pucScan[uiScanIndex]] );
ETRACE_T( "LUMA_8x8_NEW" );
ETRACE_V( c8x8Idx.b8x8Index() );
ETRACE_V( uiScanIndex );
ETRACE_N;
rcMbDataAccessBase.getMbData().setBCBP( c8x8Idx.b4x4(), 1 );
rcMbDataAccessBase.getMbData().setBCBP( c8x8Idx.b4x4()+1, 1 );
rcMbDataAccessBase.getMbData().setBCBP( c8x8Idx.b4x4()+4, 1 );
rcMbDataAccessBase.getMbData().setBCBP( c8x8Idx.b4x4()+5, 1 );
RNOK( xRQencodeNewTCoeffs( piCoeff, piCoeffBase, 64, 2, 2, pucScan, uiScanIndex, rbLast, ruiNumCoefWritten, pos2ctx_last8x8, pos2ctx_map8x8, 4 ) );
return Err::m_nOK;
}
ErrVal
CabacWriter::RQencodeTCoeffRef_8x8( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
B8x8Idx c8x8Idx,
UInt uiScanIndex )
{
TCoeff* piCoeff = rcMbDataAccess .getMbTCoeffs().get8x8( c8x8Idx );
TCoeff* piCoeffBase = rcMbDataAccessBase.getMbTCoeffs().get8x8( c8x8Idx );
const UChar* pucScan = g_aucFrameScan64;
ETRACE_T( "LUMA_8x8_REF" );
ETRACE_V( c8x8Idx.b8x8Index() );
ETRACE_V( uiScanIndex );
ETRACE_N;
UInt uiSig = ( piCoeff[pucScan[uiScanIndex]] ? 1 : 0 );
RNOK( CabaEncoder::writeSymbol( uiSig, m_cRefCCModel.get( 0, 0 ) ) );
if( uiSig )
{
UInt uiSignBL = ( piCoeffBase[pucScan[uiScanIndex]] < 0 ? 1 : 0 );
UInt uiSignEL = ( piCoeff [pucScan[uiScanIndex]] < 0 ? 1 : 0 );
UInt uiSymbol = ( uiSignBL ^ uiSignEL );
RNOK( CabaEncoder::writeSymbol( uiSymbol, m_cRefCCModel.get( 0, 1 ) ) );
}
return Err::m_nOK;
}
ErrVal
CabacWriter::RQencodeNewTCoeff_Luma ( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
ResidualMode eResidualMode,
LumaIdx cIdx,
UInt uiScanIndex,
Bool& rbLast,
UInt& ruiNumCoefWritten )
{
TCoeff* piCoeff = rcMbDataAccess .getMbTCoeffs().get( cIdx );
TCoeff* piCoeffBase = rcMbDataAccessBase.getMbTCoeffs().get( cIdx );
const UChar* pucScan = g_aucFrameScan;
//UInt uiStart = 0;
UInt uiStop = 16;
ROT( piCoeffBase[pucScan[uiScanIndex]] );
ETRACE_T( "LUMA_4x4_NEW" );
ETRACE_V( cIdx.b4x4() );
ETRACE_V( uiScanIndex );
ETRACE_N;
RNOK( xRQencodeNewTCoeffs( piCoeff, piCoeffBase, uiStop, type2ctx1[eResidualMode], type2ctx2[eResidualMode], pucScan, uiScanIndex, rbLast, ruiNumCoefWritten ) );
return Err::m_nOK;
}
ErrVal
CabacWriter::RQencodeTCoeffRef_Luma ( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
LumaIdx cIdx,
UInt uiScanIndex )
{
TCoeff* piCoeff = rcMbDataAccess .getMbTCoeffs().get( cIdx );
TCoeff* piCoeffBase = rcMbDataAccessBase.getMbTCoeffs().get( cIdx );
const UChar* pucScan = g_aucFrameScan;
ETRACE_T( "LUMA_4x4_REF" );
ETRACE_V( cIdx.b4x4() );
ETRACE_V( uiScanIndex );
ETRACE_N;
RNOK( xRQencodeTCoeffsRef( piCoeff, piCoeffBase, pucScan, uiScanIndex ) );
return Err::m_nOK;
}
ErrVal
CabacWriter::RQencodeNewTCoeff_Chroma ( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
ResidualMode eResidualMode,
ChromaIdx cIdx,
UInt uiScanIndex,
Bool& rbLast,
UInt& ruiNumCoefWritten )
{
TCoeff* piCoeff = rcMbDataAccess .getMbTCoeffs().get( cIdx );
TCoeff* piCoeffBase = rcMbDataAccessBase.getMbTCoeffs().get( cIdx );
const UChar* pucScan = ( eResidualMode == CHROMA_DC ? g_aucIndexChromaDCScan : g_aucFrameScan );
//UInt uiStart = ( eResidualMode == CHROMA_AC ? 1 : 0 ); //unused variable. mwi
UInt uiStop = ( eResidualMode == CHROMA_DC ? 4 : 16 );
ROT( piCoeffBase[pucScan[uiScanIndex]] );
ETRACE_T( "CHROMA_4x4_NEW" );
ETRACE_V( cIdx );
ETRACE_V( uiScanIndex );
ETRACE_N;
RNOK( xRQencodeNewTCoeffs( piCoeff, piCoeffBase, uiStop, type2ctx1[eResidualMode], type2ctx2[eResidualMode], pucScan, uiScanIndex, rbLast, ruiNumCoefWritten ) );
return Err::m_nOK;
}
ErrVal
CabacWriter::RQencodeTCoeffRef_Chroma ( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
ResidualMode eResidualMode,
ChromaIdx cIdx,
UInt uiScanIndex )
{
TCoeff* piCoeff = rcMbDataAccess .getMbTCoeffs().get( cIdx );
TCoeff* piCoeffBase = rcMbDataAccessBase.getMbTCoeffs().get( cIdx );
const UChar* pucScan = ( eResidualMode == CHROMA_DC ? g_aucIndexChromaDCScan : g_aucFrameScan );
ETRACE_T( "CHROMA_4x4_REF" );
ETRACE_V( cIdx );
ETRACE_V( uiScanIndex );
ETRACE_N;
RNOK( xRQencodeTCoeffsRef( piCoeff, piCoeffBase, pucScan, uiScanIndex ) );
return Err::m_nOK;
}
ErrVal
CabacWriter::xRQencodeNewTCoeffs( TCoeff* piCoeff,
TCoeff* piCoeffBase,
UInt uiStop,
UInt uiCtx1,
UInt uiCtx2,
const UChar* pucScan,
UInt uiScanIndex,
Bool& rbLast,
UInt& ruiNumCoefWritten,
const int* paiCtxEobMap,
const int* paiCtxSigMap,
UInt uiStride )
{
ruiNumCoefWritten = 0;
if( rbLast )
{
rbLast = true;
for( UInt ui = uiScanIndex; ui < uiStop; ui+=uiStride )
{
if( piCoeff[pucScan[ui]] && ! piCoeffBase[pucScan[ui]] )
{
rbLast = false;
break;
}
}
RNOK( CabaEncoder::writeSymbol( rbLast, m_cLastCCModel.get( uiCtx2, paiCtxEobMap[uiScanIndex-1] ) ) );
ROTRS(rbLast, Err::m_nOK);
} else
rbLast = false;
//===== SIGNIFICANCE BIT ======
UInt uiSig;
do
{
ruiNumCoefWritten++;
UInt uiLastScanPosition = uiScanIndex + uiStride;
while (uiLastScanPosition < uiStop && piCoeffBase[pucScan[uiLastScanPosition]])
uiLastScanPosition += uiStride;
if (uiLastScanPosition < uiStop)
{
uiSig = piCoeff[pucScan[uiScanIndex] ] ? 1 : 0;
RNOK( CabaEncoder::writeSymbol( uiSig, m_cMapCCModel.get( uiCtx2, paiCtxSigMap[uiScanIndex] ) ) );
} else {
uiSig = 1;
}
if( uiSig )
{
break;
}
uiScanIn
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -