您好,欢迎来到尚车旅游网。
搜索
您的当前位置:首页基于嵌入式Linux的视频采集编码发送模块的设计与实现

基于嵌入式Linux的视频采集编码发送模块的设计与实现

来源:尚车旅游网


分类号

TN919.72 密级

重庆邮电大学硕士学位论文

论文题目

基于嵌入式Linux的视频采集编码发送

模块的设计与实现

英文题目

硕士研究生 指导教师 学科专业 论文提交日期 论文评阅人

The Design and Realization of

Video Capture and Encoding and Transition System

Based on Embedded Linux

电子与通信工程

年 月 日 论文答辩日期

年 月 日

答辩委员会主席

年 月 日

独 创 性 声 明

本人声明所呈交的学位论文是本人在导师指导下进行的研究工作及取得的研究成果。据我所知,除了文中特别加以标注和致谢的地方外,论文中不包含其他人已经发表或撰写过的研究成果,也不包含为获得 重庆邮电大学 或其他教育机构的学位或证书而使用过的材料。与我一同工作的同志对本研究所做的任何贡献均已在论文中作了明确的说明并表示谢意。

学位论文作者签名: 签字日期: 年 月 日

学位论文版权使用授权书

本学位论文作者完全了解 重庆邮电大学 有关保留、使用学位论文的规定,有权保留并向国家有关部门或机构送交论文的复印件和磁盘,允许论文被查阅和借阅。本人授权 重庆邮电大学 可以将学位论文的全部或部分内容编入有关数据库进行检索,可以采用影印、缩印或扫描等复制手段保存、汇编学位论文。

(保密的学位论文在解密后适用本授权书)

学位论文作者签名: 导师签名:

签字日期: 年 月 日 签字日期: 年 月 日

重庆邮电大学硕士论文 摘要

摘要

随着人们对安全要求的不断提高、嵌入式微处理器和多媒体压缩技术以及无线传输技术的快速发展,无线实时视频监控系统得到了快速的发展与应用。本文基于DM6467平台,使用TVP5158芯片实现多路视频复合采集,经过解复用后,远程调用DSP端H.264编码器完成视频流的实时编码,最后利用RTP协议封装视频数据并通过MF210无线模块实现视频的无线传输。论文最终设计实现了一种应用在无线实时视频监控系统中的多路视频采集编码发送方案。

论文首先研究了应用在无线视频监控系统中的关键的技术,包括DaVinci技术、V4L2视频采集驱动规范、H.264编码算法以及RTP流媒体实时传输协议和WCDMA技术等。随后分析了模块的功能需求,并根据需求分析设计了视频采集编码发送模块的总体架构。接下来论文研究了DaVinci开发平台的硬件和软件开发环境,并根据开发需求完成嵌入式开发环境搭建,主要工作包括嵌入式Linux服务器搭建、开发工作站配置、嵌入式Linux内核移植等。

在以上基础上,完成视频采集、视频编码、视频发送三个子模块具体的设计与实现。分别在视频采集子模块中,设计与实现基于V4L2采集驱动规范的多路视频的复合采集;在视频编码子模块中,设计与实现基于Codec Engine机制的H.264编码,主要工作包括H.264编码器的构建和编码应用程序的实现。在构建H.264编码器过程中主要完成X.264编码算法的xDM封装、Codec Server生成、Codec Engine引擎配置等,在编码应用程序中,通过调用H.264编码器的VISA API接口,实现采集的视频数据的实时编码;在视频发送子模块中,先构建WCDMA网络的传输链路,主要工作是完成MF210驱动移植、PPP移植与PPP拨号实现,然后在应用层利用RTP(实时传输协议)封装编码后的NAUL数据,最后创建socket,将打包而成RTP数据包发送到wcdma网络中。

在测试阶段,通过对系统的整体测试,验证了课题成功完成了模块设计的预期目标。

关键字:视频采集编码发送模块;Davinci,V4L2,H264,xDM,WCDMA

I

重庆邮电大学硕士论文 Abstract

Abstract

With the constant safety requirements improvement of the people and rapid development of the embedded microcontroller processor and multimedia compression technology and the wireless transmission technology, wireless real-time video monitoring system has make big step of development and application. This paper use DM6467 as the platform, use TVP5158 chip to realize the collection of multi-channel video, after solution reuse, it call romote DSP to complete real-time encoding, fially use RTP protocol encapsulation video data and realize the wireless transmission of video by MF210 wireless module. Finally, this paper designs and implements a multi-channel video acquisition coding send package.

This paper first studied the application of key technology in wireless video monitoring system, including the DaVinci technology, V4L2 video acquisition drive standard, h. 264 encoding algorithm and RTP streaming media real-time transmission protocol and WCDMA technology, etc. Then analyzed the module function demand, and according to the demand analysis and design the overall architecture of the encoding video collection is sending module. The paper studied the DaVinci development platform of hardware and software development environment, and according to the development needs to complete embedded development environment set up, the main work includes embedded Linux server set up, develop the workstation configuration, embedded Linux kernel transplantation, etc.

On the basis of above, complete the video acquisition, video coding, video sent three child module detailed design and implementation. In video acquisition module, the design and implementation based on V4L2 acquisition drive specification composite of multi-channel video acquisition; In video coding module, the design and implementation based on the Codec Engine mechanism of h. 264 coding, the main work including h. 264 encoder the implementation of the construction and coding applications. In construction of h. 264 encoder mainly completed in the process of x. 264 encoding algorithm of xDM encapsulation, Codec Server generate, Codec Engine Engine configuration, etc., in coding the application by calling the h. 264 encoder VISA API interface, realize the acquisition of video data real time coding; In video send sub module, transmission link of the construction of WCDMA network first, main job is to complete MF210 drive, the PPP to transplant with the PPP dial-up, and then in the

II

重庆邮电大学硕士论文 Abstract

application layer using RTP (real-time transport protocol) encapsulation encoded NAUL data, finally create a socket, will be packaged into RTP packets sent to the WCDMA network.

During the testing phase, through to the system of the whole test, verify the anticipated target of the project successfully completed the module design.

Keywords: video Capturing and Encoding and Transmiting, Davinci, H264, xDM, V4L2, WCDMA

III

重庆邮电大学硕士论文 目录

目录

摘要 ································································································ I Abstract ··························································································· II 目录 ······························································································ IV 第一章 绪论 ······················································································ 1

1.1 视频监控系统行业背景 ······························································ 1 1.2 课题研究背景及意义 ································································· 3 1.3 论文组织架构 ·········································································· 4 1.4 本章小结 ················································································ 5 第二章 视频采集编码发送模块的总体设计 ·············································· 6

2.1 模块相关的关键技术研究··························································· 6

2.1.1 Davinci技术 ····································································· 6 2.1.2 V4L2视频采集驱动接口 ····················································· 7 2.1.3 H.264视频编码技术 ··························································· 7 2.4.4视频传输协议与技术 ·························································· 8 2.2模块架构设计 ·········································································· 9

2.2.1视频监控系统构架 ····························································· 9 2.2.2 模块的需求分析 ····························································· 10 2.2.3 模块硬件平台的选择 ······················································· 11 2.2.4 模块总体架构的设计 ······················································· 12 2.3 本章小结 ·············································································· 13 第三章 搭建嵌入式开发环境平台························································· 14

3.1 DaVinci硬件开发环境 ······························································ 14

3.1.1 DM6467处理器特点 ························································ 14 3.1.2 采集译码器TVP5158功能概述 ·········································· 15 3.2 DaVinci软件开发环境 ······························································ 16

3.2.1 xDM算法标准介绍 ·························································· 17 3.2.2Codec Engine概述 ···························································· 18 3.3 嵌入式开发环境搭建 ······························································· 21

3.3.1 Linux服务器搭建 ···························································· 21 3.3.2工作站配置 ···································································· 23

IV

重庆邮电大学硕士论文 目录

3.3.3 Davinci平台初始化·························································· 23 3.4 本章小结 ·············································································· 27 第四章 视频采集编码发送模块的设计与实现 ········································· 28

4.1视频采集模块设计实现 ···························································· 28

4.1.1 视频采集模块的设计 ······················································· 28 4.1.2 V4L2编程接口 ······························································· 29 4.1.3视频采集模块的实现 ························································ 30 4.2视频编码模块的设计与实现 ······················································ 34

4.2.1 视频编码模块的设计 ······················································· 34 4.2.2 H.264编码器的实现 ························································· 34 4.2.3视频编码模块的实现 ························································ 46 4.3视频传输模块的设计与实现 ······················································ 48

4.3.1视频传输模块设计 ··························································· 48 4.3.2 视频传输链路实现 ·························································· 48 4.3.2视频传输模块实现 ··························································· 51 4.4 本章小结 ·············································································· 53 第五章 系统测试 ·············································································· 55

5.1 测试内容和预期目标 ······························································· 55 5.2 测试过程 ·············································································· 56

5.2.1 测试网络环境搭建 ·························································· 56 5.2.2 测试步骤 ······································································ 57 5.3 测试结果及分析 ····································································· 58 5.4 本章小结 ·············································································· 60 第六章 总结与展望 ··········································································· 61

6.1 工作总结 ·············································································· 61 6.2 不足和展望 ··········································································· 61 致谢 ······························································································ 63 参考文献 ························································································ 64 附录 攻读硕士学位期间的科研工作 ····················································· 67

V

重庆邮电大学硕士论文 第一章 绪论

第一章 绪论

1.1 视频监控系统行业背景

随着人们对安全要求的不断提高和嵌入式微处理器、多媒体压缩技术以及无线传输技术的迅猛发展,无线实时视频监控系统得到了快速的发展与应用。从技术角度上研究视频监控系统,可以将视频监控系统划分为三个阶段,分别是:第一阶段的模拟视频监控系统(CCTV),第二阶段的数模结合的视频监控系统(DVR)。而随着多媒体传输技术的发展,主要是信息编解码技术的发展以及Internet网络和无线网络的发展,数字视频监控系统又可被划分为以数字录像设备为核心的数字化本地视频监控系统和以嵌入式视频服务器为核心的数字化远程视频监控系统,即第三代的网络视频监控系统。近年来个人化、智能化和网络化将是未来视频监控市场主要的发展趋势[1],视频监控应用的发展过程如图1.1所示。

高清模拟视频监控数字视频监控网络视频监控智能模拟摄像机+DVS+存储网络摄像机+存储模拟摄像机+DVR(网络)2010模拟摄像机模拟摄像+录像机机+DVR(磁带式)19992005

图1.1 监控应用的变迁

一.模拟视频监控系统

模拟视频监控系统使用专用的同轴线缆传输模拟的视频信号,它的系统硬件组成主要部分是摄像机、线缆、录像机和监视器等设备。随着多媒体技术编解码技术发展,微处理器性能的提高以及网络带宽的提高,视频监控系统在硬件结构方式、功能实现、性能以及扩展性方面都有了重大的变化,视频在系统构成上更加灵活个性化,功能上更加丰富、全面,人机交互更加友好易于操作,系统的外围接口更加丰富且统一,便于系统的功能拓展。但是,由于视频信息流的在系统中依然是以模拟信号传输,视频监控系统的的系统构架难以发生巨大的变革,同时模拟视频监控系统的网络结构是一种单向、单功能形式的信息采集传输网络,因此虽然系统的整体技术已发展到很成熟的技术水平,但是由于以上系统结构和网络结构的局限,模拟监控系统的发展已经到达一个瓶颈阶段,难以满足日益提

1

重庆邮电大学硕士论文 第一章 绪论

升的视频监控需求。模拟监控系统的主要缺陷是:

(1) 系统监控区域有限。由于模拟信号在同轴电缆传输的范围有限,导致系统通常只适合应用在范围较小的监控区域;

(2) 系统的扩展能力差。对于已建立好的监控系统,由于其组网架构以及系统功能架构的局限,若要去增添设备,则需要大范围的修改系统,甚至重建系统。

(3) 不能形成有效的报警联动。由于系统各部分独立运行,相互之间的协议不能发生通信,造成联动只能在很小的范围内进行,不便对系统进行有效的掌控。

所以,要满足对视频监控更高的要求,监控数字化是必由之路。而且数字通信的快速发展,也保障了数字化的可能性。

二.数字视频监控系统

90年代初,微处理器技术和彩色视频技术的发展推动了数字视频监控系统的出现与发展。数字视频监控系统系统利用微处理器的对数据的高速处理能力进行视频的采集和编码等处理,利用彩色视频技术在高分辨率的显示器上实现多画面的清晰显示,大大提高了视频监控系统的质量。这种基于微处理器的多媒体主控平台系统被称为数字视频监控系统。数字视频监控系统的主要技术产品是DVR,采用windows平台,在个人计算机上安装不同型号的视频显卡和对应的DVR软件,用户可以得到相应的1、2、4路的采集视频,并可以得到实时的语音和视频传输服务。

但是由于视频编解码技术发展和网络技术发展的滞后,有限的带宽不能支持传输数据量巨大的视频数据,监控信息大多只局限于本地系统,难以进行远程的视频监控。但是市场对视频监控的更高的需求不断的推动着视频编解码技术、流媒体技术以及网络技术的发展,从而也把网络视频监控推向了发展的必然。

三.网络视频监控系统

90年代末期,随着计算机处理能力提高、多媒体编解码技术发展、网络带宽和存储容量的迅速提升、以及各种视频处理技术的发展,以嵌入式技术为主要平台,以网络、通信技术为依托,以智能图像分析为特色的网络视频监控系统正快速的登上视频监控的舞台,引发了视频监控行业的技术革命,赢得了学术界、 用户的高度重视。网络视频监控的出现使得视频监控开始向道路交通、家庭、教育、企业信息化、医疗等新的运用领域渗透[2]。

网络视频监控即IP监控,网络视频监控就是依靠有线或者无线IP网络以数字化的形式实现视频信息的远程传输。只要是网络可达的地方,无论是以有线还是无

2

重庆邮电大学硕士论文 第一章 绪论

线的方式,只要有需要就可以轻松地实现视频监控和视频数据的存储。同时,网络视频监控还可以完美的和其它类型的监控系统进行结合,便于系统的兼容与扩展。

尽管当前网络视频由于其成本限制,使其应用主要局限于智能交通、平安城市等大型项目中,但随着社会发展、人民经济水平提升以及对安防监控要求的提高,智能家居、家庭安防等行业应用正在崛起[3]。同时,因为智能监控所具有的及时、精确、便捷和节约资源等优势,随着技术的发展市场的扩张,新一代网络化、智能化和个人化的视频监控有极大的研究价值,必将得到广泛的推广和应用[4]。

1.2 课题研究背景及意义

随着近年来社会的不断的快速发展,各国各行业对安防越来越重视,视频监控行业取得了长足的发展。在中国,伴随着技术日渐成熟和成本降低,以及在―平安城市‖工程、世博会、奥运会等重大项目和事件的推动下,视频监控市场得以快熟的发展和结构调整,使得基于网络的数字监控逐步成为市场主导,而传统的模拟监控市场逐步萎缩。目前基于嵌入式无线流媒体技术是网络视频监控市场中应用最为广泛的视频监控技术。

基于嵌入式无线流媒体技术是嵌入式技术、无线网络技术、视频编码技术和流媒体传输技术的结合[5]。在嵌入式方面,DaVinci技术融合了ARM与DSP技术,这样使得达芬奇处理器既具备ARM良好的控制功能,又有DSP强大的计算能力,能够满足更多应用场合的需求。在传输方面,无线视频监控具有高移动性、架设灵活、管理方便和综合成本低的优点。目前WCDMA是国内应用最为广泛的3G网络制式,如果支持HSPA网络的话,那么理论最高上行是5.76Mbps,理论最高下行是7.2Mbps,如果是支持HSPA+网络的上网卡设备,理论最高下行则是21Mbps。这样的理论带宽足以满足无线实时流媒体的传输,但在实际运用中由于无线信道的高信噪比、高衰落等复杂性和网络本身的缺陷导致无线信道容量有限,要实现清晰、实时的无线视频传输仍然存在困难。在编码方面, H.264编码技术因其低码率(高压缩比)、高质量画面、容错能力强、网络适应性强,逐渐得到学术界和工业界的广泛认可,成为当前无线视频编码领域最为热门技术之一。在流媒体传输方面,RTP协议是应用非常广泛的流媒体实时传输协议,针对流媒体传输的连续性、实时性和占用带宽较大的特性,RTP协议经常配合使用UDP不可靠传输协议来传输数据。

虽然视频压缩技术和无线传输带宽有了长足进步,但考虑到无线视频传输中视频数据量庞大、传输实时性要求高而无线信道的带宽有限,完成视频数据在无

3

重庆邮电大学硕士论文 第一章 绪论

线信道中上的实时传输仍然是一个巨大挑战。

本课题设计源于本人研究生期间参与的科技型中小企业技术创新基金项目《基于TD-SCDMA的远程无线视频监控系统》。课题方案中ARM微处理器通过V4L2编码驱动接口控制 TVP5158 芯片实现视频的多路复合采集,经过解复用之后,把采集的视频数据进行 H.264 实时压缩编码,在应用层利用RTP实时传输协议封装视频数据,最后通过MF210 无线发射模块把视频数据发送到 WCDMA网络中。论文最终完成了无线实时视频监控系统中的视频采集、编码、发送模块的设计与实现。

1.3 论文组织架构

本论文一共分为6章,其中,第一章是绪论部分,第二至第五章是论文的主体,第六章是论文的工作总结和展望。

第一章是绪论部分。从视频监控从模拟到数字、网络的发展历史讲起,介绍了视频监控的发展,本课选题背景、意义及主要研究内容。

第二章是模块的总体设计。首先研究了与模块相关的关键技术,然后分析了模块的功能需求,并根据功能分析设计了视频采集、编码、发送模块的总体架构。

第三章是搭建系统的开发平台。首先分析了DaVinci硬件以及软件开发环境,并根据开发需完成嵌入式开发环境搭建,主要工作包括嵌入式Linux服务器搭建、开发工作站配置、嵌入式Linux内核移植等。

第四章是系统软件设计与实现部分。分别设计实现了视频图像采集、视频图像编码和视频图像发送三个子模块。

(1).视频采集子模块:设计实现基于V4L2采集驱动规范的视频采集。 (2).视频编码子模块:设计实现视频数据的H.264压缩编码。具体实现过程是:构建H264编码器,主要工作包括完成X.264编码算法的xDM封装,CS(Codec Server)生成、CE(Codec Engine)引擎配置等,继而调用编码器的VISA API接口实现视频编码;

(3)视频发送子模块:实现视频数据的无线发送。先构建WCDMA网络的传输链路,主要工作是完成MF210驱动与PPP移植,以及ppp拨号实现,然后采用基于UDP协议的RTP流媒体实时传输协议打包视频数据,最后创建socket发送数据到wcdma网络中。

第五章是对模块软件的性能的测试与验证。结合整个视频监控系统进行测试,通过实测图像来评定系统设计实现的完成情况。

第六章 对论文进行总结及下一步研究方向。

4

重庆邮电大学硕士论文 第一章 绪论

1.4 本章小结

本章主要介绍了该课题的研究背景;分析了当前视频监控技术的研究现状;分析了系统背景以及应用价值;最后指明了该课题的研究内容以及编排了本论文的组织结构。

5

重庆邮电大学硕士论文 第二章 视频采集编码发送模块设计

第二章 视频采集编码发送模块的总体设计

本章首先从硬件平台、视频采集子模块、视频编码子模块、视频发送子模块方面研究了适用于本课题的DaVinci技术、V4L2视频采集驱动规范、H264编码算法以及WCDMA技术和RTP流媒体实时传输协议等。然后分析了视频监控系统的总体架构,在此基础上分析了模块的功能需求,根据需求分析设计了模块的整体架构。

2.1 模块相关的关键技术研究 2.1.1 Davinci技术

达芬奇技术由达芬奇处理器、达芬奇软件、达芬奇开发工具和达芬奇技术支持组件等优化构成,其结构如图2.1所示[6][7]。

处理器间通信操系统作软 件API驱动编解码器DAVINCI加速器 芯 片外 设处理器第三方支 持授权软件提供商(ASP)框架结构评估模块参考设计开发工具套件Green Hills开发工具数字视频开发平台 图 2.1达芬奇技术结构图

DaVinciTM处理器是TI公司为面向视频编解码应用而专门设计的一款数字流媒体处理器。在硬件方面,DaVinci技术集成了ARM与DSP双核处理器,它在DSP处理器运行DSP/BOIS操作系统,利用其强大的数据处理能力和高速的运转速度实现对音视频的编解码以及实现图像的相关处理;在ARM处理器运行MontaVista Linux操作系统,利用其良好的控制功能,实现对外围设备的控制,如设备的初始化、远程调用DSP算法库等;在软件方面,TI为视频软件开发商提供了标准化编码器接口,增强了编码器的移植性,简化了二次开发的难度,同时TI还提供了集成处理器、软件、工具等支持,简化了设计与开发进程,加速了产品

6

重庆邮电大学硕士论文 第二章 视频采集编码发送模块设计

开发与创新速度。

2.1.2 V4L2视频采集驱动接口

V4L2是Linux平台下视频采集设备驱动程序开发的一套规范。它为Linux中视频设备访问提供了通用接口,在Linux系统中,V4L2驱动的Video设备节点路径通常/dev/video/中的videoX。

V4L2是一个两层驱动结构:上层是videodev模块,当videodev初始化后,它把自己注册为一个主设备号为81的字符设备,同时注册自己的字符驱动成员函数;下层是V4L2驱动程序,它实际上是videodev的客户端,videodev通过V4L2驱动程序的成员函数来调用V4L2驱动程序[8]。它使用分层的方法给驱动程序的开发提供了清晰的模型和一致的接口,方便驱动程序的开发。

在应用程序实现视频采集的过程中,通常用到的两个V4L2系统调用是ioctl()和mmap(),其中 ioctl()系统调用负责控制设备的I/O通道,mmap()系统调用使得进程之间通过映射同一个普通文件实现共享内存。

2.1.3 H.264视频编码技术

随着近年来嵌入式流媒体技术快速发展,这使得视频会议,视频监控,可视电话,以及视频直播等得到了长足的发展。但是网络带宽毕竟是有限的,尤其是带宽较窄的无线传输环境中,在因而我们需要在尽可能保证图像质量的前提下,减少视频信息中的冗余量,从而缓解无线网络带宽,这也是视频压缩的目标。因此,视频编码技术也得到了更广泛的应用与发展。

H.264 标准[9]正是在这种大的背景下诞生。H.264标准是由ITU-T和ISO/IEC联合开发的,它定位于覆盖整个视频应用领域,包括:传输DVD和数码相机的高清晰度的视频应用、传输电视广播标的准清晰度和高清晰度视频的应用、传输Internet上的视频流的应用以及传输低码率的无线视频应用等。

H.264从功能上可以分为两层:VCL层(视频编码层)和NAL层(网络提取层)。VCL层主要目标是尽量的独立于各种网络的情况下进行数据高效的编解码。VCL主要完成对块、宏块、片等语法级别的定义和核心压缩引擎,压缩单元主要完成运动补偿、变换编码、熵编码等。NAL层主要目标是根据不同的网络情况,对VCL层的数据进行打包与发送。

H.264作为一种新型的高质量低码率视频编码标准,具有适用性强、压缩率高、图像质量好等特点。在相同的重构图像质量下,H.264与H.263 和MPEG4 标准相比,能节约 50%的码率。H.264标准还引进了面向 IP 包的编码机制,有利于网

7

重庆邮电大学硕士论文 第二章 视频采集编码发送模块设计

络中的分组传输,支持网络中视频的流媒体传输。具有很强的抗误码特性,可适应丢包率高、干扰严重的无线信道中的视频传输[10][ 11]。

2.4.4视频传输协议与技术 1.RTP协议

RTP(Realtime Transport Protocol) 实时传输协议是针对Internet上多媒体数据流的传输的一个协议,它描述了程序管理多媒体数据实时传输的方式,作为RFC1889被IETF发布。

RTP数据包由RTP首部(RTP Header)和RTP负载(RTP Payload)两部分组成。RTP协议是用来传输具有实时特性的数据,它提供端到端的实时数据传输服务。RTP数据通常配合UDP协议使用,利用UDP的多路复用及校验和服务共同完成实时数据传输功能, UDP建立在IP协议基础上,为用户提供了一种而向不可靠的、无连接的数据传输服务,适合传输对实时性要求较高的数据业务。

2.PPP协议

PPP(Point-to-Point Protocol点到点协议)是在同等单元之间传输数据包的链路层封装协议。这种链路提供全双工操作,并按照顺序传递数据包。协议的设计目的主要是用来通过拨号或专线方式建立点对点连接发送数据,使其成为各种主机、网桥和路由器之间简单连接的一种共通的解决方案。

在 20 世纪 80年代末,串行线互联网协议(Serial Line Internet Protocol,SLIP)因传输性能问题阻碍了互联网的发展,于是人们开发了 PPP 协议来解决远程互联网连接的问题[12]。PPP不仅支持异步链路,也支持面向比特的同步链路,同时克服了SLIP只能静态分配IP的缺陷,PPP 协议满足了动态分配 IP 地址的需要,而且PPP协议通过NCPs对多种网络层协议提供支持。因此,PPP 协议在接入网中取得了广泛的应用。

PPP 协议主要由下面四个部分组成:

•封装:一种封装多协议数据报(IP数据报)的方法,实现了在同一链路上传输不同网络协议的复用技术。数据包的最大长度由具体网络的MTU决定。

•链路控制协议(LinkControl Protocol,LCP):用于建立、配置、测试和管理数据链路连接。

•网络控制协议(NetworkControlProtocol,NCP):协商该链路上所传输的数据包格式与类型,建立、配置不同的网络层协议。

8

重庆邮电大学硕士论文 第二章 视频采集编码发送模块设计

•口令认证协议(Password Authentication Protocol,PAP)和质询握手认证协议(Challenge-Handshake Authentication Protocol,CHAP):为PPP连接提供用户认证功能,可以确保PPP连接的安全性。

PPP连接的建立主要经过三个阶段,第一阶段:LCP连接协商阶段,主要完成对基本的通讯方式进行选择,第二阶段:CHAP密码认证阶段,主要完成客户端的权限认证,第三阶段:NCP网络协商阶段,主要完成对上层网络层协议的配置。经过以上三个阶段,一条PPP通信链路便建立起来了。

3. WCDMA技术

WCDMA是一种由3GPP具体制定的,基于GSM核心网,是第三代移动通信系统。WCDMA是一个ITU(国际电信联盟)标准,它是从CDMA(码分多址)演变来的,在官方上被认为是IMT-2000的直接扩展。

目前WCDMA有Release 99、Release 4、Release 5、Release 6 Release 7等版本。其中R99/R4可以提供384kbps上行最高传输速度和下行2Mbps最高速度,在随后的R5(HSDPA)和R6(HSUPA)分别强化了R99/R4版本的下行与上行最大速度,分别达到5.76kbps和7.2bps,R5与R6合称为WCDMA的HSPA版本。在R7版本中下行最大速度又被提升到 21Mbps/28Mbps/42Mbps,甚至56Mbps/84Mbps。后续还有R8的HSOPA和FDD-LTE等后续演进技术,可以看出WCDMA在不断地快速发展。

目前,国内运营主要有三种制式的3G标准,主要有联通的WCDMA、移动的TD-SCDMA以及电信的CDMA2000。与另外两种3G标准相比,WCDMA具有网络建设最为广泛、技术成熟度高、漫游地域最广、终端设备支持最多和拥有用户最多的优势,所以本文选择WCDMA制式作为视频监控系统中无线传输所用的制式标准。

2.2模块架构设计 2.2.1视频监控系统构架

本课题—基于嵌入式Linux视频采集编码发送模块的设计与实现,根源于科技型中小型企业技术创新项目《基于TD-SCDMA的远程无线视频监控系统》。

在项目中,为了方便系统设计、分工和开发实现,系统中采用模块化的思想指导设计无线实时视频监控系统。系统从功能角度上可划分为三个模块:监控前端(PU)、中心服务平台、监控客户端(CU)。

PU端可划分为三个部分:视频服务器外设设备(摄像头、云台、各类传感器

9

重庆邮电大学硕士论文 第二章 视频采集编码发送模块设计

等)、DVS(数字视频服务器)和无线接入设备。PU端是系统的信息采集和处理端,实现告警信息、内容分析数据采集处理,以及音视信息的采集、编码、发送以及本地存储,具有视频数据和控制信令的双向传送功能。

中心服务平台从功能上分为流媒体服务器和信令管理服务器,它是系统中心管理服务器。其中媒体服务器主要功能是采用流式协议将DVS发过来的视频信息转发给监控客户端,信令服务器实现信令流的控制,主要负责客户端控制信令的收发和解析;

CU端是系统的客户应用端,主要完成音视频信息以及警告信息对监控用户的呈现,根据用户权限的不同,高权限用户还可以通过CU实现对系统的设备管理、用户管理等。监控系统功能框架图如2.2所示:

监控客户端(CU)NETWORK中心服务平台媒体服务器信令管理服务器NETWORK监控前端(PU)无线接入单元接入internet无线接入单元(DVS)视频服务器(DVS)视频服务器

图2.2视频监控系统功能框图

本课题完成的功能是无线视频监控系统中PU端的DVS(数字视频服务器)功能实现的主要部分,主要实现多路实时视频采集、视频编码、视频发送。

2.2.2 模块的需求分析 1、功能需求

本模块基于无线实时视频监控系统,该模块完成的内容是视频监控系统中DVS(数字视频服务器)功能重要的一部分。在本模块中,视频传输信道为联通经营的WCDMA的3G制式,信道实际带宽窄、误码率高。本课题的主要内容就是,针对无线实时视频监控系统中实时视频庞大的数据量大、对实时性的高要求和目

10

重庆邮电大学硕士论文 第二章 视频采集编码发送模块设计

前的无线网络传输负载能力之间的矛盾,设计实现了一种应用在无线传输环境下、基于DaVinci技术的远程视频监控系统的多路实时视频采集、编码、发送方案。需要实现的功能包括:

(1)在视频采集方面:实现视频的采集,且可以支持对视频多种属性的控制,如视频分辨率、制式、亮度色度等。

(2)在视频编码方面:实现高速编码、高压缩比的编码算法,使得系统可以应用于带宽较小的无线网络。

(3)在视频发送方面:实现视频的无线实时传输。

2、性能指标

各种功能的具体性能指标如下:

(1)视频采集模块:基于TVP5158芯片,采用V4L2采集驱动接口完成视频采集。

(2)视频编码模块:DSP上实现X.264算法编码,通过Codec Engine机制远程调用编码器,实现视频数据实时编码;

(3)视频发送模块:采用基于UDP协议的RTP实时传输协议封装视频数据,并利用MF210无线模块实现视频的WCDMA无线传输。

2.2.3 模块硬件平台的选择

在项目开发过程中,硬件开发平台的选择很大程度上决定了项目开发难度的难易以及开发周期的长短。基于2.1.1节叙述DaVinci技术的优点,本模块中应用的DVS(数字视频服务器)采用合众达公司专为数字视频处理推出的基于DaVinci技术的SEED-DVS6467嵌入式开发平台,它是以TI公司的TMS320DM6467(简称DM6467)作为核心处理器,在其外围集成了2片译码器TVP5158。其硬件框图如图2.3所示。

11

重庆邮电大学硕士论文 第二章 视频采集编码发送模块设计

MF210无线发送模块ATATVP5158V4L2TVP5158I2CUSB2.0FLASHEMIFDSPTMS320DM6467UARTEAMCDDR2SDRAMRS232RS485PHY802.3以太网接口 图2.3 SEED-DVS6467系统硬件功能框图

本课题中ARM端控制采集译码器TVP5158完成视频采集,远程调用DSP端H.264编码器完成实时视频编码,最后利用RTP协议封装视频数据,并通过MF210无线模块实现视频数据的WCDMA传输。在编码过程中,ARM和DSP之间的交互是通过Codec Engine机制完成,这样DSP处理器端程序员只需关注如何开发DSP算法,ARM处理器端程序员只需负责编写控制程序,双方不需要关心算法和控制程序间如何实现通信的。这样算法程序员和控制程序员可以独立的完成各自的分工工作,很大程度上降低用户的开发难度和开发周期。

2.2.4 模块线程的设计

为了提高系统的实时性,模块主要设计为四个POSIX线程,分别是主线程(Main.c),采集线程(CaputreThrd.c),视频线程(VideoThrd.c),和发送线程(SendThrd.c)[13]。

多线程可以提高程序运行效率和系统的相应速度,但同时也引起了多个线程对共享数据的并发访问问题,如果不处理好线程间的同步,则可能造成共享数据的不一致性。在本设计中,采用条件变量与共享全局变量的方式作为线程间的同步与资源共享机制。系统各线程间的交互示意图如图2.4所示。

具体交互过程为:系统启动后,主线程首先创建并初始化采集线程、视频线程和发送线程,然后将控制权交给SIP信令控制线程(MediaSipThrd.c),SIP信令控制线程负责循环监听客户端的指令。采集线程从采集设备中获取原始数据,并将数据写入线程共享的buffer中,然后触发视频线程,视频线程收到原始数据buffer后,先将多路行交叉模式输出的复合视频数据解复用,并对解复用后的单路视频标记通道ID,然后把空buffer返回给采集线程,再按照通道ID分别进行编码处理,

12

重庆邮电大学硕士论文 第二章 视频采集编码发送模块设计

将编码后的数据buffer送给发送线程,发送线程受SIP信令控制线程条件阻塞,当客户端有请求时,就触发发送线程进行数据流的发送。

采集线程视频线程发送线程各线程初始化从采集设备获取原始数据buffer行交叉复用数据buffer行交叉解复用空buffer返回编码等待发送的编码数据buffer等待客户端请求主循环开始编码buffer发送发送buffer返回获取原始数据buffer采集下一帧行交叉解复用空buffer返回编码编码后的数据buffer编码buffer发送等待客户端终止主循环结束图2.4 系统线程交互示意图

2.3 本章小结

本章研究了与课题相关的关键技术与协议,分析了视频监控的系统的总体架构以及课题模块在系统中实现的功能,最后根据功能分析设计模块的总体架构,为课题研究确定了方向。

13

重庆邮电大学硕士论文 第三章 搭建嵌入式开发环境平台

第三章 搭建嵌入式开发环境平台

嵌入式环境平台搭建是嵌入式软件开发过程中最基础、但也是非常重要的工作,嵌入式开发环境平台环境质量决定了项目的开发的时间以及项目开发质量。本章主要介绍了DaVinci硬件开发平台(DM6467)的软硬件开发环境,并完成了嵌入式开发环境的搭建,主要是Linux服务器搭建、工作站配置、嵌入式Linux平台的初始化。

3.1 DaVinci硬件开发环境

在嵌入式软件开发中,软件开发和嵌入式硬件结构有着紧密的联系,可以说硬件结构在一定程度上决定了软件构架。本课题中使用的嵌入式开发平台是合众达公司针对数字视频处理专门推出的SEED-DVS6467,他在以TI公司的DM6467为核心处理器的基础上集成了两片采集译码器TVP5158。这一节中将会详细介绍DM6467处理器和TVP5158采集译码器。

3.1.1 DM6467处理器特点

DM6467处理器是一种基于 DSP 的片上系统(SoC),充分利用了德州仪器(TI)的DaVinciTM(达芬奇)技术,集成了两个高性能的 ARM926EJ-STM 内核与TMS320C64x+TM DSP 内核,兼有DSP和RISC的技术优势,可同时完成8路实时H.264编解码,以满足下一代嵌入式设备的网络媒体编解码数字媒体处理需求。其结构框图如图3.1所示。

DM6467集成了ARM和DSP双核与一身,兼有高速处理数据能力和强大的控制管理能力。DM6467芯片主要组成部分是一个DSP子系统、一个ARM子系统、两个可编程的高清视频协处理器VICP0和VICP1、视频预处理模块:包括一个视频转换引擎和两个视频输入/输出端口VPIF接口,以及其它外设接口。

14

重庆邮电大学硕士论文 第三章 搭建嵌入式开发环境平台

输入时钟JTAG接口系统控制时钟发生器电源/休眠多重管脚ARM子系统ARM926EJ-S CPU16 KBI-Cache8 KBD-Cache视频图像处理器DSP子系统C64x+™ DSP CPU128 KB L2 RAM32 KB L1 Pgm32 KB L1 DataHigh Definition Video-Imaging Coprocessor (HDVICP0)32 KB RAM8 KB ROMHigh Definition Video-Imaging Coprocessor (HDVICP1)交换中心资源(SCR)外设EDMAMcASP串行接口I2CSPIUART系统通用定时器看门狗定时器PWMVDCECRGEN连通性PCI(33MHz)UBS 2.0PHYVLYNQEMAC / MDIOHPI程序/数据存储DDR2Mem Ctlr(16b/32b)Async EMIF/ NAND/ SmartMediaATATSIFVideoPort I/F

图3.1 DM6467结构图

ARM子系统:采用基于RISK技术、主频为500MHz的ARM926EJ-S™做为内核。它采用的32位ARM指令集实现处理器最高的性能和灵活性,为了提高代码密度,处理器也支持16位的Thumb指令集。该内核采用流水线运行,使得处理器和内存系统可以连续的运行。ARM处理器上运行Linux系统,实现DM6467的控制功能,主要负责控制以及初始化DSP子系统、视频端口VPIF0/VPIF1、高清视频协处理器VICP、内部存储器以及外设TVP5158等。

DSP子系:采用TI公司MS320C6000系列中具有最高的数据处理速度的TMS320C64x+DSP,主频为1GHz。处理器基于VLIW超长指令架构,集成了64个32字长的通用寄存器和8个独立的功能单元(6个ALU算术逻辑单元,两个32位的乘法器),处理器上运行DSP/BOIS操作系统,主要完成多媒体数据(音频、视频)的编解码以及图像分析等。

同时DM7467集成的视频数据转换引擎(VDCE)和两个高清视频协处理器(HDVICP)减轻了DSP核心的数据处理的任务,使得DSP在处理高清视频的同时也可以处理普通视频编码以及图像分析算法等。同时丰富的外围接口可以实现视频的采集、发送等功能。

3.1.2 采集译码器TVP5158功能概述

为了与DM6467的高性能数字信号处理能力相配合,本设计采用TI公司的

15

重庆邮电大学硕士论文 第三章 搭建嵌入式开发环境平台

TVP5158芯片作为模数转换器(ADC)。TVP5158是4路高清NTSC/PAL视频译码器,它可将所有通用基带模拟视频解码成数字视频输出,其视频输出端口支持2种数字视频格式:8位的ITU-R BT.656 4:2:2格式和16位的YCrCb 4:2:2格式,可满足标清或高清视频输出。TVP5158的功能框图如图3.2所示。

10-bit模/数转换器Y/C分离降噪处理/自动对比缩放引擎DVO_A_[7:0]10-bit模/数转换器Y/C分离降噪处理/自动对比缩放引擎DVO_B_[7:0]输出格式转换器10-bit模/数转换器10-bit模/数转换器Y/C分离降噪处理/自动对比降噪处理/自动对比缩放引擎DVO_C_[7:0]Y/C分离缩放引擎DVO_D_[7:0]ARM寄存器I2C主机端口延迟检测/重新同步级联模式输入

图3.2 TVP5158功能框图

每个译码通道包含1个10-bit 27-MSPS的模数转换器,复合输入信号按照2×ITU-R BT.601的时钟频率进行抽样。为了降低亮度和色度信号(Y/C)之间交叉干扰,采用5线自适应梳状滤波器进行Y/C分离,这种分离方式使得Y/C完全互补,因此没有信号丢失。4个译码通道可独立运行,用户可以通过I2C主机接口来控制各通道的对比度、亮度、饱和度和色度视频特征,以得到最好的图像质量。另外,TVP5158可级联,在级联模式下,能同时支持8通道视频或16通道音频的处理,并可以与TI的DAVINCI处理器形成无缝接口,降低了设备的成本。

3.2 DaVinci软件开发环境

DaVinci平台在设计上具有两大技术优势:一是硬件上的优势,该平台基于ARM+DSP的双核处理架构,它使得DaVinci平台既具有ARM的强大管理控制功能,又有DSP所具备的算法处理能力;另外一个优势就软件方面,DaVinci软件框架由应用层、信号处理层和I/O层三部分组成。在本文所采用的DM6467平台下,应用层位于ARM端的Linux系统上,应用层的开发者能够充分根据开发需要,通过编写相关的应用程序实现对远程算法的控制调用;信号处理层位于DSP端,主

16

重庆邮电大学硕士论文 第三章 搭建嵌入式开发环境平台

要负责各种音视频编解码算法的处理及DSP实时操作系统DSP/BIOS的运行等;I/O层是DaVinci各种输入输出外设的驱动程序。下面分别对DaVinci软件框架中的xDM算法标准及Codec Engine进行介绍。

3.2.1 xDM算法标准介绍

xDM标准(eXpressDSP Digital Media Standard)是TI公司针对DaVinci技术而制定的一套DSP算法封装标准。xDM标准基于TI公司的算法协同标准xDAIS(eXpressDSP Algorithm Interoperability Standard)[14],并在xDAIS标准之上扩展了视频、图像、语音以及音频四类编解码接口,同时为了实现ARM与DSP双核间的通信,也添加了一些通信协议。要在不修改TI公司为DaVinci平台提供的双核通信机制下实现自己的音视频算法,就需要使算法遵循xDM标准。

采用xDM标准封装算法库有很多优越性[15]: (1)可移植性强

由于各个算法的封装都采用统一的编程接口,如图像算法接口、音频算法接口以及语音算法接口和视频算法接口,所以开发人员只需通过简单修改配置文件,就可以移植遵循xDM标准的第三方算法到自己的DaVinci平台使用,同时无需修改应用程序框架,避免了重复开发工作,加快了OEM的产品开发速度。

(2)算法互操作性强

由于不同商家开发的算法经过xDM封装后可以同时被上层应用软件使用,使得产品可以在不同的算法之间切换使用,增强了算法的互操作性。

(3)算法开发周期短

由于TI公司提供了统一的API和双核之间通信机制,在嵌入式编程中,开发人员避免了利用C或汇编语言和底层硬件打交道,降低了开发难度,缩短了算法开发周期。

xDM标准扩展了8中接口类型,以面对不同应用场景(例如音视频编解码、图像处理等)。这些接口如图3.3所示,其中x为接口版本。

17

重庆邮电大学硕士论文 第三章 搭建嵌入式开发环境平台

xDM接口类型IVIDENCx视频编码器通用接口IVIDDECx 视频解码器通用接口IAUDENCx 音频编码器通用接口IAUDDECx 音频解码器通用接口ISPHENCx 语音编码器通用接口ISPHDECx 语音解码器通用接口IIMGENCx 图像编码器通用接口IIMGDECx 图像解码器通用接口

图3.3 xDM接口类型

3.2.2Codec Engine概述

传统的多媒体系统开发方式是应用层直接调用底层编解码算法接口,从而完成数据的相关处理,如图3.4所示:

应用层编解码算法

图3.4 两层拓扑结构图

两层拓扑结构中由于开发人员直接调用下层算法库接口,所以开发过程中需要了解算法内存管理等细节,开发难度较大,对开发者要求较高,开发周期较长。与此同时,由于不同的算法之间内存管理细节等存在的差异较大,应用程序是都

18

重庆邮电大学硕士论文 第三章 搭建嵌入式开发环境平台

是根据特定的算法而设计实现,所以应用程序的通用性差。例如,在实现音频算法时,若需要将WMA算法替换为MP3算法,应用程序也需要做较大的改变[16]。

而在基于Davinci技术嵌入式平台的应用程序开发中,TI提供的Codec Engine机制将多媒体系统开发架构由以前的两层拓扑结构变为三层,如图3.4所示:

应用层Codec Engine编解码算法 图3.4 三层拓扑结构图

DaVinci构架中在应用层和算法库之间添加了一个编解码器引擎层(Codec Engine),它使得开发人员不再与算法库发生直接联系,而是通过Codec Engine的API远程调用符合xDM封装的算法。应用程序开发人员无需再关心算法库的内存管理如何运作,只需简单地调用Codec Engine提供的标准API(VISA接口)便可实现数据处理,极大地简化了应用程序开发人员的工作量,加快了开发进程。应用程序接口与Codec Engine及xDM算法的结构如图3.5所示:

应用程序接口(VISA API)VIDENC1_create()VIDENC1_control()VIDENC1_process()VIDENC1_delete()Codec Engine框架层algNumAllocalgAllocMEM_allocalgInitalgNumAllocalgFreeMEM_freecontrolprocessxDM算法层:DSP信号处理算法algNumAllocalgActivatealgAllocalgDeactivatealgInitprocessalgFreecontrol

19

重庆邮电大学硕士论文 第三章 搭建嵌入式开发环境平台

图3.5应用层与Codec Engine及xDM算法层次结构

DM6467处理器采用异构架构GPP+DSP,GPP端运行ARM Linux程序,主要完成DSP算法的远程调用和控制,DSP端运行具体的算法实例。ARM与DSP处理器间采用DSPLink协议完成远程调用(RPC),实现处理器间的通信。处理器之间具体的通信实现过程是:GPP端的应用程序向运行在ARM端的Codec Engine发送命令,Codec Engine接受命令后将命令传送给运行在远端的DSP上的Codec Server,Codec Server接收命令,DSP做出相应的算法响应。

基于以上分析,在Davinci嵌入式平台的软件开发可以分为四个层次:如图3.6所示:

(1)DSP算法开发:基于DSP在CCS上开发系统需求的算法,或者通过移植优化开源算法实现自己需要的算法功能,最后将算法依照xDM标准进行封装。

(2)Codec Server集成:利用DaVinci软件套件提供的xdc编译工具,创建DSP侧运行且可以被ARM远端调用的可执行程序,即Codec Server。

(3)Codec Engine集成:引擎配置的工作,包括引擎的名字、每个引擎中包含什么编解码器、编解码器是本地执行还是远程执行等,如果这些编解码器在远程执行的,则还需配置相应的Codec Server。

(4)Davinci应用层开发:根据需求分析开发应用程序,应用程序通过Codec Engine提供的VISA API调用远程算法库,实现数据处理。为了完成远程调用(RPC)首先要加载DSPLINK和CMEM两个驱动程序模块,其中DSPLINK主要实现了ARM和DSP的底层通信,而CMEM则主要是完成在物理段上分配连续内存的功能。

应用程序开发ARM端可执行应用程序各种不同的codec包:x64P,cfg*.cfg引擎配置各种引擎配置服务器名称Codec列表*.x64PDSP服务器构建运行在DSP上的可执行程序:.cfg .tcf main()DSP/BIOS ,FC Link, xDC*.a64P.xdc .xs和.bld 配置文件DSP算法开发编解码各种算法包算法库C语言算法源代码采集数据

20

重庆邮电大学硕士论文 第三章 搭建嵌入式开发环境平台

图3.6 DaVinci软件开发过程

项目开发中其他工作人员已完成X.264开源代码的DSP移植、优化工作,在本文的研究中,主要实现算法的xDM标准封装、Codec Server生成、Codec Engine配置和编码应用程序的开发。

3.3 嵌入式开发环境搭建

本课题采用SEED-DVS作为模块的硬件开发平台。基于嵌入式目标系统SEED-DVS的嵌入式Linux开发环境一般由服务器(Linux平台),开发工作站(windows平台)、嵌入式开发平台(SEED-DVS)等组成,其具体结构如下图3.7所示。开发人员在工作站进行程序开发或者通过工作站远程连接Linux服务器进行程序开发,程序开发完成后通过网络文件系统把程序上传到Linux服务器进行交叉编译,最后下载到嵌入式平台运行、测试。

图 3.7 Linux开发环境架构

3.3.1 Linux服务器搭建

如上图3.7可知Linux服务器是嵌入式软件开发重要的组成部分,是编译嵌入式Linux内核、开发应用程序以及交叉编译环境的公共平台[17]。为了保证开发工作的开发速度、以及开发环境的稳定,Linux服务器必须运行快速、且稳定,本课题中采用IBM多核服务器,并安装了性能稳定的ubuntu Linux操作系统。

合众达公司为了方便客户开发工作提供了SEED-DVS667平台的开发软件套件:SEED-DVS6467_SDK.tar.gz。它主要包括ARM端的arm v5t交叉编译器、linux内核以及目标文件系统开发包,相关软件开发包,Linux环境的NFS文件系统包等。

21

重庆邮电大学硕士论文 第三章 搭建嵌入式开发环境平台

Linux服务器搭建过程也就是SEED-DVS667开发套件的安装过程。 1.在IBM服务器上安装ubuntu10.04Linux; 2.DaVinci Linux Develop Software 目录执行 Host#cp SEED-DVS6467_SDK.tar.gz /opt

(将开发套件SEED-DVS6467_SDK.tar.gz拷贝到Linux服务器的/opt目录下); Host #tar -zxvf SEED-DVS6467_SDK.tar.gz

(在当前文件夹下解压SEED-_DVS6467_SDK.tar.gz);

由于安装套件比较大,解压需要十几分钟。 在SEED-SDK 解压完成后,在/opt 使用命令Host#ls可以看到一下文件夹:

该目录下为ARM 端的armv5t 交叉编译,该目录下为DVEVM 与DVSDK 套件,包括各种

cmen、 dsplink、framework components、codec engine、demo 源码等

linux 内核以及目标文件系统;

该目录为配置完毕的NFS 文件系统;

3.配置交叉编译器

由于嵌入式开发板的资源有限,若直接在开发板上进行编译工作,花费时间周期长,且浪费嵌入式有限的资源。所以一般在嵌入式开发中,编译工作主要在资源丰富的服务器进行交加编译。主要通过修改该环境变量来配置ARM v5t 交叉编译器的路径;具体步骤是:

修改 root目录下环境变量配置文件.bash_profile,执行 Host#cd /root (进入配置文件路径) Host#vi .bash_profile(打开配置文件)

在 PATH=$PATH:$HOME/bin 紧接的一行,添加以下内容 :

PATH=\"/opt/mv_pro_4.0.1/montavista/pro/devkit/arm/v5t_le/bin:/opt/mv_pro_4.0.1/montavista/pro/bin:/opt/mv_pro_4.0.1/montavista/common/bin:$PATH\"

保存退出即可(需要重启生效)。 4.配置NFS(网络文件系统)

为了方便开发人员和服务器交换数据,需要配置服务器的NFS(网络文件系统),设置访问者的权限、方式、以及访问路径等。主要通过配置/etc/exports脚本文件配置NFS 文件系统服务 ,具体过程如下:

22

重庆邮电大学硕士论文 第三章 搭建嵌入式开发环境平台

Host#vi /etc/exports (打开配置文件并添加以下内容 ) opt/nfs *(rw,sync,no_root_sqush,no_all_squash) 保存退出即可。

无需重启服务器,可以通过以下命令重启nfs 服务:

Host# /usr/sbin/exportfs -a (重新mount文件/etc/exports中的内容) Host# /sbin/service nfs restart (重启NFS服务) 至此,SEED-SDK开发工具安装完毕。

3.3.2工作站配置

工作站一般是该局域网中windows操作系统的计算机,是开发人员的操作终端。开发人员可以通过以下方式来开发程序:

为了方便程序员开发软件,程序员通常在window平台的工作站进行软件开发。通常可以通过两种方式完成程序开发:

a) 通过虚拟机开发

在工作站中安装VMware虚拟机,并在VMware上安装Linux操作系统,然后通过虚拟机来进行程序的开发。

b) 通过远程连接Linux服务器,在服务器上直接开发。

为了可以更好地使用服务器的优良硬件开发环境,开发人员可以通过putty远程登录到Linux服务器,直接在Linux服务器上开发程序。

当程序开发完成后,开发人员需要把程序上传到服务器上,使用ARM v5t 交叉编译器进行交叉编译,最后通过网络文件系统把编译好的可执行文件拷贝到目标开发板中进行功能测试。

3.3.3 Davinci平台初始化

嵌入式 Linux 操作系统从系统上电到运行用户应用程序,需要经过三个重要的过程:加载 Bootloader、启动 Linux 系统、挂载根文件系统[18][19]。嵌入式系统启动流程如下图3.8所示。为了顺利启动嵌入式Linux操作系统,本节将完成以下三个方面的工作:

1. U-Boot编译烧写; 2. Linux 内核定制烧写; 3.根文件系统烧写;

上电复位加载Bootloader装载Linux内核挂载根文件系统用户登录 23

重庆邮电大学硕士论文 第三章 搭建嵌入式开发环境平台

图3.8 嵌入式Linux的初始化过程

一.U-Boot烧写

Bootloader嵌入式系统上电后最先执行的一段代码,它是一段引导程序,可以完成硬件设备的初始化、建立内存空间映射图,然后把Linux内核镜像文件加载到RAM中去,并跳转到它的入口处去执行。在所有的嵌入式系统中,构建或者移植Bootloader都是一项最基本的任务。

常见的Bootloader有Redboot、ARMboot、U-Boot、Bios-lt等。本课题中采用U-boot。它具有以下优点:

1.开源代码。

2.较高的可靠性和稳定性。 3.具有高度灵活的设置功能。

本系统中使用的U-boot是在开发套件提供的。 编译过程如下:

将u-boot-1.2.0_dvs6467.tar.gz 拷贝 到Linux 服务器的/opt ,然后执行如下命令:

Host#cd /opt

Host#tar –zxvf u-boot-1.2.0_dvs6467.tar.gz Host#cd /opt/ u-boot-1.2.0_dvs6467 Host# make disclean

Host#make ARCH=arm CROSS_COMPILE=arm_v5t_le- davinci_dm646x_config Host#make ARCH=arm CROSS_COMPILE=arm_v5t_le-

编译生成的u-boot.bin 文件在/opt/ u-boot-1.2.0_dvs6467 文件夹下面。 然后进行u-boot烧写。首先进行环境的软硬件的配置,硬件上主要将仿真器的JTAG连接到DM6467上,软件上主要配置CCStudio v3.3 IDE环境。

在完成配置工作后,启动CCStudio v3.3后,选择ARM端打开,加载GEL(General Extension Language),连接ARM发端;

将已经准备好的两个文件u-boot.bin与NORWriter.out拷贝到某一分区的根目录下,例如D:\\ ;

在CCS中点击命令File-Load Program,用来加载文件NORWriter.out; 然后点击运行,程序会弹出如图3.9所示对话框,在对话框中输入u-boot所在路径,点击确认OK,变完成了u-boot的烧写。

24

重庆邮电大学硕士论文 第三章 搭建嵌入式开发环境平台

图3.9 u-boot烧写示意图

二.内核配置与编译

由于在X86平台编译的嵌入式内核需要烧写在ARM架构处理器的目标系统上,因此涉及到交叉编译。交叉编译需要在编译时指明嵌入式目标系统的CPU架构(ARM)以及交叉编译工具(arm_v5t_le-gcc)。

进入内核源码目录后执行如下命令进行内核配置:

make ARCH=arm CROSS_COMPILE=arm_v5t_le- menuconfig 得到配置界面如图3.10所示:

图3.10 内核配置界面

然后可以根据本系统的外围电路和实际需求,对 Linux 的内核功能进行裁剪,裁剪的主要部分是设备驱动。例如,ATA、PPP、TVP5158等。

例如为支持视频采集,将采集驱动程序davincihd_capture.c和tvp5158.c拷贝到内核的/drivers/media/video/davinci目录

25

重庆邮电大学硕士论文 第三章 搭建嵌入式开发环境平台

进入配置页面后光标进入 Device Drivers ———> Video For Linux———> <*> TVP5158 video decoder <*> DM646x Video Capture

最终配置好后,保存配置并退出界面即可。 执行如下命令编译内核:

make ARCH=arm CROSS_COMPILE=arm_v5t_le- uImage

编译完成后,在嵌入式的内核源码的arch/arm/boot路径下会生成Image, zImage以及uImage三个文件。其中Image一般不足4M,本系统中为2.7M,它是内核镜像文件,zImage一般不足2M,本系统中为1.3M,是压缩的内核镜像文件, uImage是U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的―头‖, 这个头部信息主要包含内核的版本、加载位置、生成时间、大小等信息,uImage头部之后的内容与zImage的内容完全一致[20]。其实zImage和uImage的区别就是一个自动跟手动的区别,有了uImage头部的描述,U-boot就知道对应Image的信息,zImage没有头部信息,则用户需要自己手动添加这些信息。

最后通过TFTP烧写uImage。首先分别通过串口线连和网线接TFTP服务器和DM6467开发板。把uImage拷贝至TFTP服务器文件夹下,开启TFTP服务器,配置相关参数,便可把uImage烧写至NORFLASH。烧写过程如下:

Target# setenv serverip 192.168.2.26 //配置TFTP服务器地址 Target# setenv ipaddr 192.168.2.136 //配置DM6467 平台的IP 地址 Target# setenv ethaddr 00:0C:29:94:D7:D6 //配置网卡物理地址 Target# tftp 0x80800000 uImage

Target# protect off 0x420400000 +0x180000 Target# erase 0x420400000 +0x180000

Target# cp.b 0x808000000 0x420400000 0x180000 Target# setenv bootcmd bootm 0x420400000 Target#save

三.根文件系统的烧写

开发套件提供了DM6467的根文件系统rootfs.tar.gz,这一节中完成根文件系统的烧写,具体工作是:编写烧写脚本文件prep-ATA和restore-ATA,然后执行脚本文件完成根文件系统的烧写。

26

重庆邮电大学硕士论文 第三章 搭建嵌入式开发环境平台

prep-ATA脚本主要完成对烧写目标硬盘的前期准备工作,主要包括ATA硬盘空间的探测、硬盘的分区、格式化硬盘(ext2或者ext3文件系统)等。

restore-ATA脚本完成根文件系统的具体烧写。具体步骤如图3.11所示:

创建一个挂载节点挂载硬盘拷贝根文件系统至硬盘烧些根文件系统 图3.11 根文件系统烧些步骤

在完成以上脚本文件编写后,在局域网内连接Linux服务器和DM6467。根文件系统具体的烧写过程如下:

1.以网络文件系统(NFS)启动DM6467开发板;

2.拷贝脚本文件prep-ATA和restore-ATA以及根文件系统rootfs.tar.gz至Linux服务器的/opt/nfs/mnt路径下;

3.执行命令进行根文件系统的烧写 Host#cd /mnt Host#./prep-hdd

4.重新启动开发板,配置U-boot环境变量,设置系统从硬盘启动; Target# setenv bootargs mem=120M console=ttyS0,115200n8 root=/dev/hdb1 noinitrd rw ip=192.168.2.230:255.255.255.0:192.168.2.1

5. 保存设置,输入启动命令启动系统 Target# save Target# boot

至此,实现了嵌入式开发板DM6467的U-boot、内核以及根文件系统烧写,嵌入式开发板可以脱离网络文件系统,依靠自身的硬盘文件系统独立运行。

3.4 本章小结

本章首先详细介绍了DM6467的特点以及采集译码器TVP5158的功能;然后介绍了DaVinci软件开发环境,主要介绍了xDM算法封装标准以及Codec Engine机制;最后进行嵌入式开发环境搭建,主要实现了Linux服务器开发环境搭建、开发工作站的配置以及完成DaVinci平台初始化,为嵌入式软件开发完成基础的准备工作。

27

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

第四章 视频采集编码发送模块的设计与实现

本章是模块具体的设计实现部分,主要完成了视频采集、编码、发送子模块。视频采集模块:ARM处理器通过 V4L2采集驱动接口控制TVP5158采集译码器完成多路视频复合采集,得到原始YUV格式数据;视频编码模块:实现H.264编码器,将经过解复用的YUV格式数据通过DSP进行实时的 H.264编码,并生成NAUL数据;视频发送模块:利用RTP 流媒体实时传输协议封装NAUL数据,建立传输链路,创建socket,把RTP数据包通过MF210 无线模块发送到 WCDMA网络当中。

4.1视频采集模块设计实现 4.1.1 视频采集模块的设计

应用软件视频采集应用程序V4L2 APIdev/video0, dev/video1 Linux内核videodev核心模块内核空间DM6467视频端口VPIF采集驱动TVP5158译码器采集驱动视频采集系统驱动程序(V4L2驱动)硬件摄像头图4.1 视频采集程序程序设计

V4L2 是 Linux 操作系统提供的一个视频处理编程接口,整体架构如图 4.1所示。V4l2通过I2C总线对TVP5158进行控制,所以作为从属设备的TVP5158需要将自己注册到VPIF采集驱动中,应用程序通过调用VPIF驱动中的ioctl以及mmap()等命令来控制TVP5158完成视频采集。VPIF驱动则通过调用TVP5158

28

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

驱动中的相关函数来实现对V4L2 API的支持,使得应用程序可以根据自己的需要对底层硬件进行设置。

采集应用程序通过调用V4L2 的IOCTL命令, 按照打开视频采集设备(dev/video0,dev/video1等节点)、查询设备功能、设置图像格式、制式、属性、开始视频采集等步骤实现视频循环采集。

4.1.2 V4L2编程接口

Video4Linux2(简称V4L2)是为针对视频设备的应用程序编程提供一系列接口函数,通过这些函数,可以执行读写、打开、关闭等操作[21-23]。

Linux 下操作 V4L2 进行视频采集时,通常涉及到ioctl()和mmap()两个系统调用,其中 ioctl()系统调用负责控制设备的I/O通道,mmap()系统调用通过映射同一个普通文件来实现进程之间共享内存。

V4L2 编程中,通过调用 ioctl 函数来实现与图像设备的交互,常用的ioctl 命令标识符如图4.2所示。

命令标示符VIDIOC_QUERYCAPVIDIOC_REQBUFSVIDIOC_QUERYBUFVIDIOC_S_FMTVIDIOC_G_FMTVIDIOC_QBUFVIDIOC_DQBUFVIDIOC_STREAMONVIDIOC_STREAMOFF实现功能检查驱动设备的功能申请数据缓冲区:读取一个数据缓冲区,得到该缓冲区的信息设置视频捕捉格式,如高度、宽度等。读取视频捕捉格式将数据从缓冲区中读出,并将缓冲区出队列将数据放回缓存队列:开启视频采集停止视频采集

图4.2 ioctl()函数命令标示符

由于应用程序不能直接访问内核数据空间,所以应用程序要访问内核空间缓存buffer中的数据就需要通过系统调用read()、write()等操作,数据访问速度

29

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

慢。但是通过mmap()映射后,内核中的缓存数据被映射到用户空间,应用程序可以像访问普通文件一样对采集数据进行访问,大大的提高了数据处理效率。与之对应的释放映射内核内存函数mummap()。

mmap()函数的原型是:void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

mummap()函数原型是int munmap(void *start, size_t length);

4.1.3视频采集模块的实现

在本系统的实际研发过程中,前端模拟摄像头将采集的PAL制式的模拟视频信号输入TVP5158模块,通过TVP5158编码转化为数字信号,DM6467的视频端口(VPIF)把数字化后的视频信号采集到缓存中,进行相关的处理。视频采集的流程图如图4.2所示。

开 始将缓冲区映射到用户空间打开采集设备dev/video0dev/video1缓冲区入队列否检测是否连接摄像头?是获取设备驱动功能开始视频采集缓冲区出队列视频图像处理缓冲区入队列设置视频标准及图像格式否是否结束?是关闭设备查看当前使用的视频输入标准申请缓冲区结 束 图4.2视频采集的流程图

具体流程如下: 1、打开采集端口

30

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

在V4L2中,视频设备被看做一个文件,使用open函数打开这个设备。应用程序可以在阻塞模式或非阻塞模式下打开采集端口,如果使用非阻塞模式调用视频设备,即使尚未捕获到信息,驱动依旧会把缓存(DQBUFF)里的东西返回给应用程序,否则将一直阻塞直到有数据[24]。DM6467的视频端口VPIF有2个8位的BT.656接口,分别对应驱动中的设备节点为dev/video0和dev/video1,本设计采用阻塞模式打开采集端口:

sprintf(devname,‖/dev/video%d‖,portnum); capture_fd = open((const char *)devname, mode); 2、检测视频通道是否连接摄像头

此功能在V4L2标准中是没有的,本系统根据需要对其进行的扩展。下面代码中‖x‖表示视频通道号。

ioctl(capture_fd, VIDIOC_G_CHx_STATUS,&status[x]); if(status[x]) printf(\"Channel%d no camera is connected\\n\3、设置视频捕获格式 std = TVP5158_STD_PAL;

ioctl(capture_fd, VIDIOC_S_STD, &std); 4、申请缓冲区

接下来,要为视频捕获分配内存空间。在V4L2驱动程序中维持着两个队列:一个是输入队列,另一个是输出队列。队列被组织成FIFO结构,内存片段将按顺序入队到输入队列,并按照顺序从输出队列中出队。开始采集前,所有被映射的内存片段都处于出队状态,驱动程序此时不可以访问。应用程序通过相关ioctl命令将映射好的内存片段入队,然后开始捕获视频并进入read循环,此时应用程序会一直等待输出队列被填满到可以有内存片段出队。当出队的内存片段使用完后就会重新入队到输入队列。内存片段循环入队出队,就可以进行循环采集。申请缓冲区的关键代码如下:

#define MAX_BUFFER 3 reqbuf.count = MAX_BUFFER;

reqbuf.type = V4L2_BUF_TYPE_VIDEO_CAPTURE; reqbuf.memory = V4L2_MEMORY_MMAP; ioctl(*capture_fd, VIDIOC_REQBUFS, &reqbuf);

reqbuf.count表示要申请的内存片段数量,缓存数量一般不多于5个,本设计定为3个;reqbuf.type表示申请内存数据流类型,捕获视频缓存类型是V4L2_BUF_TYPE_VIDEO_CAPTURE;reqbuf.memory字段用来确定数据的输入/输出(I/O)方法,此处选择V4L2_MEMORY_MMAP即内存映射方式,具体原因

31

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

将在下文中详述。

5、数据I/O方式—内存映射

操作系统一般把系统使用的内存空间划分为用户空间和内核空间。用户空间是用户进程可以直接访问的内存地址;而内核空间只有内核可以访问,用户进程不能访问。上面申请的缓存区处于内核状态,用户程序无法直接访问,因此需要进行内存映射到用户空间实现数据交互。在V4L2的接口标准中,定义了3中I/O方式:读/写方式、内存映射方式和用户指针方式。应用程序要想与驱动程序进行数据交换,必须至少实现其中一种方式。读/写方式需要不断在用户空间和内核空间拷贝数据,效率较低。其操作示意图如图4.3所示。

V4L2驱动输入队列 IQEQ123输出队列 OQDQ„应用程序拷贝123„

图4.3 读/写方式示意图

V4L2驱动输入队列 IQEQ123输出队列 OQDQ„映 射应用程序123„

图4.4 内存映射方式示意图

内存映射方式就是把驱动内存映射到用户空间,应用程序与驱动程序之间只是数据缓冲区的地址变换,而不需要拷贝数据,这是一种高效的数据I/O方式,内存映射方式数据读取示意图如图4.4所示。

用户指针方式是介于读/写方式与内存映射方式之间的一种I/O方式,此方式需要利用较多的用户空间内存,并且驱动实现起来较为复杂。本系统的设计采用内存映射方式:

ioctl(*capture_fd, VIDIOC_QUERYBUF, &buf); capture_buff_info[port][index].start =

32

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

mmap(NULL,

buf.length,

PROT_READ | PROT_WRITE, MAP_SHARED,

capture_fd, buf.m.offset);

在映射前,先要通过VIDIOC_QUERYBUF命令获取申请缓冲区的物理地址。mmap()函数的第一个参数是驱动内存片段映射到用户空间的起始地址,一般设为NULL,表示由系统分配;第二个参数表示要映射内存的字节数;第三个参数设置映射内存的属性为可读写;第四个参数指定要映射对象的类型,指定为MAP_SHARED表示允许其他进程也可映射此内存;第五个参数是open()函数返回的文件描述符;最后一个参数是驱动中内存起始地址与要映射文件地址的偏移量,若为0表示从文件开头开始映射,其中第2个和第6个参数由VIDIOC_QUERYBUF命令返回值确定[25]。

6、开始视频采集

应用程序通过VIDIOC_QBUF命令将映射好的缓冲区送入驱动的输入队列,然后调用VIDIOC_STREAMON命令开始视频采集,再将采集到的数据帧缓冲区送入到输出队列,应用程序从输出队列中读取一帧数据进行处理后,再把空缓冲区放回输入队列中,如此循环,就实现了视频流的采集。

ioctl(capture_fd, VIDIOC_QBUF, &buf); int a = V4L2_BUF_TYPE_VIDEO_CAPTURE; ioctl(capture_fd, VIDIOC_STREAMON, &a); ioctl(capture_fd, VIDIOC_QBUF, &buf); 7、停止视频采集

终止视频采集是通过调用VIDIOC_STREAMOFF命令实现的,视频采集停止后,要通过munmap()函数释放映射的内存空间,关闭open()函数返回的文件描述符。

int a = V4L2_BUF_TYPE_VIDEO_CAPTURE; ioctl(*capture_fd, VIDIOC_STREAMOFF, &a); munmap(capture_buff_info[port][index].start,

capture_buff_info[port][index].length);

close(capture_fd);

33

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

4.2视频编码模块的设计与实现

由3.2.2节可知,本小节主要工作是实现基于DSP的H.264编码器以及完成应用层的编码模块。在实现H.264的编码工作中,X.264开源代码的DSP移植、优化工作已经由项目中其他工作人员完成,所以本节的主要工作就是实现算法的xDM标准封装、Codec Server生成、Codec Engine配置和编码应用程序的开发。

4.2.1 视频编码模块的设计

YUV数据输入应用程序接口(VISA API)create()control()process()delete()Codec Engine框架层xDM算法层:DSP信号处理算法NALU帧输出图4.5视频编码构架

在视频采集线程中,摄像头采集模拟数据之后,经过TVP5158芯片进行AD转换,亮、色度分离,降噪滤波等处理后转换为符合DM6467的VPIF接口传输的数字信号,经过解复用处理后,得到的YUV格式的数据,放入待编码数据buffer中。待数据写入后,触发视频编码线程,由ARM端编码应用程序远程调用VISA API,控制远端DSP进行压缩编码处理,得到NALU为单元的帧组。

4.2.2 H.264编码器的实现 4.2.2.1. X.264的xDM封装 一.算法接口定义

34

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

达芬奇平台上的应用程序开发流程要求算法开发需要遵循一定的标准规范,亦即TI提出的DSP算法标准xDAIS。xDAIS算法标准定义了一系列编程准则和建议[26][27],标准化了系统软件和算法的接口,降低了算法使用者的系统集成任务,从而缩短了产品开发周期。

对于每个xDAIS,给定的算法标准的IALG界面扩展到算法的IMOD界面。IMOD界面提供算法的基本功能,IALG界面则关注存储器的管理。xDAIS本身并不定义IMOD界面,需要使用某种算法,就必须基于其要求,自己来定义。应用程序和xDAIS标准间的关系如图4.6所示:

ApplicationAlgorithm Specific Interface(IMOD)xDAIS Interface(IALG,IDMA)Algorithm 图4.6 应用程序和xDAIS标准间的关系

其中,所有算法都必须实现IALG接口。IALG接口主要工作是定义算法中所需要使用的内存,提高系统内存使用效率。由于xDAIS中的API是基于C的,是面向过程,无法实现对象的封装、继承、重构等特性,因此xDAIS设计了一个名为IALG_Fxns的v_table,实现应用程序调用接口。如图4.7所示:

35

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

应用程序V-TableTypedef struct IALG_Fxns{Void *implementaotion Id;Void (algActivate)()(...)Void (algAlloc)()(„)Void (algControl)()(„)Void (algDeactivate)()(„)Void (algFree)()(„)Void (algInit)()(„)Void (algMoved)()(„)Void (algNumAlloc)()(„)}IALG_FxnsH.264 Encoder Implementation 图4.7 算法封装接口

xDM算法标准是TI在xDAIS标准上的一个扩展,用来为数字信号处理提供一个轻量级的框架,总体上说,就是在XDAIS的基础上扩展了一个名为Digital Media的接口(xDM),然后根据数字图像处理的要求,提供了一个名为VISA的API集合。这样下来,应用程序和XDM标准间的关系如图4.8所示:

ApplicationAlgorithm Specific Interface(IMOD)xDAIS Interface(IALG,IDMA)AlgorithmDigital Media Interface(xDM)

图4.8图 应用程序和xDM标准间的关系

简单起见,可直接利用符合xDM1.0标准的视频编码接口IVIDENC1(xDM0.9标

36

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

准对应的是IVIDENC接口)进行xDM标准算法库的开发,也就是说IMOD接口等同与xDM接口。

下面我们给出以H.264算法为例具体的封装过程。首先我们对算法实例的数据类型进行定义然后对算法实例的接口进行定义,在分别对接口函数进行定义,这种分层次的定义过程就形成了算法xDM标准的封转。 //算法实例数据类型的定义// Typedef struct X264ENC_Obj {

IVIDENC_Obj alg; /*Must be first field of all xDAIS algs*/ X264_t *h; X264_picture pic; }X264ENC_Obj;

算法实例的接口类型定义如下所示:

//算法模块接口类型的定义//

#define IALGFXNS \\

&X264ENC_IALG, \\ X264ENC_activate, \\ X264ENC_alloc, \\ NULL,

\\

\\

X264ENC_deactivate, \\ X264ENC_initObj, \\

\\

X264ENC_free, NULL, NULL {

{IALGFXNS}, X264ENC_process, X264ENC_control, };

IVIDENC_Fxns X264ENC_X264ENC =

根据IVIDENC1接口进行算法接口定义之后,实现对应的接口回调函数即可实现自定义算法的xDM封装。 算法接口的实现主要是algAlloc()、algInit()、algFree()回调函数与上层应用程序的交互来实现,此外还使用algActivate()和algDeactivate()回调函数来调度算法之间的内存,使用algControl()和algProcess()来控制算法。

37

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

二.算法接口实现

算法实例接口(IALG)是xDM算法标准的核心接口,它定义了算法是如何实施的以及算法实施所需要的变量类型、常量以及IALG_Fxns等,负责管理应用程序及其所执行的算法对内存资源的使用,包括片内数据的调度等。它主要是通过IALG_Fxns结构体中的接口函数,algActivate() algAlloc(),algControl(),algDeactivate(),algFree(),algInit(),algMoved(),algNumAlloc()来封装实现的,该结构体还包含了一个用于表示算法具体实例的指针类型的参数,它给出了算法实例的具体模块的地址,并在后续的执行中使用。

算法实例接口中,还存在大量的片内和片外内存或片外与片外内存之间的拷贝,而在DM6467平台中不允许算法直接访问和控制周边硬件资源,也包括DMA资源。为了使用DMA资源就需要使用DMA资源管理器来控制和分配DMA资源。它主要是通过三个标准接口IDMA3、DMAN3、ACPY3实现的,其中接口IDMA3主要提供算法的DMA资源规范及协议,这个接口允许客户端应用程序的查询并提供给算法其请求的DMA资源。DMAN3是资源管理器,它主要负责为基于IDMA3接口的应用程序和算法管理和发放DMA资源。ACPY3的作用就是DMA硬件接口及其库,ACPY3接口描述DMA操作的全面清单,因而算法可以通过IDMA3协议执行逻辑DMA操作。

