AM335x 的解决方案
AM335x 是TI 新近推出的基于ARM Cortex-A8 的SOC,外设丰富,主要针对工业应用领域。针对异步控制卡应用,TI 也提供了基于Linux 的解决方案。下面将从硬件和软件两方面分别介绍该方案。
3.1 硬件方案
AM335x 具有一个强劲的核心Cortex-A8,该核的运算能力可达2.0DMIPS/MHz, 而且AM335x的主频可到1GHz,即运算总的能力可达2000 DMIPS,可流畅解码640x480 的MPEG4 视频流,而且有足够的运算余量绘制各种UI。
此外,AM335x 还有一个3D 图形加速核,SGX530,可支持OpenGL ES2.0。TI 在OpenGL ES2.0 之上提供了相应的软件方案,将SGX530 用于视频帧的尺寸缩放以及实现对UI 层和视频层的透明叠加的加速,后面软件部分会详细介绍该方案。
同时,AM335x 具有丰富的外设,如下图所示:
图 3 AM335x 异步控制卡硬件模块图
由上图可见AM335x 可完全涵盖所有异步控制卡的外设需求,不需要其他扩展。因此,总体成本具有很强竞争力。
TI 的开发板GP EVM(可查阅参考文档 [1] )都可以很便利的进行LED 应用的评估和开发,下文中的软件方案是以GP EVM 为平台进行开发的。
3.2 软件方案
软件方案主要分为操作系统和应用软件两大块,具体介绍如下。
3.2.1 操作系统
如前所述,Linux 是异步控制卡的主流操作系统,因此,本方案也选择了Linux 作为平台。AM335x EZSDK 提供了Linux 的完整开发包,包括板级支持包,交叉编译器,文件系统等,可查阅参考文档 [2] 。
3.2.2 软件模块
• UI
在基于Linux 的异步控制卡平台上,QT 以免费,开源,开发资料全以及在嵌入式系统上运行效率高等特点,已经成为异步控制卡厂商开发UI 主要的平台。在EZSDK 中已包含对QT4 的移植,可查阅参考文档[3]。QT 在开源网站上也有很丰富的资源,可查阅参考文档 [4] 。
• 多媒体
在EZSDK 中提供Gstreamer+ffmpeg的多媒体解决方案,可查阅参考文档[5] 和参考Gstreamer文档(参考文档[6])。在多媒体中,由于格式比较多,各种编码的复杂度以及编码质量差异较大是一个难点。而在LED 显示墙的应用场景中,多媒体码流可接受转码方式,所以可指定码流的格式。这里,推荐的多媒体格式MP4(MPEG4+AAC),其中MPEG4 选择simple profile,对此种码流,若分辨率为640x480,AM335x 可流畅解码每秒25 帧以上。
• 显示后端
AM335x 只有一个功能简单的LCD 控制器,该控制器只支持RGB 格式,其在Linux 中的驱动为framebuffer,可查阅参考文档 [7] 。相应的上述两个模块的显示后端也以framebuffer 为基础:
Gstreamer的后端显示插件采用fbdevsink。由于视频解码后的格式为YUV 格式,而AM335x 自带的LCD 控制器只支持RGB 格式,因此此处可使用Gstreamer的插件ffmpegcolourspace进行色度空间的转换
QT 默认以framebuffer 为显示后端。
Framebuffer 会接收来自QT 和Gstreamer的图像帧数据,然后进行OSD 的叠加和缩放等操作,数据流如下图所示:
图 4 默认软件方案数据流程图
3.2.3 软件复杂度分析
在图4 中,深色模块为运算较密集模块,具体分析如下:
• Gstreamer的解码和ffmpegcolourspace(CSC plugin)两个模块。
ARM 虽然有较强的运算能力,但对于较大分辨率的视频解码,视频解码的宏块运算等需较大运算量。另外,色度空间涉及浮点运算,而且为逐点运算,所以运算量需求也不小。
以640x480 分辨率的MP4(MPEG4 simple profile+AAC) 为例,若帧率为30fps 时,ARM 核的loading 在91%左右,其中ffmpegcolourspace模块约占运算量的50%。
• Framebuffer 模块。
在该模块中的 OSD 叠加指的是 UI 图层和视频图层之间的叠加,而且是包含带透明度的叠加,而图层的缩放是指对原图等比例的缩放,因而需对每一帧数据的每个像素点进行浮点乘加运算,参考ffmpegcolourspace的运算量,该部分运算量也应较大。
可见,ARM 核无法独自胜任系统所需的全部运算。
3.2.4 基于GPU 的优化方案 – GPU Composition
GPU Composition 软件模块,调用 SGX530 模块进行色彩空间转换,OSD 叠加,图层缩放功能,分担A8 的运算负载使其专注于QT,视频解码等应用,下面将具体介绍。
• GPU Composition 模块的编译和安装
在TI Wiki 上有明确说明,可查阅参考文档[8]。
• GPU Composition 设计分析
A. 各功能模块
图 5 GPU Composition 软件模块图
SGX530 实现的功能模块标记为深色,具体功能如下:
a. gpuvsink该模块设计为Gstreamer视频显示后端插件,将视频解码器解出的YUV 数据帧,传送给SGX530 模块。按照标准的Gstreamer视频显示后端插件设计,可采用标准的显示后端接口编程。对于视频输入的尺寸,要求其宽(width)为4 个像素点的倍数。其输出视频帧数据这里可称为Video Plane。
b. linuxfbofs
该模块设计为QT 架构中的显示后端,将QT 的帧数据发送到SGX530 模块中处理。linuxfbofs和framebuffer 有同样的接口,对于QT 应用开发是透明的。其输出界面帧数据为Graphics Plane。
GPU Composition
该模块基于Open GL ES 2.0 接口设计,对输入的Video plane 和Graphics Plane 进行色彩空间转换,图层缩放,OSD 叠加等操作,将最终的帧数据推送到Framebuffer 中显示。
B. 模块间的数据流
模块间的数据以Plane 的形式传递,具体介绍如下:
a. Plane格式
Video Plane 可支持YUV422,NV12,I420 和 YUV420 格式帧数据。
Graphics Plane 可支持RGB565,RGB888 和ARGB8888 帧数据。
GPU Composition 接收这些格式的帧数据,并将其转换为RGB 格式,进行图层缩放,OSD 叠加等操作。
b. Plane 的内存分配
SGX530 输入内存(Buffer),只支持物理地址连续的Buffer。因此,在gpuvsink和linuxfbofs中,使用cmem(具体可查阅参考文档[9])据此要求分配内存Pool 来存储帧数据,需在Linux 启动时通过命令行参数”mem=”配置预留给Kernel 的内存,而剩下的内存即是给cmem所准备,用于分配物理连续的内存。
其大小的计算公式如下:
Pool size for Graphics Plane = width * height * Bytes Per Pixel
Pool size for Video Plane = video frame width * height * 2 (Bytes Per Pixel) * 8 (buffers)
对于一个Video Plane 可能需要多个Buffer,其具体个数定义在
gpu-compositing/gpuvsink/src/gst_render_bridge.h
#define PROP_DEF_QUEUE_SIZE 8
c. Pool传递
Graphics Plane 和Video Plane 以指针的形式将Pool 传递给GPU Composition。
C. 模块间的控制流
a. 配置信息数据结构
对于Graphics Plane,通过命名管道““/opt/gpu-compositing/named_pipes/video_cfg_and_data_plane_X””其配置信息在下面数据结构中
关于此配置信息中,比较重要的有如下几点:
• 对于 QT 而言,对入的对对参数来自 Linux 的 FB 对对,即对 LCD 屏的对示分辨率。
• 关于透明度(Alpha),Video plane 在底部,因此,Graphics Plane 决定 Video Plane的可对度。Alpha 可分对:全局Alpha,整个Plane 使用同一的一个Alpha 对;以像素点(Pixel)对对位的Alpha, 即像素的数据格式对ARGB8888,可以在局部对置Alpha。
• 可以通对对置对出的对构体out_g对对对出Plane 的对放。
对于Video Plane, 配置信息如下:
此配置结构体中的输入信息,会通过Gstreamer的标准接口,通过前级的Gstreamer Plugin 进行配置。如前所述,输入视频帧的宽(width)的像素点数,需为4 的倍数;对于输出信息,和Graphics Plane 一样,可以通过配置输出数据结构out,实现缩放功能。
b. 命名管道( named pipe)配置信息
上述配置信息,通过存放于文件系统中的命名管道,传递到GPU Composition 模块。
对于linuxfbofs,命名管道文件为/opt/gpu-compositing/named_pipes/gfx_cfg_plane_X。
对于gpuvsink,命名管道文件为/opt/gpu-compositing/named_pipes/video_cfg_and_data_plane_X
AM335x 的解决方案
AM335x 是TI 新近推出的基于ARM Cortex-A8 的SOC,外设丰富,主要针对工业应用领域。针对异步控制卡应用,TI 也提供了基于Linux 的解决方案。下面将从硬件和软件两方面分别介绍该方案。
3.1 硬件方案
AM335x 具有一个强劲的核心Cortex-A8,该核的运算能力可达2.0DMIPS/MHz, 而且AM335x的主频可到1GHz,即运算总的能力可达2000 DMIPS,可流畅解码640x480 的MPEG4 视频流,而且有足够的运算余量绘制各种UI。
此外,AM335x 还有一个3D 图形加速核,SGX530,可支持OpenGL ES2.0。TI 在OpenGL ES2.0 之上提供了相应的软件方案,将SGX530 用于视频帧的尺寸缩放以及实现对UI 层和视频层的透明叠加的加速,后面软件部分会详细介绍该方案。
同时,AM335x 具有丰富的外设,如下图所示:
图 3 AM335x 异步控制卡硬件模块图
由上图可见AM335x 可完全涵盖所有异步控制卡的外设需求,不需要其他扩展。因此,总体成本具有很强竞争力。
TI 的开发板GP EVM(可查阅参考文档 [1] )都可以很便利的进行LED 应用的评估和开发,下文中的软件方案是以GP EVM 为平台进行开发的。
3.2 软件方案
软件方案主要分为操作系统和应用软件两大块,具体介绍如下。
3.2.1 操作系统
如前所述,Linux 是异步控制卡的主流操作系统,因此,本方案也选择了Linux 作为平台。AM335x EZSDK 提供了Linux 的完整开发包,包括板级支持包,交叉编译器,文件系统等,可查阅参考文档 [2] 。
3.2.2 软件模块
• UI
在基于Linux 的异步控制卡平台上,QT 以免费,开源,开发资料全以及在嵌入式系统上运行效率高等特点,已经成为异步控制卡厂商开发UI 主要的平台。在EZSDK 中已包含对QT4 的移植,可查阅参考文档[3]。QT 在开源网站上也有很丰富的资源,可查阅参考文档 [4] 。
• 多媒体
在EZSDK 中提供Gstreamer+ffmpeg的多媒体解决方案,可查阅参考文档[5] 和参考Gstreamer文档(参考文档[6])。在多媒体中,由于格式比较多,各种编码的复杂度以及编码质量差异较大是一个难点。而在LED 显示墙的应用场景中,多媒体码流可接受转码方式,所以可指定码流的格式。这里,推荐的多媒体格式MP4(MPEG4+AAC),其中MPEG4 选择simple profile,对此种码流,若分辨率为640x480,AM335x 可流畅解码每秒25 帧以上。
• 显示后端
AM335x 只有一个功能简单的LCD 控制器,该控制器只支持RGB 格式,其在Linux 中的驱动为framebuffer,可查阅参考文档 [7] 。相应的上述两个模块的显示后端也以framebuffer 为基础:
Gstreamer的后端显示插件采用fbdevsink。由于视频解码后的格式为YUV 格式,而AM335x 自带的LCD 控制器只支持RGB 格式,因此此处可使用Gstreamer的插件ffmpegcolourspace进行色度空间的转换
QT 默认以framebuffer 为显示后端。
Framebuffer 会接收来自QT 和Gstreamer的图像帧数据,然后进行OSD 的叠加和缩放等操作,数据流如下图所示:
图 4 默认软件方案数据流程图
3.2.3 软件复杂度分析
在图4 中,深色模块为运算较密集模块,具体分析如下:
• Gstreamer的解码和ffmpegcolourspace(CSC plugin)两个模块。
ARM 虽然有较强的运算能力,但对于较大分辨率的视频解码,视频解码的宏块运算等需较大运算量。另外,色度空间涉及浮点运算,而且为逐点运算,所以运算量需求也不小。
以640x480 分辨率的MP4(MPEG4 simple profile+AAC) 为例,若帧率为30fps 时,ARM 核的loading 在91%左右,其中ffmpegcolourspace模块约占运算量的50%。
• Framebuffer 模块。
在该模块中的 OSD 叠加指的是 UI 图层和视频图层之间的叠加,而且是包含带透明度的叠加,而图层的缩放是指对原图等比例的缩放,因而需对每一帧数据的每个像素点进行浮点乘加运算,参考ffmpegcolourspace的运算量,该部分运算量也应较大。
可见,ARM 核无法独自胜任系统所需的全部运算。
3.2.4 基于GPU 的优化方案 – GPU Composition
GPU Composition 软件模块,调用 SGX530 模块进行色彩空间转换,OSD 叠加,图层缩放功能,分担A8 的运算负载使其专注于QT,视频解码等应用,下面将具体介绍。
• GPU Composition 模块的编译和安装
在TI Wiki 上有明确说明,可查阅参考文档[8]。
• GPU Composition 设计分析
A. 各功能模块
图 5 GPU Composition 软件模块图
SGX530 实现的功能模块标记为深色,具体功能如下:
a. gpuvsink该模块设计为Gstreamer视频显示后端插件,将视频解码器解出的YUV 数据帧,传送给SGX530 模块。按照标准的Gstreamer视频显示后端插件设计,可采用标准的显示后端接口编程。对于视频输入的尺寸,要求其宽(width)为4 个像素点的倍数。其输出视频帧数据这里可称为Video Plane。
b. linuxfbofs
该模块设计为QT 架构中的显示后端,将QT 的帧数据发送到SGX530 模块中处理。linuxfbofs和framebuffer 有同样的接口,对于QT 应用开发是透明的。其输出界面帧数据为Graphics Plane。
GPU Composition
该模块基于Open GL ES 2.0 接口设计,对输入的Video plane 和Graphics Plane 进行色彩空间转换,图层缩放,OSD 叠加等操作,将最终的帧数据推送到Framebuffer 中显示。
B. 模块间的数据流
模块间的数据以Plane 的形式传递,具体介绍如下:
a. Plane格式
Video Plane 可支持YUV422,NV12,I420 和 YUV420 格式帧数据。
Graphics Plane 可支持RGB565,RGB888 和ARGB8888 帧数据。
GPU Composition 接收这些格式的帧数据,并将其转换为RGB 格式,进行图层缩放,OSD 叠加等操作。
b. Plane 的内存分配
SGX530 输入内存(Buffer),只支持物理地址连续的Buffer。因此,在gpuvsink和linuxfbofs中,使用cmem(具体可查阅参考文档[9])据此要求分配内存Pool 来存储帧数据,需在Linux 启动时通过命令行参数”mem=”配置预留给Kernel 的内存,而剩下的内存即是给cmem所准备,用于分配物理连续的内存。
其大小的计算公式如下:
Pool size for Graphics Plane = width * height * Bytes Per Pixel
Pool size for Video Plane = video frame width * height * 2 (Bytes Per Pixel) * 8 (buffers)
对于一个Video Plane 可能需要多个Buffer,其具体个数定义在
gpu-compositing/gpuvsink/src/gst_render_bridge.h
#define PROP_DEF_QUEUE_SIZE 8
c. Pool传递
Graphics Plane 和Video Plane 以指针的形式将Pool 传递给GPU Composition。
C. 模块间的控制流
a. 配置信息数据结构
对于Graphics Plane,通过命名管道““/opt/gpu-compositing/named_pipes/video_cfg_and_data_plane_X””其配置信息在下面数据结构中
关于此配置信息中,比较重要的有如下几点:
• 对于 QT 而言,对入的对对参数来自 Linux 的 FB 对对,即对 LCD 屏的对示分辨率。
• 关于透明度(Alpha),Video plane 在底部,因此,Graphics Plane 决定 Video Plane的可对度。Alpha 可分对:全局Alpha,整个Plane 使用同一的一个Alpha 对;以像素点(Pixel)对对位的Alpha, 即像素的数据格式对ARGB8888,可以在局部对置Alpha。
• 可以通对对置对出的对构体out_g对对对出Plane 的对放。
对于Video Plane, 配置信息如下:
此配置结构体中的输入信息,会通过Gstreamer的标准接口,通过前级的Gstreamer Plugin 进行配置。如前所述,输入视频帧的宽(width)的像素点数,需为4 的倍数;对于输出信息,和Graphics Plane 一样,可以通过配置输出数据结构out,实现缩放功能。
b. 命名管道( named pipe)配置信息
上述配置信息,通过存放于文件系统中的命名管道,传递到GPU Composition 模块。
对于linuxfbofs,命名管道文件为/opt/gpu-compositing/named_pipes/gfx_cfg_plane_X。
对于gpuvsink,命名管道文件为/opt/gpu-compositing/named_pipes/video_cfg_and_data_plane_X
举报