Quantcast
Channel: 英特尔开发人员专区文章
Viewing all articles
Browse latest Browse all 583

设备端 AVC 运动评估简介

$
0
0

下载示例

下载设备端 VME 示例代码 和高级示例

运行指令详见 VME 示例用户指南。 请参阅 AVC 设备端 VME 手册

请注意:本示例目前仅限在 Linux*、SRB4/Media Server Studio 2017 R2 及更高版本中运行,仅支持第六代智能英特尔® 酷睿™ 处理器及更新一代的处理器。

简介

本文介绍了面向 OpenCL* 的全新设备端 h.264/高级视频编码 (AVC) 运动评估扩展,该扩展由英特尔处理器图形 GPU 提供;视频运动评估 (VME) 硬件作为英特尔® 媒体软件开发套件视频编解码器的重要组件,多年前便可以进行访问,也可以通过主机调用的内置函数进行访问。全新   cl_intel_device_side_avc_motion_estimation扩展(在 Linux 驱动程序 SRB4 中获取) 提供了从内核访问硬件支持 AVC VME 功能的细化接口。 

以下部分介绍了 VME 如何利用英特尔扩展访问 OpenCL* 标准:

运动评估概述

运动评估流程可以用于搜索一系列本地(数据块级别)转换,这些转换能够出色地匹配帧和帧之间的时间差异。 如果没有硬件加速,该搜索成本高昂。 通过实现该操作的硬件加速,我们能够以全新的方式对各种算法进行研究。 

 对于第六代酷睿/Skylake 处理器,英特尔® 处理器显卡 Gen9 计算架构 指南提供了 更多的硬件信息, 可以简要概括为:

  • VME 硬件作为采样器模块的一部分,包含在所有子切片中(下图左下方)。英特尔分支团体在子切片级别工作,设备端 VME 扩展也基于分支团体。
  • Gen9 硬件的每个切片一般包含 3 个子切片(24 EU/片)。
  • 处理器包含的切片数量各不相同,  您可以根据 ark.intel.com(提供处理器图形 GPU 的名称)或 notebookcheck.com 等其他网站(提供关于处理器图形模型的更多信息)中的信息确定切片的数量。

运动搜索是许多现代编解码器的核心操作, 它还有许多其它方面的应用。 可以添加至视频稳定和帧插值等过滤器中,以进行视频处理。 它还是一款实用的预处理器,可以进行编码,提供运动复杂性、运动在帧中的位置等信息。   

从计算机视觉的角度看,运动矢量是基于光流的算法基础。

目前可用的英特尔® 处理器图形 GPU 硬件只支持 AVC/H.264 运动评估, HEVC/H.265 运动评估要复杂得多。 但是,这不一定意味着 AVC 运动评估只面向 AVC。 可以利用 VME 返回的选择(旨在简化 AVC 运动方向搜索)  缩小第二次通过/更详细的搜索(如需要)的搜索区域。

 

设备端接口

之前的实施注重主机调用的内置函数, 设备端实施需要若干设置阶段的内核代码:

  1. 一般初始化 (intel_sub_group_avc_ime_initialize)
  2. 操作配置(包括内部成本及所需的其他属性)

(来自 vme_basic.cl)

      intel_sub_group_avc_ime_payload_t payload =
        intel_sub_group_avc_ime_initialize( srcCoord, partition_mask, sad_adjustment);

      payload = intel_sub_group_avc_ime_set_single_reference(
        refCoord, CLK_AVC_ME_SEARCH_WINDOW_EXHAUSTIVE_INTEL, payload);

      ulong cost_center = 0;
      uint2 packed_cost_table = intel_sub_group_avc_mce_get_default_medium_penalty_cost_table();
      uchar search_cost_precision = CLK_AVC_ME_COST_PRECISION_QPEL_INTEL;
      payload = intel_sub_group_avc_ime_set_motion_vector_cost_function( cost_center, packed_cost_table, search_cost_precision, payload );

然后是评估阶段 (intel_sub_group_avc_ime_evaluate*). 随后可以利用 intel_sub_group_avc_ime_get* 函数提取结果。

      intel_sub_group_avc_ime_result_t result =
         intel_sub_group_avc_ime_evaluate_with_single_reference(
             srcImg, refImg, vme_samp, payload );

      // Process Results
      long mvs           = intel_sub_group_avc_ime_get_motion_vectors( result );
      ushort sads        = intel_sub_group_avc_ime_get_inter_distortions( result );
      uchar major_shape  = intel_sub_group_avc_ime_get_inter_major_shape( result );
      uchar minor_shapes = intel_sub_group_avc_ime_get_inter_minor_shapes( result );
      uchar2 shapes = { major_shape, minor_shapes };
      uchar directions   = intel_sub_group_avc_ime_get_inter_directions( result );

 

在本示例中,我们利用相似的步骤修改了运动评估的子像素:

     intel_sub_group_avc_ref_payload_t payload =
       intel_sub_group_avc_fme_initialize(
          srcCoord, mvs, major_shape, minor_shapes,
          directions, pixel_mode, sad_adjustment);

     payload =
      intel_sub_group_avc_ref_set_motion_vector_cost_function(
         cost_center,packed_cost_table,search_cost_precision,payload );

     intel_sub_group_avc_ref_result_t result =
      intel_sub_group_avc_ref_evaluate_with_single_reference(
         srcImg, refImg, vme_samp, payload );

     mvs = intel_sub_group_avc_ref_get_motion_vectors( result );
     sads = intel_sub_group_avc_ref_get_inter_distortions( result );

 

预期结果

请注意 --  下面仅用了输入/输出帧的 一小片区域。

来自输入(源帧和参考帧/前一帧)

本示例的测试片段中产生了“缩小”的运动, 下图显示了主要差异的位置(来自源图像和参考图像的 imagemagick 对比)。

此处显示示例的输出覆盖了运动矢量。 需要指出的是,多数符合缩小的预期径向模式。

其他输出包括 AVC 宏模块形状选择(如下所示)和残差。

结论

视频运动评估是一个强大的特性,开启了探索用于视频编解码器和计算机视觉的众多算法的全新方式。 如果在 CPU 上搜索最具代表性的运动矢量,会产生高昂的计算成本, 可以将搜索卸载至英特尔处理器图形架构图像采样器中的特定硬件。 全新的设备端(从内核中调用)接口支持更高的灵活性和定制功能,同时减少主机端启动的潜在性能成本。

参考资料

 

 

如欲获取关于编译器优化的完整信息,请查看 优化通知

OpenCL 和 OpenCL 标识是苹果公司的商标,需获得 Khronos 的许可方能使用。

 


Viewing all articles
Browse latest Browse all 583

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>