DirectX / Media Foundation 是否有高性能的中间数据表示格式?

Does DirectX / Media Foundation have a high-performance intermediate data representation format?

我刚用过D3D11。我需要在线程a的device/swap X context中截取surface,放入"inter-media-data"。这个inter-media-data可以在另一个thread B的device/swap Y context中本地渲染。出于性能考虑,希望inter-media-data可以在显存中复制操作原始数据,而不是在系统内存尽可能多,最好独立于这些上下文。例如,我将其硬件编码为 H264 并在另一个工作线程中通过网络将其发送出去。我试了IMFSample,不知道能不能达到效果,还是我的思路有问题?

  1. 我从device/swap X的backbuffer中调用MFCreateDxgiSurfaceBufferMFCreateSample得到IMFSample,但我不确定样本是否相关是否到设备/swapx?希望在device/swapx被销毁后,这个样本依然有效

  2. IMFSample只能通过IMFDXGIBuffer查询ID3D11Texture2D接口,但是在device/swap渲染ID3D11Texture2D中,CopySubresourceRegion也不行CreateRenderTargetView 方法有效。还有其他高效简单的渲染方式吗?

没有(也许不需要)专用的中间格式。媒体基础模型是这样的,它具有样本和缓冲区模型,可以参考设备和 API 特定数据(例如,Direct3D 11)来实现。视频帧可以作为媒体基础的 IMFSample 接口,同时数据驻留在 D3D11 ID3D11Texture2D 纹理中。

I hope that the inter-media-data can copy and operate the original data in the video memory instead of in the system memory as much as possible

为此,您只需将数据保存在视频内存中,保存在 D3D11 纹理中。由您向 Media Foundation 管道提供 DXGI 设备管理器,因此通常由您控制托管 D3D11 设备的生命周期和参数。如果您需要将帧用于其他目的,您可以让纹理(帧)在视频编码步骤后仍然存在。您可以让此设备与交换链共享,并使用纹理来满足编码和演示需求(特别是 ID3D11DeviceContext::CopySubresourceRegion 可以工作)。