GPU编解码:GPU硬解码---DXVA

  一、DXVA介绍

  DXVA是微软公司专门定制的视频加速规范,是一种接口规范。DXVA规范制定硬件加速解码可分四级:VLD,控制BitStream;IDCT,反余弦变换;Mocomp,运动补偿,Pixel Prediction;PostProc,显示后处理。其中,VLD加速等级最高,所以其包含IDCT、MoCoopm和PostProc;IDCT加速次之,包含MoCoopm和PostProc;最后MoComp加速仅包含PostProc。一款显卡芯片在硬件支持DXVA规范,并不代表它就实现了DXVA所有功能。DXVA_Checker可用于检测硬件所支持的等级,DXVA_Checker运行示意图如下所示。

  二、使用FFmpeg中DXVA技术硬解码

  基本思路:

  1.根据FFmpeg对编码器的描述,实现自定义的硬解码器。

  2.通过REGISTER_ENCODEC(X,x)将自定义的视频编码器添加到视频编解码器。

  3.在视频解码,根据编码器ID或编码器名称找到视频编解码器中自定义的视频解码器。

  4.利用自定义的视频解码器,解码视频。

  其关键步骤是:自定义解码器的实现,需要参考FFmpeg源码中,解码器的定义和接口设计。

  基于DXVA的自定义解码器实现

  1.熟悉FFmpeg中编解码的组织方式

  下图是ffmpeg编解码组织的简单示意图。

  由示意图可知,编解码器由全局链表组织,可根据编码器的名称或ID,获取编解码器。

  编解码器的具体编解码的具体工作,由编解码器定义的函数指针完成。

  自定义解码器时,需要按照AVCodec结构体,定义解码器的属性,然后注册到全局编解码器链表中。

  2.基于DXVA解码器的定义实现

  ff_h264_dxva2_decoder的定义如下:

  1 AVCodec ff_h264_dxva2_decoder = {

  2 .name = "h264_dxva2",

  3 .type = AVMEDIA_TYPE_VIDEO,

  4 .id = AV_CODEC_ID_H264,

  5 .priv_data_size = sizeof(DXVA2_DecoderContext),

  6 .init = h264_dxva2dec_init,

  7 .close = h264_dxva2dec_close,

  8 .decode = h264_dxva2dec_decode,

  9 .capabilities = CODEC_CAP_DELAY,

  10 .flush = h264_dxva2dec_flush,

  11 .long_name = NULL_IF_CONFIG_SMALL("H.264 (DXVA2 acceleration)"),

  12 };

  ff_h264_dxva2_decoder的函数指针对应的函数定义如下:

  1 static int h264_dxva2dec_decode(AVCodecContext *avctx, void *data, int *got_frame,

  2 AVPacket *avpkt)

  3 {

  4 return ff_dxva2dec_decode(avctx,data,got_frame,avpkt,&ff_h264_decoder);

  5 }

  6

  7 static av_cold int h264_dxva2dec_close(AVCodecContext *avctx)

  8 {

  9 return ff_dxva2dec_close(avctx,&ff_h264_decoder);

  10 }

  11

  12 static av_cold int h264_dxva2dec_init(AVCodecContext *avctx)

  13 {

  14 return ff_dxva2dec_init(avctx,&ff_h264_dxva2_decoder,&ff_h264_decoder);

  15 }

  16

  17 static void h264_dxva2dec_flush(AVCodecContext *avctx)

  18 {

  19 ff_dxva2dec_flush(avctx,&ff_h264_decoder);

  20 }

  上述代码,只是ff_dxva2dec_init(),ff_dxva2dec_flush(),ff_dxva2dec_decode(),ff_dxva2dec_close()的封装,具体解码的实现,由ff_dxva2dec_xxx相关函数完成,其代码实现如下:

  其中,在ff_dxva2dec_init()函数中,利用av_create_dxva2()函数创建dxva2_context,av_setup_dxva2()设置dxva2_context。

  在ff_dxva2dec_close()函数中,利用av_release_dxva2()释放dxva2_context。

  av_xxx_dxva2()相关函数,主要利用DXVA2的API接口,创建dxva2的上下文,并进行管理。

  总体而言,经过四次封装,形成方便的硬解码接口。

  DXVA2 API接口 ---> av_xxx_dxva2 ---> ff_dxva2dec_xxx ---> h264_dxva2dec_xxx ---> ff_h264_dxva2_decoder

