2010-09-18 1 views
1

Я возиться с фильтром PushSource образца поставляется с DirectShow SDK и у меня следующая проблема:PushSource фильтры DirectShow по вызывают IMediaControl :: Run вернуться S_FALSE

Когда я звоню IMediaControl :: Run (), он возвращает 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, добавить фильтр, сделать его вывод и нажать Run. Затем вы увидите состояния каждого фильтра отдельно, так что вы увидите, какой фильтр не запускался и почему.