Directshow渲染过滤器仅在发布模式下崩溃

时间:2013-06-06 22:02:12

标签: c++ filter directshow

我编写了一个自定义渲染器过滤器,用于将视频帧推送到系统内存,然后再推送到OpenGL。它不在DLL中,我没有注册它,而是像第this page段中描述的那样使用它。这在调试模式下工作正常,但在Release中它开始崩溃。我正在执行以下操作来初始化图表:

HRESULT hr;

CoInitialize(0);
CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC, IID_IGraphBuilder, (void**)&graph);

graph->QueryInterface(IID_IMediaControl, (void**)&mediaControl);
graph->QueryInterface(IID_IMediaSeeking, (void**)&mediaSeeking);

grabber = new textureGrabber(0, &hr);
grabber->AddRef(); // crash here
grabber->setTexture(&texture);
grabber->QueryInterface(IID_IBaseFilter, (void**)&base);

graph->AddFilter(base, L"OpenGL texture video filter");
graph->RenderFile(path.c_str(), 0);

由于访问冲突,这会在AddRef()上崩溃。我已经尝试过自己实现类的IUnknown了,我得到的最好的是它崩溃的AddFilter因为IBaseFilter似乎无效。在那之后,我发现甚至Microsoft-issued example这样做的方式很简单,似乎对他们有效。我很好奇可能有什么问题,因为我正在做同样的事情 - 甚至尝试过智能指针。

编辑:问题出在CBaseFilter DECLARE_IUNKNOWN宏中,GetOwner() - > AddRef失败。 GetOwner本身似乎有效。

2 个答案:

答案 0 :(得分:0)

GetOwner将您传递的任何内容作为第二个参数返回给CBaseFilter构造函数。通常为NULL,除非您出于某种原因聚合对象(如果是,您可能不需要)。

答案 1 :(得分:0)

如果您的发布版本链接到Strmbasd.lib,即DirectShow基类库的 debug 版本,则可能发生崩溃。

将项目的发布配置更改为链接Strmbase.lib,而不是库的发布版本。