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
相关产品推荐
相关产品推荐

