📄 mbdataaccess.h
字号:
RefFrameList* pcL0RefFrameList=NULL,
RefFrameList* pcL1RefFrameList=NULL );
// TMM_EC {{
Bool getMvPredictorDirectVirtual ( ParIdx8x8 eParIdx, Bool& rbOneMv, Bool bFaultTolerant, RefFrameList& rcRefFrameListL0, RefFrameList& rcRefFrameListL1 );
// TMM_EC }}
const DFP& getDeblockingFilterParameter(Bool bInterlayer=false) const { if (bInterlayer) return m_rcDFP.getInterlayerDeblockingFilterParameter();
else return m_rcDFP.getDeblockingFilterParameter();}
Void getMvSkipMode( Mv& rcMv )
{
xGetMvPredictor( rcMv, 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 ) )
{
rcMv.setZero();
}
}
MbDataAccess* getMbDataAccessBase() const { return m_pcMbDataAccessBase; }
Void setMbDataAccessBase( MbDataAccess* p ) { m_pcMbDataAccessBase = p; }
UInt getMbX() const { return m_uiPosX; }
UInt getMbY() const { return m_uiPosY; }
Void setAvailableMask ();
protected:
Void xSetMvPredictorsBL ( const Mv& rcMvPredBL, ListIdx eListIdx, LumaIdx cIdx, LumaIdx cIdxEnd );
Void xGetMvPredictor ( Mv& rcMvPred, SChar scRef, ListIdx eListIdx, PredictionType ePredType, LumaIdx cIdx, LumaIdx cIdxEnd );
Void xSetNeighboursMvPredictor ( ListIdx eListIdx, LumaIdx cIdx, LumaIdx cIdxEnd );
Void xGetMvPredictorUseNeighbours( Mv& rcMvPred, SChar scRef, PredictionType ePredType );
__inline const MbData& xGetMbLeft () const;
__inline const MbData& xGetMbAbove () const;
__inline const MbData& xGetBlockLeft ( LumaIdx& rcIdx ) const;
__inline const MbData& xGetBlockLeftBottom ( LumaIdx& rcIdx ) const;
__inline const MbData& xGetBlockAbove ( LumaIdx& rcIdx ) const;
__inline const MbData& xGetBlockAboveLeft ( LumaIdx& cIdx ) const;
__inline const MbData& xGetBlockAboveRight ( LumaIdx& cIdx ) const;
__inline UInt xGetLeftCodedBlockBit ( UInt uiBit ) const;
__inline UInt xGetAboveCodedBlockBit ( UInt uiBit ) const;
__inline SChar xGetRefIdxLeft ( ListIdx eListIdx, ParIdx8x8 eParIdx ) const;
__inline SChar xGetRefIdxAbove( ListIdx eListIdx, ParIdx8x8 eParIdx ) const;
enum MvRefConversion
{
ONE_TO_ONE,
FRM_TO_FLD,
FLD_TO_FRM
};
__inline const MbData& xGetBlockColocated ( LumaIdx& rcIdx, MvRefConversion& eMvRefConversion ) const;
__inline const MbData& xGetBlockColocatedNonInterlaced () const;
__inline Bool xGetMotPredFlagLeft ( ListIdx eListIdx, ParIdx8x8 eParIdx ) const;
__inline Bool xGetMotPredFlagAbove( ListIdx eListIdx, ParIdx8x8 eParIdx ) const;
__inline Void xGetColocatedMvRefIdx ( Mv& rcMv, SChar& rscRefIdx, LumaIdx cIdx ) const;
__inline const RefPic& xGetColocatedMvRefPic ( Mv& rcMv, SChar& rscRefIdx, LumaIdx cIdx ) const;
__inline Void xGetColocatedMvsRefIdxNonInterlaced( Mv acMv[], SChar& rscRefIdx, ParIdx8x8 eParIdx ) const;
__inline const RefPic& xGetColocatedMvsRefPicNonInterlaced( Mv acMv[], SChar& rscRefIdx, ParIdx8x8 eParIdx ) const;
Bool xSpatialDirectMode ( ParIdx8x8 eParIdx, Bool b8x8, RefFrameList* pcL0RefFrameList, RefFrameList* pcL1RefFrameList );
Bool xTemporalDirectMode( ParIdx8x8 eParIdx, Bool b8x8, Bool bFaultTolerant);
Bool xTemporalDirectModeMvRef( Mv acMv[], SChar ascRefIdx[], LumaIdx cIdx, Bool bFaultTolerant );
Bool xTemporalDirectModeMvsRefNonInterlaced( Mv aacMv[][4], SChar ascRefIdx[], ParIdx8x8 eParIdx, Bool bFaultTolerant );
// TMM_EC {{
Bool xTemporalDirectModeVirtual( ParIdx8x8 eParIdx, Bool b8x8, Bool bFaultTolerant, RefFrameList& rcRefFrameListL0, RefFrameList& rcRefFrameListL1 );
Bool xTemporalDirectModeMvRefVirtual( Mv acMv[], SChar ascRefIdx[], LumaIdx cIdx, Bool bFaultTolerant, RefFrameList& rcRefFrameListL0, RefFrameList& rcRefFrameListL1);
// TMM_EC }}
Bool xIsAvailable ( const MbData& rcMbData ) const
{
return ( rcMbData.getSliceId() == m_rcMbCurr.getSliceId() );
}
Bool xIsAvailableIntra( const MbData& rcMbData ) const
{
Bool bConstrainedIntraPred = m_rcSliceHeader.getPPS().getConstrainedIntraPredFlag();
return ( xIsAvailable( rcMbData ) && ( rcMbData.isIntra() || ! bConstrainedIntraPred ) );
}
__inline Bool xCheckMv (const Mv& rcMv) const
{
UInt uiLevel = getSH().getSPS().getLevelIdc();
Int iMaxVerMv = getSH().getSPS().getMaxIntMvVer(uiLevel, getSH().getFieldPicFlag() || m_rcMbCurr.getFieldFlag());
Int iMaxHorMv = getSH().getSPS().getMaxIntMvHor();
return ((rcMv.getHor() >= (-iMaxHorMv)) && (rcMv.getHor() < iMaxHorMv) && (rcMv.getVer() >= (-iMaxVerMv)) && (rcMv.getVer() < iMaxVerMv));
}
private:
static const BlkMode m_aucBMTabB0[13];
static const UChar m_aucBMTabB1[13];
static const BlkMode m_aucBMTabP[4];
static const MbMode m_aausInterBMbType0[23];
static const UShort m_aausInterBMbType1[23];
static const UChar m_aucMbType1x2[9];
static const UChar m_aucMbType2x1[9];
static const UChar m_aucChroma2LumaIdx[8];
static const UChar m_auc4x4Idx28x8Idx[16];
public:
MbData& m_rcMbCurr;
MbData& m_rcMbComplementary;
const MbData& m_rcMbLeft;
const MbData& m_rcMbAbove;
const MbData& m_rcMbAboveLeft;
const MbData& m_rcMbAboveRight;
const MbData& m_rcMbAboveAbove;
const MbData& m_rcMbAboveAboveLeft;
const MbData& m_rcMbAboveAboveRight;
const MbData& m_rcMbBelowLeft;
const MbData& m_rcMbUnavailable;
const MbData& m_rcMbColocatedTop;
const MbData& m_rcMbColocatedBot;
SliceHeader& m_rcSliceHeader;
const DFPScalable& m_rcDFP;
Mv3D m_cMv3D_A;
Mv3D m_cMv3D_B;
Mv3D m_cMv3D_C;
UInt m_uiAvailable;
UInt m_uiPosX;
UInt m_uiPosY;
Bool m_bTopMb;
Bool m_bUseTopField;
Bool m_bColocatedField;
Bool m_bIsTopRowMb;
Bool m_bMbAff;
SChar m_ucLastMbQp;
PicType m_eMbPicType;
MbDataAccess* m_pcMbDataAccessBase;
};
__inline Void MbDataAccess::getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx )
{
xGetMvPredictor( rcMv, scRef, eListIdx, MEDIAN, B4x4Idx( 0 ), B4x4Idx( 3 ) );
}
__inline Void MbDataAccess::getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx16x8 eParIdx )
{
PredictionType ePred = ( eParIdx == PART_16x8_0 ? PRED_B : PRED_A );
xGetMvPredictor( rcMv, scRef, eListIdx, ePred, B4x4Idx( eParIdx ), B4x4Idx( eParIdx+3 ) );
}
__inline Void MbDataAccess::getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx8x16 eParIdx )
{
PredictionType ePred = ( eParIdx == PART_8x16_0 ? PRED_A : PRED_C );
xGetMvPredictor( rcMv, scRef, eListIdx, ePred, B4x4Idx( eParIdx ), B4x4Idx( eParIdx+1 ) );
}
__inline Void MbDataAccess::getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx8x8 eParIdx )
{
xGetMvPredictor( rcMv, scRef, eListIdx, MEDIAN, B4x4Idx( eParIdx ), B4x4Idx( eParIdx+1 ) );
}
__inline Void MbDataAccess::getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx8x4 eSParIdx )
{
xGetMvPredictor( rcMv, scRef, eListIdx, MEDIAN, B4x4Idx( eParIdx+eSParIdx ), B4x4Idx( eParIdx+eSParIdx+1 ) );
}
__inline Void MbDataAccess::getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx4x8 eSParIdx )
{
xGetMvPredictor( rcMv, scRef, eListIdx, MEDIAN, B4x4Idx( eParIdx+eSParIdx ), B4x4Idx( eParIdx+eSParIdx ) );
}
__inline Void MbDataAccess::getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx4x4 eSParIdx )
{
xGetMvPredictor( rcMv, scRef, eListIdx, MEDIAN, B4x4Idx( eParIdx+eSParIdx ), B4x4Idx( eParIdx+eSParIdx ) );
}
__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx )
{
xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( 0 ), B4x4Idx( 3 ) );
}
__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx, ParIdx16x8 eParIdx )
{
xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( eParIdx ), B4x4Idx( eParIdx+3 ) );
}
__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx, ParIdx8x16 eParIdx )
{
xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( eParIdx ), B4x4Idx( eParIdx+1 ) );
}
__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx, ParIdx8x8 eParIdx )
{
xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( eParIdx ), B4x4Idx( eParIdx+1 ) );
}
__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx8x4 eSParIdx )
{
xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( eParIdx+eSParIdx ), B4x4Idx( eParIdx+eSParIdx+1 ) );
}
__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx4x8 eSParIdx )
{
xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( eParIdx+eSParIdx ), B4x4Idx( eParIdx+eSParIdx ) );
}
__inline Void MbDataAccess::setMvPredictorsBL( const Mv& rcMv, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx4x4 eSParIdx )
{
xSetMvPredictorsBL( rcMv, eListIdx, B4x4Idx( eParIdx+eSParIdx ), B4x4Idx( eParIdx+eSParIdx ) );
}
__inline SChar MbDataAccess::xGetRefIdxLeft( ListIdx eListIdx, ParIdx8x8 eParIdx ) const
{
B4x4Idx cIdx( eParIdx );
const MbData& rcMbData = xGetBlockLeft( cIdx );
if( rcMbData.getBLSkipFlag() || rcMbData.getMbMotionData( eListIdx ).getMotPredFlag( ParIdx8x8( cIdx.b4x4() ) ) )
{
return BLOCK_NOT_AVAILABLE;
}
if( m_rcSliceHeader.isInterB() )
{
if( rcMbData.getMbMode() == MODE_SKIP || ( rcMbData.getMbMode() == MODE_8x8 && rcMbData.getBlkMode( Par8x8( 2*(cIdx.y()/2) + cIdx.x()/2 ) ) == BLK_SKIP ) )
return BLOCK_NOT_AVAILABLE;
}
SChar scRefIdx = rcMbData.getMbMotionData( eListIdx ).getRefIdx( ParIdx8x8( cIdx.b4x4() ) );
if( scRefIdx > BLOCK_NOT_AVAILABLE )
{
if( rcMbData.getFieldFlag() && ! m_rcMbCurr.getFieldFlag() )
{
scRefIdx = ((scRefIdx-1)>>1)+1;
}
else if( ! rcMbData.getFieldFlag() && m_rcMbCurr.getFieldFlag() )
{
scRefIdx = ((scRefIdx-1)<<1)+1;
}
}
return scRefIdx;
}
__inline SChar MbDataAccess::xGetRefIdxAbove( ListIdx eListIdx, ParIdx8x8 eParIdx ) const
{
B4x4Idx cIdx( eParIdx );
const MbData& rcMbData = xGetBlockAbove( cIdx );
if( rcMbData.getBLSkipFlag() || rcMbData.getMbMotionData( eListIdx ).getMotPredFlag( ParIdx8x8( cIdx.b4x4() ) ) )
{
return BLOCK_NOT_AVAILABLE;
}
if( m_rcSliceHeader.isInterB() )
{
if( rcMbData.getMbMode() == MODE_SKIP || ( rcMbData.getMbMode() == MODE_8x8 && rcMbData.getBlkMode( Par8x8( 2*(cIdx.y()/2) + cIdx.x()/2 ) ) == BLK_SKIP ) )
return BLOCK_NOT_AVAILABLE;
}
SChar scRefIdx = rcMbData.getMbMotionData( eListIdx ).getRefIdx( ParIdx8x8( cIdx.b4x4() ) );
if( scRefIdx > BLOCK_NOT_AVAILABLE )
{
if( rcMbData.getFieldFlag() && ! m_rcMbCurr.getFieldFlag() )
{
scRefIdx = ((scRefIdx-1)>>1)+1;
}
else if( ! rcMbData.getFieldFlag() && m_rcMbCurr.getFieldFlag() )
{
scRefIdx = ((scRefIdx-1)<<1)+1;
}
}
return scRefIdx;
}
__inline Bool MbDataAccess::xGetMotPredFlagLeft( ListIdx eListIdx, ParIdx8x8 eParIdx ) const
{
B4x4Idx cIdx( eParIdx );
const MbData& rcMbData = xGetBlockLeft( cIdx );
Bool bFlag = rcMbData.getMbMotionData( eListIdx ).getMotPredFlag( ParIdx8x8( cIdx.b4x4() ) );
return bFlag;
}
__inline Bool MbDataAccess::xGetMotPredFlagAbove( ListIdx eListIdx, ParIdx8x8 eParIdx ) const
{
B4x4Idx cIdx( eParIdx );
const MbData& rcMbData = xGetBlockAbove( cIdx );
Bool bFlag = rcMbData.getMbMotionData( eListIdx ).getMotPredFlag( ParIdx8x8( cIdx.b4x4() ) );
return bFlag;
}
__inline Void MbDataAccess::getMvdLeft( Mv& rcMv, ListIdx eListIdx, LumaIdx cIdx ) const
{
const MbData& rcMbData = xGetBlockLeft( cIdx );
rcMv = rcMbData.getMbMvdData( eListIdx ).getMv( cIdx );
if( rcMbData.getFieldFlag() && ! m_rcMbCurr.getFieldFlag() )
{
rcMv.setVer( rcMv.getVer() * 2 );
}
else if( ! rcMbData.getFieldFlag() && m_rcMbCurr.getFieldFlag() )
{
rcMv.setVer( rcMv.getVer() / 2 );
}
}
__inline Void MbDataAccess::getMvdAbove( Mv& rcMv, ListIdx eListIdx, LumaIdx cIdx ) const
{
const MbData& rcMbData = xGetBlockAbove( cIdx );
rcMv = rcMbData.getMbMvdData( eListIdx ).getMv( cIdx );
if( rcMbData.getFieldFlag() && ! m_rcMbCurr.getFieldFlag() )
{
rcMv.setVer( rcMv.getVer() * 2 );
}
else if( ! rcMbData.getFieldFlag() && m_rcMbCurr.getFieldFlag() )
{
rcMv.setVer( rcMv.getVer() / 2 );
}
}
__inline UInt MbDataAccess::getCtxCoeffCount( LumaIdx cIdx ) const
{
Bool bLeftAvailable = false;
UInt uiCoeffCount = 0;
{
B4x4Idx cIdxL( cIdx.b4x4() );
const MbData& rcMbDataLeft = xGetBlockLeft( cIdxL );
if( xIsAvailable( rcMbDataLeft ) )
{
bLeftAvailable = true;
uiCoeffCount = rcMbDataLeft.getMbTCoeffs().getCoeffCount( cIdxL );
}
}
const MbData& rcMbDataAbove = xGetBlockAbove( cIdx );
if( xIsAvailable( rcMbDataAbove ) )
{
uiCoeffCount += rcMbDataAbove.getMbTCoeffs().getCoeffCount( cIdx );
if( bLeftAvailable )
{
uiCoeffCount += 1;
uiCoeffCount >>= 1;
}
}
if( 4 > uiCoeffCount )
{
uiCoeffCount >>= 1;
}
else
{
uiCoeffCount = ( 8 > uiCoeffCount) ? 2 : 3;
}
return uiCoeffCount;
}
__inline UInt MbDataAccess::getCtxCoeffCount( ChromaIdx cIdx ) const
{
Bool bLeftAvailable = false;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -