DM6446中的Qt GUI视频叠加显示方法

时间:2022-10-17 07:21:03

DM6446中的Qt GUI视频叠加显示方法

摘 要: 采用Qt的嵌入式版本,即Qt/E,在DM6446的软件系统平台MontaVista Linux上进行视频GUI应用程序开发,充分利用了DM6446的在屏显示(OSD)模块的硬件特性,实现了在视频层上叠加GUI窗口层的视频叠加显示方法。视频数据的更新主要由硬件模块负责,避免了软件进行视频格式转换的CPU耗时,提高了视频显示的效率。应用程序目标平台上能够实现视频的实时采集和高效显示,说明Qt/E在DM6446中进行视频GUI开发具有实用性。

关键词: 叠加显示; DM6446; Qt/E; GUI

中图分类号: TN911?34; TP391 文献标识码: A 文章编号: 1004?373X(2013)14?0085?04

Video overlay display method of Qt GUI application in DM6446

LUO Guo?zhu1, 2, ZHANG Yong1

(1. Shanghai Institute of Technical Physics, Chinese Academy of Sciences, Shanghai 200083, China;

2. University of Chinese Academy of Sciences, Beijing 100049, China)

Abstract: The Qt embedded Linux (Qt/E) is used to develop the video GUI application on the MontaVista Linux software platform on DM6446. Taking full advantage of the DM6446 OSD modules, the video is displayed by the OSD video window, and overlaid by the Qt GUI layer on OSD bitmap window. Since the video data is updated by the hardware modules, the application has no need to transform the color format, thus the video display efficiency is improved. On the target board, the GUI application has the real?time ability to capture and display the video data, which shows the practicality of the Qt/E in developing the video GUI application on DM6446.

Keywords: overlay display; DM6446; Qt/E; GUI

0 引 言

TMS320DM6446是TI公司推出的一款应用于视频处理领域的达芬奇系列芯片,它包含一个ARM926EJ?STM的通用处理器(GPP)内核、一个C64x+TM的数字处理器(DSP)内核以及一个图像处理子系统(VPSS),是一个高性能的数字多媒体片上系统[1]。DM6446的在屏显示模块(OSD)支持在视频画面上叠加图片、文字、鼠标等附加信息,非常方便于视频和位图的叠加显示应用[2?4]。ARM端的MontaVista Linux提供了视频驱动V4L2和帧缓冲驱动FrameBuffer,V4L2用于视频采集,FrameBuffer用于控制在屏显示模块OSD。Qt/E是应用于嵌入式图形界面(GUI)开发的工具,其底层显示直接构建于FrameBuffer之上,通过适当的配置移植,便能够利用Qt/E在DM6446上进行GUI的开发[5?7]。

由于V4L2采集的视频数据格式为YUV422,而OSD位图窗口的数据格式为RGB565,因此若要将视频数据通过Qt绘制于GUI位图窗口之上,则需要视频数据格式的转换,这将耗费较多的CPU时间,视频的显示效率较低。本文结合OSD模块的多窗口显示特性和Qt/E在嵌入式GUI开发方面丰富的编程接口,提出了一种将视频和Qt GUI图层分开绘制,实现视频层和GUI位图层叠加显示的方法,避免了视频数据格式的转换耗时,提高了视频的显示效率。

1 系统整体结构

整个视频采集和叠加显示的结构如图1所示,从上到下依次为应用层、驱动层和硬件层。

硬件层主要包括视频采集设备和视频显示视频两部分,视频数据由视频解码芯片TVP5150从PAL制式的摄像头解码获得,数据为16位YUV 422格式(UYVY);视频的显示由DM6446的视频处理子系统VPSS中的在屏显示模块OSD和视频编码模块VENC完成,在VENC进行编码输出之前,会对OSD各窗口模块数据进行融合。驱动层主要涉及到Linux下的视频采集驱动程序V4L2以及帧缓冲驱动程序FrameBuffer。V4L2主要为应用层的视频采集线程提供视频采集接口,而FrameBuffer主要为应用层的视频显示线程提供视频显示接口,以及为Qt/E GUI提供底层绘图接口。应用层采用了多线程编程技术,以实现视频的实时采集和显示,并保证Qt/E GUI窗口能够对用户输入持续响应。在Qt/E GUI主线程中提供了对视频采集和视频显示子线程的控制接口,用以控制视频采集和显示;同时提供了对属性窗口的控制接口,能够控制属性窗口的位置、大小及混合度。

图1 视频采集和叠加显示整体结构

正如图1中的数据流向所示,视频数据采集后将被拷贝到视频窗口VIDWIN1上,而Qt/E GUI窗口图层则被绘制到OSDWIN0,视频混合模块BLEND将根据属性窗口ATTRWIN的配置值来对视频窗口和位图窗口数据进行融合,最后经由视频编码模块VENC送至显示器,实现视频和Qt/E GUI的叠加显示。

2 在屏显示模块OSD及帧缓冲FrameBuffer

2.1 在屏显示模块OSD

DM6446的视频处理后端VPBE主要由在屏显示模块OSD和视频编码模块VENC组成,OSD模块管理了多个硬件显示窗口,而VENC则负责将窗口数据进行编码后送至显示设备进行显示[2]。硬件窗口主要包含有两个视频窗口(VIDWIN0,VIDWIN1)、两个位图窗口(OSDWIN0,OSDWIN1)以及一个矩形光标窗口(Rectangular Cursor)。对于每一个视频窗口和位图窗口,都有相应的DDR2内存缓冲区用于保存窗口的数据,通过修改相应缓冲区便可达到直接写屏的目的。所有的硬件窗口最终都是要显示到同一个显示屏幕上的,这就涉及到了窗口的显示优先级问题。OSD硬件窗口模块的优先级为Rectangular Cursor>OSDWIN1>OSDWIN0>VIDWIN1>VIDWIN0>Background color。当所有窗口都使能显示时,在屏幕上重叠的窗口只有顶级窗口能够显示。在应用中,视频数据显示在VIDWIN1,GUI窗口显示在OSDWIN0,则默认屏幕上只能显示OSDWIN0,若要显示VIDWIN1,则需配置属性窗口。

OSDWIN1可以配置为属性窗口ATTRWIN,用以控制视频窗口和位图窗口数据的混合度。当配置为属性窗口时,窗口位深必须为4 b,其中最高位用以控制属性窗口的闪烁(blink)属性(在我们的应用中不使用,所以置零),低3位用以控制8种不同的位图窗口和视频窗口混合度。属性窗口只对被其覆盖的位图窗口的透明设置有关,对于在属性窗口范围之外的其余位图窗口则不受属性窗口的影响。通过控制属性窗口的像素值,使混合度在0~7之间变化,便能够实现不同程度的视频层和位图层的融合。当混合度为0时,被覆盖部分将实现视频层的完全透明显示,而当混合度为7时,则被覆盖部分将仅显示位图数据,其余混合度下将实现视频层的半透明显示效果。OSD窗口的这一显示特点,正是视频数据和Qt GUI窗口数据叠加显示方法的硬件基础。

2.2 帧缓冲FrameBuffer

帧缓冲驱动程序FrameBuffer提供了应用程序控制显示设备的方法[8]。在MontaVista Linux中提供的FrameBuffer驱动程序,将OSD的2个视频窗口和2个位图窗口都抽象成了设备文件。其中/dev/fb/[0,1,2,3]分别对应OSDWIN0,VIDWIN0,OSDWIN1及VIDWIN1,通过操作相应的设备文件,便可以达到操作某个具体窗口的目的。

帧缓冲驱动程序向系统申请了连续的内存缓冲区用以缓存窗口像素数据,一般缓冲区大小是窗口大小的2~3倍,在实际显示时根据需要快速切换,以提高屏幕绘制效率和减少闪烁。应用程序对FrameBuffer操作的基本流程如图2所示。

帧缓冲FrameBuffer提供的应用程序编程接口(API)主要有open(),close(),ioctl(),mmap()和munmap()等。函数open()和close()主要用于设备的打开和关闭;mmap()用于将内核空间地址映射到用户空间,以加快应用程序对内核空间数据的访问,而munmap()则用于解除这种映射关系;ioctl()是应用程序与驱动程序交互的基本接口,应用程序对驱动程序的控制基本都是通过这个接口来完成。

通过FrameBuffer正确配置OSD视频窗口VIDWIN1、位图窗口OSDWIN0以及属性窗口ATTRWIN,应用程序便能够实现视频层和位图层的叠加显示。

图2 FrameBuffer操作流程图

3 Qt/E GUI视频采集及叠加显示

3.1 多线程实现方法

OSD模块为视频和GUI叠加显示提供了硬件基础,而FrameBuffer则是进行应用程序操作OSD模块的接口,是应用开发的软件基础,通过它们,才能够实现视频数据和Qt GUI窗口的叠加显示。视频采集用到了Linux下的视频设备驱动程序V4L2,通过其提供的编程接口,能够从视频解码芯片中采集得到YUV422格式的视频数据,限于篇幅,这里不做具体介绍,具体可参阅相关文档[9?10]。为了实现视频的实时采集和显示,在应用层,采用了多线程编程的方法。视频采集和显示线程都继承自Qt的线程类QThread,分别为CaptureThread和DisplayThread。在这里,主要是重新实现QThread的run()方法,分别为CaptureThread::run()和DisplayThread::run(),当线程类实例构建完毕之后,只需通过调用线程的start()来开启对应线程的run()方法即可。为了实现视频采集线程和视频显示线程对视频显示帧缓冲空间的同步访问,这里用到了Qt提供的信号量类QSemaphore。通过信号量的控制,视频采集线程能够将新采集到的视频数据正确拷贝到视频显示帧缓冲区的空闲区域,而不影响当前正在显示的画面,其过程如图3所示。

由于分配给视频显示的帧缓冲数目为3,故视频显示帧缓冲的索引值为0~2。为此,设置QSemaphore A的初始值为2,在CaptureThread中的视频显示帧缓冲索引初值为1,而设置QSemaphore B的初始值为1,在DisplayThread中视频显示帧缓冲索引初值为0。当只有视频采集线程启动时,视频采集线程将在2次视频数据拷贝后被挂起,直到视频显示线程开启为止;而当只有视频显示线程启动时,它将在更新1次显示窗口帧缓冲地址后被挂起,视频将持续显示旧数据,直到视频采集线程启动并往视频显示帧缓冲拷贝了新数据为止。这样,无论视频采集线程和视频显示线程哪个先启动,都能够实现采集和显示的同步。

图3 视频采集和显示的同步

从图3可以看到,视频采集线程每采集到一帧视频数据,都会将其拷贝到OSD的视频窗口VIDWIN1的帧缓冲区中,而通过设定系统环境变量QWS_DISPLAY=LinuxFb:/dev/fb/0,Qt/E的底层绘图引擎将把GUI窗口绘制于OSDWIN0上,这样,便实现了视频和GUI的分层绘制。接下来,应用程序通过FrameBuffer控制属性窗口,调整其大小和显示位置,并将它的帧缓冲区全部清0,则可以在其覆盖下的OSDWIN0上开一个透明窗口,实现视频和Qt/E GUI的叠加显示。

3.2 视频和Qt/E GUI叠加显示效果

实际的GUI运行效果如图4所示,屏幕分辨率为720×576,视频大小为596×390,帧频为25 f/s。图中,(a)为视频层VIDWIN1画面,其大小已设置成和采集的视频帧大小一致;(b)为Qt/E GUI层在OSDWIN0上的画面,在上半部分区域放置了一幅静态背景图片以作对比;(c)是设置属性窗口的像素值为3时视频和GUI的叠加画面,此时可以透过GUI中的静态图片背景看到视频画面;(d)为设置属性窗口的像素值为0时视频和GUI叠加画面,此时GUI中的视频显示区域将全透明显示视频画面,而其他不受属性窗口影响的区域则正常显示GUI窗口的其余部分。

因此,通过控制属性窗口的像素值,便能够实现视频和Qt/E GUI不同程度的叠加显示。

从图4中可以看到,将视频数据和Qt/E GUI分层绘制VIDWIN1以及OSDWIN0后,通过控制属性窗口ATTRWIN,确实能够实现视频层和Qt/E GUI层的同屏叠加显示,并且叠加效果良好。

图4 应用程序在目标系统中运行

4 结 语

本文结合OSD模块的硬件特点以及V4L2,FrameBuffer等软件模块的支持,利用Qt/E实现了在DM6446上视频GUI的应用开发。在目标系统中,视频采集和显示实时稳定,视频窗口和GUI窗口叠加显示效果良好,对于在DM6446中进行带视频显示功能的高效GUI应用开发具有指导意义。

参考文献

[1] Texas Instruments. TMS320DM6446 digital media system?on?chip [EB/OL]. [ 2011?2?15]. http://.

[2] Texas Instruments. TMS320DM644x DMSoc video processing back end (VPBE) user’s guide [EB/OL]. [ 2011?9?28]. http://.

[3] 王艳艳,郅晨.基于TMS320DM6446的OSD显示技术的研究与实现[J].中国新通信,2008,10(3):45?50.

[4] 黄益贵,王汝传.基于DM6446的P2P机顶盒OSD研究与实现[J].计算机技术与发展,2010,20(4):220?223,227.

[5] [加]布兰切特,[英]撒默菲儿德.C++ GUI Qt 4编程[M].闫锋欣,曾泉人,张志强,译.2版.北京:电子工业出版社,2008.

[6] 杨金林.基于DM6446和Qt的嵌入式图形界面的研究与应用[D].青岛:青岛大学,2012.

[7] 汤伟,李强.Qt/E的嵌入式Linux GUI研究与实现[J].计算机应用与软件,2011,28(10):260?263.

[8] Texas Instruments. LSP 1.20 DaVinci Linux VPBE frame buffer driver user’s guide [EB/OL]. [2011?10?19]. http:///litv/pdf.

[9] Texas Instruments. LSP 1.20 DaVinci Linux V4L2 display driver user’s guide[EB/OL]. [2008?03?03]. http:// .

[10] 张辉,李新华,刘波,等.基于V4L2视频采集缓存机制应用与实现[J].现代电子技术,2010,33(20):54?56.

上一篇:基于FPGA和BU?65170的1553B远程终端设计与实现 下一篇:基于FPGA的FIR数字滤波器设计与实现