目的是实现用于视频处理和与外部应用程序同步的自定义MFT.细节并不重要.我想要实现的第一步是使用DXVA视频处理或DXVA-HD启动和运行MFT.我无法这样做.
这就是我所做的:我开始使用源输入节点(我的网络摄像头),MFT(MFT_Grayscale示例)和EVR构建拓扑.我把它包含在一个小应用程序中.拓扑工作,我可以看到相机的单色流.现在我想更改MF_Grayscale示例的代码,使其支持DXVA视频处理,并可以使用VideoProcessBlt方法提供的硬件加速.Microsoft文档提供了一些信息,但我无法实现正在运行的MFT.
到目前为止我做了什么:
GetAttributes我指出这个MFT是MF_SA_D3D_AWARE.ProcessMessageI中处理消息MFT_MESSAGE_SET_D3D_MANAGER以获取设备句柄,a IDirect3DDeviceManager9和a IDirectXVideoProcessorService.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->CreateSurfaceGetOutputStreamInfo,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我的函数调用.我是否必须将缓冲区的数据存储到Direct3D表面?
在ProcessOutput制作起点的方法中,我想将输入帧转发到输出.VideoProcessBlt从输入到输出应该是1:1的blit.文件说:
获取当前未使用的可用表面.
如何确定表面是否正在使用?
我怎么输出表面?我应该使用MFCreateVideoSampleFromSurface或MFCreateDXSurfaceBuffer?
不幸的是,我真的迷路了,无法使用文档取得任何进展.
现在的情况是我没有看到任何视频输出(窗口有其默认的窗口背景颜色),并且网络摄像头在第一帧(LED关闭后)停止捕获帧.除此之外没有任何反应 - 应用程序只是继续运行而没有显示任何内容.
我希望有人可以帮助我.如果有人能指导我使用DXVA视频处理或DXVA-HD进行MFT的示例代码,我将不胜感激.我找不到任何东西......
谢谢