Как создать IMFSample из текстуры D11 для кодера Intel MFT

Я хочу кодировать видео с помощью «Intel® Quick Sync Video H.264 Encoder MFT».
Если я создаю IMFSample из системных буферов, он работает хорошо. Так же, как следующие:

IMFMediaBuffer *pBuffer = NULL;
MFCreateMemoryBuffer(cbSize, &pBuffer);
BYTE *pData = NULL;
pBuffer->Lock(&pData, NULL, NULL);
memcpy(pData, bufferIhaveinYYYYUV format, buffer size);
pBuffer->Unlock();
IMFSample *pSample = NULL;
MFCreateSample(&pSample);
pSample->AddBuffer(pBuffer);

Сейчас я изучаю, могу ли я подавать на него поверхности ID3D11Texture2D в качестве входных данных (DXGI_FORMAT_NV12, 1280×720) для повышения производительности. Я попытался передать экземпляры IMFSample, созданные с помощью MFCreateVideoSampleFromSurface или MFCreateDXGISurfaceBuffer, в IMFTransform :: ProcessInput и провел несколько экспериментов (пробуя разные флаги создания текстуры), но лучший результат состоял в том, что все входные выборки были приняты, но выходные образцы не создавались. В случае, если это имеет значение, я никогда не пытался загружать данные в текстуры, предполагая, что это не будет иметь никакого значения от текстур, заполненных данными пикселей мусора.

Я делаю что-то неправильно?

1

Решение

Вы в основном повторяете предыдущий вопрос но все еще без добавления какого-либо кода, который не работает.

Тот факт, что вы можете подавать нормальные (в памяти) сэмплы и иметь работающий кодер, говорит о том, что вы все делаете правильно. Обратите внимание, что в режиме Direct3D предполагается, что вы должны не только предоставлять поверхности Direct3D 9 или текстуры Direct3D 11, но также выполнять соответствующую инициализацию MFT. В частности, текстуры и внутренние элементы MFT должны принадлежать одному и тому же устройству Direct3D и, следовательно, необходимые шаги до начала потоковой передачи. Это не только MFCreateDXGISurfaceBuffer который нужно назвать.

В общем, подход изложен на MSDN в Поддержка Direct3D 11 декодирования видео в Media Foundation статья. То же самое относится и к сценарию кодирования. Вы должны использовать IMFDXGIDeviceManager указатель и вы должны использовать MFT_MESSAGE_SET_D3D_MANAGER сообщение. MFT работает так, как предлагает MSDN, и переключается в режим Direct3D 11, принимая выборки на основе текстуры, несущие данные входного кадра.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]