📄 uvlcreader.cpp
字号:
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;
}
//SEI LSJ{
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;
}
//SEI LSJ}
ErrVal UvlcReader::startSlice( const SliceHeader& rcSliceHeader )
{
m_bRunLengthCoding = ! rcSliceHeader.isIntra();
m_uiRun = 0;
return Err::m_nOK;
}
ErrVal UvlcReader::refFrame( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx )
{
UInt uiRefFrame = 0;
RNOK( xGetRefFrame( 2 == rcMbDataAccess.getNumActiveRef( eLstIdx ), uiRefFrame ) );
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 ) );
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 ) );
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 ) );
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();
}
#if JMVM_ONLY // JVT-W081
Bool UvlcReader::isMotionSkipped( MbDataAccess& rcMbDataAccess )
{
UInt uiCode;
ANOK( xGetFlag( uiCode ) );
DTRACE_T( "MotionSkipFlag" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( uiCode );
DTRACE_N;
rcMbDataAccess.getMbTCoeffs().setAllCoeffCount( 0 );
rcMbDataAccess.getMbData().setMotionSkipFlag( ( uiCode != 0 ) );
return rcMbDataAccess.getMbData().getMotionSkipFlag();
}
// JVT-W081
//JVT-Z021
ErrVal UvlcReader::MotionSkipOffset( MbDataAccess& rcMbDataAccess )
{
Mv cMv;
RNOK( xGetMotionSkipOffset( cMv ) );
rcMbDataAccess.getMbData().m_pcMbImsm->m_cOffset = cMv;
return Err::m_nOK;
}
ErrVal UvlcReader::xGetMotionSkipOffset( Mv& cMv )
{
DTRACE_T( "Offset: x" );
UInt uiTemp = 0;
RNOK( xGetUvlcCode( uiTemp ) );
Short sHor = ( uiTemp & 1) ? (Int)((uiTemp+1)>>1) : -(Int)(uiTemp>>1);
DTRACE_CODE( sHor );
DTRACE_TY("se(v)");
DTRACE_N;
DTRACE_T( "Offset: y" );
RNOK( xGetUvlcCode( uiTemp ) );
Short sVer = ( uiTemp & 1) ? (Int)((uiTemp+1)>>1) : -(Int)(uiTemp>>1);
DTRACE_CODE( sVer );
DTRACE_TY("se(v)");
DTRACE_N;
cMv.setHor( sHor );
cMv.setVer( sVer );
return Err::m_nOK;
}
ErrVal UvlcReader::MotionSkipListXFlag( MbDataAccess& rcMbDataAccess )
{
UInt uiCode;
ANOK( xGetFlag( uiCode ) );
DTRACE_T( "MotionSkipListXFlag" );
DTRACE_TY( "ae(v)" );
DTRACE_CODE( uiCode );
DTRACE_N;
rcMbDataAccess.getMbData().m_pcMbImsm->m_iListXFlag = uiCode;
return Err::m_nOK;
}
#endif //JMVM_ONLY
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::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->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;
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 = g_aucLumaFrameDCScan;
uiMaxPos = 16;
DTRACE_T( "Luma:" );
DTRACE_V( cIdx );
DTRACE_N;
xPredictNonZeroCnt( rcMbDataAccess, cIdx, uiCoeffCnt, uiTrailingOnes );
xGetRunLevel( aiLevelRun, uiCoeffCnt, uiTrailingOnes, 16, uiTotalRun );
break;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -