基于微软广播驱动体系的数字电视技术及其应用程序

从模拟电视向数字电视演进的变革,在用户需求和技术进步的巨大拉动下,已经成为一个不可逆转的潮流。与传统的模拟电视相比,数字电视具有可实现高保真传 输,可提供高清晰音视频,可提供与终端用户的交互操作以及可采用数字压缩技术有效提高信道利用率等技术优势。当前,作为市场上的主流PC操作系统,微软 Windows系列也不失时机的把数字电视技术纳入其技术框架,为PC用户提供数字电视信号的接收,处理和播放服务。微软电视技术允许基于微软操作系统平 台,运用微软提供的构件以及第三方构件,方便快速的实现数字电视的收看及应用程序的设计,支持包括ATSC,DVB等各种协议标准。本文将探讨基于微软广 播驱动体系(BDA)的数字电视技术及其应用程序的设计与实现。

  一 广播驱动体系(BDA)

  1. 广播驱动体系概述

  微软广播驱动体系(Broadcast Driver Architecture)定义了一种框架,这种框架支持用于接收数字电视的各种网络拓扑构成。它包含了用于网络构造和控制的软构件,多路选择,表分析和 IP数据递送等以适用于主要的数字电视标准包括DVB和ATSC等。

  广播驱动体系使得独立硬件提供商(IHVs)能够制造可工作于Windows系统的调谐接收设备或者为支持新的网络类型而设计的硬件设备。与 BDA兼容的驱动程序能够被作为过滤器(Filter)自动暴露在DirectShow中,即BDA设备过滤器。作为一个标准的体系,BDA 使得上层应用程序不必关心BDA本身的细节,从而简化了应用程序的设计。

  广播驱动体系(BDA)的微型驱动程序(miniDriver)控制着执行以下操作的数字电视硬件:

  * 调谐数字广播信号;

  * 解调数字信号;

  * 捕获数字信号的帧;

  * 将信号分离为视频音频以及数据流。

  BDA微型驱动程序具有一个统一的框架,设计者只需要填写一些固定的结构体的相关参数,这些参数指出了对硬件进行各种操作的各种类 (CLASS)和方法(Method)。依据这些固定的结构体,驱动程序就可以被内核流插件自动的作为过滤器暴露在DirectShow中了。

  2. 广播接收拓扑

  为了构造DirectShow框架下的过滤器图表(Filter Graph),使其能够适应网络结构的多样性以及调谐和解码的软,硬件的多样性,广播驱动体系引入了功能拓扑(functional topology)的概念。功能拓扑指出了对接收到的信号所进行的一系列转换操作,但其本身并没有描述任何实际的过滤器,软件模块或者如何在软件或硬件上 进行操作等细节,相反,它定义了一系列抽象控制节点(Control node)的布局结构,每一个节点代表着一个通用的离散的操作。取决于安装在计算机上的不同的硬件或者软件构件,同一个功能拓扑,将有可能导致不同的过滤 器图表布局。例如,第三方硬件提供者如果选择在同一个电路卡上实现调谐和解调,那么,在DirectShow中,该硬件将表现为一个单独的BDA设备过滤 器,而在其内部却包含着两个控制节点(即调谐和解调)。所以,一个BDA设备的过滤器区别于传统的DirectShow 过滤器的特点就在于它能够封装一个功能模块(电路板或者芯片)上的实现着控制节点的所有硬件功能。功能拓扑实际上为第三方提供商构造了一个相当灵活的平 台,使其可以根据实际,选择软硬件的实现方法。



一个典型的BDA接收功能拓扑如图1所示。这个接收拓扑完成了以下操作:

  * 调谐并解调数字信号;

  * 捕获并解复用信号;

  * 获得电子节目单(electronic program guide)信息;

  * 获得音频和视频数据;

  * 获得IP数据。

  通常,数字调谐Tuner的功能总是由硬件实现,其过滤器构件由一个内核流代理插件自动暴露给DirectShow 成为BDA设备过滤器。

  Transport information filter(TIF)和Network provider的功能总是由软件实现,其他功能则可以选择由硬件或软件实现。图1的每一个方框都对应着BDA的一个控制接点,每一个控制节点都能够采用 标准的算法把网络和节目的特定参数与输入信号或输入信号构件结合起来,从而产生一个对与其直接相连的下游控制节点有用的新的信号。在实际的过滤器图表中, 几个控制节点可能只表现为一个过滤器。

  3. 广播驱动体系控制机制

  在图1中,功能拓扑的第一个控制节点是Network Provider,通常它也表现为一个单独的过滤器。Network Provider在广播驱动体系的过滤器图表中充当着管理者以及应用程序接口的角色,它负责着数字电视信号进入并且通过广播驱动体系设备。当前,广播提供 商是通过三种基本的网络形式:卫星,有线和天线来进行数字电视信号的传送的,这些数字信号所遵循的协议也是多样的,比如:ATSC,DVB-C,DVB- T和DVB-S等。BDA设备可以接收并管理这些数字信号。

  对于Network Provider过滤器而言,它具有以下特点和作用:

  * 是过滤器图表中的源过滤器,但实际上,并没有真实的数据通过这个过滤器;

  * 对于每一种网络形式,存在一个Network Provider;

  * 参与整个过滤器图表的建立;

  * 通过BDA 驱动程序提供的方法和属性与其他的由BDA驱动程序初始化的过滤器进行通信(比如Network Provider负责对Tuner进行配置)。

  Network Provider本身是一个COM组件,它提供了一个标准接口ITuner给上层的应用。使得上层应用程序可以通过这个接口把调谐的请求发送给 Network Provider,然后它再把这个请求传递给BDA的驱动程序(miniDriver),用以完成数字调谐,接着在Network Provider的指导下,由Microsoft MPEG2 Demux Filter完成对音频,视频,IP等数据流的分离,送到相应的过滤器进行处理。

  微软已经提供了四种不同的Network Provider,用于支持ATSC,DVB-C,DVB-T和DVB-S等网络类型。这四个Network Provider可以在Graph Edit的BDA Network Providers目录下看到。

  二 微软统一调谐模型

  为了适应不同网络类型,微软定义了统一调谐模型(Unified Tuning Model)。这种模型使得应用程序能够对使用任何兼容设备的任意网络类型的任意应用程序采用一个标准的过程进行调谐。

  1. 调谐过程概述

  应用程序调谐并选择节目的基本方式是提交一个调谐请求给Network Provider过滤器,上面已经提到,Network Provider过滤器在收到调谐请求以后将会与设备过滤器(驱动程序)通信并完成硬件调谐。微软推荐的取得调谐请求的方式是从已经建立的向导库 (guide store)中取得一个调谐请求,这种向导库中包含着可以显示给终端用户的节目有关信息以及用于硬件调谐的网络特定信息,一般情况下,这个向导库出现在注 册表的下面位置中:HKEY_LOCAL_MACHINE /SOFTWARE/Microsoft/Tuning Spaces。



图2所示为调谐模型对象之间的关系。如图2所示,系统调谐空间对象(System Tuning Spaces Object)包含了一组调谐空间(Tuning Space),每一个调谐空间代表着一个不同的网络类型(ATSC,DVB-C,DVB-S以及DVB-T等),调谐空间包含着调谐到某一具体节目的相关 信息,调谐请求(Tune Request)对象就是根据它来产生的。定位器(Locator) 对象包含着信号源的其他信息。一个调谐空间可以包含一个默认的定位器(Default Locator),用于定位多路复用传输流中的默认流。显然,调谐空间对象,调谐请求对象以及定位器对象都是与特定的网络类型相关的,因而具体的对象也是 不相同的。

  对于一个具体的节目而言,可以包含一个或者多个基本流,每一个基本流被称为一个组件(Component),并用组件类型 (Component Types)来描述之,如音频或者视频组件等。有些组件是可以被手工剔除的,比如同一个节目可能包含两个不同语言的音频流,可以选择一个而剔除另一个。一 个调谐空间可以包含一个可供优先选择的组件类型(Preferred Component Types)清单用以从流中选择默认的组件,应用程序可以基于用户要求覆盖这个默认选择而选择其他组件。

  2. 调谐过程的操作顺序

  与调谐相关的信息总是被包含在调谐请求对象中,应用程序把调谐请求发送给Network Provider过滤器以供调谐。调谐共分为两个阶段:定位和获取。

  (1)信号的定位

  Network Provider过滤器首先把调谐请求信息传递给过滤器图表中的BDA MPEG-2 Transport Information Filter(TIF)过滤器,TIF据此填充调谐器(Tuner)对信号定位所需要的相关信息,比如载波频率(Carrier Frequency)等。一个调谐请求可能带有一个和它关联在一起的定位器,如果没有,TIF将为之创建一个默认的定位器。

  Network Provider过滤器然后要求BDA调谐器调谐到正确的频率上,并设置调谐器所需要的诸如前向纠错(FEC)率等参数信息。调谐器接收到信号以后,就转 发给BDA的捕获过滤器(Capture Filter),捕获过滤器负责对信号进行数字化并将数字化后的MPEG-2传输流发送给MPEG-2 Demultiplexer解复用过滤器。

  TIF过滤器总是将PID为0的流映射给自己,这个PID是为节目相关表(Program Association Table)PAT而预留的。当TIF收到PAT后,就会通知Network Provider过滤器节目映射表(Program Map Table)PMT表以及其他的表位于那些PID上。

  (2)信号的获取

  Network Provider过滤器通过询问TIF获得一个节目的组件清单。它可以基于优先选择组件清单激活或者屏蔽一些组件,然后把相应的PID映射到解复用过滤 器,这个过滤器负责把相应的流送到对应的PIN 上。对于没有映射到任何输出PIN上的PID流,解复用过滤器就会把它抛弃。TIF在过滤器图表运行的同时不断监测PMT以发现服务的变化,并将变化及时 通知给Network Provider过滤器。

  3. 与调谐相关的对象

  (1)调谐空间

  一个调谐空间代表着一个特定的网络类型,主要完成以下功能:

  * 保存关于网络的信息;

  * 是调谐请求对象的制造工厂;

  * 是永久性的。可以被保存在注册表中。

  为了取得本地系统的所有可用的调谐空间,如图2示,统一调谐模型提供了SystemTuningSpaces对象并在这个对象上暴露 ITuningSpacesContainer接口用以方便的进行调谐空间枚举。每一个调谐空间对象都暴露出一个继承自ITuningSpace的接口, 应用程序使用这个接口的CreateTuneRequest方法产生一个调谐请求对象。当然,统一调谐模型也允许在应用程序中产生一个新的调谐空间并设置 默认的定位器。

  (2)调谐请求,定位器和基本流组件

  对于数字电视,无论是初始的信号定位还是后续音视频以及数据基本流的发现,都需要调谐动作的介入。因而对于整个调谐操作而言,调谐请求对象因为其包含(或者提供获取手段)调谐所必须信息而被置于一个中心的地位。

  调谐请求对象产生的唯一方法就是调用调谐空间的CreateTuneRequest方法。如前所述,调谐请求中包含了网络相关信息,定位器信息,默认选取的组件信息等。

  定位器对象同样是与特定网络相关的,比如DVB-S所引用的定位器就是DVB-S Locator。定位器包含了为了使Network Provider过滤器定位特定的服务所需要的进一步信息,比如载频,符号率,极化方向以及电源等。

  统一调谐模型同样提供了对基本流组件进行选择的接口IComponent。如果不进行选择,Network Provider过滤器将使用优先选择组件清单对MPEG-2 Demultiplexer过滤器的输出PIN进行配置。默认的PIN配置如下:

  * PIN1:PSI(Program Specific Information)表信息。送给TIF过滤器;

  * PIN2:视频流;

  * PIN3:音频流;

  * PIN4:数据流;

  * PIN5:PSI表信息。送给MPEG-2 Section and Tables过滤器。

  4. 节目相关信息的取得

  为了从传输流中获取节目相关信息,比如PAT,PMT以及CAT等。主要有以下几种方法:

  * 从TIF过滤器中获得;

  * 从MPEG-2 Section and Tables过滤器中获得;

  * 实现一个用户级的过滤器以解析原始的PSI包;

  上述过滤器都提供了相应的接口以获得节目信息,并且可以混合使用上面几种方法。

  三 BDA应用程序设计

  微软在XP操作系统中提供了一个轻量级的ActiveX控件Video Control,该控件的使用将导致应用程序的开发极为方便。本文将讨论的是在没有这个控件的WIN2000操作系统下的DVB-S数字电视应用程序的设 计。对于这种应用程序,必须手动的把需要的过滤器连接起来构成完整的过滤器图表。

  在应用程序开发之前,应当确保数字电视接收卡及其BDA驱动程序被正确安装和成功加载。此时,在Graph Edit的BDA Source Filters目录和BDA Receiver Components目录下应当分别可以看到相应的Filter。以TwinhanDTV sat(双汉DVB-S)接收卡为例,在这两个目录下,分别可以看到TwinHan DVBS BDA Tuner Filter和TwinHan DVBS BDA Capture Filter两个设备过滤器。对于有些硬件提供商的接收卡,这两个控制节点在BDA中可能被一个Filter所实现,所以也只在某一目录下表现为一个 Filter。

  以下的讨论对涉及DirectShow应用程序设计的公共细节未做深入,讨论的重点放在有关数字电视应用程序设计的部分。为了简化起见,以下出现的代码都不含错误处理。

  1. 初始化

  和普通的DirectShow应用程序一样,程序首先应当对COM组件进行初始化,然后创建一个过滤器图表对象。代码如下:

  CComPtr pGraph;

  CoInitializeEx (NULL, COINIT_APARTMENTTHREADED);

  pGraph.CoCreateInstance(CLSID_FilterGraph);

  2. 取得调谐请求对象

  前面的统一调谐模型已经详细讨论过调谐的细节。在应用程序中,可以使用系统枚举取得一个已有的调谐空间,也可以创建一个新的调谐空间以产生调 谐请求并提交给Network Provider过滤器。以下代码以产生一个新的调谐空间为例(网络类型为DVB-S),说明了调谐请求对象的产生:

  //Create DVBSTuningSpace Object and set its properties

  CComPtr pIDVBSTuningSpace = NULL;

  pIDVBSTuningSpace.CoCreateInstance(CLSID_DVBSTuningSpace);

  pIDVBSTuningSpace->put_UniqueName( bstrName );//set a unique name for this object

  pIDVBSTuningSpace->put_FriendlyName( bstrFriName );//set friendly name

  pIDVBSTuningSpace->put__NetworkType(CLSID_DVBSNetworkProvider);

  //Create DVBSLocator Object and set it as the default locator of the DVBSTuningSpace above

  CComPtr pLocatorVal = NULL;

  pLocatorVal.CoCreateInstance(CLSID_DVBSLocator);

  pLocatorVal->put_SymbolRate(dwSymbolRate );//set symbol rate

  pLocatorVal->put_CarrierFrequency(dwCarrFreq ) ;//set carrier frequency

  pLocatorVal->put_SignalPolarisation(Polar );//set polarization

  pIDVBSTuningSpace->put_DefaultLocator( pLocatorVal );

  //the source code for adding the this TuningSpace to SystemTuningSpaces is omitted

  //Create TuneRequest object and set its locator

  CComPtr pITuneRequest = NULL;

  pIDVBSTuningSpace->CreateTuneRequest(&pITuneRequest);

  CComQIPtr pIDVBTuneRequest(pITuneRequest);

  pIDVBTuneRequest->put_Locator(pLocatorVal);

  上述代码将创建一个调谐请求对象(指针为pIDVBTuneRequest),以便提供给Network Provider 过滤器,代码中没有设置优先选择组件清单,所以MPEG-2 Demultiplexer过滤器的各输出PIN将输出默认基本流。

  3. 创建Network Provider

  如前所述,Network Provider Filter控制着调谐过程并且和Transport Information Filter协同工作以从传输流中取得节目信息。为了选择Network Provider的类型,应当询问调谐空间(Tuning Space)以取得网络类型信息,从而选择对应的Network Provider。

  选择和创建过程代码如下:

  CComPtr pNetworkProvider; // Network Provider filter

  GUID CLSIDNetworkType; // GUID of the network type.

  // Find the network type.

  pIDVBSTuningSpace ->get__NetworkType(&CLSIDNetworkType);

  if (CLSID_NetworkType == GUID_NULL)

  {

  // This tuning space is analog TV, AuxIn, or some other non-BDA type.

  }

  else

  {

  // Create the network provider filter for this network type.

  pNetworkProvider.CoCreateInstance(CLSIDNetworkType);

  // Add the network provider to the graph.

  pGraph->AddFilter(pNetworkProvider, L"Network Provider");

  }

  上述代码中ITuneRequest::get_TuningSpace方法取得了一个特定的调谐请求的调谐空间,并且使用 ITuningSpace::get__NetworkType方法获得了其网络类型GUID,这个GUID作为参数传递给 CoCreateInstance以创建相应的Network Provider filter。

  成功创建Network Provider并把其加入过滤器图表(Filter Graph)后,询问取得其ITuner接口,把调谐请求(Tune Request)发送给它。代码如下:

  // Query for ITuner.

  CComQIPtr pTuner(pNetworkProvider);

  if (pTuner)

  {

  // Submit the tune request to the network provider.

  pTuner->put_TuneRequest(pIDVBTuneRequest);

  }

  ITuner接口的put_TuneRequest方法把调谐请求发送给了network provider。

  4. 增加并连接其他的过滤器

  使用调谐请求(Tune Request)对Network Provider进行成功配置以后,就可以把其余的过滤器加入并连接到过滤器图中。

  直接连接在Network Provider Filter后面的过滤器是位于BDA Source Filters(目录GUID为KSCATEGORY_BDA_NETWORK_TUNER)目录中的Tuner 过滤器;取决于硬件实现,Tuner过滤器后面连接的可能是位于BDA Receiver Components目录中的capture过滤器或demodulator过滤器(目录GUID为 KSCATEGORY_BDA_RECEIVER_COMPONENT)。找出该接收卡对应的设备Filter需要在对应目录下进行系统枚举并试图建立连 接,直至连接成功。 系统枚举的方法和DirectShow应用程序相同。

  当BDA的设备Filter被连接完成以后,紧接着连接是MPEG-2 Demultiplexer过滤器,如前所述,这个过滤器默认输出五个PIN,可以选择使用智能连接技术Render每个PIN完成整个过滤器图表的建 立。特别的,对于第四个PIN输出的IP数据,需要通过BDA MPE 过滤器再连接到BDA IP Sink过滤器上,这些数据的利用需要再做进一步开发。完整的过滤器图表如图3所示。



