一种软硬结合且高效传输的视频解码方法

文档序号:196252 发布日期:2021-11-02 浏览:29次 >En<

阅读说明:本技术 一种软硬结合且高效传输的视频解码方法 (Soft-hard combined and high-efficiency transmission video decoding method ) 是由 高娟 于 2021-06-23 设计创作,主要内容包括:本发明属于linux系统下视频解码技术,涉及一种在linux系统下使用软硬结合的高效传输的视频解码设计方法。其特点在于:首先,移植ffmpeg到海思平台,对ffmpeg进行源码修改使其适配海思芯片。其次,启动PCIE通道与主机进行数据传输交互;然后,启动ffmpeg的动态库对网络传输的数据进行动态过滤,去除错误帧,同时获取图像与参数信息结合的数据包;最后,将完整数据包再传送给海思芯片的硬解码模块,从而完成解码任务。本发明使用芯片的硬解码模块完成解码过程,有效减少解码时间,采用PCIE通道传输解码前后的图像,极大地减少了数据传输时延。(The invention belongs to a video decoding technology under a linux system, and relates to a video decoding design method for efficient transmission under the linux system by using soft and hard combination. It is characterized in that: first, ffmpeg is transplanted to the Haisi platform, and source code modification is performed on ffmpeg to make it fit to the Haisi chip. Secondly, starting a PCIE channel to perform data transmission interaction with the host; then, starting a dynamic library of the ffmpeg to dynamically filter the data transmitted by the network, removing error frames, and acquiring a data packet combining the image and the parameter information; and finally, transmitting the complete data packet to a hard decoding module of the Haisi chip so as to complete a decoding task. The invention uses the hard decoding module of the chip to complete the decoding process, effectively reduces the decoding time, and adopts the PCIE channel to transmit the images before and after decoding, thereby greatly reducing the data transmission time delay.)

一种软硬结合且高效传输的视频解码方法

技术领域

本发明属于linux系统下视频解码技术,特别是一种软硬结合且高效传输的视频解码方法。

背景技术

Hi3559AV100是专业的8K Ultra HD Mobile Camera SOC,它提供了8K30/4K120广播级图像质量的数字视频录制,支持多路Sensor输入,支持H.265编码输出或影视级的RAW数据输出,并集成高性能ISP处理,同时采用先进低功耗工艺和低功耗架构设计,为用户提供了卓越的图像处理能力。

Hi3559AV100支持业界领先的多路4K Sensor输入,多路ISP图像处理,支持HDR10高动态范围技术标准,并支持多路全景硬件拼接。在支持8K30/4K120视频录制下,Hi3559AV100提供硬化的6-Dof数字防抖,减少了对机械云台的依赖。

PCI-Express(peripheral component interconnect express)是一种高速串行计算机扩展总线标准,它原来的名称为"3GIO",是由英特尔在2001年提出的,旨在替代旧的PCI,PCI-X和AGP总线标准。PCIe属于高速串行点对点双通道高带宽传输,所连接的设备分配独享通道带宽,不共享总线带宽,主要支持主动电源管理,错误报告,端对端的可靠性传输,热插拔以及服务质量(QOS)等功能。PCIe交由PCI-SIG(PCI特殊兴趣组织)认证发布后才改名为"PCI-Express",简称"PCI-e"。它的主要优势就是数据传输速率高,而且还有相当大的发展潜力。

但是Hi3559AV100属于硬解码范畴,在协议帧不完全符合解码协议,或者错误帧比较多的情况下,解码效率比较低下或者不能解码。另外,硬解码模块无法返回带有参数帧的解码图像帧。同时,在图像数据比较大的情况下,网络传输时延比较大,无法满足性能需求。

发明内容

本发明解决的技术问题是:克服现有技术的不足,提供了一种软硬结合且高效传输的视频解码方法,使用芯片的硬解码模块完成解码过程,有效减少解码时间,采用PCIE通道传输解码前后的图像,极大地减少了数据传输时延。

本发明的技术解决方案是:

第一方面,一种软硬结合且高效传输的视频解码方法,包括如下步骤:

1)配置ffmpeg的编译属性和参数,将ffmpeg动态库移植到海思平台;

2)配置PCIE设备;

将海思平台的PCIE配置成从设备,主机的PCIE设备配置成主设备;同时,制定主设备和从设备的传输规则;

3)创建PCIE读数据线程,启动PCIE读任务获取主机传输的原始图像数据;

4)创建ffmpeg获取数据包线程,使用ffmpeg动态库获取压缩图像的完整数据包

5)使用海思平台的硬解码模块对压缩图像的数据包进行解码,获得解码后的图像数据;

6)使用PCIE通道回传解码后的图像数据给主机。

可选地,步骤2)所述主设备和从设备传输规则如下:

主设备上电后写入握手的规定内容,从设备在上电后检测到相应内容并握手成功;

主设备和从设备为每个通道分配读写的PCIE地址,不同的读写地址互不冲突;

主设备握手成功后在规定的PCIE地址段写入每个通道接收数据的地址内容;

主设备通过查询固定地址段的内容长度是否大于0作为判断是否有数据的标准,并在完成数据读取后将内容长度清零;

从设备在传输数据之前先通过固定地址段长度,判断主设备是否已读走上次数据,如果是则写入解码后的图像数据并将长度写入,如果不是则放弃本次写数据任务,等待接收到下一次解码后的图像数据再传输。

可选地,步骤3)所述创建PCIE读数据线程,具体如下:

31)申请PCIE通道的读写互斥锁,对每个PCIE通道的读写操作进行保护,不允许同时有多个PCIE通道进行读写操作;

32)查看主设备是否有新的图像数据可供读取,即在固定地址内的读数据长度是否不为零,同时主机的读地址也不为零;

33)根据协议规则在指定的读地址段读取数据,具体操作:设置PCIE读任务的目的地址为从设备的PCIE读地址;设置源地址为主设备的PCIE写地址;

34)通过ioctl函数对从设备发送读数据任务命令;判断读数据任务的返回值是否成功,如读数据任务成功则读长度清零,以供主设备进行下次传输数据;

35)解锁PCIE通道的读写互斥锁,释放资源。

可选地,步骤6)所述使用PCIE通道回传解码后的图像数据给主机的方法,具体为:

61)获取PCIE通道的读写互斥锁;

62)拷贝解码后的图像参数数据到DMA虚拟地址空间;

63)判断海思平台芯片内的写长度是否被主机清零,如果不为0则报错退出,终止图像发送任务,待接收到新的解码后的图像参数数据后返回步骤61);反之则进入步骤64);

64)获取给主设备发送数据的目的物理地址,如果目的物理地址为零则报错退出,终止图像发送任务,待接收到新的解码后的图像参数数据后返回步骤61);反之则进入步骤65);将海思的PCIE配置成从设备,主机的PCIE设备为主设备;

65)获取DMA传输的物理首地址和协议规定的偏移地址,将两者的和值作为DMA传输任务的源地址,将主机PCIE的物理地址vxworks_phy_addr作为任务的目的地址;

66)设置本次任务的传输长度为参数帧数据的长度sei_len;

67)判断当前PCIE的操作句柄是否大于零,如果是则使用系统函数ioctl下达PCIE写任务并进入下一步,如果不是则报错退出本次过程,终止图像发送任务,待接收到新的解码后的图像参数数据后返回步骤61);

68)判断当前PCIE写任务的任务状态是否为完成,如果是则进入下一步,如果不是则报错退出本过程;待接收到新的解码后的图像参数数据后返回步骤61);

69)设置第二次DMA传输任务的源地址为图像帧数组数据,将主机物理地址vxworks_phy_addr偏移参数帧字节个数sei_len的地址作为任务的目的地址,设置图像帧长度frame_len为第二次任务的传输长度;

610)重复第67)和68),进入下一步;

611)将发送的图像帧长度frame_len写入到协议规定的内存地址,提示主机可以读取数据;

612)使用主机读取图像帧数据和参数帧数据,完成回传工作;

613)解锁PCIE通道的互斥锁,释放PCIE通道资源,待接收到新的解码后的图像参数数据后返回步骤步骤61)。

可选地,步骤1)所述将ffmpeg动态库移植到海思平台,具体为:

11)首先,配置ffmpeg编译属性,根据平台类型、cpu类型、编码解码器属性、格式转换属性、交叉编译属性配置参数;

12)修改acodec.h文件,增加参数帧长度sei_len和数组sei_buf,根据应用层需求确定其参数帧大小SEI_BUF_SIZE;

13)在hevc_sei.c文件中的decode_nal_sei_prefix函数中添加获取参数帧功能;

14)执行configure命令,在配置文件夹的子文件夹lib下将生成的解码库libavcodec、libavformat、libavutil、libswscale;

15)最后,将动态库拷贝到解码板卡的/usr/lib路径下。

可选地,步骤4)创建ffmpeg获取数据包线程,具体为:

421)获取从PCIE通道读取的图像数据数组首地址指针bufPtr和长度bufLen;

422)判断当前的数据长度bufLen是否大于0,如果是则继续下一步,如果不是,则退出本次数据的解码过程,等待下次PCIE通道传送的图像数据数据;

423)传送数据数组首地址指针bufPtr和长度bufLen给软解码模块,使用库函数av_parser_parse2对图像数据按帧进行分割,如果从数组能成功获得一个完整的图像帧数据包则记录继续下一步,如果不是则退出本次解码过程;等待PCIE通道传送的图像数据数组;

424)保存本次数据数组中图像帧分割的数据包长度ret,从数据数组总长度bufLen剔除本次分割的图像帧数据包长度ret,并向前移动首地址指针bufPtr,移动次数为ret;

425)将本次分割的图像完整数据包放到待解码队列中。

可选地,步骤5)所述压缩图像的数据包进行解码的方法,具体为:

51)根据图像参数和解码类型初始化硬解码模块,配置硬解码模块中视频数据缓冲区大小,启动解码模块;

52)动态申请视频图像帧数据包的缓冲区大小buf;

53)循环判断是否为解码结束,如果是则退出处理流程进行步骤57),否则进行下一步;

54)设置当前待解码帧的参数:流结束标志符、帧头标志,帧尾标志;

55)将图像帧数据放入buf;

56)调用动态库函数发送buf数据到硬解码模块;

57)实时监控硬解码模块的解码状态,如果解码错误则软重启硬解码模块并重置参数,如果解码正常则调用库函数获取解码后的图像;

58)调用库函数停止发送视频流给硬解码模块,关闭解码通道,解绑模块间的绑定关系,清除资源。

第二方面,一种处理装置,包括:

存储器,用于存储计算机程序;

处理器,用于从所述存储器调用并运行所述计算机程序,以执行第一方面所述方法。

一种计算机可读存储介质,所述计算机可读存储介质中存储有计算机程序或指令,当所述计算机程序或指令被执行时,实现第一方面所述的方法。

一种计算机程序产品,所述计算机程序产品包括指令,当所述计算机程序产品在计算机上运行时,使得计算机执行第一方面所述的方法。

本发明与现有技术相比的优点在于:

本发明采用ffmpeg解码库获取原始帧中参数帧信息和数据帧信息,组合一个完整数据包给硬解码模块,减少解码时延,完成解码功能。同时,采用PCIE通道传输图像大数据,极大地减少了传输时延。

本发明为系统为linux下,以海思Hi3559AV100芯片作为硬解码模块,使用FFMPEG解码库获取完整数据包,有效获取压缩帧参数信息和图像帧信息,减少解码时间,同时启动PCIE通道对图像数据进行高效传输,极大地减少数据传输时延。

附图说明

图1为本发明一种软硬结合的高效传输的视频解码方案流程图。

具体实施方式

下面结合附图和具体实施方式对本发明做进一步详细的描述。

结合图1,为了解决linux系统下视频解码问题,我们采用基于ffmpeg软解码和海思芯片模块硬解码结合,同时利用PCIE通道对图像数据进行传输。下面我们对本发明的内容作进一步描述。

PCIE(Peripheral Components Interconnect Express)是一种高速串行计算机拓展总线标准。PCIE属于高速串行点对点双通道高带宽传输,所连接的设备分配独享通道带宽,不共享总线带宽。PCIE设备通过称为互联或链路的逻辑连接进行通信。链路是两个PCI Express端口之间的点对点通信通道,允许它们发送和接收普通PCI请求和中断。PCIE使用共享并行总线架构,其中PCI主机和所有设备共享一组通用的地址,数据和控制线。

1、移植ffmpeg到海思平台

11)首先,配置ffmpeg编译属性,根据平台类型、cpu类型、编码解码器属性、格式转换属性、交叉编译属性配置参数。

12)修改acodec.h文件,增加参数帧长度sei_len和数组sei_buf,根据应用层需求确定其参数帧大小SEI_BUF_SIZE;

