Как выполнить рендеринг в текстуру DirectX11 из вывода H.264 NV12 IMFSample?

Есть ли какие-нибудь хорошие примеры, показывающие, как рендерить IMFSample вывод декодера H.264? В моем сценарии используется поток H.264 с разрешением 4K, и компьютер, на который я нацелен, будет принимать только 1080p с использованием буферов DXGI. Но декодер H.264 будет обрабатывать 4K, поэтому мне нужно найти способ передать этот NV12 IMFSample непосредственно в рендерер DirectX 11. Я уже пробовал использовать образец DX11VideoRenderer, но он терпит неудачу из-за того, что этот конкретный IMFSample не имеет IMFDXGIBuffer интерфейса.

Похоже, что в DX11VideoRenderer вход IMFDXGIBuffer относится к типу NV12, и его можно успешно визуализировать на оборудовании. Кажется логичным, что не-DXGI-буфер типа NV12 тоже должен быть приемлемым?

Возможно, мне нужно создать ID3D11Texture2D текстуру или ресурс типа NV12? Я нашел примеры того, как создать текстуру из файла, но не о том, как создать текстуру из образца, что могло бы быть даже более полезным. И если я могу создать текстуру NV12, как определить значения SysMemPitch и SysMemSlicePitch в структуре D3D11_SUBRESOURCE_DATA для NV12?

Любая помощь могла бы быть полезна! Спасибо.


person Gary G.    schedule 18.05.2018    source источник
comment
social.msdn.microsoft.com/Forums/sqlserver/en-US/   -  person VuVirt    schedule 18.05.2018
comment
@VuVirt Вот интересно, спасибо за ссылку. Что делать, если я использую Color Converter DSP MFT для преобразования сначала из NV12 в RGB32. Тогда будет ли легче визуализировать этот IMFSample? Я считаю, что MFT также имеет аппаратное ускорение, поэтому он также может быть быстрее, чем преобразование, показанное в образце кода, на который вы ссылаетесь.   -  person Gary G.    schedule 19.05.2018
comment
Конвертер цветов не использует аппаратное ускорение и не создает для вас образец dxgi. Вы можете попробовать использовать продвинутый процессор viseo, но ему может потребоваться поверхность dxgi уже на входе. Лучше создать образец dxgi самостоятельно, как показано по ссылке.   -  person VuVirt    schedule 19.05.2018
comment
@VuVirt Спасибо, для меня это имеет смысл. Простите меня, я не эксперт по DirectX, но, похоже, некоторые важные части отсутствуют в примере по ссылке. Есть ли еще примеры, показывающие, как все это сочетается? Я предполагаю, что memcpy с D3D11_MAPPED_SUBRESOURCE в коде ссылки заменяет CreateVideoProcessorInputView, CreateVideoProcessorOutputView и VideoProcessorBlt, которые, как я вижу, используются в примере DX11VideoRenderer?   -  person Gary G.    schedule 20.05.2018
comment
CreateVideoProcessorInputView также ожидает текстуру DX.   -  person VuVirt    schedule 21.05.2018


Ответы (1)


Мне удалось найти полный пример, который отображает образец NV12 на экране. Хотя при рендеринге собственного изображения-примера есть несколько простых ошибок вычисления шага, реальный код рендеринга работает правильно. Похоже, это старый образец Microsoft, о котором я не могу найти никакой другой информации.

D3D11NV12Rendering

person Gary G.    schedule 15.06.2018
comment
Большое спасибо за то, что поделились своими выводами, но было бы здорово описать эти простые ошибки расчета шага здесь, а не просто упоминать об их существовании. - person NexD.; 02.08.2018