在NVIDIAGPU上支持VA-API硬件视频加速接口的方法与流程
未命名
10-08
阅读:160
评论:0

技术领域
1.本发明涉及硬件视频功能兼容技术领域,具体涉及在nvidia gpu上支持va-api硬件视频加速接口的方法。
背景技术:
2.硬件视频加速,是指使用gpu编解码视频,从而减轻cpu的负担,提升用户体验。为节省空间和带宽,视频在存储和传输之前,通常都会以特定格式进行压缩编码,反之在播放时,也需要进行逆向的解码。视频的编码和解码涉及大量的运算,若使用软件编解码,会耗费大量的cpu资源,进而可能会影响系统的正常运行。在现代计算机中,gpu通常内置了视频编解码模块,若使用gpu编解码,则可充分利用gpu资源,释放cpu算力,提高系统的资源利用率。
3.目前,在linux操作系统上,流行的、通用的硬件视频加速接口主要有va-api、vdpau等。va-api由intel公司提出,目前已成为linux下的主流方案;vdpau由nvidia公司提出,在nvidia公司推出新的专用接口nvdec/nvenc后,该项目的开发已接近停滞。
4.nvidia gpu作为当前市场上最流行的gpu,其在linux下的硬件视频加速接口主要是nvdec/nvenc接口。由于该接口是nvidia专用接口,有许多linux程序并不支持(如firefox等),也就无法借助nvidia gpu实现硬件视频加速功能。
5.中国发明专利“一种视频信息的处理方法、装置及存储介质”(专利号:cn109963191a)。该发明实施例公开了一种视频信息的处理方法、装置及存储介质,所述方法包括:获取视频流数据,确定采用第一接口规范封装的第一硬解码api;调用所述第一硬解码api获得采用第二接口规范封装的第二硬解码api,所述第二硬解码api包含于所述第一硬解码api对应的硬解码库,用于调用显卡驱动内的硬解码库对所述视频流数据进行解码。通过本发明实施例的方案,可以有效地降低终端设备的cpu占用率,提升终端设备的在线视频播放性能。但是,该发明也存在明显不足:该发明实现的“接口适配库”,是将vapau接口转换为va-api接口。考虑在linux操作系统搭配nvidia gpu的场景下,应用程序大多以支持va-api为主,而nvidia gpu提供的接口则以nvdec/nvenc为主,此时该发明将不再适用,无法为应用程序提供硬件视频加速功能。
6.中国发明专利“视频帧处理方法和装置”(专利号:cn114245138a)。该发明提供一种视频帧处理方法以及装置。在该方法中,获得该视频帧的转码数据。将该转码数据存储在该gpu中的指定地址空间。之后,建立指向该指定地址空间的指针与要在该gpu中创建的目标纹理的索引号之间的第一映射关系。然后,根据该第一映射关系将该指定地址空间中存储的转码数据创建成目标纹理。但是,该发明也存在明显不足:在该发明所述的方法中,其采用的是nvdec/nvenc接口,而在linux中va-api才是主流的硬件视频加速接口,大多数视频程序都支持va-api而非nvdec/nvenc,因而该发明的适用场景也受到极大限制。
7.目前,linux操作系统的硬件视频加速接口以va-api为主,而nvidia gpu专用驱动提供的硬件视频加速接口则以nvenc/nvdec为主。这意味着,linux上的许多视频相关的应
用程序(如firefox等),都无法借助nvidia gpu实现硬件视频加速。该问题的存在,导致了gpu的编解码能力无法得到利用,且会耗费大量的cpu资源,影响系统正常运行。
8.综上,亟需发明一种视频硬件加速装置,使得linux上基于va-api的视频程序可以通过nvdec/nvenc接口借助nvidia gpu实现硬件视频加速功能。
技术实现要素:
9.为解决已有技术存在的不足,本发明提供了在nvidia gpu上支持va-api硬件视频加速接口的方法,通过在va-api接口与nvdec/nvenc接口之间构建一个兼容层,用于解析va-api接口的请求,并基于所解析的请求调用nvdec/nvenc接口相关函数完成相关请求并返回给va-api接口;在视频解码中,通过如下步骤实现硬件视频加速:步骤s1:查询支持的视频编码规范:视频程序向兼容层查询支持的编码规范,兼容层解析该请求并查询相关特性;返回查询结果并原路传递给视频程序;步骤s2:创建编视频解码器,视频程序向兼容层发起创建视频编解码上下文请求,兼容层解析该请求并创建对应格式的解码器;步骤s3:解码视频帧,视频程序向兼容层发起解码视频帧请求,兼容层解析该请求并解码视频帧;步骤s4:读取已解码的帧数据并显示,兼容层将帧数据复制到va-api缓冲区中,视频程序将va-api缓冲区中的已解码帧数据显示至程序窗口。
10.其中,所述步骤s1中,视频程序通过调用va-api接口相关函数向兼容层查询支持的编码规范;所述步骤s2中,视频程序通过调用va-api接口相关函数向兼容层发起创建视频编解码上下文请求;所述步骤s3中,视频程序通过调用va-api接口相关函数向兼容层发起解码视频帧请求;所述步骤s4中,视频程序通过调用va-api接口相关函数将va-api缓冲区中的已解码帧数据显示至程序窗口。
11.其中,所述步骤s1中,兼容层通过调用nvdec/nvenc接口相关函数依次向nvidia video codec sdk及nvidia linux driver向nvidia gpu查询相关特性;所述步骤s2中,兼容层通过调用nvdec/nvenc接口相关函数创建对应格式的解码器;所述步骤s3中,兼容层通过调用nvdec/nvenc接口相关函数解码视频帧;所述步骤s4中,兼容层通过调用nvdec/nvenc接口相关函数将帧数据复制到va-api缓冲区中。
12.其中,还包括如下步骤:步骤s5:视频程序判断是否已解码完所有视频帧,若为否,则跳转到步骤s3继续进行解码,若为是,则进入下一步;步骤s6:视频程序调用va-api接口相关函数向兼容层发起销毁视频解码器请求,兼容层解析该请求并调用nvdec/nvenc接口相关函数销毁视频解码器。
13.本发明借助于硬件视频加速接口兼容层,面向视频程序提供va-api硬件视频加速接口,其接收并解析视频程序的视频请求,然后调用nvdec/nvenc接口借助nvidia gpu完成对应的视频编解码操作。实现了linux下硬件视频加速接口va-api到nvdec/nvenc的转换,使得基于va-api的视频程序可以调用nvdec/nvenc接口,借助nvidia专有驱动和gpu实现硬件视频加速功能,降低了视频程序对cpu资源的占用,提升了用户体验。
具体实施方式
14.为了对本发明的技术方案及有益效果有更进一步的了解,下面详细说明本发明的技术方案及其产生的有益效果。
15.本发明涉及到的术语解释如下:gpu:图形处理器,全称为graphics processing unit。又称显示核心、视觉处理器、显示芯片,是一种专门在个人电脑、工作站、游戏机和一些移动设备(如平板电脑、智能手机等)上做图像和图形相关运算工作的微处理器。
16.va-api:一种通用的硬件视频加速接口,全称为video acceleration api,由intel公司提出。
17.libva:一种硬件视频加速库,是va-api硬件视频加速接口的开源实现,由intel公司主导开发。
18.vadpu:一种通用的硬件视频加速接口,全称为video decode and presentation api for unix,由nvidia公司提出,目前其缺少维护、开发已几近停滞。
19.nvdec/nvenc:一种专用的硬件视频加速接口,由nvidia公司提出,是nvidia公司当前主推的接口规范。
20.nvidia video codec sdk:一种nvidia公司专用的视频编解码开发套件,对外提供了nvdec/nvenc接口。
21.nvidia linux driver:nvidia公司为linux操作系统提供的专用gpu驱动程序。
22.nv_encode_api_function_list:nvidia video codec sdk提供的一套编码接口函数表,由若干编码相关的接口函数组成。
23.本发明针对现有技术存在的难题,创建了一个新的“硬件视频加速接口兼容层”(以下简称兼容层),运行于nvdec/nvenc接口以及视频程序的va-api接口之间,实现了linux下va-api到nvdec/nvenc之间的接口转换,使得基于va-api的视频程序可以调用nvdec/nvenc接口,借助nvidia专有驱动和gpu实现硬件视频加速,降低了视频程序对cpu资源的占用,提升了用户体验。
24.以视频解码为例,本发明的具体实现步骤如下:1、查询支持的视频编码规范。视频程序调用va-api接口函数vaqueryconfigprofiles和vaqueryconfigentrypoints向兼容层查询支持的编码规范;兼容层收到查询请求后,解析请求并调用nvdec/nvenc接口函数cuvidgetdecodercaps向nvidia video codec sdk查询支持的编码规范;nvidia video codec sdk继续调用nvidia linux driver相关接口向nvidia gpu查询相关特性;gpu返回查询结果并原路传递给视频程序;视频程序根据返回结果判断系统是否支持对应格式,若支持则进入下一步,若不支持则退出。
25.2、创建编视频解码器。视频程序调用va-api接口函数vacreateconfig和vacreatecontext向兼容层发起创建视频编解码上下文请求;兼容层解析请求并调用nvdec/nvenc接口函数cuvidcreatedecoder创建对应格式的解码器。
26.3、解码视频帧。视频程序调用va-api接口函数vabeginpicture、varenderpicture和vaendpicture向兼容层发起解码视频帧的请求;兼容层解析请求并调用nvdec/nvenc接口函数cuviddecodepicture解码视频帧。
27.4、读取已解码的帧数据并显示。兼容层调用nvdec/nvenc接口函数cuvidmapvideoframe对存放已解码帧数据的缓冲区进行内存映射,然后将帧数据复制到对应的va-api缓冲区中,最后调用cuvidunmapvideoframe解除内存映射;视频程序调用va-api接口函数vaputsurface将va-api缓冲区中的已解码帧数据显示至程序窗口。
28.5、视频程序判断是否已解码完所有视频帧,若为否,则跳转到步骤3继续进行解码,若为是,则进入下一步。
29.6、销毁视频解码器。视频程序调用va-api接口函数vadestroycontext和vadestroyconfig向兼容层发起销毁视频解码器的请求;兼容层解析请求并调用nvdec/nvenc接口函数cuviddestroydecoder销毁视频解码器。
30.7、解码结束。
31.以视频编码为例,具体步骤如下:1、加载编码接口函数表。兼容层调用nvdec/nvenc接口函数nvencodeapigetmaxsupportedversion向nvidia video codec sdk查询编码接口的版本,并调用nvencodeapicreateinstance接口加载编码接口函数表nv_encode_api_function_list。
32.2、查询支持的编码规范。视频程序调用va-api接口函数vaqueryconfigprofiles和vaqueryconfigentrypoints向兼容层查询支持的编码规范;兼容层收到查询请求后,解析请求并调用nvdec/nvenc接口函数nv_encode_api_function_list::nvencgetencodecaps向nvidia video codec sdk查询支持的编码规范;nvidia video codec sdk继续调用nvidia linux driver相关接口向nvidia gpu查询相关特性;gpu返回查询结果并原路传递给视频程序;视频程序根据返回结果判断系统是否支持对应格式,若支持则进入下一步,若不支持则退出。
33.3、创建视频编码器。视频程序调用va-api接口函数vacreateconfig和vacreatecontext向兼容层发起创建视频编解码上下文请求;兼容层解析请求并调用nvdec/nvenc接口函数nv_encode_api_function_list::nvencopenencodesessionex创建对应格式的编码器,并调用nv_encode_api_function_list::nvencinitializeencoder初始化编码器。
34.4、编码视频帧。视频程序调用va-api接口函数vabeginpicture、varenderpicture和vaendpicture向兼容层发起编码视频帧的请求;兼容层解析请求并调用nvdec/nvenc接口函数nv_encode_api_function_list::nvencencodepicture编码视频帧;nvidia video codec sdk对视频帧进行编码,完成后将已编码的比特流数据存入指定的比特流缓冲区。
35.5、读取已编码的比特流数据。兼容层调用nvdec/nvenc接口函数nv_encode_api_function_list::nvenclockbitstream锁定比特流缓冲区,然后将已编码的比特流数据从比特流缓冲区复制到对应的va-api缓冲区中,最后调用nv_encode_api_function_list::
nvenclockbitstream解锁比特流缓冲区;视频程序调用va-api接口函数vamapbuffer映射va-api缓冲区,读取缓冲区中已编码的比特流数据,并根据用户需求将数据存储至存储器或进行网络传输,最后调用vaunmapbuffer解除缓冲区映射。
36.6、视频程序判断是否已编码完所有视频帧,若为否,则跳转到步骤4继续进行编码,若为是,则进入下一步。
37.7、销毁视频编码器。视频程序调用va-api接口函数vadestroycontext和vadestroyconfig向兼容层发起销毁视频编码器的请求;兼容层解析请求并调用nvdec/nvenc接口函数nv_encode_api_function_list::nvencdestroyencoder销毁视频编码器。
38.8、编码结束。
39.本发明借助于硬件视频加速接口兼容层,面向视频程序提供va-api硬件视频加速接口,其接收并解析视频程序的视频请求,然后调用nvdec/nvenc接口借助nvidia gpu完成对应的视频编解码操作。实现了linux下硬件视频加速接口va-api到nvdec/nvenc的转换,使得基于va-api的视频程序可以调用nvdec/nvenc接口,借助nvidia专有驱动和gpu实现硬件视频加速功能,降低了视频程序对cpu资源的占用,提升了用户体验。
40.本发明同时支持视频的解码和编码操作。且可同时支持多种编解码规范,包括且不限于h.264、h.265、mpeg-2、vc1、vp9等,具体的支持情况由nvidia gpu和nvidia video codec sdk决定。
41.虽然本发明已利用上述较佳实施例进行说明,然其并非用以限定本发明的保护范围,任何本领域技术人员在不脱离本发明的精神和范围之内,相对上述实施例进行各种变动与修改仍属本发明所保护的范围,因此本发明的保护范围以权利要求书所界定的为准。
技术特征:
1.在nvidia gpu上支持va-api硬件视频加速接口的方法,其特征在于:在va-api接口与nvdec/nvenc接口之间构建一个兼容层,用于解析va-api接口的请求,并基于所解析的请求调用nvdec/nvenc接口相关函数完成相关请求并返回给va-api接口;在视频解码中,通过如下步骤实现硬件视频加速:步骤s1:查询支持的视频编码规范:视频程序向兼容层查询支持的编码规范,兼容层解析该请求并查询相关特性;返回查询结果并原路传递给视频程序;步骤s2:创建编视频解码器,视频程序向兼容层发起创建视频编解码上下文请求,兼容层解析该请求并创建对应格式的解码器;步骤s3:解码视频帧,视频程序向兼容层发起解码视频帧请求,兼容层解析该请求并解码视频帧;步骤s4:读取已解码的帧数据并显示,兼容层将帧数据复制到va-api缓冲区中,视频程序将va-api缓冲区中的已解码帧数据显示至程序窗口。2.如权利要求1所述的在nvidia gpu上支持va-api硬件视频加速接口的方法,其特征在于:所述步骤s1中,视频程序通过调用va-api接口相关函数向兼容层查询支持的编码规范;所述步骤s2中,视频程序通过调用va-api接口相关函数向兼容层发起创建视频编解码上下文请求;所述步骤s3中,视频程序通过调用va-api接口相关函数向兼容层发起解码视频帧请求;所述步骤s4中,视频程序通过调用va-api接口相关函数将va-api缓冲区中的已解码帧数据显示至程序窗口。3.如权利要求1所述的在nvidia gpu上支持va-api硬件视频加速接口的方法,其特征在于:所述步骤s1中,兼容层通过调用nvdec/nvenc接口相关函数依次向nvidia video codec sdk及nvidia linux driver向nvidia gpu查询相关特性;所述步骤s2中,兼容层通过调用nvdec/nvenc接口相关函数创建对应格式的解码器;所述步骤s3中,兼容层通过调用nvdec/nvenc接口相关函数解码视频帧;所述步骤s4中,兼容层通过调用nvdec/nvenc接口相关函数将帧数据复制到va-api缓冲区中。4.如权利要求1所述的在nvidia gpu上支持va-api硬件视频加速接口的方法,其特征在于:还包括如下步骤:步骤s5:视频程序判断是否已解码完所有视频帧,若为否,则跳转到步骤s3继续进行解码,若为是,则进入下一步;步骤s6:视频程序调用va-api接口相关函数向兼容层发起销毁视频解码器请求,兼容层解析该请求并调用nvdec/nvenc接口相关函数销毁视频解码器。
技术总结
在NVIDIA GPU上支持VA-API硬件视频加速接口的方法,通过在VA-API接口与NVDEC/NVENC接口之间构建一个兼容层,用于解析VA-API接口的请求,并基于所解析的请求调用NVDEC/NVENC接口相关函数完成相关请求并返回给VA-API接口;在视频解码中,兼容层所能够解析的请求涉及如下步骤:查询支持的视频编码规范,创建编视频解码器,解码视频帧,读取已解码的帧数据并显示,销毁视频解码器。本发明借助于硬件视频加速接口兼容层,面向视频程序提供VA-API硬件视频加速接口,实现了Linux下硬件视频加速接口VA-API到NVDEC/NVENC的转换,借助NVIDIA专有驱动和GPU实现硬件视频加速功能,降低了视频程序对CPU资源的占用,提升了用户体验。提升了用户体验。
技术研发人员:江锋 张铎 李唯实 谢明
受保护的技术使用者:麒麟软件有限公司
技术研发日:2023.08.29
技术公布日:2023/10/5
版权声明
本文仅代表作者观点,不代表航家之家立场。
本文系作者授权航家号发表,未经原创作者书面授权,任何单位或个人不得引用、复制、转载、摘编、链接或以其他任何方式复制发表。任何单位或个人在获得书面授权使用航空之家内容时,须注明作者及来源 “航空之家”。如非法使用航空之家的部分或全部内容的,航空之家将依法追究其法律责任。(航空之家官方QQ:2926969996)
航空之家 https://www.aerohome.com.cn/
飞机超市 https://mall.aerohome.com.cn/
航空资讯 https://news.aerohome.com.cn/