📄 mbdataaccess.h
字号:
UInt getCtx8x8Flag ( UInt uiStart, UInt uiStop ) const;
UInt getCtx8x8Flag () const;
UInt getCtxFieldFlag() const; // TMM_INTERLACE
UInt getLeftLumaCbp ( LumaIdx cIdx, UInt uiStart, UInt uiStop, Bool bReCalc ) const;
UInt getAboveLumaCbp ( LumaIdx cIdx, UInt uiStart, UInt uiStop, Bool bReCalc ) const;
UInt getLeftChromaCbp ( UInt uiStart, UInt uiStop, Bool bReCalc ) const;
UInt getAboveChromaCbp ( UInt uiStart, UInt uiStop, Bool bReCalc ) const;
Void getMvdLeft ( Mv& rcMv, ListIdx eListIdx, LumaIdx cIdx ) const;
Void getMvdAbove ( Mv& rcMv, ListIdx eListIdx, LumaIdx cIdx ) const;
Void getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx );
Void getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx16x8 eParIdx );
Void getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx8x16 eParIdx );
Void getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx8x8 eParIdx );
Void getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx8x4 eSParIdx );
Void getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx4x8 eSParIdx );
Void getMvPredictor( Mv& rcMv, SChar scRef, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx4x4 eSParIdx );
Void setMvPredictorsBL( const Mv& rcMvBL, ListIdx eListIdx );
Void setMvPredictorsBL( const Mv& rcMvBL, ListIdx eListIdx, ParIdx16x8 eParIdx );
Void setMvPredictorsBL( const Mv& rcMvBL, ListIdx eListIdx, ParIdx8x16 eParIdx );
Void setMvPredictorsBL( const Mv& rcMvBL, ListIdx eListIdx, ParIdx8x8 eParIdx );
Void setMvPredictorsBL( const Mv& rcMvBL, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx8x4 eSParIdx );
Void setMvPredictorsBL( const Mv& rcMvBL, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx4x8 eSParIdx );
Void setMvPredictorsBL( const Mv& rcMvBL, ListIdx eListIdx, ParIdx8x8 eParIdx, SParIdx4x4 eSParIdx );
Void getMvPredictors ( Mv* pcMv ) const;
Void getMvPredictorSkipMode();
Void getMvPredictorSkipMode( Mv& cMvPred );
Bool getMvPredictorDirect( ParIdx8x8 eParIdx,
Bool& rbOneMv,
Bool bFaultTolerant,
RefFrameList* pcL0RefFrameList=NULL,
RefFrameList* pcL1RefFrameList=NULL );
ErrVal setSVCDirectModeMvAndRef( RefFrameList& rcRefList0, RefFrameList& rcRefList1, Int i8x8Blk = -1 );
const DBFilterParameter& getDBFilterParameter( Bool bInterLayer = false )
{
if( bInterLayer )
{
return m_rcSliceHeader.getInterLayerDeblockingFilterParameter();
}
return m_rcSliceHeader.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, UInt uiStart, UInt uiStop, Bool bReCalc ) const;
__inline UInt xGetAboveCodedBlockBit ( UInt uiBit, UInt uiStart, UInt uiStop, Bool bReCalc ) 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 Void xGetColocatedMvsRefIdxNonInterlaced( Mv acMv[], SChar& rscRefIdx, ParIdx8x8 eParIdx ) const;
__inline const RefPicIdc& xGetColocatedMvRefPic ( Mv& rcMv, SChar& rscRefIdx, LumaIdx cIdx ) const;
__inline const RefPicIdc& 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 );
Bool xIsAvailable ( const MbData& rcMbData ) const
{
return ( rcMbData.getSliceId() == m_rcMbCurr.getSliceId() );
}
Bool xIsAvailableIntra( const MbData& rcMbData ) const
{
if( !xIsAvailable( rcMbData ) )
{
return false;
}
if( !m_rcSliceHeader.getPPS().getConstrainedIntraPredFlag() )
{
return true;
}
if( m_rcSliceHeader.getTCoeffLevelPredictionFlag() )
{
return rcMbData.isIntra();
}
if( rcMbData.isPCM() )
{
return ! rcMbData.getBLSkipFlag(); // for decoder
}
return rcMbData.isIntraButnotIBL();
}
__inline Bool xCheckMv (const Mv& rcMv) const
{
UInt uiLevel = getSH().getSPS().getConvertedLevelIdc();
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;
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;
SChar m_ucLastMbQp4LF;
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.isBSlice() )
{
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.isBSlice() )
{
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
{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -