Я использую образец Microsoft DX11VideoRenderer для рендеринга видео в реальном времени в Windows 10. Когда я запускаю только один поток, видео выглядит великолепно. Однако, когда я запускаю более 4 или 5 потоков, некоторые видео в соответствующих окнах начинают периодически гаснуть. Эффект может распространяться только на часть или на все видеоокно.
Также я получаю несколько периодических ошибок от этого вызова функции в моем файле журнала:
hr = pVideoContext->VideoProcessorBlt(m_pVideoProcessor, pOutputView, 0, 1, &StreamData );
Возвращенная ошибка: E_INVALIDARG Один или несколько аргументов недействительны 0x80070057
Я использую в своем коде только модули Presenter.cpp и display.cpp из DX11VideoRenderer. Исходный код находится по адресу: пример рендеринга видео DirectX
Мое первоначальное подозрение на данном этапе заключается в том, что DXVideoRenderer может быть не потокобезопасным. Я нашел эту информацию о многопоточности: Введение в многопоточность в Direct3D 11, в котором говорится:
Хотя использование контекста устройства (ID3D11DeviceContext) не является потокобезопасным, использование устройства Direct3D 11 (ID3D11Device) является потокобезопасным.
Но кажется, что, поскольку я использую отдельные экземпляры класса CPresenter для каждого окна, не должно быть проблем с тем, что ID3D11DeviceContext не является потокобезопасным, поскольку каждое окно должно иметь это собственный экземпляр ID3D11DeviceContext.
Есть ли у кого-нибудь опыт или идеи об этом образце программного обеспечения DX11VideoRenderer и о том, что может быть причиной этой проблемы?
Спасибо!
-ОБНОВЛЕНИЕ-
Мне удалось воспроизвести проблему только с одним окном, поэтому она больше не связана с многопоточностью. Если я вручную изменяю размер окна много раз, иногда видео в окне может мерцать. Когда это происходит, я вижу в своем журнале, что тот же вызов функции VideoProcessorBlt()
завершился ошибкой с тем же кодом возврата, E_INVALIDARG.