我可以使用异步转换编写DirectShow转换过滤器吗?

时间:2011-10-20 11:47:05

标签: directx directshow video-encoding

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

我认为这将是一个问题,因为第三方库在完整帧准备就绪时使用异步回调,即

// 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)以向前传递样本。我可以从回调中的工作线程调用此接收函数,还是必须将所有内容保存在同一个线程中?

由于

1 个答案:

答案 0 :(得分:1)

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

所以基本上你的直截了当的选择是:

  • CTransformFilter退一步并使用其祖先继承来实现[工作线程]回调调用的输出媒体样本传递
  • Transform函数内等待异步完成(如果内部库仍为1个输入帧解码1个输出帧,则有意义)并赶上然后传递输出;你还必须等待那里的暂停请求并中止你的等待以便不阻止执行