【视频开发】GPU编解码:GPU硬解码---DXVA的更多相关文章

  1. 【视频开发】 ffmpeg支持的硬解码接口

    To enable DXVA2, use the --enable-dxva2 ffmpeg configure switch. To test decoding, use the following ...

  2. iOS - 视频开发

    视频实质: 纯粹的视频(不包括音频)实质上就是一组帧图片,经过视频编码成为视频(video)文件再把音频(audio)文件有些还有字幕文件组装在一起成为我们看到的视频(movie)文件.1秒内出现的图 ...

  3. 【GPU编解码】GPU硬解码---CUVID

    问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈. 解决思路: 利用GPU解码高清视频,降低解码所占用CPU资源,加速解 ...

  4. 【计算机视觉】【并行计算与CUDA开发】GPU硬解码---CUVID

    问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈. 解决思路: 利用GPU解码高清视频,降低解码所占用CPU资源,加速解 ...

  5. 【GPU编解码】GPU硬解码---DXVA

    前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码. 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解 ...

  6. 【GPU编解码】GPU硬解码---DXVA (转)

    前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码. 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解 ...

  7. 【计算机视觉】【并行计算与CUDA开发】GPU硬解码---DXVA

    前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码. 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解 ...

  8. 【GPU编解码】GPU硬编码

    一.OpenCV中的硬编码 OpenCV2.4.6中,已实现利用GPU进行写视频,编码过程由cv::gpu::VideoWriter_GPU完成,其示例程序如下. int main(int argc, ...

  9. 【GPU编解码】GPU硬编码 (转)

    一.OpenCV中的硬编码 OpenCV2.4.6中,已实现利用GPU进行写视频,编码过程由cv::gpu::VideoWriter_GPU完成,其示例程序如下. 1 int main(int arg ...

随机推荐

  1. GoLand——配置goproxy.io代理

    前言 由于众所周知的原因,也为了更好的下载go的包,所以找到了goproxy 配置 ctrl+alt+s->Go->Go Modules(vgo)->设置proxy为https:// ...

  2. Java 15周作业

    题目1:编写一个应用程序,输入用户名和密码,访问test数据库中t_login表(字段包括id.username.password),验证登录是否成功. 题目2:在上一题基础上,当登录成功后,将t_u ...

  3. 对生成对抗网络GANs原理、实现过程、应用场景的理解(附代码),另附:深度学习大神文章列表

    https://blog.csdn.net/love666666shen/article/details/75522489 https://blog.csdn.net/yangdelong/artic ...

  4. java 数组遍历(方法内部的代码)

    //数组遍历(依次输出数组中的每一个元素)二维数组: int[][] arr={{1,2},{3,4,5},{6,7}}; for(int i=0;i<arr.length;i++){ for( ...

  5. 每个开发人员必须知道PDB文件知识

    大多数开发人员都意识到PDB文件有助于您进行调试,但仅此而已.如果你不知道PDB文件是怎么回事,不要觉得很糟糕,因为虽然有文档在那里,但它分散在周围,而且大部分是为编译器和调试器编写器准备的.虽然编写 ...

  6. HTML5 离线应用

    一.离线应用cache manifes文件 HTML5中构建了一个离线(无网络状态)应用,只需创建一个cache manifest文件 可以配置需要的缓存的资源,网络无连接应用任然可以使用,本地读取缓 ...

  7. 用户画像(User Profile)

    什么是用户画像? 用户画像是根据某个具体的用户的人口学特征.网络浏览内容.网络社交活动和消费行为等信息而抽象出的一个标签化的用户模型.例如某用户的画像是:男,31岁,已婚,收入1万以上,爱美食,团购达 ...

  8. Android程序员问答题

    前言 最近三个月内,不断地进行移动应用开发在线测试题,也积累了不一样的知识.这也将对android studio有很好的掌握,对将来面试也很有好处.那么我就分享给大家.分享是一种幸福,这是一种质的飞越 ...

  9. Spark跑在Yarn上出现错误,原因是jdk的版本问题

    ./bin/spark-shell --master yarn 2019-07-01 12:20:13 WARN NativeCodeLoader:62 - Unable to load native ...

  10. Cobaltstrike与Metasploit会话转换

    这里只做记录,不做详解 0x00 实验环境 被控制机:192.168.126.129 Metasploit:192.168.126.128 Cobaltstrike:182...* 0x01 CS会话 ...