📄 mbparser.cpp
字号:
}
}
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( MbDataAccess& rcMbDataAccess,
MbMode eMbMode,
ListIdx eLstIdx )
{
ROTRS( rcMbDataAccess.getSH ().getNoInterLayerPredFlag(), Err::m_nOK );
ROFRS( rcMbDataAccess.getMbData ().getInCropWindowFlag(), Err::m_nOK );
MbMotionData& rcMbMotionData = rcMbDataAccess.getMbMotionData( eLstIdx );
rcMbMotionData.setMotPredFlag( rcMbDataAccess.getSH().getDefaultMotionPredictionFlag() );
ROFRS ( rcMbDataAccess.getSH().getAdaptiveMotionPredictionFlag(), Err::m_nOK );
//--- 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 ) )
{
DECRNOK( m_pcMbSymbolReadIf->motionPredFlag( rcMbDataAccess, eLstIdx ) );
}
break;
}
case MODE_16x8:
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_16x8_0 ) );
}
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_2, eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_16x8_1 ) );
}
break;
}
case MODE_8x16:
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_8x16_0 ) );
}
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_1, eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->motionPredFlag( rcMbDataAccess, eLstIdx, PART_8x16_1 ) );
}
break;
}
case MODE_8x8:
case MODE_8x8ref0:
{
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
if( BLK_SKIP != rcMbDataAccess.getMbData().getBlkMode ( c8x8Idx.b8x8Index() ) &&
rcMbDataAccess .getMbData().isBlockFwdBwd( c8x8Idx.b8x8Index(), eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->motionPredFlag( rcMbDataAccess, eLstIdx, c8x8Idx.b8x8() ) );
}
}
break;
}
default:
{
AF();
return Err::m_nERR;
}
}
return Err::m_nOK;
}
ErrVal
MbParser::xReadMotionVectors( MbDataAccess& rcMbDataAccess, MbMode eMbMode, ListIdx eLstIdx )
{
ROTRS( rcMbDataAccess.getMbData().isIntra(), Err::m_nOK );
switch( eMbMode )
{
case MODE_SKIP:
{
return Err::m_nOK;
}
case MODE_16x16:
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->mvd( rcMbDataAccess, eLstIdx ) );
}
return Err::m_nOK;
}
case MODE_16x8:
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->mvd( rcMbDataAccess, eLstIdx, PART_16x8_0 ) );
}
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_2, eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->mvd( rcMbDataAccess, eLstIdx, PART_16x8_1 ) );
}
return Err::m_nOK;
}
case MODE_8x16:
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->mvd( rcMbDataAccess, eLstIdx, PART_8x16_0 ) );
}
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_1, eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->mvd( rcMbDataAccess, eLstIdx, PART_8x16_1 ) );
}
return Err::m_nOK;
}
case MODE_8x8:
case MODE_8x8ref0:
{
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( c8x8Idx.b8x8Index(), eLstIdx ) )
{
DECRNOK( xGet8x8BlockMv( rcMbDataAccess, c8x8Idx, eLstIdx ) );
}
}
return Err::m_nOK;
}
default:
{
AF();
return Err::m_nERR;
}
}
return Err::m_nERR;
}
ErrVal
MbParser::xReadTextureInfo( MbDataAccess& rcMbDataAccess,
Bool bTrafo8x8Flag,
Bool bBaseLayerAvailable,
UInt uiStart,
UInt uiStop )
{
Bool bReadDQp = true;
if( (rcMbDataAccess.getMbData().getBLSkipFlag() || !rcMbDataAccess.getMbData().isIntra()) &&
(rcMbDataAccess.getSH().getAdaptiveResidualPredictionFlag() && !rcMbDataAccess.getSH().isIntraSlice()) )
{
if( rcMbDataAccess.getMbData().getInCropWindowFlag() )
{
DECRNOK( m_pcMbSymbolReadIf->resPredFlag( rcMbDataAccess ) );
}
else
{
rcMbDataAccess.getMbData().setResidualPredFlag( false );
}
}
else
{
rcMbDataAccess.getMbData().setResidualPredFlag( ( rcMbDataAccess.getSH().isIntraSlice() && rcMbDataAccess.getMbData().getBLSkipFlag() ) ||
(!rcMbDataAccess.getSH().isIntraSlice() && rcMbDataAccess.getMbData().getBLSkipFlag() && !rcMbDataAccess.getSH().getNoInterLayerPredFlag() ) );
}
if( rcMbDataAccess.getMbData().getBLSkipFlag() ||
!rcMbDataAccess.getMbData().isIntra16x16() )
{
if( uiStart == uiStop )
{
rcMbDataAccess.getMbData().setMbCbp( 0 );
}
else
{
DECRNOK( m_pcMbSymbolReadIf->cbp( rcMbDataAccess, uiStart, uiStop ) );
}
bReadDQp = rcMbDataAccess.getMbData().getMbCbp() != 0;
}
if( bTrafo8x8Flag && ( rcMbDataAccess.getMbData().getMbCbp() & 0x0F ) )
{
DECRNOK( m_pcMbSymbolReadIf->transformSize8x8Flag( rcMbDataAccess ) );
}
if( bReadDQp )
{
DECRNOK( m_pcMbSymbolReadIf->deltaQp( rcMbDataAccess ) );
}
else
{
rcMbDataAccess.resetQp();
}
UInt uiDummy = 0;
Bool bIntra16x16 = ( !rcMbDataAccess.getMbData().getBLSkipFlag() &&
rcMbDataAccess.getMbData().isIntra16x16 () );
if( bIntra16x16 )
{
DECRNOK( m_pcMbSymbolReadIf->residualBlock( rcMbDataAccess, B4x4Idx(0), LUMA_I16_DC, uiDummy ) );
if( rcMbDataAccess.getMbData().isAcCoded() )
{
for( S4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
{
DECRNOK( m_pcMbSymbolReadIf->residualBlock( rcMbDataAccess, cIdx, LUMA_I16_AC, uiDummy ) );
}
rcMbDataAccess.getMbData().setMbCbp( 0xf + ( rcMbDataAccess.getMbData().getCbpChroma16x16() << 4) );
}
DECRNOK( xScanChromaBlocks( rcMbDataAccess, rcMbDataAccess.getMbData().getCbpChroma16x16() ) );
return Err::m_nOK;
}
UInt uiMbExtCbp = rcMbDataAccess.getMbData().getMbExtCbp();
if( rcMbDataAccess.getMbData().isTransformSize8x8() )
{
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
if( uiMbExtCbp & ( 1 << c8x8Idx.b4x4() ) )
{
DECRNOK( m_pcMbSymbolReadIf->residualBlock8x8( rcMbDataAccess, c8x8Idx, uiStart, uiStop ) );
}
}
}
else
{
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
if( uiMbExtCbp & ( 1 << c8x8Idx.b4x4() ) )
{
for( S4x4Idx cIdx( c8x8Idx ); cIdx.isLegal( c8x8Idx ); cIdx++ )
{
DECRNOK( m_pcMbSymbolReadIf->residualBlock( rcMbDataAccess, cIdx , LUMA_SCAN, uiMbExtCbp, uiStart, uiStop ) );
}
}
}
}
rcMbDataAccess.getMbData().setMbExtCbp( uiMbExtCbp );
DECRNOK( xScanChromaBlocks ( rcMbDataAccess, rcMbDataAccess.getMbData().getCbpChroma4x4(), uiStart, uiStop ) );
return Err::m_nOK;
}
ErrVal
MbParser::xScanChromaBlocks( MbDataAccess& rcMbDataAccess, UInt uiChromCbp, UInt uiStart, UInt uiStop )
{
ROTRS( 1 > uiChromCbp, Err::m_nOK );
if( uiStart == 0 )
{
DECRNOK( m_pcMbSymbolReadIf->residualBlock( rcMbDataAccess, CIdx(0), CHROMA_DC, uiStart, uiStop ) );
DECRNOK( m_pcMbSymbolReadIf->residualBlock( rcMbDataAccess, CIdx(4), CHROMA_DC, uiStart, uiStop ) );
}
ROTRS( 2 > uiChromCbp, Err::m_nOK );
for( CIdx cCIdx; cCIdx.isLegal(); cCIdx++ )
{
if( uiStop > 1 )
{
DECRNOK( m_pcMbSymbolReadIf->residualBlock( rcMbDataAccess, cCIdx, CHROMA_AC, uiStart, uiStop ) );
}
}
return Err::m_nOK;
}
Bool
MbParser::xCheckSkipSliceMb( MbDataAccess& rcMbDataAccess, UInt uiNumMbRead, Bool& rbEndOfSlice )
{
ROFRS( rcMbDataAccess.getSH().getSliceSkipFlag(), false );
MbData& rcMbData = rcMbDataAccess.getMbData();
rcMbData.setSkipFlag ( false );
rcMbData.setBLSkipFlag ( true );
rcMbData.setResidualPredFlag ( true );
rcMbData.setMbExtCbp ( 0 );
rcMbData.setFwdBwd ( 0 );
rcMbDataAccess.resetQp ();
rcMbDataAccess.getMbMotionData( LIST_0 ).clear( BLOCK_NOT_PREDICTED );
rcMbDataAccess.getMbMotionData( LIST_1 ).clear( BLOCK_NOT_PREDICTED );
rcMbDataAccess.getMbMvdData ( LIST_0 ).clear();
rcMbDataAccess.getMbMvdData ( LIST_1 ).clear();
rbEndOfSlice = ( uiNumMbRead >= rcMbDataAccess.getSH().getNumMbsInSliceMinus1() );
return true;
}
ErrVal
MbParser::xSkipMb( MbDataAccess& rcMbDataAccess )
{
if( rcMbDataAccess.getSH().isBSlice() )
{
RNOK( rcMbDataAccess.setConvertMbType( 0 ) );
}
else
{
rcMbDataAccess.getMbMotionData( LIST_0 ).setRefIdx( 1 );
RNOK( rcMbDataAccess.setConvertMbType( MSYS_UINT_MAX ) );
}
rcMbDataAccess.getMbData().setMbCbp( 0 );
return Err::m_nOK;
}
H264AVC_NAMESPACE_END
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -