【视频开发】GPU编解码:GPU硬解码---DXVA
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的更多相关文章
- 【视频开发】 ffmpeg支持的硬解码接口
To enable DXVA2, use the --enable-dxva2 ffmpeg configure switch. To test decoding, use the following ...
- iOS - 视频开发
视频实质: 纯粹的视频(不包括音频)实质上就是一组帧图片,经过视频编码成为视频(video)文件再把音频(audio)文件有些还有字幕文件组装在一起成为我们看到的视频(movie)文件.1秒内出现的图 ...
- 【GPU编解码】GPU硬解码---CUVID
问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈. 解决思路: 利用GPU解码高清视频,降低解码所占用CPU资源,加速解 ...
- 【计算机视觉】【并行计算与CUDA开发】GPU硬解码---CUVID
问题描述:项目中,需要对高清监控视频分析处理,经测试,其解码过程所占CPU资源较多,导致整个系统处理效率不高,解码成为系统的瓶颈. 解决思路: 利用GPU解码高清视频,降低解码所占用CPU资源,加速解 ...
- 【GPU编解码】GPU硬解码---DXVA
前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码. 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解 ...
- 【GPU编解码】GPU硬解码---DXVA (转)
前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码. 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解 ...
- 【计算机视觉】【并行计算与CUDA开发】GPU硬解码---DXVA
前面介绍利用NVIDIA公司提供的CUVID库进行视频硬解码,下面将介绍利用DXVA进行硬解码. 一.DXVA介绍 DXVA是微软公司专门定制的视频加速规范,是一种接口规范.DXVA规范制定硬件加速解 ...
- 【GPU编解码】GPU硬编码
一.OpenCV中的硬编码 OpenCV2.4.6中,已实现利用GPU进行写视频,编码过程由cv::gpu::VideoWriter_GPU完成,其示例程序如下. int main(int argc, ...
- 【GPU编解码】GPU硬编码 (转)
一.OpenCV中的硬编码 OpenCV2.4.6中,已实现利用GPU进行写视频,编码过程由cv::gpu::VideoWriter_GPU完成,其示例程序如下. 1 int main(int arg ...
随机推荐
- P1972 [SDOI2009]HH的项链[离线+树状数组/主席树/分块/模拟]
题目背景 无 题目描述 HH 有一串由各种漂亮的贝壳组成的项链.HH 相信不同的贝壳会带来好运,所以每次散步完后,他都会随意取出一段贝壳,思考它们所表达的含义.HH 不断地收集新的贝壳,因此,他的项链 ...
- toB创业中的5个行动原则- SaaS创业路线图
https://www.iyiou.com/p/84471.html 1.硬骨头原则 很多创业者急于求成,这做不好toB创业. 举例来说,产品价值阶段如果发现效果不明显,硬要推进到营销阶段在销售上想办 ...
- springboot 打成的jar包在ClassLoader().getResource方法读取文件为null
1.属性文件如下: 10001=错误 2.文件读取主要代码 // getResource方式 URL resourceURI = getClass().getClassLoader().getReso ...
- if语句的嵌套:从键盘输入3个实数,求其最大值。
#include<stdio.h>void main(){ float a,b,c,max; scanf("%f%f%f",&a,&b,&c); ...
- 安装python问题
configure: error: in `/home/wangqianqian/Desktop/Python-3.6.7':configure: error: no acceptable C com ...
- Python爬虫 | re正则表达式解析html页面
正则表达式(Regular Expression)是一种文本模式,包括普通字符(例如,a 到 z 之间的字母)和特殊字符(称为"元字符"). 正则表达式通常被用来匹配.检索.替换和 ...
- zabbix server内存突然飙升
2019年10月16日22:20:58 十点二十突然内存占满,top查询一个httpd进程占了79%,查询httpd.error.log发现 [Wed Oct 16 10:24:57.578643 2 ...
- CSPS_109
T1 状压+位运算解决 T2 打完暴力后感到了迷茫.. 不过看这张表里1的数目占了一半之多,应该合法情况挺多的 拿出了从未用过的srand(time(0)); 结果撞上正解了(笑)(rp--) 现在$ ...
- Poj 2411 Mondriaan's Dream(状压DP)
Mondriaan's Dream Time Limit: 3000MS Memory Limit: 65536K Description Squares and rectangles fascina ...
- 笔记 - 数据结构 - 区间第k大
Codeforces Round #602 (Div. 2, based on Technocup 2020 Elimination Round 3) D2 - Optimal Subsequence ...