2011-10-20 10 views
0

私はサードパーティのビデオデコーダライブラリを直接ショートランスフォームフィルタでラップする作業をしています。非同期変換を使用してDirectShowトランスフォームフィルタを記述できますか?

私は、フルフレーム、すなわち

// 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受信機能を見てきました。これは、(オーバーライドされた)Transform関数を呼び出すものです。次に、m_pOutput-> m_pInputPin-> Receive(pOutSample)を呼び出してサンプルを渡します。コールバックのワーカースレッドからこのReceive関数を呼び出すことができますか、同じスレッド上にすべてを保持する必要がありますか?

ありがとうございました

答えて

1

あなたが望むものを達成できます。フィルタは、同じスレッド上および/または入力メディアサンプルを受信する呼び出し内にメディアサンプルを出力する必要はないことに注意してください。しかし、この仮定を念頭に置いてCTransformFilterが作成されます。バックCTransformFilterから

  • ステップとためTransform関数内で[ワーカースレッドの]コールバックコール
  • 待機から出力メディアサンプルの配信を実装するために継承するために、その祖先を使用します。

    だから基本的に、あなたの簡単な選択肢があります非同期補完(内部ライブラリがまだ1入力フレームに対して1出力フレームをデコードしている場合は意味をなさない)、出力をキャッチアップして出力する。あなたもそこに一時停止要求を待ち、実行に

+0

感謝をブロックしないようにするために、あなたの待ち時間を中止する必要があります、それは良いニュースです。 2番目の選択肢(と私の元の質問)がうまくいかない理由は、入力サンプルに新しいフレームを生成するのに十分なデータが含まれているかどうか、あるいはおそらく複数のフレームのデータが十分にあるかどうかわかりません。 変換フィルタの入力には、各サンプルが次のフレームに対応していなければならないという規定はありますか? –

関連する問題