次の方法で共有


デフォルトの品質メッセージ

DirectShow 基底クラスは、ビデオ品質コントロールに関するいくつかのデフォルト動作を実装する。

品質メッセージはレンダラで開始される。ビデオ レンダラの基底クラスは CBaseVideoRenderer であり、次のように動作する。

  1. ビデオ レンダラは、サンプルを受け取ると、サンプルのタイム スタンプを現在の基準タイムと比較する。
  2. ビデオ レンダラは品質メッセージを生成する。基底クラスでは、品質メッセージのメンバ Proportion は 500 (50%) から 2000 (200%) までの範囲に制限されている。値がこの範囲外である場合は、品質が急激に変化することがある。
  3. デフォルトでは、ビデオ レンダラは品質メッセージをアップストリームの出力ピン (レンダラの入力ピンに接続されているピン) に送信する。アプリケーションでは、SetSink メソッドを呼び出すことによって、この動作をオーバーライドできる。

次に行われる処理は、アップストリーム フィルタによって異なる。通常は変換フィルタになる。変換フィルタの基底クラスは CTransformFilter で、CTransformInputPin および CTransformOutputPin クラスを使って入力ピンと出力ピンを実装する。これらのクラスは、一緒に次のように動作する。

  1. CTransformOutputPin::Notify メソッドは、フィルタ基底クラスに対するプライベート メソッドである CTransformFilter::AlterQuality を呼び出す。
  2. 派生フィルタは AlterQuality をオーバーライドして品質メッセージを処理できる。デフォルトでは、AlterQuality は品質メッセージを無視する。
  3. AlterQuality が品質メッセージを処理しない場合、出力ピンはフィルタの入力ピンに対するプライベート メソッドである CBaseInputPin::PassNotify を呼び出す。
  4. PassNotify は、適切な場所、つまり次のアップストリーム出力ピンかカスタム品質マネージャに品質メッセージを渡す。

変換フィルタが品質メッセージを処理すると想定した場合、メッセージは最終的にソース フィルタの出力ピンに到着する。基底クラスでは、CBasePin::Notify が E_NOTIMPL を返す。特定のソース フィルタが品質メッセージを処理する方法は、ソースの種類によって異なる。ライブ ビデオ キャプチャなど、有効な品質コントロールを実行できないソースもある。サンプルを送信するレートを調整できるソースもある。

次の図は、デフォルトの動作を示している。

基底クラス内での品質コントロール

ベース ビデオ レンダラは IQualityControl::Notify を実装する。これは、レンダラ自身に品質メッセージを渡せることを意味する。Proportion メンバを 1000 未満の値に設定すると、ビデオ レンダラはレンダリングする各フレームの間に待機期間を挿入し、その結果レンダラの速度が遅くなる。(これは、たとえばシステム リソースの使用率を減らすために実行する。)詳細については、CBaseVideoRenderer::ThrottleWait を参照すること。Proportion メンバに 1000 より大きい値を設定しても無効になる。