HEVC代码追踪(十一。七):运动估计/补偿之xTZ8PointDiamondSearch

xTZSearch调用了2个最为主要的函数:xTZ8PointDiamondSearch和xTZ2PointSearch,值得一提的是,HM中还提供了另外一个搜索函数xTZ8PointSquareSearch,但由于实际并没有使用这个函数,且它其实跟钻石搜索只是搜索点的选择略有不同,分析起来基本上也是一样的。


__inline Void TEncSearch::xTZ8PointDiamondSearch( TComPattern* pcPatternKey, IntTZSearchStruct& rcStruct, TComMv* pcMvSrchRngLT, TComMv* pcMvSrchRngRB, const Int iStartX, const Int iStartY, const Int iDist )
{
  Int   iSrchRngHorLeft   = pcMvSrchRngLT->getHor();
  Int   iSrchRngHorRight  = pcMvSrchRngRB->getHor();
  Int   iSrchRngVerTop    = pcMvSrchRngLT->getVer();
  Int   iSrchRngVerBottom = pcMvSrchRngRB->getVer();
  
  // 8 point search,                   //   1 2 3
  // search around the start point     //   4 0 5
  // with the required  distance       //   6 7 8
  assert ( iDist != 0 );
  const Int iTop        = iStartY - iDist;//!< 2
  const Int iBottom     = iStartY + iDist;//!< 7
  const Int iLeft       = iStartX - iDist;//!< 4
  const Int iRight      = iStartX + iDist;//!< 5
  rcStruct.uiBestRound += 1;//!< 每次调用xTZSearchHelp,一旦发现当前搜索点的sad小于存放的最佳值,则将uiBestRound清零  
  
  if ( iDist == 1 ) // iDist == 1
  {//!< 搜索步长等于1时,只搜索2,4,5,7这四个位置,这也就是在后面最佳步长为1时,仍然要进行2点钻石搜索的原因  
    if ( iTop >= iSrchRngVerTop ) // check top
    {
      xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iTop, 2, iDist );
    }
    if ( iLeft >= iSrchRngHorLeft ) // check middle left
    {
      xTZSearchHelp( pcPatternKey, rcStruct, iLeft, iStartY, 4, iDist );
    }
    if ( iRight <= iSrchRngHorRight ) // check middle right
    {
      xTZSearchHelp( pcPatternKey, rcStruct, iRight, iStartY, 5, iDist );
    }
    if ( iBottom <= iSrchRngVerBottom ) // check bottom
    {
      xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iBottom, 7, iDist );
    }
  }
  else // if (iDist != 1)
  {
    if ( iDist <= 8 )
    {
      const Int iTop_2      = iStartY - (iDist>>1);
      const Int iBottom_2   = iStartY + (iDist>>1);
      const Int iLeft_2     = iStartX - (iDist>>1);
      const Int iRight_2    = iStartX + (iDist>>1);
      
      if (  iTop >= iSrchRngVerTop && iLeft >= iSrchRngHorLeft &&
          iRight <= iSrchRngHorRight && iBottom <= iSrchRngVerBottom ) // check border,保证在搜索范围内  
      {
        xTZSearchHelp( pcPatternKey, rcStruct, iStartX,  iTop,      2, iDist    );
        xTZSearchHelp( pcPatternKey, rcStruct, iLeft_2,  iTop_2,    1, iDist>>1 );
        xTZSearchHelp( pcPatternKey, rcStruct, iRight_2, iTop_2,    3, iDist>>1 );
        xTZSearchHelp( pcPatternKey, rcStruct, iLeft,    iStartY,   4, iDist    );
        xTZSearchHelp( pcPatternKey, rcStruct, iRight,   iStartY,   5, iDist    );
        xTZSearchHelp( pcPatternKey, rcStruct, iLeft_2,  iBottom_2, 6, iDist>>1 );
        xTZSearchHelp( pcPatternKey, rcStruct, iRight_2, iBottom_2, 8, iDist>>1 );
        xTZSearchHelp( pcPatternKey, rcStruct, iStartX,  iBottom,   7, iDist    );
      }
      else // check border,有部分越界,在确保不越界的情况下搜索对应点
      {
        if ( iTop >= iSrchRngVerTop ) // check top
        {
          xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iTop, 2, iDist );
        }
        if ( iTop_2 >= iSrchRngVerTop ) // check half top
        {
          if ( iLeft_2 >= iSrchRngHorLeft ) // check half left
          {
            xTZSearchHelp( pcPatternKey, rcStruct, iLeft_2, iTop_2, 1, (iDist>>1) );
          }
          if ( iRight_2 <= iSrchRngHorRight ) // check half right
          {
            xTZSearchHelp( pcPatternKey, rcStruct, iRight_2, iTop_2, 3, (iDist>>1) );
          }
        } // check half top
        if ( iLeft >= iSrchRngHorLeft ) // check left
        {
          xTZSearchHelp( pcPatternKey, rcStruct, iLeft, iStartY, 4, iDist );
        }
        if ( iRight <= iSrchRngHorRight ) // check right
        {
          xTZSearchHelp( pcPatternKey, rcStruct, iRight, iStartY, 5, iDist );
        }
        if ( iBottom_2 <= iSrchRngVerBottom ) // check half bottom
        {
          if ( iLeft_2 >= iSrchRngHorLeft ) // check half left
          {
            xTZSearchHelp( pcPatternKey, rcStruct, iLeft_2, iBottom_2, 6, (iDist>>1) );
          }
          if ( iRight_2 <= iSrchRngHorRight ) // check half right
          {
            xTZSearchHelp( pcPatternKey, rcStruct, iRight_2, iBottom_2, 8, (iDist>>1) );
          }
        } // check half bottom
        if ( iBottom <= iSrchRngVerBottom ) // check bottom
        {
          xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iBottom, 7, iDist );
        }
      } // check border
    }
    else // iDist > 8,搜索步长大于8以后,ucPointNr统一设置为0
    {
      if ( iTop >= iSrchRngVerTop && iLeft >= iSrchRngHorLeft &&
          iRight <= iSrchRngHorRight && iBottom <= iSrchRngVerBottom ) // check border,在搜索范围内  
      {
        xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iTop,    0, iDist );//!< 2
        xTZSearchHelp( pcPatternKey, rcStruct, iLeft,   iStartY, 0, iDist );//!< 4
        xTZSearchHelp( pcPatternKey, rcStruct, iRight,  iStartY, 0, iDist );//!< 5
        xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iBottom, 0, iDist );//!< 7
        for ( Int index = 1; index < 4; index++ )//!< 不妨假设此时iDist = 16,搜索的点可以以(iStartX, iStartY)为原点进行描点,不难得出钻石扫描的pattern
        {
          Int iPosYT = iTop    + ((iDist>>2) * index);//!< iTop + 4 (8, 12)
          Int iPosYB = iBottom - ((iDist>>2) * index);//!< iBottom - 4 (8, 12)  
          Int iPosXL = iStartX - ((iDist>>2) * index);//!< iStartX - 4 (8, 12)
          Int iPosXR = iStartX + ((iDist>>2) * index); //!< iStartX + 4 (8, 12) 
          xTZSearchHelp( pcPatternKey, rcStruct, iPosXL, iPosYT, 0, iDist );
          xTZSearchHelp( pcPatternKey, rcStruct, iPosXR, iPosYT, 0, iDist );
          xTZSearchHelp( pcPatternKey, rcStruct, iPosXL, iPosYB, 0, iDist );
          xTZSearchHelp( pcPatternKey, rcStruct, iPosXR, iPosYB, 0, iDist );
        }
      }
      else // check border,有部分越界,在确保不越界的地方进行搜索
      {
        if ( iTop >= iSrchRngVerTop ) // check top
        {
          xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iTop, 0, iDist );
        }
        if ( iLeft >= iSrchRngHorLeft ) // check left
        {
          xTZSearchHelp( pcPatternKey, rcStruct, iLeft, iStartY, 0, iDist );
        }
        if ( iRight <= iSrchRngHorRight ) // check right
        {
          xTZSearchHelp( pcPatternKey, rcStruct, iRight, iStartY, 0, iDist );
        }
        if ( iBottom <= iSrchRngVerBottom ) // check bottom
        {
          xTZSearchHelp( pcPatternKey, rcStruct, iStartX, iBottom, 0, iDist );
        }
        for ( Int index = 1; index < 4; index++ )
        {
          Int iPosYT = iTop    + ((iDist>>2) * index);
          Int iPosYB = iBottom - ((iDist>>2) * index);
          Int iPosXL = iStartX - ((iDist>>2) * index);
          Int iPosXR = iStartX + ((iDist>>2) * index);
          
          if ( iPosYT >= iSrchRngVerTop ) // check top
          {
            if ( iPosXL >= iSrchRngHorLeft ) // check left
            {
              xTZSearchHelp( pcPatternKey, rcStruct, iPosXL, iPosYT, 0, iDist );
            }
            if ( iPosXR <= iSrchRngHorRight ) // check right
            {
              xTZSearchHelp( pcPatternKey, rcStruct, iPosXR, iPosYT, 0, iDist );
            }
          } // check top
          if ( iPosYB <= iSrchRngVerBottom ) // check bottom
          {
            if ( iPosXL >= iSrchRngHorLeft ) // check left
            {
              xTZSearchHelp( pcPatternKey, rcStruct, iPosXL, iPosYB, 0, iDist );
            }
            if ( iPosXR <= iSrchRngHorRight ) // check right
            {
              xTZSearchHelp( pcPatternKey, rcStruct, iPosXR, iPosYB, 0, iDist );
            }
          } // check bottom
        } // for ...
      } // check border
    } // iDist <= 8
  } // iDist == 1
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 这是一个下载HEVC视频扩展的网站。HEVC是一种高效视频编码标准,可以提供更好的视频质量和更小的文件大小。这个扩展可以让Windows 10系统的电影和电视应用程序支持HEVC视频格式。如果你需要在Windows 10上播放HEVC视频,可以从这个网站下载这个扩展。 ### 回答2: 这个链接是一个可以下载 HEVC 视频扩展的网站。HEVC 是一种广泛使用的视频编解码技术,它可以在更小的文件大小下提供更高质量的视频。这对于那些需要在带宽受限的网络环境下观看高质量视频的用户来说是非常有用的。 在下载 HEVC 视频扩展之前,用户需要确认他们的设备操作系统是否支持该扩展。HEVC 视频扩展主要适用于 Windows 10 平台,如果您使用的是其他操作系统,可能无法使用此扩展。 在下载和安装 HEVC 视频扩展后,用户就可以开始在其设备上播放 HEVC 编码的视频文件了。 这个过程是非常简单的,只需要双击所需的 HEVC 格式的视频文件即可开始播放。 需要注意的是,使用 HEVC 视频扩展可能会对硬件有一定要求。因为 HEVC 视频在压缩和解压缩时需要较高的处理能力,所以如果您的设备不足以处理 HEVC 视频,则可能会出现播放卡顿或无法播放的情况。 总的来说,如果您是 Windows 10 用户,并且需要观看更高质量的视频文件,那么 HEVC 视频扩展是一个非常有用的工具。下载和安装过程非常简单,只需要几分钟即可完成。虽然需要注意硬件要求的问题,但如果您的设备可以支持 HEVC 视频,则将获得更好的视频体验。 ### 回答3: https://www.free-codecs.com/hevc_video_extension_download.htm是一个可以下载HEVC视频扩展插件的网站。HEVC是高效视频编码标准的简称,它采用了先进的编码技术,能够保证在相同画质下,视频文件的大小会更小,这使得在网络传输和存储时能够降低带宽和空间需求。 HEVC视频扩展插件是一款免费的软件,它为Windows 10操作系统提供了对HEVC视频的支持。当用户安装这个插件后,Windows 10就能够直接播放HEVC格式的视频文件,而无需安装第三方播放器或者解码器。这种方式简便快捷,并且可以提高视频播放的效率。 在HEVC视频扩展插件的下载页面,用户需要选择对应的Windows 10版本。下载和安装过程都非常简单,只需要按照页面提示进行操作即可。安装完成后,用户就能够在Windows 10中直接播放HEVC格式的视频文件。 HEVC视频扩展插件的使用非常方便,它支持绝大多数常用的播放器,包括Windows Media Player、VLC、PotPlayer等。当用户在播放HEVC格式的视频文件时,只需要打开对应的播放器即可。在Windows Media Player中,用户需要打开"设置"->"应用程序"->"视频",然后打开"启用HEVC视频扩展"这个选项。 总之,HEVC视频扩展插件是一款重要的软件,它可以让用户在Windows 10操作系统下直接播放HEVC格式的视频文件,而不需要额外安装任何软件。能够提高视频播放的效率,并且让用户享受更精彩的视频体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值