📄 cabacreader.cpp
字号:
AOF_DBG( rcMbDataAccess.getMbData().isPCM() );
Pel* pDest = rcMbDataAccess.getMbTCoeffs().getPelBuffer();
// get chroma mode
const UInt uiFactor = 8*8;
const UInt uiSize = uiFactor*2*3;
DECRNOK( m_pcBitReadBuffer->samples( pDest, uiSize ) );
DTRACE_N;
rcMbDataAccess.getMbData().setBCBPAll( 1 );
RNOK( CabaDecoder::start() );
return Err::m_nOK;
}
ErrVal CabacReader::transformSize8x8Flag( MbDataAccess& rcMbDataAccess)
{
UInt uiSymbol;
UInt uiCtx = rcMbDataAccess.getCtx8x8Flag();
RNOKCABAC( CabaDecoder::getSymbol( uiSymbol, m_cTransSizeCCModel.get( 0, uiCtx ) ) );
rcMbDataAccess.getMbData().setTransformSize8x8( uiSymbol != 0 );
DTRACE_T( "transformSize8x8Flag:" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( rcMbDataAccess.getMbData().isTransformSize8x8() );
DTRACE_N;
return Err::m_nOK;
}
ErrVal CabacReader::intraPredModeLuma8x8( MbDataAccess& rcMbDataAccess, B8x8Idx 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::residualBlock8x8( MbDataAccess& rcMbDataAccess,
B8x8Idx cIdx )
{
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType() );
const UChar* pucScan = (bFrame) ? g_aucFrameScan64 : g_aucFieldScan64;
DTRACE_T( "LUMA_8x8:" );
DTRACE_V( cIdx.b8x8Index() );
DTRACE_N;
{
UInt uiBitPos = cIdx;
rcMbDataAccess.getMbData().setBCBP( uiBitPos, 1);
rcMbDataAccess.getMbData().setBCBP( uiBitPos+1, 1);
rcMbDataAccess.getMbData().setBCBP( uiBitPos+4, 1);
rcMbDataAccess.getMbData().setBCBP( uiBitPos+5, 1);
}
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get8x8( cIdx );
const Int* pos2ctx_map = (bFrame) ? pos2ctx_map8x8 : pos2ctx_map8x8i;
UInt uiStart = 0;
UInt uiStop = 63;
UInt ui;
{
const UInt uiCtxOffset = 2;
CabacContextModel* pcMapCCModel = ( (bFrame) ? m_cMapCCModel : m_cFldMapCCModel). get( uiCtxOffset );
CabacContextModel* pcLastCCModel = ( (bFrame) ? m_cLastCCModel : m_cFldLastCCModel).get( uiCtxOffset );
for( ui = uiStart; ui < uiStop; ui++ ) // if last coeff is reached, it has to be significant
{
UInt uiSig;
//--- read significance symbol ---
RNOKCABAC( CabaDecoder::getSymbol( uiSig, pcMapCCModel[pos2ctx_map[ui]] ) );
if( uiSig )
{
piCoeff[pucScan[ui]] = uiSig;
UInt uiLast;
RNOKCABAC( CabaDecoder::getSymbol( uiLast, pcLastCCModel[pos2ctx_last8x8[ui]] ) );
if( uiLast )
{
break;
}
}
}
//--- last coefficient must be significant if no last symbol was received ---
if( ui == uiStop )
{
piCoeff[pucScan[ui]] = 1;
}
}
int c1 = 1;
int c2 = 0;
ui++;
const UInt uiCtxOffset = 2;
while( (ui--) != uiStart )
{
Int iIndex = pucScan[ui];
UInt uiCoeff = piCoeff[iIndex];
if( uiCoeff )
{
UInt uiCtx = min (c1,4);
RNOKCABAC( CabaDecoder::getSymbol( uiCoeff, m_cOneCCModel.get( uiCtxOffset, uiCtx ) ) );
if( 1 == uiCoeff )
{
uiCtx = min (c2,4);
RNOKCABAC( CabaDecoder::getExGolombLevel( uiCoeff, m_cAbsCCModel.get( uiCtxOffset, uiCtx ) ) );
uiCoeff += 2;
c1=0;
c2++;
}
else if (c1)
{
uiCoeff++;
c1++;
}
else
{
uiCoeff++;
}
UInt uiSign;
RNOKCABAC( CabaDecoder::getEpSymbol( uiSign ) );
piCoeff[iIndex] = ( uiSign ? -(Int)uiCoeff : (Int)uiCoeff );
}
}
return Err::m_nOK;
}
Bool
CabacReader::RQpeekCbp4x4( MbDataAccess& rcMbDataAccessBase,
LumaIdx cIdx )
{
UInt uiSymbol = 0;
uiSymbol = rcMbDataAccessBase.getMbData().getBCBP( cIdx );
return ( uiSymbol == 1 );
}
ErrVal
CabacReader::RQdecodeBCBP_4x4( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
Bool b8x8,
LumaIdx cIdx,
UInt& ruiSymbol )
{
ruiSymbol = 0;
UInt uiCtx = rcMbDataAccessBase.getCtxCodedBlockBit( cIdx );
RNOKS( CabaDecoder::getSymbol( ruiSymbol, m_cBCbpCCModel.get( type2ctx1[LUMA_SCAN], uiCtx ) ) );
DTRACE_T( "BCBP_4x4" );
DTRACE_V( ruiSymbol );
DTRACE_N;
// current layer
rcMbDataAccess.getMbData() .setBCBP( cIdx, ruiSymbol );
rcMbDataAccessBase.getMbData().setBCBP( cIdx, ruiSymbol );
return Err::m_nOK;
}
ErrVal
CabacReader::RQdecodeBCBP_ChromaDC( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
ChromaIdx cIdx,
UInt& ruiSymbol )
{
UInt uiCtx = rcMbDataAccessBase.getCtxCodedBlockBit( 24 + cIdx.plane() );
ruiSymbol = 0;
RNOKS( CabaDecoder::getSymbol( ruiSymbol, m_cBCbpCCModel.get( type2ctx1[CHROMA_DC], uiCtx ) ) );
DTRACE_T( "BCBP_ChromaDC" );
DTRACE_V( ruiSymbol );
DTRACE_N;
rcMbDataAccess.getMbData() .setBCBP( 24 + cIdx.plane(), ruiSymbol );
rcMbDataAccessBase.getMbData().setBCBP( 24 + cIdx.plane(), ruiSymbol );
return Err::m_nOK;
}
ErrVal
CabacReader::RQdecodeBCBP_ChromaAC( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
ChromaIdx cIdx,
UInt& ruiSymbol )
{
UInt uiCtx = rcMbDataAccessBase.getCtxCodedBlockBit( 16 + cIdx );
ruiSymbol = 0;
RNOKS( CabaDecoder::getSymbol( ruiSymbol, m_cBCbpCCModel.get( type2ctx1[CHROMA_AC], uiCtx ) ) );
DTRACE_T( "BCBP_ChromaAC" );
DTRACE_V( ruiSymbol );
DTRACE_N;
rcMbDataAccess.getMbData() .setBCBP( 16 + cIdx, ruiSymbol );
rcMbDataAccessBase.getMbData().setBCBP( 16 + cIdx, ruiSymbol );
return Err::m_nOK;
}
ErrVal
CabacReader::RQdecodeCBP_Chroma ( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
UInt& ruiSymbol )
{
UInt uiLeftChromaCbp = rcMbDataAccessBase.getLeftChromaCbpFGS ();
UInt uiAboveChromaCbp = rcMbDataAccessBase.getAboveChromaCbpFGS();
UInt uiCtx = ( uiLeftChromaCbp > 0 ? 1 : 0 ) + ( uiAboveChromaCbp > 0 ? 2 : 0 );
ruiSymbol = 0;
RNOKS( CabaDecoder::getSymbol( ruiSymbol, m_cCbpCCModel.get( 1, uiCtx ) ) );
DTRACE_T( "CBP_Chroma" );
DTRACE_V( ruiSymbol );
DTRACE_N;
if( ruiSymbol )
{
rcMbDataAccess .getMbData().setMbCbp( rcMbDataAccess .getMbData().getMbCbp() | 0x10 );
rcMbDataAccessBase.getMbData().setMbCbp( rcMbDataAccessBase.getMbData().getMbCbp() | 0x10 );
}
return Err::m_nOK;
}
ErrVal
CabacReader::RQdecodeCBP_ChromaAC ( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
UInt& ruiSymbol )
{
ruiSymbol = 0;
UInt uiLeftChromaCbp = rcMbDataAccessBase.getLeftChromaCbpFGS ();
UInt uiAboveChromaCbp = rcMbDataAccessBase.getAboveChromaCbpFGS();
UInt uiCtx = ( uiLeftChromaCbp > 1 ? 1 : 0 ) + ( uiAboveChromaCbp > 1 ? 2 : 0 );
RNOKS( CabaDecoder::getSymbol( ruiSymbol, m_cCbpCCModel.get( 2, uiCtx ) ) );
DTRACE_T( "CBP_ChromaAC" );
DTRACE_V( ruiSymbol );
DTRACE_N;
if( ruiSymbol )
{
rcMbDataAccess .getMbData().setMbCbp( ( rcMbDataAccess .getMbData().getMbCbp() & 0xF ) | 0x20 );
rcMbDataAccessBase.getMbData().setMbCbp( ( rcMbDataAccessBase.getMbData().getMbCbp() & 0xF ) | 0x20 );
}
return Err::m_nOK;
}
ErrVal
CabacReader::RQdecodeCBP_8x8( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
B8x8Idx c8x8Idx )
{
UInt uiSymbol = 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();
}
RNOKS( CabaDecoder::getSymbol( uiSymbol, m_cCbpCCModel.get( 0, uiCtx ) ) );
DTRACE_T( "CBP_Luma" );
DTRACE_V( uiSymbol );
DTRACE_N;
if( uiSymbol )
{
rcMbDataAccess .getMbData().setMbCbp( rcMbDataAccess .getMbData().getMbCbp() | ( 1 << c8x8Idx.b8x8Index() ) );
rcMbDataAccessBase.getMbData().setMbCbp( rcMbDataAccessBase.getMbData().getMbCbp() | ( 1 << c8x8Idx.b8x8Index() ) );
}
return Err::m_nOK;
}
ErrVal
CabacReader::RQdecodeDeltaQp( MbDataAccess& rcMbDataAccess)
{
UInt uiDQp = 0;
Int iDQp = 0;
UInt uiCtx = 0;
RNOKS( CabaDecoder::getSymbol( uiDQp, m_cDeltaQpCCModel.get( 0, uiCtx ) ) );
if( uiDQp )
{
RNOKS( CabaDecoder::getUnarySymbol( uiDQp, &m_cDeltaQpCCModel.get( 0, 2 ), 1 ) );
iDQp = (uiDQp + 2) / 2;
if( uiDQp & 1 )
{
iDQp = -iDQp;
}
}
DTRACE_T( "DQP" );
DTRACE_V( uiDQp );
DTRACE_N;
rcMbDataAccess.addDeltaQp( iDQp );
return Err::m_nOK;
}
ErrVal
CabacReader::RQdecode8x8Flag( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase )
{
UInt uiSymbol = 0;
UInt uiCtx = rcMbDataAccessBase.getCtx8x8Flag();
RNOKS( CabaDecoder::getSymbol( uiSymbol, m_cTransSizeCCModel.get( 0, uiCtx ) ) );
DTRACE_T( "TRAFO_8x8" );
DTRACE_V( uiSymbol );
DTRACE_N;
rcMbDataAccess .getMbData().setTransformSize8x8( uiSymbol == 1 );
rcMbDataAccessBase.getMbData().setTransformSize8x8( uiSymbol == 1 );
return Err::m_nOK;
}
ErrVal
CabacReader::RQdecodeTermBit ( UInt& ruiBit )
{
RNOKS( CabaDecoder::getTerminateBufferBit( ruiBit ) );
DTRACE_T( "EOS" );
DTRACE_V( ruiBit );
DTRACE_N;
return Err::m_nOK;
}
ErrVal
CabacReader::RQdecodeNewTCoeff_8x8( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase,
B8x8Idx c8x8Idx,
UInt uiScanIndex,
Bool& rbLast,
UInt& ruiNumCoefRead )
{
TCoeff* piCoeff = rcMbDataAccess .getMbTCoeffs().get8x8( c8x8Idx );
TCoeff* piCoeffBase = rcMbDataAccessBase.getMbTCoeffs().get8x8( c8x8Idx );
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType());
const UChar* pucScan = (bFrame) ? g_aucFrameScan64 : g_aucFieldScan64;
const UInt uiCtxOffset = 2;
ROT( piCoeffBase[pucScan[uiScanIndex]] );
DTRACE_T( "LUMA_8x8_NEW" );
DTRACE_V( c8x8Idx.b8x8Index() );
DTRACE_V( uiScanIndex );
DTRACE_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 );
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -