📄 cabacreader.cpp
字号:
DTRACE_T( "EOS" );
DTRACE_CODE( uiEOS );
DTRACE_N;
return (uiEOS == 1);
}
ErrVal CabacReader::xReadBCbp( MbDataAccess& rcMbDataAccess, Bool& rbCoded, ResidualMode eResidualMode, ChromaIdx cIdx )
{
UInt uiBitPos;
if( CHROMA_AC == eResidualMode )
{
uiBitPos = 16 + cIdx;
}
else if( CHROMA_DC == eResidualMode )
{
uiBitPos = 24 + cIdx.plane();
}
else
{
// full stop
AF();
return Err::m_nERR;
}
UInt uiCtx = rcMbDataAccess.getCtxCodedBlockBit( uiBitPos );
UInt uiBit;
RNOKCABAC( CabaDecoder::getSymbol( uiBit, m_cBCbpCCModel.get( type2ctx1[ eResidualMode ], uiCtx) ) );
rbCoded = ( uiBit == 1 );
rcMbDataAccess.getMbData().setBCBP( uiBitPos, uiBit);
return Err::m_nOK;
}
ErrVal CabacReader::xReadBCbp( MbDataAccess& rcMbDataAccess, Bool& rbCoded, ResidualMode eResidualMode, LumaIdx cIdx )
{
UInt uiBitPos;
if( LUMA_SCAN == eResidualMode || LUMA_I16_AC == eResidualMode )
{
uiBitPos = cIdx;
}
else if( LUMA_I16_DC == eResidualMode )
{
uiBitPos = 26;
}
else
{
// full stop
AF();
return Err::m_nERR;
}
UInt uiCtx = rcMbDataAccess.getCtxCodedBlockBit( uiBitPos );
UInt uiBit;
RNOKCABAC( CabaDecoder::getSymbol( uiBit, m_cBCbpCCModel.get( type2ctx1[ eResidualMode ], uiCtx) ) );
rbCoded = ( uiBit == 1 );
rcMbDataAccess.getMbData().setBCBP( uiBitPos, uiBit);
return Err::m_nOK;
}
ErrVal CabacReader::xReadCoeff( TCoeff* piCoeff,
ResidualMode eResidualMode,
const UChar* pucScan
)
{
CabacContextModel2DBuffer& rcMapCCModel = m_cMapCCModel;
CabacContextModel2DBuffer& rcLastCCModel = m_cLastCCModel;
UInt uiStart = 0;
UInt uiStop = 15;
if( CHROMA_AC == eResidualMode ||
LUMA_I16_AC == eResidualMode )
{
uiStart = 1;
}
if( CHROMA_DC == eResidualMode )
{
uiStop = 3;
}
UInt ui;
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, rcMapCCModel.get( type2ctx2[eResidualMode], ui ) ) );
if( uiSig )
{
piCoeff[pucScan[ui]] = uiSig;
UInt uiLast;
RNOKCABAC( CabaDecoder::getSymbol( uiLast, rcLastCCModel.get( type2ctx2[eResidualMode], 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++;
while( (ui--) != uiStart )
{
UInt uiCoeff = piCoeff[pucScan[ui]];
if( uiCoeff )
{
UInt uiCtx = min (c1,4);
RNOKCABAC( CabaDecoder::getSymbol( uiCoeff, m_cOneCCModel.get( type2ctx1[eResidualMode], uiCtx ) ) );
if( 1 == uiCoeff )
{
uiCtx = min (c2,4);
RNOKCABAC( CabaDecoder::getExGolombLevel( uiCoeff, m_cAbsCCModel.get( type2ctx1[eResidualMode], uiCtx ) ) );
uiCoeff += 2;
c1=0;
c2++;
}
else if (c1)
{
uiCoeff++;
c1++;
}
else
{
uiCoeff++;
}
UInt uiSign;
RNOKCABAC( CabaDecoder::getEpSymbol( uiSign ) );
piCoeff[pucScan[ui]] = ( uiSign ? -(Int)uiCoeff : (Int)uiCoeff );
}
}
return Err::m_nOK;
}
ErrVal CabacReader::samplesPCM( MbDataAccess& rcMbDataAccess )
{
RNOK( CabaDecoder::finish() );
DTRACE_POS;
DTRACE_T( " PCM SAMPLES: " );
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 UChar* pucScan = g_aucFrameScan64;
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 = pos2ctx_map8x8;
UInt uiStart = 0;
UInt uiStop = 63;
UInt ui;
{
const UInt uiCtxOffset = 2;
CabacContextModel* pcMapCCModel = m_cMapCCModel .get( uiCtxOffset );
CabacContextModel* pcLastCCModel = m_cLastCCModel.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 );
}
Bool
CabacReader::RQdecodeBCBP_4x4( MbDataAccess& rcMbDataAccessBase,
LumaIdx cIdx )
{
UInt uiSymbol = 0;
UInt uiCtx = rcMbDataAccessBase.getCtxCodedBlockBit( cIdx );
ANOK( CabaDecoder::getSymbol( uiSymbol, m_cBCbpCCModel.get( type2ctx1[LUMA_SCAN], uiCtx ) ) );
DTRACE_T( "BCBP_4x4" );
DTRACE_V( uiSymbol );
DTRACE_N;
rcMbDataAccessBase.getMbData().setBCBP( cIdx, uiSymbol );
return ( uiSymbol == 1 );
}
Bool
CabacReader::RQdecodeBCBP_ChromaDC( MbDataAccess& rcMbDataAccessBase,
ChromaIdx cIdx )
{
UInt uiSymbol = 0;
UInt uiCtx = rcMbDataAccessBase.getCtxCodedBlockBit( 24 + cIdx.plane() );
ANOK( CabaDecoder::getSymbol( uiSymbol, m_cBCbpCCModel.get( type2ctx1[CHROMA_DC], uiCtx ) ) );
DTRACE_T( "BCBP_ChromaDC" );
DTRACE_V( uiSymbol );
DTRACE_N;
rcMbDataAccessBase.getMbData().setBCBP( 24 + cIdx.plane(), uiSymbol );
return ( uiSymbol == 1 );
}
Bool
CabacReader::RQdecodeBCBP_ChromaAC( MbDataAccess& rcMbDataAccessBase,
ChromaIdx cIdx )
{
UInt uiSymbol = 0;
UInt uiCtx = rcMbDataAccessBase.getCtxCodedBlockBit( 16 + cIdx );
ANOK( CabaDecoder::getSymbol( uiSymbol, m_cBCbpCCModel.get( type2ctx1[CHROMA_AC], uiCtx ) ) );
DTRACE_T( "BCBP_ChromaAC" );
DTRACE_V( uiSymbol );
DTRACE_N;
rcMbDataAccessBase.getMbData().setBCBP( 16 + cIdx, uiSymbol );
return ( uiSymbol == 1 );
}
Bool
CabacReader::RQdecodeCBP_Chroma( MbDataAccess& rcMbDataAccess,
MbDataAccess& rcMbDataAccessBase )
{
UInt uiSymbol = 0;
UInt uiLeftChromaCbp = rcMbDataAccessBase.getLeftChromaCbpFGS ();
UInt uiAboveChromaCbp = rcMbDataAccessBase.getAboveChromaCbpFGS();
UInt uiCtx = ( uiLeftChromaCbp > 0 ? 1 : 0 ) + ( uiAboveChromaCbp > 0 ? 2 : 0 );
ANOK( CabaDecoder::getSymbol( uiSymbol, m_cCbpCCModel.get( 1, uiCtx ) ) );
DTRACE_T( "CBP_Chroma" );
DTRACE_V( uiSymbol );
DTRACE_N;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -