📄 uvlcreader.cpp
字号:
{
m_pcBitReadBuffer = NULL;
return Err::m_nOK;
}
ErrVal UvlcReader::xGetUvlcCode( UInt& ruiVal)
{
UInt uiVal = 0;
UInt uiCode = 0;
UInt uiLength;
DTRACE_DO( m_uiBitCounter = 1 );
DTRACE_TY( "ue(v)" );
DECRNOK( m_pcBitReadBuffer->get( uiCode, 1 ) );
DTRACE_BITS(uiCode, 1);
if( 0 == uiCode )
{
uiLength = 0;
while( ! ( uiCode & 1 ))
{
DECRNOK( m_pcBitReadBuffer->get( uiCode, 1 ) );
DTRACE_BITS(uiCode, 1);
uiLength++;
}
DTRACE_DO( m_uiBitCounter += 2*uiLength );
DECRNOK( m_pcBitReadBuffer->get( uiVal, uiLength ) );
DTRACE_BITS(uiVal, uiLength);
uiVal += (1 << uiLength)-1;
}
ruiVal = uiVal;
DTRACE_POS;
DTRACE_CODE(uiVal);
DTRACE_COUNT(m_uiBitCounter);
return Err::m_nOK;
}
ErrVal UvlcReader::xGetSvlcCode( Int& riVal)
{
UInt uiBits = 0;
DTRACE_DO( m_uiBitCounter = 1 );
DTRACE_TY( "se(v)" );
DECRNOK( m_pcBitReadBuffer->get( uiBits, 1 ) );
DTRACE_BITS(uiBits, 1);
if( 0 == uiBits )
{
UInt uiLength = 0;
while( ! ( uiBits & 1 ))
{
DECRNOK( m_pcBitReadBuffer->get( uiBits, 1 ) );
DTRACE_BITS(uiBits, 1);
uiLength++;
}
DTRACE_DO( m_uiBitCounter += 2*uiLength );
DECRNOK( m_pcBitReadBuffer->get( uiBits, uiLength ) );
DTRACE_BITS(uiBits, uiLength);
uiBits += (1 << uiLength);
riVal = ( uiBits & 1) ? -(Int)(uiBits>>1) : (Int)(uiBits>>1);
}
else
{
riVal = 0;
}
DTRACE_POS;
DTRACE_CODE(riVal);
DTRACE_COUNT(m_uiBitCounter);
return Err::m_nOK;
}
ErrVal UvlcReader::getFlag( Bool& rbFlag, Char* pcTraceString )
{
DTRACE_TH( pcTraceString );
UInt uiCode;
DECRNOK( xGetFlag( uiCode ) );
rbFlag = (1 == uiCode);
DTRACE_N;
return Err::m_nOK;
}
ErrVal UvlcReader::getCode( UInt& ruiCode, UInt uiLength, Char* pcTraceString )
{
DTRACE_TH( pcTraceString );
RNOK( xGetCode( ruiCode, uiLength) );
DTRACE_N;
return Err::m_nOK;
}
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;
}
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;
}
ErrVal UvlcReader::getSCode( Int& riCode, UInt uiLength, Char* pcTraceString )
{
DTRACE_TH( pcTraceString );
DTRACE_TY( " u(v)" );
UInt uiCode;
DECRNOK( m_pcBitReadBuffer->get( uiCode, uiLength ) );
UInt uiShift = 32 - uiLength;
riCode = ((Int)(uiCode << uiShift)) >> uiShift;
DTRACE_POS;
DTRACE_CODE (riCode);
DTRACE_BITS (uiCode, uiLength );
DTRACE_COUNT(uiLength);
DTRACE_N;
return Err::m_nOK;
}
ErrVal UvlcReader::startSlice( const SliceHeader& rcSliceHeader )
{
m_bRunLengthCoding = ! rcSliceHeader.isIntraSlice();
m_uiRun = 0;
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( " u(1)" );
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::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;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -