已阅读5页,还剩59页未读, 继续免费阅读
(交通信息工程及控制专业论文)基于DirectShow通用视频采集系统的研究与实现.pdf.pdf 免费下载
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
摘要 随着计算机技术和电子技术的迅猛发展,计算机处理能力成倍提高,极大地促进了 我国智能交通领域的信息采集技术的发展。本课题利用d i r e c t s h o w 技术,构建了一个 通用视频采集平台,为交通领域的视频采集提供可借鉴的标准通用组件,并可推广至相 关应用行业中。 d i r e c t s h o w 作为w i n d o w s 平台下的一种流媒体体系结构,为多媒体的开发提供了高 质量的捕捉和回放功能。其支持多种视频格式,以及支持数字和模拟信号的捕捉。利用 d i r e c t s h o w 技术实施通用视频采集能起到事半功倍的效果。 本文首先分析了d i r e c t s h o w 技术和c o m 技术的基本体系,以及该体系下,应用程 序的一般开发过程。首先,对市面上常见的采集卡进行了研究和分类,给出了视频采集 系统的总体设计方案与实现过程。其次,研究并开发了本系统所用到的抓图f i l t e r 。并 分析了位图格式。最后,给出了本系统的性能及指标。在总结与展望中,对全文进行了 总结并指出了本系统有待进一步解决的问题,以及日后的工作重点和方向。 关键字:智能交通,d i r e c t s h o w ,视频采集f i l t e r ,通用组件 a b s t r a c t w i t ht h ed e v e l o p m e n to fc o m p u t e ra n de l e c t r o n i ct e c h n o l o g y , a n dt h ee n h a n c e m e n to f c o m p u t e rc a p a b i l i t y , t h ei n f o r m a t i o nc o l l e c t i o no fi n t e l l i g e n c et r a f f i cs y s t e mi s g r e a t l y a c c e l e r a t e d u s i n gd i r e c t s h o wt od e s i g nag e n e r a lp l a t f o r mf o rv i d e oc a p t u r ei st h em a i n s u b j e c to f t h i sp a p e r t h ep u r p o s ei st op r o v i d eag e n e r a lv i d e oc a p t u r es t a n d a r dc o m p o n e n ti n t r a f f i cm a n a g e m e n ts y s t e m a so n eo fa r c h i t e c t u r ef o rs t r e a m i n gm e d i ao nt h ew i n d o w s p l a t f o r m ,d i r e c t s h o w p r o v i d e sf o rh i g h q u a l i t yc a p t u r ea n dp l a y b a c ko fm u l t i m e d i as t r e a m s d i r e c t s h o ws u p p o r t sa w i d ev a r i e t yo ff o r m a t s s u c ha sd i g i t a la n da n a l o gs i g n a l sc a p t u r e u s i n gt e c h n o l o g yo f d i r e c t s h o wt oe x e c u t ev i d e o c a p t u r ei sm o r ee a s i e rt h a na n yo t h e rm e t h o d s t h ep a p e ra n a l y s e st h eb a s i cc o n c e p t so fd i r e c t s h o wa n dc o m t e c h n o l o g y a n dt h e g e n e r a la p p l i c a t i o np r o g r a m m i n gp r o c e s s e su n d e rt h o s et e c h n o l o g i e sa r ea l s os t u d i e d f i r s to f a l l ,s o m ec a p t u r ec a r d sw h i c hu s u a l l y p r e s e n ti nt h em a r k e ta r er e s e a r c h e da n dc a t a l o g e d a n d a l s oi nt h i sc h a p t e r , t h ew h o l ed e s i g np l a na n dr e a l i z a t i o no ft h eg v c s y s t e ma r ep r e s e n t e d s e c o n d ,t h ei m p o r t a n tg r u bf i l t e ru s e di nt h i ss y s t e mi sr e s e a r c h e d a n db i t m a pf o r m a ti sa l s o r e s e a r c h e d f i n a l l y , t h ec a p a b i l i t ya n de v a l u a t i o no ft h eg v cs y s t e mi sp r e s e n d e d a n da tt h e c o n c l u s i o nc h a p t e r , s o m ec o n c l u s i o n sa r em a d e a n dt h ea r t i c l ea l s o p o i n t so u ts o m e p r o b l e m sw h i c hs h o u l db ei m p r o v e d t h es u m u pa l s og i v e sk e yp o i n tw o r ka n dd i r e c t i o no f t h ec o n t i n u i n gf u t u r ew o r k k e yw o r d s :i t s ,d i r e c t s h o w , v i d e oc a p t u r e ,f i l t e r , g e n e r a lc o m p o n e n t i i 论文独创性声明 本人声明:本人所呈交的学位论文是在导师的指导下,独立进行 研究工作所取得的成果。除论文中已经注明引用的内容外,对论文的 研究做出重要贡献的个人和集体,均已在文中以明确方式标明。本论 文中不包含任何未加明确注明的其他个人或集体已经公开发表的成 果。 本声明的法律责任由本人承担。 论文作者签名:富有 2 哆年r 月夕矿e l 论文知识产权权属声明 本人在导师指导下所完成的论文及相关的职务作品,知识产权归 属学校。学校享有以任何方式发表、复制、公开阅览、借阅以及申请 专利等权利。本人离校后发表或使用学位论文或与该论文直接相关的 学术论文或成果时,署名单位仍然为长安大学。 ( 保密的论文在解密后应遵守此规定) 论文作者签名:蜜茸 别帷轹矽引乞 日 日 d , a 弓 月 月 , 厂 年k 厂 椿 p 长安大学硕士学位论文 1 1 研究背景及意义 第一章绪论 随着计算机技术和电子技术的迅猛发展,现有计算机己具有很强的数据处理能力, 这为计算机视觉、图像采集以及图像处理技术应用于交通流信息采集提供了强大的技术 保障。基于d i r e c t s h o w 的通用视频采集系统( g e n e r a lv id e oc a p t u r e ,简称g v c ) 是在 交通监控的基础上,引入计算机技术和信息技术,通过对d i r e c t s h o w 的研究,采用先 进的图像采集方案,以及对不同类型的采集卡分类,最终给出统一的视频采集方案。 本课题是在d i r e c t s h o w 技术之上,重点研究并建立一个通用视频采集平台。其目 的是为各种交通管理系统提供通用视频采集手段,减少交通管理系统的开发周期,改进 实时信息的采集效能,为道路交通管理提供更为有效的依据,提高交通管理的自动化、 现代化水平。 此外,本研究也为日后获得更多的交通信息,达到更高的智能化管理程度提供了技 术保障。因此,g v c 采集系统的应用,对加速高速公路监控设施建设、城市交通状况的 发展具有非常重要的意义。同时,为图像采集技术及其在交通监控里的应用开发积累经 验。 1 2 必要性分析 智能交通的建设离不开数据采集,而完整的数据采集又离不开视频采集。目前,视 频采集技术已被广泛的应用到交通事件的监控、交通管理、以及交通安全等领域。因此, 随着计算机技术的发展,视频采集在智能交通领域中会扮演越来越重要的角色。然而, 由于视频采集设备在交通领域应用广泛,而且采集设备种类繁多,性能各异,造成了视 频采集程序开发的局限性和重复性。造成人力物力的浪费。为解决这一矛盾,有必要为 交通领域设计一套通用的应用视频采集组件。 目前,在智能交通领域中,视频采集的一般开发方法是基于特定的视频采集设备, 直接利用厂商提供的例程或利用厂商提供的库函数和接口进行二次开发。开发周期长, 代码的重用性不高,而且只局限于特定的采集设备。总体上,在智能交通领域缺乏一种 统一的视频采集平台来满足日益迅猛发展的交通建设。由此,为加快在领域的建设,有 必要建立一套统一的视频开发组件。通过不断的完善和发展,该组件可以作为一种标准, 第一章绪论 应用到整个交通领域。 通用视频采集系统不仅仅局限于智能交通领域的应用。也可以被广泛地应用到社会 的其它行业中去。由于日常生活和工业生产中,人们经常需要对视频图像进行预览和采 集。因此,用于视频采集和预览的应用程序开发必不可少。通用视频采集系统的研究开 发也必然会在这些领域得到应用。 当前,市面上视频采集卡的种类繁多,质量参差不齐。此外,各个厂家提供的例程 或开发包,也不同程度的存在软件质量和采集效率问题。g v c 系统旨在发挥硬件的最大 性能,提供优质的图像效果,为不同的采集卡提供统一的采集预览平台为宗旨而研发。 本文的研究必然为以后该领域的进一步发展提供经验。 1 3 研究内容和目标 论文研究的主要目标是,利用d i r e c t s h o w 技术实现不同采集卡上视频信号的采集 和存储。相比采用驱动厂家提供的s d k 开发包,采用基于d i r e c t s h o w 技术具有更广泛的 通用性能。本文采用面向对象的软件设计模式给出了通用视频采集方案的具体实现方 法,最终建立一个通用的视频采集系统平台。 基于以上问题的分析和研究,本论文的主要研究内容包括以下几个方面: ( 1 ) c o m 组件技术的应用 c o m 组件技术是d i r e c t s h o w 系统的基础,同时,也是f i l t e r 开发的主要技术。本 文介绍了c o m 技术的相关背景知识,并利用该技术开发了自己所需要的抓图f i l t e r 。 ( 2 ) f i l t e r 的分析及开发 f il t e r 的分析与开发是本论文所要解决的关键技术,论文详细介绍了f il t e r 的连 接、类型、状态等相关信息。同时,总结了f i l t e r 开发的一般过程,并在关键技术章 节阐述了抓图f i l t e r 的设计及开发过程。 ( 3 ) g v c 系统的总体设计方案 分析了当前市面上常见的视频采集卡,并为其划分了类型;研究了d i r e c t s h o w 系 统对不同类型采集卡的支持。阐述采集设备f i l t e r 的构建过程,以及f i l t e rg r a p h m a n a g e r 的构建过程。最后给出,g v c 系统的体系结构。 ( 4 ) 面向对象的软件设计应用 阐述了如何利用面向对象的技术来设计和开发整个g v c 系统。在面向对象的技术中 主要介绍了观察者模式,并把这种模式应用到本系统中。 2 长安大学硕士学位论文 2 1d i r e c t s h o w 系统 第二章d i r e c t s h o w 系统 2 1 1d i r e c t x 系统简介 d i r e c t x 软件开发包是微软公司提供的一套w i n d o w s 操作平台上开发高性能图形、 声音、输入、输出和网络游戏的编程接口n 1 。微软将d i r e c t x 定义为“硬件设备无关性 , 即使用d i r e c t x 可以用与设备无关的方法提供设备相关的高性能。 实际上,d i r e c t x 已经成为一种标准,它可以为硬件开发提供策略,硬件厂商按照 这一标准进行产品改进;同时,通过d i r e c t x 所提供的接口,开发人员可以无须关心硬 件的具体执行细节。 d i r e c t x 是一个大的家族,并且随着其版本的不断更新,d i r e c t x 的家族成员也不 断发展壮大。如: d i r e c t xg r a p h i c s :集成了以前d i r e c t d r a w 和d i r e c t 3 d 技术。d i r e c t d r a w 主要负 责2 d 加速,以实现对显卡内存和系统内存的直接操作;d i r e c t 3 d 主要提供三维绘图硬 件接口,它是开发三维d i r e c t x 的基础。 d i r e c t s o u n d :主要提供音频捕捉、回放、音效处理、硬件加速、直接设备访问等 功能。 d i r e c t p l a y :主要提供多人网络游戏的通信、组织功能。 d i r e c t s h o w :为在w i n d o w s 平台上处理各种格式的媒体文件的回放、音视频采集等 高性能要求的多媒体应用,提供了完整的解决方案。 d i r e c t m u s i c :主要支持m i d i 音乐合成和播放功能。 2 1 2d i r e c t s h o w 系统简介 d i r e c t s h o w 是微软公司提供的一套在w i n d o w s 平台上进行流媒体处理的开发包,与 d i r e c t x 开发包一起发布。目前,d i r e c t x 最新版本为9 0 。d i r e c t s h o w 为多媒体流的 捕捉和回放提供了强有力的支持。运用d i r e c t s h o w 可以很方便地从支持w d m 驱动模型 的采集卡上捕获数据,并且进行相应的后期处理乃至存储到文件中。它广泛地支持各种 媒体格式,包括a s f 、m p e g 、a v i 、d v 、m p 3 、w a v e 等等,使得多媒体数据的回放变得轻 而易举。另外,d i r e c t s h o w 还集成了d i r e c t x 其它部分( 比如d i r e c t d r a w 、d i r e c t s o u n d ) 的技术,直接支持d v d 的播放,视频的非线性编辑,以及与数字摄像机的数据交换。更 3 第二章d i r e c t s h o w 系统 值得一提的是,d i r e c t s h o w 提供的是一种开放式的开发环境,可以根据需要定制组件。 其体系结构,如图2 1 d i r e c t s h o w 系统。 f i l es y s t e m 1 7 把m e t 。) :二蚓s f i i t e o u f r c s eh 可a n s f r o s r mhr e n d e r r i s ngfiltef i r e。z 一f i i t er sl lr sl lr s 曼rming音。kernestreamingarchitectur e 口,jl 广l 1l l l il ill lil w d m c a p t u r e d e v i c e s 二 鱼鱼 翼m h a r 船d w a r e | e 序与 g r a l a r d s o u n d c a r d v i d e o 昌:般iio e 拈佰lll 图2 1d i r e c t s h o w 系统 图2 1 中最大的一块为d i r e c t s h o w 系统,虚线以下是r i n g o 级别的硬件设备,虚 线以上是r i n 9 3 级别的应用层。d i r e c t s h o w 使用一种叫做f i l t e rg r a p h 的模型来管理 整个数据流的处理过程;参与数据处理的各个功能模块叫做f i l t e r ;各个f i l t e r 在 f i l t e rg r a p h 中按照一定的顺序连接成一条“流水线 协同工作。其基本工作原理为: 将单元组件f i l t e r 串联起来,交由f i l t e rg r a p hm a n a g e m e n t 统一控制。系统的输入 可以是本地文件系统、硬件插卡、因特网等,系统的输出可以是声卡、显卡、本地文件 系统,也可以将数据向网络发送。 d i r e c t s h o w 是基于模块化,每个功能模块都采取c o m 组件方式。d i r e c t s h o w 提供 了一系列的标准的模块可用于应用开发,开发者也可以开发所需功能的f i l t e r 来扩展 d i r e c t s h o w 的应用。 按照功能来分,f i l t e r 可以大致分为3 类:s o u r c ef i l t e r 、t r a n s f o r mf i l t e r 和 r e n d e r i n gf i i t e r 。s o u r c ef i l t e r 主要负责获取数据,数据源可以是文件、因特网计 算机里的采集卡、数字摄像机等,然后将数据往下传输;t r a n s f o r mf i l t e r 主要负责数 据格式转换,例如数据分离合成、解码编码等,然后将数据继续向下传输;r e n d e r i n g f i l t e r 主要负责数据的最终去向将数据送给显卡、声卡进行多媒体的演示,或者输 出到文件进行存储。 用图2 2 f i l t e r 工作示例来说明如何采用f i l t e r 来播放一个a v i 的视频文件: 4 胃 长安大学硕士学位论文 ( 1 ) 首先从一个文件中读取a v i 数据,形成字节流( 这个工作由源f i l t e r 完成) 。 ( 2 ) 检查a v i 数据流的头格式,然后通过a v l 分割f il t e r 将视频流和音频流分开。 ( 3 ) 解码视频流,根据压缩格式的不同,选取不同的d e c o d e rf i l t e r s 。 ( 4 ) 通过r e n d e r e rf i l t e r 重画视频图像。 ( 5 ) 音频流送到声卡进行播放,一般采用缺省的d i r e c t s o u n dd e v i c ef i l t e r 。 州e 。r 。胁l 呤回 a r e c t o e s o 恤u n d | t d e v ;l 、 ai l 、 h a r dd r i v e 图2 2f i i t e r 工作示例 从图2 2 看,每一个f i l t e r 都与其他的一个或者两个f i l t e r 相连接。两个f i l t e r 相连接的连接点也是c o m 对象,称为p i n 。f i l t e r 通过p i n 将数据从一个f i l t e r 传递 到另一个f i l t e r 中,从而可以使数据在由f i l t e r 组成的链表中流动。图中的箭头表示 f i l t e r 链表中的数据流的方向。在d i r e c t s h o w 中,像上面的这样一个f i l t e r 链表称 为f i l t e rg r a p h 。 f i i t e r 具有三个状态,运行,停止,暂停。当一个f i l t e r 运行时,它就处理媒体 数据流,当停止时,f i l t e r 就不在处理数据,暂停状态常用来在运行状态之前准备数据。 除了一些特别的例外, f i l t e rg r a p h 中所有的f i l t e r 的状态的改变都是统一的, 也就说f i l t e rg r a p h 中的所有的f i l t e r 的状态改变是一致协调的。即f i l t e rg r a p h 也可以有运行,停止,暂停三种状态。 f i l t e r 一般分为下面几种类型: ( 1 ) 源过滤器( s o u r c ef i l t e r ) :源过滤器引入数据到过滤器图表中,数据来源可 以是文件、网络、照相机等。不同的源过滤器处理不同类型的数据源。 ( 2 ) 变换过滤器( t r a n s f o r mf ii t e r ) :变换过滤器的工作是获取输入流,处理数据, 并生成输出流。变换过滤器对数据的处理包括编解码、格式转换、压缩解压缩等。 ( 3 ) 提交过滤器( r e n d e r e rf i l t e r ) :提交过滤器在过滤器图表里处于最后一级, 它们接收数据并把数据提交给外设。 ( 4 ) 分割过滤器( s p l i t t e rf i i t e r ) :分割过滤器把输入流分割成多个输出。例如, a v l 分割过滤器把一个a v i 格式的字节流分割成视频流和音频流。 ( 5 ) 混合过滤器( m u xf ii t e r ) :混合过滤器把多个输入组合成一个单独的数据流。 5 伫 掣 第二章d i r e c t s h o w 系统 例如,a v i 混合过滤器把视频流和音频流合成一个a v i 格式的字节流。 过滤器的这些分类并不是绝对的,例如一个a s f 读过滤器( a s fr e a d e rf il t e r ) 既 是一个源过滤器又是一个分割过滤器。 f i l t e rg r a p hm a n a g e r 也是一个c o m 对象,用来控制f i l t e rg r a p h 中的所有的 f il t e r ,主要有以下的功能: ( 1 ) 用来协调f i l t e r 之间的状态改变,从而使g r a p h 中的所有的f i l t e r 的状态的 改变应该一致。 ( 2 ) 建立一个参考时钟。 ( 3 ) 将f il t e r 的消息通知返回给应用程序 ( 4 ) 提供用来建立f i l t e rg r a p h 的方法。 状态改变,g r a p h 中的f i l t e r 的状态改变应该一致。应用程序不是直接将状态改变 的命令发给f i l t e r ,而是将相应的状态改变的命令发送给f i l t e rg r a p hm a n a g e r ,再 由f i l t e rg r a p hm a n a g e r 将命令分发给g r a p h 中每一个f i l t e r 。s e e k i n g 也是同样的 方式工作,首先由应用程序将s e e k 命令发送到f i l t e rg r a p hm a n a g e r 管理器,然后由 其分发给每个f il t e r 。 参考时钟,g r a p h 中的f i l t e r 都采用的同一个时钟,称为参考时钟( r e f e r e n c e c l o c k ) ,参考时钟可以确保所有的数据流同步。视频帧或者音频帧被提交的时间称为 p r e s e n t a t i o nt i m e 。p r e s e n t a t i o nt i m e 是相对于参考时钟来确定的。f i i t e rg r a p h m a n a g e r 应该选择一个参考时钟,可以选择声卡上的时钟,也可以选择系统时钟。 g r a p h 事件,g r a p h 管理器采用事件机制将g r a p h 中发生的事件通知给应用程序, 这个机制类似于w in d o w s 的消息循环机制。 g r a p h 构建的方法,g r a p h 管理器给应用程序提供了将f i l t e r 添加进g r a p h 的方法, 连接f i l t e r 的方法,断开f i l t e r 连接的方法。但是g r a p h 管理器没有提供如何将数据 从个f i l t e r 发送到另一个f i l t e r 的方法,这个工作是由f i l t e r 在内部通过p i n 来 独立完成的。 2 1 3d i r e c t s h o w 开发过程 在d i r e c t s h o w 系统之上,即是应用程序( a p p li c a t i o n ) 。应用程序要按照一定的意 图建立起相应的f i l t e rg r a p h ,然后通过f i l t e rg r a p hm a n a g e r 来控制整个的数据处 理过程。d i r e c t s h o w 能在f il t e rg r a p h 运行的时候接收到各种事件,并通过消息的方 6 长安大学硕士学位论文 式发送到应用程序。这样就实现了应用程序与d i r e c t s h o w 系统之间的交互。图2 3 d i r e c t s h o w 应用程序开发过程给出了d i r e c t s h o w 应用程序开发的一般过程: 日日目 l a p p l i c a t i o n i i f ;k e rg r a p hm a n a g e r l i 删c l i f i l t e rg r a p hm a n a 9 e r i m e t h o dc a li s ev e n t , 图2 3d i r e c t s h o w 应用程序开发过程 ( 1 ) 应用程序创建f il t e rg r a p hm a n a g e r 的一个实例。 ( 2 ) 应用程序使用f ii t e rg r a p hm a n a g e r 来构建应用所需要f il t e rg r a p h 。 ( 3 ) 应用程序通过f i l t e rg r a p hm a n a g e r 来控制f i l t e rg r a p h 和流数据。同时, 在整个过程中,响应来自f i l t e rg r a p hm a n a g e r 的事件n 1 。 2 2c o m 组件分析 2 2 1c o m 概述 c o m p o n e n to b j e c tm o d e l ( c o m ) 组件对象模型是微软公司为了计算机工业的软件生 产更加符合人类的行为方式开发的一种新的软件开发技术。在c o m 构架下,人们可以开 发出各种各样的功能专一的组件,然后将它们按照需要组合起来,构成复杂的应用系统。 由此带来的好处是多方面的:可以将系统中的组件用新的替换掉,以便随时进行系统的 升级和定制;可以在多个应用系统中重复利用同一个组件;可以方便的将应用系统扩展 到网络环境下;c o m 与语言平台无关的特性使所有的程序员均可充分发挥自己的才智与 专长编写组件模块等等1 。 c o m 是开发软件组件的一种方法。组件实际上是一些小的二进制可执行程序,它们 可以给应用程序,操作系统以及其他组件提供服务。开发自定义的c o m 组件就如同开发 动态的,面向对象的a p i 。多个c o m 对象可以连接起来形成应用程序或组件系统。并且 组件可在运行时刻,在不被重新链接或编译应用程序的情况下被卸下或替换。m i c r o s o f t 的许多技术,如a c t i v e x ,d i r e c t x 以及o l e 等都是基于c o m 而建立起来的。并且开发 人员也大量使用c o m 组件来定制他们的应用程序及操作系统。 7 第二章d i r e c t s h o w 系统 使用组件的种种优点直接来源予可以将它们动态的插入或卸出应用。为了实现这种 功能,所有的组件必须满足两个条件:第一,组件必须动态链接;第二,它们必须隐藏 ( 或封装) 其内部实现细节。动态链接对于组件而言是一个至关重要的要求,而消息隐藏 则是动态链接的一个必要条件。 2 2 2c o m 接口 接口是一个对象向外界暴露其功能的方式。从技术上讲,接口是包含了一组函数的 数据结构,通过这组数据结构,客户代码可以调用组件对象的功能。接口定义了一组成 员函数,这组成员函数是组件对象暴露出来的所有信息,客户程序利用这些函数获得组 件对象的服务。 c o m 接口是包含一个函数指针数组和一个指向这个数组的指针的内存结构。在c 语 言中可以通过使用结构类型来构造c o m 接口所要求的内存结构。用c + + 的纯抽象基类来 实现c o m 接口更自然方便。纯抽象基类是指仅包含纯抽象函数的基类。在纯抽象基类中 是不能实现这些纯抽象函数的,因此接口只定义功能但并不定义具体的实现。一个c o m 组件可以实现任意数目的接口,这可以通过对抽象基类的多重继承或使用嵌套类等方式 实现。为了实现组件的自我描述和控制自身的生存时间,c o m 规定所有的c o m 组件必须 实现一个名为i u n k n o w n 的接口。这个接口是访问c o m 组件中其他接口的起点。客户程 序用一个指向接口数据结构的指针来调用接口成员函数,接口指针实际上又指向另一个 指针,这第二个指针指向组函数,成为接口函数表,接口函数表中每一项为4 个字节 长的函数指针,每个函数指针与对象的具体实现连接起来。如图2 4 接口结构所示: 厂、 接口指针 - l t t l h 女“ l 指针函数i- h璜u 屉雹用l 指针函数2 对象实现 指针函数3 一 图2 4 接口结构 i u n k n o w n 的定义包含在w i n 3 2 so k 中的u n k n w n h 中,为清楚起见,引用如下: # d e f i n ei n t e r f a c es t r u c t in t e r f a c e i u n k n o w n v i r t u r a lh r e s u l t s t d c a l lq u e r y i n t e r f a c e ( c o n s tl i di i d ,v o i d * * p p v ) = 0 ; 8 长安大学硕士学位论文 v i r t u r a lu l o n g s t d c a lla d d r e f0 = 0 ; v i r t u r a lu l o n g s t d c a llr e l e a s e0 = o ; ) 在上面的定义中使用s t r u c t 定义接口i n t e r f a c e ,这是因为在c + + 中s t r u c t 关键 字除了成员属性默认为p u b l i c 而不是p r i v a t e 外,等同于c l a s s 关键字。而接口是用 来向外界公布组件功能的,因此成员函数的属性应为p u b l i c 。而一s t d c a l l 标记的函数 将使用标准的调用约定,即这些函数将在返回到调用者之前将参数从栈中删除。 q u e r y i n t e r f a c e 是提供组件自我描述的关键函数。客户可以通过此函数来查询某个 组件是否支持某个特定的接口。若支持,q u e r y i n t e r f a c e 将返回一个指向此接口的指针: 否则返回值将是一个错误代码。传入参数i i d 是一个标识客户所需接口的“接口标识符 , 输出参数p p v 存放查询到的接口的指针。返回值是一个h r e s u l t 类型,它是一个具有特 定结构的3 2 位值,不仅表示调用是否成功,而且在调用失败时,还包含出错原因的代 码。a d d r e f 和r e l e a s e 两个成员函数实现了一个名为引用计数的内存管理技术,它是使 组件能够将自己最简单,最高效地删除的方法。c o m 组件将维护一个称为引用计数的数 值。当客户从组件取得一个接口时,此引用计数值将增1 ,当客户使用完某个接口后, 组件的引用计数值将减l 。当引用计数值为o 时,组件即可将自己从内存中删除。a d d r e f 用来增大引用计数值,而r e l e a s e 用来减少这一值。 所有的c o m 接口都继承了i u n k n o w n ,每个接口的v t b l 表的前三个函数都是 q u e r y i n t e r f a c e ,a d d r e f 和r e l e a s e ,使得所有的c o m 接口都可以被当成i u n k n o w n 接 口来处理。并且c o m 组件的任何一个接口都可以被客户用来通过q u e r y i n t e r f a c e 函数 获取它所支持的其他接口。若某个接口的前三个函数不是这三个,那么它将不是一个c o m 接口。所有的接口指针同时也是i u n k n o w n 指针,客户不需要单独维护一个代表组件的 指针,只需要关心接口的指针。下面是一个关于飞机的简单的c o m 接口i p l a n e 的定义: i n t e r f a c ei p l a n e :i u n k n o w n v i r t u r a lv o i d s t d c a llf l y ( u n i th o u r s ) = 0 : v i r t u r a lv o i d s t d c a lls h o w k m0 = o : ) i p l a n e 从c o m 的根接口i u n k n o w n 继承来,并实现了两个新函数f l y 和s h o w k m 。f l y 是使飞机按参数h o u r s 指定的小时数飞行的函数;s h o w k m 是用来显示飞机行驶里程的函 9 第二章d i r e c t s h o w 系统 数。 c o m 定义的每一个接口都必须从基本接口i u n k n o w n 继承过来,i u n k n o w n 接口提供 了两个非常重要的方法:生存期控制和接口查询。每一个接口在设计时都被分配一个二 进制名字,被称为全局唯一标识符( g l o b a l l yu n i q u ei d e n t i f i e r ,g u i d ) 。 除了i u n k n o w n 接口外,还有另外一个重要的接口,即i c l a s s f a c t o r y 。c o m 规范规 定,每个组件都必须实现一个与之对应的类工厂( c l a s sf a c t o r y ) 。它实现了 i c l a s s f a c t o r y 接口。在i c l a s s f a c t o r y 的接口函数c r e a t e i n s t a n c e 中,才能使用n e w 操作生成一个c o m 组件类对象实例。 2 2 3 类工厂 类工厂是用来创建c o m 对象,它本身也是一个c o m 对象,通过它来完成c o m 对象的 创建过程,从而更好的实现客户与对象的隔离。它支持一个特殊的接口i c l a s s f a c t o r y , 其定义如下: c l a s si c l a s s f a c t o r y :p u b li ci u n k n o w n v i r t u a lh r e s u l t s t a c a l lc r e a t e i n s t a n c e ( i u n k n o w n 木p u n k n o w n o u t e r , c o n s ti i d & i i d ,v o i d * * p p v ) = 0 : v i r t u a lh r e s u l ts t a c a l ll o c k s e r v e r ( b 0 0 lb l a c k ) = o : ) : 接口i c l a s s f a c t o f y 的成员函数c r e a t e i n s t a n c e 用于创建对应的c o m 对象。每个 c o m 对象都有一个相应的类工厂对应。如果一个组件程序实现了多个c o m 对象,则相应 的有多个类工厂对应。成员函数l o c k s e r v e r 用于对组件生存期的控制。在某些情况下, 用户可能在组件对象释放后仍然需要将组件程序锁定在内存中,这样通过用户保留的类 工厂中的接口指针可以再次调用组件对象。这样就需要通过l o c k s e r v e r 来实现锁定和 解锁,其原理类似于前面所述说的接口引用计数原理。类工厂本身也是c o m 对象,它是 由一个引出函数d 1 1 g e t c l a s s o b j e c t 创建的。d 1 1 g e t c l a s s o b j e c t 函数的原型如下: h r e s u l td 11 g e t c l a s s o b j e c t ( c o n s tc l s i d & c l s i d ,c o n s tl i d & i i d ,( v o i d * 木) p p v ) : 由于一个组件可能实现多个c o m 对象,因此在d l l g e t c l a s s o b j e c t 的参数中指定了 c l s i d 来创建符合要求的类工厂,ii d 和p p v 用来指定接口i i d 和存放类工厂接口指针。 l o 长安大学硕士学位论文 以一个数据操作组件为例说明组件、类工厂以及c o m 对象之间的关系如图2 5 组件、类 工厂和对象关系图。 图2 5 组件,类工厂和对象关系图 2 2 4c o m 库 c o m 库在整个c o m 对象体系中有着非常重要的作用。c o m 并不仅仅是一套规范,它 还包含有一些具体的实现即c o m 库。c o m 库充当组件程序和客户程序之间的桥梁,它被 用来给所有客户和组件提供组件管理服务。c o m 库保证了对所有的组件大多数重要的操 作都可以按相同的方式完成。c o m 库可以节省花在组件及客户程序的实现上面的时间。 在组件对象的创建过程中,客户程序并不直接调用组件程序的引出函数,它调用c o m 库 的函数进行组件对象的创建工作,c o m 库的创建函数根据注册表的信息调用组件程序的 入口函数来创建组件对象。这些函数被用来进行c o m 对象的初始化工作,以及c o m 对象 的创建和内存管理工作。 2 2 5c o m 创建 c o m 对象的创建要经过以下步骤: ( 1 ) c o c r e a t e i n s t a n c e 调用c o g e t c l a s s o b e c t 函数: ( 2 ) c o m 库找到d l l 程序并进入进程: ( 3 ) 调用d l l g e t c l a s s o b j e c t 函数: ( 4 ) d l l g e t c l a s s o b j e c t 函数创建类工厂: ( 5 ) d l l g e t c l a s s o b j e c t 把类工厂接口指针返回给c o g e t c l a s s o b e c t 函数: ( 6 ) c o g e t c l a s s o b e c t 把类工厂接口指针返回给c o c r e a t e i n s t a n c e 函数: ( 7 ) c o c r e a t e i n s t a n c e 得到类工厂后,调用类工厂的对象创建函数: ( 8 ) 类工厂创建c o m 对象: ( 9 ) 类工厂把c o m 对象返回给c o c r e a t e i n s t a n c e 函数,c o c r e a t e i n s t a n c e 函数返 回: ( 1 0 ) 客户直接调用c o m 对象。 c o m 对象创建过程如图2 6 所示。 2 3f i l t e r 的分析与研究 图2 6c o m 对象创建过程图 2 3 1f i l t e r 概述 f i l t e r 是d i r e c t s h o w 中最小的功能模块,它通过f i l t e rg r a p h 来管理,管理者 叫做f i l t e rg r a p hm a n a g e 。f i l t e r 一般由一个或多个p i n 组成,f i l t e r 之间通过p i n 相互连接,构成一条顺序的链路。前面提到,f i l t e r 可以大致分为3 类:s o u r c ef i l t e r 、 t r a n s f o r mf ii t e r 和r e n d e r i n gf il t e r 。识别这三种f il t e r 的方法是根据其包含的输 入p i n 或者输出p i n 的数量来判断。一般仅含有输出p i n ,没有输入p i n 的f i l t e r 为 s o u r c ef il t e r ;既有输入p i n 又有输出p i n 的f il t e r 为t r a n s f o r mf il t e r ;仅有输入 p i n ,没有输出p i n 的f i l t e r 是r e n d e r i n gf i l t e r 。 f i l t e r 是一
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2023年黑龙江辅警协警招聘考试备考题库含答案详解(精练)
- 湖南省洞口县2025年化学高二第一学期期末达标检测试题含解析
- 上海外国语大学《生物工程制图》2024-2025学年第一学期期末试卷
- 内蒙古鸿德文理学院《环境工程导论》2024-2025学年第一学期期末试卷
- 2026届上海市徐汇区上海师大附中高二生物第一学期期末检测试题含解析
- 江苏省常州市常州中学2025-2026学年高二上化学期末统考试题含解析
- 承德应用技术职业学院《工程制图与识图》2024-2025学年第一学期期末试卷
- 2026届广西桂平市数学高二上期末达标检测模拟试题含解析
- 广东省佛山市重点中学2025-2026学年生物高二上期末监测试题含解析
- 长沙师范学院《地质学基础B》2024-2025学年第一学期期末试卷
- 2025年胸膜炎护理试题及答案
- 二级活性炭环保箱工程施工方案
- 2025-2026华为ICT大赛-昇腾AI赛道理论考试题库(核心500题)
- 上海购房合同(标准版)
- 110千伏变电站设计项目技术方案
- 2025年青海省公务员申论考试真题试卷(含答案)
- 文旅产业知识培训课件
- 协助患者更衣课件
- 企业人力资源数字化管理平台方案
- 2025年广东铁投集团校园招聘笔试参考题库附带答案详解
- 农业机械安全操作规程手册课件
评论
0/150
提交评论