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

📄 loopfilter.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
	    uiMbAddress = rcSH.getFMO()->getNextMBNr(uiMbAddress );    
	  }
  }
  //<- ICU/ETRI DS

  m_apcIntYuvBuffer[ TOP_FIELD ] = 
  m_apcIntYuvBuffer[ BOT_FIELD ] = 
  m_apcIntYuvBuffer[     FRAME ] = NULL;

  return Err::m_nOK;
}

__inline 
ErrVal LoopFilter::xFilterMbFast( const MbDataAccess& rcMbDataAccess, bool enhancedLayerFlag ) //V032 of FSL, disabling chroma deblocking in enh. layer

{
  const DFP& rcDFP      = rcMbDataAccess.getDeblockingFilterParameter();
  const Int iFilterIdc  = rcDFP.getDisableDeblockingFilterIdc();

  ROTRS( iFilterIdc == 1, Err::m_nOK );

  xGetFilterStrengthFast( rcMbDataAccess, iFilterIdc );
  
  if( m_apcIntYuvBuffer[ FRAME ] )
  {
    RNOK( xLumaVerFiltering(   rcMbDataAccess, rcDFP, m_apcIntYuvBuffer[ FRAME ] ) );
    RNOK( xLumaHorFiltering(   rcMbDataAccess, rcDFP, m_apcIntYuvBuffer[ FRAME ] ) );
	//V032 of FSL for disabling chroma deblocking in enh. layer
	if (!enhancedLayerFlag || (enhancedLayerFlag && (iFilterIdc !=3 && iFilterIdc != 4)) ) 
	{ 
		RNOK( xChromaVerFiltering( rcMbDataAccess, rcDFP, m_apcIntYuvBuffer[ FRAME ] ) );
		RNOK( xChromaHorFiltering( rcMbDataAccess, rcDFP, m_apcIntYuvBuffer[ FRAME ] ) );
	}

    return Err::m_nOK;
  }

  YuvPicBuffer* pcYuvBuffer = m_pcRecFrameUnit->getPic( rcMbDataAccess.getSH().getPicType() )->getFullPelYuvBuffer();

	RNOK( xLumaVerFiltering(   rcMbDataAccess, rcDFP, pcYuvBuffer ) );
  RNOK( xLumaHorFiltering(   rcMbDataAccess, rcDFP, pcYuvBuffer ) );
  //V032 of FSL for disabling chroma deblocking in enh. layer
  if (!enhancedLayerFlag || (enhancedLayerFlag && (iFilterIdc !=3 && iFilterIdc != 4)) ) 
  { 
	RNOK( xChromaVerFiltering( rcMbDataAccess, rcDFP, pcYuvBuffer ) );
	RNOK( xChromaHorFiltering( rcMbDataAccess, rcDFP, pcYuvBuffer ) );
  }
  return Err::m_nOK;
}

