Intra Mode Coding With Boundary Prediction Filters

来源:互联网 发布:点读包音频切割软件 编辑:程序博客网 时间:2024/05/17 08:07
  • HEVC boundary filter回顾
    • 仅作用于使用DC(1),vertical(10)和horizontal(26) mode且小于32x32的PU的亮度块的最左侧一列和最上侧一行的参考像素点。
    • 当使用vertical mode时,最左侧一列的值p(0,y)为下式,其中,y属于[0,N-1],其中,N是PU的大小,见标准文档8.4.4.2.6式(8-62):
      p(0,y)=p(0,y) + ((p(-1, y) - p(-1, -1))>>1)
    • 当使用horizontal mode时,最上侧一行的值p(x,0)的滤波处理类似于vertical mode,见标准文档8.4.4.2.6式(8-54)
    • 当使用DC mode时,使用3-tap (1 2 1)/4作用于p(0,0),使用2-tap ( 3 1)/4作用于其余处于边界的预测参考值,如下式所示(标准文档8.4.4.2.5式(8-42,8-43,8-44)),
      p(0,0)=(p(-1, 0) + 2 * dc +p(0, -1)+2)>>2;
      p(x,0)=(p(x,-1)+3*dc+2)>>2;
      p(0,y)=(p(-1,y)+3*dc+2)>>2;
      dc的计算方式见标准文档8.4.4.2.5式(8-41)
  • JVET中的boundary prediction filters
    • 扩展到更多的角度,不再局限于DC,vertical和horizontal
    • 扩展到更多参考像素行,四行或四列。对于mode 2和mode 34,使用2-tap滤波器,对于mode 3-6和30-33使用3-tap滤波器,如下图所示,对于mode 34的最左侧四行分别使用不同的2-tap滤波器,对于mode 30-33的最左侧一行使用3-tap滤波器,
      这里写图片描述
  • JEM代码阅读
    • 见宏VCEG_AZ07_INTRA_65ANG_MODES,以及宏VCEG_AZ07_INTRA_BOUNDARY_FILTER_MULTI_LINE用于对mode2和mode34中额外的边界行进行处理
    • SPS header中添加了m_useIntraBoundaryFilter参数,用于在序列级别决策是否使用该技术,一般情况下打开
    • 关键代码在函数predIntraAng
      //VCEG_AZ07_INTRA_65ANG_MODES,扩展到67个角度后,则相应地将3-6改成3-10,30-33改成58-65,34改成66 
      //关键的函数,xIntraPredFilteringMode34 + xIntraPredFilteringMode02 + xIntraPredFilteringModeDGL
      #if VCEG_AZ07_INTRA_BOUNDARY_FILTER
      else if( enableBoundaryFilter && isLuma(compID) )
      {
      #if VCEG_AZ07_INTRA_65ANG_MODES
      if( uiDirMode == VDIA_IDX )
      #else
      if( uiDirMode == 34 )
      #endif
      {
      xIntraPredFilteringMode34( ptrSrc+sw+1, sw, pDst, uiStride, iWidth, iHeight);
      }
      else if( uiDirMode == 2 )
      {
      xIntraPredFilteringMode02( ptrSrc+sw+1, sw, pDst, uiStride, iWidth, iHeight);
      }
      #if VCEG_AZ07_INTRA_65ANG_MODES
      else if( ( uiDirMode<=10 && uiDirMode>2 ) || ( uiDirMode>=(VDIA_IDX-8) && uiDirMode<VDIA_IDX ) )
      #else
      else if( ( uiDirMode<=6 && uiDirMode>2 ) || ( uiDirMode>=30 && uiDirMode<34 ) )
      #endif
      {
      xIntraPredFilteringModeDGL( ptrSrc+sw+1, sw, pDst, uiStride, iWidth, iHeight, uiDirMode );
      }
      }
      #endif
    • xIntraPredFilteringMode34 ,对最左侧4行进行滤波处理,滤波器参数分别(8 8)/4, (12 4)/4, (14 2)/4, (15 1)/4对应于第1-4行,具体地
       
      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;
      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;
      #endif
      }
    • xIntraPredFilteringMode02,对最上侧4行进行滤波处理,滤波器参数分别(8 8)/4, (12 4)/4, (14 2)/4, (15 1)/4对应于第1-4行,具体地
       
      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;
      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;
      #endif
      }
    • xIntraPredFilteringModeDGL,对最上侧1行或最左侧1列进行滤波处理,对不同的mode滤波器参数分别设置,具体地见数组aucAngPredFilterCoefaucAngPredPosiOffset
       
      if(bHorz)
      {
      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;
      }
      }
      else
      {
      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;
      }
      }
    • -
原创粉丝点击