目的是为视频处理和与外部应用程序同步实现自定义 MFT。的细节并不重要。作为第一步,我想要实现的是使用 DXVA 视频处理或 DXVA-HD 启动和运行 MFT。我无法这样做。
这是我所做的:我开始使用源输入节点(我的网络摄像头)、MFT(MFT_Grayscale 示例)和 EVR 构建拓扑。我将它包含在一个小型应用程序中。拓扑有效,我可以看到来自相机的单色流。现在我想更改 MF_Grayscale 示例的代码,使其支持 DXVA 视频处理并可以使用 VideoProcessBlt 方法提供的硬件加速。Microsoft 文档提供了一些信息,但我无法实现正在运行的 MFT。
到目前为止我做了什么:
- 在方法
GetAttributes
中,我指出这个 MFT 是MF_SA_D3D_AWARE
. - 在方法
ProcessMessage
中,我处理消息MFT_MESSAGE_SET_D3D_MANAGER
以获取设备句柄 aIDirect3DDeviceManager9
和 aIDirectXVideoProcessorService
。 - 在
SetInputType
方法中,我使用此处描述的方法 https://msdn.microsoft.com/en-us/library/windows/desktop/ms694235(v=vs.85).aspx 获取 DXVA2_VideoDesc 结构并遵循此代码 https: //msdn.microsoft.com/en-us/library/windows/desktop/cc307964(v=vs.85).aspx 创建视频处理设备。此外,我使用创建表面IDirectXVideoProcessorService->CreateSurface
- 在方法
GetOutputStreamInfo
中,dwFlags
变量如下所示:
pStreamInfo->dwFlags =
MFT_OUTPUT_STREAM_PROVIDES_SAMPLES |
MFT_OUTPUT_STREAM_WHOLE_SAMPLES |
MFT_OUTPUT_STREAM_SINGLE_SAMPLE_PER_BUFFER |
MFT_OUTPUT_STREAM_FIXED_SAMPLE_SIZE;
直到这里,一切似乎都很好。现在我的问题(对不起,我不能更具体):
我必须调整
GetOutputAvailableType/SetOutputType
方法吗?在
ProcessInput
方法中,我得到IMFSample
并提取一个IMFMediaBuffer
.IDirect3DSurface9
根据我的函数调用,缓冲区没有管理 a 。我是否必须将缓冲区的数据存储到 Direct3D 表面?在
ProcessOutput
创建起点的方法中,我想将传入的帧转发到输出。VideoProcessBlt
应该从输入到输出进行 1:1 blit。文档说:获取当前未使用的可用表面。
如何确定某个表面是否在使用中?
我应该如何输出表面?我应该使用
MFCreateVideoSampleFromSurface
orMFCreateDXSurfaceBuffer
吗?不幸的是,我真的迷路了,无法使用文档取得任何进展。
现在的情况是我看不到任何视频输出(窗口具有其默认的窗口背景颜色)并且网络摄像头在第一帧之后停止捕获帧(LED 关闭)。除此之外什么也没有发生——应用程序只是继续运行而不显示任何东西)。
我希望有人能帮助我。如果有人可以指导我使用 DXVA 视频处理或 DXVA-HD 为 MFT 示例代码,我也将不胜感激。我找不到任何东西...
谢谢