【硬件解码系列】之DXVA2
序
本文小编也是在学习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)、调用下面过程多次:
- 调用IDirectXVideoDecoder::GetBuffer 函数得到一个DXVA解码缓冲区( DXVA decoder buffer )。
- 将数据填充到这个DXVA解码缓冲区中。
- 调用 IDirectXVideoDecoder::ReleaseBuffer 释放这个DXVA解码缓冲区。
(12)、调用 IDirectXVideoDecoder::Execute 函数执行这一帧的解码操作。
(13)、调用IDirectXVideoDecoder::EndFrame 。
注意:在每一帧解码之前必须调用函数IDirect3DDeviceManager9::TestDevice测试设备句柄是否修改。如果设备已经修改,此函数将返回DXVA2_E_NEW_VIDEO_DEVICE。如果这种情况发生,执行下面操作:
- 通过调用IDirect3DDeviceManager9::CloseDeviceHandle函数关闭设备句柄对象。
- 释放 IDirectXVideoDecoderService 和 IDirectXVideoDecoder 对象指针。
- 打开一个新的设备句柄。
- 协商一个新的解码配置项。
- 创建一个新的解码设备。
摘抄自参考网址: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相关推荐
- 【硬件解码系列】之ffmpeg硬件加速器
网址:http://trac.ffmpeg.org/wiki/HWAccelIntro Platform API Availability Linux Windows Android Apple Ot ...
- RIoTBoard开发板系列笔记(十二)—— gstreamer + vpu实现视频硬件解码播放
i.mx6 solo芯片中包含一个VPU (video processing unit),可以进行视频硬件编解码加速,之前RIoTBoard开发板系列笔记(四)-- 使用VPU硬件解码文章简单的记录了 ...
- RIoTBoard开发板系列笔记(四)—— 使用VPU硬件解码
视频解码分为软解和硬解两种,简单的来说纯粹依靠CPU来解码的称为软解,而使用GPU/VPU解码的称为硬解.常规地直接用CPU解码会极大地消耗CPU的运算能力,硬件解码是通过显卡的视频加速功能对高清视频 ...
- dxva2+ffmpeg硬件解码(Windows)重要笔记3
参考了csdn上Win32Project1_ffmpeg_dxva2这个例子,很不错,直接就可以运行. 但是,有几个问题: 1.窗口无法正常缩放,缩放后,图像大小并没有一起缩放 2.H265的编码格式 ...
- SkeyeRTSPLive高效转码之SkeyeVideoDecoder采用Nvidia独立显卡高效硬件解码解决方案(附源码)
在我之前写的一篇文章<SkeyeRTSPLive传统视频监控互联网+实现利器解决方案>中提到RTSP转RTMP的转流过程,简化流程就是通过SkeyeRTSPClient拉RTSP流,获取音 ...
- 阿里云 RTC QoS 弱网对抗之 LTR 及其硬件解码支持
LTR 弱网对抗由于需要解码器的反馈,因此用硬件解码器实现时需要做一些特殊处理.另外,一些硬件解码器对 LTR 的实现不是特别完善,会导致出现解码错误.本文为 QoS 弱网优化系列的第三篇,将为您详解 ...
- SkeyeRTSPLive高效转码之SkeyeVideoDecoder采用Intel集成显卡高效硬件解码解决方案(附源码) (1)
在我之前写的一篇文章<SkeyeRTSPLive传统视频监控互联网+实现利器解决方案>中提到RTSP转RTMP的转流过程,简化流程就是通过SkeyeRTSPClient拉RTSP流,获取音 ...
- 全平台硬件解码渲染方法与优化实践
硬件解码后不恰当地使用OpenGL渲染会导致性能下降,甚至不如软解.本文来自PPTV移动端研发经理王斌在LiveVideoStackCon 2017大会上的分享,并由LiveVideoStack整理而 ...
- IOS硬件解码VTDecompressionSession失效
原文:http://blog.5ibc.net/p/33817.html 编码.解码失效都可以restart一下. IOS硬件解码VideoToolbox在应用中进入后台VTDecompression ...
最新文章
- linux——关于ip、静态网络、动态网络、网关、DNS的设置
- VHDL设计出租车计价器
- C++内存管理(1)
- uboot源码——命令体系
- 99行不用指针 c语言贪食蛇,关于C语言指针的问题
- 园子装修 | 打造自己的直男审美博客园(施工中,持续更新)
- 在Eclipse中配置NDK自动编译环境builders
- ios系统软件迁移到安卓_苹果系统怎么把文件转到安卓手机?
- Lambda表达式----“进化论”
- 象棋的杀法??????
- photoshop快捷键大全
- html怎么设置网页的大小怎么设置,css怎么设置字体大小
- vivo联手京东,打通线上线下营销生态
- 关于笔试遇到的题 1
- win cmd快速调取CTex集宏手册及一份不太简短的latex介绍
- 哒哒哒~~今天说 事务的隔离级别和传播特性
- 在Unity中制作逼真的建筑场景
- C语言 12个球称3次 找出其中一个坏球
- 计算机win7几位,Win7 32位与64位有什么区别 Win7系统32位和64位的区别科普篇
- Linux命令及其全称(转)
热门文章
- python字典和json字符串相互转化的方法_Python处理json字符串转化为字典的简单实现...
- 视图与表之间的异同点_灯芯绒面料印花与染色的异同点有哪些?做灯芯绒订单的了解一下...
- Oulipo(Hash入门第一题 Hash函数学习)
- Boxes in a Line UVA - 12657 (双向链表)
- UVALive - 4223(hdu 2926)
- hhkb mac设置_我最爱的HHKB
- Spring Boot整合Swagger3注解@ApiImplicitParam的allowMultiple属性
- 英才计划计算机潜质测评试题,员工能力与素质测评题库完整.doc
- networkx中求解平均度_CFD理论|Reynolds平均法(RANS)
- mysql数据库中文乱码解决