DM8168 DVRRDK软件框架研究

DM8168 DVRRDK软件框架研究

 72人阅读 评论(0) 收藏 举报
 分类:

Netra(DM8168)处理器是个多核处理器,每个核之间相互独立却又相互关联,如何高效简洁地利用每个核完成一套系统功能是非常关键的,RDK这套软件平台就是针对这种多核平台设计的一套多通道视频应用方案,主要用于DVRNVR、IPNC之类的产品。

        这个软件框架结构允许用户创建不同的多路数据流来实现视频的采集、视频处理(DEI、Noise Filter、Encode、Decode、SwMs、Merge等)和视频播放功能,其框架设计非常值得学习。


以下为相关缩写解释:

*****************************************************************************************************

HDVPSS:High Definition Video Processing Subsystem

HDVICP:High Definition Video and Image CoProcessor

Ducati:Dual Core M3 Processors controlling HDVPSS and HDVICP hardware engines

Video M3:ARM Cortex M3 Core(inside Ducati subSystem)controlling HDVICP codecs

VPSS M3:ARM Cortex M3 Core(inside Ducati subSystem)controlling HDVPSS,also called DSS M3

DEI:Deinterlacer

McFW:Multi Channel Framework

IPC:Inter Processor Communication

******************************************************************************************************

1、Rdk平台软件框架图

     在Rdk平台软件中做了很好的分层,如下图所示:


注意:上图中核间通过Syslink/IPC通信,任意2个核之间都可以直接通信,是一个星型网络,上图画的连接关系描述的是对等层次的概念。

上图中相关层的功能及相关描述如下表所示:

处理器描述相关TI软件包
LinuxHOST A8

Linux OS, includes, filesystems,

SATA, Ethernet, USB and other

IO drivers

Linux PSP
BIOS6

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 RDK
Link 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.

McFW
McFW 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连接来实现chain,link API允许用户Create、Start、Stop、Delete、Control各个link。在Rdk中TI基于link API进行再次封装,用于特定的应用场合,其各种参数均是为特定的产品定制,可以是相关业务的开发更迅速。


3.2 link内部结构


3.3 link的特性

  • 视频处理的工作量可以均衡到每个核心上去执行,如下表:
Processor
OS
Used for
HOST A8LinuxSystem setup and control, GUI, IO peripheral control like SATA, Ethernet, USB, Audio
VPSS 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来识别,ID4位标识了这个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的部分接口及相关功能:

APIDescription
System_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 link
System_linkStartStart the link ——starts the driver or codec
System_linkControlSend a link specific control command with optional arguments
System_linkStopStop the link —— stops the driver or codec
System_linkDeleteDeletes a link —— free’s driver, codec, memory resources


3.7 Inter link API

    下面的表格介绍了在link内部实现的交换帧数据的API,对于用户来说,这部分API是不需要关心的:

APIDescription
System_GetLinkInfoCbFunction to return information about a link like number of channels, properties of each channel
System_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 reuse
System_LinkGetOutputBitBufsCbFunction to return generated or output bitstream frame to the caller (another link) –Valid only for Encode Link
System_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路通道数据跟别给2DEI Links模块处理。

    一个输出队列中可以有多个视频channels的数据,每个channel可以有不同的大小和数据格式;

    数据结构 FVID2_Frame是在VPSS驱动中定义的,Links之间就通过该结构参数传递帧数据的信息,如帧数据的Buf指针,而帧数据本身并不会被拷贝,从而节省内存开销;

    当一个Link采集完或处理完一帧数据后会发送一个消息“SYSTEM_CMD_NEW_DATA”给下游的Link,从而通知它有数据可取;当下游Link收到该消息后会调用System_getLinksFullFrames()函数来获取对用的帧数据,处理完后再调用System_putLinksEmptyFrames()函数来归还给上游Link继续使用。

因此一个Link需要知道:

  • 上游LinkLinkIDQueID,从而从该队列里面获取帧数据
  • 下游LinkID,从而在有新数据产生时通知下游Link来取

上游LinkLinkIDQueID 以及下游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,由于VideoVpss所在的2M3核心是同属于一个双核M3处理器,它们的cache是共享的;如降噪模块(VPSS NF)到编码模块(VIDEO Enc)之间传递帧数据,带有NotifyIPC ListMP机制被用来在这2M3核心之间传递帧信息(FVID2_Frame),该过程中不需要任何cache操作和地址转换。

  • Inter processor (M3 to A8 or DSP)

    即处理器内部核心之间,如编码(VideoM3)到BitStream In(HostA8)之间传递帧数据,同样使用带NotifyIPC ListMP机制2个核心之间传递帧信息(FVID2_Frame),但该过程中需要做cache同步和地址转换操作。


4、chain数据链路的建立

    一个Chain是由多个links按照一定的应用需求按顺序连接成一条视频处理的数据流。

    一个Chain可以销毁后重新按照新的需求组成新的Chain,不需要重启系统。

 Chain创建是特别需要相关link的顺序

  • 通过System_linkCreate()函数按照由source>>sink 的顺序创建需要的Links,Source Link即没有上游LinkLink,如:视频采集;Sink Link是没有下游LinkLink,如:视频播放;这个创建顺序是非常重要的,因为一个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的分享。

参考文献:

  1. DVR_RDK_McFW_Link_API_Training.pdf
  2. DM81xx_DVR_RDK_Overview.pdf
  3. TI NVR RDK Source Code
转自: http://www.360doc.com/content/15/0513/17/16524087_470220448.shtml

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/510597.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于函数计算自定义运行时快速部署一个 Springboot 项目

什么是函数计算&#xff1f; 函数计算是事件驱动的全托管计算服务。使用函数计算&#xff0c;您无需采购与管理服务器等基础设施&#xff0c;只需编写并上传代码。函数计算为您准备好计算资源&#xff0c;弹性地可靠地运行任务&#xff0c;并提供日志查询、性能监控和报警等功…

FFmpeg源代码简单分析:avformat_open_input()

登录 | 注册 收藏成功 确定收藏失败&#xff0c;请重新收藏 确定标题 标题不能为空网址 标签 摘要 公开 取消收藏 查看所有私信查看所有通知 暂没有新通知返回通知列表 下一条 上一条 分享资讯传PPT/文档提问题写博客传资源创建项目创建代码片baidu_34732018编辑自我介绍&…

硬之城携手阿里云 Serverless 应用引擎(SAE)打造低代码平台

硬之城成立于 2015 年&#xff0c;是一家以电子元器件 BOM 整体供应为核心&#xff0c;为中小科技型硬件企业提供 BOM 标准化、BOM 报价、BOM 采购、BOM 交付和 SMT 一站式 PCBA 服务的电子产业数字供应链与智能制造平台。 电子产业互联网的需求是离散和复杂多变的&#xff0c…

阿里云 Serverless 异步任务处理系统在数据分析领域的应用

异步任务处理系统中的数据分析 数据处理、机器学习训练、数据统计分析是最为常见的一类离线任务。这类任务往往都是经过了一系列的预处理后&#xff0c;由上游统一发送到任务平台进行批量训练及分析。在处理语言方面&#xff0c;Python 由于其所提供的丰富的数据处理库&#x…

代码重构:面向单元测试

重构代码时&#xff0c;我们常常纠结于这样的问题&#xff1a; 需要进一步抽象吗&#xff1f;会不会导致过度设计&#xff1f;如果需要进一步抽象的话&#xff0c;如何进行抽象呢&#xff1f;有什么通用的步骤或者法则吗&#xff1f; 单元测试是我们常用的验证代码正确性的工具…

如何把 thinkphp5 的项目迁移到阿里云函数计算来应对流量洪峰?

1. 为什么要迁移到阿里云函数&#xff1f; 我的项目是一个节日礼品领取项目&#xff0c;过节的时候会有短时间的流量洪峰。平时访问量很低。之前的架构是购买的阿里云alb多台ecs云msyql云redis。最大的问题就是成本问题。平时流量低的时候ecs成本也无法缩减。 阿里云函数计算…

[总结]视音频编解码技术零基础学习方法

0. 生活中的视音频技术 平时我们打开电脑中自己存电影的目录的话&#xff0c;一般都会如下图所示&#xff0c;一大堆五花八门的电影。&#xff08;其实专业的影视爱好者一概会把影视文件分门别类的&#xff0c;但我比较懒&#xff0c;一股脑把电影放在了一起&#xff09; 因…

Helm Chart 多环境、多集群交付实践,透视资源拓扑和差异

Helm Charts[1] 如今已是一种非常流行的软件打包方式&#xff0c;在其应用市场中你可以找到接近一万款适用于云原生环境的软件。然后在如今的混合云多集群环境中&#xff0c;业务越来越依赖部署到不同的集群、不同的环境、同时指定不同的配置。再这样的环境下&#xff0c;单纯依…

跨全端 SDK 技术演进

关于为什么要选择跨平台的实现方式 Write Once&#xff0c; Run AnyWhere. 越来越多的业务需求都有统一的业务诉求&#xff0c;按照传统的方式&#xff0c;在开发、测试、维护上的成本都是乘以N的&#xff0c;体验也很难做到一致性&#xff0c;特别是复杂的业务&#xff0c;实…

SKG 渠道中台借助 SAE + 大禹打造云原生 DevOPS,提效 60%

项目背景 未来穿戴健康科技股份有限公司&#xff08;SKG&#xff09;是一家专注为个人与家庭提供智能可穿戴健康产品的高新技术企业&#xff0c;专业从事 SKG 品牌可穿戴健康产品和便携式健康产品的研发、设计、生产及销售。 随着市场需求的迅速变化&#xff0c;SKG 的 IT 系…

资源预测数字模型搭建思路分享

业务背景 资源预测是项目管理过程中的一个环节&#xff0c;即通过搭建合适的数据模型&#xff0c;对未来的项目人力资源投入情况进行有效预测&#xff0c;可以更加精准的完成项目资源规划并能及时发现问题进行相关调整。 难题和痛点 PM排期时没有有效数据支撑资源使用情况&a…

视频压缩:I帧、P帧、B帧

/************************************************************************************************************************************************************************************** **说明&#xff1a; 1.本文通过整理而来&#xff0c;集多个高手的精华&a…

EasyNLP 中文文图生成模型带你秒变艺术家

导读 宣物莫大于言&#xff0c;存形莫善于画。 --【晋】陆机 多模态数据&#xff08;文本、图像、声音&#xff09;是人类认识、理解和表达世间万物的重要载体。近年来&#xff0c;多模态数据的爆炸性增长促进了内容互联网的繁荣&#xff0c;也带来了大量多模态内容理解和生成…

阿里本地生活全域日志平台 Xlog 的思考与实践

1. 背景 程序员学习每一门语言都是从打印“hello world”开始的。这个启蒙式的探索&#xff0c;在向我们传递着一个信息&#xff1a;“当你踏进了编程的领域&#xff0c;代码和日志将是你最重要的伙伴”。在代码部分&#xff0c;伴随着越来越强大的idea插件、快捷键&#xff0…

关于运维,阿里云、字节、华科的专家如是说

只有今天周密的“运”筹帷幄&#xff0c;才有将来持续的“维”护稳定。不久前&#xff0c;阿里云联合中国计算机行业协会信息存储与安全专业委员会&#xff0c;邀请到了来自阿里云、字节跳动、华中科技大学的多位专家&#xff0c;共同探讨数字经济时代存储系统的运维之道。 一…

行业 SaaS 微服务稳定性保障实战

很多研发人员在日常工作中经常回遇到以下两个问题&#xff1a;竟然不可以运行&#xff0c;为什么&#xff1f;竟然可以运行&#xff0c;为什么&#xff1f; 因此&#xff0c;他们非常期望可观测能够提供解决问题的思路。 引言 2017 年&#xff0c;推特工程师 Cindy 发表了一篇…

阿里云全站加速 DCDN 重磅发布!打造新一代加速引擎

在数字化转型变革逐步深入的当下&#xff0c;安全高效成为企业上云、全球化部署的关键需求。 随着应用场景复杂度不断提升、业务需求差异化发展&#xff0c;为了给企业提供更完善的安全加速服务&#xff0c;阿里云对全站加速DCDN产品进行了全面升级&#xff0c;针对边缘安全防…

阿里云云原生一体化数仓 - 数据安全能力解读

MaxCompute产品简介 MaxCompute是一款多功能、低成本、高性能、高可靠、易于使用的数据仓库和支持全部数据湖能力的大数据平台&#xff0c;支持超大规模、serverless和完善的多租户能力&#xff0c;内建企业级安全能力和管理功能&#xff0c;支持数据保护和安全共享&#xff0…

EMT4J——让 Java 应用升级更轻松

前言 JDK 升级对于 Java 应用来说是不得不面对的事情&#xff0c;一方面 Java 生态系统希望 Java 应用能跟上最新 JDK 版本&#xff1a; Oracle 建议将 JDK 的 LTS 版本的发布周期从 3 年调整为 2 年,对于只使用 LTS 版本的应用来说,可以在更短时间内使用最新的技术&#xff…

多年锤炼,迈向Kata 3.0 !走进开箱即用的安全容器体验之旅

一、Kata 的过去 让我们将时钟拨回 2015 年 5 月&#xff0c;Hyper.sh 和 Intel 开源技术中心的工程师们分别独立发布了runV 和 Clear Containers 的虚拟化容器项目&#xff0c;而这两个项目便是 Kata Containers1 的前身。这两个项目互相有很多交流&#xff0c;在分别独立发展…