Фильтры PushSource в DirectShow заставляют IMediaControl :: Run возвращать S_FALSE - PullRequest
1 голос
/ 19 сентября 2010

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

Когда я вызываю IMediaControl :: Run (), он возвращает S_FALSE, что означает «график готовится к запуску, но некоторые фильтры не завершили переход в рабочее состояние». MSDN предлагает затем вызвать IMediaControl :: GetState () и дождаться завершения перехода.

Итак, я вызываю IMediaControl :: GetState (INFINITE, ...), который должен решить проблему.

Однако, наоборот, он возвращает VFW_S_STATE_INTERMEDIATE, хотя я указал бесконечное время ожидания.

Я перепробовал все три варианта (Bitmap, Bitmap Set и Desktop), и все они ведут себя одинаково, что первоначально привело меня к мысли, что где-то есть ошибка.

Однако затем я попытался использовать 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));

Кто-нибудь знает, как это исправить?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2010

Открыть GraphEditPlus , добавить фильтр, отобразить его пин-код и нажать Run. Затем вы увидите состояния каждого фильтра в отдельности, поэтому вы увидите, какой фильтр не работал и почему.

0 голосов
/ 19 сентября 2010
IBaseFilter *pushSource = 0;
graph->AddSourceFilter(L"sample.bmp", L"Source", &pushSource);

AddSourceFilter добавляет исходный фильтр по умолчанию, я не думаю, что он добавит ваш образец-фильтр pushsource.

Я бы порекомендовал добавить график в ROT, чтобы вы могли проверить его с помощью graphedit.

А что будет, если вы не вызовете GetState ()?

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

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