13)在hevc_sei.c文件中的decode_nal_sei_prefix函数中添加获取参数帧功能:获取函数中的参数size,将size赋值给sei_len,判断size是否小于等于SEI_BUF_SIZE,如果满足条件则拷贝上下文参数数组gb内数据到sei_buf,拷贝的长度为size,拷贝的sei_buf的数组下标i为gb数组的索引index除以8,即sei_buf[i]=gb_buf[index/8];

14)然后,执行configure命令,在配置文件夹的子文件夹lib下将生成的解码库libavcodec、libavformat、libavutil、libswscale。

15)最后,将动态库拷贝到解码板卡的/usr/lib路径下;

2、配置PCIE设备

首先,根据传输需求,将海思的PCIE配置成从设备,主机的PCIE设备为主设备。

然后,配置PCIE的驱动文件。在海思板卡的系统路径/etc/profile里面自动加载3559驱动文件:hi35xx_dev_slv.ko、irq_map_slv.ko、mcc_drv_slv.ko、mcc_usrdev_slv.ko、pcit_dma_slv.ko。

最后,制定主设备和从设备传输规则,规则如下:

主设备上电后写入握手的规定内容,从设备在上电后检测到相应内容并握手成功;

主设备和从设备为每个通道分配读写的PCIE地址,不同的读写地址互不冲突;

主设备握手成功后在规定的PCIE地址段写入每个通道接收数据的地址内容;

主设备通过查询固定地址段的内容长度是否大于0作为判断是否有数据的标准,并在完成数据读取后将内容长度清零;

从设备在传输数据之前先通过固定地址段长度,判断主设备是否已读走上次数据(即固定地址段长度为0),如果是则写入解码后的图像数据并将长度写入,如果不是则放弃本次写数据任务,等待接收到下一次解码后的图像数据再传输;

3、获取主机通过PCIE传输的数据

创建PCIE读数据线程,线程具体操作为:

31)申请PCIE通道的读写互斥锁,对每个PCIE通道的读写操作进行保护,不允许同时有多个PCIE通道进行读写操作;

32)查看主设备是否有新的图像数据可供读取,即在固定地址内的读数据长度是否不为零,同时主机的读地址也不为零;

33)根据协议规则在指定的读地址段读取数据,具体操作:设置PCIE读任务的目的地址为从设备的PCIE读地址;设置源地址为主设备的PCIE写地址;

34)通过ioctl函数对从设备发送读数据任务命令;判断读数据任务的返回值是否成功,如读数据任务成功则读长度清零,以供主设备进行下次传输数据。

35)解锁PCIE通道的读写互斥锁,释放资源。

4、使用ffmpeg动态库获取压缩图像完整数据包

为ffmpeg创建使用环境,并指定启动要求的软解码器,可针对原始数据进行协议分析。同时,从网络接收的数据区循环获取原始数据,调用库函数获取可组合成完整图像帧的数据包的长度,从网络接收数据区剔除该长度并循环反复进行直到数据区没有任何数据。具体如下:

41)初始化解码库使用环境

首先,设置解码器类型,采用HEVC(h265)类型的解码器。然后,初始化解码器上下文环境,根据每帧图像数据的大小,动态申请图像帧存储空间。最后,根据参数打开解码器。

42)创建ffmpeg获取数据包线程,线程具体流程如下:

421)获取从PCIE通道读取的图像数据数组首地址指针bufPtr和长度bufLen;

422)判断当前的数据长度bufLen是否大于0,如果是则继续下一步,如果不是,则退出本次数据的解码过程,等待下次PCIE通道传送的图像数据数据。

423)传送数据数组首地址指针bufPtr和长度bufLen给软解码模块,使用库函数av_parser_parse2对图像数据按帧进行分割,如果从数组能成功获得一个完整的图像帧数据包则记录继续下一步,如果不是则退出本次解码过程;等待PCIE通道传送的图像数据数组。

424)保存本次数据数组中图像帧分割的数据包长度ret,从数据数组总长度bufLen剔除本次分割的图像帧数据包长度ret,并向前移动首地址指针bufPtr,移动次数为ret。

425)将本次分割的图像完整数据包放到待解码队列中。

5、将待解码的完整数据包发送给硬解码模块。

启动芯片的硬解码模块,根据需解码图像大小动态申请图像缓冲区的大小,将图像原始数据拷入缓存,并针对其配置信息进行硬解码。同时,针对错误帧导致解码模块无法工作的情况启动实时监控线程,分析其解码状态并实施软复位措施使得解码模块能持续进行解码工作。

51)根据图像参数和解码类型初始化硬解码模块,配置其视频数据缓冲区大小,启动解码模块;

52)动态申请视频图像帧数据包的缓冲区大小buf;

53)循环判断是否为解码结束,如果是则退出处理流程进行步骤57),否则进行下一步;

54)设置当前待解码帧的参数:流结束标志符、帧头标志,帧尾标志;

55)将图像帧数据放入buf;

56)调用动态库函数发送buf数据到硬解码模块;

57)实时监控硬解码模块解码状态,如果解码错误则软重启硬解码模块并重置参数,如果解码正常则调用库函数获取解码后的图像;

58)调用库函数停止发送视频流给硬解码模块,关闭解码通道,解绑各模块绑定关系,清除资源。

6、将解码后的图像通过PCIE发送给主机

获取硬解码后的目标图像后,将图像数据拷贝到DMA传输的内存空间,并启动DMA传输任务将图像数据发送到主机端的PCIE通道,并将发送长度写入协议规定的地址段通知主机读取数据。具体步骤如下:

61)获取PCIE通道的读写互斥锁;

62)拷贝解码后的图像参数数据到DMA虚拟地址空间;

63)判断海思平台芯片内的写长度是否被主机清零(即上一帧图像数据已被主设备取走),如果不为0则报错退出,终止图像发送任务,待接收到新的解码后的图像参数数据后返回步骤61);反之则进入步骤64);

64)获取给主设备发送数据的目的物理地址,如果目的物理地址为零则报错退出,终止图像发送任务,待接收到新的解码后的图像参数数据后返回步骤61);反之则进入步骤65);将海思平台的PCIE配置成从设备,主机的PCIE设备为主设备;

65)获取DMA传输的物理首地址和协议规定的偏移地址,将两者的和值作为DMA传输任务的源地址,将主机PCIE的物理地址vxworks_phy_addr作为任务的目的地址;

66)设置本次任务的传输长度为参数帧数据的长度sei_len;

67)判断当前PCIE的操作句柄是否大于零,如果是则使用系统函数ioctl下达PCIE写任务并进入下一步,如果不是则报错退出本次过程,终止图像发送任务,待接收到新的解码后的图像参数数据后返回步骤61);

68)判断当前PCIE写任务的任务状态是否为完成,如果是则进入下一步,如果不是则报错退出本过程;待接收到新的解码后的图像参数数据后返回步骤61);

69)设置第二次DMA传输任务的源地址为图像帧数组数据,将主机物理地址vxworks_phy_addr偏移参数帧字节个数sei_len的地址作为任务的目的地址,设置图像帧长度frame_len为第二次任务的传输长度;

610)重复第67)和68),进入下一步;

611)将发送的图像帧长度frame_len写入到协议规定的内存地址,提示主机可以读取数据;

612)使用主机读取图像帧数据和参数帧数据,完成回传工作;

613)解锁PCIE通道的互斥锁,释放PCIE通道资源,待接收到新的解码后的图像参数数据后返回步骤步骤61)。

本发明步骤2)、3)和6)启动了PCIE通道对数据进行传输,有效的减少了传输时延。

本发明属于linux系统下视频解码技术,在系统为linux的应用场景下,针对海思Hi3559AV100芯片特点,并结合PCIE设备属性,设计实现了一种linux系统下基于软解码和硬解码结合的视频解码方案设计方法。

利用上述技术方案,采用上述操作步骤,本发明可以实现linux系统下视频解码和传输问题,该方法已经经过了算法验证,并进行了实验检验。结果标明,该方案可以为解决图像解码问题,采用软解码方法,动态过滤错帧,并获取完整数据包,使用芯片的硬解码模块完成解码过程,有效减少解码时间,采用PCIE通道传输解码前后的图像,极大地减少了数据传输时延。

本发明说明书中未作详细描述的内容属本领域技术人员的公知技术。

12页详细技术资料下载
上一篇:一种医用注射器针头装配设备
下一篇:应用中压缩算法的超高清视频无线发送、接收方法及设备

网友询问留言

已有0条留言

还没有人留言评论。精彩留言会获得点赞!

精彩留言,会给你点赞!

技术分类