DirectShow 中相关名词解析

来源:互联网 发布:linux java heap size 编辑:程序博客网 时间:2024/06/06 01:18

    *Filter Graph Manager。这个对象用于控制filter graph,支持IGraphBuilder、IMediaControl和IMediaEventEx等许多接口。所有的directshow应用程序都需要在某些地方用到这个对象,虽然在有些情况下,是其它的对象为应用程序创建了filter graph manager。
    *Capture Graph Builder。这个对象为构建filter graph提供附加的方法。它最初是为构建提供视频采集的graph而设计的(这正是它的名字由来),但是对于构建许多另外类型的filter graph也是很有用的。它支持ICaptureGraphBuilder2接口。
    *Filter Mapper和System Device Enumerator。这些对象用于查找在系统中注册的或代表硬件驱动的filter。
    *DVD Graph Builder。这个对象构建用以回放和导航DVD的filter graph。它支持IDvdGraphBuilder接口。基于脚本的应用程序能够使用MSWebDVD ActiveX控件来控制DVD回放。
    *Video Control。WinXP提供这个ActiveX控件,用于操纵directshow中的数据和模拟电视。

智能连接(Intelligent Connect)
智能连接这个术语覆盖了一系列Filter Graph Manager用于构建所有或部份filter graph的算法。任何时候,当Filter Graph Manager需要添加filter来完成graph时,它大致做以下几件事情:
    1.如果有一个filter存在于graph中,而且这个filter有至少一个没有连接的input pin,Filter Graph Manager试着去试用这个filter。
    2.否则,Filter Graph Manager在已注册的filter中寻找连接时可以接受合适的媒体类型的filter。每一个filter都注册有一个Merit值,这个值用以标记哪个filter最容易被Filter Graph Manager选中来完成graph。Filter Graph Manager按Merit值的顺序来选择filter,Merit值越大,被选中的机会越大。对于每种流类型(如音频、视频、MIDI),默认的renderer具有一个很高的Merit值,解码器同样是,专用filter具有低Merit值。
    如果Filter Graph Manager因选择的filter不合适而被困,它会返回来尝试另外的filter组合。

    智能连接涉及以下IGraphBuilder方法:
    *IGraphBuilder::Render
    *IGraphBuilder::AddSourceFilter
    *IGraphBuilder::RenderFile
    *IGraphBuilder::Connect

  Filter Graph Manager支持下列Graph构建方法:
    *IFilterGraph::ConnectDirect
,在两个pin之间进行直接连接,如果连接失败,则返回失败
    *IFilterGraph::Connect,连接两个Pin,如果可能的话,直接连接它们,否则,在中间加入其它的filter来完成连接。
    *IGraphBuilder::Render,从某个输出Pin处开始完成余下的graph构建。该方法会自动在输出pin后面添加必须的filter,直到renderer filter为止。
    *IGraphBuilder::RenderFile,构建一个完整的文件回放graph。
    *IGraphBuilder::AddFilter,将一个filter添加到graph中。它不连接filter,并且在调用此方法前,filter必须已经被创建。创建filter可以是用CoCreateInstance方法或使用Filter Mapper或系统设备枚举器(System Device Enumerator)。
    这些方法提供了三种构建graph的途径:
    1.filter graph manager构建整个graph
    2.filter graph manager构建部分graph
    3.应用程序构建整个graph

媒体样本(media sample)的COM

media sample提供 IMediaSample接口

IMediaSample::GetPointer

IMediaSample::GetSize

IMediaSample::GetActualDataLength

分配器(allocator)的COM对象IMemAllocator

IMemAllocator::GetBuffer

IMemAllocator::Commit来提交allocator,此时pin可以调用GetBuffer了

IMemAllocator::Decommit来反提交allocator,在allocator被再次提交前所有后来的GetBuffer调用都将失败

每一个allocator都创建一个media sample池,并为每个sample分配缓冲区。一旦一个filter需要一个缓冲区来填充数据,它就调用IMemAllocator::GetBuffer方法来请求一个sample。只要allocator有一个sample还没有被任何filter使用,GetBuffer方法就立即返回一个sample的指针。如果allocator所有的sample已经被用完,这个方法就阻塞在那里,直到有一个sample变成可用的了。GetBuffer返回一个sample后,filter就将数据写入到sample的缓冲区中去,并在sample上设置适当的标记(如时间戳),然后将它递交到下一个filter去。
    当一个renderer filter接收到了一个sample时,renderer filter检查时间戳,并将sample先保存起来,直到filter graph的参考时钟指示这个sample的数据可以被render了。当filter将数据render后,它就将sample释放掉,此时sample并不立即回到allocator的sample池中去,除非这个sample上的参考计数已经变为0,表示所有的filter都已释放这个sample。
推(push)模式拉(pull)模式

在推模式中,source filter产生数据,并将其递交给下游的filter,下游的filter被动地接收数据并处理它们,再将数据传递给它的下游filter。在拉模式中,source filter与一个parser filter连接,parser filter向source filter请求数据,source filter回应请求并传递数据。推模式使用IMemInputPin接口,而拉模式使用IAsyncReader接口。

停止(stopped)就绪(paused)运行(running)

IMediaControl::Run

IMediaControl::Pause

IMediaControl::Stop

 

 

 

IAsyncReader接口。
    典型的拉模式应用是文件回放。比如,在一个AVI回放graph中,Async File Source filter完成一般的文件读操作并将数据作为字节流传递下去,没有什么格式信息。AVI Splitter filter读取AVI头并将数据流分解成视频和音频sample。AVI Splitter比Async File Source filter更能决定它们需要哪些数据,因此需用IAsyncReader接口来代替IMemInputPin接口。
    要从输出pin请求数据,输入pin调用下面方法中的一个:
    *IAsyncReader::Request
    *IAsyncReader::SyncRead
    *IAsyncReader::SyncReadAligned
    第一个方法是异步的,支持多重读操作。其余的是同步的。