首页 > 解决方案 > 在 DirectX 表面缓冲区上执行转置操作

问题描述

我正在使用启用了硬件加速的 IMFSourceReader 来解码视频并将它们读入我的应用程序。在调用 ReadSample 之后,我从 IMFSample 中获得了 IDirect3DSurface9。此时,我使用 LockRect() 调用来访问原始字节并将它们复制到我的应用程序缓冲区中。

我想在 GPU 上执行其他操作,例如转置以及可能将图像数据从行优先顺序转换为列优先顺序。

我可以为此设置 Blt 操作吗?

我遇到了 ID3DXBaseEffect 界面,但我不确定这是否适用于我的情况。

将不胜感激任何投入。

迪内什

标签: directxvideo-processingdirect3dms-media-foundation

解决方案


使用 IDirect3DSurface9,您可以使用着色器 (ID3DXBaseEffect)。

要直接在 GPU 上执行此操作,在将原始字节复制到您的应用程序之前,我将尝试以下操作:

  • 调用 IMFSourceReader::GetServiceForStream 查询 MR_VIDEO_ACCELERATION_SERVICE 和 IDirect3DDeviceManager9。
  • 使用 IDirect3DDeviceManager9 查询 IDirect3DDevice9 (IDirect3DDeviceManager9::LockDevice)。
  • 使用 IDirect3DDevice9、IDirect3DSurface9、新的 RenderTarget、着色器,与 Directx 一样。
  • 从最终的 RenderTarget 复制原始字节(在着色器应用之后)。

编辑

见这里:mofo7777 github

在 MediaFoundationTransform > MFTDirectxAware > MFTVideoShaderEffect 下,我将展示这个概念。


推荐阅读