Directshow Live Source Filter Design

时间:2012-08-16 11:49:07

标签: directshow directshow.net

我正在开发一个Live DirectShow过滤器。

我有一个H264流源,我可以通过SDK API获取流。

在我的过滤器中,我有一个队列,我从一个线程中排队(推送)传入的流。 然后我在过滤器FillBuffer ...

中消耗(Dequeue,pop)这些流

所以我创建一个线程安全的队列...但这会导致一些问题......

在FillBuffer中,如果我检查是否有任何传入的数据包,如果存在,则进行处理 逻辑是这样的:

    ...
    bool hasElement = SynchronizedQueue.pop(element);

    if(!hasElement)
    {
        return S_OK
    }
    ...

...这消耗了很多CPU ......

如何使用boost lib来实现具有条件变量的锁

...
SynchronizedQueue.waitAndPop(element) ;// which wait until we have some

哪个有情人CPU ......但有时当队列中没有数据时,此块FillBuffer函数和过滤器可能无法停止..

那么任何设计理念都可以替代实时源滤波器,它从远程机器获取输入流并将其传递给解码器?     或者我怎样才能让我的设计更好......降低CPU并且可以停止?

1 个答案:

答案 0 :(得分:0)

源过滤器拥有一个推送线程,因此您需要使用同步对象(event,mutex)在那里等待,直到有一个新帧可用于推出输出引脚。

每当您从SDK收到一个帧并将其放入队列时,您将使用同步对象指示此可用性,例如你会set an event。工作线程将看到该事件并开始处理该帧。

工作线程需要能够响应两个事件,至少:新帧和过滤器/图形停止。所以你需要WaitForMultipleObjects等待多个evetns并在第一次发生时醒来。