在IVIDENC1_Fxns的定义中,对IALG接口中必不可少的三个回调函数algAllocO、alglnit()和algFree()进行了使能,另外,IVIDENC1_Fxns接口要实现proeess()和control()函数,其中,control()函数是可选的。  algAlloc()

algAlloc()回调函数对应我们定义的X264ENC_alloc函数,用于声明算法对存储器的需求,请求一块足够大小的固定存储空间用以支撑算法代码空间和运行时对缓冲区的需求。在对内存分配表memTab设置之前,算法创建者必须预先知道算法的内存空间需求,以保证程序框架通过调用该回调函数后就能够分配足够的内存空间供算法实例进行使用。X264ENC_Alloc函数的实现对应的是H.264中有关动态内存的分配部分,X264ENC_alloc函数中对H.264结构体和输如比特流的动态内存分配等。

Int X264ENC_alloc(const IALG_Params *algParams,

IALG_Fxns **pf, IALG_MemRec memTab []) memTab[0].alignment = 0; //设置内存的对齐方式

memTab[0].space = IALG_EXTERNAL;//设置请求的内存类型

{ memTab[0].size = sizeof(X264ENC_Obj);//设置内存表项大小

38

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

memTab[0].attrs = IALG_PERSIST;//设置内存的属性

„ }

这里我们需要弄清楚memTab结构体,它是算法定义内存需要的接口,它是由应用程序指定而非算法指定的,而且memTab[0]的内存类型必须是IALG_PERSIST指定的类型,X264ENC_alloc函数的第一个参数是算法实例的参数,第二个参数根据算法的不同而不同,最后函数还会返回一个指针进行下一步的初始化。  algInit()

alglnit()回调函数对应我们定义的X264ENC_initObj ()函数,用来初始化在algAlloc()回调函数中请求的固定存储器区域,调用完成后返回算法句柄X264ENC_Handle,指向创建的算法实例对象。X264ENC_initObj ()函数的实现对应的是X.264中编码器的参数设置部分(对应X.264_param_default()函数)和编码器的开启部分(对应X.264_eneoder_pen()函数).

Int X264ENC_initObj (IALG_Handle handle,

const IALG_MemRec memTab[], IALG_Handle p, Const IALG_Params *algParams) { „

x264_param_default (& params->param);

Parse( argc, argv, &(params->param), &(inst->opt) ); Inst->h = x264_encoder_open (& params->param) „

Return (IALG_EOK); }  algFree()

algFree()回调函数对应我们定义的X264ENC_free函数,用于应用程序在需要的时候删除实例对象而不引起内存泄漏,再次调用algAlloc()以设置所有在memTab结构的参数。X264ENC_free ()函数的实现对应的是H.264中编码器的关闭部分(对应x264_encoder_close()函数),释放所有己分配的动态内存。 Int X264ENC_free(IALG_Handle handle, IALG_MemRec memTab[]) {

X264ENC_Obj *inst = (X264ENC_Obj *)handle; x264_encoder_close( inst->h );

X264ENC_alloc(NULL, NULL, memTab); „}

 algControl()和algProcess()

39

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

Control()和Process()回调函数分别对应我们定义的X.264ENC_control和X264ENC_process函数。分别用于算法实例运行状态的控制和一帧视频内容的编码工作包括输入图像的高度、宽度、帧率、输出图像的帧率以及将输入数据处理后放入输出数据中。这是需要重点实现的函数。其中X.264ENC_process需要对应实现X.264中的编码器编码部分(对应X.264_encoder_encode函数)和NAL编码部分(对应x26生nal_encode()函数),具体实现较长,代码在此略去。 XDAS_Int32 X264ENC_process ( IVIDENC_Handle h,

XDM_BufDesc *inBufs, XDM_BufDesc *outBufs, IVIDENC_InArgs *inArgs, IVIDENC_OutArgs *outArgs);

XDAS_Int32 X264ENC_control (IVIDENC_Handle handle,

IVIDENC_Cmd id,

IVIDENC_DynamicParams *params,

IVIDENC_Status *status);

H.264算法运算量很多,很多时候需要通过DMA模块来调用资源因此还需要用到IDMA3接口函数,因而在IALG接口初始化完成后,通过dmaGetChannelCnt()函数获取算法实例所需要使用的最大逻辑DMA通道数,然后通过dmaGetChannels()将获取的通道信息记录下来,最后调用dmaInit()函数完成初始化工作,dmaChangChannels()可以再运行时切换DMA通道,并可以重新进行初始化工作。具体的工作流程如图4.9所示。

算法运行阶段algAlloc()algInit()dmaGetChannelCntdmaGetChannelsdmaInitdmaGetChannelsdmaChangeChannelsalg_Activate()algMoved()Control()Process()Control()算 法 创 建 阶 段算 法 终 止 阶 段 algFree()dmaGetChannelsalg_Deactivate()

40

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

图4.9算法封装过程

如果算法需要操作实际的DMA硬件资源时,则通过ACPY3的相关API来实现。

4.2.2.2 X.264算法库实现 一.X.264算法包创建

H.264算法进行xDM标准封装后并不能供给上层运行和使用,必须将其封装成包模块的形式才能被DSP算法服务器CS和算法引擎CE调用,一个包模块对应一个目录,且该目录包含了该算法组件的所有文件以及相关元数据,通常情况下生成一个算法包需要以下6种类型的文件。

 makefile指定算法包源文件的相关路径,并指定了创建算法包xdc脚本文件

xdcrules.mak,makefile代码如下: „

# GNUmake-based makefile.

# include the files that defines XDC package, paths and build rules EXAMPLES_ROOTDIR := /opt/codec_engine/dm6467/ce //代码的根目录 Include $(EXAMPLES_ROOTDIR)/xdcpaths.mak//编译工具和包的相关路径,由package.bld自动生成

# [CE] add the examples directory itself to the list of paths to packages XDC_PATH := $(EXAMPLES_ROOTDIR);$( XDC_PATH) //把代码添加到XDC_PATH中

Include $(EXAMPLES_ROOTDIR)/buildutils/xdcrules.mak //创建数据包的xdc规则脚本

 package.xdc文件定义了算法包的静态属性,既算法包的名称和所依赖文

件。本算法的算法包名为X.264ENC,所依赖的文件为x264enc.c、X264ENC.xdc、X264ENC.xs。

 package.xs文件说明了跨不同平台和配置的包属性。如下Getlib函数返回包

导出的库名称,XDC工具调用这个特殊的函数连接与程序配置相匹配的包库。

function getLibs(prog)

