Microsoft DirectX 8.0

品質コントロールの管理

品質コントロールは、フィルタ グラフ内のデータ フローのレートを実行時のパフォーマンスに応じて調整するためのメカニズムである。レンダリング フィルタは、受け取るデータの量が多すぎる場合または少なすぎる場合、品質メッセージを送信できる。品質メッセージはデータ レートの調整を要求する。デフォルトでは、品質メッセージは、レンダラから応答可能なフィルタ (存在する場合) までアップストリーム方向に移動する。アプリケーションでは、カスタム品質マネージャを実装することもできる。その場合、レンダラは品質メッセージをアプリケーションの品質マネージャに直接渡す。

ここで説明する内容は次のとおりである。

品質メッセージ

品質メッセージは Quality 構造体を使用して定義する。この構造体には次のメンバが含まれる。

たとえば、240 ミリ秒 (ms) のタイム スタンプを持つサンプルが、280 ms のストリーム タイムにレンダラに到着したとする。レンダラはタイプが Famine の品質メッセージを作成する。サンプルは 40 ms 遅れて到着したので、Late メンバは 400000 となる (すべての基準タイムは 100 ナノ秒単位)。TimeStamp メンバは 2400000 である。

Proportion メンバについては、レンダラは移動平均を使って値を計算する。サンプルは時間どおりに到着しており、このサンプルは変則である。その場合、レンダラはわずかな修正しか要求しない。一方、サンプルが一貫して遅れている場合は、レンダラは大幅な修正を要求することになる。

品質コントロールは IQualityControl インターフェイスを通じて処理される。このインターフェイスには 2 つのメソッドがある。

IQualityControl を実装するオブジェクトは、Notify メソッドを通じて品質メッセージを受け取り、メッセージを処理するか、別のオブジェクトにメッセージを渡す。アプリケーションでオブジェクトの SetSink メソッドを呼び出す場合、オブジェクトは指定された品質マネージャに品質コントロールを委任する必要がある。

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

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

品質メッセージはレンダラで開始される。ビデオ レンダラの基底クラスは 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 より大きい値を設定しても無効になる。