设为首页 加入收藏

TOP

DirectShow中写push模式的source filter流程 + 源代码(内附详细注释)(二)
2015-07-20 17:31:51 来源: 作者: 【 】 浏览:5
Tags:DirectShow 中写 push 模式 source filter 流程 源代码 详细 注释
的实现

添加新类PushTestFilter,使其继承自CSource。这就是我们的filter类,在这个类里面没有过多的操作,就只有2个函数而已:

//filter的主类,继承自CSource
class PushTestFilter : public CSource
{
public:
// 唯一能创建该类实例的接口
static CUnknown * WINAPI CreateInstance(LPUNKNOWN lpunk, HRESULT *phr);

private:
//只能通过CreateInstance()的调用创建实例
PushTestFilter(LPUNKNOWN lpunk, HRESULT *phr);
};

这里有2点需要注意:

构造函数PushTestFilter()是private的,不是一般的public!!!!!!!!!!!
CreateInstance()函数是static的,因为它不能通过对象来调用!!!!

2个函数的具体实现如下:

//构造函数,注意这里是private属性的,不是public,
//所以要创建它的实例,只能是通过CreateInstance()函数的方式
PushTestFilter::PushTestFilter(LPUNKNOWN lpunk, HRESULT *phr):
CSource(NAME("PushTest"), lpunk, CLSID_PushTest)
{
ASSERT(phr);
CAutoLock cAutoLock(&m_cStateLock);

//m_paStreams是从CSource基类继承来的指针数组。由于这个demo我们只
//有1个pin,所以分配了1个空间
m_paStreams = (CSourceStream **) new PushTesiPin*[1];
if(m_paStreams == NULL)
{
if(phr)
*phr = E_OUTOFMEMORY;

return;
}

//为刚分配的那个空间付值,这就自动给filter加入了一个pin,析构的
//时候会自动释放
m_paStreams[0] = new PushTesiPin(phr,this,L"Push_Test");
if(m_paStreams[0] == NULL)
{
if(phr)
*phr = E_OUTOFMEMORY;

return;
}
}

//CreateInstance()该函数是static属性的,因为不能通过对象来调用
CUnknown * WINAPI PushTestFilter::CreateInstance(LPUNKNOWN lpunk, HRESULT *phr)
{
ASSERT(phr);

//这里调用了private属性的构造函数
CUnknown *punk = new PushTestFilter(lpunk, phr);
if(punk == NULL)
{
if(phr)
*phr = E_OUTOFMEMORY;
}
return punk;
}


这里的类PushTesiPin就是我们的pin类,在后面要实现!!其实主要的操作是在pin类PushTesiPin里面的。

第五步:pin类的实现

添加类PushTesiPin,使其继承自CSourceStream。这里需要重载的函数会多一点!不过没关系!我会一个一
个的进行说明。

主要是这3个:

//由于我们的filter就一种媒体类型,所以重载了GetMediaType(CMediaType *pMediaType)
//如果有多种类型,就应该重载另外2个函数了,具体参考基类CSourceStream
HRESULT GetMediaType(CMediaType *pMediaType);

//这个函数是用来设置Sample大小的,在pin连接成功后会被调用
HRESULT DecideBufferSize(IMemAllocator *pIMemAlloc,ALLOCATOR_PROPERTIES *pProperties);

//对Sample数据的填充
HRESULT FillBuffer(IMediaSample *pms);

我在源代码里面都家了比较详细的注释,参考源代码一起看容易明白。

其实这个filter没做别的,就相当与将sdk下的PushSource例子自己再写了一遍,主要是为了说明这个过程,
到这里相信你应该有个大概的概念了,那么恭喜!

我也写累了,如果对大家有帮助就找个时间再将写pull拉
模式的过程也写出来。

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇Light OJ 1317 Throwing Balls in.. 下一篇uva 10452 Marcus

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·C++ Lambda表达式保 (2025-12-26 05:49:45)
·C++ Lambda表达式的 (2025-12-26 05:49:42)
·深入浅出 C++ Lambda (2025-12-26 05:49:40)
·C语言指针从入门到基 (2025-12-26 05:21:36)
·【C语言指针初阶】C (2025-12-26 05:21:33)