{ var name = \"lib/x264enc.a64P\"+pro.build.target.suffix;

41

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

print(\" will link with \" + this.$name + \":\" + name); return (name); }

 package.bld文件为包定义了其编译的相关属性,例如编译需要的源文件以

及其编译生成算法包的路径等。

 X264ENC.xdc这个的模块的声明和定义文件说明了算法的名字类型等。  X264ENC.xs为所有在MODULE.xdc声明的方法提供脚本语言的源代码。 完成以上配置文件后,直接执行makefile,makefile会调用脚本xdcrules.mak利用XDC编译工具生成算法包x264enc.a64p。

二.DSP Server开发

在达芬奇双核架构中应用程序都是运行在ARM端的,而算法的实现则是在DSP端完成的,所以对于ARM应用端来说,若要调用远程DSP上的Codec算法,需要对Codec Server进行配置。Codec Server的实质就是在DSP端可运行的二进制文件,它结合了算法的组件、系统的代码、DSP/BIOS内核、以及自身的配置文件,通过编译系统生成的可以DSP上运行的镜像文件,它通过使用一个DSP/BIOS任务线程来响应客户端建立的请求。算法服务器也就是CS它定义了各个算法的优先级,以便于DSP/BIOS系统的多线程执行,而且还为每个算法分配适当的存储,除此之外还提供了DSP算法跟踪的支持。它的实现需要配置以下文件:

 通过TCF脚本语言配置DSP/BIOS[28 ];

 通过XDC配置剩下的组件,比如:FC组件、DSP/BIOS Link、 Codec Engine

等。

 package.xdc:Package的定义文件,定义了Codec Server的名称及其依赖的

Package

 package.bld:Package构建脚本。  x.264enc.cfg:Codec Server的配置脚本。  x.264enc.tcf:DSP/BIOS的配置脚本。  link.cmd:命令链接文件。  main.c:用于初始化的主程序。

1.CS(Codec Server)脚本配置

上一节介绍了算法服务器的生成过程,下面我们使用JavaScript语言来编写

42

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

x264ence.cfg文件的内容从而配置DSP Server中除了DSP/BIOS以外的部分。

首先在配置文件ti.sdo.ce.Server.x264enc.cfg中指出codec server的运行环境,然后指明我们所用到的Codec Module为X264ENC等,即为我们之前开发的xDM 标准算法库。接下来设置Server的threadAttrs结构体属性,如Server Thread 的Stack 大小设置为2048字节、以及Server Thread以最低的优先级别运行。在Server.algs中设置关于所使用的算法的属性,即X264ENC等模块的Stack大小及运行优先级等。

var osalGlobal = xdc.useModule('ti.sdo.ce.osal.Global'); osalGlobal.runtimeEnv = osalGlobal.DSPLINK_BIOS; var LogServer = xdc.useModule('ti.sdo.ce.bioslog.LogServer'); var X.264ENC = xdc.useModule('ti.sdo.ce.codecs.x264enc.X264ENC'); var Server = xdc.useModule('ti.sdo.ce.Server'); Server.threadAttrs.stackSize = 2048; Server.threadAttrs.priority = Server.MINPRI; Server.algs = [ { name: \"x264enc\

mod: X264ENC ,

threadAttrs: { stackMemId: 0, priority: Server.MINPRI + 1}, groupId : 0,},

]

var DSKT2 = xdc.useModule('ti.sdo.fc.dskt2.DSKT2'); var RMAN = xdc.useModule('ti.sdo.fc.rman.RMAN');

如果算法要利用TraceUil模块获得DSP/BIOS的日志信息,用DSKT2获得算法存储器分配的管理器以及利用DMAN3管理DMA通道,则需要在该配置文件中添加相关内容的编写。

2.DSP/BIOS脚本配置

DSP Server是运行在DSP/BIOS系统之上的,因而我们同样需要通过JavaScript语言来编写X.264enc.tcg文件的内容从而配置DSP Server中DSP/BIOS的静态属性。包括:

 存储空间段的名称、大小及位置。  与平台相关的属性如时钟速率等。  任务的管理及动态堆空间的分配。  DSP内存映射及中断向量表。

43

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

可以看出DSP/BIOS的配置主要的对内存空间的配置,我们根据以往的例程给出以下内存设置。

表4.1片外存储空间配置 存储段名称 CEME DDRALGHEAP DDR DSPLINKEM CTRLRESET 基址 0x8000000 0x81C0000 0x8240000 0x83A0000 0x83E0000 0x83F0000 长度 0x10C0000(32MB) 0x0080000(4MB) 0x1600000(22MB) 0x0040000(4MB) 0x0010000(1MB) 0x0000080(128B) 说明 Linux运行空间 ARM与DSP共享空间 动态分配空间 程序和数据存储空间 DSPLINK存储空间 重置向量存储空间 为了使以上配置成功还需要部分驱动将其加载到DSP/BIOS内核中,其驱动如下:

 dsplinkk.ko:为DSP Link段动态划分空间。

 cmemk.ko:用来进行物理连续存储空间的划分。Linux使用CMEM为ARM与DSP分配共享的输入输出Buffer。

 loadmodules.sh:加载以上两个驱动模块的脚本。

完成以上文件配置之后还需要配置环境变量,首先编译user.bld它定义了系统开发内容的位置,确保此文件的路径与文件种引用的TI代码生成工具、其他编译器及操作系统的路径一致,然后编译xdcpaths文件,它主要用来说了XDC工具、DSP LINK等软件的安装路径,再根据算法的不同将相应的修改以上文件的内容,并将上面编译生成的x264enc.a64P拷贝到相应的目录下,最后执行makefile脚本,编译连接生成运行在DSP上的包含X264ENC算法库的CodecServer文件“x264enc.x64P”。

三.CE(Codec Engine)引擎的配置

应用程序要想通过算法引擎调用底层算法,就必须根据底层算法模块对Engine 进行配置,配置的内容包括Engine 的名称、每个Engine 中的Codecs 及它们的名称、每个Codec相对应用程序来说是本地的还是远程的、各Codec应该被集成到哪一个分组以及DSP Server 文件的名称等。其内容的编写如下:

var osalGlobal = xdc.useModule('ti.sdo.ce.osal.Global');

44

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

osalGlobal.runtimeEnv = osalGlobal.DSPLINK_LINUX;

var X264ENC = xdc.useModule('ti.sdo.ce.codecs.x264enc.X264ENC'); var Engine = xdc.useModule(' ti.sdo.ce.Engine'); var Engine = Engine.createFromServer(

\"x264enc\ // Engine name (as referred to in the C app) \"./x264enc.x64P\ \"ti.sdo.ce.servers.x264enc\" // server package );

首先在配置文件中声明ti.sdo.ce.osal包中的Global模块可用。接着设置Global模块的运行环境的属性即DSPLINK_LINUX,这标明使用该Engine的应用程序可以使用DSP/BIOS Link及Linux操作环境。接下来对算法模块进行设置,从ti.sdo.ce.codecs.x264enc.X264ENC包中获取编码器X264ENC并将其取名为X264ENC。同时还需要声明Engine中的内容,首先,声明ti.sdo.ce包中的Engine模块可用,然后使用Engine模块的create()方法来创建一个引擎实例,应用程序将在Engine_open API 中使用该Engine的名称。

4.2.2.3算法引擎API

CE主要是由核心引擎API来控制算法实例的,并对算法实例有着跟踪作用,对算法信息有着反馈作用。核心引擎由接口模块:初始化模块(CERuntime_)、CE运行时模块(Engine_)、抽象层内存模块(Memory_)组成的。

应用程序对算法实例的打开和关闭都是通过算法引擎的核心引擎API来调用初始化模块(CERuntime_)、CE运行时模块(Engine_)、抽象层内存模块(Memory_)三个模块[29][30]来实现的。在应用程序中每个算法实例的引擎句柄需要非线程的保护,对于单个线程而言,每个算法引擎需要使用Engine_open函数来独自管理各自的算法引擎句柄,但对于多线程而言,则可以使用同一个引擎实例来共享算法引擎。对于Linux系统适合多线程任务,因而采用多个算法共享同一个算法引擎的方式来实现。算法引擎除以上功能外,还可以提取算法对内存的使用情况和算法对CPU的使用情况。其算法引擎的函数接口如下所示:

 Engine_open:算法引擎创建及打开;

 Engine_close:算法引擎的关闭及相关资源的释放,通常在删除算法实例后调用;

 Engine_getCpuLoad(): 对CPU使用情况的获取;

 Engine_getLastError(): 对引发操作失败的错误代码的获取;

45

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

 Engine_getUsedMem(): 对算法引擎使用内存状况的获取;  Engine_getNumAlgs():获取算法引擎中算法的数量;  Engine_getAlgInfo():获取关于算法的信息。

视频、图像、语音、音频API简称为VISA API,它主要包括视频、音频、图像、语音的编码接口和解码接口[31],它们以模块化的形式出现主要是为了应用程序实现对多媒体算法的调用而设计的。主要包括以下其四种API函数,其中MOD是模块前缀,在本课题中MOD即为“X264ENC”。

 MOD_create():创建一个算法实例;  MOD_delete():关闭一个算法实例;  MOD_control():控制一个算法实例;  MOD_process():通过算法实例处理数据;

在调用算法时,需要在算法引擎中创建一个具体的算法实例,就需要使用MOD_create()来实现,此函数主要包括三个变量,第一个变量是用来控制算法实例的引擎句柄也就是函数Engine_open()函数的返回值。第二个变量是表示算法名字的字符串,第三个变量主要是初始化的作用,对算法实例的相关参数尽心设置,算法的运行刚好是由这些参数控制的。因为不用的算法实例其编解码器不同,因而其参数的结构也不相同。

算法创建后,就需要使用MOD_control()函数来控制算法的一些动态参数,这个函数也包括三个参数,第一个变量参数是对MOD_create()函数返回的算法的操作;第二个变量,是来自xdm.h的命令ID常量;第三个参数是算法的动态参数。当算法使用结束后,还需要删除其算法实例来将其使用的内存空间释放,就需要MOD_delete()函数来实现。

MOD_process()函数则是来运行一个算法实例的,例如读取视频数据帧、写出解码音频数据等。其中MOD_process()函数也有多个变量,第一个变量是对MOD _create()函数返回的算法句柄。第二个和第三个变量则根据算法执行的任务不同而不仅相同,第四个和第五变量,则提供算法输入和输出数值的地址,该结构对每个VISA编码器和解码器模块不同。

4.2.3视频编码模块的实现

编码系统应用程序实现流程图如图4.10所示。

46

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

开 始初始化Codec Engine为算法执行分配内存空间将分配内存的地址转换为物理地址打开Code Engine创建编码算法实例是否结束?是否设置动态参数释放内存、删除算法实例关闭Codec Engine结 束编码处理、数据返回

图4.10编码流程图

具体实现过程为:

(1)定义编码初始化参数结构体IVIDENC1_Params initParams和动态编码参数结构体IVIDENC1_DynamicParams并将其初始化,在无线网络情况下,将图像高度初始化为288,宽度设为288,帧率设为25,即视频是CIF分辨率,PAL制式。

(2)调用CERuntime_init()函数初始化Codec Engine.

(3)执行Memory_alloc()函数为算法执行分配必要的内存空间,函数返回内存在GPP端的虚拟地址,然后通过Memory_getBufferPhysicalAddress()函数将虚拟地址转换为DSP端能够识别的物理地址。

(4)调用Engine_open()函数打开Codec Engine,此过程将把算法的可执行二进制代码(x264enc.x64p)加载到DSP的内存中,同时将DSP从复位状态释放。

(5)执行MOD_create()函数,创建H.264实时编码算法实例。 (6)调用MOD_control()函数,设置编码动态参数。

(7)执行MOD_process()函数,对采集到的数字视频帧进行编码处理,并将编码后的视频数据存放在指定内存中。

(8)循环执行步骤(6)和(7),对采集到的视频流进行编码,直至任务结束。

(9)任务结束后,调用Memory_free()函数释放内存,并通过MOD_delete()函数关闭算法任务,最后执行Engine_close()函数关闭编解码引擎,退出程序。

47

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

4.3视频传输模块的设计与实现 4.3.1视频传输模块设计

当发送线程被触发后,线程会把编码得到的NAUL数据包,通过应用层的 RTP 协议、传输层的 UDP 协议、网络层的 IP 协议、数据链路层的 PPP 协议,进行层层封装后,MF210 驱动将它们通过 USB 接口传输给 MF210 模块载板,最后,载板上的射频模块将数据发送出去。视频数据的整个传输流程如图 4.11 所示。

NAL单元流NAL单元流RTP打包RTP分组UDP协议UDP数据包IP协议IP协议PPP链路PPP数据帧MF210驱动USB数据包模块射频器件无线电波

图4.11 数据传输流程

4.3.2 视频传输链路实现

本文采用中兴的MF210无线接入模块,它支持WCDMA模式最大上行速率384Kbps、最大下行速率384Kbps,以及HSDPA最大下行速率7.2Mbps和HSUPA最大上行速率5.76Mbps。MF210由USB串口线与ARM开发板连接,实现物理链路连通,通过PPP协议实现链路数据的通信,最终把视频数据传输到WCDMA网络。所以要实现链路的连接需要完成一下工作:

一. USB 接口驱动加载。USB接口驱动在内核定制时就被集成在内核模块中,系统就支持虚拟串口功能,方便PPP拨号中PPPD的应用。但是系统并不默认支持MF210驱动程序,所以需要修改usbserial驱动源程序,编译生成MF210

48

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

驱动模块,然后手动加入内核。

二. PPP 移植与脚本拨号连接。首先移植PPP拨号程序,编写 PPP拨号 配置脚本,连通链路,ppp协议把IP 协议数据包都封装在 PPP 协议包中,最后通过中国联通的 WCDMA 3G网络进行传输。

一.MF210驱动移植

在第三章虽然已经把 USB 驱动加载到内核中,但是内核的 USB 驱动不支持 3G 无线发射模块,需要把 Usb Driver 的 PID 和 VID 设置成MF210无线发射模块的 PID 和 VID。PID 和 VID 确定了硬件设备的唯一性,系统通过这两个 ID 把驱动程序和硬件关联起来。

在终端可以通过下面的命令查看 usb 设备的一些信息。 ~#ls usb

可以查看到无线接入模块 MF210 的 VID 是 0x19d2,PID 是 0x0016。 PID 和 VID 的更改在内核的/drivers/usb/serial /generic.c修改 static __u16 vendor = 0x19d2; static __u16 product = 0x0016;

然后在当前文件夹下重新交叉编译,得到新的usb串口驱动,usbserial.ko 手动加载驱动模块: ~#insmod usb-serial.ko

ls module如可以看见usb-serial.ko驱动模块相关信息,则说明驱动加载成功。

二.PPP移植与拨号实现

本次设计采用脚本的拨号方法实现,脚本拨号的过程可适用于 Linux 下的所有拨号过程:首先由 pppd 程序调用 chat 会话程序,完成无线发射模块配置、身份验证、启动服务器的 ppp 程序。然后,按照 ppp 脚本完成 ppp 拨号,与服务器端的 pppd 程序进行握手,建立 ppp 连接[32]。

ppp 拨号驱动程序在内核编译时已经安装在 Linux 操作系统内核中,只要对其使用,不需要再安装 ppp 拨号驱动程序了。要实现 Linux 操作系统拨号上网功能,具体步骤如下所示:

1、pppd 移植

由于要实现基于 ppp 协议拨号上网的功能,所以首先需要移植 pppd 这个 应用程序。按以下步骤进行移植:

49

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

①下载并解压ppp-2.4.5.tar.gz至PPP源码目录$(PPP),利用交叉编译工具arm_v5t_le-gcc交叉编译生成可执行文件.

②项目中默认的可执行文件在嵌入式系统的网络文件系统目录为/opt/nfs/usr/sbin,

拷贝pppd(Point to Point Protocol daemon),chat,pppdump,pppstats可执行程序到/opt/nfs/usr/sbin目录下:

#cp $(PPP)/chat/chat /opt/nfs/usr/sbin #cp $(PPP)/pppd/pppd /opt/nfs/usr/sbin #cp $(PPP)/pppdump/pppdump /opt/nfs/usr/sbin #cp $(PPP)/pppstats/pppstats /opt/nfs/usr/sbin

2、Linux 操作系统下拨号上网具体实现

在嵌入式目标系统下创建对应的文件: #mkdir /etc/ppp #mkdir /etc/ppp/peers

对应目录下创建脚本文件,这里用到的三个脚本分别是:

(1) /etc/ppp/peers/目录下的init,该脚本是用来配置拔号基本参数,包括设备号,码率,重拔次数;

(2) /etc/ppp/目录下的init-connect-chat,该脚本是用来执行AT命令的; (3) /etc/ppp/目录下的chap-secets,是用来设置鉴权口令的。

上述脚本执行原理为:本地pppd调用chat会话进程接入对端ISP,启动对端的pppd,然后本地pppd与对端的pppd一起进行协商网络参数和CHAP认证,成功认证后,再进行NCP层的IP的分配。

在项目中把启动脚本#pppd call init命令、加载模块命令和回显IP/DNS命令都放在一个自动拔号脚本ppp.sh里执行。执行#./ppp.sh命令运行该脚本会执行相应操作返回如图4.12显示IP。脚本实现如下:

source /etc/ppp/mknod.sh//主要目的是加载驱动模块

pppdcallinit& //后台执行ppp拨号脚本,完成通过PPP拨号上网 echo\"sleep 30seconds\" sleep30

source /etc/ppp/echoip.sh //显示PPP拨号返回的IP以及网关

50

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

图4.12拔号返回IP

4.3.2视频传输模块实现

一.H.264视频流的封装过程实现

H.264编码线程对多路复用的视频数据解复用后将其按通道号存储在对应的Buffer中,在此对编码后的数据Buffer与大小分别做标记为:

encParam->buffer[i].pCode.vir; encParam->CodeSize[i];

这里i是指通道号,在代码中体现。编码后NALU单元序列主要由带有SPS和PPS的I帧和P帧组成,I帧的大小一般会大于10000字节,而P帧数据大约6~7K左右。这两种帧的大小都大大超过了IP协议下的最大传输单元值(MTU),需要进行拆分发送[33]。

由于网络传输是基于IP协议,所以最大传输单元(MTU)值为1500字节。在使用IP/UDP/RTP的协议层次结构进行编码数据打包时,数据包的头信息包括20字节的IP头、8字节的UDP头和12字节的RTP头,头信息至少要占用40个字节,因此RTP荷载的最大尺寸为1460字节。为了避免IP层对大分组的数据包再一次分割,一般在有线环境下会将最大传输负载设为1400Bytes,而无线环境下设为500~600Bytes。为了便于描述,当前读取的数据长度设置为data_len,传输负载最大设置为1400Bytes。打包流程如图4.13所示:

51

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

获获获获获获获获获获NAL获获获获NALU获获获获获1400获获获获1400获获获data_len-1400>0获data_len+2获FU获获获FU获获获获获RTP获获获获图4.13编码数据打包方式流程图

获获

二.H.264视频流的UDP Socket发送过程

本设计中视频服务器端与界面客户端之间的数据传递采用传输层协议UDP连接,以提高实时性、确保数据能及时的收发。在封装传输线程中初始化UDP传输服务,而当视频流数据封装传输线程被触发时,视频流数据就被加上RTP头字段通过UDP传输层协议发送。UDP服务器/客户端通信[34]如图4.11所示。

图4.14中socket编程用到的API函数简要说明如下: socket( )函数:创建UDP套接字;

bind函数:将套接字与本机地址信息进行绑定; recvfrom( )/sendto( )函数:用于端到端之间的数据收发; close( )函数:关闭套接字,回收资源。

52

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

获获获socket( )获获获获获bind( )获获recvfrom( )获获sendto( )获获close( )获获获获获获获获socket( )获获获获获bind( )获获sendto( )获获recvfrom( )获获close( )获获获获获

图4.14UDP服务器/客户端通信图

项目中实现代码如下:

if((sock = socket(AF_INET,SOCK_DGRAM,0)) == -1){ perror(\"socket error.\"); return; }

memset(&s_addr,0,sizeof(struct sockaddr_in)); //对结构体清零 s_addr.sin_family s_addr.sin_port

= AF_INET; //设置地址族 = htons(4000);// //设置端口

s_addr.sin_addr.s_addr = inet_addr(param->ip); //指定接收端IP地址 memcpy(nalu_payload,msg.buffer,msg.len); //拷贝数据 bytes = msg.len+12; //设置发送字节长度

sendto(sock,sendbuf,bytes,0,(struct sockaddr *)&s_addr, sizeof(s_addr));//发送数据

4.4 本章小结

本章是模块具体的设计实现部分,主要完成了视频采集子模块、编码子模块、发送子模块模块。在视频采集子模块,ARM处理器通过 V4L2采集驱动接口控制TVP5158采集译码器完成多路视频复合采集;在视频编码子模块,设计实现视频数据的H.264实时编码。具体实现过程是:构建H264编码器,主要工作包括完成X.264编码算法的xDM封装,CS(Codec Server)生成、CE(Codec Engine)引擎

53

重庆邮电大学硕士论文 第四章 视频采集编码发送模块的设计与实现

配置等,在应用层远程调用编码器VISA API实现视频编码;在视频发送子模块,利用RTP 流媒体实时传输协议封装视频数据,建立传输链路,把RTP数据包通过MF210 无线模块发送到 WCDMA网络当中。

54

重庆邮电大学硕士论文 第五章 系统测试

第五章 系统测试

系统测试是检验系统能否按照预期目标实现各项功能的重要环节。在嵌入式系统开发过程中,测试起着至关重要的作用。本章在整个系统已实现的基础上,对一些重要的参数和功能进行测试分析,并提出不足。

5.1 测试内容和预期目标

根据需要将测试分为实时视频功能测试与视频属性控制功能测试两部分,整个测试将联合视频监控客户端进行。由于运营商之间的竞争,每家运营商都是首先保障内部数据访问速度,而夸运营商的数据并不是他们的数据服务重点。为了减少跨运营商传输造成的数据包丢包、及延时方面的影响,保障测试结果的可靠性,本测试过程中都选择了联通的网络,即WCDMA、联通专网或者联通宽带。时实时视频功能测试条件及预期结果如表5.1所示。

表5.1 实时视频测试

测试编号 预期目标 测试内容 1路CIF格式视频 2路CIF格式视频 操 作 客户端请求通道1的CIF格式视频流 客户端请求通道1、2的CIF格式视频流 客户端请求通道1-4的CIF格式视频流 客户端请求通道1-6的CIF格式视频流 客户端请求通道1-6的D1格式视频流 网络环境 WCDMA上行 WCDMA下行 WCDMA上行 WCDMA下行 通道1输出视频,视频显示清晰流畅 通道1、2不能正常显示视频,或者显示视频但是视频流不流畅 A B C D 4路CIF 格式视频 1路D1 格式视频 局域网内 局域网内 局域网内 通道1-4能够显示视频,且视频清晰流畅, 通道1能够显示视频,且视频清晰流畅, 通道1-6能够显示视频,且视频清晰流畅 E 多路D1 格式视频 通过A和D测试可以得出系统是否能实现视频监控功能;通过A、B测试组的对照,可以得到WCDMA上下行的环境下,系统最能够支持实时视频监控通道数;通过B和C、B和E测试组的对照可以得出在带宽足够的情况下系统可以支持多路、清晰的视频监控。

55

重庆邮电大学硕士论文 第五章 系统测试

5.2 测试过程

5.2.1 测试网络环境搭建

要完成系统测试,第一步是搭建系统环境。由上一小节可知,测试环境有两种:局域网测试,主要完成视频属性控制功能测试以及局域网内高清实时视频;公网测试,主要完成WCDMA无线实时视频测试。

有线局域网络测试环境主要包括三部分:数字视频服务器(DVS)、中心平台(流媒体服务器、sip客户端以及sip服务器)和监控客户端(CU)。监控客户端运行在window系统上,sip客户端和流媒体服务器运行在同一台windows平台电脑上,sip服务器独立运行正在ubuntu系统上,数字视频服务器由DM6467以及若干摄像头构成,并通过串口和sip服务器连接,通过COM端口实现对嵌入式的操作。局域网测试环境如图5.1所示。

客户端(CU)192.168.2.12/24SIP服务器串口连接192.168.2.10/24192.168.2.11/24流媒体服务器/SIP客户端/数据库Ethernet摄像头DM6467开发平台监控前端(PU)

图5.1 有线局域网测试网络图

公网测试环境主要也是由数字视频服务器(DVS)、中心平台(流媒体服务器、sip客户端以及sip服务器)和监控客户端(CU)组成。但是在DVS上外接了MF210无线传输模块用来连接WCDMA网络,中心服务器都通过联通宽带接入Internet,监控客户端也由联通的无线上网卡连入因特网。WCDMA接入的无线实时视频的测试网络环境如图5.2所示。

56

重庆邮电大学硕士论文 第五章 系统测试

10.85.4.45/2410.89.65.136/24MF210无线模块MAWCD3G基站WCDMA移动监控客户端ADSL10M联通专网58.17.180.195/24DM6467开发板58.17.128.68/24串口连接sip服务器流媒体服务器/sip客户端/数据库

图5.2 公网测试网络图

5.2.2 测试步骤

对于不同的网络测试环境,测试步骤有所不同。在有线局域网中,系统能够实现最多8路D1格式的实时视频,而在WCDMA无线网络中,受带宽限制,只能传输单路CIF格式的实时视频。

1. 有线局域网络环境下的测试步骤

(1)完成3.4.3节的达芬奇平台的初始化,主要工作是完成内核的配置、交叉编译、加载,完成驱动模块的交叉编译,例如MF210驱动tvp5158驱动,以及dsplink、cmem、ppp拨号等模块。

(2)按照上一节的有线局域网测试网络图进行网络搭建,连接若干摄像头到DM6467上,给开发板接通电源,待系统正常启动后,手动加载或者通过脚本加载dsplink、cmem、tvp5158等驱动。通过ping包确定网络环境畅通。

(3)开启sip客户端程序、sip服务器程序、流媒体服务器以及数据库。 (4)在终端上,通过串口运行DM6467平台上可执行程序; (5)开启监控客户端,请求多路视频,观看视频录像。

2. WCDMA无线网络环境下的测试步骤

(1)完成3.4.3节的达芬奇平台的初始化,主要工作是完成内核的配置、交叉编译、加载,完成驱动模块的交叉编译,例如MF210驱动tvp5158驱动,以及dsplink、cmem、ppp拨号等模块。

(2)按照上一节的有线局域网测试网络图进行网络搭建,连接若干摄像头到

57

重庆邮电大学硕士论文 第五章 系统测试

DM6467上,给开发板接通电源,待系统正常启动后,手动加载或者通过脚本加载dsplink、cmem、tvp5158等驱动。通过usb数据线连接MF210无线模块到DM6467上,运行ppp拨号程序,通过ping包,确保网络畅通。

(3)开启sip客户端程序、sip服务器程序以及流媒体服务器。 (4)在DM6467平台上运行相应的可执行程序;

(5)开启监控客户端,分别请求1路和2路CIF格式的实时视频,观看视频图像效果。

5.3 测试结果及分析

测试结果如表5.2所示:

表5.2 实时视频测试

测试编号 测试内容 1路CIF格式视频 2路CIF格式视频 网络环境 WCDMA上行 WCDMA下行 WCDMA上行 WCDMA下行 测试结果 通道1输出视频,视频显示清晰流畅 通道1、2不能正常显示视频,画面卡 A B C D 4路CIF 格式视频 1路D1 格式视频 局域网内 通道1-4能够显示视频,且视频清晰流畅, 通道1能够显示视局域网内 局域网内 频,且视频清晰流畅, 通道1-6能够显示视频,且视频清晰流畅 E

多路D1 格式视频 系统在有线局域网多路D1视频和WCDMA上下行网络一路CIF视频的测试效果图分别如图5.5和5.6所示。

58

重庆邮电大学硕士论文 第五章 系统测试

图5.5 多路D1视频有线局域网测试截图

图5.6 单路CIF视频WCDMA无线网测试截图

在有线局域网环境下测试结果说明,模块可以正常的完成视频监控功能,2片采集译码器TVP5158的每个通道都能正常的进行视频采集,编码器可以正常的工作,发送接收到的视频清晰、流畅。

在以wcdma上下行的测试中,可以得出系统只能传输1路的CIF格式视频,无法传输多路CIF或者D1格式的视频,这样在无线网络环境下,要实现监控视频的多路、清晰地传输还有很多的工作要做。

为了满足多路无线视频的传输需求,可以采用牺牲视频的清晰度换取更多路的无线视频传输,如可以采用QCIF格式的视频进行传输,QCIF的分辨率只有CIF格式四分之一,理论分析上可以得出,在可以传输1路CIF视频的本系统中应可以支持4路的QCIF格式视频传输。

通过以上测试和测试结果分析,本课题完成了预期的目标。

59

重庆邮电大学硕士论文 第五章 系统测试

5.4 本章小结

本章结合整个视频监控系统对视频采集编码发送模块进行了测试,首先给出了测试的内容及预期目标,提出了测试遵循的原则,然后详细说明了测试方法和步骤,并测试得出实验结果,对实验结果进行分析,并提出下一步的改进措施。

60

重庆邮电大学硕士论文 第六章 总结与展望

第六章 总结与展望

6.1 工作总结

随着人们对安全要求的不断提高与嵌入式微处理器、多媒体压缩技术以及无线传输技术的迅猛发展,无线实时视频监控系统得到了快熟的发展与应用。本文基于嵌入式DM6467平台,完成了无线实时视频监控系统中的视频采集、编码、发送模块的设计与实现。主要完成以下工作:

第一,调研了市面上视频监控系统发展现状,并分析了视频监控行业未来发展动态以及相关技术发展趋势;

第二,从硬件平台、视频采集、视频编码、视频传输发送方面深入研究了无线视频监控系统中的关键技术,主要包括 DaVinci技术、V4L2采集规范、H264编码算法、RTP流媒体传输协议以及WCDMA技术等。然后详细分析了视频监控系统的总体框架,在系统框架下研究分析了视频采集编码模块的功能需求,并根据模块的功能需求分析设计了模块的总体构架。

第三,深入研究了开发平台DM6467的硬件开发环境和软件开发环境;根据开发需求搭建嵌入式开发环境平台,主要包括安装Linux服务器、配置开发工作站、以及嵌入式Linux的初始化。

第四,完成视频采集、视频编码、视频发送三个子模块具体的设计与实现。分别在视频采集模块中实现基于V4L2规范的视频采集;在视频编码模块中,通过完成X264编码算法的xDM封装,Codec Server生成、Codec Engine配置,实现H264编码器,然后在ARM端的应用程序中远程调用VISA API接口,控制DSP端的编码器,实现视频数据编码;在视频发送模块中,先构建WCDMA传输链路,然后利用流媒体RTP实时传输协议打包视频数据,最后通过MF210模块实现视频的无线传输。

第五,结合整个视频监控系统对模块的性能进行测试与验证,实测视频图像证明课题成功设计与实现了视频采集编码发送模块。

6.2 不足和展望

本文所研发的基于达芬奇技术的多通道视频采集编码系统软件虽然实现了8路视频的复合采集、解复用、译码及H.264算法实时编码等功能,但是仍有许多不足之处,可以从以下几个方面进一步研究:

(1)本文设计的采集软件系统目前只支持D1和CIF分辨率的视频,而DM467平台可以最高处理一路1080P的高清视频,随着人们对视觉要求越来越高,可以

61

重庆邮电大学硕士论文 第六章 总结与展望

进一步完成对如720P、1080I、1080P等高清视频的设计。另外,在测试结果分析中已提到,对于无线带宽不足的问题,可以增加对QCIF格式的支持,如此一来,系统不仅能满足资源充足时人们对视觉效果的高要求,还能适应带宽有限的无线网络环境。

(2)系统的编码部分仅对封装好的H.264 xDM算法库进行了调用,算法库的种类还比较单一,下一步可以丰富算法库的种类,例如可以增加移动侦测、人脸检测、运动跟踪等智能算法,并对算法进行优化,使运行效率提高。

62

重庆邮电大学硕士论文 致谢

致谢

在硕士毕业论文完成之际,谨向所有给予过我指导、帮助和关心的老师、朋友、亲人们表示衷心的感谢。

我要特别感谢我的导师文凯老师!在研究生期间,他给我提供了一个良好的学习平台和研究环境,文老师的谆谆教诲与指导,让我懂得了珍惜时间以及如何科学系统的学习和研究。在论文的选题、设计、实现和撰写方面,我的恩师都给予了精心的指导,他为我的教导倾注了大量的心血。同时,文老师的个人魅力、工作魄力、严禁作风,深深地吸引着我,也影响着我,虽历时三载,却终生受益。在此,我向我的恩师表示深切的谢意和诚挚的敬意。

此外,我还要感谢实验室一起并肩作战的老师与同学们,他们在日常生活中给我很多帮助,学习中给我很多的建议和鼓励。在这里一并谢谢与你们共同度过的三年时光,这将是我们终生难忘的回忆。

感谢我的父母和亲人们,谢谢你们的支持和理解让我完成了研究生的学业。更感谢你们的关怀与帮助,使我更专注于学习与研究。

最后,非常感谢各位老师在百忙之中评审批阅我的论文。

在硕士毕业论文完成之际,谨向所有给予过我指导、帮助和关心的老师、朋友、亲人们表示衷心的感谢。

63

重庆邮电大学硕士论文 参考文献

参考文献

[1] 骆云志.视频监控技术发展综述[J].兵工自动化.2009. 28(1).1-2

[2] Xu Kebao.Zhu Xiaoguang.The design of a wireless transmission of digital

video monitoring system for vehicles entering and leaving the harbor[C]. Electric Information and Control Engineering (ICEICE). 2011 International Conference .2011.1795 - 1798

[3] 马春来.无线网络环境下监控视频传输技术的研究与应用[D].长沙.国防科

学技术大学.2009.1-3

[4] Dalei Wu,Song Ci,Haiyan Luo.Video Surveillance Over Wireless Sensor and

Actuator Networks Using Active Cameras[C].IEEE Transactions on Automatic Control.2011.2467-2472

[5] 胡书卫.H264流媒体无线传输研究实现及其在嵌入式视频监控中的应用.上

海大学硕士学位论文. 2009

[6] 鲍协浩. DaVinci平台上H.264视频编码算法移植优化与xDM封装[D]. 北

京.北京邮电大学.2011-1.4.49-51

[7] 张耀中.基于Davinci的立体图像硬件开发平台的设计与实现[D]. 天津.天

津大学.2008-5.8-9

[8] 陈成连.基于DaVinci技术的嵌入式流媒体系统的应用开发[D].吉林.吉林

学.2009.

[9] T. Wiegand,G. J. Sullivan, G. Bjontegaad,etal.Overview of the H.264/AVC

video coding standard.IEEE Trans. Circuits Syst. Video Technol.July 2003,13(7):560-575

[10] Nejat Kamaci, Yucel Altunbasak.Performance comparison of the emerging

H.264 video coding standard with the existing standards. In:Proc IEEE Inter Conf on Multimedia and Expo(ICME2003),2003,1(9):345-348

[11] 郭晓强,门爱东.视频编码标准的发展.从 H.261 到H.264. http://www.upsdn.

net/html/2004-12/193.html,2008-01-03

[12] 曾勇军.PPP 协议及其在 Internet 远程接入技术中的应用[J] .计算机应用

研究.2000

[13] 张耀中. 基于Davinci的立体图像硬件开发平台的设计与实现[D]. 天津.天

津大学.2008-5.8-9

[14] Texas Instruments.TMS320DM6467 Digital Media System-on-Chip [R]

64

重庆邮电大学硕士论文 参考文献

SPRS403G

[15] –DECEMBER 2007–REVISED OCTOBER 2010.3-11

[16] Texas Instruments .xDAIS-DM (Digital Media) User Guide. SPRUEC8B

January.2007.http://www.ti.com/lit/ug/spruec8b/spruec8b.pdf .1-4

[17] Wookey, Tak-Shing. Porting the Linux Kernel to a New ARM Platform. Intel

White Paper.2002.

[18] 孙天泽,袁文菊,张海峰.嵌入式设计及 Linux 驱动开发指南——基于

ARM9 处理器.电子工业出版社.2005:95-137

[19] 陈亮,裴海龙,伍越.基于 Video4Linux2 的图像采集程序设计[J].微计算机

信息,2010

[20] 黄睿邦,汤荣江,李文亮.Linux 下基于 Video4Linux 的 USB 摄像头视频

采集实现[J].现代计算机,2009

[21] 蔡婧璇,潘银松.基于嵌入式 Video4Linux 的 USB 视频信号采集 [J].电子

设计应用,2009

[22] 赵勇,袁誉乐,丁锐. DAVINCI 技术原理与应用指南[M].南京.东南大学出版

社.2008.58-61

[23] 毕厚杰.新一代视频压缩编码标准——H.264/AVC.人民邮电出版社2005.04

PP63-123

[24] 丁锐,赵勇,袁誉乐.于达芬奇平台的视频监控系统的设计.计算机信

息.2007.pp1~3

[25] Texas Instruments Incorporated.SPRU732D.TMS320C64x/C64x+ DSP CPU

and Instruction Set Reference Guide.2007

[26] 魏聪颖,牛建伟,吉海星,等. 基于实时流媒体传输系统的H.264组包算

法研究[J] .计算机科学.2007. 34(8).41-43

[27] 李校林,刘利权,张杰.基于RTP的H.264视频流实时打包传输的研究[J].

计算机工程与科学.2012.34(5).168-171

[28] Texas Instruments Incorporated.SPRU352G.TMS320 DSP Algorithm Standard

Rules and Guidelines User’s Guide.2005

[29] 李素娟.基于TMS320DM6446多通道视频图像实时处理系统设计与实现.

中国民用航空飞行学院硕士论文.2011.pp.35~42

[30] DAVINCI开发原理之四.达芬奇编解码服务器(Codec Server)_罗索工作室 [31] 钱利青.基于3G网络的视频监控系统.内蒙古大学硕士论文.2011.pp.34~35 [32] 李松渊.基于嵌入式 Linux 无线远程图像监控系统的研究[D].西华大学硕

士论文.2009

65

重庆邮电大学硕士论文 参考文献

[33] Joint Video Team(JVT) of ISO IEC MPEG&ITU-T VCBG Draft ITU-T

Recommendation and Final Draft International Standard of Joint Video Specification JVT-G050[S].2003

[34] 孙鑫,余安萍. VC++深入详解[M].北京.电子工业出版社.2009.523-530

66

重庆邮电大学硕士论文 附录 攻读硕士学位期间的科研工作

附录 攻读硕士学位期间的科研工作

一.攻读硕士学位期间参加的科研项目:

1. 参与科技型中小企业技术创新基金项目《基于TD-SCDMA的远程无线视频监控系统》。

二.攻读硕士学位期间发表的主要论文:

[1] 作者.基于嵌入式Linux视频监控传输系统的设计与实现.数字技术与应用.2013.1.145-146

67

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- sceh.cn 版权所有

违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务