我的任务是在直接显示变换过滤器中包装第三方视频解码器库。
我认为这将是一个问题,因为第三方库在完整帧准备就绪时使用异步回调,即
// 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)以向前传递样本。我可以从回调中的工作线程调用此接收函数,还是必须将所有内容保存在同一个线程中?
由于
答案 0 :(得分:1)
你仍然可以实现你想要的。请注意,不需要过滤器在同一线程上和/或在接收输入媒体样本的调用内输出媒体样本。然而,CTransformFilter
考虑到了这个假设。
所以基本上你的直截了当的选择是:
CTransformFilter
退一步并使用其祖先继承来实现[工作线程]回调调用的输出媒体样本传递Transform
函数内等待异步完成(如果内部库仍为1个输入帧解码1个输出帧,则有意义)并赶上然后传递输出;你还必须等待那里的暂停请求并中止你的等待以便不阻止执行