📄 uvlcreader.cpp
字号:
ErrVal UvlcReader::getUvlc( UInt& ruiCode, Char* pcTraceString )
{
DTRACE_TH( pcTraceString );
DECRNOK( xGetUvlcCode( ruiCode ) );
DTRACE_N;
return Err::m_nOK;
}
ErrVal UvlcReader::getSvlc( Int& riCode, Char* pcTraceString )
{
DTRACE_TH( pcTraceString );
DECRNOK( xGetSvlcCode( riCode ) );
DTRACE_N;
return Err::m_nOK;
}
ErrVal UvlcReader::readByteAlign()
{
UInt uiCode;
UInt uiLength = m_pcBitReadBuffer->getBitsUntilByteAligned();
ROTRS( 0 == uiLength, Err::m_nOK );
DECRNOK( m_pcBitReadBuffer->get( uiCode, uiLength ) );
DECROF( (UInt(1<<uiLength)>>1) == uiCode );
DTRACE_POS;
DTRACE_T( "SEI: alignment_bits" );
DTRACE_TY( " u(v)" );
DTRACE_CODE( uiCode );
DTRACE_BITS( uiCode, uiLength );
DTRACE_N;
DTRACE_COUNT( uiLength );
return Err::m_nOK;
}
//JVT-T073 {
ErrVal UvlcReader::readZeroByteAlign()
{
UInt uiCode;
UInt uiLength = m_pcBitReadBuffer->getBitsUntilByteAligned();
ROTRS( 0 == uiLength, Err::m_nOK );
DECRNOK( m_pcBitReadBuffer->get( uiCode, uiLength ) );
DTRACE_POS;
DTRACE_T( "NestingSEI: zero_alignment_bits" );
DTRACE_TY( " u(v)" );
DTRACE_CODE( uiCode );
DTRACE_BITS( uiCode, uiLength );
DTRACE_N;
DTRACE_COUNT( uiLength );
return Err::m_nOK;
}
//JVT-T073 }
ErrVal UvlcReader::startSlice( const SliceHeader& rcSliceHeader )
{
m_bRunLengthCoding = ! rcSliceHeader.isIntra();
m_uiRun = 0;
// for FGS refinement coding
RQreset( rcSliceHeader );
return Err::m_nOK;
}
ErrVal UvlcReader::refFrame( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx )
{
UInt uiRefFrame = 0;
RNOK( xGetRefFrame( 2 == rcMbDataAccess.getNumActiveRef( eLstIdx ), uiRefFrame, eLstIdx ) );
rcMbDataAccess.getMbMotionData( eLstIdx ).setRefIdx( ++uiRefFrame );
return Err::m_nOK;
}
ErrVal UvlcReader::refFrame( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx16x8 eParIdx )
{
UInt uiRefFrame = 0;
RNOK( xGetRefFrame( 2 == rcMbDataAccess.getNumActiveRef( eLstIdx ), uiRefFrame, eLstIdx ) );
rcMbDataAccess.getMbMotionData( eLstIdx ).setRefIdx( ++uiRefFrame, eParIdx );
return Err::m_nOK;
}
ErrVal UvlcReader::refFrame( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x16 eParIdx )
{
UInt uiRefFrame = 0;
RNOK( xGetRefFrame( 2 == rcMbDataAccess.getNumActiveRef( eLstIdx ), uiRefFrame, eLstIdx ) );
rcMbDataAccess.getMbMotionData( eLstIdx ).setRefIdx( ++uiRefFrame, eParIdx );
return Err::m_nOK;
}
ErrVal UvlcReader::refFrame( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx )
{
UInt uiRefFrame = 0;
RNOK( xGetRefFrame( 2 == rcMbDataAccess.getNumActiveRef( eLstIdx ), uiRefFrame, eLstIdx ) );
rcMbDataAccess.getMbMotionData( eLstIdx ).setRefIdx( ++uiRefFrame, eParIdx );
return Err::m_nOK;
}
ErrVal UvlcReader::motionPredFlag( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx )
{
Bool bFlag;
RNOK( xGetMotionPredFlag( bFlag ) );
rcMbDataAccess.getMbMotionData( eLstIdx ).setMotPredFlag( bFlag );
return Err::m_nOK;
}
ErrVal UvlcReader::motionPredFlag( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx16x8 eParIdx )
{
Bool bFlag;
RNOK( xGetMotionPredFlag( bFlag ) );
rcMbDataAccess.getMbMotionData( eLstIdx ).setMotPredFlag( bFlag, eParIdx );
return Err::m_nOK;
}
ErrVal UvlcReader::motionPredFlag( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x16 eParIdx )
{
Bool bFlag;
RNOK( xGetMotionPredFlag( bFlag ) );
rcMbDataAccess.getMbMotionData( eLstIdx ).setMotPredFlag( bFlag, eParIdx );
return Err::m_nOK;
}
ErrVal UvlcReader::motionPredFlag( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx )
{
Bool bFlag;
RNOK( xGetMotionPredFlag( bFlag ) );
rcMbDataAccess.getMbMotionData( eLstIdx ).setMotPredFlag( bFlag, eParIdx );
return Err::m_nOK;
}
ErrVal UvlcReader::blockModes( MbDataAccess& rcMbDataAccess )
{
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
DTRACE_T( "BlockMode" );
UInt uiBlockMode = 0;
RNOK( xGetUvlcCode( uiBlockMode ) );
rcMbDataAccess.setConvertBlkMode( c8x8Idx.b8x8Index(), uiBlockMode );
DTRACE_N;
}
return Err::m_nOK;
}
Bool UvlcReader::isMbSkipped( MbDataAccess& rcMbDataAccess )
{
rcMbDataAccess.getMbTCoeffs().setAllCoeffCount( 0 );
ROFRS( m_bRunLengthCoding, false );
if ( m_uiRun > 0 )
{
m_uiRun--;
} else {
DTRACE_T( "Run" );
ANOK( xGetUvlcCode( m_uiRun ) );
DTRACE_N;
}
rcMbDataAccess.getMbData().setSkipFlag( m_uiRun != 0 );
return ( rcMbDataAccess.getMbData().getSkipFlag() );
}
Bool UvlcReader::isBLSkipped( MbDataAccess& rcMbDataAccess )
{
UInt uiCode;
ANOK( xGetFlag( uiCode ) );
DTRACE_T( "BLSkipFlag" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( uiCode );
DTRACE_N;
rcMbDataAccess.getMbTCoeffs().setAllCoeffCount( 0 );
rcMbDataAccess.getMbData().setBLSkipFlag( ( uiCode != 0 ) );
return rcMbDataAccess.getMbData().getBLSkipFlag();
}
ErrVal UvlcReader::mbMode( MbDataAccess& rcMbDataAccess )
{
UInt uiMbMode = 0;
rcMbDataAccess.getMbTCoeffs().setAllCoeffCount( 0 );
rcMbDataAccess.getMbData().setBCBPAll( 0 );
DTRACE_T( "MbMode" );
RNOK( xGetUvlcCode( uiMbMode ) );
DTRACE_N;
rcMbDataAccess.setConvertMbType( uiMbMode );
return Err::m_nOK;
}
ErrVal UvlcReader::resPredFlag( MbDataAccess& rcMbDataAccess )
{
UInt uiCode;
DTRACE_T( "ResidualPredFlag" );
RNOK( xGetFlag( uiCode ) );
DTRACE_N;
rcMbDataAccess.getMbData().setResidualPredFlag( uiCode?true:false );
return Err::m_nOK;
}
ErrVal UvlcReader::resPredFlag_FGS( MbDataAccess& rcMbDataAccess, Bool bBaseCoeff )
{
UInt uiCode;
DTRACE_T( "ResidualPredFlag" );
RNOK( xGetFlag( uiCode ) );
DTRACE_N;
rcMbDataAccess.getMbData().setResidualPredFlag( uiCode?true:false );
return Err::m_nOK;
}
//-- JVT-R091
ErrVal UvlcReader::smoothedRefFlag( MbDataAccess& rcMbDataAccess )
{
UInt uiCode;
DTRACE_T( "SmoothedRefFlag" );
RNOK( xGetFlag( uiCode ) );
DTRACE_N;
rcMbDataAccess.getMbData().setSmoothedRefFlag( uiCode?true:false );
return Err::m_nOK;
}
//--
ErrVal UvlcReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx )
{
Mv cMv;
RNOK( xGetMvd( cMv ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv );
return Err::m_nOK;
}
ErrVal UvlcReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx16x8 eParIdx )
{
Mv cMv;
RNOK( xGetMvd( cMv ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx );
return Err::m_nOK;
}
ErrVal UvlcReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x16 eParIdx )
{
Mv cMv;
RNOK( xGetMvd( cMv ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx );
return Err::m_nOK;
}
ErrVal UvlcReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx )
{
Mv cMv;
RNOK( xGetMvd( cMv ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx );
return Err::m_nOK;
}
ErrVal UvlcReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx, SParIdx8x4 eSParIdx )
{
Mv cMv;
RNOK( xGetMvd( cMv ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx, eSParIdx );
return Err::m_nOK;
}
ErrVal UvlcReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx, SParIdx4x8 eSParIdx )
{
Mv cMv;
RNOK( xGetMvd( cMv ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx, eSParIdx );
return Err::m_nOK;
}
ErrVal UvlcReader::mvd( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx, ParIdx8x8 eParIdx, SParIdx4x4 eSParIdx )
{
Mv cMv;
RNOK( xGetMvd( cMv ) );
rcMbDataAccess.getMbMvdData( eLstIdx ).setAllMv( cMv, eParIdx, eSParIdx );
return Err::m_nOK;
}
ErrVal UvlcReader::fieldFlag( MbDataAccess& rcMbDataAccess )
{
DTRACE_T( "MbFieldFlag" );
UInt uiBit;
DECRNOK( xGetFlag( uiBit ) );
rcMbDataAccess.setFieldMode(uiBit != 0);
DTRACE_N;
return Err::m_nOK;
}
ErrVal UvlcReader::intraPredModeChroma( MbDataAccess& rcMbDataAccess )
{
DTRACE_T( "IntraPredModeChroma" );
UInt uiCode = 0;
RNOK( xGetUvlcCode( uiCode ) );
rcMbDataAccess.getMbData().setChromaPredMode( uiCode );
DTRACE_N;
return Err::m_nOK;
}
ErrVal UvlcReader::intraPredModeLuma( MbDataAccess& rcMbDataAccess, LumaIdx cIdx )
{
DTRACE_T( "IntraPredModeLuma" );
DTRACE_POS;
UInt uiBits;
RNOK( m_pcBitReadBuffer->get( uiBits, 1 ) );
DTRACE_BITS( uiBits,1 );
DTRACE_DO( m_uiBitCounter = 1 );
if( ! uiBits )
{
UInt uiCode;
RNOK( m_pcBitReadBuffer->get( uiCode, 3 ) );
rcMbDataAccess.getMbData().intraPredMode( cIdx ) = uiCode;
DTRACE_BITS( uiCode, 3 );
DTRACE_DO( m_uiBitCounter = 4 );
}
else
{
rcMbDataAccess.getMbData().intraPredMode( cIdx ) = -1;
}
DTRACE_COUNT(m_uiBitCounter);
DTRACE_CODE(rcMbDataAccess.getMbData().intraPredMode( cIdx ));
DTRACE_N;
return Err::m_nOK;
}
ErrVal UvlcReader::intraPredModeLuma8x8( MbDataAccess& rcMbDataAccess, B8x8Idx cIdx ) // HS: bug fix by Nokia
{
DTRACE_T( "IntraPredModeLuma" );
DTRACE_POS;
UInt uiBits;
RNOK( m_pcBitReadBuffer->get( uiBits, 1 ) );
DTRACE_BITS( uiBits,1 );
DTRACE_DO( m_uiBitCounter = 1 );
if( ! uiBits )
{
UInt uiCode;
RNOK( m_pcBitReadBuffer->get( uiCode, 3 ) );
rcMbDataAccess.getMbData().intraPredMode( cIdx ) = uiCode;
DTRACE_BITS( uiCode, 3 );
DTRACE_DO( m_uiBitCounter = 4 );
}
else
{
rcMbDataAccess.getMbData().intraPredMode( cIdx ) = -1;
}
DTRACE_COUNT(m_uiBitCounter);
DTRACE_CODE(rcMbDataAccess.getMbData().intraPredMode( cIdx ));
DTRACE_N;
return Err::m_nOK;
}
ErrVal UvlcReader::cbp( MbDataAccess& rcMbDataAccess )
{
UInt uiTemp = 0;
DTRACE_T( "Cbp: " );
RNOK( xGetUvlcCode( uiTemp ) );
Bool bIntra = ( !rcMbDataAccess.getMbData().getBLSkipFlag() && rcMbDataAccess.getMbData().isIntra() );
UInt uiCbp = ( bIntra ? g_aucCbpIntra[uiTemp]: g_aucCbpInter[uiTemp] );
DTRACE_X ( uiCbp );
DTRACE_N;
rcMbDataAccess.getMbData().setMbCbp( uiCbp );
return Err::m_nOK;
}
ErrVal UvlcReader::deltaQp( MbDataAccess& rcMbDataAccess )
{
DTRACE_T ("DQp");
Int uiCode = 0;
RNOK( xGetSvlcCode( uiCode ) );
rcMbDataAccess.addDeltaQp( uiCode );
DTRACE_TY ("se(v)");
DTRACE_N;
return Err::m_nOK;
}
ErrVal UvlcReader::samplesPCM( MbDataAccess& rcMbDataAccess )
{
DTRACE_POS;
DTRACE_T( " PCM SAMPLES: " );
RNOK( m_pcBitReadBuffer->flush( m_pcBitReadBuffer->getBitsUntilByteAligned() ) );
AOF_DBG( rcMbDataAccess.getMbData().isPCM() );
rcMbDataAccess.getMbTCoeffs().setAllCoeffCount( 16 );
Pel* pSrc = rcMbDataAccess.getMbTCoeffs().getPelBuffer();
const UInt uiFactor = 8*8;
const UInt uiSize = uiFactor*2*3;
RNOK( m_pcBitReadBuffer->samples( pSrc, uiSize ) );
DTRACE_N;
DTRACE_COUNT( uiFactor*6 );
return Err::m_nOK;
}
ErrVal UvlcReader::residualBlock( MbDataAccess& rcMbDataAccess,
LumaIdx cIdx,
ResidualMode eResidualMode,
UInt& ruiMbExtCbp)
{
const UChar* pucScan;
const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType());
TCoeff* piCoeff = rcMbDataAccess.getMbTCoeffs().get( cIdx );
UInt uiPos;
UInt uiMaxPos = 16;
Int aiLevelRun[32];
UInt uiTrailingOnes = 0;
UInt uiTotalRun = 0;
UInt uiCoeffCnt = 0;
for ( uiPos = 0; uiPos < 32; uiPos++ )
{
aiLevelRun[uiPos] = 0;
}
uiPos = 0;
switch( eResidualMode )
{
case LUMA_I16_DC:
{
pucScan = (bFrame) ? g_aucLumaFrameDCScan : g_aucLumaFieldDCScan;
uiMaxPos = 16;
DTRACE_T( "Luma:" );
DTRACE_V( cIdx );
DTRACE_N;
xPredictNonZeroCnt( rcMbDataAccess, cIdx, uiCoeffCnt, uiTrailingOnes );
xGetRunLevel( aiLevelRun, uiCoeffCnt, uiTrailingOnes, 16, uiTotalRun );
break;
}
case LUMA_I16_AC:
{
pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
uiPos=1;
DTRACE_T( "Luma:" );
DTRACE_V( cIdx );
DTRACE_N;
xPredictNonZeroCnt( rcMbDataAccess, cIdx, uiCoeffCnt, uiTrailingOnes );
xGetRunLevel( aiLevelRun, uiCoeffCnt, uiTrailingOnes, 15, uiTotalRun );
break;
}
case LUMA_SCAN:
{
pucScan = (bFrame) ? g_aucFrameScan : g_aucFieldScan;
DTRACE_T( "Luma:" );
DTRACE_V( cIdx );
DTRACE_N;
xPredictNonZeroCnt( rcMbDataAccess, cIdx, uiCoeffCnt, uiTrailingOnes );
xGetRunLevel( aiLevelRun, uiCoeffCnt, uiTrailingOnes, 16, uiTotalRun );
// this is useful only in AR_FGS
rcMbDataAccess.getMbData().setBCBP( cIdx, uiCoeffCnt != 0);
break;
}
default:
return Err::m_nERR;
}
uiPos += uiTotalRun + uiCoeffCnt - 1;
for ( Int i = (Int)uiCoeffCnt; i > 0; i-- )
{
piCoeff[ pucScan [uiPos--] ] = aiLevelRun[i-1];
for ( Int j = 0; j < aiLevelRun[i-1+0x10]; j++ )
{
piCoeff[ pucScan [uiPos--] ] = 0;
}
}
Bool bCoded = (uiCoeffCnt > 0);
if( ! bCoded )
{
ruiMbExtCbp &= ~(1 << cIdx.b4x4() );
}
return Err::m_nOK;
}
ErrVal UvlcReader::residualBlock( MbDataAccess& rcMbDataAccess,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -