2012-08-16 29 views
0

我正在開發一個Live DirectShow過濾器。Directshow Live Source Filter Design

我有一個H264流源,我可以通過SDK API獲取流。

在我的過濾器中,我有一個Queue,它使我從一個線程Enqueue(推送)傳入的流。 然後我消耗(出列,流行)的過濾器FillBuffer內這些流...

所以我讓一個線程安全的隊列......但是,這會導致一些問題....

在FillBuffer如果我檢查是否有任何進入的數據包,並且如果存在,過程 邏輯是這樣的:

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

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

...這消耗得多CPU ...用升壓LIB噸

Howewer Ø實現與條件變量

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

其中有一個情人CPU ......但有時當在隊列中沒有數據,此塊FillBuffer功能和過濾可能不會停止...鎖。

因此,任何設計思想的替代品的活源過濾器,從遠程機器獲取輸入流並傳遞給解碼器? 或者我怎樣才能使我的設計更好....降低CPU,可以停止?

回答

0

源過濾器擁有一個推送線程,因此您需要使用同步對象(event,mutex)等待,直到有新框架可用於推送輸出引腳爲止。

每當您從SDK接收到一個幀並將其放到隊列中時,就會使用同步對象(例如,你會set an event。工作線程將看到事件並開始處理幀。

工作線程需要能夠響應兩個事件,至少:新框架和過濾器/圖形停止。所以你將需要WaitForMultipleObjects等待多個evetns並在第一次發生時醒來。

+0

如何檢測過濾器是否停止?在過濾器裏面...... – Novalis 2012-08-16 12:25:40

+0

嗯,它是對你的對象調用的'IBaseFilter :: Stop',除了你和基類已經在做什麼之外,你一定可以處理它。 – 2012-08-16 12:37:19