0

私はLiveDirectShowフィルターを開発しています。

SDKAPIを介してストリームを取得できるH264ストリームソースがあります。

私のフィルターには、スレッドからの着信ストリームをエンキュー(プッシュ)するキューがあります。次に、これらのストリームをフィルターFillBuffer内で消費(Dequeue、pop)します。

だから私はスレッドセーフなキューを作ります...しかしこれはいくつかの問題を引き起こします...

FillBufferで、着信パケットがあるかどうかを確認し、ある場合、プロセスロジックは次のようになります。

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

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

...これは多くのCPUを消費します...

しかし、ブーストライブラリを使用して条件変数でロックを実装する

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

恋人のCPUを持っている...しかし、キューにデータがないときは、このブロックのFillBuffer関数とフィルターが停止しないことがあります

では、リモートマシンから入力ストリームを取得してデコーダーに渡すライブソースフィルターの代替設計案はありますか?または、どうすればデザインを改善できますか?CPUを下げて、停止することができますか?

4

1 に答える 1

0

ソースフィルターはプッシュスレッドを所有しているため、同期オブジェクト(event、mutex)を使用してそこで待機し、出力ピンをプッシュするための新しいフレームが使用可能になるまで制御を生成する必要があります。

SDKからフレームを受け取り、それをキューに入れるときはいつでも、同期オブジェクトを使用してこの可用性を示します。たとえば、イベントを設定します。ワーカースレッドwlilはイベントを確認し、フレームの処理を開始します。

ワーカースレッドは、少なくとも2つのイベントに応答できる必要があります。新しいフレームとフィルター/グラフの停止です。したがってWaitForMultipleObjects、複数のエベトンを待ち、最初に発生したときに目を覚ます必要があります。

于 2012-08-16T12:10:00.813 に答える