处理器/DSP
设计并实现了一种基于OMAP3730的低成本高清屏媒系统,能够充分发挥可编程C64+DSP的强大计算功能, 利用硬件实现常用视频格式的高清硬解码播放,利用软件兼顾不常有视频格式的解码播放,同时针对屏媒系统的特点利用DSP实现转屏,达到在横屏和竖屏上的自适应播放的效果。
随着移动互联技术的不断发展和应用,多媒体技术以其不可阻挡的趋势渗入到人们的工作和生活中,数字视频是多媒体技术里比较复杂的领域,如何在低成本、低功耗的环境中实现高质量的数字视频应用是各家公司竞争的焦点。低功耗的ARM对外设支持比较全面,但计算能力较差;基于哈佛结构的DSP计算能力强大,但对外设的支持很弱。OMAP3730是TI推出的一款ARM+DSP双核异构处理芯片,其中ARM核为1GHz COTEX-A8,DSP核为800MHz的可编程C64+DSP。
本文设计并实现了一种基于OMAP3730的低成本高清屏媒系统,能够充分发挥可编程C64+DSP的强大计算功能, 利用硬件实现常用视频格式的高清硬解码播放,利用软件兼顾不常有视频格式的解码播放。该系统还针对屏媒系统的特点利用DSP实现转屏,实现在横屏和竖屏上的自适应播放。整个系统流程如图1所示。
1 视频类型判断和解码
本文用GstDiscover来判断视频文件的类型,GstDiscover是GStreamer库提供的一个工具,接受输入URI或者URI列表,返回它们的信息。GstDiscover返回的信息一般较多,我们重点关注返回信息中的视频编码以及视频的分辨率,根据这些就能判断该视频是否可以硬件加速。GstDiscover的一个典型的输出如图2所示,给出了该文件的封装信息video/webm;音频信息:音频编码audio/x-vorbis,通道数2,比率48000;视频信息:视频编码video/x-vp8,宽度854,高度480,帧率25。
具体的实现可以利用QT中的QProcess通过命令行的形式调用GstDiscover,使用QProcess的readAllStandardOutput函数读取所有输出结果。在输出结果中用正则表达式查找关键字“audio:”和“video:”从而得到相关的视音频信息。
GStreamer是一个基于管道的多媒体框架,能够提供组件化的多媒体处理功能。框架中的所有的功能模块都被实现成可以插拔的组件,并且在需要的时候能够很方便地安装到任意一个管道上,由于所有插件都通过管道机制进行统一的数据交换,因此很容易利用已有的各种插件“组装”出一个功能完善的多媒体应用程序。这种松耦合的架构很容易实现编解码的模块化。TI的GStreamer插件使用DMAI来访问底层硬件,使得DSP的应用变得容易。GStreamer在运行时作为ARM处理器上的应用程序,并通过使用DMAI来对DSP和加速模块进行调用,以实现硬件编解码。GStreamer的应用实现了公共组建的最大可复用性,提高了系统框架的可移植性。
元素(elements)是GStreamer中最重要的概念,你可以把一组元素链接到一起组成一个链,然后让数据流依次通过这个链中的每个元素。每个元素具有某个特定的功能,比如有的元素能够从文件读数据,有的元素可以实现视频解码,有的元素负责把数据输往声卡等等。通过把元素串接在一起,可以实现管道。管道是用来实现特定任务的,比如媒体回放或者视频捕捉。GStreamer默认提供了大量的元素,这使得开发大量媒体应用成为可能。如果需要你也可以自己创建新的元素。接口(pads)是元素上数据输入和输出的地方,接口分两种,输入数据的接口(sink)和输出数据的接口(src)。通过连接接口可以把两个元素链接到一起,相连接的接口必须支持相同的数据格式。容器(bin)是一种特殊的元素,容器本来是一组连接在一起的元素的集合,但是对外容器表现的像一个元素一样。管道(pipeline)是一种高层容器,为应用层提供了总线机制,并实现元素响应的同步化。
一个简单的ogg播放器的管道如图3所示,每个小框代表一个元素。源元素从文件源读取数据发往ogg分解器。该分解器把复合数据流分解成视频数据流和音频数据流,然后分别发往视音频解码器。音频解码器接收到数据后进行解码后把数据发往音箱,视频解码器解码后数据发往显示,从而实现视音频的同步播放。
本文引用地址:http://www.eepw.com.cn/article/273271.htm
基于DSP硬解码就是把GStreamer管道中的耗费计算时间的元素替换成可以用DSP加速的元素。一个基于DSP硬解码的管道如图4所示,与上面的例子的不同在于,视频解码元素被替换成了TIViddec,音频解码元素被替换成TIAuddec,显示元素被替换成了TIDmaiVideoSink.
OMAP3730通过GStreamer的组件来提供基于硬件的视音频编解码功能,在数字视频、影像、语音和音频上可以支持H.264、MPEG4/2、H.263、VC1、JPEG、G.711/G.723、MP3、WMA等多种编解码器。所以对于OMAP3730支持硬解码的格式,我们用GStreamer来播放,对于不支持硬解码的格式我们采用Mplayer播放,因为Mplayer对各种格式的兼容性和稳定性比GStreamer要好一些。
2 基于DSP的转屏
横屏和竖屏各有优点,横屏符合播放习惯,竖屏占用的地盘少。Linux系统在嵌入式系统上默认是以横屏的方式启动,要让系统支持竖屏有两种方法,一种是系统方法,一种是通过应用软件的方法。系统的方法可以实现转屏,但是在播放高清视频时,由于系统负载较大容易崩溃,所以我们采用应用软件的方法实现DSP转屏。应用软件转屏分成播放界面转屏和视频画面转屏两部分。我们的应用软件界面利用QT实现的,可以通过设定系统变量export QWS_DISPLAY=transformed:::rot90:0 实现界面转屏。视频画面转屏又分GStreamer和Mplayer播放两种情况。对于GStreamer的播放,我们可以实现一个类似于gsttividresize的转屏元素,将该元素插入到管道中TIViddec和TIDmaiVideoSink之间实现转屏。对于Mplayer的转屏,可以在Mplayer源码库中vo目录下新建一个画面反转插件,在播放视频时通过命令字“-vo”强制使用画面反转插件。
TI将常用的DSP算法封装成统一的名为C6Accel的软件接口供开发人员调用。按函数功能C6Accel又分为信号处理、图像处理、数学运算3个库。其中信号处理包括傅立叶变换、逆傅立叶变换、自相关、自相关、点乘、矩阵乘、FIR滤波、IIR滤波等功能;图像处理包括sobel边缘检测、直方图、卷积、相关度、中值滤波、矩阵运算、图像编码转换等功能;数学库主要包含四则运算、三角函数等功能。
画面旋转的本质是一个矩阵转置操作,可以通过DSP完成。在浮点DSP核上可以通过硬件实现矩阵转置的功能,该功能被封装在函数C6accel_DSPF_sp_mat_trans里面,可以直接调用。由于OMAP3730提供的是定点DSP缺少一个浮点辅助运算器,无法通过硬件实现矩阵转置,只能通过软件实现。
3 总结
功耗的ARM对外设支持比较全面,但计算能力较差;基于哈佛结构的DSP计算能力强大,但对外设的支持很弱。本文设计实现的基于OMAP3730的低成本高清屏媒系统,能够充分发挥可编程C64+DSP的强大计算功能,兼顾了ARM和DSP的优点,在嵌入式数字视频领域有广泛的应用前景。
全部0条评论
快来发表一下你的评论吧 !