c++ - Directshow 渲染过滤器仅在 Release模式下崩溃

标签 c++ filter directshow

我编写了一个自定义渲染器过滤器来将视频帧推送到系统内存,然后再推送到 OpenGL。它不在 DLL 中,我没有注册它,而是像 this page 一样使用它在第一段中描述。这在 Debug 模式下工作正常,但在 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 本身似乎有效。

最佳答案

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

关于c++ - Directshow 渲染过滤器仅在 Release模式下崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16972959/

相关文章:

c++ - Linux 上是否有等效的 .def 文件来控制共享库中导出的函数名称?

c++ - 将 unicode 字符串与 C++ 符号进行比较?

r - 将变量传递到 data.table

python - 如何过滤包含列表中所有值的 DataFrame 列?

c++ - ISampleGrabber::GetCurrentBuffer() 返回 E_OUTOFMEMORY

C++ 无法将 NULL 指针设置为包含对象的静态变量?

python - 链接 : fatal error LNK1104: cannot open file 'python37_d.lib'

java - 在 Java TextField 中只接受数字和一个点

directshow - 编写直接显示源过滤器

c# - DirectShow/WPF 线程问题