Microsoft DirectX 8.0 |
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 をオーバーライドして、ストリーミングまたはフラッシングの開始時に品質 コントロール情報をリセットする。
品質 コントロール通知を受け取り、メディア ストリームの品質を変更する機会を提供する。
構文
virtual HRESULT AlterQuality( Quality q );
パラメータ
- q
- 品質 コントロール通知メッセージ。
戻り値
デフォルトでは E_FAIL を返す。
注意
このメンバ関数は、CTransformFilter::AlterQuality メンバ関数をオーバーライドする。このメンバ関数は、品質 コントロール メッセージをアップストリームに渡すために CBaseInputPin::PassNotify メンバ関数を呼び出す前に、CTransformOutputPin::Notify メンバ関数から呼び出される。この関数は、CVideoTransformFilter::m_itrLate データ メンバを Quality 構造体の Late メンバの値に設定して、フィルタがフレームをスキップするかどうかを判定できるようにする。この関数は E_FAIL を返すので、レンダラのダウンストリームは品質 コントロールを続行する。
CVideoTransformFilter オブジェクトを作成する。
構文
CVideoTransformFilter( TCHAR *pName, LPUNKNOWN pUnk, REFCLSID clsid );
パラメータ
- pName
- CVideoTransformFilter オブジェクトの名前へのポインタ。
- pUnk
- 制御する IUnknown インターフェイスへのポインタ。
- clsid
- CVideoTransformFilter クラスのクラス識別子。
戻り値
戻り値なし。
フィルタがフラッシング状態を終了した旨の通知を受け取り、それをダウンストリームに渡す。
構文
HRESULT EndFlush(void);
戻り値
フィルタで入力ピンが検出されなかった場合は、VFW_E_NOT_CONNECTED を返す。それ以外の場合は、IPin::EndFlush メソッドが返す値を返す。
注意
このメンバ関数は、CTransformFilter::EndFlush メンバ関数をオーバーライドして品質管理情報をリセットする。
メディア サンプルを受け取り、サンプルをスキップするか、またはメディア サンプルを変換して配送する。
構文
HRESULT Receive( IMediaSample *pSample );
パラメータ
- pSample
- 配送するサンプルへのポインタ。
戻り値
HRESULT 値を返す。
注意
このメンバ関数は、CTransformFilter::Receive メンバ関数をオーバーライドする。プロセスをさらに詳細に制御したい場合にのみオーバーライドする。
パフォーマンス計測識別子を登録する。
構文
virtual void RegisterPerfId(void);
戻り値
戻り値なし。
注意
デフォルトでは、このメンバ関数は以下のパフォーマンス識別子を登録する。
パフォーマンス識別子 登録される文字列 m_idSkip ビデオ変換スキップ フレーム。 m_idFrameType ビデオ変換フレーム タイプ。 m_idLate ビデオ変換の遅延。 m_idTimeTillKey 次のキーまでのビデオ変換の予想タイム。 派生クラスでパフォーマンス計測識別子を登録したいなら、このメンバをオーバーライドすること。その場合、同じように登録することに注意すること。
フィルタがフレームのスキップを開始、続行、または停止すべきかどうかを判定する。
構文
BOOL ShouldSkipFrame( IMediaSample *pIn );
パラメータ
- pIn
- 変換またはスキップする、受け取ったサンプルへのポインタ。
戻り値
フィルタがこのサンプルをスキップすべき場合は TRUE を返し、それ以外の場合は FALSE を返す。
注意
このメンバ関数は、サンプルがキー フレーム (sync ポイント) の場合に m_bSkipping メンバ変数を FALSE に設定し、FALSE を返す。これにより、既に開始されているスキップ処理が停止される。このメンバ関数は、以下の条件がすべて満たされる場合にのみ、サンプルのスキップを開始する (m_bSkipping を TRUE に設定し、TRUE を返す)。
- デコードの平均タイムがフレーム タイムの 1/4 を超えている。
- フィルタが少なくとも 1 フレーム遅れて実行されている。
- 次のキー フレームがわずか 1 フレーム先にあると予想される。
- キー フレームが十分な頻度で現れる。
このメンバ関数は、サンプルのスキップが開始されると EC_QUALITY_CHANGE 通知を送信する。スキップが開始されると、次のキー フレームが来るまでのすべてのサンプルがスキップされる。
CTransformFilter::StartStreaming をオーバーライドして、ストリーミングまたはフラッシングの開始時に品質 コントロール情報をリセットする。
構文
virtual HRESULT StartStreaming(void);
戻り値
NOERROR を返す。
注意
このメンバ関数は、いくつかの品質 コントロール メンバ変数 (m_itrLate、m_nKeyFramePeriod、m_nFramesSinceKeyFrame、m_bSkipping、m_tDecodeStart) を 0 に設定する。このメンバ関数は、m_itrAvgDecode を 3000 に設定し、m_bQualityChanged および m_bSampleSkipped を FALSE に設定する。