OSD

1. 工作原理

1.1 Process link

OSD link是所谓的process link。即,该link没有output queue,而是直接在input queuebuffer上做操作。其数据流向如下图

1. prev linkframe buffer送给processinput queue

2. process linkinput queue中取出buffer,对buffer的数据进行操作

3. process link将该buffer归还给prev linkempty queue

4. prev link检测到该buffer是从一个process link还回来的,于是又将其发送到next link去。

1.2 OSD简述

OSD Link功能运行在C67 DSP核上,一般工作在Capture Link之后,用来在采集到的视频帧上叠加一个图片(LOGO或是标题等)。待叠加的图片pic存放在共享内存SR0中(RGB或者YUV点阵格式)。当一帧数据framecapture link送到OSD linkDSP首先启动EDMApicframe的一部分从共享内存和DDR中搬移到内部L2中去。然后DSP根据预先设置的alpha参数,对picframe相应位置的每一点做alpha blend。计算好的结果被EDMA搬回输入的frame buffer中去覆盖原有的数据。由于OSD link属于Process link,该frame buffer会被送到下一个link中去,从而完成OSD效果。

 

 

2. 工作流程

1. DSPmain程序创建system_main线程,system_main中调用AlgLink_init。

2. 进入AlgLink_init,创建两个AlgLink的实例。对于每一个实例,调用System_registerLink和创建task

System_registerLink主要是为了注册下面几个回调函数

        linkObj.linkGetFullFrames   = NULL;

        linkObj.linkPutEmptyFrames  = NULL;

        linkObj.linkGetFullBitBufs  = AlgLink_getFullBufs;

        linkObj.linkPutEmptyBitBufs = AlgLink_putEmptyBufs;

            linkObj.getLinkInfo         = AlgLink_getInfo;

其中linkGetFullBitBufs是为了给next link从本linkoutput queue获取bitstream buffer,而linkPutEmptyBitBufs则给next link将用完的buffer归还给本link

由于OSD本身没有output queue,所以这两个函数实际是给共用AlglinkSCD算法使用的。

3. 创建AlgLink_tskMain线程。

4. 进入AlgLink_tskMain,当收到一条create消息时,进入下列处理,否则直接丢掉该消息返回。

5. 进入AlgLink_algCreate,内部实际是调用AlgLink_OsdalgCreate。

6. 进入AlgLink_OsdalgCreate。该函数主要做了两方面的事,一是根据传入的create arg,设置OSD的运行context(其实就是拷贝到本地的一些变量中保存啦)。二是调用SWOSD_open。

7. SWOSD_open主要为了注册两个数据结构:SWOSD_TI_IALG和SWOSD_TI_IRES。这两个是TI XDAIS标准规定的算法标准接口。前一个主要关注算法的memory需求和分配,后一个关注算法对DMA资源的需求。我们下面分开来说。

l SWOSD_TI_IALG

#define IALGFXNS  \

    &SWOSD_TI_IALG,  /* module ID */                         \

    NULL,            /* activate */                          \

    SWOSD_TI_alloc,  /* alloc */                             \

    NULL,            /* control (NULL => no control ops) */  \

    NULL,            /* deactivate */                        \

    SWOSD_TI_free,   /* free */                              \

    SWOSD_TI_initObj,/* init */                              \

    NULL,            /* moved */                             \

    SWOSD_TI_numAlloc            /* numAlloc (NULL => IALG_MAXMEMRECS) */

       这几个函数都是为了让Application来分配算法所需要的memory资源。Application首先调用SWOSD_TI_numAlloc,得到需要的IALG_MemRec个数。每一个memRec代表一个内存块的需求,包括分配区域,内存块大小,对齐等属性。然后Application根据该个数,分配相应个数的IALG_MemRec大小的buffer,将该buffer当做参数调用SWOSD_TI_alloc。算法的SWOSD_TI_alloc函数负责填写各个IALG_MemRec结构的大小,内存区域,对齐等属性,除了base addressApplication然后根据填好的各IALG_MemRec从相应的内存区分配memory,并将分配好的memory buffer地址填入base address字段。最后将整个IALG_MemRec数组传入SWOSD_TI_initObj。算法用Application分配好的memory来完成自己的初始化。

实际上,TI为了简化操作,实现了一套framework来完成这些。在SWOSD_OPEN中,我们可以看到,通过调用DSKT2_createAlg函数,将SWOSD_TI_IALG这一套函数指针传入即可完成上面的交互过程。

   对于OSD ALG来说,其需要的内存区有两个(memTab[2])memTab[0]用来存放OSD_obj的内容,也就是运行的一些contextmemTab[1]用来进行一行的blend运算。假设一行宽度为Npixel,每个pixel需要Mbytes,则需要的内存大小为N*M*[1(blend输入1)+1blend输入2+ 1( output buffer) +1 (alpha matrix)]*2(ping pong buffer)

其中blend输入12分别对应video bufferosd picture的一行。Alpha matrix暂时并未实现,其目的本来是为了可以对每一个像素点指定一个alpha值。这两个内存区都是从DSPL2里分配。

 

l SWOSD_TI_IRES

该结构与SWOSD_TI_IALG类似,只不过其分配的是DMA资源。这里不再详细描述。注意framework也封装了一个类似的RMAN_assignResources来完成交互过程。

OSD alg总共需要5EDMA通道

#define SWOSD_DMA_CH_IN_A  0x0 

#define SWOSD_DMA_CH_IN_B  0x1

#define SWOSD_DMA_CH_ALP   0x2   //传送alpha matrix,暂无试用

#define SWOSD_DMA_CH_OUT  0x3

#define SWOSD_DMA_CH_AUX  0x4   //用来在alpha值为0x80时,用来完成单纯的覆盖而不是blend。暂无使用。

 

8. SWOSD_open执行完,AlgLink_algCreate执行完,即可进入消息处理循环。与OSD功能相关的是两个消息: ALG_LINK_OSD_CMD_SET_CHANNEL_WIN_PRM和SYSTEM_CMD_NEW_DATA。

9. 一般来说,create后应该先收到ALG_LINK_OSD_CMD_SET_CHANNEL_WIN_PRM消息来设置每一通道的OSD属性。存放OSD图片的SR0 buffer地址也是在这时传入。在demo程序中,这一动作是在Vcap_setDynamicParamChn中完成。

10. 当收到SYSTEM_CMD_NEW_DATA时,进入AlgLink_algProcessData。该函数首先调用System_getLinksFullFrames,从prev link中取得frame buffers。然后调用AlgLink_OsdalgProcessFrame处理每一个frame buffer,最后调用System_putLinksEmptyFrames将处理完的frame buffer返还前一个link

11. AlgLink_OsdalgProcessFrame调用SWOSD_blendWindow分别对Y plane(亮度)C planeUV通道)进行处理。

12. SWOSD_blendWindow首先调用RMAN_activateAllResources,在OSD算法中,这实际是一个空操作。然后调用SWOSD_TI_algRun核心算法。

13. SWOSD_TI_algRun使用了3EDMA通道,记为SWOSD_DMA_CH_IN_A,SWOSD_DMA_CH_IN_BSWOSD_DMA_CH_OUT。SWOSD_DMA_CH_IN_A负责将OSD图像中的一行从SR0搬移到L2ping-pong buffer中,SWOSD_DMA_CH_IN_B负责将video frame中的一行从frame buffer中搬移到L2ping-pong buffer,而SWOSD_DMA_CH_OUT负责将blend后的数据从L2 ping pongbuffer中搬移到video frame中。

其流程如下:

等待SWOSD_DMA_CH_IN_A和SWOSD_DMA_CH_IN_B ping buffer的搬移完成

SWOSD_DMA_CH_IN_A和SWOSD_DMA_CH_IN_B启动pong buffer的搬移。

DSP计算alpha blend的值,写入L2out pong buffer

等待SWOSD_DMA_CH_OUT ping buffer搬移完成

启动SWOSD_DMA_CH_OUT pong buffer的搬移

 

其中ping pong buffer的切换由EDMA参数自动变换,运行过程中无需再手动切换ping pong buffer地址。

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

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

相关文章

代码重构:面向单元测试

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

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

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

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

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

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

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

跨全端 SDK 技术演进

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

ffmpeg开发指南(使用 libavformat 和 libavcodec)

ffmpeg开发指南(使用 libavformat 和 libavcodec)Ffmpeg 中的Libavformat 和 libavcodec库是访问大多数视频文件格式的一个很好的方法。不幸的是,在开发您自己的程序时,这套库基本上没有提供什么实际的文档可以用来作为参考&#…

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

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

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

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

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

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

浅谈大数据背景下数据库安全保障体系

现阶段大数据产业的快速发展创造了极大的经济效益,大数据的出现推动了社会经济发展,但是随之而来的数据库安全问题也引起了学者对大数据信息安全问题的反思。大数据时代下的信息与隐私安全问题已经成为全球性重点关注的问题,为了能够更有效地…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

从函数计算到 Serverless 架构

前言 随着 Serverless 架构的不断发展,各云厂商和开源社区都已经在布局 Serverless 领域,一方面表现在云厂商推出传统服务/业务的 Serverless 化版本,或者 Serverless 计算平台,另一方面表现在开源社区中 Serverless 相关项目逐渐…

PolarDB B-tree 并发控制优化

InnoDB 索引 InnoDB 引擎使用索引组织表,每个表的数据都放在一个对应的索引中,该索引称为聚集索引(clustered index),使用索引组织表的目的是: 动态地组织磁盘文件结构,维护数据记录有序&…