Есть ли в DirectX / Media Foundation высокопроизводительный промежуточный формат представления данных? - PullRequest
0 голосов
/ 20 марта 2020

Я только что использовал D3D11. Мне нужно перехватить поверхность в контексте устройства / swap X потока a и поместить ее в «inter-media-data». Эти межмедийные данные можно локально визуализировать в контексте устройства / обмена Y другого потока B. По соображениям производительности, я надеюсь, что межмедийные данные могут копировать и обрабатывать исходные данные в видеопамяти, а не в Системной памяти как можно больше, и лучше быть независимым от этих контекстов. Например, я аппаратно кодирую его как H264 и отправляю по сети в другом рабочем потоке. Я пытался IMFSample, но я не знаю, может ли он достичь эффекта, или есть ли проблема с моим мышлением?

  1. Я звоню MFCreateDxgiSurfaceBuffer и MFCreateSample из backbuffer устройства / swap X, чтобы получить IMFSample, но я не уверен, относится ли пример к устройству / swapx или нет? Есть надежда, что при уничтожении устройства / своппинга этот образец будет по-прежнему действителен.

  2. IMFSample может запрашивать только ID3D11Texture2D интерфейс через IMFDXGIBuffer, но в устройстве / свопе рендеринг ID3D11Texture2D, ни метод CopySubresourceRegion, ни CreateRenderTargetView не работает. Есть ли другой эффективный и простой метод рендеринга?

1 Ответ

1 голос
/ 20 марта 2020

Нет (и, возможно, нет необходимости) выделенного промежуточного формата. Модель Media Foundation такова, что она имеет модель выборок и буферов, которые могут быть реализованы со ссылкой на данные устройства и API, заданные c (например, Direct3D 11). Видеокадр может быть интерфейсом IMFSample к Media Foundation, и в то же время иметь данные, находящиеся в текстуре D3D11 ID3D11Texture2D.

Я надеюсь, что межмедийные данные могут копировать и Максимально используйте исходные данные в видеопамяти, а не в системной памяти

Для этого вам просто нужно хранить свои данные в видеопамяти, в текстурах D3D11. Именно вы предоставляете диспетчер устройств DXGI для конвейера Media Foundation и, как правило, именно вы сами контролируете срок службы и параметры хостинга устройства D3D11. Вы можете иметь текстуры (кадры), чтобы пережить этап кодирования видео в случае, если вам нужны кадры для других целей. Вы можете использовать это устройство совместно с swapchain и использовать текстуры как для кодирования, так и для презентаций (возможно, в частности, будет работать ID3D11DeviceContext::CopySubresourceRegion).

...