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

Post date: 2015/4/14 上午 05:35:27

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的框架, 并且只是一个框架, 什么工作也没有做, 如果要用的话直接修改就可以用了。