设备端 AVC 运动评估简介

下载示例

下载设备端 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 的许可方能使用。

 

Hay descargas disponibles bajo Intel Sample Source Code License Agreement license. Descargar ahora
Para obtener información más completa sobre las optimizaciones del compilador, consulte nuestro Aviso de optimización.