mbparser.cpp
来自「JVT-S203 contains the JSVM 6 reference s」· C++ 代码 · 共 1,744 行 · 第 1/4 页
CPP
1,744 行
return Err::m_nOK;
}
#if INDEPENDENT_PARSING
ErrVal MbParser::xReadMotionPredFlags_Ind( MbDataAccess& rcMbDataAccess,
MbMode eMbMode,
ListIdx eLstIdx )
{
ROFRS ( rcMbDataAccess.getSH().getAdaptivePredictionFlag(), Err::m_nOK );
MbMotionData& rcMbMotionData = rcMbDataAccess.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 ) )
{
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;
}
#endif
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::xReadMotionVectorsQPel( MbDataAccess& rcMbDataAccess, ListIdx eLstIdx )
{
ROTRS( rcMbDataAccess.getMbData().isIntra(), Err::m_nOK );
switch( rcMbDataAccess.getMbData().getMbMode() )
{
case MODE_16x16:
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->mvdQPel( rcMbDataAccess, eLstIdx ) );
}
return Err::m_nOK;
}
case MODE_16x8:
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->mvdQPel( rcMbDataAccess, eLstIdx, PART_16x8_0 ) );
}
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_2, eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->mvdQPel( rcMbDataAccess, eLstIdx, PART_16x8_1 ) );
}
return Err::m_nOK;
}
case MODE_8x16:
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_0, eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->mvdQPel( rcMbDataAccess, eLstIdx, PART_8x16_0 ) );
}
if( rcMbDataAccess.getMbData().isBlockFwdBwd( B_8x8_1, eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->mvdQPel( rcMbDataAccess, eLstIdx, PART_8x16_1 ) );
}
return Err::m_nOK;
}
case MODE_8x8:
case MODE_8x8ref0:
{
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
ROT( rcMbDataAccess.getMbData().getBlkMode( c8x8Idx.b8x8Index() ) != BLK_8x8 );
if( rcMbDataAccess.getMbData().isBlockFwdBwd( c8x8Idx.b8x8Index(), eLstIdx ) )
{
DECRNOK( m_pcMbSymbolReadIf->mvdQPel( rcMbDataAccess, eLstIdx, c8x8Idx.b8x8() ) );
}
}
return Err::m_nOK;
}
default:
{
AF();
return Err::m_nERR;
}
}
return Err::m_nERR;
}
ErrVal
MbParser::xReadTextureInfo( MbDataAccess& rcMbDataAccess,
MbDataAccess* pcMbDataAccessBase, // JVT-R091
Bool bTrafo8x8Flag
)
{
Bool bReadDQp = true;
#if INDEPENDENT_PARSING
if( rcMbDataAccess.getSH().getSPS().getIndependentParsing() )
{
if( rcMbDataAccess.getMbData().getBLSkipFlag() ||
rcMbDataAccess.getMbData().getBLQRefFlag() ||
!rcMbDataAccess.getMbData().isIntra16x16() )
{
DECRNOK( m_pcMbSymbolReadIf->cbp( rcMbDataAccess ) );
bReadDQp = rcMbDataAccess.getMbData().getMbCbp() != 0;
}
}
else
#endif
if( ! rcMbDataAccess.getMbData().isIntra16x16() )
{
DECRNOK( m_pcMbSymbolReadIf->cbp( rcMbDataAccess ) );
bReadDQp = rcMbDataAccess.getMbData().getMbCbp() != 0;
}
if( bTrafo8x8Flag && ( rcMbDataAccess.getMbData().getMbCbp() & 0x0F ) )
{
#if INDEPENDENT_PARSING
if( ! rcMbDataAccess.getSH().getSPS().getIndependentParsing() )
#endif
{
ROT( rcMbDataAccess.getMbData().isIntra16x16() );
ROT( rcMbDataAccess.getMbData().isIntra4x4 () );
}
DECRNOK( m_pcMbSymbolReadIf->transformSize8x8Flag( rcMbDataAccess ) );
}
if( bReadDQp )
{
DECRNOK( m_pcMbSymbolReadIf->deltaQp( rcMbDataAccess ) );
}
else
{
rcMbDataAccess.resetQp();
}
#if INDEPENDENT_PARSING
if( rcMbDataAccess.getSH().getSPS().getIndependentParsing() )
{
if( rcMbDataAccess.getMbData().getBLSkipFlag() ||
rcMbDataAccess.getMbData().getBLQRefFlag() ||
!rcMbDataAccess.getMbData().isIntra() )
{
if( rcMbDataAccess.getSH().getAdaptivePredictionFlag() )
{
if( ! rcMbDataAccess.getSH().isIntra() )
{
DECRNOK( m_pcMbSymbolReadIf->resPredFlag( rcMbDataAccess ) );
//-- JVT-R091
if( rcMbDataAccess.getMbData().getResidualPredFlag( PART_16x16 ) &&
rcMbDataAccess.getMbData().getBLSkipFlag() )
{
DECRNOK( m_pcMbSymbolReadIf->smoothedRefFlag( rcMbDataAccess ) );
}
}
}
else if( rcMbDataAccess.getSH().getBaseLayerId() != MSYS_UINT_MAX )
{
rcMbDataAccess.getMbData().setResidualPredFlag( true );
rcMbDataAccess.getMbData().setSmoothedRefFlag( false ); // JVT-R091
}
}
}
else
#endif
if( !rcMbDataAccess.getMbData().isIntra() )
{
if( rcMbDataAccess.getSH().getAdaptivePredictionFlag() )
{
DECRNOK( m_pcMbSymbolReadIf->resPredFlag( rcMbDataAccess ) );
//-- JVT-R091
if ( rcMbDataAccess.getMbData().getResidualPredFlag( PART_16x16 ) &&
rcMbDataAccess.getMbData().getBLSkipFlag() &&
pcMbDataAccessBase &&
rcMbDataAccess.isConstrainedInterLayerPred( ) )
{
DECRNOK( m_pcMbSymbolReadIf->smoothedRefFlag( rcMbDataAccess ) );
}
//--
}
else if( rcMbDataAccess.getSH().getBaseLayerId() != MSYS_UINT_MAX )
{
rcMbDataAccess.getMbData().setResidualPredFlag( true );
rcMbDataAccess.getMbData().setSmoothedRefFlag( false ); // JVT-R091
}
}
UInt uiDummy = 0;
Bool bIntra16x16 = rcMbDataAccess.getMbData().isIntra16x16();
#if INDEPENDENT_PARSING
if( rcMbDataAccess.getSH().getSPS().getIndependentParsing() )
{
bIntra16x16 = ( !rcMbDataAccess.getMbData().getBLSkipFlag() &&
!rcMbDataAccess.getMbData().getBLQRefFlag() &&
rcMbDataAccess.getMbData().isIntra16x16 () );
}
#endif
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, 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 + =
减小字号Ctrl + -
显示快捷键?