【问题标题】:Can I write a DirectShow transform filter using an asynchronous transformation?我可以使用异步转换编写 DirectShow 转换过滤器吗?
【发布时间】:2011-10-20 11:47:04
【问题描述】:

我的任务是将第 3 方视频解码器库包装在直接显示变换过滤器中。

我相信这将是一个问题,因为 3rd 方库在完整帧准备好时使用异步回调,即

// on main thread
lib->RegisterCallback(callback function)
lib->write(raw data bytes)

void callback(frame)
{
  // here is your frame (on a worker thread)
}

当我查看纯虚拟 CTransformFilter.Transform 函数时,它期望转换是同步的。现在我可以设置它,让它阻塞回调中设置的事件,但是如果进入 Transform 函数的数据不足以生成一个完整的新帧,会发生什么?我会死锁函数。

我唯一的选择是返回库开发人员并要求提供同步解码器吗?

我刚刚研究了 CTransformFilter Receive 函数。这就是所谓的(被覆盖的)Transform 函数。然后它调用 m_pOutput->m_pInputPin->Receive(pOutSample) 继续传递样本。我可以从回调中的工作线程调用这个 Receive 函数还是必须将所有内容都保留在同一个线程上?

谢谢

【问题讨论】:

    标签: directx directshow video-encoding


    【解决方案1】:

    你仍然可以实现你想要的。请注意,过滤器不需要在同一线程上和/或在它接收输入媒体样本的调用中输出媒体样本。然而,CTransformFilter 是在考虑到这一假设的情况下做出的。

    所以基本上你的直接选择是:

    • CTransformFilter 退后一步,并使用其祖先继承自 [a worker thread's] 回调调用实现输出媒体样本交付
    • Transform 函数内等待异步完成(如果内部库仍然为 1 个输入帧解码 1 个输出帧,则有意义)并赶上然后传递输出;您还必须在那里等待暂停请求并中止等待,以免阻塞执行

    【讨论】:

    • 谢谢,这是个好消息。我认为第二个选择(以及我最初的问题)不起作用的原因是我不确定输入样本是否包含足够的数据来生成新帧(或者可能包含足够的数据用于多个帧)。变换滤波器的输入有没有规定每个样本必须对应下一帧?
    猜你喜欢
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    • 2018-02-13
    • 2013-06-30
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多