Microsoft DirectX 8.0

CVideoTransformFilter クラス

CVideoTransformFilter クラスの階層

CVideoTransformFilter クラスは、基本的には AVI デコンプレッサ フィルタの基底クラスとして設計されている。このクラスは、"コピー" 変換クラスに基づいており、出力バッファとしてビデオ バッファまたは Microsoft® DirectDraw® バッファを想定している。このクラスは、ほかのタイプの変換フィルタの基底クラスとしても使用できる。このクラスの主な機能は、変換フィルタでの品質 コントロールを可能にすることにある。つまり、このクラスは、処理中のメディア ストリームに関するほかの要素やフィルタの動作を考慮しながら、レンダラから受け取った品質通知に基づいてフレームをドロップすることを決定する。

CVideoTransformFilter::Receive メンバ関数が呼び出されるごとに、この関数は CVideoTransformFilter::ShouldSkipFrame を呼び出して、フレームのスキップを開始、続行、または停止するかどうかを決める。このメンバ関数は、以下の条件がすべて満たされる場合にのみ、サンプルのスキップを開始する。

フレームのスキップを開始すると、このクラスはキー フレームが現れるまでフレームをスキップする。このとき、m_bSkipping フラグをリセットしてサンプルを処理する。

キー フレームは、AVI キー フレームまたは MPEG I フレームとして定義される。これらはデコードするヒストリを必要とせず、これらがスキップされた場合は、次のキー フレームまでほかのフレームをデコードすることができなくなる。非キー フレームには、AVI 非キー フレーム、MPEG P フレーム、および MPEG B フレームがある。MPEG B フレームは、ほかの非キー フレームと同じようにこのクラスで扱われる。(MPEG B フレームは、フレームをスキップする必要なく、ドロップすることができる。ただし、このクラスは主に AVI デコンプレッサを対象としているので、そのような操作は許されない。いずれかのフレームがスキップされると、次のキー フレームまでのすべてのフレームがスキップされる。)

Protected データ メンバ

m_bNoSkip 次のキー フレームまでのスキップを行わない場合は、TRUE に設定する (フィルタをデバッグする場合)。
m_bQualityChanged ストリームが低下しているかどうかを示す状態フラグ。派生クラスの Transform メンバ関数呼び出しが失敗した場合は CVideoTransformFilter::Receive 内で TRUE に設定される。(S_FALSE はエンドオブストリームに到達したことを示すので、この場合、Receive は NOERROR を返す。)
m_bSkipping フィルタが次のキー フレームまでスキップしている場合は TRUE に設定される.
m_idFrameType パフォーマンス測定フレーム タイプ識別子。
m_idLate 遅延を測定するためのパフォーマンス識別子 (PERF が定義されている場合に利用可能)。
m_idSkip フレームのスキップを測定するためのパフォーマンス識別子。
m_idTimeTillKey 次のキー フレームが来るまでの予想時間 (ミリ秒単位) を表すパフォーマンス識別子。
m_itrAvgDecode サンプルのデコード (変換) に要する平均タイム。この値がフレーム タイムの 1/4 よりも小さい場合は、このフィルタでは品質に関する問題が発生しておらず、フレームのドロップも発生していないと想定される。
m_itrLate 現在のフレームが遅れているタイム。本来この値は、レンダリング フィルタから渡された品質 コントロール メッセージ内の Quality 構造体の Late メンバの値に設定される。この値は、スキップされた各フレームのフレーム タイムから求められる。
m_nFramesSinceKeyFrame 前回のキー フレーム以降のフレーム数をカウントするために使用する。
m_nKeyFramePeriod キー フレーム間の間隔の最大値。
m_nWaitForKey 最初のキー フレームを取得する前に、フォーマット変更後の出力を保証するために使用する。ゼロ以外の値の場合、フレームはレンダラに渡されない。フォーマットが変更されてそれぞれの非キー フレームでデクリメントされる場合は、30 に設定される。
m_tDecodeStart デコーディングの開始時以降のタイム。

メンバ関数

AlterQuality 出力ピンから品質 コントロール通知を受け取り、メディア ストリームの品質を変更する機会を提供する。
CVideoTransformFilter CVideoTransformFilter オブジェクトを作成する。
ShouldSkipFrame フィルタがフレームのスキップを開始、続行、または停止すべきかどうかを判定する。

オーバーライド可能なメンバ関数

EndFlush フラッシング状態を終了した旨の通知を受け取り、それをダウンストリームに渡す。
Receive メディア サンプルを受け取り、サンプルをスキップするか、またはメディア サンプルを変換して配送する。
RegisterPerfId パフォーマンス計測識別子を登録する。
StartStreaming CTransformFilter::StartStreaming をオーバーライドして、ストリーミングまたはフラッシングの開始時に品質 コントロール情報をリセットする。

CVideoTransformFilter::AlterQuality

CVideoTransformFilter クラス

品質 コントロール通知を受け取り、メディア ストリームの品質を変更する機会を提供する。

構文

virtual HRESULT AlterQuality(
    Quality q
);

パラメータ

q
品質 コントロール通知メッセージ。

戻り値

デフォルトでは E_FAIL を返す。

注意

このメンバ関数は、CTransformFilter::AlterQuality メンバ関数をオーバーライドする。このメンバ関数は、品質 コントロール メッセージをアップストリームに渡すために CBaseInputPin::PassNotify メンバ関数を呼び出す前に、CTransformOutputPin::Notify メンバ関数から呼び出される。この関数は、CVideoTransformFilter::m_itrLate データ メンバを Quality 構造体の Late メンバの値に設定して、フィルタがフレームをスキップするかどうかを判定できるようにする。この関数は E_FAIL を返すので、レンダラのダウンストリームは品質 コントロールを続行する。

CVideoTransformFilter::CVideoTransformFilter

CVideoTransformFilter クラス

CVideoTransformFilter オブジェクトを作成する。

構文

CVideoTransformFilter(
    TCHAR *pName,
    LPUNKNOWN pUnk,
    REFCLSID clsid
);

パラメータ

pName
CVideoTransformFilter オブジェクトの名前へのポインタ。
pUnk
制御する IUnknown インターフェイスへのポインタ。
clsid
CVideoTransformFilter クラスのクラス識別子。

戻り値

戻り値なし。

CVideoTransformFilter::EndFlush

CVideoTransformFilter クラス

フィルタがフラッシング状態を終了した旨の通知を受け取り、それをダウンストリームに渡す。

構文

HRESULT EndFlush(void);

戻り値

フィルタで入力ピンが検出されなかった場合は、VFW_E_NOT_CONNECTED を返す。それ以外の場合は、IPin::EndFlush メソッドが返す値を返す。

注意

このメンバ関数は、CTransformFilter::EndFlush メンバ関数をオーバーライドして品質管理情報をリセットする。

CVideoTransformFilter::Receive

CVideoTransformFilter クラス

メディア サンプルを受け取り、サンプルをスキップするか、またはメディア サンプルを変換して配送する。

構文

HRESULT Receive(
    IMediaSample *pSample
);

パラメータ

pSample
配送するサンプルへのポインタ。

戻り値

HRESULT 値を返す。

注意

このメンバ関数は、CTransformFilter::Receive メンバ関数をオーバーライドする。プロセスをさらに詳細に制御したい場合にのみオーバーライドする。

CVideoTransformFilter::RegisterPerfId

CVideoTransformFilter クラス

パフォーマンス計測識別子を登録する。

構文

virtual void RegisterPerfId(void);

戻り値

戻り値なし。

注意

デフォルトでは、このメンバ関数は以下のパフォーマンス識別子を登録する。
パフォーマンス識別子登録される文字列
m_idSkip ビデオ変換スキップ フレーム。
m_idFrameType ビデオ変換フレーム タイプ。
m_idLate ビデオ変換の遅延。
m_idTimeTillKey 次のキーまでのビデオ変換の予想タイム。

派生クラスでパフォーマンス計測識別子を登録したいなら、このメンバをオーバーライドすること。その場合、同じように登録することに注意すること。

CVideoTransformFilter::ShouldSkipFrame

CVideoTransformFilter クラス

フィルタがフレームのスキップを開始、続行、または停止すべきかどうかを判定する。

構文

BOOL ShouldSkipFrame(
    IMediaSample *pIn
);

パラメータ

pIn
変換またはスキップする、受け取ったサンプルへのポインタ。

戻り値

フィルタがこのサンプルをスキップすべき場合は TRUE を返し、それ以外の場合は FALSE を返す。

注意

このメンバ関数は、サンプルがキー フレーム (sync ポイント) の場合に m_bSkipping メンバ変数を FALSE に設定し、FALSE を返す。これにより、既に開始されているスキップ処理が停止される。このメンバ関数は、以下の条件がすべて満たされる場合にのみ、サンプルのスキップを開始する (m_bSkipping を TRUE に設定し、TRUE を返す)。

このメンバ関数は、サンプルのスキップが開始されると EC_QUALITY_CHANGE 通知を送信する。スキップが開始されると、次のキー フレームが来るまでのすべてのサンプルがスキップされる。

CVideoTransformFilter::StartStreaming

CVideoTransformFilter クラス

CTransformFilter::StartStreaming をオーバーライドして、ストリーミングまたはフラッシングの開始時に品質 コントロール情報をリセットする。

構文

virtual HRESULT StartStreaming(void);

戻り値

NOERROR を返す。

注意

このメンバ関数は、いくつかの品質 コントロール メンバ変数 (m_itrLatem_nKeyFramePeriodm_nFramesSinceKeyFramem_bSkippingm_tDecodeStart) を 0 に設定する。このメンバ関数は、m_itrAvgDecode を 3000 に設定し、m_bQualityChanged および m_bSampleSkipped を FALSE に設定する。