📄 mbdataaccess.cpp
字号:
if( ( m_cMv3D_A.getRef()==BLOCK_NOT_AVAILABLE ||
m_cMv3D_B.getRef()==BLOCK_NOT_AVAILABLE ) ||
( m_cMv3D_A.getHor()==0 && m_cMv3D_A.getVer()==0 && m_cMv3D_A.getRef()==1 ) ||
( m_cMv3D_B.getHor()==0 && m_cMv3D_B.getVer()==0 && m_cMv3D_B.getRef()==1 ) )
{
cMvPred.setZero();
}
const Frame* pcFrame = ( m_rcSliceHeader.getRefPic ( 1, getMbPicType(), LIST_0 ).getFrame() );
getMbMotionData( LIST_0 ).setRefIdx ( 1 );
getMbMotionData( LIST_0 ).setRefPic( pcFrame );
getMbMotionData( LIST_0 ).setAllMv( cMvPred );
}
Void MbDataAccess::getMvPredictorSkipMode( Mv& rcMvPred )
{
xGetMvPredictor( rcMvPred, 1, LIST_0, MEDIAN, B4x4Idx(0), B4x4Idx(3) );
if( ( m_cMv3D_A.getRef()==BLOCK_NOT_AVAILABLE ||
m_cMv3D_B.getRef()==BLOCK_NOT_AVAILABLE ) ||
( m_cMv3D_A.getHor()==0 && m_cMv3D_A.getVer()==0 && m_cMv3D_A.getRef()==1 ) ||
( m_cMv3D_B.getHor()==0 && m_cMv3D_B.getVer()==0 && m_cMv3D_B.getRef()==1 ) )
{
rcMvPred.setZero();
}
}
Void MbDataAccess::getMvPredictors( Mv* pcMv ) const
{
pcMv[ 0 ] = m_cMv3D_A;
pcMv[ 1 ] = m_cMv3D_B;
pcMv[ 2 ] = m_cMv3D_C;
}
Void MbDataAccess::setAvailableMask()
{
B4x4Idx cIdx;
B4x4Idx cIdx0(0);
B4x4Idx cIdx3(3);
B4x4Idx cIdx8(8);
//===== get availability for upper half of the macroblock =====
UInt bAvailable0 = 0;
if( ! xIsAvailableIntra( xGetBlockLeft( ( cIdx = cIdx0 ) ) ) )
{
bAvailable0 |= NO_LEFT_REF;
}
if( ! xIsAvailableIntra( xGetBlockAbove( ( cIdx = cIdx0 ) ) ) )
{
bAvailable0 |= NO_ABOVE_REF;
}
if( ! xIsAvailableIntra( xGetBlockAboveLeft( ( cIdx = cIdx0 ) ) ) )
{
bAvailable0 |= NO_ABOVELEFT_REF;
}
if( ! xIsAvailableIntra( xGetBlockAboveRight( ( cIdx = cIdx3 ) ) ) )
{
bAvailable0 |= NO_ABOVERIGHT_REF;
}
//===== get availability for lower half of the macroblock =====
UInt bAvailable8 = NO_ABOVERIGHT_REF;
if( ! xIsAvailableIntra( xGetBlockLeft( ( cIdx = cIdx8 ) ) ) )
{
bAvailable8 |= NO_LEFT_REF;
}
if( ! xIsAvailableIntra( xGetBlockAboveLeft( ( cIdx = cIdx8 ) ) ) )
{
bAvailable8 |= NO_ABOVELEFT_REF;
}
if( ! getMbData().getFieldFlag() && m_rcMbLeft.getFieldFlag() )
{
if( ! ( bAvailable0 & NO_LEFT_REF ) )
{
if( ! xIsAvailableIntra( xGetBlockLeftBottom( cIdx = cIdx0 ) ) )
{
bAvailable0 |= NO_LEFT_REF;
}
}
if( ! ( bAvailable8 & NO_LEFT_REF ) )
{
if( ! xIsAvailableIntra( xGetBlockLeftBottom( cIdx = cIdx0 ) ) )
{
bAvailable8 |= NO_LEFT_REF;
}
}
}
m_uiAvailable = bAvailable0 + ( bAvailable8 << 4 );
}
UInt MbDataAccess::getConvertBlkMode( Par8x8 ePar8x8 )
{
const BlkMode eBlkMode = m_rcMbCurr.getBlkMode( ePar8x8 );
AOT_DBG( m_rcSliceHeader.isIntra() );
ROTRS( ! m_rcSliceHeader.isInterB(), eBlkMode - BLK_8x8 );
UInt uiCode;
UInt uiFwdBwd = m_rcMbCurr.getBlockFwdBwd( ePar8x8 );
switch( eBlkMode )
{
case BLK_SKIP:
{
uiCode = 0;
break;
}
case BLK_8x8:
{
uiCode = uiFwdBwd;
break;
}
case BLK_8x4:
{
uiCode = 2+2*uiFwdBwd;
break;
}
case BLK_4x8:
{
uiCode = 3+2*uiFwdBwd;
break;
}
case BLK_4x4:
{
uiCode = 9 + uiFwdBwd;
break;
}
default:
{
AF();
return MSYS_UINT_MAX;
}
}
return uiCode;
}
ErrVal MbDataAccess::setConvertBlkMode( Par8x8 ePar8x8, UInt uiBlockMode )
{
if( m_rcSliceHeader.isInterB() )
{
ROT( uiBlockMode > 13 );
m_rcMbCurr.setBlkMode( ePar8x8, m_aucBMTabB0[uiBlockMode] );
m_rcMbCurr.addFwdBwd( ePar8x8, m_aucBMTabB1[uiBlockMode] );
return Err::m_nOK;
}
else
{
ROT( uiBlockMode >= 4 );
m_rcMbCurr.setBlkMode( ePar8x8, m_aucBMTabP[uiBlockMode] );
m_rcMbCurr.addFwdBwd( ePar8x8, 1 );
return Err::m_nOK;
}
return Err::m_nERR;
}
UInt MbDataAccess::getConvertMbType()
{
MbMode eMbMode = m_rcMbCurr.getMbMode();
ROTRS( m_rcSliceHeader.isInterP(), eMbMode );
ROTRS( m_rcSliceHeader.isIntra(), eMbMode - INTRA_4X4 );
if( m_rcSliceHeader.isInterB() )
{
UInt uiMbType = 0;
switch( eMbMode )
{
case MODE_SKIP:
{
uiMbType = 1;
break;
}
case MODE_16x16:
{
uiMbType = 1 + m_rcMbCurr.getBlockFwdBwd( B_8x8_0 );
break;
}
case MODE_16x8:
{
UInt uiIndex = 3*m_rcMbCurr.getBlockFwdBwd( B_8x8_0 );
uiIndex -= m_rcMbCurr.getBlockFwdBwd( B_8x8_2 );
uiMbType = 1 + m_aucMbType1x2[uiIndex];
break;
}
case MODE_8x16:
{
UInt uiIndex = 3*m_rcMbCurr.getBlockFwdBwd( B_8x8_0 );
uiIndex -= m_rcMbCurr.getBlockFwdBwd( B_8x8_1 );
uiMbType = 1 + m_aucMbType2x1[uiIndex];
break;
}
case MODE_8x8:
{
uiMbType = 1 + 22;
break;
}
case MODE_PCM:
{
uiMbType = 1 + 48;
break;
}
default:
{
ROT( eMbMode < INTRA_4X4 );
uiMbType = 1 + (eMbMode - INTRA_4X4 + 23);
break;
}
}
return uiMbType;
}
AF();
return MSYS_UINT_MAX;
}
ErrVal MbDataAccess::setConvertMbType( UInt uiMbType )
{
if( m_rcSliceHeader.isInterB() )
{
if( uiMbType < 23 )
{
m_rcMbCurr.setMbMode( m_aausInterBMbType0[ uiMbType ] );
m_rcMbCurr.setFwdBwd( m_aausInterBMbType1[ uiMbType ] );
return Err::m_nOK;
}
ROT( uiMbType > 25 + 23 );
m_rcMbCurr.setMbMode( MbMode(uiMbType-23+INTRA_4X4) );
m_rcMbCurr.setFwdBwd( 0 );
return Err::m_nOK;
}
if( m_rcSliceHeader.isIntra() )
{
ROT( uiMbType > 25 );
m_rcMbCurr.setMbMode( MbMode(uiMbType + INTRA_4X4) );
m_rcMbCurr.setFwdBwd( 0 );
return Err::m_nOK;
}
// inter P
m_rcMbCurr.setMbMode( MbMode(++uiMbType) );
m_rcMbCurr.setFwdBwd( (uiMbType < INTRA_4X4) ? 0x1111 : 0 );
ROT( uiMbType > 25 + 6 );
return Err::m_nOK;
}
Bool MbDataAccess::getMvPredictorDirect( ParIdx8x8 eParIdx,
Bool& rbOneMv,
Bool bFaultTolerant,
RefFrameList* pcL0RefFrameList,
RefFrameList* pcL1RefFrameList )
{
rbOneMv = getSH().getSPS().getDirect8x8InferenceFlag();
if( getSH().getDirectSpatialMvPredFlag() )
{
return xSpatialDirectMode ( eParIdx, rbOneMv, pcL0RefFrameList, pcL1RefFrameList );
}
return xTemporalDirectMode( eParIdx, rbOneMv, bFaultTolerant );
}
// TMM_EC
Bool MbDataAccess::getMvPredictorDirectVirtual( ParIdx8x8 eParIdx,
Bool& rbOneMv,
Bool bFaultTolerant,
RefFrameList& rcL0RefFrameList,
RefFrameList& rcL1RefFrameList )
{
rbOneMv = getSH().getSPS().getDirect8x8InferenceFlag();
return xTemporalDirectModeVirtual( eParIdx, rbOneMv, bFaultTolerant, rcL0RefFrameList, rcL1RefFrameList);
}
// TMM_EC }}
Bool MbDataAccess::xSpatialDirectMode( ParIdx8x8 eParIdx, Bool b8x8, RefFrameList* pcL0RefFrameList, RefFrameList* pcL1RefFrameList )
{
UInt uiLstIdx;
Bool bDirectZeroPred = false;
Bool bAllColNonZero = false;
Bool bColZeroFlagBlk0 = false;
Bool bColZeroFlagBlk1 = false;
Bool bColZeroFlagBlk2 = false;
Bool bColZeroFlagBlk3 = false;
//===== get reference indices and spatially predicted motion vectors =====
Mv acMvPred[2];
SChar ascRefIdx[2];
xSetNeighboursMvPredictor(LIST_0, B4x4Idx(0), B4x4Idx(3) );
if( ( ascRefIdx[LIST_0] = m_cMv3D_A.minRefIdx( m_cMv3D_B ).minRefIdx( m_cMv3D_C ).getRef() ) > 0 )
{
xGetMvPredictorUseNeighbours( acMvPred[LIST_0], ascRefIdx[LIST_0], MEDIAN );
}
xSetNeighboursMvPredictor(LIST_1, B4x4Idx(0), B4x4Idx(3) );
if( ( ascRefIdx[LIST_1] = m_cMv3D_A.minRefIdx( m_cMv3D_B ).minRefIdx( m_cMv3D_C ).getRef() ) > 0 )
{
xGetMvPredictorUseNeighbours( acMvPred[LIST_1], ascRefIdx[LIST_1], MEDIAN );
}
//===== check reference indices =====
if( ascRefIdx[LIST_0] < 1 && ascRefIdx[LIST_1] < 1 )
{
ascRefIdx[LIST_0] = 1;
ascRefIdx[LIST_1] = 1;
bDirectZeroPred = true;
bAllColNonZero = true;
}
//===== check co-located =====
if( ! bAllColNonZero )
{
SChar scRefIdxCol;
Mv acMvCol[4];
if( ! bAllColNonZero )
{
if( NULL != pcL0RefFrameList && NULL != pcL1RefFrameList )
{
// no Long term support
bAllColNonZero = false;
}
else
{
const RefPic& rcRefPic = m_rcSliceHeader.getRefPic( 1, getMbPicType(), LIST_1 );
bAllColNonZero = ( ! rcRefPic.getFrame()->isShortTerm() );
}
}
if( ! bAllColNonZero )
{
if( b8x8 )
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -