You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Media Foundation HEVC解码中MFTransform::ProcessOutput挂起问题求助

Media Foundation HEVC解码ProcessOutput无限挂起问题

问题现象

基于Media Foundation实现HEVC视频解码,前约6帧可正常处理,之后MFTransform::ProcessOutput函数无限挂起,调用栈如下:

NtWaitForMultipleObjects()
WaitForMultipleObjectsEx()
CDXVAFrameManager::WaitOnSampleReturnedByRenderer(void)
CH265DecoderTransform::ProcessOutput(unsigned long,unsigned long,struct _MFT_OUTPUT_DATA_BUFFER *,unsigned long *)

推测问题源于未正确释放某些资源,但无法确定具体对象。

当前实现配置

  • 配置两个MFTransform:一个用于HEVC数据解码,一个用于NV12到RGB格式转换
  • 通过发送MFT_MESSAGE_SET_D3D_MANAGER消息,将两个转换连接至渲染用DirectX 11设备
  • 转换已配置为自动创建样本(MFT_OUTPUT_STREAM_INFO结构中设置MFT_OUTPUT_STREAM_PROVIDES_SAMPLES标识),所有使用完毕的样本均已释放
  • 前几帧流程正常:HEVC样本解码为NV12格式,经格式转换为RGB后成功显示

已排查操作与疑问

  • 已查询D3D11Multithread对象并调用SetMultithreadProtected(TRUE),但无明显效果,是否需要用Enter/Leave调用包裹所有DirectX操作?
  • 找到存在完全相同问题的案例,解决方式描述为“释放Windows内部分配的指针”,但不清楚具体指向哪些指针
  • 解码器挂起前,ProcessOutput仅返回S_OK;若在挂起前暂停解码器,单独运行帧处理器会返回MF_E_SAMPLEALLOCATOR_EMPTY,推测RGB样本中存在未清理内容,但无法定位具体对象
  • 排查后确认代码无资源泄漏:强制重复释放样本会导致智能指针后续合法释放时崩溃,说明样本已被正确释放
  • 是否需要手动查询样本缓冲区并释放?或是释放其包含的图面?调用RemoveAllBuffers强制移除样本缓冲区无效果
  • 注意到解码器返回CPooledSample类型样本,视频处理器返回CMFTrackedSample类型,是否解码器未收到样本已释放的通知?是否需要手动处理该通知逻辑?

编辑:相关核心代码片段已整理(原外部链接已移除)

内容的提问来源于stack exchange,提问作者James

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.02 07:02:53