📄 mbparser.cpp
字号:
//===== clear mtoion data for intra blocks =====
rcMbDataAccess.getMbMotionData( LIST_0 ).clear( BLOCK_NOT_PREDICTED );
rcMbDataAccess.getMbMvdData ( LIST_0 ).clear();
if( rcMbDataAccess.getSH().isInterB() )
{
rcMbDataAccess.getMbMotionData( LIST_1 ).clear( BLOCK_NOT_PREDICTED );
rcMbDataAccess.getMbMvdData ( LIST_1 ).clear();
}
}
else if( eMbMode == MODE_SKIP )
{
if( rcMbDataAccess.getSH().isInterB() )
{
rcMbDataAccess.getMbData().setFwdBwd( 0x3333 );
rcMbDataAccess.getMbMotionData( LIST_0 ).clear( RefIdxValues(1) );
rcMbDataAccess.getMbMvdData ( LIST_0 ).clear();
rcMbDataAccess.getMbMotionData( LIST_1 ).clear( RefIdxValues(1) );
rcMbDataAccess.getMbMvdData ( LIST_1 ).clear();
}
else
{
rcMbDataAccess.getMbData().setFwdBwd( 0x1111 );
rcMbDataAccess.getMbMotionData( LIST_0 ).clear( RefIdxValues(1) );
rcMbDataAccess.getMbMvdData ( LIST_0 ).clear();
rcMbDataAccess.getMbMotionData( LIST_1 ).clear( BLOCK_NOT_PREDICTED );
rcMbDataAccess.getMbMvdData ( LIST_1 ).clear();
}
}
else
{
if( rcMbDataAccess.getSH().isInterB() )
{
DECRNOK( xReadMotionPredFlags ( rcMbDataAccess, eMbMode, LIST_0 ) );
DECRNOK( xReadMotionPredFlags ( rcMbDataAccess, eMbMode, LIST_1 ) );
DECRNOK( xReadReferenceFramesNoRefPic ( rcMbDataAccess, eMbMode, LIST_0 ) );
DECRNOK( xReadReferenceFramesNoRefPic ( rcMbDataAccess, eMbMode, LIST_1 ) );
DECRNOK( xReadMotionVectors ( rcMbDataAccess, eMbMode, LIST_0 ) );
DECRNOK( xReadMotionVectors ( rcMbDataAccess, eMbMode, LIST_1 ) );
}
else
{
DECRNOK( xReadMotionPredFlags ( rcMbDataAccess, eMbMode, LIST_0 ) );
DECRNOK( xReadReferenceFramesNoRefPic ( rcMbDataAccess, eMbMode, LIST_0 ) );
DECRNOK( xReadMotionVectors ( rcMbDataAccess, eMbMode, LIST_0 ) );
}
}
}
//===== TEXTURE INFO =====
if( rcMbDataAccess.getMbData().isPCM() )
{
DECRNOK( m_pcMbSymbolReadIf->samplesPCM( rcMbDataAccess ) );
}
else
{
if( ! rcMbDataAccess.getMbData().getBLSkipFlag() )
{
DECRNOK( xReadIntraPredModes( rcMbDataAccess ) );
}
Bool bTrafo8x8Flag = ( rcMbDataAccess.getSH().getPPS().getTransform8x8ModeFlag() &&
( rcMbDataAccess.getMbData().getBLSkipFlag() ||
( rcMbDataAccess.getMbData().is8x8TrafoFlagPresent() &&
!rcMbDataAccess.getMbData().isIntra4x4() ) ) );
//-- JVT-R091
DECRNOK( xReadTextureInfo( rcMbDataAccess, pcMbDataAccessBase, bTrafo8x8Flag ) );
//--
}
}
m_bPrevIsSkipped = ! bIsCoded;
//===== terminating bits =====
rbEndOfSlice = m_pcMbSymbolReadIf->isEndOfSlice();
return Err::m_nOK;
}
// TMM_EC {{
ErrVal MbParser::readVirtual( MbDataAccess& rcMbDataAccess,
MbDataAccess* pcMbDataAccessBase,
Int iSpatialScalabilityType,
Bool& rbEndOfSlice,
ERROR_CONCEAL eErrorConceal)
{
ROF( m_bInitDone );
switch ( eErrorConceal)
{
case EC_TEMPORAL_DIRECT:
{
rcMbDataAccess.getMbData().setMbMode(MODE_SKIP);
}
break;
case EC_FRAME_COPY:
rcMbDataAccess.getMbData().setMbMode(MODE_16x16);
rcMbDataAccess.getMbData().getMbMotionData(LIST_0).setAllMv( Mv::ZeroMv());
rcMbDataAccess.getMbData().getMbMotionData(LIST_0).setRefIdx(1);
rcMbDataAccess.getMbData().getMbMvdData (LIST_0).clear();
if(rcMbDataAccess.getSH().getSliceType()==B_SLICE)
{
rcMbDataAccess.getMbData().getMbMotionData(LIST_1).setAllMv( Mv::ZeroMv());
rcMbDataAccess.getMbData().getMbMotionData(LIST_1).setRefIdx(1);
rcMbDataAccess.getMbData().getMbMvdData (LIST_1).clear();
}
break;
case EC_BLSKIP:
//===== copy motion data from base layer ======
ROF( pcMbDataAccessBase );
rcMbDataAccess.getMbData().copyMotion( pcMbDataAccessBase->getMbData() );
rcMbDataAccess.getMbData().setBLSkipFlag( true );
if( rcMbDataAccess.getMbData().isIntra() )
{
rcMbDataAccess.getMbData().setMbMode( INTRA_BL );
}
else
{
rcMbDataAccess.getMbData().setResidualPredFlag( true );
}
break;
default:
AF( );
}
return Err::m_nOK;
}
// TMM_EC }}
ErrVal MbParser::readMotion(MbDataAccess& rcMbDataAccess,
MbDataAccess* pcMbDataAccessBase )
{
ROT( rcMbDataAccess.getMbData().isIntra() );
UInt uiFwdBwdBase = pcMbDataAccessBase->getMbData().getFwdBwd();
try {
//===== base mode flag =====
ROTRS( m_pcMbSymbolReadIf->isBLSkipped( rcMbDataAccess ), Err::m_nOK );
rcMbDataAccess.getMbMotionData( LIST_0 ).reset();
rcMbDataAccess.getMbMotionData( LIST_0 ).clear( BLOCK_NOT_PREDICTED );
rcMbDataAccess.getMbMvdData ( LIST_0 ).clear();
rcMbDataAccess.getMbMotionData( LIST_1 ).reset();
rcMbDataAccess.getMbMotionData( LIST_1 ).clear( BLOCK_NOT_PREDICTED );
rcMbDataAccess.getMbMvdData ( LIST_1 ).clear();
rcMbDataAccess.getMbData().setBLSkipFlag( false );
// <<<<<
// really nasty code: set forward/backward indication of BASE LAYER (sic!)
// this probably should/could have been done somewhere else...
if( rcMbDataAccess.getSH().isH264AVCCompatible() )
{
if( pcMbDataAccessBase->getMbData().getMbMode() == MODE_SKIP )
{
UInt uiFwdBwd = 0;
if( pcMbDataAccessBase->getSH().isInterB() )
{
for( Int n = 3; n >= 0; n--)
{
uiFwdBwd <<= 4;
uiFwdBwd += (0 < pcMbDataAccessBase->getMbMotionData( LIST_0 ).getRefIdx( Par8x8(n) )) ? 1:0;
uiFwdBwd += (0 < pcMbDataAccessBase->getMbMotionData( LIST_1 ).getRefIdx( Par8x8(n) )) ? 2:0;
}
}
if( pcMbDataAccessBase->getSH().isInterP() )
{
for( Int n = 3; n >= 0; n--)
{
uiFwdBwd <<= 4;
uiFwdBwd += (0 < pcMbDataAccessBase->getMbMotionData( LIST_0 ).getRefIdx( Par8x8(n) )) ? 1:0;
}
}
pcMbDataAccessBase->getMbData().setFwdBwd( uiFwdBwd );
}
else if( pcMbDataAccessBase->getMbData().getMbMode() == MODE_8x8 )
{
UInt uiFwdBwd = 0;
for( Int n = 3; n >= 0; n-- )
{
uiFwdBwd <<= 4;
if( pcMbDataAccessBase->getMbData().getBlkMode( Par8x8(n) ) == BLK_SKIP )
{
uiFwdBwd += (0 < pcMbDataAccessBase->getMbMotionData( LIST_0 ).getRefIdx( Par8x8(n) )) ? 1:0;
if( pcMbDataAccessBase->getSH().isInterB() )
uiFwdBwd += (0 < pcMbDataAccessBase->getMbMotionData( LIST_1 ).getRefIdx( Par8x8(n) )) ? 2:0;
}
}
pcMbDataAccessBase->getMbData().setFwdBwd( pcMbDataAccessBase->getMbData().getFwdBwd() | uiFwdBwd );
}
}
// >>>>>
//===== macroblock mode =====
DECRNOK( m_pcMbSymbolReadIf->mbMode( rcMbDataAccess ) );
if( rcMbDataAccess.getMbData().isIntra() )
{
// NOTE: this may happen only at a truncation point
// ----- restore base layer forward/backward indication -----
pcMbDataAccessBase->getMbData().setFwdBwd( uiFwdBwdBase );
// ----- mark as skipped macroblock -----
RNOK( rcMbDataAccess.getMbData().copyMotion( pcMbDataAccessBase->getMbData() ) );
rcMbDataAccess.getMbData().copyFrom ( pcMbDataAccessBase->getMbData() );
rcMbDataAccess.getMbData().setBLSkipFlag( true );
return Err::m_nOK;
}
//===== BLOCK MODES =====
if( rcMbDataAccess.getMbData().isInter8x8() )
{
DECRNOK( m_pcMbSymbolReadIf->blockModes( rcMbDataAccess ) );
//===== set motion data for skip block mode =====
UInt uiFwdBwd = 0;
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
UInt uiBlkFwdBwd = rcMbDataAccess.getMbData().getBlockFwdBwd( c8x8Idx.b8x8Index() );
if( rcMbDataAccess.getMbData().getBlkMode( c8x8Idx.b8x8Index() ) == BLK_SKIP )
{
uiBlkFwdBwd = 3;
rcMbDataAccess.getMbMotionData( LIST_0 ).setRefIdx( 1, c8x8Idx.b8x8() );
rcMbDataAccess.getMbMotionData( LIST_1 ).setRefIdx( 1, c8x8Idx.b8x8() );
rcMbDataAccess.getMbMvdData ( LIST_0 ).setAllMv ( Mv::ZeroMv(), c8x8Idx.b8x8() );
rcMbDataAccess.getMbMvdData ( LIST_1 ).setAllMv ( Mv::ZeroMv(), c8x8Idx.b8x8() );
}
uiFwdBwd |= ( uiBlkFwdBwd << ( c8x8Idx.b8x8Index() * 4 ) );
}
rcMbDataAccess.getMbData().setFwdBwd( uiFwdBwd );
}
//===== MOTION DATA =====
MbMode eMbMode = rcMbDataAccess.getMbData().getMbMode();
if( eMbMode == MODE_SKIP )
{
if( rcMbDataAccess.getSH().isInterB() )
{
rcMbDataAccess.getMbData().setFwdBwd( 0x3333 );
rcMbDataAccess.getMbMotionData( LIST_0 ).clear( RefIdxValues(1) );
rcMbDataAccess.getMbMvdData ( LIST_0 ).clear();
rcMbDataAccess.getMbMotionData( LIST_1 ).clear( RefIdxValues(1) );
rcMbDataAccess.getMbMvdData ( LIST_1 ).clear();
}
else
{
rcMbDataAccess.getMbData().setFwdBwd( 0x1111 );
rcMbDataAccess.getMbMotionData( LIST_0 ).clear( RefIdxValues(1) );
rcMbDataAccess.getMbMvdData ( LIST_0 ).clear();
rcMbDataAccess.getMbMotionData( LIST_1 ).clear( BLOCK_NOT_PREDICTED );
rcMbDataAccess.getMbMvdData ( LIST_1 ).clear();
}
}
else
{
if( rcMbDataAccess.getSH().isInterB() )
{
DECRNOK( xReadMotionPredFlags_FGS ( rcMbDataAccess, pcMbDataAccessBase, eMbMode, LIST_0 ) );
DECRNOK( xReadMotionPredFlags_FGS ( rcMbDataAccess, pcMbDataAccessBase, eMbMode, LIST_1 ) );
DECRNOK( xReadReferenceFramesNoRefPic ( rcMbDataAccess, eMbMode, LIST_0 ) );
DECRNOK( xReadReferenceFramesNoRefPic ( rcMbDataAccess, eMbMode, LIST_1 ) );
DECRNOK( xReadMotionVectors ( rcMbDataAccess, eMbMode, LIST_0 ) );
DECRNOK( xReadMotionVectors ( rcMbDataAccess, eMbMode, LIST_1 ) );
}
else
{
DECRNOK( xReadMotionPredFlags_FGS ( rcMbDataAccess, pcMbDataAccessBase, eMbMode, LIST_0 ) );
DECRNOK( xReadReferenceFramesNoRefPic ( rcMbDataAccess, eMbMode, LIST_0 ) );
DECRNOK( xReadMotionVectors ( rcMbDataAccess, eMbMode, LIST_0 ) );
}
}
//===== residual prediction flag =====
Bool bBaseCoeff = ( pcMbDataAccessBase->getMbData().getMbCbp() != 0 );
DECRNOK( m_pcMbSymbolReadIf->resPredFlag_FGS( rcMbDataAccess, bBaseCoeff ) );
// nasty again, set reference pics
// <<<<<
if( rcMbDataAccess.getSH().isH264AVCCompatible() )
{
SliceHeader& rcSH = rcMbDataAccess.getSH();
for( UInt uiListIdx = 0; uiListIdx < UInt( rcSH.isInterB() ? 2 : 1 ); uiListIdx++ )
{
ListIdx eListIdx = ListIdx( uiListIdx );
MbMotionData& rcMbMotionData = rcMbDataAccess.getMbMotionData( eListIdx );
for( B8x8Idx c8x8Idx; c8x8Idx.isLegal(); c8x8Idx++ )
{
if( rcMbDataAccess.getMbData().isBlockFwdBwd( c8x8Idx.b8x8Index() , eListIdx ) )
{
const Frame* pcRefFrame = rcSH.getRefPic( rcMbMotionData.getRefIdx( c8x8Idx.b8x8Index() ), eListIdx ).getFrame();
rcMbMotionData.setRefPic( pcRefFrame, c8x8Idx.b8x8() );
}
}
}
}
// >>>>>
}
catch(...)
{
// ===== ERROR HANDLING (typically truncated FGS slice) =====
// ----- restore base layer forward/backward indication -----
pcMbDataAccessBase->getMbData().setFwdBwd( uiFwdBwdBase );
// ----- mark as skipped macroblock -----
RNOK( rcMbDataAccess.getMbData().copyMotion( pcMbDataAccessBase->getMbData() ) );
rcMbDataAccess.getMbData().copyFrom ( pcMbDataAccessBase->getMbData() );
rcMbDataAccess.getMbData().setBLSkipFlag( true );
throw;
}
pcMbDataAccessBase->getMbData().setFwdBwd( uiFwdBwdBase );
return Err::m_nOK;
}
ErrVal MbParser::xReadMbType( MbDataAccess& rcMbDataAccess )
{
DECRNOK( m_pcMbSymbolReadIf->mbMode( rcMbDataAccess ) );
ROFRS( rcMbDataAccess.getMbData().isInter8x8(), Err::m_nOK );
DECRNOK( m_pcMbSymbolReadIf->blockModes( rcMbDataAccess ) );
return Err::m_nOK;
}
ErrVal MbParser::xReadIntraPredModes( MbDataAccess& rcMbDataAccess )
{
ROFRS( rcMbDataAccess.getMbData().isIntra(), Err::m_nOK );
if( rcMbDataAccess.getMbData().isIntra4x4() )
{
if( rcMbDataAccess.getSH().getPPS().getTransform8x8ModeFlag() )
{
DECRNOK( m_pcMbSymbolReadIf->transformSize8x8Flag( rcMbDataAccess ) );
}
if( rcMbDataAccess.getMbData().isTransformSize8x8() )
{
for( B8x8Idx cIdx; cIdx.isLegal(); cIdx++ )
{
DECRNOK( m_pcMbSymbolReadIf->intraPredModeLuma8x8( rcMbDataAccess, cIdx ) );
}
}
else
{
for( S4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
{
DECRNOK( m_pcMbSymbolReadIf->intraPredModeLuma( rcMbDataAccess, cIdx ) );
}
}
}
if( rcMbDataAccess.getMbData().isIntra4x4() || rcMbDataAccess.getMbData().isIntra16x16() )
{
DECRNOK( m_pcMbSymbolReadIf->intraPredModeChroma( rcMbDataAccess ) );
}
return Err::m_nOK;
}
ErrVal MbParser::xGet8x8BlockMv( MbDataAccess& rcMbDataAccess, B8x8Idx c8x8Idx, ListIdx eLstIdx )
{
ParIdx8x8 eParIdx = c8x8Idx.b8x8();
switch( rcMbDataAccess.getMbData().getBlkMode( c8x8Idx.b8x8Index() ) )
{
case BLK_8x8:
{
DECRNOK( m_pcMbSymbolReadIf->mvd( rcMbDataAccess, eLstIdx, eParIdx ) );
break;
}
case BLK_8x4:
{
DECRNOK( m_pcMbSymbolReadIf->mvd( rcMbDataAccess, eLstIdx, eParIdx, SPART_8x4_0 ) );
DECRNOK( m_pcMbSymbolReadIf->mvd( rcMbDataAccess, eLstIdx, eParIdx, SPART_8x4_1 ) );
break;
}
case BLK_4x8:
{
DECRNOK( m_pcMbSymbolReadIf->mvd( rcMbDataAccess, eLstIdx, eParIdx, SPART_4x8_0 ) );
DECRNOK( m_pcMbSymbolReadIf->mvd( rcMbDataAccess, eLstIdx, eParIdx, SPART_4x8_1 ) );
break;
}
case BLK_4x4:
{
DECRNOK( m_pcMbSymbolReadIf->mvd( rcMbDataAccess, eLstIdx, eParIdx, SPART_4x4_0 ) );
DECRNOK( m_pcMbSymbolReadIf->mvd( rcMbDataAccess, eLstIdx, eParIdx, SPART_4x4_1 ) );
DECRNOK( m_pcMbSymbolReadIf->mvd( rcMbDataAccess, eLstIdx, eParIdx, SPART_4x4_2 ) );
DECRNOK( m_pcMbSymbolReadIf->mvd( rcMbDataAccess, eLstIdx, eParIdx, SPART_4x4_3 ) );
break;
}
case BLK_SKIP:
{
break;
}
default:
{
return Err::m_nERR;
}
}
return Err::m_nOK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -