APP下载

基于DaVinci技术的移动视频服务器的软件设计

2012-06-06杨明极

电视技术 2012年1期
关键词:数据流编码服务器

杨明极,陈 楠

(哈尔滨理工大学测控技术与通信工程学院,黑龙江 哈尔滨 150080)

数字视频技术正在逐步进入人们的工作和生活中,各种嵌入式应用和电子产品由于增加了视频功能而提高了价值。例如,用户可以使用移动视频服务器方便地看到交通路口的实时情况,可以看到家中需要照顾的老人和小孩,家长还可以随时看到孩子在幼儿园的情况等。为了应对这种需求,2005 年,TI推出了 DaVinci技术[1],将可编程器件的灵活性和固定功能器件的高效率结合在一起,支持各种数字视频的设计要求。在软件方面,由于系统较大并且应用线程较多,因此有必要使用嵌入式操作系统。Linux操作系统具有开放源代码、易于移植、资源丰富、免费等优点,在嵌入式领域得到广泛应用。

1 系统平台概述

设计的主要目标是对视频图像进行采集,然后将采集到的视频图像经过压缩编码处理,最后通过网络传输到服务器上,允许手机客户端进行实时监控。DaVinci平台的特点是基于DSP+ARM的SoC芯片。提供了软件、开发工具、技术支持等系统组件,可以高效地开发数字多媒体系统,Linux操作系统可以提供多种进程间的通信机制,能够统一管理系统资源,为用户提供访问硬件的接口[2],均可使设计达到要求。

1.1 系统硬件平台

DaVinci的TMS320DM6467处理器是为了满足嵌入式设备的图像编/解码的应用而设计,集成了一个ARM926EJ-S核与一个C64x+DSP核。其中ARM处理器主频为297 MHz,内核可嵌入Linux操作系统,主要起控制和管理作用;DSP处理器主频为594 MHz,其内核相当于一个“黑匣子”,用DSP/BIOS来处理编解码算法。DSP与ARM之间通过引擎和服务器完成通信和交互[3]。系统以TMS320DM6467处理器为核心,同时包括视频采集模块、用于上传视频到互联网的以太网模块、用于存储用户信息的I2C接口E2PROM以及可用于系统升级的RS-232接口和用于存储视频的硬盘接口[4],系统的功能框图如图1所示。

图1 系统的功能框图

1.2 系统软件平台

系统采用的是Monta Vista软件公司的Monta Vista Linux操作系统,它的可抢占内核技术可以显著降低内核抖动和延迟,以保证系统的实时响应。Monta Vista公司提供了100多种板级硬件平台支持和30多种处理器的通用代码体系,有利于Linux中U-Boot移植、内核移植及根文件系统的构建[5]。软件架构如图2所示。

图2 软件架构图

2 数据采集模块设计

Video4Linux是Linux内核中支持视频设备驱动的编程接口。视频图像的采集是通过Video4Linux提供的上层API来控制视频设备的驱动程序,然后完成图像实时采集。当摄像头驱动程序加载后,系统把摄像头映射为/dev/video设备文件,开始采集视频信息。视频图像的采集用Video4Linux的API接口配合mmap()函数实现,其流程如图3所示。

图3 采集模块流程图

首先系统函数fd=open(/dev/video,O_RDWR)打开采集设备,然后由函数ioctl(fd,VIDIOC_GCAP)来获得采集设备信息,并且由函数ioctl(fd,VIDIOC_GPICT)设置图像信息,并将获得的信息存在各自的分量中。用系统调用函数ioctl(fd,VIDIOC_GMBUF)初始化video_mbuf得到buffer信息,包括帧数及帧的大小等信息。再用函数mmap()把设备文件信息映射到内存中。最后用ioctl(fd,VIDIOC_SYNC)函数判断一帧图像是否读取完毕,若读取完毕则关闭设备。采集到的视频数据存放到data地址的内存区域内,然后交给应用程序进行处理。

3 数据传输模块设计

移动视频服务器要求视频数据实时传输,其质量要求是端到端的时延、时延抖动和分组丢失率[6]。针对多媒体数据流的传输特性,本文采用RTP/RTCP实时数据传输方式。通过时间戳来保持采样和播放之间的同步,同时保证视频信号的还原性。因此在RTP的数据包中加入了时间戳和序列号等信息。RTP通常不作为独立的网络层,而把它看作应用层的一部分,在应用程序之下,UDP之上。发送端将采样到的媒体数据封装成RTP格式,然后通过RTP底层调用相关的UDP API函数把数据发送出去。RTP有两个链接组成,其中RTP是传送实时数据的;RTCP则监控传送质量并且传送正在进行的相关数据信息。RTP和RTCP配合使用,保证传送和接收的可靠性并能有效提高传输效率。

oRTP是实现库,具有包调度、自动发送RTCP包、自适应抖动补偿等功能。首先要在Linux平台上建立oRTP协议栈,把oRTP移植到达芬奇系统后展开RTP/RTCP模块编程设计,本文采用全局结构指针prtpstat开始实现对RTP/RTCP模块的访问和控制。代码如下:

其中,STREAMS_COUNT表示系统可支持的最多数据流的数目;PACKET_SIZE表示RTP的数据流的最大长度;TS_INC表示RTP的数据流时间戳的递增量;runcond变量表示RTP线程的运行状态;channels表示RTP当前的运行任务数量;SessionSet表示oRTP中控制多任务的数据结构类型;RtpSession表示控制RTP任务,包含一个RTP任务的所有必要的信息,一个RtpSession代表一个RTP任务,把网络地址和负载类型配置好后就可以发送媒体流;STREAMS_COUNT表示最多可支持并发的RTP任务的数量;buffer指针为媒体流的数据缓冲区;user_ts表示任务时间戳的增值量;connected表示任务的连接状态,当任务连接成功后,对connected置1,否则置0。RTP在执行过程有初始化阶段、数据流的传输阶段、任务结束阶段3个阶段:初始化阶段就是完成prtpstat指针的初始化过程。数据流的传输包括RtpSession初始化,即网络地址和负载的配置,还有对数据流的封装和传输及RTCP信号的传输过程。数据包的发送是调用oRTP协议栈中的rtp_session_send_with_ts(RtpSession* session,const uint8_t* buffer,int len,uint32_t userts)函数来实现的,其中 Session为任务指针,buffer为数据流首地址,len为数据流的长度,userts为数据流时间戳。此函数执行后,依次把数据流加上RTP协议头、UDP头、IP头。当各个头部信息设置好后就会得到一个完整的IP包,然后通过网络发送。任务结束阶段是对相关的指针回收和变量设置等操作。待发送的数据流通过DSP编码模块的输出得到,将数据用rtp_session_send_with_ts()函数发送即可。

4 移动视频服务器的整体设计

本文的视频算法选用的是H.264,并打包在一个Codec服务器里,由Codec Engine管理。DSP核运行DSP/BIOS实时操作系统,执行处理算法。

整体模块设计包括3个部分:主模块(main.c)、视频模块(video.c)和显示模块(display.c)。模块的初始化均由公用模块Rendezvous来同步,该模块首先执行初始化,用POSIX条件来同步各部分模块。每个模块执行各自的初始化,然后向Rendezvous模块发送信号。此时所有模块完成初始化,然后各模块开始执行其各自主循环[7]。

4.1 主模块

主模块是执行必要的初始化任务,用户可以通过应用程序所提供的命令行参数初始化编码运行时间,并且根据这些参数创建视频。主模块流程如图4所示。

图4 主模块流程图

主模块首先通过DaVinci上的检测开关S3的上电默认状态来检测视频标准,当为0时,表示PAL制式;当为1时,表示NTSC制式。之后解析命令行参数,设置环境变量,包括启动方式、图像大小、串口参数、Linux启动参数、文件系统路径、IP地址等。Codec Engine初始化,打开同步初始化Rendezvous的目录,主模块开始解析与视频相关的命令,通过调用CERuntine_init()函数开启编码引擎,调用Rendezvous_open(),开始视频的创建,并且进入控制线程。控制线程负责用户界面上实现与用户的交互接口。

4.2 视频模块

视频模块主要是采用视频编码算法对视频前端采集到的图像数据进行编码算法处理,在客户端显示之前对编码处理过的数据进行解码。视频模块流程如图5所示。

图5 视频模块流程图

视频模块首先通过FifoUtil_open()函数建立目标,打开和显示进程间的数据缓存并且用于建立两进程之间的通信交流通道。之后调用pthread_create()函数创建视频模块。用initCaptureDevice()函数初始化视频前端的采集设备,使视频数据输入通道完成初始化工作。然后用VIDIOC_S_INPUT设置用户用所选择的输入信号,视频标准(NTSC或PAL)由采集设备检测,对照Linux内核命令行的视频标准进行验证,最后使用VIDIOC_STREAMON开始对采集器件驱动器里的视频帧进行采集。Codec Engine_open()函数是建立一个Codec Engine。之后,VIDENC_Create()函数完成视频的编码任务,设计支持H.264编码格式[8]。模块最后调用Memory_contigAlloc()函数为编码缓冲和显示缓冲分配连续的内存空间。到此结束视频模块的初始化,然后使用Rendezvous公用模块和其他模块同步,此时视频模块进入主循环。

4.3 显示模块

显示模块将视频处理子系统前端采集到的视频数据的原始帧复制到视频子系统后端的帧缓存器里。在DSP进行处理的同时,复制一个独立的显示模块。显示模块最先通过initDisplayDevice()函数来完成显示设备的初始化,在此函数中,调用mmap()函数完成地址重映射。然后使用FBIOPUT_VSCREENINFO函数,将分辨力设置为320×240格式。当显示模块完成初始化以及其他模块都完成初始化时,显示模块通过Rendezvous_open()函数进入主循环。

5 小结

本文在DaVinci平台上实现了移动视频服务器的软件设计,主要对视频数据采集、数据传输和服务器整体进行软件设计。所设计的移动视频服务器在嵌入式Linux操作系统下和DM6467开发板上实现了数据采集和传输等功能,并且稳定运行达到设计要求。对嵌入式应用及视频服务器的发展有一定的借鉴意义。

[1] Texas Instruments.DVEVM getting started guide[EB/OL].[2011-08-25].http://www.kanecomputing.co.uk/pdfs/tmdsevm6446%20getting%20started%20guide.pdf.

[2]韦东山.嵌入式Linux应用开发完全手册[M].北京:人民邮电出版社,2008.

[3]常国柱,何维,田增山,等.基于达芬奇技术的视频传输系统设计[J].电视技术,2010,34(10):39-41.

[4] Texas Instruments.TMS320DM6446 digital media system on chip[EB/OL].[2011-08-25].http://www.ti.com/lit/ds/sprs283h/sprs283h.pdf.

[5]冯国进.嵌入式Linux驱动程序设计[M].北京:清华大学出版社,2008.

[6]张起贵,张胜,张刚.最新DSP技术——“达芬奇”系统、框架和组件[M].北京:国防工业出版社,2009.

[7]彭启琮.达芬奇技术——数字图像/视频信号处理新平台[M].北京:电子工业出版社,2008.

[8]成嘉,张文雄,李善劲.基于达芬奇技术的H.264视频编码器的实现[J].电视技术,2007,31(12):34-36.

猜你喜欢

数据流编码服务器
基于SAR-SIFT和快速稀疏编码的合成孔径雷达图像配准
汽车维修数据流基础(上)
《全元诗》未编码疑难字考辨十五则
汽车维修数据流基础(下)
子带编码在图像压缩编码中的应用
通信控制服务器(CCS)维护终端的设计与实现
Genome and healthcare
中国服务器市场份额出炉
得形忘意的服务器标准
计算机网络安全服务器入侵与防御