本文小编也是在学习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),
};

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

【硬件解码系列】之DXVA2相关推荐

  1. 【硬件解码系列】之ffmpeg硬件加速器

    网址:http://trac.ffmpeg.org/wiki/HWAccelIntro Platform API Availability Linux Windows Android Apple Ot ...

  2. RIoTBoard开发板系列笔记(十二)—— gstreamer + vpu实现视频硬件解码播放

    i.mx6 solo芯片中包含一个VPU (video processing unit),可以进行视频硬件编解码加速,之前RIoTBoard开发板系列笔记(四)-- 使用VPU硬件解码文章简单的记录了 ...

  3. RIoTBoard开发板系列笔记(四)—— 使用VPU硬件解码

    视频解码分为软解和硬解两种,简单的来说纯粹依靠CPU来解码的称为软解,而使用GPU/VPU解码的称为硬解.常规地直接用CPU解码会极大地消耗CPU的运算能力,硬件解码是通过显卡的视频加速功能对高清视频 ...

  4. dxva2+ffmpeg硬件解码(Windows)重要笔记3

    参考了csdn上Win32Project1_ffmpeg_dxva2这个例子,很不错,直接就可以运行. 但是,有几个问题: 1.窗口无法正常缩放,缩放后,图像大小并没有一起缩放 2.H265的编码格式 ...

  5. SkeyeRTSPLive高效转码之SkeyeVideoDecoder采用Nvidia独立显卡高效硬件解码解决方案(附源码)

    在我之前写的一篇文章<SkeyeRTSPLive传统视频监控互联网+实现利器解决方案>中提到RTSP转RTMP的转流过程,简化流程就是通过SkeyeRTSPClient拉RTSP流,获取音 ...

  6. 阿里云 RTC QoS 弱网对抗之 LTR 及其硬件解码支持

    LTR 弱网对抗由于需要解码器的反馈,因此用硬件解码器实现时需要做一些特殊处理.另外,一些硬件解码器对 LTR 的实现不是特别完善,会导致出现解码错误.本文为 QoS 弱网优化系列的第三篇,将为您详解 ...

  7. SkeyeRTSPLive高效转码之SkeyeVideoDecoder采用Intel集成显卡高效硬件解码解决方案(附源码) (1)

    在我之前写的一篇文章<SkeyeRTSPLive传统视频监控互联网+实现利器解决方案>中提到RTSP转RTMP的转流过程,简化流程就是通过SkeyeRTSPClient拉RTSP流,获取音 ...

  8. 全平台硬件解码渲染方法与优化实践

    硬件解码后不恰当地使用OpenGL渲染会导致性能下降,甚至不如软解.本文来自PPTV移动端研发经理王斌在LiveVideoStackCon 2017大会上的分享,并由LiveVideoStack整理而 ...

  9. IOS硬件解码VTDecompressionSession失效

    原文:http://blog.5ibc.net/p/33817.html 编码.解码失效都可以restart一下. IOS硬件解码VideoToolbox在应用中进入后台VTDecompression ...

最新文章

  1. linux——关于ip、静态网络、动态网络、网关、DNS的设置
  2. VHDL设计出租车计价器
  3. C++内存管理(1)
  4. uboot源码——命令体系
  5. 99行不用指针 c语言贪食蛇,关于C语言指针的问题
  6. 园子装修 | 打造自己的直男审美博客园(施工中,持续更新)
  7. 在Eclipse中配置NDK自动编译环境builders
  8. ios系统软件迁移到安卓_苹果系统怎么把文件转到安卓手机?
  9. Lambda表达式----“进化论”
  10. 象棋的杀法??????
  11. photoshop快捷键大全
  12. html怎么设置网页的大小怎么设置,css怎么设置字体大小
  13. vivo联手京东,打通线上线下营销生态
  14. 关于笔试遇到的题 1
  15. win cmd快速调取CTex集宏手册及一份不太简短的latex介绍
  16. 哒哒哒~~今天说 事务的隔离级别和传播特性
  17. 在Unity中制作逼真的建筑场景
  18. C语言 12个球称3次 找出其中一个坏球
  19. 计算机win7几位,Win7 32位与64位有什么区别 Win7系统32位和64位的区别科普篇
  20. Linux命令及其全称(转)

热门文章

  1. python字典和json字符串相互转化的方法_Python处理json字符串转化为字典的简单实现...
  2. 视图与表之间的异同点_灯芯绒面料印花与染色的异同点有哪些?做灯芯绒订单的了解一下...
  3. Oulipo(Hash入门第一题 Hash函数学习)
  4. Boxes in a Line UVA - 12657 (双向链表)
  5. UVALive - 4223(hdu 2926)
  6. hhkb mac设置_我最爱的HHKB
  7. Spring Boot整合Swagger3注解@ApiImplicitParam的allowMultiple属性
  8. 英才计划计算机潜质测评试题,员工能力与素质测评题库完整.doc
  9. networkx中求解平均度_CFD理论|Reynolds平均法(RANS)
  10. mysql数据库中文乱码解决