我與隨的DirectShow SDK的PushSource樣品過濾器亂搞,我有以下問題:的DirectShow的PushSource過濾器造成IMediaControl ::運行到返回S_FALSE
當我打電話IMediaControl ::運行( ),它返回S_FALSE,這意味着「圖形正準備運行,但有些過濾器尚未完成向運行狀態的轉換」。 MSDN建議然後調用IMediaControl :: GetState()並等待轉換完成。
所以,我打電話IMediaControl :: GetState(INFINITE,...)這是應該解決這個問題。
但是,相反,即使指定了無限的等待時間,它也會返回VFW_S_STATE_INTERMEDIATE。
我已經嘗試了所有三種變體(位圖,位圖集和桌面),它們都表現相同的方式,最初導致我相信有一個地方有一個錯誤。
然而,然後,我嘗試使用IFilterGraph :: AddSourceFilter做同樣的,它也做了同樣的事情,這必然意味着這是我的渲染代碼,這是問題:
CoInitialize(0);
IGraphBuilder *graph = 0;
assert(S_OK == CoCreateInstance(CLSID_FilterGraph, 0, CLSCTX_INPROC_SERVER, IID_IGraphBuilder, (void**)&graph));
IBaseFilter *pushSource = 0;
graph->AddSourceFilter(L"sample.bmp", L"Source", &pushSource);
IPin *srcOut = 0;
assert(S_OK == GetPin(pushSource, PINDIR_OUTPUT, &srcOut));
graph->Render(srcOut);
IMediaControl *c = 0;
IMediaEvent *pEvent;
assert(S_OK == graph->QueryInterface(IID_IMediaControl, (void**)&c));
assert(S_OK == graph->QueryInterface(IID_IMediaEvent, (void**)&pEvent));
HRESULT hr = c->Run();
if(hr != S_OK)
{
if(hr == S_FALSE)
{
OAFilterState state;
hr = c->GetState(INFINITE, &state);
assert(hr == S_OK);
}
}
long code;
assert(S_OK == pEvent->WaitForCompletion(INFINITE, &code));
任何人都知道如何解決這個?