2010-09-18 66 views
1

我與隨的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)); 

任何人都知道如何解決這個?

回答

0
IBaseFilter *pushSource = 0; 
graph->AddSourceFilter(L"sample.bmp", L"Source", &pushSource); 

AddSourceFilter添加了一個默認的源過濾器,我不認爲它會添加你的pushsource samplefilter。

我會建議添加圖形到ROT,所以你可以檢查它與graphedit。

如果你不調用GetState()會發生什麼?

hr = pMediaControl->Run(); 
if(FAILED(hr)) { 
    /// handle error 
} 

long evCode=0; 
while (evCode == 0) 
{ 
    pEvent->WaitForCompletion(1000, &evCode); 
    /// other code 
} 
0

打開GraphEditPlus,添加過濾器,渲染其PIN碼,並按運行。然後你會看到每個過濾器的狀態,所以你會看到什麼過濾器沒有運行,爲什麼。