H.266中的各类滤波器总结

原创 2018年04月15日 17:40:41

      一直搞不清楚各种滤波器之间的区别,今天好好看看记录下来(持续更新)。

一.EdgeFilter

该滤波器在xPredIntraAng函数里面使用。

        enableEdgeFilters = !(pcCU->isRDPCMEnabled(uiAbsPartIdx) && pcCU->getCUTransquantBypass(uiAbsPartIdx));

条件:只对亮度分量且块的宽和高都小于16的块应用。

过程:当模式是纯水平或者是纯垂直模式,则对预测块(即已经得到预测值的当前块)的第一列进行滤波;

          pDst[y*dstStride] = ClipA (pDst[y*dstStride] + (( refSide[y+1] - refSide[0] ) >> 1) ,compID);

         当模式是纯水平模式左右的模式(即17,19)和纯垂直模式左右的模式(即49,51),则对预测块的第一列进行滤波;

         pDst[y*dstStride] = ClipA(pDst[y*dstStride] + (( refSide[y+1] - refSide[0] ) >> 2) ,compID);

总结:EdgeFilter模式只用于纯水平垂直和类水平垂直(各两个)模式,对预测值进行滤波。

二.BoundaryFilter

该滤波器在xPredIntraAng函数后面使用。

         enableBoundaryFilter = pcCU->getSlice()->getSPS()->getUseIntraBoundaryFilter();

条件:只对亮度分量且块的宽和高都大于2的块应用,且只应用于角度模式;

过程:当模式是2时,对预测块的上面四行(JEM中扩展到了4行)进行2抽头滤波;

for ( Int x = 0; x < iWidth; x++ )
  {
    pDst[x             ] = (  8 * pDst[x             ] + 8 * pSrc[x - iSrcStride + 1] + 8 ) >> 4;
#if VCEG_AZ07_INTRA_BOUNDARY_FILTER_MULTI_LINE
    pDst[x+iDstStride  ] = ( 12 * pDst[x+iDstStride  ] + 4 * pSrc[x - iSrcStride + 2] + 8 ) >> 4;
#if JVET_C0024_QTBT
    if (iHeight>2)
    {
#endif
    pDst[x+iDstStride*2] = ( 14 * pDst[x+iDstStride*2] + 2 * pSrc[x - iSrcStride + 3] + 8 ) >> 4;
    pDst[x+iDstStride*3] = ( 15 * pDst[x+iDstStride*3] +     pSrc[x - iSrcStride + 4] + 8 ) >> 4; 
#if JVET_C0024_QTBT
    }
#endif
#endif
  }

         当模式是66时,对预测块的最左边四列(JEM中扩展到了4列)进行2抽头滤波;

 for ( Int y = 0, iDstStride2 = 0, iSrcStride2 = -1; y < iHeight; y++, iDstStride2+=iDstStride, iSrcStride2+=iSrcStride )
  {
    pDst[iDstStride2  ] = (  8 * pDst[iDstStride2  ] + 8 * pSrc[iSrcStride2+iSrcStride  ] + 8 ) >> 4;
#if VCEG_AZ07_INTRA_BOUNDARY_FILTER_MULTI_LINE
    pDst[iDstStride2+1] = ( 12 * pDst[iDstStride2+1] + 4 * pSrc[iSrcStride2+iSrcStride*2] + 8 ) >> 4;     
#if JVET_C0024_QTBT
    if (iWidth>2)
    {
#endif
    pDst[iDstStride2+2] = ( 14 * pDst[iDstStride2+2] + 2 * pSrc[iSrcStride2+iSrcStride*3] + 8 ) >> 4;    
    pDst[iDstStride2+3] = ( 15 * pDst[iDstStride2+3] +     pSrc[iSrcStride2+iSrcStride*4] + 8 ) >> 4;
#if JVET_C0024_QTBT
    }
#endif
#endif
  }

        当模式是3--10或者是58--66模式,则

        如果是水平模式,则对当前块的第一行边界进行3抽头滤波;

 for ( Int x = 0; x < iWidth; x++ )
    {
      pDst[x] = ( filter[0] * pDst[x] 
      + filter[1] * pSrc[x - iSrcStride + offset[0]] 
      + filter[2] * pSrc[x - iSrcStride + offset[1]] + 8) >> 4;//对第一行边界进行3抽头滤波
    }

       如果是垂直模式,则对当前块的第一列边界进行3抽头滤波;

 for ( Int y = 0; y < iHeight; y++ )
    {         
      pDst[y * iDstStride] = ( filter[0] * pDst[y * iDstStride] 
      + filter[1] * pSrc[(y + offset[0] ) * iSrcStride -1 ] 
      + filter[2] * pSrc[(y + offset[1] ) * iSrcStride -1 ] + 8) >> 4; //对当前块的第一列进行3抽头滤波;      
    }

总结:BoundaryFilter只用于对角和斜对角模式(左下和右上各8个),对预测值进行滤波。

