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

📄 loopfilter.cpp

📁 jsvm开发代码包括抽样,编码,抽取,解码等一系列功能,可以做工具或研究用
💻 CPP
📖 第 1 页 / 共 5 页
字号:
            bLeftIntra    = bLI_Top || bLI_Bot;
          }
        }
      }
      filterBlockEdge     = ( LFM_DEFAULT_FILTER == m_eLFMode || bLeftIntra );
    }
    if( filterBlockEdge )
    {
      filterBlockEdge     = ! ( rcDFP.getDisableDeblockingFilterIdc() == 1 ||
                              ( rcDFP.getDisableDeblockingFilterIdc() == 2 && ! rcMbDataAccess.isAvailableLeft() ) );
    }
    if( ! m_bVerMixedMode )
    {
      if( filterBlockEdge )
      {
        Int iQp           = ( iLeftQp + iCurrQp + 1) >> 1;
        Int iIndexB       = gClipMinMax( rcDFP.getSliceBetaOffset()    + iQp, 0, 51);
        Int iStridex2     = 2*iStride;
        Int iStridex5     = 5*iStride;
        Int iD            = ( abs( (Int)pPelLum[iStridex2-2] -   (Int)pPelLum[iStridex2-1]                                    )
                            + abs( (Int)pPelLum[iStridex2  ] - ( (Int)pPelLum[iStridex2+1] << 1 ) + (Int)pPelLum[iStridex2+2] )
                            + abs( (Int)pPelLum[iStridex5-2] -   (Int)pPelLum[iStridex5-1]                                    )
                            + abs( (Int)pPelLum[iStridex5  ] - ( (Int)pPelLum[iStridex5+1] << 1 ) + (Int)pPelLum[iStridex5+2] ) );
        filterBlockEdge   = ( iD < g_aucBetaTab_H241RCDO [ iIndexB ] );
      }
      if( filterBlockEdge )
      {
        filterBlockEdge   = ( rcMbDataAccess.getMbDataCurr().isIntra() || 
                              rcMbDataAccess.getMbDataLeft().isIntra() );
        if( ! filterBlockEdge && m_pcHighpassYuvBuffer )
        {
          filterBlockEdge = ( m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero( cIdx ) ||
                              m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero( cIdx + VER_OFFSET_H241RCDO ) ||
                              m_pcHighpassYuvBuffer->isLeft4x4BlkNotZero( cIdx + LEFT_MB_LEFT_NEIGHBOUR ) ||
                              m_pcHighpassYuvBuffer->isLeft4x4BlkNotZero( cIdx + LEFT_MB_LEFT_NEIGHBOUR + VER_OFFSET_H241RCDO ) );
        }
        if( ! filterBlockEdge )
        {
          filterBlockEdge = ( rcMbDataAccess.getMbDataCurr().is4x4BlkCoded( cIdx ) ||
                              rcMbDataAccess.getMbDataCurr().is4x4BlkCoded( cIdx + VER_OFFSET_H241RCDO ) ||
                              rcMbDataAccess.getMbDataLeft().is4x4BlkCoded( cIdx + LEFT_MB_LEFT_NEIGHBOUR ) ||
                              rcMbDataAccess.getMbDataLeft().is4x4BlkCoded( cIdx + LEFT_MB_LEFT_NEIGHBOUR + VER_OFFSET_H241RCDO ) );
        }
        if( ! filterBlockEdge )
        {
          if( rcMbDataAccess.getMbDataCurr().isInterPMb() && rcMbDataAccess.getMbDataLeft().isInterPMb() )
          {
            CheckMVandRefVal= xCheckMvDataP( rcMbDataAccess.getMbDataCurr(), cIdx, rcMbDataAccess.getMbDataLeft(), cIdx + LEFT_MB_LEFT_NEIGHBOUR, sHorMvThr, sVerMvThr );
          }
          else
          {
            CheckMVandRefVal= xCheckMvDataB( rcMbDataAccess.getMbDataCurr(), cIdx, rcMbDataAccess.getMbDataLeft(), cIdx + LEFT_MB_LEFT_NEIGHBOUR, sHorMvThr, sVerMvThr );
          }
          filterBlockEdge = ( CheckMVandRefVal > 0 );
        }
      }
    }

    if( filterBlockEdge )
    {
      if( m_bVerMixedMode && ! rcMbDataAccess.getMbData().getFieldFlag() )
      {
        if( ! bFilterBotOnly )
        {
          Int iQp     = ( iLeftQpTop + iCurrQp + 1) >> 1;
          Int iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iQp, 0, 51);
          Int iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset()    + iQp, 0, 51);
          xFilter_H241RCDO( pPelLum,           1, iIndexA, iIndexB, 0, true );
          xFilter_H241RCDO( pPelLum+2*iStride, 1, iIndexA, iIndexB, 0, true );
          xFilter_H241RCDO( pPelLum+4*iStride, 1, iIndexA, iIndexB, 0, true );
          xFilter_H241RCDO( pPelLum+6*iStride, 1, iIndexA, iIndexB, 0, true );
        }
        if( ! bFilterTopOnly )
        {
          Int iQp     = ( iLeftQpBot + iCurrQp + 1) >> 1;
          Int iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iQp, 0, 51);
          Int iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset()    + iQp, 0, 51);
          xFilter_H241RCDO( pPelLum+  iStride, 1, iIndexA, iIndexB, 0, true );
          xFilter_H241RCDO( pPelLum+3*iStride, 1, iIndexA, iIndexB, 0, true );
          xFilter_H241RCDO( pPelLum+5*iStride, 1, iIndexA, iIndexB, 0, true );
          xFilter_H241RCDO( pPelLum+7*iStride, 1, iIndexA, iIndexB, 0, true );
        }
      }
      else
      {
        Int iQp     = ( iLeftQp + iCurrQp + 1) >> 1;
        Int iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iQp, 0, 51);
        Int iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset()    + iQp, 0, 51);

        xFilter_H241RCDO( pPelLum,           1, iIndexA, iIndexB, 0, true );
        xFilter_H241RCDO( pPelLum+  iStride, 1, iIndexA, iIndexB, 0, true );
        xFilter_H241RCDO( pPelLum+2*iStride, 1, iIndexA, iIndexB, 0, true );
        xFilter_H241RCDO( pPelLum+3*iStride, 1, iIndexA, iIndexB, 0, true );
        xFilter_H241RCDO( pPelLum+4*iStride, 1, iIndexA, iIndexB, 0, true );
        xFilter_H241RCDO( pPelLum+5*iStride, 1, iIndexA, iIndexB, 0, true );
        xFilter_H241RCDO( pPelLum+6*iStride, 1, iIndexA, iIndexB, 0, true );
        xFilter_H241RCDO( pPelLum+7*iStride, 1, iIndexA, iIndexB, 0, true );
      }
    }

    pPelLum += 8*iStride; //for the next 8x8 vertical
    if( yBlk == 0 )
    {
      cIdx = cIdx + 8;
    }
  } //end of the loop


  //===== INNER MACROBLOCK EDGES =====
  pPelLum  -= 16*iStride-4;
  Int iIndexA   = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iCurrQp, 0, 51);
  Int iIndexB   = gClipMinMax( rcDFP.getSliceBetaOffset()    + iCurrQp, 0, 51);
  for( xBlk = 1; xBlk < 4; xBlk++ )
  {
    cIdx = cIdx - 7;
    for(  yBlk = 0; yBlk <= 8; yBlk += 8 )
    {
      filterBlockEdge     = (  xBlk == 2 || ! b8x8 );
      if( filterBlockEdge )
      {
        filterBlockEdge   = ! ( rcDFP.getDisableDeblockingFilterIdc() == 1 );
      }
      if( filterBlockEdge )
      {
        Int iStridex2     = 2*iStride;
        Int iStridex5     = 5*iStride;
        Int iD            = ( abs( (Int)pPelLum[iStridex2-3] - ( (Int)pPelLum[iStridex2-2] << 1 ) + (Int)pPelLum[iStridex2-1] )
                            + abs( (Int)pPelLum[iStridex2  ] - ( (Int)pPelLum[iStridex2+1] << 1 ) + (Int)pPelLum[iStridex2+2] )
                            + abs( (Int)pPelLum[iStridex5-3] - ( (Int)pPelLum[iStridex5-2] << 1 ) + (Int)pPelLum[iStridex5-1] )
                            + abs( (Int)pPelLum[iStridex5  ] - ( (Int)pPelLum[iStridex5+1] << 1 ) + (Int)pPelLum[iStridex5+2] ) );
        filterBlockEdge   = ( iD < g_aucBetaTab_H241RCDO [ iIndexB ] );
      }
      if( filterBlockEdge )
      {
        filterBlockEdge   = rcMbDataAccess.getMbDataCurr().isIntra();

        if( ! filterBlockEdge &&  m_pcHighpassYuvBuffer )
        {
          filterBlockEdge = ( m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero( cIdx ) ||
                              m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero( cIdx + VER_OFFSET_H241RCDO ) ||
                              m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero( cIdx + CURR_MB_LEFT_NEIGHBOUR ) ||
                              m_pcHighpassYuvBuffer->isCurr4x4BlkNotZero( cIdx + CURR_MB_LEFT_NEIGHBOUR + VER_OFFSET_H241RCDO ) );
        }
        if( ! filterBlockEdge )
        {
          filterBlockEdge = ( rcMbDataAccess.getMbDataCurr().is4x4BlkCoded( cIdx ) ||
                              rcMbDataAccess.getMbDataCurr().is4x4BlkCoded( cIdx + VER_OFFSET_H241RCDO ) ||
                              rcMbDataAccess.getMbDataCurr().is4x4BlkCoded( cIdx + CURR_MB_LEFT_NEIGHBOUR ) ||
                              rcMbDataAccess.getMbDataCurr().is4x4BlkCoded( cIdx + CURR_MB_LEFT_NEIGHBOUR + VER_OFFSET_H241RCDO ) );
        }
        if( ! filterBlockEdge )
        {
          if( rcMbDataAccess.getMbDataCurr().isInterPMb() ) 
          {
            CheckMVandRefVal= xCheckMvDataP( rcMbDataAccess.getMbDataCurr(), cIdx, rcMbDataAccess.getMbDataCurr(), cIdx+CURR_MB_LEFT_NEIGHBOUR, sHorMvThr, sVerMvThr );
          }
          else
          {
            CheckMVandRefVal= xCheckMvDataB( rcMbDataAccess.getMbDataCurr(), cIdx, rcMbDataAccess.getMbDataCurr(), cIdx+CURR_MB_LEFT_NEIGHBOUR, sHorMvThr, sVerMvThr );
          }
          filterBlockEdge = ( CheckMVandRefVal > 0 );
        }
      }

      if( filterBlockEdge )
      {
        xFilter_H241RCDO( pPelLum,           1, iIndexA, iIndexB, 1, true );
        xFilter_H241RCDO( pPelLum+  iStride, 1, iIndexA, iIndexB, 1, true );
        xFilter_H241RCDO( pPelLum+2*iStride, 1, iIndexA, iIndexB, 1, true );
        xFilter_H241RCDO( pPelLum+3*iStride, 1, iIndexA, iIndexB, 1, true );
        xFilter_H241RCDO( pPelLum+4*iStride, 1, iIndexA, iIndexB, 1, true );
        xFilter_H241RCDO( pPelLum+5*iStride, 1, iIndexA, iIndexB, 1, true );
        xFilter_H241RCDO( pPelLum+6*iStride, 1, iIndexA, iIndexB, 1, true );
        xFilter_H241RCDO( pPelLum+7*iStride, 1, iIndexA, iIndexB, 1, true );
      }

      pPelLum += 8*iStride; //for the next 8x8 vertical
      if( yBlk == 0 )
      {
        cIdx = cIdx + 8;
      }
    } //end of the 1st loop

    pPelLum -= 16*iStride-4;  //back to the original position
  } //end of the 2nd loop

  return Err::m_nOK;
}


