cabacreader.cpp
来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 2,065 行 · 第 1/4 页
CPP
2,065 行
RNOKCABAC( CabaDecoder::getSymbol( uiBit, m_cCbpCCModel.get( ++uiCtx, a + b ) ) );
uiCbp += (1 == uiBit) ? 32 : 16;
}
if( !uiCbp )
{
m_uiLastDQpNonZero = 0; // no DeltaQP for Macroblocks with zero Cbp
}
AOF_DBG( 48 >= uiCbp );
DTRACE_T( "Cbp" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( uiCbp );
DTRACE_N;
rcMbDataAccess.getMbData().setMbCbp( uiCbp );
return Err::m_nOK;
}
ErrVal CabacReader::residualBlock( MbDataAccess& rcMbDataAccess,
LumaIdx cIdx,
ResidualMode eResidualMode,
UInt& ruiMbExtCbp )
{
const UChar* pucScan = ( eResidualMode==LUMA_I16_DC ? g_aucLumaFrameDCScan : g_aucFrameScan );
Bool bCoded;
DTRACE_T( "LUMA:" );
DTRACE_V( cIdx );
DTRACE_N;
DECRNOK( xReadBCbp( rcMbDataAccess, bCoded, eResidualMode, cIdx ) );
if( ! bCoded )
{
ruiMbExtCbp &= ~(1 << cIdx.b4x4() );
return Err::m_nOK;
}
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get( cIdx );
DECRNOK( xReadCoeff( piCoeff, eResidualMode, pucScan ) );
return Err::m_nOK;
}
ErrVal CabacReader::residualBlock( MbDataAccess& rcMbDataAccess,
ChromaIdx cIdx,
ResidualMode eResidualMode
)
{
const UChar* pucScan = ( eResidualMode == CHROMA_DC ? g_aucIndexChromaDCScan : g_aucFrameScan );
Bool bCoded;
DTRACE_T( eResidualMode == CHROMA_DC ? "CHROMA_DC:" : "CHROMA_AC:" );
DTRACE_V( cIdx );
DTRACE_N;
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get( cIdx );
DECRNOK( xReadBCbp( rcMbDataAccess, bCoded, eResidualMode, cIdx ) );
ROTRS( ! bCoded, Err::m_nOK );
DECRNOK( xReadCoeff( piCoeff, eResidualMode, pucScan ) );
return Err::m_nOK;
}
ErrVal CabacReader::deltaQp( MbDataAccess& rcMbDataAccess )
{
UInt uiDQp;
Int iDQp = 0;
UInt uiCtx = m_uiLastDQpNonZero;
RNOKCABAC( CabaDecoder::getSymbol( uiDQp, m_cDeltaQpCCModel.get( 0, uiCtx ) ) );
m_uiLastDQpNonZero = uiDQp;
if( uiDQp )
{
RNOKCABAC( CabaDecoder::getUnarySymbol( uiDQp, &m_cDeltaQpCCModel.get( 0, 2 ), 1 ) );
iDQp = (uiDQp + 2) / 2;
if( uiDQp & 1 )
{
iDQp = -iDQp;
}
}
DTRACE_T( "DQp" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE ( iDQp );
DTRACE_N;
rcMbDataAccess.addDeltaQp( iDQp );
Quantizer::setQp( rcMbDataAccess, false );
return Err::m_nOK;
}
Bool CabacReader::isEndOfSlice()
{
UInt uiEOS;
CabaDecoder::getTerminateBufferBit( uiEOS );
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;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?