三.4抽头滤波器

该滤波器在xPredIntraAng函数里面使用。

条件:只用于角度模式2--66

过程:在计算分像素位置的预测值时,使用该滤波器来得到预测值;

         对于小于等于8*8的块,使用三次插值滤波(滤波后需要进行clipping);

         对于大于8*8的块,使用高斯插值滤波(滤波后不需要进行clipping);

pDst[y*dstStride+x] =  (Pel)( ( f[0]*p[0] + f[1]*p[1] + f[2]*p[2] + f[3]*p[3] + 128 ) >> 8 );

(f0,f1,f2,f3就表示插值系数)

总结:只用于角度模式 ,生成预测值;

四.用于参考采样的滤波器

bUseFilter=TComPrediction::filteringIntraReferenceSamples(COMPONENT_Y, uiMode, puRect.width, puRect.height, chFmt, sps.getSpsRangeExtension().getIntraSmoothingDisabledFlag()

条件:不用于DC和LM模式,也不用于PDPC模式

过程:

该滤波器在predIntraAng函数里面使用(bUseFileteredPredSamples就是bUseFilter)。

 if( isLuma( compID ) )
    {
      if( pcCU->getROTIdx( CHANNEL_TYPE_LUMA, uiAbsPartIdx ) )
      {
        ptrSrc = getPredictorPtr( compID, bUseFilteredPredSamples );//又将ptrSrc指向参考采样数据;
      }
    }
 Pel*  getPredictorPtr           ( const ComponentID compID, const Bool bUseFilteredPredictions )
  {
    return m_piYuvExt[compID][bUseFilteredPredictions?PRED_BUF_FILTERED:PRED_BUF_UNFILTERED];//还没找到YUVExt在哪里赋值???
  }
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/cxy19931018/article/details/79950597

H.266:帧内角度预测

本文译自提案JVET-D1001的2.2.1节内容,对应的软件版本为最新的JEM4.0。 为了更好地捕获展现在自然视频中的边缘方向,方向性的帧内角度模式从HEVC的33种拓展到65种。新的角度模式如下...
  • Jing_xian
  • Jing_xian
  • 2016-11-21 22:52:43
  • 2661

H.266的目前探索的情况

H.266的探索是从2016-02-24 开始提上日程,这是第一次会议,在Geneva召开的,至今已开过7次会议,性能上有较大的进展,相比上一代RA结构下应该有30%的性能提升,但是并没有很多的新技术...
  • double_s_c
  • double_s_c
  • 2017-07-20 11:02:39
  • 2476

H.266的通测配置

JVET第二次会议初步确定了H.266的通测配置。 跟HEVC/H.265的配置有一下几点区别: 1、只有10bit深度的配置(InternalBitDepth=10),去除了HEVC中8bit深...
  • Jing_xian
  • Jing_xian
  • 2016-11-15 10:55:21
  • 2249

H.266:请求对JEM的复杂度采取行动

本文译自提案JVET-C0105。 摘要: 这篇文档展示了几个机构关于JEM软件复杂度的增加情况的看法,尤其是提出创立一个新的Ad-hoc组,研究降低软件一般性复杂度的可能方法。 1、最近JE...
  • Jing_xian
  • Jing_xian
  • 2016-11-30 21:35:07
  • 1187

NHK的未来压缩标准H.266新提案

NHK的未来压缩标准H.266新提案
  • cabbage2008
  • cabbage2008
  • 2016-08-30 17:49:54
  • 2582

H.266中的FRUC模式

目前的H.266引入两个新的帧间预测模式,一个是有华为提出的AFFINE模式,另一个是有高通提出的FRUC(Frame rate up conversion)模式,本文主要介绍FRUC模式,以后会介绍...
  • double_s_c
  • double_s_c
  • 2017-07-26 15:37:36
  • 1287

第五次JVET会议的总结性文档(H.266新技术)

  • 2017年02月10日 21:02
  • 1.76MB
  • 下载

有源滤波器幅频特性曲线对数坐标纸

  • 2010年05月07日 12:51
  • 48KB
  • 下载

参与制定H.266标准的公司

1、Microsoft。JEVT的主席之一Gary J. Sullivan就职于微软,还有微软亚研的李斌(Bin Li)博士。 2、Qualcomm。高通的提案最多。 3、Samsung。三星是...
  • Jing_xian
  • Jing_xian
  • 2016-11-18 00:29:09
  • 3876

H.266 JEM相对于HEVC HM的改进

参考文献:JEM algorithm description editing 目前JEM最新版本为JEM7.0,相对于HEVC的改进如下: 1.块结构: 四叉树+二叉树块结构,支持更大CTU(最...
  • lin453701006
  • lin453701006
  • 2017-12-18 11:47:26
  • 634
收藏助手
不良信息举报
您举报文章:H.266中的各类滤波器总结
举报原因:
原因补充:

(最多只允许输入30个字)