ErrVal LoopFilter::xGetFilterStrengthFast( const MbDataAccess& rcMbDataAccess, const Int iFilterIdc )
{
  const MbData& rcMbData = rcMbDataAccess.getMbData();

  const Bool bFrame = ( FRAME == rcMbDataAccess.getMbPicType() );
	const Bool b8x8   = rcMbData.isTransformSize8x8();
  const Int iIntraStrength = (bFrame ? 4 : 3);
  const Short sVerMvThr    = (bFrame ? 4 : 2);

  MbMode eMbMode = rcMbData.getMbMode();

  if( eMbMode >= INTRA_4X4 )
  {
    m_aaaucBs[VER][0][0] = m_aaaucBs[VER][0][1] = m_aaaucBs[VER][0][2] = m_aaaucBs[VER][0][3] = 4;
    m_aaaucBs[VER][1][0] = m_aaaucBs[VER][1][1] = m_aaaucBs[VER][1][2] = m_aaaucBs[VER][1][3] = 3;
    m_aaaucBs[VER][2][0] = m_aaaucBs[VER][2][1] = m_aaaucBs[VER][2][2] = m_aaaucBs[VER][2][3] = 3;
    m_aaaucBs[VER][3][0] = m_aaaucBs[VER][3][1] = m_aaaucBs[VER][3][2] = m_aaaucBs[VER][3][3] = 3;

    m_aaaucBs[HOR][0][0] = m_aaaucBs[HOR][1][0] = m_aaaucBs[HOR][2][0] = m_aaaucBs[HOR][3][0] = iIntraStrength;
    m_aaaucBs[HOR][0][1] = m_aaaucBs[HOR][1][1] = m_aaaucBs[HOR][2][1] = m_aaaucBs[HOR][3][1] = 3;
    m_aaaucBs[HOR][0][2] = m_aaaucBs[HOR][1][2] = m_aaaucBs[HOR][2][2] = m_aaaucBs[HOR][3][2] = 3;
    m_aaaucBs[HOR][0][3] = m_aaaucBs[HOR][1][3] = m_aaaucBs[HOR][2][3] = m_aaaucBs[HOR][3][3] = 3;

    if( b8x8 )
    {
      m_aaaucBs[VER][1][0] = m_aaaucBs[VER][1][1] = m_aaaucBs[VER][1][2] = m_aaaucBs[VER][1][3] = 
      m_aaaucBs[VER][3][0] = m_aaaucBs[VER][3][1] = m_aaaucBs[VER][3][2] = m_aaaucBs[VER][3][3] = 
      m_aaaucBs[HOR][0][1] = m_aaaucBs[HOR][1][1] = m_aaaucBs[HOR][2][1] = m_aaaucBs[HOR][3][1] = 
      m_aaaucBs[HOR][0][3] = m_aaaucBs[HOR][1][3] = m_aaaucBs[HOR][2][3] = m_aaaucBs[HOR][3][3] = 0;
    }
  }
  else
  {
    Bool bCheckHorMv = true;
    Bool bCheckVerMv = true;
    switch( eMbMode ) 
    {
    case MODE_16x16:
      bCheckHorMv = false;
      bCheckVerMv = false;
      break;
    case MODE_16x8:
      bCheckVerMv = false;
      break;
    case MODE_8x16:
      bCheckHorMv = false;
      break;
    case MODE_SKIP:
      if( rcMbData.isInterPMb() )
      {
        bCheckHorMv = false;
        bCheckVerMv = false;
      }
      break;
    case MODE_8x8:
	  case MODE_8x8ref0:
      break;
    default:
      {
        AOT(1)        
        break;
      }
    }

    const Bool bCoded = (0 != (rcMbData.getMbCbp() & 0x0f));
    const MbData& rcMbDataLeft  = rcMbDataAccess.getMbDataLeft();
    const MbData& rcMbDataAbove = (rcMbData.getFieldFlag()? rcMbDataAccess.getMbDataAboveAbove():
                                                            rcMbDataAccess.getMbDataAbove());
    {
      Bool bLeftIntra = rcMbDataLeft.isIntra();
      for( B4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
      {
				if( ! b8x8 || (0 == (cIdx.x() & 1)) )
				{
					m_aaaucBs[VER][cIdx.x()][cIdx.y()] = xGetVerFilterStrengthFast( rcMbData, rcMbDataLeft, cIdx, bLeftIntra, bCheckVerMv, bCoded, sVerMvThr );
				}
				else
				{
					m_aaaucBs[VER][cIdx.x()][cIdx.y()] = 0;
				}
      }
    }

    {
      Bool bAboveIntra = rcMbDataAbove.isIntra();
      for( B4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
      {
				if( ! b8x8 || (0 == (cIdx.y() & 1)) )
				{
					m_aaaucBs[HOR][cIdx.x()][cIdx.y()] = xGetHorFilterStrengthFast( rcMbData, rcMbDataAbove, cIdx, bAboveIntra, bCheckHorMv, bCoded, sVerMvThr, iIntraStrength );
				}
				else
				{
					m_aaaucBs[HOR][cIdx.x()][cIdx.y()] = 0;
				}
      }
    }
  }

  Bool bClearAbove = ! rcMbDataAccess.isAboveMbExisting();
  Bool bClearLeft  = ! rcMbDataAccess.isLeftMbExisting();
  if( iFilterIdc == 2 || iFilterIdc == 4 ) //V032 of FSL
  {
    bClearAbove |= ! rcMbDataAccess.isAvailableAbove();
    bClearLeft  |= ! rcMbDataAccess.isAvailableLeft();
  }
  if( bClearAbove )
  {
    m_aaaucBs[HOR][0][0] = m_aaaucBs[HOR][1][0] = m_aaaucBs[HOR][2][0] = m_aaaucBs[HOR][3][0] = 0;
  }

  if( bClearLeft )
  {
    m_aaaucBs[VER][0][0] = m_aaaucBs[VER][0][1] = m_aaaucBs[VER][0][2] = m_aaaucBs[VER][0][3] = 0;
  }
  
  return Err::m_nOK;
}

__inline
UInt LoopFilter::xGetVerFilterStrengthFast( const MbData& rcMbDataCurr,
                                            const MbData& rcMbDataLeft,
                                            LumaIdx       cIdx,
                                            Bool          bLeftIntra,
                                            Bool          bCheckMv,
                                            Bool          bCoded,
                                            const Short  sVerMvThr)
{
  if( cIdx.x() )
  {
    // this is a edge inside of a macroblock
    if( bCoded )
    {
      ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx                          ), 2 );
      ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx + CURR_MB_LEFT_NEIGHBOUR ), 2 );
    }

    ROTRS( ! bCheckMv, 0 );

    if( rcMbDataCurr.isInterPMb() )
    {
      const MbMotionData& rcMbMotionData = rcMbDataCurr.getMbMotionData( LIST_0 );
      const LumaIdx cQIdx = cIdx + CURR_MB_LEFT_NEIGHBOUR;

      const RefPic& rcRefPicL0Q = rcMbMotionData.getRefPic( cQIdx );
      const RefPic& rcRefPicL0P = rcMbMotionData.getRefPic( cIdx );

      // different reference pictures
      ROTRS( rcRefPicL0Q.getFrame() != rcRefPicL0P.getFrame(), 1 );

      // check the motion vector distance
      const Mv& cMvQ = rcMbMotionData.getMv( cQIdx );
      const Mv& cMvP = rcMbMotionData.getMv( cIdx );

      ROTRS( cMvP.getAbsHorDiff( cMvQ ) >= 4, 1 );
      ROTRS( cMvP.getAbsVerDiff( cMvQ ) >= sVerMvThr, 1 );
      return 0;
    }
    return xCheckMvDataB  ( rcMbDataCurr, cIdx, rcMbDataCurr, cIdx + CURR_MB_LEFT_NEIGHBOUR, 4, sVerMvThr );
  }

  ROTRS( bLeftIntra,  4 );

  ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx                          ), 2 );
  ROTRS( rcMbDataLeft.is4x4BlkCoded( cIdx + LEFT_MB_LEFT_NEIGHBOUR ), 2 );

  return xCheckMvDataB  ( rcMbDataCurr, cIdx, rcMbDataLeft, cIdx + LEFT_MB_LEFT_NEIGHBOUR, 4, sVerMvThr );
}

__inline 
UInt LoopFilter::xGetHorFilterStrengthFast( const MbData& rcMbDataCurr,
                                            const MbData& rcMbDataAbove,
                                            LumaIdx       cIdx,
                                            Bool          bAboveIntra,
                                            Bool          bCheckMv,
                                            Bool          bCoded,
                                            const Short   sVerMvThr,
                                            Int           iIntraStrength )
{
  if( cIdx.y() )
  {
    if( bCoded )
    {
      // internal edge
      ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx                           ), 2 );
      ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx + CURR_MB_ABOVE_NEIGHBOUR ), 2 );
    }

    ROTRS( ! bCheckMv, 0 );
    if( rcMbDataCurr.isInterPMb() )
    {
      const MbMotionData& rcMbMotionData = rcMbDataCurr.getMbMotionData( LIST_0 );
      const LumaIdx cQIdx = cIdx + CURR_MB_ABOVE_NEIGHBOUR;

      const RefPic& rcRefPicL0Q = rcMbMotionData.getRefPic( cQIdx );
      const RefPic& rcRefPicL0P = rcMbMotionData.getRefPic( cIdx );

      // different reference pictures
      ROTRS( rcRefPicL0Q.getFrame() != rcRefPicL0P.getFrame(), 1 );


      // check the motion vector distance
      const Mv& cMvQ = rcMbMotionData.getMv( cQIdx );
      const Mv& cMvP = rcMbMotionData.getMv( cIdx );

      ROTRS( cMvP.getAbsHorDiff( cMvQ ) >= 4, 1 );
      ROTRS( cMvP.getAbsVerDiff( cMvQ ) >= sVerMvThr, 1 );
      return 0;
    }
    return xCheckMvDataB  ( rcMbDataCurr, cIdx, rcMbDataCurr, cIdx + CURR_MB_ABOVE_NEIGHBOUR, 4, sVerMvThr );
  }

  ROTRS( bAboveIntra , iIntraStrength );

  ROTRS( rcMbDataCurr. is4x4BlkCoded( cIdx                            ), 2 );
  ROTRS( rcMbDataAbove.is4x4BlkCoded( cIdx + ABOVE_MB_ABOVE_NEIGHBOUR ), 2 );

  return xCheckMvDataB  ( rcMbDataCurr, cIdx, rcMbDataAbove, cIdx + ABOVE_MB_ABOVE_NEIGHBOUR, 4, sVerMvThr );
}


__inline ErrVal LoopFilter::xFilterMb( const MbDataAccess& rcMbDataAccess, bool enhancedLayerFlag) //V032 of FSL
{
  if( m_bRCDO )
  {
    RNOK( xFilterMb_RCDO( rcMbDataAccess ) );
    return Err::m_nOK;
  }

  const DFP& rcDFP      = rcMbDataAccess.getDeblockingFilterParameter( m_eLFMode & LFM_NO_INTER_FILTER );
  Int iFilterIdc  = rcDFP.getDisableDeblockingFilterIdc();

  ROTRS( (m_eLFMode & LFM_NO_INTER_FILTER) && ! rcMbDataAccess.getMbData().isIntra(), Err::m_nOK );

  ROTRS( iFilterIdc == 1, Err::m_nOK );

  Bool b8x8 = rcMbDataAccess.getMbData().isTransformSize8x8();

  Bool bFieldFlag  = rcMbDataAccess.getMbData().getFieldFlag();
  m_bVerMixedMode  = (bFieldFlag != rcMbDataAccess.getMbDataLeft().getFieldFlag());
  m_bHorMixedMode  = (bFieldFlag?(bFieldFlag != rcMbDataAccess.getMbDataAboveAbove().getFieldFlag()):
                     (bFieldFlag != rcMbDataAccess.getMbDataAbove().getFieldFlag()));
  Bool bCurrFrame  = (FRAME      == rcMbDataAccess.getMbPicType());

  m_bAddEdge = true;
  if( m_bHorMixedMode && bCurrFrame )
  {
    for( B4x4Idx cIdx; cIdx.b4x4() < 4; cIdx++ )
    {
      m_aucBsHorTop[cIdx.x()] = xGetHorFilterStrength( rcMbDataAccess, cIdx, iFilterIdc );
    }
  }
  if( m_bVerMixedMode )
  {
    for( B4x4Idx cIdx; cIdx.b4x4() < 16; cIdx = B4x4Idx( cIdx + 4 ) )
    {
      m_aucBsVerBot[cIdx.y()] = xGetVerFilterStrength( rcMbDataAccess, cIdx, iFilterIdc );
    }
  }
  m_bAddEdge = false;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -