陕西整站关键词自然排名优化,wordpress 积分充值,唐山做网站口碑好的,黑龙江省建设造价协会网站DM8168 DVRRDK软件框架研究 2016-07-26 11:39 72人阅读 评论(0) 收藏 举报分类#xff1a;DM8168#xff08;18#xff09; Netra#xff08;DM8168#xff09;处理器是个多核处理器#xff0c;每个核之间相互独立却又相互关联#xff0c;如何高效简洁地利用每个核完成一… DM8168 DVRRDK软件框架研究 2016-07-26 11:39 72人阅读 评论(0) 收藏 举报 分类 DM816818 NetraDM8168处理器是个多核处理器每个核之间相互独立却又相互关联如何高效简洁地利用每个核完成一套系统功能是非常关键的RDK这套软件平台就是针对这种多核平台设计的一套多通道视频应用方案主要用于DVR、NVR、IPNC之类的产品。 这个软件框架结构允许用户创建不同的多路数据流来实现视频的采集、视频处理DEI、Noise Filter、Encode、Decode、SwMs、Merge等和视频播放功能其框架设计非常值得学习。 以下为相关缩写解释 ***************************************************************************************************** HDVPSSHigh Definition Video Processing Subsystem HDVICPHigh Definition Video and Image CoProcessor DucatiDual Core M3 Processors controlling HDVPSS and HDVICP hardware engines Video M3ARM Cortex M3 Coreinside Ducati subSystemcontrolling HDVICP codecs VPSS M3ARM Cortex M3 Coreinside Ducati subSystemcontrolling HDVPSSalso called DSS M3 DEIDeinterlacer McFWMulti Channel Framework IPCInter Processor Communication ****************************************************************************************************** 1、Rdk平台软件框架图 在Rdk平台软件中做了很好的分层如下图所示 注意上图中核间通过Syslink/IPC通信任意2个核之间都可以直接通信是一个星型网络上图画的连接关系描述的是对等层次的概念。 上图中相关层的功能及相关描述如下表所示 层处理器描述相关TI软件包LinuxHOST A8 Linux OS, includes, filesystems, SATA, Ethernet, USB and other IO drivers Linux PSPBIOS6 VPSS M3 Video M3 DSP BIOS RTOS used as OS on Video-M3, VPSS-M3, DSP. Provides features like threads, semaphores, interrupts. Queues and message passing between links is implemented using BIOS semaphores. BIOS XDC (used for BIOS and other configuration) Syslink / IPC HOST A8 VPSS M3 Video M3 DSP Software APIs used for communicating between processors. Provides features like processor loading and booting, multiprocessor heaps, multiprocessor linked list (ListMP), message queues, notify etc Syslink IPC HDVPSS Drivers VPSS M3 HDVPSS drivers like capture, display, deinterlacer, scaling based on FVID2 interface to control and configure the HDVPSS HW HDVPSS Video Encode/Decode Video M3 Video encode / decode APIs based on XDM / XDIAS interface. Uses framework components for resource allocation XDIAS Framework components IVAHD HDVICP2 API H264 decoder H264 encoder Links Links HOST A8 VPSS M3 Video M3 DSP Implementation of individual links. Some links are specific to a processor while some links are common across processors DVR RDKLink APIHOST A8 The link API allows users to create , connect, and control links on HOSTA8, VPSS M3, Video M3 and DSP. Link API is used to create a chain of links which forms a user defined use-case. The connection of links to each other is platform dependant. McFWMcFW APIHOST A8 Multi-Channel FrameWork API. Multi-Channel Application specific API which allows user to setup and control pre-defined application specific chains for DVR, NVR, using a single simplified API interface. This allows users to directly use the links without having to understand the detailed link API. The McFW API is platform independent and same API will work on DM816x, DM814x, DM810x McFW User Application HOST A8 Typically GUI and other application specific components like file read/write, network streaming. Customer specific 2、基于Rdk框架的实例 Capture (YUV422I) 16CH D1 60fps | NSF (YUV420SP) | dup1----IPCM3OUT(VPS) - IPCM3IN(VID) - ENC - IPC_BITS_OUT_M3 - IPC_BITS_IN_A8 - fwrite() - Write to filesystem | | -----IPCM3IN(VPS) - IPCM3OUT(VID) - DEC - IPC_BITS_IN_M3 - IPC_BITS_OUT_A8 - fread() - read from harddisk | MERGE | DUP2 ||| --------|------------ | | | | | | SW Mosaic SW Mosaic SW Moasic (DEIH YUV422I) (DEI YUV422I) (SC5 YUV422I) | | | GRPX0 | GRPX1,2 | | | | | | | On-Chip HDMI Off-Chip HDMI SDTV (NTSC) 1080p60 1080p60 480i60 3、Link Api机制 3.1 link api的概念 link在上图中的视频数据流中是最基本的单元模块每个link中包含了一个基于BIOS6/Linux的任务、线程、消息盒(使用操作系统的信号量实现)。由于每个link运行一个独立的现成因此link之间可以并行运行。消息盒是关联用户指定的link让link之间有个互相对话的机制用来传递信令。而对于视频流数据、帧数据的传递link实现了专门的接口来实现只传递指针而不是数据。 在实现上节所介绍的数据流可以通过将多个link连接来实现chainlink API允许用户Create、Start、Stop、Delete、Control各个link。在Rdk中TI基于link API进行再次封装用于特定的应用场合其各种参数均是为特定的产品定制可以是相关业务的开发更迅速。 3.2 link内部结构 3.3 link的特性 视频处理的工作量可以均衡到每个核心上去执行如下表 Processor OS Used forHOST A8LinuxSystem setup and control, GUI, IO peripheral control like SATA, Ethernet, USB, AudioVPSS M3BIOS6 HDVPSS control for video capture, video display, scaling, deInterlacing … Video M3BIOS6HDVICP2 Video compression / decompression (H264 encode, H264 decode)DSPBIOS6SW OSD, custom video processing algorithms 每个link都有自己独立的任务/线程用于完成视频采集或播放等处理每个link都可以处理来自多个通道的视频帧数据每个通道的视频宽高和数据格式都可以不同A8作为HOST可以用来连接多个link形成数据流的链并对其进行控制数据链被建立并启动时数据链中的每个link将和它的下游link进行帧数据的交互links之间的帧数据交互可以在多个核心之间进行并且并不需要A8 HOST的干涉从而降低A8的开销 在数据链运行过程中用户可以发送控制信令给任意link来动态设置相关的link参数 3.4 link接口 link接口可以分成以下几类 link API——被用户调用来配置和控制link的接口Inter link API——被其他links调用来交换帧数据的接口link output queue——被其他links通过Inter Link API接口实用的帧buffer队列 3.5 link间的消息传递 每个Link通过一个32位的该LinkId来识别ID高4位标识了这个Link是在哪个核上运行低24位标识了该Link的名称 BitsDescription[0..27]Link ID[28..31]Processor ID on which this link runs 0:DSP 1:Video M3 2:VPSS M3 3:A8 每个Link API都需要这个LinkID参数来发送消息当用户发送消息到一个Link时根据这ID函数内部判断这个消息是发给本地的Link还是远端核心的Link如果是本地的直接调用BIOS/LINUX API函数否则就通过Syslink模块的MessageQ发送这个消息到指定的核心让对端的核心调用对应的函数处理。 3.6 link API 下面将通过表格的形式来看看link API的部分接口及相关功能 APIDescriptionSystem_linkCreateCreates a link ——allocates driver, codec, memory resources.System_linkGetInfoGet information about a link like number of channels, properties of each channel. MUST be called after System_linkCreate() for a linkSystem_linkStartStart the link ——starts the driver or codecSystem_linkControlSend a link specific control command with optional argumentsSystem_linkStopStop the link —— stops the driver or codecSystem_linkDeleteDeletes a link —— free’s driver, codec, memory resources 3.7 Inter link API 下面的表格介绍了在link内部实现的交换帧数据的API对于用户来说这部分API是不需要关心的 APIDescriptionSystem_GetLinkInfoCbFunction to return information about a link like number of channels, properties of each channelSystem_LinkGetOutputFramesCb Function to return captured or generated or output frames to the caller (another link) System_LinkPutEmptyFramesCbFunction to release consumed frames back to the original link for reuseSystem_LinkGetOutputBitBufsCbFunction to return generated or output bitstream frame to the caller (another link) –Valid only for Encode LinkSystem_LinkPutEmptyBitBufsCbFunction to release consumed bitstream frames back to the original link for reuse –Valid only for Encode Link 在每个link中必须实现一些函数并在初始化时注册这些函数指针给link管理的核心模块用于帧数据的获取、释放、dump相关状态等。 对于任一个link想从它的上游link获取帧数据都需要调用link管理核心函数System_getLinksFullFrames()该函数内部会发送消息到对应的上游link触发该link向管理模块注册的回调函数System_LinkGetOutputFramesCb()将帧数据传递给该link 同样的在当一个link想释放处理完毕的帧buffer给上游link时需要调用link管理核心函数System_putLinksEmptyFrames()该函数内部会发送消息到对应的上游link触发它注册的回调函数System_LinkPutEmptyFramesCb()将帧buffer回收用于后续的数据处理 建立chain时你肯定还会关注一个信息那就是上游link的相关参数如何传递给下游的link从源程序仔细琢磨琢磨就可以看出来和上面的处理类似所有有下游link的link都会注册一个System_GetLinkInfoCb()的回调函数在下游link的driver中会在创建driver时调用System_linkGetInfo()函数来获取上游link的相关参数。 通过上述的方法对于一个link来说就不需要关心和它交互的是哪一个link所有的寻址都通过linkID来自动查找并且同一个link实现可以和不同的link交互而不需要改变函数的实现。 3.8 Link Output Queues 的管理 一个Link可以有一个或多个输出队列用来存放采集到的或处理完毕的帧数据每个Link的输出队列内存由自己分配 大多数Links只有一个输出队列但是有些link有多个从而可以实现多路不同的输出数据流满足不同的应用需求例如Noise filter Link可以输出16路帧数据到2个输出队列每个输出队列输出8路通道数据跟别给2个DEI Links模块处理。 一个输出队列中可以有多个视频channels的数据每个channel可以有不同的大小和数据格式 数据结构 FVID2_Frame是在VPSS驱动中定义的Links之间就通过该结构参数传递帧数据的信息如帧数据的Buf指针而帧数据本身并不会被拷贝从而节省内存开销 当一个Link采集完或处理完一帧数据后会发送一个消息“SYSTEM_CMD_NEW_DATA”给下游的Link从而通知它有数据可取当下游Link收到该消息后会调用System_getLinksFullFrames()函数来获取对用的帧数据处理完后再调用System_putLinksEmptyFrames()函数来归还给上游Link继续使用。 因此一个Link需要知道 上游Link的LinkID和QueID从而从该队列里面获取帧数据下游LinkID从而在有新数据产生时通知下游Link来取 上游Link的LinkID和QueID 以及下游LinkID 都是在System_linkCreate()时由A8 HOST端来指定的。 3.9 IPC link核间帧数据交互 IPC Link是用来多核之间的帧数据传递的。 如VPSS上的采集Link想把帧数据发送给Video Link处理先将帧数据传递给本地的IPC Link然后IPC Link再通过Syslink/IPC发送到Video Link上的IPC Link然后再转发给Video Link这样的话对于采集Link的实现来说就非常清晰简单它的实现都是发送给本地的另一个Link IPC Link的实现有点复杂因为它涉及的帧数据传递是在多个核之间这里面就牵扯到cache的一致性问题考虑到每个核的特性以及高效性总共设计了3个内部Links用于帧数据的传递机制 Intra-processor links 即同一核心内部的link如采集与降噪之间的帧数据传递这种内部的link间传递帧数据都是在VPSS M3内部完成因此采用简单且高效的队列机制实现。 Inter M3 (Video / VPSS) links 即M3内部核心之间的link由于Video和Vpss所在的2个M3核心是同属于一个双核M3处理器它们的cache是共享的如降噪模块VPSS NF到编码模块VIDEO Enc之间传递帧数据带有Notify的IPC ListMP机制被用来在这2个M3核心之间传递帧信息FVID2_Frame该过程中不需要任何cache操作和地址转换。 Inter processor (M3 to A8 or DSP) 即处理器内部核心之间如编码(VideoM3)到BitStream In(HostA8)之间传递帧数据同样使用带Notify的IPC ListMP机制在2个核心之间传递帧信息FVID2_Frame但该过程中需要做cache同步和地址转换操作。 4、chain数据链路的建立 一个Chain是由多个links按照一定的应用需求按顺序连接成一条视频处理的数据流。 一个Chain可以销毁后重新按照新的需求组成新的Chain不需要重启系统。 Chain创建是特别需要相关link的顺序 通过System_linkCreate()函数按照由sourcesink 的顺序创建需要的LinksSource Link即没有上游Link的Link如视频采集Sink Link是没有下游Link的Link如视频播放这个创建顺序是非常重要的因为一个Link创建时它会查询上游Link的一些信息如上游Link需要的channel的个数和属性从而按照这些参数配置自己。下一步调用System_linkStart()函数启动每个Link启动顺序一般从Sink Link往前到Sorce Link当然你也可以不按照这个顺序不过不推荐因为这样可以保证每个Link在它的上游Link启动前准备好接收数据避免过多的缓冲引入额外的时延。当一个Chain运行后控制命令就可以发送到各个Links来控制它如调用System_linkControl()函数发送改变画面合成风格的命令给相应的Link具体的命令定义由每个Link的功能实现来决定注意一般来说System_linkControl()函数是在System_linkCreate()创建了Link之后才能调用不过有些控制命令可以在System_linkCreate()调用之前调用以完成Link创建之前必须的一些初始化如复位当Chain工作完成或销毁时可以调用System_linkStop()函数先停止每个Link注意停止的顺序必须从Source开始依次到Sink结束因为一个Link可能阻塞着等待下游Link释放当前Link的输出Buffer如果下游Link先停止的话当前Link可能会出于wait for ever的状态而永久退不出来因此上游Link必须先停止之后才能停止下游Link最后等所有Link全部停止后可以调用System_linkDelete()函数删除所有Links删除顺序没有要求当Chain销毁后就可以按照之前的顺序重新创建一个新的Chain来完成另一个工作了。 原文地址http://blog.csdn.net/crushonme/article/details/10245169 感谢robin19890305的分享。 参考文献 DVR_RDK_McFW_Link_API_Training.pdfDM81xx_DVR_RDK_Overview.pdf TI NVR RDK Source Code 转自 http://www.360doc.com/content/15/0513/17/16524087_470220448.shtml