分享

关于 DXVA 2.0

 金刚光 2023-07-22 发布于辽宁

 视频编解码硬件方案最早是在嵌入式领域中广泛存在,如采用DSP,FPGA,ASIC等,用来弥补嵌入式系统CPU等资源能力不足问题,但随着视频分辨率越来越高(从CIF经历720P,1080P发展到4K,8K),编码算法越来越复杂(从mpeg2经历h264,发展到h265),PC的软件规模也越来越庞大,视频应用也越来也丰富,单独靠CPU来编解码已经显得勉为其难,一种集成在显卡中gpu用来参与编解码工作已经成为主流。

一) gpu存在的形式

gpu主要驻留在显卡上,配合显卡参与显示,绘图,编解码,并行计算等工作。常见形式有以下3类。

1) 独立显卡形式,如AMD和NVIDIA独立显卡。

                                              

                                                                      独立显卡

2)集成在CPU中的核显,如intel的某些带核显处理器和AMD某些带核显处理器

                                                 

                                                                         带核显的处理器

3) 视频加速卡

专门用来在服务器端进行编解码使用,如Intel的 VCA卡等。

                                         

                                                          专用视频加速卡

二)gpu编解码的常用技术方案

1)厂家SDK方案

对应gpu编解码,硬件厂家都有相应SDK方案,应用开发者可以直接调用厂家的SDK 来完成编解码器工作。

 

NVIDIA

AMD

  INTEL

编码器

 NVENC

 UVD

参考sample_encode

解码器

 NVDEC

 VCE

参考sample_decode

对应的SDK

Video_Codec_SDK

 AMF SDK

 Intel Media SDK

                                                                硬件编解码SDK方案

2)FFMPEG方案

ffmpeg对厂家SDK进行封装和集成,实现部分的硬件编解码

 

NVIDIA

AMD

INTEL

编码器

xxx_nvenc

xxx_amf

xxxx_qsv

解码器

xxx_ cuvid

暂未实现

xxxx_qsv

                                                                   ffmpeg硬解编解码应用

其中xxx标识编码类型,如h264,h265,mpeg2,vp8,vp9等。其次在ffmpeg中软件编解码器可以实现相关硬解加速。如在h264解码器中可以使用cuda 加速,qsv加速,dxva2 加速,d3d11va加速,opencl加速等。

 

cuda

qsv

dxva2/d3d11va

opencl

应用场景

适应NVIDIA显卡平台,但跨OS

适应Intel显卡平台,但跨OS

适用Windows OS,但跨硬件平台

仅仅支持opencl的硬件平台

                                                                   ffmpeg硬解加速应用

3)gstreamer方案

 

gst-msdk

gst-vaapi

gst-d3d11

编码器

msdkxxxenc

vaapixxxenc

解码器

msdkxxxdec

vaapixxxdec

d3d11xxxdec

 

应用场景

仅限intel gpu

仅限intel gpu的linux系统

仅限Windows D3D加速,跨硬件平台

                               Gstreamer硬件加速编解码方案

其中xxx标识编码类型,如h264,h265,mpeg2,vp8,vp9等。

在Linux关于gst-msdk和gst-vaapi的差异如下:

以上是关于视频在PC上的硬解硬编的常见方案。

关于 DXVA 2.0

  • 项目

DirectX 视频加速 (DXVA) 是一个 API 和相应的 DDI,用于使用硬件加速来加快视频处理。 软件编解码器和软件视频处理器可以使用 DXVA 将某些 CPU 密集型操作卸载到 GPU。 例如,软件解码器可以将反向离散余弦变换 (iDCT) 卸载到 GPU。

在 DXVA 中,某些解码操作由图形硬件驱动程序实现。 这组功能称为 加速器。 其他解码操作由称为 主机解码器 或 软件解码器的用户模式应用程序软件实现。 (术语主机解码器和软件解码器是等效的。) 加速器执行的处理称为主机外处理。 通常,加速器使用 GPU 来加速某些操作。 每当加速器执行解码操作时,主机解码器必须向包含执行操作所需信息的加速器缓冲区传达

DXVA 2 API 需要 Windows Vista 或更高版本。 为了向后兼容,Windows Vista 仍支持 DXVA 1 API。 提供了一个仿真层,用于在 API 的任一版本与相反版本的 DDI 之间进行转换:

  • 如果图形驱动程序符合 Windows 显示驱动程序模型 (WDDM) ,则 DXVA 1 API 调用将转换为 DXVA 2 DDI 调用。
  • 如果图形驱动程序使用较旧的 Windows XP 显示驱动程序模型 (XPDM) ,则 DXVA 2 API 调用将转换为 DXVA 1 DDI 调用。

下表显示了每个版本的 DXVA API 的操作系统要求和支持的视频呈现器。

API 版本要求视频呈现器支持
DXVA 1Windows 2000 或更高版本覆盖混合器、VMR-7、VMR-9 (DirectShow 仅)
DXVA 2Windows VistaEVR (DirectShow 和 Media Foundation)

 

在 DXVA 1 中,软件解码器必须通过视频呈现器访问 API。 如果不调用视频呈现器,就无法使用 DXVA 1 API。 DXVA 2 中已删除此限制。 使用 DXVA 2,主机解码器 (或任何应用程序) 都可以通过 IDirectXVideoDecoderService 接口直接访问 API。

DXVA 1 文档介绍了用于以下视频标准的解码结构:

  • ITU-T Rec. H.261
  • ITU-T Rec. H.263
  • MPEG-1 视频
  • MPEG-2 主配置文件视频

以下规范定义了其他视频标准的 DXVA 扩展:

DXVA 1 和 DXVA 2 使用相同的数据结构进行解码。 但是,配置解码会话的过程已更改。 DXVA 1 使用“探测和锁定”机制,其中主机解码器可以在加速器上设置所需配置之前测试各种配置。 在 DXVA 2 中,加速器返回受支持的配置列表,主机解码器从列表中选择一个。 以下部分提供了详细信息:

相关主题

DirectX 视频加速 2.0

DXVA 1.0 规范

 

【硬件解码系列】之DXVA2

walkingMa于 2019-02-10 16:49:14 发布5571 收藏 3

 本文小编也是在学习dxva2解码,所以很多资料都是来源网上搜集加自己理解。

1. DXVA2解码过程

(1)、调用DXVA2CreateDirect3DDeviceManager9函数获取到IDirect3DDeviceManager9接口的一个对象。
(2)、调用IDirect3DDeviceManager9::OpenDeviceHandle 函数获取到一个Direct3D 设备对象句柄。
(3)、调用IDirect3DDeviceManager9::GetVideoService 函数并且传递Direct3D设备句柄,这个函数返回IDirectXVideoDecoderService接口对象指针。
(4)、调用 IDirectXVideoDecoderService::GetDecoderDeviceGuids 函数返回解码设备GUID的数组。
(5)、循环遍历解码设备GUID数组找到一个目前硬件驱动能支持的GUID解码设备。例如,如果驱动只支持MPEG-2 解码,则需要找到DXVA2_ModeMPEG2_MOCOMP, DXVA2_ModeMPEG2_IDCT, or DXVA2_ModeMPEG2_VLD这几个GUID才能解码。
(6)、如果你找到了一个解码设备GUID,传递这个GUID给IDirectXVideoDecoderService::GetDecoderRenderTargets 函数,这个函数返回一个类型为D3DFORMAT 的渲染目标格式数组(render target format)。
(7)、循环遍历渲染目标格式数组,找到一个匹配的输出格式。通常一个解码设备只支持一个渲染目标输出格式。
(8)、调用IDirectXVideoDecoderService::GetDecoderConfigurations函数,并且传递解码设备GUID和DXVA2_VideoDesc结构体(描述视频信息)。这个函数返回一个 DXVA2_ConfigPictureDecode结构体的数组,这个数组中的每一项描述一个可能的解码配置信息。
(9)、调用IDirectXVideoDecoderService::CreateVideoDecoder函数,并且传递解码设备GUID和DXVA2_VideoDesc结构体, DXVA2_ConfigPictureDecode,渲染目标surface数组。这个函数将返回一个IDirectXVideoDecoder 接口对象。
(10)、调用函数 IDirectXVideoDecoder::BeginFrame
(11)、调用下面过程多次:

  1. 调用IDirectXVideoDecoder::GetBuffer 函数得到一个DXVA解码缓冲区( DXVA decoder buffer )。
  2. 将数据填充到这个DXVA解码缓冲区中。
  3. 调用 IDirectXVideoDecoder::ReleaseBuffer 释放这个DXVA解码缓冲区。

(12)、调用 IDirectXVideoDecoder::Execute 函数执行这一帧的解码操作。
(13)、调用IDirectXVideoDecoder::EndFrame 。

注意:在每一帧解码之前必须调用函数IDirect3DDeviceManager9::TestDevice测试设备句柄是否修改。如果设备已经修改,此函数将返回DXVA2_E_NEW_VIDEO_DEVICE。如果这种情况发生,执行下面操作:

  1. 通过调用IDirect3DDeviceManager9::CloseDeviceHandle函数关闭设备句柄对象。
  2. 释放 IDirectXVideoDecoderService 和 IDirectXVideoDecoder 对象指针。
  3. 打开一个新的设备句柄。
  4. 协商一个新的解码配置项。
  5. 创建一个新的解码设备。

摘抄自参考网址:https://www.cnblogs.com/betterwgo/p/6125507.html , 此参考网址将dxva的调用流程说的很清楚。

上面的函数是为创建IDirectXVideoDecoder 接口对象使用的。而实际的解码函数,主要由2个函数组成:

ff_dxva2_common_end_frame
ff_dxva2_commit_buffer

此2个函数由不同的函数调用,例如对于h264格式的码流是由ff_h264_dxva2_hwaccel 中的.end_frame = dxva2_h264_end_frame函数调用。

AVHWAccel ff_h264_dxva2_hwaccel = {
    .name           = "h264_dxva2",
    .type           = AVMEDIA_TYPE_VIDEO,
    .id             = AV_CODEC_ID_H264,
    .pix_fmt        = AV_PIX_FMT_DXVA2_VLD,
    .start_frame    = dxva2_h264_start_frame,
    .decode_slice   = dxva2_h264_decode_slice,
    .end_frame      = dxva2_h264_end_frame,
    .frame_priv_data_size = sizeof(struct dxva2_picture_context),
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

ff_h264_dxva2_hwaccel结构体是由int ff_get_format(AVCodecContext *avctx, const enum AVPixelFormat *fmt)函数中的if (!setup_hwaccel(avctx, ret, desc->name)) 调用(此函数源自 libavcodec/utils.c),

可参考目前网上已有的工程:
也可参考ffmpeg自带的sample:例如ffmpeg-3.2中的ffmpeg_dxva2.c

参考网址:https://blog.csdn.net/xiaoyafang123/article/details/82905452
参考网址:https://blog.csdn.net/lishuzhai/article/details/52497110

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多