Transform filter和Trans-in-place filter的区别

Transform filter和Trans-in-place filter的区别
首先,这两种Filter是有共同点的,因为Trans-in-place filter本身就是从Transform filter中继承过来的。其次,我们要明白的是,Trans-in-place filter“尽力”使自己的Input pin和Output pin使用相同的Allocator,以免去一次Sample数据的memcpy。我们说“尽力”,就是说Trans-in-place filter也未必能够实现它的初衷。(如果Trans-in-place filter使用的Allocator是ReadOnly的,而Trans-in-place filter又要修改Sample的数据,则Trans-in-place filter的Input pin和Output pin将不得不使用不同的Allocator。)

Trans-in-place filter有一个protected的成员变量m_bModifiesData,默认值为true。如果你确信定制Trans-in-place filter不需要修改Sample数据,则将m_bModifiesData赋值为false,这样可以保证Input pin和Output pin使用相同的Allocator


•   CTransformFitler设计用于使用单独的输出和输入缓冲区的transform filter。这种类型的filter有时叫做copy-transform filter。当一个copy-transform filter接收一个输入采样时,它改写新的数据到一个输出采样并且传递这个输出采样到下一个filter。
•   CTransInPlaceFilter是为修改在原始缓冲区中的数据而设计的filter,也叫做trans-in-place filters。当一个trans-in-place filter接收一个采样,它在内部改变采样数据并且传递这个采样到下一级。这个filter的输入PIN和输出PIN一直用匹配的媒体类型连接。


1、选择所要创建的filter的用途,据此来选择基类。基类可以从CTransformFilter、CTransInPlaceFilter、CVideoTransformFilter和CBaseFilter中来选取。
(1) CTransInPlaceFilter提供了本地处理Sample的机制(Sample可以认为是存储一个视频帧的结构),当一个trans-in-place filter收到一个sample时,你可以通过重载它的Transform()函数来修改其中的数据,trans-in-place filter会在Transform()函数执行完后直接把这个sample传递给下一个filter。
(2) CTransformFilter完成的功能与CTransInPlaceFilter一样,它们的区别就是CTransformFilter总是把上游filter传递过来的sample复制一份,并把复制后的sample传递给下一个filter。当然,你可以通过重载Transform()函数来控制这个过程,包括修改其中的数据(这也是自己写filter的原因)。
(3)CVideoTransformFilter与CTransformFilter一样,只是多加了质量控制功能。
(4)以上三个filter都继承于CBaseFilter,所以如果想对filter进行更多的控制,就要直接从CBaseFilter来继承,但是所要做的工作也最多。
在这个例子中,我选择CTransformFilter,因为CTransInPlaceFilter太简单了,dx9sdk中的例子NullNull就是一个完整的CTransInPlaceFilter的框架,并且只是一个框架,什么工作也没有做,如果要用的话直接修改就可以用了。


你可能感兴趣的:(Transform filter和Trans-in-place filter的区别)