如何判断 DXVA 解码器是不是已退回到软件解码

Posted

技术标签:

【中文标题】如何判断 DXVA 解码器是不是已退回到软件解码【英文标题】:How to tell if a DXVA decoder has fallen back to software decoding如何判断 DXVA 解码器是否已退回到软件解码 【发布时间】:2015-03-19 05:36:10 【问题描述】:

来自https://msdn.microsoft.com/en-us/library/windows/desktop/dd797815%28v=vs.85%29.aspx

在约束中,您读到“DXVA 加速的最大保证分辨率为 1920 × 1088 像素;在更高的分辨率下,如果底层硬件支持,则使用 DXVA 进行解码,否则,使用软件进行解码。”

有没有办法检测解码是在软件中完成的?

我们在尝试解码 4K H264 视频时遇到了 AMD 图形控制器的问题。

我们知道硬件不支持 4K 解码,理论上它应该回退到软件。 然而,我们发现不管它应该做什么,我们都会得到很多损坏或黑帧。

我希望我们能够检测到 DXVA 是否已经退回到 SW 解码,在这种情况下,我们根本不会尝试使用 DXVA,而是使用完整的软件路径。

谢谢

【问题讨论】:

【参考方案1】:

H264 MFT 不显示是否使用 DXVA 进行解码。

它使用IDirectXVideoDecoderService::CreateVideoDecoder创建DXVA解码器,所以你可以手动调用这个函数看看它是否成功。

我在Mozilla bug 1193547 中为此添加了完整的解释(和 apitrace 日志)

【讨论】:

【参考方案2】:

您是否尝试过通过 mftrace(包含在 Windows SDK 中)运行您的应用程序? mftrace 输出非常详细,通常会让您知道哪个 MFT 用于编码。当硬件编码可用时,您可能能够发现正在使用的不同 MFT。

例如,使用 H264 编码,英特尔 MFT 是一种硬件编码器,当系统硬件支持时,将使用它而不是标准的 Microsoft 编码器。

【讨论】:

你是说解码?我只对解码感兴趣 抱歉是解码。虽然这并不重要,因为 mftrace 输出会吐出它正在使用的 MFT 类 ID,无论它用于什么、编码、解码、重新采样等。你感兴趣的是被使用的 MFT 类何时创建解码拓扑。 但是我如何在自己的代码中使用这些信息。我显然不能使用 mftrace... 如果您的意思是如何从您自己的代码中确定 MF 在后台使用了哪个解码器 MFT,我不知道。可以手动构建 MF 拓扑并准确指定要使用的解码器 MFT,但如果解码器是特定于硬件的,则最终可能会变得脆弱。

以上是关于如何判断 DXVA 解码器是不是已退回到软件解码的主要内容,如果未能解决你的问题,请参考以下文章

基于FFmpeg的Dxva2硬解码及Direct3D显示

GPU编解码GPU硬解码---DXVA

是否可以共享 DXVA 表面?

Windows Media Player 中的 DXVA2 解码器 MFT 与多显示器显示

dxva2 硬件解码器支持哪些 h264 配置文件

无法使用DXVA2和ffmpeg解码HEVC视频