簡體   English   中英

Directshow渲染過濾器僅在發布模式下崩潰

[英]Directshow render filter crashes only in release mode

我編寫了一個自定義渲染器過濾器,將視頻幀推送到系統內存,然后推送到OpenGL。 它不在DLL中,我也沒有注冊它,而是像本頁面在第一段中描述的那樣使用它。 在“調試”模式下,此方法工作正常,但在“發行版”中,它開始崩潰。 我正在執行以下初始化圖:

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發行的示例 ,該示例都以簡單的方式執行此操作,並且似乎適用於他們。 我很好奇可能做錯了什么,因為我正在做同樣的事情-甚至嘗試了智能指針。

編輯:問題是在CBaseFilter DECLARE_IUNKNOWN宏中,GetOwner()-> AddRef失敗。 GetOwner本身似乎起作用。

GetOwner將您傳遞的任何內容作為第二個參數返回給CBaseFilter構造函數。 通常為NULL,除非您出於某種原因聚集對象(如果確實如此,則可能不需要)。

如果發布版本與Strmbasd.lib鏈接,則崩潰可能會發生, Strmbasd.lib是DirectShow基類庫的調試版本。

更改項目的發行版本配置,改為鏈接到Strmbase.lib ,這是該庫的發行版本。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM