📄 mbparser.cpp
字号:
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 );
}
}
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 ) &&
pcMbDataAccessBaseMotion->getMbData().isBlockFwdBwd( c8x8Idx.b8x8Index(), eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->motionPredFlag( rcMbDataAccess, eLstIdx, c8x8Idx.b8x8() ) );
if( rcMbMotionData.getMotPredFlag( c8x8Idx.b8x8() ) )
{
rcMbMotionData.setRefIdx( rcMbMotionDataBase.getRefIdx( c8x8Idx.b8x8() ), c8x8Idx.b8x8() );
}
}
}
break;
}
default:
{
AF();
return Err::m_nERR;
}
}
return Err::m_nOK;
}
ErrVal MbParser::xReadMotionPredFlags( MbDataAccess& rcMbDataAccess,
MbMode eMbMode,
ListIdx eLstIdx )
{
ROTRS( rcMbDataAccess.getSH ().getBaseLayerId () == MSYS_UINT_MAX, Err::m_nOK );
ROFRS( rcMbDataAccess.getMbData ().getInCropWindowFlag(), Err::m_nOK );
MbMotionData& rcMbMotionData = rcMbDataAccess.getMbMotionData( eLstIdx );
//JVT-U160 LMI {
rcMbMotionData.setMotPredFlag( rcMbDataAccess.getSH().getDefaultMotPredictionFlag() );
ROFRS ( rcMbDataAccess.getSH().getAdaptiveMotPredictionFlag(), Err::m_nOK );
//JVT-U160 LMI }
//--- 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 )
{
Bool bReadDQp = true;
if( rcMbDataAccess.getMbData().getBLSkipFlag() ||
!rcMbDataAccess.getMbData().isIntra16x16() )
{
DECRNOK( m_pcMbSymbolReadIf->cbp( rcMbDataAccess ) );
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();
}
if( rcMbDataAccess.getMbData().getBLSkipFlag() ||
!rcMbDataAccess.getMbData().isIntra() )
{
if( rcMbDataAccess.getSH().getAdaptiveResPredictionFlag() ) // JVT-U160 LMI
{
if( ! rcMbDataAccess.getSH().isIntra() )
{
DECRNOK( m_pcMbSymbolReadIf->resPredFlag( rcMbDataAccess ) );
//-- JVT-R091
if( rcMbDataAccess.getMbData().getResidualPredFlag( PART_16x16 ) &&
rcMbDataAccess.getMbData().getBLSkipFlag() &&rcMbDataAccess.useSmoothedRef()
&& (rcMbDataAccess.getSH().getAVCRewriteFlag() == false) )
{
DECRNOK( m_pcMbSymbolReadIf->smoothedRefFlag( rcMbDataAccess ) );
}
}
}
else if( bBaseLayerAvailable && rcMbDataAccess.useSmoothedRef())
{
rcMbDataAccess.getMbData().setResidualPredFlag( true );
rcMbDataAccess.getMbData().setSmoothedRefFlag( false ); // JVT-R091
}
}
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 ) );
}
}
}
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 ) );
}
}
}
}
rcMbDataAccess.getMbData().setMbExtCbp( uiMbExtCbp );
DECRNOK( xScanChromaBlocks ( rcMbDataAccess, rcMbDataAccess.getMbData().getCbpChroma4x4() ) );
return Err::m_nOK;
}
ErrVal MbParser::xScanChromaBlocks( MbDataAccess& rcMbDataAccess, UInt uiChromCbp )
{
ROTRS( 1 > uiChromCbp, Err::m_nOK );
DECRNOK( m_pcMbSymbolReadIf->residualBlock( rcMbDataAccess, CIdx(0), CHROMA_DC ) );
DECRNOK( m_pcMbSymbolReadIf->residualBlock( rcMbDataAccess, CIdx(4), CHROMA_DC ) );
ROTRS( 2 > uiChromCbp, Err::m_nOK );
for( CIdx cCIdx; cCIdx.isLegal(); cCIdx++ )
{
DECRNOK( m_pcMbSymbolReadIf->residualBlock( rcMbDataAccess, cCIdx, CHROMA_AC ) );
}
return Err::m_nOK;
}
ErrVal MbParser::xSkipMb( MbDataAccess& rcMbDataAccess )
{
if( rcMbDataAccess.getSH().isInterB() )
{
RNOK( rcMbDataAccess.setConvertMbType( 0 ) );
}
else
{
const Frame* pcRefPic = 0;
if( rcMbDataAccess.getSH().isH264AVCCompatible() )
{
pcRefPic = rcMbDataAccess.getSH().getRefPic( 1, rcMbDataAccess.getMbPicType(), LIST_0 ).getFrame();
}
rcMbDataAccess.getMbMotionData( LIST_0 ).setRefIdx( 1 );
rcMbDataAccess.getMbMotionData( LIST_0 ).setRefPic( pcRefPic );
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 + -