📄 mbparser.cpp
字号:
ErrVal MbParser::xReadReferenceFrames( MbDataAccess& rcMbDataAccess, MbMode eMbMode, ListIdx eLstIdx )
{
MbMotionData& rcMbMotionData = rcMbDataAccess.getMbMotionData( eLstIdx );
const SliceHeader& rcSliceHeader = rcMbDataAccess.getSH();
const Frame* pcRefPic;
if( rcMbDataAccess.getMbData().isIntra() )
{
rcMbMotionData.setRefIdx( -1 );
return Err::m_nOK;
}
switch( eMbMode )
{
case MODE_SKIP:
{
break;
}
case MODE_16x16:
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) )
{
if( 1 == rcMbDataAccess.getNumActiveRef( eLstIdx ) )
{
rcMbMotionData.setRefIdx( 1 );
}
else
{
DECRNOK( m_pcMbSymbolReadIf->refFrame( rcMbDataAccess, eLstIdx ) );
}
pcRefPic = rcSliceHeader.getRefPic( rcMbMotionData.getRefIdx(), eLstIdx ).getFrame();
rcMbMotionData.setRefPic( pcRefPic );
}
else
{
rcMbMotionData.setRefIdx( BLOCK_NOT_PREDICTED );
}
break;
}
case MODE_16x8:
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) )
{
if( 1 == rcMbDataAccess.getNumActiveRef( eLstIdx ) )
{
rcMbMotionData.setRefIdx( 1, PART_16x8_0 );
}
else
{
DECRNOK( m_pcMbSymbolReadIf->refFrame( rcMbDataAccess, eLstIdx, PART_16x8_0 ) );
}
pcRefPic = rcSliceHeader.getRefPic( rcMbMotionData.getRefIdx( PART_16x8_0 ), eLstIdx ).getFrame();
rcMbMotionData.setRefPic( pcRefPic, PART_16x8_0 );
}
else
{
rcMbMotionData.setRefIdx( BLOCK_NOT_PREDICTED, PART_16x8_0 );
}
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_2, eLstIdx ) )
{
if( 1 == rcMbDataAccess.getNumActiveRef( eLstIdx ) )
{
rcMbMotionData.setRefIdx( 1, PART_16x8_1 );
}
else
{
DECRNOK( m_pcMbSymbolReadIf->refFrame( rcMbDataAccess, eLstIdx, PART_16x8_1 ) );
}
pcRefPic = rcSliceHeader.getRefPic( rcMbMotionData.getRefIdx( PART_16x8_1 ), eLstIdx ).getFrame();
rcMbMotionData.setRefPic( pcRefPic, PART_16x8_1 );
}
else
{
rcMbMotionData.setRefIdx( BLOCK_NOT_PREDICTED, PART_16x8_1 );
}
break;
}
case MODE_8x16:
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) )
{
if( 1 == rcMbDataAccess.getNumActiveRef( eLstIdx ) )
{
rcMbMotionData.setRefIdx( 1, PART_8x16_0 );
}
else
{
DECRNOK( m_pcMbSymbolReadIf->refFrame( rcMbDataAccess, eLstIdx, PART_8x16_0 ) );
}
pcRefPic = rcSliceHeader.getRefPic( rcMbMotionData.getRefIdx( PART_8x16_0 ), eLstIdx ).getFrame();
rcMbMotionData.setRefPic( pcRefPic, PART_8x16_0 );
}
else
{
rcMbMotionData.setRefIdx( BLOCK_NOT_PREDICTED, PART_8x16_0 );
}
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_1, eLstIdx ) )
{
if( 1 == rcMbDataAccess.getNumActiveRef( eLstIdx ) )
{
rcMbMotionData.setRefIdx( 1, PART_8x16_1 );
}
else
{
DECRNOK( m_pcMbSymbolReadIf->refFrame( rcMbDataAccess, eLstIdx, PART_8x16_1 ) );
}
pcRefPic = rcSliceHeader.getRefPic( rcMbMotionData.getRefIdx( PART_8x16_1 ), eLstIdx ).getFrame();
rcMbMotionData.setRefPic( pcRefPic, PART_8x16_1 );
}
else
{
rcMbMotionData.setRefIdx( BLOCK_NOT_PREDICTED, PART_8x16_1 );
}
break;
}
case MODE_8x8:
{
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( c8x8Idx.b8x8Index(), eLstIdx ) )
{
if( 1 == rcMbDataAccess.getNumActiveRef( eLstIdx ) )
{
rcMbMotionData.setRefIdx( 1, c8x8Idx.b8x8() );
}
else
{
DECRNOK( m_pcMbSymbolReadIf->refFrame( rcMbDataAccess, eLstIdx, c8x8Idx.b8x8() ) );
}
pcRefPic = rcSliceHeader.getRefPic( rcMbMotionData.getRefIdx( c8x8Idx.b8x8() ), eLstIdx ).getFrame();
rcMbMotionData.setRefPic( pcRefPic, c8x8Idx.b8x8() );
}
else
{
rcMbMotionData.setRefIdx( BLOCK_NOT_PREDICTED, c8x8Idx.b8x8() );
}
}
break;
}
case MODE_8x8ref0:
{
rcMbMotionData.setRefIdx( 1 );
pcRefPic = rcSliceHeader.getRefPic( rcMbMotionData.getRefIdx(), eLstIdx ).getFrame();
rcMbMotionData.setRefPic( pcRefPic );
break;
}
default:
{
AF();
return Err::m_nERR;
}
}
return Err::m_nOK;
}
ErrVal MbParser::xReadReferenceFramesNoRefPic( MbDataAccess& rcMbDataAccess, MbMode eMbMode, ListIdx eLstIdx )
{
MbMotionData& rcMbMotionData = rcMbDataAccess.getMbMotionData( eLstIdx );
Bool bPred = rcMbDataAccess.getSH().getAdaptivePredictionFlag();
if( rcMbDataAccess.getMbData().isIntra() )
{
rcMbMotionData.setRefIdx( -1 );
return Err::m_nOK;
}
switch( eMbMode )
{
case MODE_SKIP:
{
break;
}
case MODE_16x16:
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) )
{
if( !bPred || !rcMbMotionData.getMotPredFlag() )
{
if( 1 == rcMbDataAccess.getNumActiveRef( eLstIdx ) )
{
rcMbMotionData.setRefIdx( 1 );
}
else
{
DECRNOK( m_pcMbSymbolReadIf->refFrame( rcMbDataAccess, eLstIdx ) );
}
}
}
else
{
rcMbMotionData.setRefIdx( BLOCK_NOT_PREDICTED );
}
break;
}
case MODE_16x8:
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) )
{
if( !bPred || !rcMbMotionData.getMotPredFlag(PART_16x8_0) )
{
if( 1 == rcMbDataAccess.getNumActiveRef( eLstIdx ) )
{
rcMbMotionData.setRefIdx( 1, PART_16x8_0 );
}
else
{
DECRNOK( m_pcMbSymbolReadIf->refFrame( rcMbDataAccess, eLstIdx, PART_16x8_0 ) );
}
}
}
else
{
rcMbMotionData.setRefIdx( BLOCK_NOT_PREDICTED, PART_16x8_0 );
}
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_2, eLstIdx ) )
{
if( !bPred || !rcMbMotionData.getMotPredFlag(PART_16x8_1) )
{
if( 1 == rcMbDataAccess.getNumActiveRef( eLstIdx ) )
{
rcMbMotionData.setRefIdx( 1, PART_16x8_1 );
}
else
{
DECRNOK( m_pcMbSymbolReadIf->refFrame( rcMbDataAccess, eLstIdx, PART_16x8_1 ) );
}
}
}
else
{
rcMbMotionData.setRefIdx( BLOCK_NOT_PREDICTED, PART_16x8_1 );
}
break;
}
case MODE_8x16:
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) )
{
if( !bPred || !rcMbMotionData.getMotPredFlag(PART_8x16_0) )
{
if( 1 == rcMbDataAccess.getNumActiveRef( eLstIdx ) )
{
rcMbMotionData.setRefIdx( 1, PART_8x16_0 );
}
else
{
DECRNOK( m_pcMbSymbolReadIf->refFrame( rcMbDataAccess, eLstIdx, PART_8x16_0 ) );
}
}
}
else
{
rcMbMotionData.setRefIdx( BLOCK_NOT_PREDICTED, PART_8x16_0 );
}
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_1, eLstIdx ) )
{
if( !bPred || !rcMbMotionData.getMotPredFlag(PART_8x16_1) )
{
if( 1 == rcMbDataAccess.getNumActiveRef( eLstIdx ) )
{
rcMbMotionData.setRefIdx( 1, PART_8x16_1 );
}
else
{
DECRNOK( m_pcMbSymbolReadIf->refFrame( rcMbDataAccess, eLstIdx, PART_8x16_1 ) );
}
}
}
else
{
rcMbMotionData.setRefIdx( BLOCK_NOT_PREDICTED, PART_8x16_1 );
}
break;
}
case MODE_8x8:
{
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
if( BLK_SKIP != rcMbDataAccess.getMbData().getBlkMode( c8x8Idx.b8x8Index() ) )
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( c8x8Idx.b8x8Index(), eLstIdx ) )
{
if( !bPred || !rcMbMotionData.getMotPredFlag(c8x8Idx.b8x8()) )
{
if( 1 == rcMbDataAccess.getNumActiveRef( eLstIdx ) )
{
rcMbMotionData.setRefIdx( 1, c8x8Idx.b8x8() );
}
else
{
DECRNOK( m_pcMbSymbolReadIf->refFrame( rcMbDataAccess, eLstIdx, c8x8Idx.b8x8() ) );
}
}
}
else
{
rcMbMotionData.setRefIdx( BLOCK_NOT_PREDICTED, c8x8Idx.b8x8() );
}
}
}
break;
}
case MODE_8x8ref0:
{
rcMbMotionData.setRefIdx( 1 );
break;
}
default:
{
AF();
return Err::m_nERR;
}
}
return Err::m_nOK;
}
ErrVal MbParser::xReadMotionPredFlags_FGS( MbDataAccess& rcMbDataAccess,
MbDataAccess* pcMbDataAccessBaseMotion,
MbMode eMbMode,
ListIdx eLstIdx )
{
ROT ( rcMbDataAccess.getSH().getAdaptivePredictionFlag() && pcMbDataAccessBaseMotion == NULL );
ROFRS ( rcMbDataAccess.getSH().getAdaptivePredictionFlag(), Err::m_nOK );
MbMotionData& rcMbMotionData = rcMbDataAccess .getMbMotionData( eLstIdx );
MbMotionData& rcMbMotionDataBase = pcMbDataAccessBaseMotion->getMbMotionData( eLstIdx );
//--- clear ---
rcMbMotionData.setMotPredFlag( false );
if( rcMbDataAccess.getMbData().isIntra() )
{
return Err::m_nOK;
}
switch( eMbMode )
{
case MODE_SKIP:
{
break;
}
case MODE_16x16:
{
if( rcMbDataAccess .getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) &&
pcMbDataAccessBaseMotion->getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->motionPredFlag( rcMbDataAccess, eLstIdx ) );
if( rcMbMotionData.getMotPredFlag() )
{
rcMbMotionData.setRefIdx( rcMbMotionDataBase.getRefIdx() );
}
}
break;
}
case MODE_16x8:
{
if( rcMbDataAccess .getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) &&
pcMbDataAccessBaseMotion->getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_16x8_0 ) );
if( rcMbMotionData.getMotPredFlag( PART_16x8_0 ) )
{
rcMbMotionData.setRefIdx( rcMbMotionDataBase.getRefIdx( PART_16x8_0 ), PART_16x8_0 );
}
}
if( rcMbDataAccess .getMbData().isBlockFwdBwd( B_8x8_2, eLstIdx ) &&
pcMbDataAccessBaseMotion->getMbData().isBlockFwdBwd( B_8x8_2, eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_16x8_1 ) );
if( rcMbMotionData.getMotPredFlag( PART_16x8_1 ) )
{
rcMbMotionData.setRefIdx( rcMbMotionDataBase.getRefIdx( PART_16x8_1 ), PART_16x8_1 );
}
}
break;
}
case MODE_8x16:
{
if( rcMbDataAccess .getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) &&
pcMbDataAccessBaseMotion->getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_8x16_0 ) );
if( rcMbMotionData.getMotPredFlag( PART_8x16_0 ) )
{
rcMbMotionData.setRefIdx( rcMbMotionDataBase.getRefIdx( PART_8x16_0 ), PART_8x16_0 );
}
}
if( rcMbDataAccess .getMbData().isBlockFwdBwd( B_8x8_1, eLstIdx ) &&
pcMbDataAccessBaseMotion->getMbData().isBlockFwdBwd( B_8x8_1, eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_8x16_1 ) );
if( rcMbMotionData.getMotPredFlag( PART_8x16_1 ) )
{
rcMbMotionData.setRefIdx( rcMbMotionDataBase.getRefIdx( PART_8x16_1 ), PART_8x16_1 );
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -