DX11VideoRenderer поток безопасен? - PullRequest
0 голосов
/ 10 мая 2018

Я использую образец 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 и что может быть причиной этой проблемы?

Спасибо!

-UPDATE-

Мне удалось продублировать проблему только с одним окном, поэтому оно больше не является проблемой с многопоточностью. Если я много раз вручную изменяю размер окна, я иногда могу заставить видео в окне мерцать. Когда это происходит, я вижу в своем журнале, что при одном и том же вызове функции VideoProcessorBlt() произошла ошибка с тем же кодом возврата, E_INVALIDARG .

...