HEVC代码追踪(十一。四):运动估计/补偿之xPatternSearch和xPatternSearchFast

简介: <p><br></p> <p></p><pre name="code" class="cpp">Void TEncSearch::xPatternSearch( TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, TComMv* pcMvSrchRngLT, TComMv* pcMvSrchRngRB, TComMv&


Void TEncSearch::xPatternSearch( TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, TComMv* pcMvSrchRngLT, TComMv* pcMvSrchRngRB, TComMv& rcMv, UInt& ruiSAD )
{
  Int   iSrchRngHorLeft   = pcMvSrchRngLT->getHor();
  Int   iSrchRngHorRight  = pcMvSrchRngRB->getHor();
  Int   iSrchRngVerTop    = pcMvSrchRngLT->getVer();
  Int   iSrchRngVerBottom = pcMvSrchRngRB->getVer();
  
  UInt  uiSad;
  UInt  uiSadBest         = MAX_UINT;
  Int   iBestX = 0;
  Int   iBestY = 0;
  
  Pel*  piRefSrch;
  
  //-- jclee for using the SAD function pointer
  m_pcRdCost->setDistParam( pcPatternKey, piRefY, iRefStride,  m_cDistParam );
  
  // fast encoder decision: use subsampled SAD for integer ME
  if ( m_pcEncCfg->getUseFastEnc() )
  {
    if ( m_cDistParam.iRows > 8 )
    {
      m_cDistParam.iSubShift = 1;
    }
  }
  
  piRefY += (iSrchRngVerTop * iRefStride);
  for ( Int y = iSrchRngVerTop; y <= iSrchRngVerBottom; y++ )
  {
    for ( Int x = iSrchRngHorLeft; x <= iSrchRngHorRight; x++ )
    {
      //  find min. distortion position
      piRefSrch = piRefY + x;
      m_cDistParam.pCur = piRefSrch;

      setDistParamComp(0);

      m_cDistParam.bitDepth = g_bitDepthY;
      uiSad = m_cDistParam.DistFunc( &m_cDistParam );
      
      // motion cost
      uiSad += m_pcRdCost->getCost( x, y );
      
      if ( uiSad < uiSadBest )
      {
        uiSadBest = uiSad;
        iBestX    = x;
        iBestY    = y;
      }
    }
    piRefY += iRefStride;
  }
  
  rcMv.set( iBestX, iBestY );
  
  ruiSAD = uiSadBest - m_pcRdCost->getCost( iBestX, iBestY );
  return;
}


//先考虑整像素搜索的情况,进入到xPatternSearchFast中去
//先是获得预测的运动矢量,接着调用xTZSearch进行搜索,xTZSearch这个函数相对比较长,里面调用了很多子函数
Void TEncSearch::xPatternSearchFast( TComDataCU* pcCU, TComPattern* pcPatternKey, Pel* piRefY, Int iRefStride, TComMv* pcMvSrchRngLT, TComMv* pcMvSrchRngRB, TComMv& rcMv, UInt& ruiSAD )
{//!< 获取相邻PU: A, B, C的运动矢量,作为预测运动矢量
  pcCU->getMvPredLeft       ( m_acMvPredictors[0] );
  pcCU->getMvPredAbove      ( m_acMvPredictors[1] );
  pcCU->getMvPredAboveRight ( m_acMvPredictors[2] );
  
  switch ( m_iFastSearch )
  {
    case 1:
      xTZSearch( pcCU, pcPatternKey, piRefY, iRefStride, pcMvSrchRngLT, pcMvSrchRngRB, rcMv, ruiSAD );
      break;
      
    default:
      break;
  }
}




目录
相关文章
|
网络安全 开发工具 数据安全/隐私保护
|
算法 搜索推荐 开发者
解锁Python代码的速度之谜:性能瓶颈分析与优化实践
探索Python性能优化,关注解释器开销、GIL、数据结构选择及I/O操作。使用cProfile和line_profiler定位瓶颈,通过Cython减少解释器影响,多进程避开GIL,优化算法与数据结构,以及借助asyncio提升I/O效率。通过精准优化,Python可应对高性能计算挑战。【6月更文挑战第15天】
1981 1
|
机器学习/深度学习 C语言
详细解读C语言math.h中常用函数
详细解读C语言math.h中常用函数
325 1
|
Java 关系型数据库 微服务
论后端未来发展及学习路线(详细讲解)
论后端未来发展及学习路线(详细讲解)
|
机器学习/深度学习 并行计算 编译器
AVX2指令集简介和代码示例
这篇文章介绍了AVX2指令集,它是Intel在2013年为提高处理器并行计算能力引入的SIMD技术。AVX2增强了整数运算,包括256位操作和位操作,还提供了FMA指令及更多广播和转换功能。与AVX相比,AVX2在图像处理和媒体编码等领域有显著优势。文章通过一个C代码示例展示了如何使用AVX2进行向量加法,并提醒编译时需确保支持AVX2指令集。
|
编译器 数据中心 开发者
安谋科技(Arm China)别再平:Arm Neoverse 软件生态介绍
2023年8月15日,系列课程第二节《Arm Neoverse 软件生态介绍》正式上线,由安谋科技(Arm China)高级软件经理别再平主讲,内容涵盖:Arm Neoverse 介绍,Arm Neoverse 软件生态系统,Arm Neoverse 软件迁移。
安谋科技(Arm China)别再平:Arm Neoverse 软件生态介绍
|
Linux 图形学
深入理解Qt定时器:QTimer的魅力与挑战(一)
深入理解Qt定时器:QTimer的魅力与挑战
7518 0
|
算法 Unix Linux
linux比较两个文件是否一样(linux命令md5sum使用方法)
linux比较两个文件是否一样(linux命令md5sum使用方法)
283 0
|
存储 编解码 vr&ar
色彩空间与像素格式
颜色是不同波长的光对人眼刺激产生的色彩感觉。色彩空间(Color Space)是颜色的数学表示,根据不同的表示方法分为不同的色彩模型。最常用的色彩模型有三类:RGB(用于计算机图形学), YUV(用于视频系统), CMYK(用于彩色印刷)。后文对色彩空间与色彩模型的叫法不作区分。本文仅讨论视频图像处理领域常用的 RGB 色彩空间和 YUV 色彩空间。
3192 0
色彩空间与像素格式
|
算法 安全 Java
小白都能看懂的CAS基本原理与实战应用指南
小白都能看懂的CAS基本原理与实战应用指南
1555 1