在基于CSource的过滤器中实现Directshow IFileSourceFilter接口

时间:2011-10-01 13:11:48

标签: filter directshow

我实现了从CSource过滤器派生的简单的Directshow过滤器。它工作正常。 我想要的是添加过滤器IFileSourceFilter。所以我为此做的是:

我使用两种方法实现FileSourceFilter接口:

HRESULT Load(LPCOLESTR lpwszFileName, const AM_MEDIA_TYPE *pmt)
HRESULT GetCurFile(LPOLESTR * ppszFileName, AM_MEDIA_TYPE *pmt)

目前[仅供测试目的]他们什么都不做

// Required by  IFileSourceFilter 

STDMETHODIMP Load(LPCOLESTR lpwszFileName, const AM_MEDIA_TYPE *pmt)
{
         // do nothing for now...Just for test
         return S_OK;
}
STDMETHODIMP GetCurFile(LPOLESTR * ppszFileName, AM_MEDIA_TYPE *pmt)
{
         // do nothing for now...Just for test
          return S_OK;
}

并且还将IFileSourceFilter接口添加到源过滤器的NonDelegatingQueryInterface方法中。

 STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv)
{
     if (riid == IID_IFileSourceFilter) 
     {
           return GetInterface((IFileSourceFilter *)this, ppv);
     }
     else
     {
     return CSource::NonDelegatingQueryInterface(riid, ppv);
     }
}

当我将我的SourceFilter插入grapgEdit时,它很好地问我文件位置...我给出了一个随机文件[ for test porposes IFileSourceFilter interfcae暂时不做任何事情)...

然后我的SourceFilter在grah编辑工具中突然崩溃......

可能是错的?在实现IFileSourceFilter接口时我是否遗漏了什么? 任何可能导致此问题的建议?

祝福

我的SourceFilter结构:

 class MySourceFilter : public CSource,public IFileSourceFilter 
{
public:

....
DECLARE_IUNKNOWN;

STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv)
{
     if (riid == IID_IFileSourceFilter) 
     {
           return GetInterface((IFileSourceFilter *)this, ppv);
     }
     else
     {
     return CSource::NonDelegatingQueryInterface(riid, ppv);
     }
}

// Required by  IFileSourceFilter 

STDMETHODIMP Load(LPCOLESTR lpwszFileName, const AM_MEDIA_TYPE *pmt)
{
         // do nothing for now...Just for test
         return S_OK;
}
STDMETHODIMP GetCurFile(LPOLESTR * ppszFileName, AM_MEDIA_TYPE *pmt)
{
         // do nothing for now...Just for test
          return S_OK;
}

}

1 个答案:

答案 0 :(得分:3)

我认为您现在应该在E_FAIL函数中返回getCurFile。 Graphedit将询问过滤器哪个文件已加载,并且当GetCurFile返回S_OK时,期望接收文件名。但是ppszFileName将指向随机内存,如果你没有初始化它。

最好在getCurFile中实际返回一个值。使用CoTaskMemAlloc为文件名和媒体类型分配内存。然后设置一个虚拟文件名,并将mediatype memset设置为0.(但检查指针是否为空)。