directshow filter的编写

这里着重介绍transformfilter的编写。

1, 写dll和com的接口,随便找个程序照猫画虎一下就行了,这里不赘叙了。

2, 写filter的接口,继承自CtransformFilter.下面介绍一下CtransformFilter.
CtransformFilter是一个基类,有两个重要的数据成员CtransformInputPinm_pInput;
CtransformOutputPin m_pOutput.
从这两个数据成员可以得到当前输入输出的currentMediaType.写filter就是实现CtransformFilter的一些虚函数。

3, 实现CheckInputType(const CMediaType *mtIn),该函数检查输入视频流的类型,通过(VIDEOINFO *) mtIn->Format()可以得到输入图像的高度,宽度。

4, 实现GetMediaType(int iPosition, CMediaType *pMediaType),该函数初始化输出视频流的类型,

5, 实现CheckTransform(const CMediaType*mtIn,const CMediaType *mtOut),该函数检查输入输出视频流是否兼容。

6, 实现DecideBufferSize(IMemAllocator*pAlloc,ALLOCATOR_PROPERTIES *pProperties),该函数在为输出端口分配buffer时,决定buffer的大小。

7, 实现Transform(IMediaSample *pIn, IMediaSample *pOut),该函数是最核心的函数,pIn是输入数据端口,pOut是输出数据端口,实现数据转换(编码或解码)

以上5个虚函数是必须实现的,下面介绍几个可选实现的函数
(1)StartStreaming(),初始化类成员变量,如encode_open();
(2)StopStreaming(),释放类成员变量,如encode_close();
(3)Receive(IMediaSample*pSample),取得一个sample,经过处理后输出。功能和Transform差不多。

你可能感兴趣的:(filter,directshow)