loopfilter.cpp

来自「JMVM MPEG MVC/3DAV 测试平台 国际通用标准」· C++ 代码 · 共 1,794 行 · 第 1/5 页

CPP
1,794
字号
          cBuffer.loadSurrounding( pcFrame->getFullPelYuvBuffer() );

          RNOK( m_pcReconstructionBypass->padRecMb( &cBuffer, uiMask ) );
  	      pcFrame->getFullPelYuvBuffer()->loadBuffer( &cBuffer );
		}
	  }
	
      uiMbAddress = rcSH.getFMO()->getNextMBNr(uiMbAddress );    
	}
  }
  //<- ICU/ETRI DS

  // Hanke@RWTH: Reset pointer
  setHighpassFramePointer();

  return Err::m_nOK;
}




__inline ErrVal LoopFilter::xFilterMb( const MbDataAccess*  pcMbDataAccessMot,
                                       const MbDataAccess*  pcMbDataAccessRes,
                                       IntYuvPicBuffer*     pcYuvBuffer,
                                       RefFrameList*        pcRefFrameList0,
                                       RefFrameList*        pcRefFrameList1,
                                       bool                 spatial_scalable_flg)  // SSUN@SHARP
{
  const DFP& rcDFP      = pcMbDataAccessRes->getDeblockingFilterParameter();
  const Int iFilterIdc  = rcDFP.getDisableDeblockingFilterIdc();

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

  ROTRS( (m_eLFMode & LFM_NO_INTER_FILTER) && ! pcMbDataAccessRes->getMbData().isIntra(), Err::m_nOK );

  Bool b8x8 = pcMbDataAccessRes->getMbData().isTransformSize8x8();

  for( B4x4Idx cIdx; cIdx.isLegal(); cIdx++ )
  {
    if( !b8x8 || ( ( cIdx.x() & 1 ) == 0 ) )
    {
      m_aaaucBs[VER][cIdx.x()][cIdx.y()]  = xGetVerFilterStrength_RefIdx( pcMbDataAccessMot,
                                                                          pcMbDataAccessRes,
                                                                          cIdx,
                                                                          iFilterIdc,
                                                                          pcRefFrameList0,
                                                                          pcRefFrameList1,
                                                                          spatial_scalable_flg );  // SSUN@SHARP
    }
    else
    {
      m_aaaucBs[VER][cIdx.x()][cIdx.y()]  = 0;
    }
    if( !b8x8 || ( ( cIdx.y() & 1 ) == 0 ) )
    {
      m_aaaucBs[HOR][cIdx.x()][cIdx.y()]  = xGetHorFilterStrength_RefIdx( pcMbDataAccessMot,
                                                                          pcMbDataAccessRes,
                                                                          cIdx,
                                                                          iFilterIdc,
                                                                          pcRefFrameList0,
                                                                          pcRefFrameList1,
                                                                          spatial_scalable_flg );  // SSUN@SHARP
    }
    else
    {
      m_aaaucBs[HOR][cIdx.x()][cIdx.y()]  = 0;
    }
  }

  RNOK( xLumaVerFiltering(   *pcMbDataAccessRes, rcDFP, pcYuvBuffer ) );
  RNOK( xLumaHorFiltering(   *pcMbDataAccessRes, rcDFP, pcYuvBuffer ) );
  RNOK( xChromaVerFiltering( *pcMbDataAccessRes, rcDFP, pcYuvBuffer ) );
  RNOK( xChromaHorFiltering( *pcMbDataAccessRes, rcDFP, pcYuvBuffer ) );

  return Err::m_nOK;
}