__inline ErrVal LoopFilter::xChromaVerFiltering_H241RCDO ( const MbDataAccess& rcMbDataAccess, const DFP& rcDFP, YuvPicBuffer* pcYuvBuffer )
{
  Int   iCurrQp = rcMbDataAccess.getSH().getChromaQp( rcMbDataAccess.getMbDataCurr().getQpLF() );
  Int   iStride = pcYuvBuffer->getCStride();
  Pel*  pPelCb  = pcYuvBuffer->getMbCbAddr();
  Pel*  pPelCr  = pcYuvBuffer->getMbCrAddr();
  Bool  filterBlockEdge, bFilterTopOnly, bFilterBotOnly;
  Int   yBlk, iLeftQp = 0, iLeftQpTop = 0, iLeftQpBot = 0;

  //===== filtering of left macroblock edge =====
  for( yBlk = 0; yBlk <= 4; yBlk+=4 )
  {
    filterBlockEdge   = rcMbDataAccess.isLeftMbExisting();
    bFilterTopOnly    = false;
    bFilterBotOnly    = false;
    if( filterBlockEdge )
    {
      Bool bLeftIntra = rcMbDataAccess.getMbDataLeft().isIntra();
      iLeftQp         = rcMbDataAccess.getMbDataLeft().getQpLF();
      if( m_bVerMixedMode )
      {
        if      ( rcMbDataAccess.getMbData().getFieldFlag() && yBlk == 0 )
        {
          bLeftIntra      = ( rcMbDataAccess.isTopMb() ? rcMbDataAccess.getMbDataLeft().isIntra() : rcMbDataAccess.getMbDataAboveLeft().isIntra() );
          iLeftQp         = ( rcMbDataAccess.isTopMb() ? rcMbDataAccess.getMbDataLeft().getQpLF() : rcMbDataAccess.getMbDataAboveLeft().getQpLF() );
        }
        else if ( rcMbDataAccess.getMbData().getFieldFlag() )
        {
          bLeftIntra      = ( rcMbDataAccess.isTopMb() ? rcMbDataAccess.getMbDataBelowLeft().isIntra() : rcMbDataAccess.getMbDataLeft().isIntra() );
          iLeftQp         = ( rcMbDataAccess.isTopMb() ? rcMbDataAccess.getMbDataBelowLeft().getQpLF() : rcMbDataAccess.getMbDataLeft().getQpLF() );
        }
        else // current pair is frame, left pair is field
        {
          Bool bLI_Top    = ( rcMbDataAccess.isTopMb() ? rcMbDataAccess.getMbDataLeft().isIntra() : rcMbDataAccess.getMbDataAboveLeft().isIntra() );
          Bool bLI_Bot    = ( rcMbDataAccess.isTopMb() ? rcMbDataAccess.getMbDataBelowLeft().isIntra() : rcMbDataAccess.getMbDataLeft().isIntra() );
          iLeftQpTop      = ( rcMbDataAccess.isTopMb() ? rcMbDataAccess.getMbDataLeft().getQpLF() : rcMbDataAccess.getMbDataAboveLeft().getQpLF() );
          iLeftQpBot      = ( rcMbDataAccess.isTopMb() ? rcMbDataAccess.getMbDataBelowLeft().getQpLF() : rcMbDataAccess.getMbDataLeft().getQpLF() );
          if( ( bLI_Top ^ bLI_Bot ) && LFM_DEFAULT_FILTER != m_eLFMode )
          {
            bLeftIntra    = true;
            bFilterTopOnly= bLI_Top;
            bFilterBotOnly= bLI_Bot;
          }
          else
          {
            bLeftIntra    = bLI_Top || bLI_Bot;
          }
        }
      }
      filterBlockEdge = ( LFM_DEFAULT_FILTER == m_eLFMode || bLeftIntra );
    }
    if( filterBlockEdge )
    {
      filterBlockEdge = ! ( rcDFP.getDisableDeblockingFilterIdc() == 1 ||
                          ( rcDFP.getDisableDeblockingFilterIdc() == 2 && ! rcMbDataAccess.isAvailableLeft() ) );
    }
    if( filterBlockEdge && ! m_bVerMixedMode )
    {
      filterBlockEdge = ( rcMbDataAccess.getMbDataCurr().isIntra() || rcMbDataAccess.getMbDataLeft().isIntra() );
    }

    if( filterBlockEdge )
    {
      if( m_bVerMixedMode && ! rcMbDataAccess.getMbData().getFieldFlag() )
      {
        if( ! bFilterBotOnly )
        {
          Int   iLQp    = rcMbDataAccess.getSH().getChromaQp( iLeftQpTop );
          Int   iQp     = ( iCurrQp + iLQp + 1 ) >> 1;
          Int   iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iQp, 0, 51);
          Int   iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset()    + iQp, 0, 51);
          xFilter_H241RCDO( pPelCb,           1, iIndexA, iIndexB, 0, false );
          xFilter_H241RCDO( pPelCb+2*iStride, 1, iIndexA, iIndexB, 0, false );
          xFilter_H241RCDO( pPelCr,           1, iIndexA, iIndexB, 0, false );
          xFilter_H241RCDO( pPelCr+2*iStride, 1, iIndexA, iIndexB, 0, false );
        }
        if( ! bFilterTopOnly )
        {
          Int   iLQp    = rcMbDataAccess.getSH().getChromaQp( iLeftQpBot );
          Int   iQp     = ( iCurrQp + iLQp + 1 ) >> 1;
          Int   iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iQp, 0, 51);
          Int   iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset()    + iQp, 0, 51);
          xFilter_H241RCDO( pPelCb+  iStride, 1, iIndexA, iIndexB, 0, false );
          xFilter_H241RCDO( pPelCb+3*iStride, 1, iIndexA, iIndexB, 0, false );
          xFilter_H241RCDO( pPelCr+  iStride, 1, iIndexA, iIndexB, 0, false );
          xFilter_H241RCDO( pPelCr+3*iStride, 1, iIndexA, iIndexB, 0, false );
        }
      }
      else
      {
        Int   iLQp    = rcMbDataAccess.getSH().getChromaQp( iLeftQp );
        Int   iQp     = ( iCurrQp + iLQp + 1 ) >> 1;
        Int   iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iQp, 0, 51);
        Int   iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset()    + iQp, 0, 51);
        xFilter_H241RCDO( pPelCb,           1, iIndexA, iIndexB, 0, false );
        xFilter_H241RCDO( pPelCb+  iStride, 1, iIndexA, iIndexB, 0, false );
        xFilter_H241RCDO( pPelCb+2*iStride, 1, iIndexA, iIndexB, 0, false );
        xFilter_H241RCDO( pPelCb+3*iStride, 1, iIndexA, iIndexB, 0, false );
        xFilter_H241RCDO( pPelCr,           1, iIndexA, iIndexB, 0, false );
        xFilter_H241RCDO( pPelCr+  iStride, 1, iIndexA, iIndexB, 0, false );
        xFilter_H241RCDO( pPelCr+2*iStride, 1, iIndexA, iIndexB, 0, false );
        xFilter_H241RCDO( pPelCr+3*iStride, 1, iIndexA, iIndexB, 0, false );
      }
    }

    pPelCb += 4*iStride; 
    pPelCr += 4*iStride; 
  }

  //Inside of the macroblock
  pPelCb -= 8*iStride-4;
  pPelCr -= 8*iStride-4;
  Int iIndexA = gClipMinMax( rcDFP.getSliceAlphaC0Offset() + iCurrQp, 0, 51);
  Int iIndexB = gClipMinMax( rcDFP.getSliceBetaOffset()    + iCurrQp, 0, 51);
  for( yBlk = 0; yBlk <= 4; yBlk += 4 )
  {
    filterBlockEdge   = ! ( rcDFP.getDisableDeblockingFilterIdc() == 1 );
    if( filterBlockEdge )
    {
      filterBlockEdge = rcMbDataAccess.getMbDataCurr().isIntra();
    }

⌨️ 快捷键说明

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