以下的文章是我在学习DirectShow的过程中翻译自DirectX 9 SDK的帮助文档,希望对大家了解和编写自己的filter等组件时有所帮助。翻译文档的内容我会陆续发到网上。
 

1.       DirectShow基础类库概述<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

Microsoft® DirectShow® 基础类库是一系列的C++类和实用函数的集合,这些使用函数的设计的目的是为了实现DirectShowfilter。对应用程序开发人员来说,某些帮助类也是非常有用的。

本篇文章描述了这个基础类库,包含了以下一些部分:

  • 如何使用DirectShow基础类库

  • Introduction to the Filter Base Classes

  • Base Class Reference

  • Utility Functions

  • Debugging Utilities

2.       如何使用DirectShow基础类库

如果你想使用Microsoft® DirectShow®基础类库,你必须生成和链接基础类库的库文件,这些库文件位于:

(SDK 根目录) \Samples\C++\DirectShow\BaseClasses

DirectShow 的基础类库的工作空间的名字叫做BaseClasses.dsw。这个工程生成了两个版本的库文件,一个零售版本——Strmbase.lib,一个调式版本的库文件——Strmbasd.lib。在你的自己的工程里面,如果你想使用基本类库,你必须包含Streams.h这个头文件。你的应用程序既可以链接Strmbase.lib or to Strmbasd.lib,这取决于你生成的程序的版本,即你是生成一个零售版本还是一个调试版本。

下面这个表格总结了你需要的文件:

工作空间

BaseClasses.dsw

零售版库文件

Strmbase.lib

调试版本库文件

Strmbasd.lib

头文件

Streams.h


 

 

2.1.       预处理符号

当你在你的工程中包含了Streams.h这个头文件,下面的与处理符号就有了特殊的意义:

  • PERF: 保留字符。不要使用这个预处理符号。

  • VFWROBUST: 在零售版本中启用指针验证。在调试版本周,这个并不是必须定义VFWROBUST宏。

3.       Filter基本类库简介

这篇文文章描述了Microsoft DirectShow基本类库,这个库是为filter开发人员设计的,但是应用程序开发人员可能会找到一些有帮助的类文件,或者调试应用程序时有些帮助。但是基本库类并不是DirectShow程序必须的。

下面的章节概述了大多数最重要的基本类:

下面的这些类用来支持COM对象的创建:

描述

CBaseObject

基本对象类。

CUnknown

实现了 IUnknown 接口。

 

大多数的DirectShow类派生于CBaseObject。这个类提供了一个在在Dll文件中的活动对象计数器,在运行时的调试帮助。在调试版本中,如果DLL没有被加载,但是对象计数器大于0,则被断言失败。这样就可以很容易的追踪由引用计数引起的内存泄露问题。

所有的这些基本类支持从CUnknown 中派生出来的COM接口,CUnknown派生于CBaseObjectCUnknown类支持引用计数、QueryInterface、聚合。

下面的这些类支持DirectShow filterpin对象的创建:

描述

CBaseFilter

Filter 的基础类,实现了 IBaseFilter 接口。

CBasePin

Pin( 接脚 ) 的基本类,实现了 IPin IQualityControl 接口。

CBaseInputPin

输入 pin 的基本类,使用了本地内存传输。实现了 IMemInputPin 接口。这个接口派生于 CBasePin

CBaseOutputPin

输出 pin 的基本类,使用了 IMemInputPin 连接。这个类派生于 CBasePIn

 

下面的这些类在创建专门的filter有一些帮助:

描述

CSource

创建源 filter 的基本类。这个基本类用来创建推源,但是不适合用来创建一个拉源 ( 参考推模式、拉模式 ) ,比如说文件读取器。如果要创建一个输出 pin ,使用 CSourceStream 类。

CTransformFilter

变换 filter 的基本类。这个类执行了一个数据的副本的拷贝。这个类的接脚类 (pin) CTransformInputPin CTransformOutputPin

CTransInPlaceFilter

变换 filter 的基本类,这个类不拷贝数据。这个类在向下游传输数据之前,直接执行输入数据处理。这个类的接脚是 CTransInPlaceInputPin CTransInPlaceOutputPin

CVideoTransformFilter

视频变换 filter 基本类,这个类派生于 CTransformFilter 然后添加了一些质量控制。

CBaseRenderer

渲染 filter 的基本类。输入接脚 (Pin) CRendererInputPin

CBaseVideoRenderer

视频渲染的基本类,这个类派生于 CBaseRenderer

要使用这些类,你必须要派生你自己的类,然后在你自己的类里面编写代码来实现filter里面的功能。越专业的基类,你要在你自己的派生类里面要书写的代码就越少。

下面的这些类实现了一些用在filterpin中的辅助对象。这些类中的大多数无需从中派生,可以直接使用。

类名

描述

CPullPin

在分析器上的辅助对象输入接脚。支持 IAsyncReader 推源的连接器

COutputQueue

输出接脚的辅助对象,可以传送一个样本队列 (queue samples ) 到一个工作线程 (worker thread)

CSourceSeeking

在一个有着准确外接接脚的源 filter 里面实现一个位置查找的辅助对象。 ( 这个类并不是为有多接脚的 filter 设计的,比如说像解析器 )

CEnumPins

在一个 filter 上为列举接脚的用的枚举对象。实现了 IEnumPins 接口。

CEnumMediaTypes

这是一个用于在接脚中枚举最优先的媒体类型的枚举对象,这个对象实现了 IEnumMediaTypes 接口。

CMemAllocator

内存分配器对象,实现了 IMemAllocator 接口。

CMediaSample

媒体样本对象。实现了 IMediaSample2 接口。

CBaseReferenceClock

引用时钟的基本类。实现了 IReferenceClock 接口。

CMediaType

辅助对象用来操作 AM_MEDIA_TYPE 数据结构。