gpt4 book ai didi

c++ - 使用 DirectX 视频加速 (DXVA) 实现媒体基础转换 (MFT)

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:43:19 62 4
gpt4 key购买 nike

目的是为视频处理和与外部应用程序的同步实现自定义 MFT。的细节并不重要。作为第一步,我想要实现的是使用 DXVA 视频处理或 DXVA-HD 启动并运行 MFT。我做不到。

这是我所做的:我开始使用源输入节点(我的网络摄像头)、MFT(MFT_Grayscale 示例)和 EVR 构建拓扑。我将其包含在一个小应用程序中。拓扑有效,我可以看到来自相机的单色流。现在我想更改 MF_Grayscale 示例的代码,使其支持 DXVA 视频处理并可以使用 VideoProcessBlt 方法提供的硬件加速。Microsoft 文档提供了零碎的信息,但我无法实现正在运行的 MFT。

到目前为止我做了什么:

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。我是否必须将缓冲区的数据 memcpy 到 Direct3D 表面?

  • ProcessOutput 方法中作为起点,我想将传入帧转发到输出。 VideoProcessBlt 应该进行从输入到输出的 1:1 blit。文档说:

    Get an available surface that is not currently in use.

如何确定表面是否在使用中?

  • 我应该如何输出表面?我应该使用 MFCreateVideoSampleFromSurface 还是 MFCreateDXSurfaceBuffer

  • 不幸的是,我真的很迷茫,无法使用文档取得任何进展。

现在的情况是我没有看到任何视频输出(窗口具有默认的窗口背景颜色)并且网络摄像头在第一帧之后停止捕捉帧(LED 关闭)。除此之外什么也没有发生——应用程序只是继续运行而没有显示任何内容。

我希望有人能帮助我。如果有人可以指导我使用 DXVA 视频处理或 DXVA-HD 的 MFT 示例代码,我将不胜感激。我找不到任何东西...

谢谢

最佳答案

Do I have to adapt the GetOutputAvailableType/SetOutputType methods?

是的。您需要照常提供属性,没有特殊要求。

Do I have to memcpy the data of the buffer to a Direct3D surface?

是的。执行此操作时需要关心 IDirect3DDeviceManager9 和 LockDevice,因为 EVR 可以同时使用该表面。

How can I determine whether a surface is in use?

您必须格外小心,尤其是当表面可以免费使用时。您的 MFT 需要实现 IMFAsyncCallback 接口(interface)。使用 MFCreateVideoSampleFromSurface 后,查询 IMFTrackedSample 接口(interface)并调用 SetAllocator。 Invoke 方法会告诉您表面何时空闲。

How am I supposed to output the surface? Should I use MFCreateVideoSampleFromSurface or MFCreateDXSurfaceBuffer?

因为您正在使用 IDirectXVideoProcessorService->CreateSurface,所以 MFCreateVideoSampleFromSurface 是正确的位置。您通过 IMFSample 输出表面。

检查这个项目:

MFNode

在MFTDxva2Decoder和MFSkDxva2Renderer下,你会发现一些dxva2处理。

关于c++ - 使用 DirectX 视频加速 (DXVA) 实现媒体基础转换 (MFT),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28448764/

62 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com