⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mbdataaccess.h

📁 SVC最新更新代码
💻 H
📖 第 1 页 / 共 4 页
字号:
  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 + -