Я возиться с фильтром 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));
Каждый знает, как исправить это?