📄 cabacreader.cpp
字号:
const UChar* pucScan = ( eResidualMode == LUMA_I16_DC ? ((bFrame) ? g_aucLumaFrameDCScan : g_aucLumaFieldDCScan) : ((bFrame) ? g_aucFrameScan : g_aucFieldScan) );
Bool bCoded;
DTRACE_T( "LUMA:" );
DTRACE_V( cIdx );
DTRACE_N;
DECRNOK( xReadBCbp( rcMbDataAccess, bCoded, eResidualMode, cIdx, uiStart, uiStop ) );
if( ! bCoded )
{
ruiMbExtCbp &= ~(1 << cIdx.b4x4() );
return Err::m_nOK;
}
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get( cIdx );
DECRNOK( xReadCoeff( piCoeff, eResidualMode, pucScan, bFrame, uiStart, uiStop ) );
return Err::m_nOK;
}
ErrVal CabacReader::residualBlock( MbDataAccess& rcMbDataAccess,
ChromaIdx cIdx,
ResidualMode eResidualMode,
UInt uiStart,
UInt uiStop )
{
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType() );
const UChar* pucScan = ( eResidualMode == CHROMA_DC ? g_aucIndexChromaDCScan : ((bFrame) ? g_aucFrameScan : g_aucFieldScan) );
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, uiStart, uiStop ) );
ROTRS( ! bCoded, Err::m_nOK );
DECRNOK( xReadCoeff( piCoeff, eResidualMode, pucScan, bFrame, uiStart, uiStop ) );
return Err::m_nOK;
}
ErrVal CabacReader::deltaQp( MbDataAccess& rcMbDataAccess )
{
UInt uiDQp;
Int iDQp = 0;
UInt uiCtx = m_uiLastDQpNonZero;
RNOK( CabaDecoder::getSymbol( uiDQp, m_cDeltaQpCCModel.get( 0, uiCtx ) ) );
m_uiLastDQpNonZero = uiDQp;
if( uiDQp )
{
RNOK( 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 uiStart, UInt uiStop )
{
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, uiStart, uiStop );
UInt uiBit;
RNOK( 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 uiStart, UInt uiStop )
{
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, uiStart, uiStop );
UInt uiBit;
RNOK( 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,
Bool bFrame,
UInt uiStart,
UInt uiStop )
{
CabacContextModel2DBuffer& rcMapCCModel = ( (bFrame) ? m_cMapCCModel : m_cFldMapCCModel );
CabacContextModel2DBuffer& rcLastCCModel = ( (bFrame) ? m_cLastCCModel : m_cFldLastCCModel );
if( CHROMA_DC == eResidualMode || LUMA_I16_DC == eResidualMode )
{
if( uiStart == 0 && uiStop > 0 )
{
uiStop = CHROMA_DC == eResidualMode ? 3 : 15;
}
else
{
ROT( 1 );
}
}
else
{
if( CHROMA_AC == eResidualMode || LUMA_I16_AC == eResidualMode )
{
if( uiStop > 1 )
{
uiStart = max( 1, uiStart );
}
else
{
ROT( 1 );
}
}
uiStop -= 1;
}
UInt ui;
for( ui = uiStart; ui < uiStop; ui++ ) // if last coeff is reached, it has to be significant
{
UInt uiSig;
//--- read significance symbol ---
RNOK( CabaDecoder::getSymbol( uiSig, rcMapCCModel.get( type2ctx2[eResidualMode], ui ) ) );
if( uiSig )
{
piCoeff[pucScan[ui]] = uiSig;
UInt uiLast;
RNOK( 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);
RNOK( CabaDecoder::getSymbol( uiCoeff, m_cOneCCModel.get( type2ctx1[eResidualMode], uiCtx ) ) );
if( 1 == uiCoeff )
{
uiCtx = min (c2,4);
RNOK( CabaDecoder::getExGolombLevel( uiCoeff, m_cAbsCCModel.get( type2ctx1[eResidualMode], uiCtx ) ) );
uiCoeff += 2;
c1=0;
c2++;
}
else if (c1)
{
uiCoeff++;
c1++;
}
else
{
uiCoeff++;
}
UInt uiSign;
RNOK( 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();
RNOK( 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;
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 0 ) ) );
if( ! uiSymbol )
{
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 1 ) ) );
uiIPredMode = uiSymbol;
RNOK( CabaDecoder::getSymbol( uiSymbol, m_cIntraPredCCModel.get( 0, 1 ) ) );
uiIPredMode |= (uiSymbol << 1);
RNOK( 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,
UInt uiStart,
UInt uiStop )
{
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;
ROT( uiStart == uiStop );
uiStart <<= 2;
uiStop <<= 2;
uiStop -= 1;
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 ---
RNOK( CabaDecoder::getSymbol( uiSig, pcMapCCModel[pos2ctx_map[ui]] ) );
if( uiSig )
{
piCoeff[pucScan[ui]] = uiSig;
UInt uiLast;
RNOK( 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);
RNOK( CabaDecoder::getSymbol( uiCoeff, m_cOneCCModel.get( uiCtxOffset, uiCtx ) ) );
if( 1 == uiCoeff )
{
uiCtx = min (c2,4);
RNOK( CabaDecoder::getExGolombLevel( uiCoeff, m_cAbsCCModel.get( uiCtxOffset, uiCtx ) ) );
uiCoeff += 2;
c1=0;
c2++;
}
else if (c1)
{
uiCoeff++;
c1++;
}
else
{
uiCoeff++;
}
UInt uiSign;
RNOK( CabaDecoder::getEpSymbol( uiSign ) );
piCoeff[iIndex] = ( uiSign ? -(Int)uiCoeff : (Int)uiCoeff );
}
}
return Err::m_nOK;
}
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -