基于OMAP的MPEG-4实时解码器的实现

2024-01-14 09:30

本文主要是介绍基于OMAP的MPEG-4实时解码器的实现,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

基于OMAP的MPEG-4实时解码器的实现

[日期:2008-8-6]来源:电子技术应用  作者:姜 超 刘济林 王兴国[字体: ]
<script src="http://www.21ic.com/innews.js"></script>

 

 随着移动通信和多媒体技术的发展,人们对通信的要求已不满足于传统的语音业务,而是追求更高品质的视频、音频等多媒体信息服务。在多媒体通信中,视频区别于音频和文字的显著特点是其大数据量以及高处理复杂度。现有的移动终端一般采用DSP芯片作为核心,DSP芯片在数据处理方面具有较多的优势,但其系统处理和控制能力比较弱。第三代移动通信(3G)终端需要提供更多更复杂的服务如实时视频交互等,原有的DSP芯片很难满足这些需求[1]。TI公司提出了开放式多媒体应用平台OMAP(Open Multimedia Applications Platform)体系结构,并为此设计了OMAP处理器。笔者利用本文提出的方法在使用TI OMAP1510的PocketPC上实现了MPEG-4简单级(simple profile)解码,基本满足了实时的要求,同时保持了较好的质量。
1 开放式多媒体平台(OMAP)
    OMAP采用一种独特的双核结构,把控制性能较强的ARM处理器与高性能低功耗的DSP核结合,是一种开放式的、可编程的基于DSP的体系结构。主要目标是满足2.5G和3G网络上移动电话、PDA上的语音与多媒体需要。
1.1 OMAP的硬件平台
    OMAP硬件平台主要由DSP核、ARM核以及业务控制器(Traffic Controller)组成。这三部分可以独立地进行时钟管理,有效地控制功耗。OMAP硬件平台采用双核技术提高操作系统的效率和优化多媒体代码的执行。实时性任务如实时视频通信等由DSP完成,非实时性任务和系统控制工作如界面交互、操作系统等由ARM完成[2]。例如,使用者在进行视频通信时可以同时使用操作系统上的应用软件如Word、Excel等,这样分别利用了DSP低功耗而又较强数据处理能力和ARM的较强控制能力的优势。与传统只使用ARM或者只使用DSP芯片的移动终端相比,OMAP成功地解决了性能与功耗的最佳组合问题。
    OMAP硬件平台不断升级,以满足日益增长的应用需求。本文使用OMAP1510芯片,它的两个关键部分是TI增强型ARM925(TI925T)和TMS320C55x DSP。TMS320C55x DSP的工作主频为200MHz,内部有32K字双存取SRAM,48K字单存取SRAM和12K字的高速指令缓存。它具有高度的并行能力,32位读写和功能强大的EMIF、双流水线的独立操作以及双MAC的运算能力。它采用了三项关键的革新技术:增大的空闲省电区域、变长指令、扩大的并行机制。此外TMS320C55x DSP核增加了处理运动估计、离散余弦变换(DCT)、离散余弦反变换(IDCT)、1/2像素插值的硬件加速器,降低了视频处理的功耗,其结构对于多媒体应用高度优化,适合低功耗的实时语音图像处理。TI增强型ARM925采用ARM9TDMI技术,工作主频为175MHz,有16K字节的高速指令缓存、8K字节的高速数据缓存和17个字的写缓冲。ARM和DSP都可以访问内部SRAM和外部存储器接口,但ARM是平台的核心,它能访问全部16M字节的内存空间和DSP的128K字节的I/O空间。
1.2 OMAP的软件平台
    OMAP的软件结构建立在两个操作系统之上,一个是基于ARM的操作系统如WindowsCE、Linux等;另一个是基于DSP的实时操作系统(RTOS)DSP/BIOS。无缝连接两个操作系统的关键技术是DSP/BIOS桥。DSP/BIOS桥建立的这种连接使ARM端的客户能与DSP上的任务交换信息和数据[3]。对于软件开发者来说,DSP/BIOS桥提供了一种使用DSP的无缝接口,开发者可以在GPP(通用处理器,包括ARM)上使用标准应用编程接口访问并控制DSP的运行环境。
2 MPEG-4实时视频解码在OMAP上的软件实现
2.1 MPEG-4解码流程

    MPEG-4标准因其给出多种抗误码工具而适于应用在无线信道环境下的多媒体通信[4]。本文实现的是主要应用于无线通信的简单级(simple profile)[5],因而只使用了I帧和P帧。其解码的流程如图1所示。如果是I帧,码流中主要是纹理信息,经过可变长(VLC)解码、反扫描、反预测、反量化和反DCT(IDCT)可以直接得到重构的帧。如果是P帧,码流中还含有运动矢量信息,经过VLC解码、反扫描、反预测、反量化和反DCT得到的只是残差信息。利用解码得到的运动矢量、残差信息和参考帧进行运动补偿可以得到重构的帧。

 


2.2 在OMAP1510上的程序结构
    在OMAP上开发程序通常分为两部分,一部分是使用Embedded Visual C开发ARM端程序,另一部分是使用TI CCS开发DSP端程序。前者主要是为了使设计的算法与xDAIS(eXpressDSP TM算法标准)兼容,在ARM端程序中调用一些DSP/BIOS桥的API实现在DSP上初始化信号处理任务、与DSP任务交换消息、对来自DSP和从DSP发出的数据流进行缓冲、暂停、继续、删除DSP任务并进行资源状态查询等。而具体的功能实现则是在DSP端完成。图2显示了TI-enhanced ARM925应用程序与DSP节点之间的关系。

 


    通过写节点封装器的创建、执行及删除函数,将xDAIS算法封装于DSP节点中。创建函数可分配节点处理和xDAIS算法所需的存储器,还可分配节点的相关模块。这些模块是传递到执行和删除函数的一种结构。创建函数还可给出xDAIS算法的实例,并可将其激活,还可初始化任何在任务执行前必须初始化的数据或参数。执行函数是主要的分派函数,在此函数执行阶段中一般不分配存储器及其它资源。执行函数一般包括消息处理循环,该循环可中断函数并等待来自ARM925的消息或数据流,然后节点将这些消息或数据分派到合适的xDAIS控制或处理任务中去。同时执行函数查询DSP/BIOS桥所发送的指示函数退出循环的特殊消息,然后检查定制消息或流数据,并对这些消息或数据流进行适当处理。删除函数清空创建函数所分配的资源,包括相关模块和数据流。删除函数还必须关闭算法、释放存储器以及分配给节点的其它资源。
2.3 程序的优化考虑
    (1)合理分配存储位置。TMS320C55x的片内存储器容量小而存取速度快,片外存储器容量大但存取速度慢。在分配存储器的时候应考虑到这个特点合理地安排程序各部分。对于那些使用频繁的变量应考虑放在片内,如VLC表、运动矢量、反量化、反DCT的系数以及其它中间变量都应放在片内,而对于那些执行次数比较少或者比较大的变量如参考帧和当前解码出的帧则应该放在片外。此外由于编译和分配空间是以文件为单位的,所以应当把使用频繁的函数尽量放在相同的几个文件中,再将这几个文件放入片内存储器以高效地利用有限的片内资源。
    (2)数据传输的管理。对于视频解码工作来说,TMS320C55x的片内存储器资源不是很多,必须合理利用。例如一帧4:2:0的QCIF(176×144)图像,如果以紧凑的方式(2个字节存到一个16bit的字中)存放也需要18K字。因此不可能在解码时把一整帧都放在片内,而应考虑使用DMA在需要时把图像的一部分传入片内进行处理。此外,为了使CPU访问和DMA传输同时无冲突地进行,将数据访问设计成乒乓结构。在解I帧时片内准备两个大小为一宏块行的存储区用于存放YUV数据,CPU将解码的一宏块行数据放在其中一块后,DMA把这一宏块行的数据传输到片外对应的位置,同时CPU解下一宏块行的数据并将结果放在另外一块存储区,DMA再传送此块的数据,如此反复执行。选择两宏块行大小的原因是不能使用片内太多的存储器资源,同时如果每次解码传输的数据太少将过于频繁地启动DMA,导致效率下降,折衷考虑决定在片内为解码数据开辟两宏块行大小的缓存。而在解P帧的时候因为要先读入参考帧的某些数据所以更为复杂。在片内开辟两块缓存,用以存放对Inter宏块进行运动补偿所需的参考帧中对应搜索范围内的数据,同时准备两个宏块大小的片内空间用于存放当前宏块解码的结果(为描述方便称为M1和M2)。此时需要使用两个DMA通道,通道1负责将解当前宏块进行运动补偿时所需的参考帧部分数据读到片内缓存中,通道2负责将解码的数据传输到片外对应的空间。先启动通道1读所需参考帧数据到缓存1,CPU用这些数据和读入的码流对Inter宏块进行运动补偿解出当前宏块的数据放入M1,同时通道1读下一宏块所需的参考帧数据到缓存2。之后CPU、通道1、通道2并行工作,CPU利用缓存2的数据解下一宏块放入M2,通道1再读数据到缓存1中,通道2将解码的数据从M1传输到片外对应的空间,如此循环,P帧利用DMA解码如图3所示。

 


    (3)使用TI提供的IMGLIB库函数。IMGLIB是专门为图像处理和视频提供的库,用来提高视频处理速度。这些库函数中有的是软件库函数,是用汇编写成的高效代码例如反量化函数IMG_dequantize_8x8等;有的则是硬件库函数,它们利用OMAP1510芯片中一些专门为视频编解码的硬件加速模块来处理数据,如利用反DCT模块的IMG_idct_8x8等,这些函数处理数据的速度更快,效率更高。在使用某些库函数的时候需要按照其接口的要求调整。
    (4)使用DSP内部固定的intrinsics指令,这些指令主要执行一些简单的算术操作,由于它们是由优化的汇编代码写成,因而使用它们可以提高代码执行的效率。
    (5)其它一些优化考虑和措施。为了使程序的效率更高,采用了一些代码优化的措施,例如将一些循环内部展开,特别是对多重循环的控制,如果外层循环较少,可将内层循环展开,把转移条件结合起来,以减少内层与外层之间的相互联系,减少判断转移并实现并行操作。又如利用DMA来代替原有的复制函数、为方便将浮点数定点化、使用移位操作代替乘除法等。此外,在应用到多媒体通信中,采用支持数据分割的方法来有效控制无线通信中可能产生的误码。
3 测试结果
    使用QCIF(176×144)的两测试码流foreman和carphone(各编码100帧)在使用数据分割和没使用数据分割的情况下得到的解码速度(包括显示部分)如表1所示。

 


    从表1可以看出,本文提出的方法基本上能够满足MPEG-4实时解码的需求,即使对比较复杂的使用数据分割的序列,仍能达到25帧/秒(fps)以上,图像的质量也比较好,因此适合在无线终端实现多媒体的应用。
    OMAP平台因其独有的双核结构和为无线应用提供了一个强大的软硬件基础。本文结合其在MPEG-4解码中应用的实例,具体阐述了OMAP1510的软件优化开发方法,并基本上实现了实时解码,希望能对使用OMAP或准备使用的开发人员具有借鉴意义。
参考文献
1 Jamil Chaoi. Dedicated Systems Magazine. 2001 Q2.
2 谢 凯.开放式的多媒体应用平台OMAP.电子技术应用,2001;27(11)
3 TI公司. OMAP1510 Multimedia Processor Technical Reference Manual. Dec.2002
4 宋 彬,常义林.视频通信抗误码方法研究的新进展.电子学报,2002;(10)
5 ISO/IEC JTC 1/SC 29/WG 11 N 3056, Information technology-Coding of audio-viusal objects-Part2:Visual, Version 1.0, Jan ,2000

这篇关于基于OMAP的MPEG-4实时解码器的实现的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/604694

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略

Kubernetes PodSecurityPolicy:PSP能实现的5种主要安全策略 1. 特权模式限制2. 宿主机资源隔离3. 用户和组管理4. 权限提升控制5. SELinux配置 💖The Begin💖点点关注,收藏不迷路💖 Kubernetes的PodSecurityPolicy(PSP)是一个关键的安全特性,它在Pod创建之前实施安全策略,确保P

工厂ERP管理系统实现源码(JAVA)

工厂进销存管理系统是一个集采购管理、仓库管理、生产管理和销售管理于一体的综合解决方案。该系统旨在帮助企业优化流程、提高效率、降低成本,并实时掌握各环节的运营状况。 在采购管理方面,系统能够处理采购订单、供应商管理和采购入库等流程,确保采购过程的透明和高效。仓库管理方面,实现库存的精准管理,包括入库、出库、盘点等操作,确保库存数据的准确性和实时性。 生产管理模块则涵盖了生产计划制定、物料需求计划、

C++——stack、queue的实现及deque的介绍

目录 1.stack与queue的实现 1.1stack的实现  1.2 queue的实现 2.重温vector、list、stack、queue的介绍 2.1 STL标准库中stack和queue的底层结构  3.deque的简单介绍 3.1为什么选择deque作为stack和queue的底层默认容器  3.2 STL中对stack与queue的模拟实现 ①stack模拟实现

基于51单片机的自动转向修复系统的设计与实现

文章目录 前言资料获取设计介绍功能介绍设计清单具体实现截图参考文献设计获取 前言 💗博主介绍:✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师,一名热衷于单片机技术探索与分享的博主、专注于 精通51/STM32/MSP430/AVR等单片机设计 主要对象是咱们电子相关专业的大学生,希望您们都共创辉煌!✌💗 👇🏻 精彩专栏 推荐订阅👇🏻 单片机