__inline UInt LoopFilter::xGetVerFilterStrength_RefIdx( const MbDataAccess* pcMbDataAccessMot,
                                                        const MbDataAccess* pcMbDataAccessRes,
                                                        LumaIdx             cIdx,
                                                        Int                 iFilterIdc,
                                                        RefFrameList*       pcRefFrameList0,
                                                        RefFrameList*       pcRefFrameList1,
                                                        bool                spatial_scalable_flg )  // SSUN@SHARP
{
  // SSUN@SHARP JVT-P013r1
  if(spatial_scalable_flg)
  { 
    if( cIdx.x() )
    {
      const MbData& rcMbDataCurr  = pcMbDataAccessRes->getMbDataCurr();
      if( rcMbDataCurr.isIntra_BL() )
      {
        ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx                          ), 1 );
        ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx + CURR_MB_LEFT_NEIGHBOUR ), 1 );
        return( 0 );
      }
    }
    else if(pcMbDataAccessRes->isAvailableLeft() || ( pcMbDataAccessRes->isLeftMbExisting() && iFilterIdc != 2 )){
      const MbData& rcMbDataCurr  = pcMbDataAccessRes->getMbDataCurr();
      const MbData& rcMbDataLeft = pcMbDataAccessRes->getMbDataLeft();
      if(rcMbDataCurr.isIntra_BL() && rcMbDataLeft.isIntra_BL()){
        ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 1 );
        ROTRS( rcMbDataLeft.is4x4BlkCoded( cIdx + LEFT_MB_LEFT_NEIGHBOUR), 1 );
        return(0);
      }
      else if(rcMbDataCurr.isIntra_BL()){
        ROTRS( rcMbDataLeft.isIntra_nonBL(), 4 );
        ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 2 );
        if( m_pcHighpassYuvBuffer && !rcMbDataLeft.isIntra()) {
          ROTRS( rcMbDataLeft.is4x4BlkCoded( cIdx + LEFT_MB_LEFT_NEIGHBOUR), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
          ROTRS( m_pcHighpassYuvBuffer->isLeft4x4BlkNotZero ( cIdx + LEFT_MB_LEFT_NEIGHBOUR ), 2 );
        }
        else{
          ROTRS( rcMbDataLeft.is4x4BlkCoded( cIdx + LEFT_MB_LEFT_NEIGHBOUR), 2 );
        }
        return(1);
      }
      else if(rcMbDataLeft.isIntra_BL()){
        ROTRS( rcMbDataCurr.isIntra_nonBL(), 4 );
        ROTRS( rcMbDataLeft.is4x4BlkCoded( cIdx + LEFT_MB_LEFT_NEIGHBOUR), 2 );
        if( m_pcHighpassYuvBuffer ) {
          ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
          ROTRS( m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero ( cIdx ), 2 );
        }
        else {
          ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 2 );
        }
        return(1);
      }
    }
  } 
  // SSUN@SHARP end of JVT-P013r1
  else{  
    //-- Samsung 2005.02.xx
    if(pcMbDataAccessRes->getMbDataCurr().getMbMode() == INTRA_BL)
    {
      if( cIdx.x() )
      {
        return 1;		//	if not MB_boundary
      }

      // is either in same slice or deblocking across slice boundaries is enabled (and the XXX macroblock is inside the picture)
      if( ( pcMbDataAccessRes->isAvailableLeft() || ( pcMbDataAccessRes->isLeftMbExisting() && iFilterIdc != 2 ) ) &&
            pcMbDataAccessRes->getMbDataLeft().getMbMode() == INTRA_BL )
      {
        return 1;
      }
    }
    //--
  }

  ROFRS( pcMbDataAccessMot, cIdx.x() ? 3 : ((iFilterIdc==2 && !pcMbDataAccessRes->isAvailableLeft())|| !pcMbDataAccessRes->isLeftMbExisting()) ? 0 : 4 );

  const MbData& rcMbDataCurrMot = pcMbDataAccessMot->getMbDataCurr();
  const MbData& rcMbDataCurrRes = pcMbDataAccessRes->getMbDataCurr();
  Short         sHorMvThr       = 4;
  Short         sVerMvThr       = 4;

  if( cIdx.x() )
  {
    // this is a edge inside of a macroblock
    ROTRS( rcMbDataCurrMot.isIntra(), 3 );

    // Hanke@RWTH
    if( m_pcHighpassYuvBuffer ) {
      ROTRS( rcMbDataCurrRes.is4x4BlkCoded( cIdx                          ), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
      ROTRS( m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero ( cIdx                          ), 2 );
      ROTRS( rcMbDataCurrRes.is4x4BlkCoded( cIdx + CURR_MB_LEFT_NEIGHBOUR ), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
      ROTRS( m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero ( cIdx + CURR_MB_LEFT_NEIGHBOUR ), 2 );
    }else{ 
      ROTRS( rcMbDataCurrRes.is4x4BlkCoded( cIdx                          ), 2 );
      ROTRS( rcMbDataCurrRes.is4x4BlkCoded( cIdx + CURR_MB_LEFT_NEIGHBOUR ), 2 );
    }
    
    if( rcMbDataCurrMot.isInterPMb() )
    {
      return xCheckMvDataP_RefIdx( rcMbDataCurrMot, cIdx, rcMbDataCurrMot, cIdx + CURR_MB_LEFT_NEIGHBOUR,
                                   sHorMvThr, sVerMvThr,
                                   *pcRefFrameList0 );
    }
    return   xCheckMvDataB_RefIdx( rcMbDataCurrMot, cIdx, rcMbDataCurrMot, cIdx + CURR_MB_LEFT_NEIGHBOUR,
                                   sHorMvThr, sVerMvThr,
                                   *pcRefFrameList0, *pcRefFrameList1 );
  }


  // if we get here we are on a macroblock edge
  ROTRS( iFilterIdc == 2 && ! pcMbDataAccessMot->isAvailableLeft(), 0 );
  ROTRS( ! pcMbDataAccessMot->isLeftMbExisting(),                   0 );


  const MbData& rcMbDataLeftMot = pcMbDataAccessMot->getMbDataLeft();
  const MbData& rcMbDataLeftRes = pcMbDataAccessRes->getMbDataLeft();

  ROTRS( LFM_DEFAULT_FILTER != m_eLFMode && rcMbDataCurrMot.isIntra() ^ rcMbDataLeftMot.isIntra(), 0 );
  
  ROTRS( rcMbDataCurrMot.isIntra(), 4 );
  ROTRS( rcMbDataLeftMot.isIntra(), 4 );

  // Hanke@RWTH
  if( m_pcHighpassYuvBuffer ) {
    ROTRS( rcMbDataCurrRes.is4x4BlkCoded( cIdx                          ), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
    ROTRS( m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero ( cIdx                          ), 2 );
    ROTRS( rcMbDataLeftRes.is4x4BlkCoded( cIdx + LEFT_MB_LEFT_NEIGHBOUR ), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
    ROTRS( m_pcHighpassYuvBuffer->isLeft4x4BlkNotZero ( cIdx + LEFT_MB_LEFT_NEIGHBOUR ), 2 );
  }else{ 
    ROTRS( rcMbDataCurrRes.is4x4BlkCoded( cIdx                          ), 2 );
    ROTRS( rcMbDataLeftRes.is4x4BlkCoded( cIdx + LEFT_MB_LEFT_NEIGHBOUR ), 2 );
  }
  
  if( rcMbDataCurrMot.isInterPMb() && rcMbDataLeftMot.isInterPMb())
  {
    return xCheckMvDataP_RefIdx( rcMbDataCurrMot, cIdx, rcMbDataLeftMot, cIdx + LEFT_MB_LEFT_NEIGHBOUR,
                                 sHorMvThr, sVerMvThr,
                                 *pcRefFrameList0);
  }
  return   xCheckMvDataB_RefIdx( rcMbDataCurrMot, cIdx, rcMbDataLeftMot, cIdx + LEFT_MB_LEFT_NEIGHBOUR,
                                 sHorMvThr, sVerMvThr,
                                 *pcRefFrameList0, *pcRefFrameList1 );
}



__inline UInt LoopFilter::xGetHorFilterStrength_RefIdx( const MbDataAccess* pcMbDataAccessMot,
                                                        const MbDataAccess* pcMbDataAccessRes,
                                                        LumaIdx             cIdx,
                                                        Int                 iFilterIdc,
                                                        RefFrameList*       pcRefFrameList0,
                                                        RefFrameList*       pcRefFrameList1,
                                                        bool                spatial_scalable_flg )  // SSUN@SHARP
{
  // SSUN@SHARP JVT-P013r1
  if(spatial_scalable_flg){  
    if( cIdx.y() )
    {
      const MbData& rcMbDataCurr  = pcMbDataAccessRes->getMbDataCurr();
      if( rcMbDataCurr.isIntra_BL() )
      {
        ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx                          ), 1 );
        ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx + CURR_MB_ABOVE_NEIGHBOUR ), 1 );
        return( 0 );
      }
    }
    else if(pcMbDataAccessRes->isAvailableAbove() || ( pcMbDataAccessRes->isAboveMbExisting() && iFilterIdc != 2 )){
      const MbData& rcMbDataCurr = pcMbDataAccessRes->getMbDataCurr();
      const MbData& rcMbDataAbove = pcMbDataAccessRes->getMbDataAbove();
      if(rcMbDataCurr.isIntra_BL() && rcMbDataAbove.isIntra_BL()){
        ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 1 );
        ROTRS( rcMbDataAbove.is4x4BlkCoded( cIdx + ABOVE_MB_ABOVE_NEIGHBOUR), 1 );
        return(0);
      }
      if(rcMbDataCurr.isIntra_BL()){
        ROTRS( rcMbDataAbove.isIntra_nonBL(), 4 );
        ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 2 );
        if( m_pcHighpassYuvBuffer && !rcMbDataAbove.isIntra() ) {
          ROTRS( rcMbDataAbove.is4x4BlkCoded( cIdx + ABOVE_MB_ABOVE_NEIGHBOUR), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
          ROTRS( m_pcHighpassYuvBuffer->isAbove4x4BlkNotZero ( cIdx + ABOVE_MB_ABOVE_NEIGHBOUR ), 2 );
        }
        else{
          ROTRS( rcMbDataAbove.is4x4BlkCoded( cIdx + ABOVE_MB_ABOVE_NEIGHBOUR), 2 );
        }
        return(1);
      }
      else if(rcMbDataAbove.isIntra_BL()){
        ROTRS( rcMbDataCurr.isIntra_nonBL(), 4 );
        ROTRS( rcMbDataAbove.is4x4BlkCoded( cIdx + ABOVE_MB_ABOVE_NEIGHBOUR), 2 );
        if( m_pcHighpassYuvBuffer ) {
          ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
          ROTRS( m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero ( cIdx ), 2 );
        }
        else {
          ROTRS( rcMbDataCurr.is4x4BlkCoded( cIdx ), 2 );
        }
        return(1);
      }
    }
  }
  // SSUN@SHARP end of JVT-P013r1
  else{  
    //-- Samsung 2005.02.xx
    if(pcMbDataAccessRes->getMbDataCurr().getMbMode() == INTRA_BL)
    {
      if( cIdx.y() )
      {
        return 1;		//	if not MB_boundary
      }

      // is either in same slice or deblocking across slice boundaries is enabled (and the XXX macroblock is inside the picture)
      if( ( pcMbDataAccessRes->isAvailableAbove() || ( pcMbDataAccessRes->isAboveMbExisting() && iFilterIdc != 2 ) ) &&
            pcMbDataAccessRes->getMbDataAbove().getMbMode() == INTRA_BL )
      {
        return 1;
      }
    }
    //--
  }
  ROFRS( pcMbDataAccessMot, cIdx.y() ? 3 : ((iFilterIdc==2 && !pcMbDataAccessRes->isAvailableAbove())|| !pcMbDataAccessRes->isAboveMbExisting()) ? 0 : 4 );

  const MbData& rcMbDataCurrMot = pcMbDataAccessMot->getMbDataCurr();
  const MbData& rcMbDataCurrRes = pcMbDataAccessRes->getMbDataCurr();
  Short         sHorMvThr       = 4;
  Short         sVerMvThr       = 4;

  if( cIdx.y() )
  {
    // internal edge
    ROTRS( rcMbDataCurrMot.isIntra(), 3 );

    // Hanke@RWTH
    if( m_pcHighpassYuvBuffer ) {
      ROTRS( rcMbDataCurrRes.is4x4BlkCoded( cIdx                           ), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
      ROTRS( m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero ( cIdx                           ), 2 );
      ROTRS( rcMbDataCurrRes.is4x4BlkCoded( cIdx + CURR_MB_ABOVE_NEIGHBOUR ), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
      ROTRS( m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero ( cIdx + CURR_MB_ABOVE_NEIGHBOUR ), 2 );
    }else{
      ROTRS( rcMbDataCurrRes.is4x4BlkCoded( cIdx                           ), 2 );
      ROTRS( rcMbDataCurrRes.is4x4BlkCoded( cIdx + CURR_MB_ABOVE_NEIGHBOUR ), 2 );
    }
    
    if( rcMbDataCurrMot.isInterPMb() )
    {
      return xCheckMvDataP_RefIdx( rcMbDataCurrMot, cIdx, rcMbDataCurrMot, cIdx + CURR_MB_ABOVE_NEIGHBOUR,
                                   sHorMvThr, sVerMvThr,
                                   *pcRefFrameList0 );
    }
    return   xCheckMvDataB_RefIdx( rcMbDataCurrMot, cIdx, rcMbDataCurrMot, cIdx + CURR_MB_ABOVE_NEIGHBOUR,
                                   sHorMvThr, sVerMvThr,
                                   *pcRefFrameList0, *pcRefFrameList1 );
  }

  // if we get here we are on a macroblock edge
  ROTRS( iFilterIdc == 2 && ! pcMbDataAccessMot->isAvailableAbove(),  0 );
  ROTRS( ! pcMbDataAccessMot->isAboveMbExisting(),                    0 );


  const MbData& rcMbDataAboveMot = pcMbDataAccessMot->getMbDataAbove();
  const MbData& rcMbDataAboveRes = pcMbDataAccessRes->getMbDataAbove();
  
  ROTRS( LFM_DEFAULT_FILTER != m_eLFMode && rcMbDataCurrMot.isIntra() ^ rcMbDataAboveMot.isIntra(), 0 );
  
  ROTRS( rcMbDataCurrMot. isIntra(), 4 );
  ROTRS( rcMbDataAboveMot.isIntra(), 4 );

  // Hanke@RWTH
  if( m_pcHighpassYuvBuffer ) {
    ROTRS( rcMbDataCurrRes. is4x4BlkCoded( cIdx                            ), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
    ROTRS( m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero  ( cIdx                            ), 2 );
    ROTRS( rcMbDataAboveRes.is4x4BlkCoded( cIdx + ABOVE_MB_ABOVE_NEIGHBOUR ), 2 ); // bugfix for FRExt-Mode, Hanke@RWTH
    ROTRS( m_pcHighpassYuvBuffer->isAbove4x4BlkNotZero ( cIdx + ABOVE_MB_ABOVE_NEIGHBOUR ), 2 );
  }else{
    ROTRS( rcMbDataCurrRes. is4x4BlkCoded( cIdx                            ), 2 );
    ROTRS( rcMbDataAboveRes.is4x4BlkCoded( cIdx + ABOVE_MB_ABOVE_NEIGHBOUR ), 2 );
  }
  
  if( rcMbDataCurrMot.isInterPMb() && rcMbDataAboveMot.isInterPMb())

⌨️ 快捷键说明

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