Microsoft DirectX 8.0 |
ここで説明する内容は次のとおりである。
品質メッセージは Quality 構造体を使用して定義する。この構造体には次のメンバが含まれる。
たとえば、240 ミリ秒 (ms) のタイム スタンプを持つサンプルが、280 ms のストリーム タイムにレンダラに到着したとする。レンダラはタイプが Famine の品質メッセージを作成する。サンプルは 40 ms 遅れて到着したので、Late メンバは 400000 となる (すべての基準タイムは 100 ナノ秒単位)。TimeStamp メンバは 2400000 である。
Proportion メンバについては、レンダラは移動平均を使って値を計算する。サンプルは時間どおりに到着しており、このサンプルは変則である。その場合、レンダラはわずかな修正しか要求しない。一方、サンプルが一貫して遅れている場合は、レンダラは大幅な修正を要求することになる。
品質コントロールは IQualityControl インターフェイスを通じて処理される。このインターフェイスには 2 つのメソッドがある。
IQualityControl を実装するオブジェクトは、Notify メソッドを通じて品質メッセージを受け取り、メッセージを処理するか、別のオブジェクトにメッセージを渡す。アプリケーションでオブジェクトの SetSink メソッドを呼び出す場合、オブジェクトは指定された品質マネージャに品質コントロールを委任する必要がある。
フィルタ基底クラスは、ビデオ品質コントロールに関するいくつかのデフォルト動作を実装する。
品質メッセージはレンダラで開始される。ビデオ レンダラの基底クラスは CBaseVideoRenderer であり、次のように動作する。
次に行われる処理は、アップストリーム フィルタによって異なる。通常は変換フィルタになる。変換フィルタの基底クラスは CTransformFilter で、CTransformInputPin および CTransformOutputPin クラスを使用して入力ピンと出力ピンを実装する。これらのクラスは、一緒に次のように動作する。
変換フィルタが品質メッセージを処理すると想定した場合、メッセージは最終的にソース フィルタの出力ピンに到着する。基底クラスでは、CBasePin::Notify が E_NOTIMPL を返す。特定のソース フィルタが品質メッセージを処理する方法は、ソースの種類によって異なる。ライブ ビデオ キャプチャなど、有効な品質コントロールを実行できないソースもある。サンプルを送信するレートを調整できるソースもある。
次の図は、デフォルトの動作を示している。
ベース ビデオ レンダラは IQualityControl::Notify を実装する。これは、レンダラ自身に品質メッセージを渡せることを意味する。Proportion メンバを 1000 未満の値に設定すると、ビデオ レンダラはレンダリングする各フレームの間に待機期間を挿入し、その結果レンダラの速度が遅くなる (これは、たとえばシステム リソースの使用率を減らすために実行する)。詳細については、CBaseVideoRenderer::ThrottleWait を参照すること。Proportion メンバに 1000 より大きい値を設定しても無効になる。