5. 应用程序控制及节目选取

  和普通的DirectShow应用程序相同,应当从GraphBuilder取得IMediaControl和IMediaEvent等接口,以控制过滤器图的运行,暂停和停止以及对一些应用程序关心的事件的进行捕捉和处理。

  Filter Graph成功建立并运行以后,就可以取得节目相关的信息。首先应当取得的是PAT表,获得PAT表的代码如下:

  // Get the next section with PID 0, which is reserved for the PAT.

  PID pid = 0x00; TID tid = 0x00;

  DWORD dwTimeout = 500; // msec

  MPEG2_FILTER mpeg2_filter = { 0 };

  //The IMpeg2Data interface is exposed by the MPEG-2 Sections and Tables filter

  CComPtr pSectionList = NULL;

  pIMpeg2Data->GetSection(pid, tid, NULL , dwTimeout, &pSectionList);

  通过pSectionList接口指针可以对PAT进行操作以获得本次调谐后可用的节目编号及其各自对应的PID。应用程序可以选择一路节目 进行播出。该节目被选择以后,需要进一步取得该节目的PMT表以获得其基本流组件(音频,视频或者数据等子流)对应的ID,并将这些基本流ID映射到 Demultiplexer过滤器的相应输出PIN上,就可以播出该节目了。PMT表的取得方法和PAT类似,只是GetSection方法中的PID应 为所选择节目的ID,TID为2。

  应用程序正常运行的时候,仍然可以提交一个新的调谐请求给Network Provider过滤器,从而引发一个新的调谐过程;也可以随时切换到另外一个节目频道;或者设置某个节目频道中的组件(音频,视频或者数据等子流)为可用或不可用。

  四 结语

  本文详细讨论了微软数字电视技术的广播驱动体系以及微软统一调谐模型,并在此基础上,实现了一个完整的数字电视应用程序。基于特定的数字电视 接收卡,对该应用程序的进一步完善,可以实现在PC机上的数字电视的收看并可以在DirectShow框架下对收到的音频,视频和IP包等做进一步处理。

你可能感兴趣的:(网络,filter,null,Graph,NetWork,微软)