CN113709495B - 一种基于pcie缓冲机制的同步解码方法 - Google Patents

一种基于pcie缓冲机制的同步解码方法 Download PDF

Info

Publication number
CN113709495B
CN113709495B CN202110973394.9A CN202110973394A CN113709495B CN 113709495 B CN113709495 B CN 113709495B CN 202110973394 A CN202110973394 A CN 202110973394A CN 113709495 B CN113709495 B CN 113709495B
Authority
CN
China
Prior art keywords
data
address
pcie
length
read
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Active
Application number
CN202110973394.9A
Other languages
English (en)
Other versions
CN113709495A (zh
Inventor
高娟
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Tianjin Jinhang Computing Technology Research Institute
Original Assignee
Tianjin Jinhang Computing Technology Research Institute
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Tianjin Jinhang Computing Technology Research Institute filed Critical Tianjin Jinhang Computing Technology Research Institute
Priority to CN202110973394.9A priority Critical patent/CN113709495B/zh
Publication of CN113709495A publication Critical patent/CN113709495A/zh
Application granted granted Critical
Publication of CN113709495B publication Critical patent/CN113709495B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/44Decoders specially adapted therefor, e.g. video decoders which are asymmetric with respect to the encoder
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F13/00Interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
    • G06F13/14Handling requests for interconnection or transfer
    • G06F13/20Handling requests for interconnection or transfer for access to input/output bus
    • G06F13/28Handling requests for interconnection or transfer for access to input/output bus using burst mode transfer, e.g. direct memory access DMA, cycle steal
    • HELECTRICITY
    • H04ELECTRIC COMMUNICATION TECHNIQUE
    • H04NPICTORIAL COMMUNICATION, e.g. TELEVISION
    • H04N19/00Methods or arrangements for coding, decoding, compressing or decompressing digital video signals
    • H04N19/42Methods or arrangements for coding, decoding, compressing or decompressing digital video signals characterised by implementation details or hardware specially adapted for video compression or decompression, e.g. dedicated software implementation
    • H04N19/423Methods or arrangements for coding, decoding, compressing or decompressing digital video signals characterised by implementation details or hardware specially adapted for video compression or decompression, e.g. dedicated software implementation characterised by memory arrangements
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F2213/00Indexing scheme relating to interconnection of, or transfer of information or other signals between, memories, input/output devices or central processing units
    • G06F2213/0026PCI express
    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Abstract

本发明涉及一种基于PCIE缓冲机制的同步解码方法,属于视频编解码领域。本发明首先移植ffmpeg到海思平台,对ffmpeg进行源码修改使其适配海思芯片。其次,将海思芯片配置为PCIE从设备,设置主机端为PCIE主设备,并为板卡配置PCIE驱动,约定主机端和板卡之间的传输规则;最后,启动PCIE的DMA任务读取主机端发送的图像原始数据,对PCIE通道读取的数据进行缓冲,每次读取固定协议帧长度数据传输给解码器。启动ffmpeg的动态库对缓冲区内的数据进行软解码,并进行目标格式转换,将解码后的图像再次通过PCIE的DMA传输任务发送给主机,从而完成解码任务。

Description

一种基于PCIE缓冲机制的同步解码方法
技术领域
本发明属于视频编解码领域,具体涉及一种基于PCIE缓冲机制的同步解码方法。
背景技术
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属于硬解码范畴,在协议帧不完全符合解码协议,或者错误帧比较多的情况下,解码效率比较低下或者不能解码。本发明采用ffmpeg解码库进行软解码,可实时调整解码序列,使用Hi3559AV100的pcie模块进行视频数据的dma传输,有效减少传输时延。多路通道的数据接收不同步导致多路解码时间不一致,建立缓冲机制可以保证多路解码同步。
发明内容
(一)要解决的技术问题
本发明要解决的技术问题是如何提供一种基于PCIE缓冲机制的同步解码方法,以解决多路解码同步问题。
(二)技术方案
为了解决上述技术问题,本发明提出一种基于PCIE缓冲机制的同步解码方法,该方法包括如下步骤:
S1、移植ffmpeg到海思平台
首先,配置ffmpeg编译属性;然后,交叉编译ffmpeg源码;最后,获取ffmpeg解码动态库拷贝到海思开发板;
S2、配置PCIE设备
首先,根据传输需求,将海思pcie配置成从设备,主机pcie设备为主设备;其次,配置pcie驱动;然后,制定主设备和从设备传输规则;最后,初始化海思PCIE设备;
S3、获取主机通过PCIE传输的数据,并存入缓冲区
首先,创建pcie读数据线程实时查看主机是否有新的图像数据可供读取;然后根据协议规则再在指定的地址段读取数据;建立环形缓冲区,保存从PCIE读取的数据;最后将读完标志清零,以供主机进行下次传输数据;
S4、使用ffmpeg动态库解码缓冲区内的压缩图像数据
首先,初始化ffmpeg使用环境;其次,创建解码线程;然后,从缓冲区读取协议帧固定长度数据,使用ffmpeg动态库解码并进行目标格式转换;
S5、将解码后的图像通过PCIE发送给主机
获取ffmpeg解码后的目标图像后,将图像数据拷贝到DMA传输的内存空间,并启动DMA传输任务将图像数据发送到主机端的PCIE,并将发送长度写入协议规定的地址段通知主机读取数据。
进一步地,所述步骤S1具体包括如下步骤:
S11、配置ffmpeg编译属性,根据平台类型、cpu类型、编码解码器属性、格式转换属性、交叉编译属性配置参数;
S12、执行configure命令,在配置文件夹的子文件夹lib下将生成的解码库libavcodec、libavformat、libavutil、libswscale。
S13、将动态库拷贝到解码板卡的/usr/lib路径下。
进一步地,所述步骤S2具体包括如下步骤:
S21、根据传输需求,将海思的pcie配置成从设备,主机的pcie设备为主设备;
S22、配置pcie驱动。在海思板卡的系统路径/etc/profile里面自动加载3559驱动文件:hi35xx_dev_slv.ko、irq_map_slv.ko、mcc_drv_slv.ko、mcc_usrdev_slv.ko、pcit_dma_slv.ko;
S23、制定主设备和从设备传输规则;
S24、初始化海思板卡PCIE设备。
进一步地,所述步骤S23具体包括:
划分多通道的PCIE地址读写空间,确定每个通道PCIE的读写首地址和读写空间长度;
在每个通道的PCIE地址空间再次划分协议交互的地址和数据传输的地址;
主设备上电后在协议交互地址段写入握手的规定内容,从设备在上电后以查询方式读取主机写入的握手内容并以清零数据的方式表示握手成功;
主设备握手成功后在规定的每个通道的pcie地址段写入从设备读数据的首地址内容和长度;
从设备查询到读数据长度不为零,则从通道的读数据地址空间读数据并清零长度表示读操作完成;
主设备通过查询固定地址段的内容长度是否大于0作为判断是否有数据的标准,并在读走数据后将长度清零;
从设备在传输数据之前先判断主设备是否已读走上次数据,如果是则写入解码后的图像数据并将长度写入,如果不是则放弃本次写数据任务,等待下一次解码后的数据再传输。
进一步地,所述步骤S24具体包括如下步骤:
S2401、使用系统open函数打开设备名为“/dev/mem”的内存空间;
S2402、判断上一个步骤获取的操作句柄是否为大于零,如果是则操作成功,进入下一步;如果不是则报错退出初始化流程;
S2403、使用系统mmap函数对内存物理地址进行映射,并获取映射后的内存虚拟地址BarVir;
S2404、判断虚拟地址是否为空,如果为空则报错退出初始化流程,否则则进入下一步;
S2405、在虚拟地址BarVir且偏移协议规定长度的握手地址段循环查询内存第一个地址空间物理首地址share_phy_addr,如果该地址段内容不为零,则退出循环查询过程,并进入下一步,否则延迟1ms后重复该过程;
S2406、使用close函数关闭步骤1获取的操作句柄;
S2407、使用open函数打开设备名“/dev/bnc_dma_pcie”,打开成功则获取了操作句柄hi3559a_pcie_slv_fd进行下一步,打开失败则报错退出该流程;
S2408、使用mmap函数对内存第一个地址空间物理首地址share_phy_addr进行映射,获取该空间的虚拟地址pDataVirtBARAddr;
S2409、使用海思驱动函数COMMON_GetPicBufferSize申请两个视频缓冲池,并进行参数配置且保存在stVbConf数据结构中,使用库函数SAMPLE_COMM_SYS_Init并对其视频缓冲池进行初始化;
S2410、创建视频缓冲池且获取缓冲池中的缓冲块的物理地址,该地址作为海思DMA传输的物理地址dma_phy_addr;
S2411、使用库函数获取物理地址dma_phy_addr对于的虚拟地址pDataVirtDMAAddr作为写数据操作地址;
S2412、释放申请的视频缓存池和缓存块。
进一步地,所述步骤S3具体包括如下步骤:
S31、申请读写互斥锁,对每个通道的读写操作进行保护,不允许同时有多个通道进行读写操作;
S32、查看主设备是否有新的图像数据可供读取,即在内存虚拟地址pDataVirtBARAddr且偏移协议规定长度的地址内的读数据长度是否不为零,同时主机的读地址也不为零;
S33、根据协议规则再在指定的读地址段读取数据,具体操作:设置pcie读任务的目的地址和源地址;
S34、通过ioctl函数对从设备发送读数据任务命令;判断返回值是否成功,如成功则在地址pDataVirtBARAddr偏移协议规定长度的地址段将读长度清零,以供主设备进行下次传输数据;
S35、建立环形缓冲区,保存从PCIE通道读取的图像数据;
S36、将读完标志清零,以供主机进行下次传输数据,释放互斥锁。
进一步地,所述步骤S35具体包括如下步骤:
S3501、判断pcie通道读取的数据长度len是否为大于0,如果是则进行下一步,如果不是则退出;
S3502、判断缓冲区已有数据长度cirLen与len的和是否小于缓冲区最大长度MAX_LEN,如果是则进行下一步,如果不是则进行第S3505步;
S3503、将pcie通道的虚拟地址内存空间的数据拷贝到环形缓冲区,拷贝长度为len;
S3504、将缓冲区的数据总长度增加len个数,同时存数据的首地址ptr也移动len个位置;
S3505、将pcie通道内存区的数据拷贝到缓冲区,拷贝长度为(MAX_Len-cirLen);
S3506、重置写指针putPtr,移动到缓冲区首地址;
S3507、计算缓冲区总数据长度cirLen为len-(MAX_LEN-cirLen);
S3508、再次从pcie通道的内存空间拷贝到缓冲区,拷贝长度为cirlen;
S3509、向前移动写指针putPtr,移动cirLen个位置。
进一步地,所述步骤S4具体包括如下步骤:
S41、初始化解码库使用环境
首先,设置解码器类型,采用HEVC类型的解码器;然后,初始化解码器上下文环境,动态申请图像帧存储空间;
S42、根据通道数创建ffmpeg解码线程;
S421、获取从环形缓冲区读取的图像数据缓冲区首地址bufPtr和长度bufLen;
S422、判断当前的数据长度bufLen是否大于0,如果是则继续下一步,如果不是,则退出本次数据的解码过程,等待下次PCIE传送的数据;
S423、传送数据缓冲区首地址指针bufPtr和长度bufLen给解码器,使用库函数对缓冲区的数据按帧进行分割,如果从缓冲区能成功获得一个完整的图像帧数据则记录继续下一步,如果不是则退出本次解码过程;
S424、保存本次缓冲区中图像帧分割的长度ret,从数据缓冲区总长度bufLen剔除本次分割的图像帧数据长度ret,并向前移动首地址指针bufPtr,移动次数为ret;
S425、将本次分割的图像帧数据通过库函数发送到解码器,放到解码队列中,如果发送失败则退出本次解码过程;如果成功则继续进行下一步;
S426、等待解码器返回解码后的图像帧,调用动态库函数将图像数据进行目标格式转换;如解码器不再返回图像帧,则继续进行S422。
进一步地,所述步骤S421具体包括如下步骤:
S4211、获取目前缓冲区的写指针位置putPtr和缓冲区数据总长度cirLen;
S4212、判断读指针readPtr与putPtr是否一致,如果一致则退出,否则进行下一步;
S4213、判断已读数据readLen是否小于cirLen,如果是则继续下一步,否则进行第S4217步;
S4214、判断cirLen与readLen差值是否大于等于协议帧固定长度frame_len,如果是继续下一步,如果不是则进行第S4216步;
S4215、将当前readPtr作为解码图像数据首地址bufPtr,长度bufLen为frame_len,同时移动readPtr,移动个数为frame_len,增加读取长度readLen,增加个数为frame_len;
S4216、将当前readPtr作为解码图像数据首地址bufPtr,长度bufLen为cirLen减去readLen,同时移动readPtr,移动个数为(cirLen-readLen),增加读取长度readLen,增加个数为(cirLen-readLen);
S4217、判断readLen与frame_len的和是否小于MAX_LEN,如果是则进行下一步,如果不是则进行第S4219步;
S4218、将当前readPtr作为解码图像数据首地址bufPtr,数据长度bufLen为frame_len,移动读指针,移动个数为frame_len,增加读数据长度readLen,增加个数为frame_len;
S4219、将当前readPtr作为解码图像数据首地址bufPtr,数据长度bufLen为MAX_LEN-readLen,移动读指针到缓冲区首地址,置读长度readLen为0。
进一步地,所述步骤S5具体包括如下步骤:
S501、获取互斥锁,拷贝解码后的图像数据到该通道的DMA虚拟地址空间pDataVirtDMAAddr;
S502、然后判断内存虚拟地址pDataVirtBARAddr偏移地址内的写长度是否被主机清零,如果为0则报错退出;
S503、在内存虚拟地址pDataVirtBARAddr的偏移地址处获取给主设备发送数据的目的物理地址vxworks_phy_addr,如果为零则报错退出,否则进行下一步;
S504、设置本次传输任务的源地址,即DMA传输数据写地址dma_phy_addr偏移该通道对应的长度的地址;
S505、设置本次传输任务的目的地址,即主机接收数据的目的物理地址Vxworks_phy_addr;
S506、设置发送数据的长度;
S507、使用系统ioctl函数以hi3559a_pcie_slv_fd操作句柄为参数执行写数据任务;
S508、执行失败则报错退出,执行成功则进行下一步;
S509、在地址pDataVirtBARAddr偏移协议规定长度的地址段写入本次传输的数据长度,以供主机查询;
S510、解锁互斥锁,释放pcie通道资源。
(三)有益效果
本发明提出一种基于PCIE缓冲机制的同步解码方法,本发明可以实现linux系统下视频解码和传输问题,该方法已经经过了算法验证,并进行了实验检验。结果标明,该方案可以为解决图像解码问题,采用软解码方法,动态过滤错帧,并结合PCIE的DMA传输方式有效解决图像传输延时问题。
附图说明
图1为本发明基于PCIE缓冲机制的同步解码方法实现流程图;
图2为本发明另一实施例基于PCIE缓冲机制的同步解码方法实现流程图。
具体实施方式
为使本发明的目的、内容和优点更加清楚,下面结合附图和实施例,对本发明的具体实施方式作进一步详细描述。
本发明属于linux系统下视频解码技术,在系统为linux的应用场景下,针对海思Hi3559AV100芯片特点,并结合PCIE设备属性,设计实现了一种linux系统下基于PCIE缓冲机制的多路视频解码方案设计方法。本发明为主机系统为vxwork下,以海思Hi3559AV100芯片作为PCIE硬件通道,能有效地提高数据传输,同时,对PCIE接收的数据采取缓冲机制,解决多路解码同步问题。使用FFMPEG解码库进行多路解码和像素格式转换,有效减少解码时间。
首先,移植ffmpeg到海思平台,对ffmpeg进行源码修改使其适配海思芯片。其次,将海思芯片配置为PCIE从设备,设置主机端为PCIE主设备,并为板卡配置PCIE驱动,约定主机端和板卡之间的传输规则;最后,启动PCIE的DMA任务读取主机端发送的图像原始数据,对PCIE通道读取的数据进行缓冲,每次读取固定协议帧长度数据传输给解码器。启动ffmpeg的动态库对缓冲区内的数据进行软解码,并进行目标格式转换,将解码后的图像再次通过PCIE的DMA传输任务发送给主机,从而完成解码任务。
本发明的目的是在linux平台下,解决多路视频解码问题。
为实现上述目的,本发明采取以下技术方案。
S1、移植ffmpeg到海思平台
首先,配置ffmpeg编译属性。然后,交叉编译ffmpeg源码。最后,获取ffmpeg解码动态库拷贝到海思开发板。
S2、配置PCIE设备
首先,根据传输需求,将海思pcie配置成从设备,主机pcie设备为主设备。其次,配置pcie驱动。然后,制定主设备和从设备传输规则。最后,初始化海思PCIE设备。
S3、获取主机通过PCIE传输的数据,并存入缓冲区
首先,创建pcie读数据线程实时查看主机是否有新的图像数据可供读取;然后根据协议规则再在指定的地址段读取数据;建立环形缓冲区,保存从PCIE读取的数据。最后将读完标志清零,以供主机进行下次传输数据。
S4、使用ffmpeg动态库解码缓冲区内的压缩图像数据
首先,初始化ffmpeg使用环境。其次,创建解码线程。然后,从缓冲区读取协议帧固定长度数据,使用ffmpeg动态库解码并进行目标格式转换。
S5、将解码后的图像通过PCIE发送给主机
获取ffmpeg解码后的目标图像后,将图像数据拷贝到DMA传输的内存空间,并启动DMA传输任务将图像数据发送到主机端的PCIE,并将发送长度写入协议规定的地址段通知主机读取数据。
通过以上步骤,可以实现linux系统下的多路视频解码功能。
结合图1,为了解决linux系统下多路视频输出和叠加问题,我们采用基于分屏输出的方法。下面我们对本发明的内容作进一步描述。
S1、移植ffmpeg到海思平台
S11、配置ffmpeg编译属性,根据平台类型、cpu类型、编码解码器属性、格式转换属性、交叉编译属性配置参数。
S12、执行configure命令,在配置文件夹的子文件夹lib下将生成的解码库libavcodec、libavformat、libavutil、libswscale。
S13、将动态库拷贝到解码板卡的/usr/lib路径下;
S2、配置PCIE设备
S21、根据传输需求,将海思的pcie配置成从设备,主机的pcie设备为主设备。
S22、配置pcie驱动。在海思板卡的系统路径/etc/profile里面自动加载3559驱动文件:hi35xx_dev_slv.ko、irq_map_slv.ko、mcc_drv_slv.ko、mcc_usrdev_slv.ko、pcit_dma_slv.ko。
S23、制定主设备和从设备传输规则,规则如下:
a)划分多通道的PCIE地址读写空间,确定每个通道PCIE的读写首地址和读写空间长度;
b)在每个通道的PCIE地址空间再次划分协议交互的地址和数据传输的地址;
c)主设备上电后在协议交互地址段写入握手的规定内容,从设备在上电后以查询方式读取主机写入的握手内容并以清零数据的方式表示握手成功;
d)主设备握手成功后在规定的每个通道的pcie地址段写入从设备读数据的首地址内容和长度;
e)从设备查询到读数据长度不为零,则从通道的读数据地址空间读数据并清零长度表示读操作完成;
f)主设备通过查询固定地址段的内容长度是否大于0作为判断是否有数据的标准,并在读走数据后将长度清零;
g)从设备在传输数据之前先判断主设备是否已读走上次数据(即固定地址段长度为0),如果是则写入解码后的图像数据并将长度写入,如果不是则放弃本次写数据任务,等待下一次解码后的数据再传输。
S24、初始化海思板卡PCIE设备,具体操作如下:
S2401、使用系统open函数打开设备名为“/dev/mem”的内存空间;
S2402、判断上一个步骤获取的操作句柄是否为大于零,如果是则操作成功,进入下一步;如果不是则报错退出初始化流程;
S2403、使用系统mmap函数对内存物理地址进行映射,并获取映射后的内存虚拟地址BarVir;
S2404、判断虚拟地址是否为空,如果为空则报错退出初始化流程,否则则进入下一步;
S2405、在虚拟地址BarVir且偏移协议规定长度的握手地址段循环查询内存第一个地址空间物理首地址share_phy_addr,如果该地址段内容不为零,则退出循环查询过程,并进入下一步,否则延迟1ms后重复该过程;
S2406、使用close函数关闭步骤1获取的操作句柄;
S2407、使用open函数打开设备名“/dev/bnc_dma_pcie”,打开成功则获取了操作句柄hi3559a_pcie_slv_fd进行下一步,打开失败则报错退出该流程;
S2408、使用mmap函数对内存第一个地址空间物理首地址share_phy_addr进行映射,获取该空间的虚拟地址pDataVirtBARAddr;
S2409、使用海思驱动函数COMMON_GetPicBufferSize申请两个视频缓冲池,并进行参数配置且保存在stVbConf数据结构中,使用库函数SAMPLE_COMM_SYS_Init并对其视频缓冲池进行初始化;
S2410、创建视频缓冲池且获取缓冲池中的缓冲块的物理地址,该地址作为海思DMA传输的物理地址dma_phy_addr;
S2411、使用库函数获取物理地址dma_phy_addr对于的虚拟地址pDataVirtDMAAddr作为写数据操作地址;
S2412、释放申请的视频缓存池和缓存块。
S3、获取主机通过PCIE传输的数据,并存入缓冲区
根据通道数为每个通道创建pcie读数据线程,线程具体操作为:
S31、申请读写互斥锁,对每个通道的读写操作进行保护,不允许同时有多个通道进行读写操作;
S32、查看主设备是否有新的图像数据可供读取,即在内存虚拟地址pDataVirtBARAddr且偏移协议规定长度的地址内的读数据长度是否不为零,同时主机的读地址也不为零;
S33、根据协议规则再在指定的读地址段读取数据,具体操作:设置pcie读任务的目的地址(该地址为从设备的pcie读地址,该读地址为DMA数据读写的物理首地址dma_phy_addr偏移协议规定的长度地址)和源地址(该地址为主设备的pcie写地址);
S34、通过ioctl函数对从设备发送读数据任务命令;判断返回值是否成功,如成功则在地址pDataVirtBARAddr偏移协议规定长度的地址段将读长度清零,以供主设备进行下次传输数据。
S35、建立环形缓冲区,保存从PCIE通道读取的图像数据。
S3501、判断pcie通道读取的数据长度len是否为大于0,如果是则进行下一步,如果不是则退出。
S3502、判断缓冲区已有数据长度cirLen与len的和是否小于缓冲区最大长度MAX_LEN,如果是则进行下一步,如果不是则进行第S3505步。
S3503、将pcie通道的虚拟地址内存空间的数据拷贝到环形缓冲区,拷贝长度为len。
S3504、将缓冲区的数据总长度增加len个数,同时存数据的首地址ptr(初始化为缓冲区首地址)也移动len个位置。
S3505、将pcie通道内存区的数据拷贝到缓冲区,拷贝长度为(MAX_Len-cirLen)。
S3506、重置写指针putPtr,移动到缓冲区首地址。
S3507、计算缓冲区总数据长度cirLen为len-(MAX_LEN-cirLen);
S3508、再次从pcie通道的内存空间拷贝到缓冲区,拷贝长度为cirlen;
S3509、向前移动写指针putPtr,移动cirLen个位置。
S36、将读完标志清零,以供主机进行下次传输数据,释放互斥锁。
S4、使用ffmpeg动态库解码缓冲区内的压缩图像数据
S41、初始化解码库使用环境
首先,设置解码器类型,采用HEVC(h265)类型的解码器。然后,初始化解码器上下文环境,动态申请图像帧存储空间。
S42、根据通道数创建ffmpeg解码线程,线程具体流程如下:
S421、获取从环形缓冲区读取的图像数据缓冲区首地址bufPtr和长度bufLen,具体步骤如下:
S4211、获取目前缓冲区的写指针位置putPtr和缓冲区数据总长度cirLen;
S4212、判断读指针readPtr与putPtr是否一致,如果一致则退出,否则进行下一步。
S4213、判断已读数据readLen是否小于cirLen,如果是则继续下一步,否则进行第S4217步。
S4214、判断cirLen与readLen差值是否大于等于协议帧固定长度frame_len,如果是继续下一步,如果不是则进行第S4216步。
S4215、将当前readPtr作为解码图像数据首地址bufPtr,长度bufLen为frame_len,同时移动readPtr,移动个数为frame_len,增加读取长度readLen,增加个数为frame_len。
S4216、将当前readPtr作为解码图像数据首地址bufptr,长度bufLen为cirLen减去readLen,同时移动readPtr,移动个数为(cirLen-readLen),增加读取长度readLen,增加个数为(cirLen-readLen)。
S4217、判断readLen与frame_len的和是否小于MAX_LEN,如果是则进行下一步,如果不是则进行第S4219步。
S4218、将当前readPtr作为解码图像数据首地址bufPtr,数据长度bufLen为frame_len,移动读指针,移动个数为frame_len,增加读数据长度readLen,增加个数为frame_len。
S4219、将当前readPtr作为解码图像数据首地址bufPtr,数据长度bufLen为MAX_LEN-readLen,移动读指针到缓冲区首地址,置读长度readLen为0。
S422、判断当前的数据长度bufLen是否大于0,如果是则继续下一步,如果不是,则退出本次数据的解码过程,等待下次PCIE传送的数据。
S423、传送数据缓冲区首地址指针bufPtr和长度bufLen给解码器,使用库函数对缓冲区的数据按帧进行分割,如果从缓冲区能成功获得一个完整的图像帧数据则记录继续下一步,如果不是则退出本次解码过程。
S424、保存本次缓冲区中图像帧分割的长度ret,从数据缓冲区总长度bufLen剔除本次分割的图像帧数据长度ret,并向前移动首地址指针bufPtr,移动次数为ret。
S425、将本次分割的图像帧数据通过库函数发送到解码器,放到解码队列中,如果发送失败则退出本次解码过程。如果成功则继续进行下一步;
S426、等待解码器返回解码后的图像帧,调用动态库函数将图像数据进行目标格式转换。如解码器不再返回图像帧,则继续进行S422;
S5、将解码后的图像通过PCIE发送给主机。
S501、获取互斥锁,拷贝解码后的图像数据到该通道的DMA虚拟地址空间pDataVirtDMAAddr;
S502、然后判断内存虚拟地址pDataVirtBARAddr偏移地址内的写长度是否被主机清零(即上一帧图像数据已被主设备取走),如果为0则报错退出;
S503、在内存虚拟地址pDataVirtBARAddr的偏移地址处获取给主设备发送数据的目的物理地址vxworks_phy_addr,如果为零则报错退出,否则进行下一步;
S504、设置本次传输任务的源地址,即DMA传输数据写地址dma_phy_addr偏移该通道对应的长度的地址;
S505、设置本次传输任务的目的地址,即主机接收数据的目的物理地址vxworks_phy_addr;
S506、设置发送数据的长度;
S507、使用系统ioctl函数以hi3559a_pcie_slv_fd操作句柄为参数执行写数据任务;
S508、执行失败则报错退出,执行成功则进行下一步;
S509、在地址pDataVirtBARAddr偏移协议规定长度的地址段写入本次传输的数据长度,以供主机查询;
S510、解锁互斥锁,释放pcie通道资源。
利用上述技术方案,采用上述操作步骤,本发明可以实现linux系统下视频解码和传输问题,该方法已经经过了算法验证,并进行了实验检验。结果标明,该方案可以为解决图像解码问题,采用软解码方法,动态过滤错帧,并结合PCIE的DMA传输方式有效解决图像传输延时问题。
实施例1:
一种基于PCIE的多路视频解码方案设计方法,(1)移植ffpmeg到海思平台;(2)配置板卡的PCIE主从属性,并制定主机与板卡之间的传输规则;(3)采用PCIE的DMA传输方式读写图像数据,使用环形缓冲区机制保证多路数据同步,并使用ffmpeg动态库对PCIE传输的数据进行软解码并进行目标格式转换。
进一步地,所述的(1)(2)对板卡进行了解码环境的配置和对PCIE设备的设置。
进一步地,(3)启动多线程对多通道图像进行处理,并采用互斥锁的方法保护每路通道的PCIE读写操作。采用DMA传输方式,有效节省图像数据传输的延时,并且使用环形缓冲区机制对数据进行处理,每次获取固定帧协议长度的数据,保证多路解码的同步性。使用ffmpeg动态库对图像数据进行解码,有效提高解码效率,同时可根据显示需求调整目标图像的输出格式。
以上所述仅是本发明的优选实施方式,应当指出,对于本技术领域的普通技术人员来说,在不脱离本发明技术原理的前提下,还可以做出若干改进和变形,这些改进和变形也应视为本发明的保护范围。

Claims (7)

1.一种基于PCIE缓冲机制的同步解码方法,其特征在于,该方法包括如下步骤:
S1、移植ffmpeg到海思平台
首先,配置ffmpeg编译属性;然后,交叉编译ffmpeg源码;最后,获取ffmpeg解码动态库拷贝到海思开发板;
S2、配置PCIE设备
首先,根据传输需求,将海思pcie配置成从设备,主机pcie设备为主设备;其次,配置pcie驱动;然后,制定主设备和从设备传输规则;最后,初始化海思PCIE设备;
S3、获取主机通过PCIE传输的数据,并存入缓冲区
首先,创建pcie读数据线程实时查看主机是否有新的图像数据可供读取;然后根据协议规则再在指定的地址段读取数据;建立环形缓冲区,保存从PCIE读取的数据;最后将读完标志清零,以供主机进行下次传输数据;
S4、使用ffmpeg动态库解码缓冲区内的压缩图像数据
首先,初始化ffmpeg使用环境;其次,创建解码线程;然后,从缓冲区读取协议帧固定长度数据,使用ffmpeg动态库解码并进行目标格式转换;
S5、将解码后的图像通过PCIE发送给主机
获取ffmpeg解码后的目标图像后,将图像数据拷贝到DMA传输的内存空间,并启动DMA传输任务将图像数据发送到主机端的PCIE,并将发送长度写入协议规定的地址段通知主机读取数据;
其中,
所述步骤S1具体包括如下步骤:
S11、配置ffmpeg编译属性,根据平台类型、cpu类型、编码解码器属性、格式转换属性、交叉编译属性配置参数;
S12、执行configure命令,在配置文件夹的子文件夹lib下将生成的解码库libavcodec、libavformat、libavutil、libswscale;
S13、将动态库拷贝到解码板卡的/usr/lib路径下;
所述步骤S2具体包括如下步骤:
S21、根据传输需求,将海思的pcie配置成从设备,主机的pcie设备为主设备;
S22、配置pcie驱动;在海思板卡的系统路径/etc/profile里面自动加载3559驱动文件:hi35xx_dev_slv.ko、irq_map_slv.ko、mcc_drv_slv.ko、mcc_usrdev_slv.ko、pcit_dma_slv.ko;
S23、制定主设备和从设备传输规则;
S24、初始化海思板卡PCIE设备;
所述步骤S24具体包括如下步骤:
S2401、使用系统open函数打开设备名为“/dev/mem”的内存空间;
S2402、判断上一个步骤获取的操作句柄是否为大于零,如果是则操作成功,进入下一步;如果不是则报错退出初始化流程;
S2403、使用系统mmap函数对内存物理地址进行映射,并获取映射后的内存虚拟地址BarVir;
S2404、判断虚拟地址是否为空,如果为空则报错退出初始化流程,否则则进入下一步;
S2405、在虚拟地址BarVir且偏移协议规定长度的握手地址段循环查询内存第一个地址空间物理首地址share_phy_addr,如果该地址段内容不为零,则退出循环查询过程,并进入下一步,否则延迟1ms后重复该过程;
S2406、使用close函数关闭步骤1获取的操作句柄;
S2407、使用open函数打开设备名“/dev/bnc_dma_pcie”,打开成功则获取了操作句柄hi3559a_pcie_slv_fd进行下一步,打开失败则报错退出该流程;
S2408、使用mmap函数对内存第一个地址空间物理首地址share_phy_addr进行映射,获取该空间的虚拟地址pDataVirtBARAddr;
S2409、使用海思驱动函数COMMON_GetPicBufferSize申请两个视频缓冲池,并进行参数配置且保存在stVbConf数据结构中,使用库函数SAMPLE_COMM_SYS_Init并对其视频缓冲池进行初始化;
S2410、创建视频缓冲池且获取缓冲池中的缓冲块的物理地址,该地址作为海思DMA传输的物理地址dma_phy_addr;
S2411、使用库函数获取物理地址dma_phy_addr对于的虚拟地址pDataVirtDMAAddr作为写数据操作地址;
S2412、释放申请的视频缓存池和缓存块。
2.如权利要求1所述的基于PCIE缓冲机制的同步解码方法,其特征在于,所述步骤S23具体包括:
划分多通道的PCIE地址读写空间,确定每个通道PCIE的读写首地址和读写空间长度;
在每个通道的PCIE地址空间再次划分协议交互的地址和数据传输的地址;
主设备上电后在协议交互地址段写入握手的规定内容,从设备在上电后以查询方式读取主机写入的握手内容并以清零数据的方式表示握手成功;
主设备握手成功后在规定的每个通道的pcie地址段写入从设备读数据的首地址内容和长度;
从设备查询到读数据长度不为零,则从通道的读数据地址空间读数据并清零长度表示读操作完成;
主设备通过查询固定地址段的内容长度是否大于0作为判断是否有数据的标准,并在读走数据后将长度清零;
从设备在传输数据之前先判断主设备是否已读走上次数据,如果是则写入解码后的图像数据并将长度写入,如果不是则放弃本次写数据任务,等待下一次解码后的数据再传输。
3.如权利要求1或2所述的基于PCIE缓冲机制的同步解码方法,其特征在于,所述步骤S3具体包括如下步骤:
S31、申请读写互斥锁,对每个通道的读写操作进行保护,不允许同时有多个通道进行读写操作;
S32、查看主设备是否有新的图像数据可供读取,即在内存虚拟地址pDataVirtBARAddr且偏移协议规定长度的地址内的读数据长度是否不为零,同时主机的读地址也不为零;
S33、根据协议规则再在指定的读地址段读取数据,具体操作:设置pcie读任务的目的地址和源地址;
S34、通过ioctl函数对从设备发送读数据任务命令;判断返回值是否成功,如成功则在地址pDataVirtBARAddr偏移协议规定长度的地址段将读长度清零,以供主设备进行下次传输数据;
S35、建立环形缓冲区,保存从PCIE通道读取的图像数据;
S36、将读完标志清零,以供主机进行下次传输数据,释放互斥锁。
4.如权利要求3所述的基于PCIE缓冲机制的同步解码方法,其特征在于,所述步骤S35具体包括如下步骤:
S3501、判断pcie通道读取的数据长度len是否为大于0,如果是则进行下一步,如果不是则退出;
S3502、判断缓冲区已有数据长度cirLen与len的和是否小于缓冲区最大长度MAX_LEN,如果是则进行下一步,如果不是则进行第S3505步;
S3503、将pcie通道的虚拟地址内存空间的数据拷贝到环形缓冲区,拷贝长度为len;
S3504、将缓冲区的数据总长度增加len个数,同时存数据的首地址ptr也移动len个位置;
S3505、将pcie通道内存区的数据拷贝到缓冲区,拷贝长度为(MAX_Len-cirLen);
S3506、重置写指针putPtr,移动到缓冲区首地址;
S3507、计算缓冲区总数据长度cirLen为len-(MAX_LEN-cirLen);
S3508、再次从pcie通道的内存空间拷贝到缓冲区,拷贝长度为cirlen;
S3509、向前移动写指针putPtr,移动cirLen个位置。
5.如权利要求4所述的基于PCIE缓冲机制的同步解码方法,其特征在于,所述步骤S4具体包括如下步骤:
S41、初始化解码库使用环境
首先,设置解码器类型,采用HEVC类型的解码器;然后,初始化解码器上下文环境,动态申请图像帧存储空间;
S42、根据通道数创建ffmpeg解码线程;
S421、获取从环形缓冲区读取的图像数据缓冲区首地址bufPtr和长度bufLen;
S422、判断当前的数据长度bufLen是否大于0,如果是则继续下一步,如果不是,则退出本次数据的解码过程,等待下次PCIE传送的数据;
S423、传送数据缓冲区首地址指针bufPtr和长度bufLen给解码器,使用库函数对缓冲区的数据按帧进行分割,如果从缓冲区能成功获得一个完整的图像帧数据则记录继续下一步,如果不是则退出本次解码过程;
S424、保存本次缓冲区中图像帧分割的长度ret,从数据缓冲区总长度bufLen剔除本次分割的图像帧数据长度ret,并向前移动首地址指针bufPtr,移动次数为ret;
S425、将本次分割的图像帧数据通过库函数发送到解码器,放到解码队列中,如果发送失败则退出本次解码过程;如果成功则继续进行下一步;
S426、等待解码器返回解码后的图像帧,调用动态库函数将图像数据进行目标格式转换;如解码器不再返回图像帧,则继续进行S422。
6.如权利要求5所述的基于PCIE缓冲机制的同步解码方法,其特征在于,所述步骤S421具体包括如下步骤:
S4211、获取目前缓冲区的写指针位置putPtr和缓冲区数据总长度cirLen;
S4212、判断读指针readPtr与putPtr是否一致,如果一致则退出,否则进行下一步;
S4213、判断已读数据readLen是否小于cirLen,如果是则继续下一步,否则进行第S4217步;
S4214、判断cirLen与readLen差值是否大于等于协议帧固定长度frame_len,如果是继续下一步,如果不是则进行第S4216步;
S4215、将当前readPtr作为解码图像数据首地址bufPtr,长度bufLen为frame_len,同时移动readPtr,移动个数为frame_len,增加读取长度readLen,增加个数为frame_len;
S4216、将当前readPtr作为解码图像数据首地址bufPtr,长度bufLen为cirLen减去readLen,同时移动readPtr,移动个数为(cirLen-readLen),增加读取长度readLen,增加个数为(cirLen-readLen);
S4217、判断readLen与frame_len的和是否小于MAX_LEN,如果是则进行下一步,如果不是则进行第S4219步;
S4218、将当前readPtr作为解码图像数据首地址bufPtr,数据长度bufLen为frame_len,移动读指针,移动个数为frame_len,增加读数据长度readLen,增加个数为frame_len;
S4219、将当前readPtr作为解码图像数据首地址bufPtr,数据长度bufLen为MAX_LEN-readLen,移动读指针到缓冲区首地址,置读长度readLen为0。
7.如权利要求5或6所述的基于PCIE缓冲机制的同步解码方法,其特征在于,所述步骤S5具体包括如下步骤:
S501、获取互斥锁,拷贝解码后的图像数据到该通道的DMA虚拟地址空间pDataVirtDMAAddr;
S502、然后判断内存虚拟地址pDataVirtBARAddr偏移地址内的写长度是否被主机清零,如果为0则报错退出;
S503、在内存虚拟地址pDataVirtBARAddr的偏移地址处获取给主设备发送数据的目的物理地址vxworks_phy_addr,如果为零则报错退出,否则进行下一步;
S504、设置本次传输任务的源地址,即DMA传输数据写地址dma_phy_addr偏移该通道对应的长度的地址;
S505、设置本次传输任务的目的地址,即主机接收数据的目的物理地址vxworks_phy_addr;
S506、设置发送数据的长度;
S507、使用系统ioctl函数以hi3559a_pcie_slv_fd操作句柄为参数执行写数据任务;
S508、执行失败则报错退出,执行成功则进行下一步;
S509、在地址pDataVirtBARAddr偏移协议规定长度的地址段写入本次传输的数据长度,以供主机查询;
S510、解锁互斥锁,释放pcie通道资源。
CN202110973394.9A 2021-08-24 2021-08-24 一种基于pcie缓冲机制的同步解码方法 Active CN113709495B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN202110973394.9A CN113709495B (zh) 2021-08-24 2021-08-24 一种基于pcie缓冲机制的同步解码方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN202110973394.9A CN113709495B (zh) 2021-08-24 2021-08-24 一种基于pcie缓冲机制的同步解码方法

Publications (2)

Publication Number Publication Date
CN113709495A CN113709495A (zh) 2021-11-26
CN113709495B true CN113709495B (zh) 2023-11-24

Family

ID=78654329

Family Applications (1)

Application Number Title Priority Date Filing Date
CN202110973394.9A Active CN113709495B (zh) 2021-08-24 2021-08-24 一种基于pcie缓冲机制的同步解码方法

Country Status (1)

Country Link
CN (1) CN113709495B (zh)

Families Citing this family (2)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN115988161B (zh) * 2023-03-17 2023-06-06 上海芯浦科技有限公司 一种视频传输设备及传输方法
CN117312200B (zh) * 2023-11-27 2024-02-02 沐曦集成电路(南京)有限公司 基于环形缓冲区的多通道数据dma系统

Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN108616722A (zh) * 2018-04-18 2018-10-02 中南大学 一种嵌入式高清视频采集与数据流传输系统
CN109857553A (zh) * 2019-01-11 2019-06-07 华为技术有限公司 内存管理方法及装置
CN109997154A (zh) * 2017-10-30 2019-07-09 上海寒武纪信息科技有限公司 信息处理方法及终端设备
CN112261460A (zh) * 2020-10-19 2021-01-22 天津津航计算技术研究所 一种基于pcie的多路视频解码方案设计方法
US10922068B1 (en) * 2018-11-09 2021-02-16 Xilinx, Inc. Updating firmware for programmable integrated circuits in computing environments
CN112714281A (zh) * 2020-12-19 2021-04-27 西南交通大学 一种基于5g网络的无人机机载vr视频采集传输装置

Family Cites Families (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US8868867B2 (en) * 2011-09-15 2014-10-21 The Regents Of The University Of California Method for reducing latency of accessing data stored in a file system on a computer storage device by caching file system permission information in the computer storage device

Patent Citations (6)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN109997154A (zh) * 2017-10-30 2019-07-09 上海寒武纪信息科技有限公司 信息处理方法及终端设备
CN108616722A (zh) * 2018-04-18 2018-10-02 中南大学 一种嵌入式高清视频采集与数据流传输系统
US10922068B1 (en) * 2018-11-09 2021-02-16 Xilinx, Inc. Updating firmware for programmable integrated circuits in computing environments
CN109857553A (zh) * 2019-01-11 2019-06-07 华为技术有限公司 内存管理方法及装置
CN112261460A (zh) * 2020-10-19 2021-01-22 天津津航计算技术研究所 一种基于pcie的多路视频解码方案设计方法
CN112714281A (zh) * 2020-12-19 2021-04-27 西南交通大学 一种基于5g网络的无人机机载vr视频采集传输装置

Non-Patent Citations (4)

* Cited by examiner, † Cited by third party
Title
PX1011B PCI Express stand-alone X1 PHY.《NXP Semiconductors》.2011,全文. *
USB3.0物理层中弹性缓冲的设计与实现;朱小明;《微电子学与计算机》;全文 *
基于DM642 PCI Master读方式的AVS视频数据传输实现;秦永红;戴小文;;计算机技术与发展(第05期);全文 *
秦永红 ; 戴小文 ; .基于DM642 PCI Master读方式的AVS视频数据传输实现.计算机技术与发展.2008,(第05期),全文. *

Also Published As

Publication number Publication date
CN113709495A (zh) 2021-11-26

Similar Documents

Publication Publication Date Title
CN112261460B (zh) 一种基于pcie的多路视频解码方案设计方法
CN113709495B (zh) 一种基于pcie缓冲机制的同步解码方法
US10969983B2 (en) Method for implementing NVME over fabrics, terminal, server, and system
US9836248B2 (en) In-memory data compression complementary to host data compression
CN113645490B (zh) 一种软硬结合的多通道视频同步解码方法
WO2020063246A1 (zh) 点云编解码方法和编解码器
WO2021248423A1 (zh) 人工智能资源的调度方法、装置、存储介质和芯片
US10402119B2 (en) Data format conversion apparatus and method and buffer chip
CN111327902A (zh) 点云的编解码方法及装置
JPWO2005057400A1 (ja) 電子装置、その制御方法、ホスト装置及びその制御方法
CN113498595B (zh) 一种基于PCIe的数据传输方法及装置
CN114286035B (zh) 图像采集卡、图像采集方法及图像采集系统
CN103152606A (zh) 视频文件处理方法及装置、系统
JP2016045899A (ja) データ転送制御装置
US10374608B1 (en) Bridged integrated circuits
CN113727115B (zh) 一种高效可转码的视频解码方法
US7038802B2 (en) Flexible networked image processing
WO2015038154A1 (en) Grouping and compressing similar photos
CN113596469A (zh) 一种软硬结合且高效传输的视频解码方法
TW201741892A (zh) 文檔分割系統及方法
CN104025026B (zh) 访问用于配置空间的配置和状态寄存器
US11283451B1 (en) Bridged integrated circuits
CN109213710B (zh) 高速串行接口装置与其数据传输方法
CN115587059A (zh) 一种数据转换系统
US20210306660A1 (en) Encoding apparatus, decoding apparatus, encoding method, decoding method, and storage medium

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant