Microsoft DirectX 8.0 |
自分自身ではシークを行わない入力ピンを持つフィルタのシーク コマンドを扱う。
宣言: Ctlutil.h
このヘルパー クラスはシーク コマンドをアップストリームに送るフィルタで IMediaPosition と IMediaSeeking インターフェイスを実装する。フィルタ グラフ マネージャがシーク コマンドをアプリケーションから受け取ったとき、そのコマンドをグラフのレンダリング フィルタに送る。そのコマンドは次に、(もしあれば)それを実行できるフィルタに到達するまで、各フィルタの出力ピンを通してアップストリームに送られる。通常、シークはソース フィルタかパーサー フィルタで実装される。
CPosPassThru クラスはフィルタの入力ピンへのポインタを保持する。以下のダイアグラムにあるように、それはシーク コマンドを接続されているアップストリーム フィルタの出力ピンに送る。
変換フィルタで CPosPassThru を使い、レンダリング フィルタで CRendererPosPassThru クラスを派生すること。
このクラスをフィルタで使うには、クラスのインターフェイスを作成し、CPosPassThru コンストラクタ メソッドのフィルタの入力ピンを指定すること。次にすべての IMediaPosition と IMediaSeeking 呼び出しを CPosPassThru オブジェクトに委任すること。
シーク コマンドを委任する最もシンプルな方法は CPosPassThru オブジェクトの IMediaPosition と IMediaSeeking インターフェイスを公開することだ。フィルタかピンがこれらのインターフェイスの 1 つを問い合わせたとき、そのインターフェイスの CPosPassThru 実装へのポインタが返る。次のコードはこの方法を示す。それは CTransformOutputPin クラスから適応されている。CreatePosPassThru 関数は CPosPassThru オブジェクトを作成するヘルパー関数である。
// 次のメンバ変数が仮定されている : // CPosPassThru *m_pPos; // IPin *m_pPin; if (riid == IID_IMediaPosition || riid == IID_IMediaSeeking) { if (m_pPos == NULL) { HRESULT hr; hr = CreatePosPassThru(GetOwner(), FALSE, m_pPin, &m_pPos); if (FAILED(hr)) return hr; } return m_pPosition->QueryInterface(riid, ppv); } else { // このピンの他のインターフェイスへのポインタを返す。 }
ここで説明している以外に、このクラスのすべての IMediaPosition と IMediaSeeking メソッドは接続しているピンの対応するメソッドを呼び出し、その結果を返す。
Public メソッド | |
---|---|
CPosPassThru | コンストラクタ メソッド。 |
ForceRefresh | 使われていない。 |
GetMediaTime | 現在のサンプルのタイム スタンプを取得する。仮想。 |
IMediaPosition メソッド | |
get_Duration | ストリームの時間幅を取得する。 |
put_CurrentPosition | 現在の位置を設定する、ストリームの全時間幅からの相対値。 |
get_StopTime | 再生の終了タイムを取得する、ストリームの全時間幅からの相対値。 |
put_StopTime | 再生の終了タイムを設定する、ストリームの全時間幅からの相対値。 |
get_PrerollTime | 開始位置の前にキューに入るデータ量 (プリロール タイム) を取得する。 |
put_PrerollTime | 開始位置の前にキューに入るデータ量 (プリロール タイム) を設定する。 |
get_Rate | 再生レートを取得する。 |
put_Rate | 再生レートを設定する。 |
get_CurrentPosition | 現在位置を取得する、ストリームの全時間幅からの相対値。 |
CanSeekForward | ストリームが順方向にシークできるかどうかを確認する。 |
CanSeekBackward | ストリームが逆方向にシークできるかどうかを確認する。 |
IMediaSeeking メソッド | |
CheckCapabilities | ストリームに指定されたシーク能力を持つかどうかを問い合わせる。 |
ConvertTimeFormat | あるタイムフォーマットから別のフォーマットへ変換する。 |
GetAvailable | シークが効率的な時間幅を取得する。 |
GetCapabilities | ストリームのすべてのシーク能力を取得する。 |
GetCurrentPosition | 現在位置を取得する、ストリームの全時間幅からの相対値。 |
GetDuration | ストリームの時間幅を取得する。 |
GetPositions | 現在位置と停止位置を取得する、ストリームの全時間幅からの相対値。 |
GetPreroll | 開始位置の前にキューに入るデータ量 (プリロール タイム) を取得する。 |
GetRate | 再生レートを取得する。 |
GetStopPosition | 再生の終了タイムを取得する、ストリームの全時間幅からの相対値。 |
GetTimeFormat | 現在のタイム フォーマットを取得する。 |
IsFormatSupported | 指定したタイム フォーマットがサポートされているかどうかを確認する。 |
IsUsingTimeFormat | 指定したタイム フォーマットが現在使われているフォーマットかどうかを確認する。 |
QueryPreferredFormat | ストリームで許容されるタイム フォーマットを取得する。 |
SetPositions | 現在位置と停止位置を設定する。 |
SetRate | 再生レートを設定する。 |
SetTimeFormat | タイム フォーマットを設定する。 |
ヘルパー関数 | |
CreatePosPassThru | CPosPassThru オブジェクトまたは CRendererPosPassThru オブジェクトを作成する。 |
ストリームが逆方向にシークできるかどうかを確認する。IMediaPosition::CanSeekBackward メソッドの実装。
構文
HRESULT CanSeekBackward( LONG *pCanSeekBackward );
パラメータ
- pCanSeekBackward
- フィルタが逆方向にシーク可能なら OATRUE 値を受け取る変数のポインタを返す、そうでなければ OAFALSE を返す。
戻り値
接続されているピンから HRESULT 値を返す。
ストリームが順方向にシークできるかどうかを確認する。IMediaPosition::CanSeekForward メソッドの実装。
構文
HRESULT CanSeekForward( LONG *pCanSeekForward );
パラメータ
- pCanSeekForward
- フィルタが順方向にシーク可能なら OATRUE 値を受け取る変数のポインタを返す、そうでなければ OAFALSE を返す。
戻り値
接続されているピンから HRESULT 値を返す。
ストリームに指定されたシーク能力を持つかどうかを問い合わせる。IMediaSeeking::CheckCapabilities メソッドの実装。
構文
HRESULT CheckCapabilities( DWORD *pCapabilities );
パラメータ
- pCapabilities
- AM_SEEKING_SEEKING_CAPABILITIES 属性の 1 つあるいは複数のビット合成へのポインタ。メソッドが返る時、この値はそれらの属性が有効であることを示す。
戻り値
接続されているピンから HRESULT 値を返す。
あるタイムフォーマットから別のフォーマットへ変換する。IMediaSeeking::ConvertTimeFormat メソッドの実装。
構文
HRESULT ConvertTimeFormat( LONGLONG *pTarget, const GUID *pTargetFormat, LONGLONG Source, const GUID *pSourceFormat );
パラメータ
- pTarget
- 変換されたタイム値を受け取る変数へのポインタ。
- pTargetFormat
- ターゲット フォーマットのタイム フォーマット GUID へのポインタ。NULL なら現在のフォーマットが使われる。
- Source
- 変換されるタイム値。
- pSourceFormat
- 変換するフォーマットの タイム フォーマット GUID へのポインタ。NULL なら現在のフォーマットが使われる。
戻り値
接続されているピンから HRESULT 値を返す。
コンストラクタ メソッド。
構文
CPosPassThru( const TCHAR *pName, LPUNKNOWN pUnk, HRESULT *phr, IPin *pPin );
パラメータ
使われていない。
構文
HRESULT ForceRefresh(void);
戻り値
S_OK を返す。
注意
当初このクラスは接続されているピンの IMediaPosition と IMediaSeeking インターフェイスへのポインタをキャッシュするために設計された。ForceRefresh メソッドはこれらのインターフェイスを解放した。
現在の実装では、このクラスはこれらのインターフェイスをキャッシュしない。互換性のために ForceRefresh メソッドはインクルードされているが、何もせず S_OK を返すだけである。
シークが効率的な時間幅を取得する。IMediaSeeking::GetAvailable メソッドの実装。
構文
HRESULT GetAvailable( LONGLONG *pEarliest, LONGLONG *pLatest );
パラメータ
- pEarliest
- シークが効率的なもっとも早いタイム値を受け取る変数へのポインタ。
- pLatest
- シークが効率的なもっとも遅いタイム値を受け取る変数へのポインタ。
戻り値
接続されているピンから HRESULT 値を返す。
ストリームのすべてのシーク能力を取得する。IMediaSeeking::GetCapabilities メソッドの実装。
構文
HRESULT GetCapabilities( DWORD *pCapabilities );
パラメータ
- pCapabilities
- AM_SEEKING_SEEKING_CAPABILITIES フラグのビット合成へのポインタ。
戻り値
接続されているピンから HRESULT 値を返す。
現在位置を取得する、ストリームの全時間幅からの相対値。IMediaSeeking::GetCurrentPosition メソッドの実装。
構文
HRESULT GetCurrentPosition( LONGLONG *pCurrent );
パラメータ
- pCurrent
- 現在の位置を受け取る変数へのポインタ、現在のタイム フォーマットの単位。
戻り値
HRESULT 値を返す。以下の表に示されるいずれかの値。
S_OK 成功。 E_NOTIMPL メソッドはサポートされていない。 E_POINTER NULL ポインタ引数。
注意
このメソッドは CPosPassThru::GetMediaTime メソッドを呼び出して、最も最近の位置を取得する。GetMediaTime が失敗すると、このメソッドは接続されているピンの IMediaSeeking::GetCurrentPosition を呼び出す。
GetMediaTime メソッドは基底クラスのデフォルトでは失敗する。フィルタで現在位置をキャッシュするなら、キャッシュ値を返す GetMediaTime をオーバーライドすること。
現在位置を取得する、ストリームの全時間幅からの相対値。IMediaPosition::get_CurrentPosition メソッドの実装。
構文
HRESULT get_CurrentPosition( REFTIME *pllTime );
パラメータ
- pllTime
- 現在位置を受け取る変数へのポインタ、秒単位。
戻り値
接続されているピンから HRESULT 値を返す。
ストリームの時間幅を取得する。IMediaSeeking::GetDuration メソッドの実装。
構文
HRESULT GetDuration( LONGLONG *pDuration );
パラメータ
- pDuration
- 時間幅を受け取る変数へのポインタ、現在のタイム フォーマット単位。
戻り値
接続されているピンから HRESULT 値を返す。
ストリームの時間幅を取得する。IMediaPosition::get_Duration メソッドの実装。
構文
HRESULT get_Duration( REFTIME *plength );
パラメータ
- plength
- 全ストリーム長を受け取る変数へのポインタ、秒単位。
戻り値
接続されているピンから HRESULT 値を返す。
現在のサンプルのタイム スタンプを取得する。
構文
virtual HRESULT GetMediaTime( LONGLONG *pStartTime, LONGLONG *pEndTime );
パラメータ
- pStartTime
- 開始タイムを受け取る変数へのポインタ、現在のタイム フォーマットの単位。
- pEndTime
- 終了タイムを受け取る変数へのポインタ、現在のタイム フォーマットの単位。
戻り値
Returns E_FAIL.
注意
フィルタで受け取ったサンプルのタイム スタンプをキャッシュするならこのメソッドをオーバーライドすること。
現在位置と停止位置を取得する、ストリームの全時間幅からの相対値。IMediaSeeking::GetPositions メソッドの実装。
構文
HRESULT GetPositions( LONGLONG *pCurrent, LONGLONG *pStop );
パラメータ
- pCurrent
- 現在位置を受け取る変数へのポインタ、現在のタイム フォーマットの単位。
- pStop
- 停止位置を受け取る変数へのポインタ、現在のタイム フォーマットの単位。
戻り値
接続されているピンから HRESULT 値を返す。
開始位置の前にキューに入るデータの量を取得する。IMediaSeeking::GetPreroll メソッドの実装。
構文
HRESULT GetPreroll( LONGLONG *pllPreroll );
パラメータ
- pllPreroll
- プリロール タイム を受け取る変数へのポインタ、現在のタイム フォーマットの単位。
戻り値
接続されているピンから HRESULT 値を返す。
開始位置の前にキューに入るデータ量 (プリロール タイム) を取得する。IMediaPosition::get_PrerollTime メソッドの実装。
構文
HRESULT get_PrerollTime( REFTIME *pllTime );
パラメータ
- pllTime
- プリロール タイムを受け取る変数へのポインタ。秒単位。
戻り値
接続されているピンから HRESULT 値を返す。
再生レートを取得する。IMediaSeeking::GetRate メソッドの実装。
構文
HRESULT GetRate( double *pdRate );
パラメータ
- pdRate
- 再生レートを受け取る変数へのポインタ。
戻り値
接続されているピンから HRESULT 値を返す。
再生レートを取得する。IMediaPosition::get_Rate メソッドの実装。
構文
HRESULT get_Rate( double *pdRate );
パラメータ
- pdRate
- 再生レートを受け取る変数へのポインタ。
戻り値
接続されているピンから HRESULT 値を返す。
再生終了タイムを取得する、ストリームの全時間幅からの相対値。IMediaSeeking::GetStopPosition メソッドの実装。
構文
HRESULT GetStopPosition( LONGLONG *pStop );
パラメータ
- pStop
- 終了タイムを受け取る変数へのポインタ、現在のタイムフォーマットの単位。
戻り値
接続されているピンから HRESULT 値を返す。
再生の終了タイムを取得する、ストリームの全時間幅からの相対値。IMediaPosition::get_StopTime メソッドの実装。
構文
HRESULT get_StopTime( REFTIME *pllTime );
パラメータ
- pllTime
- 終了タイムを受け取る変数へのポインタ、秒単位。
戻り値
接続されているピンから HRESULT 値を返す。
現在のタイム フォーマットを取得する。IMediaSeeking::GetTimeFormat メソッドの実装。
構文
HRESULT GetTimeFormat( const GUID *pFormat );
パラメータ
- pFormat
- タイム フォーマット GUID を受け取る変数へのポインタ。
戻り値
接続されているピンから HRESULT 値を返す。
指定したタイム フォーマットがサポートされているかどうかを確認する。IMediaSeeking::IsFormatSupported メソッドの実装。
構文
HRESULT IsFormatSupported( const GUID *pFormat );
パラメータ
- pFormat
- タイム フォーマット GUID へのポインタ。
戻り値
接続されているピンから HRESULT 値を返す。
指定したタイム フォーマットが現在使われているフォーマットかどうかを確認する。IMediaSeeking::IsUsingTimeFormat メソッドの実装。
構文
HRESULT IsUsingTimeFormat( const GUID *pFormat );
パラメータ
- pFormat
- タイム フォーマット GUIDへのポインタ。
戻り値
接続されているピンから HRESULT 値を返す。
現在の位置を設定する、ストリームの全時間幅からの相対値。IMediaPosition::put_CurrentPosition メソッドの実装。
構文
HRESULT put_CurrentPosition( REFTIME llTime );
パラメータ
- llTime
- 新しい位置、秒単位。
戻り値
接続されているピンから HRESULT 値を返す。
開始位置の前にキューに入るデータの量を設定する。IMediaPosition::put_PrerollTime メソッドの実装。
構文
HRESULT put_PrerollTime( REFTIME llTime );
パラメータ
- llTime
- プリロール タイム、秒単位。
戻り値
接続されているピンから HRESULT 値を返す。
注意
このメンバ関数はその呼び出しをアップストリームに渡すが、IMediaPosition::put_PrerollTime メソッドはすべての DirectShow ソース フィルタでサポートされているわけではない。
再生レートを設定する。IMediaPosition::put_Rate メソッドの実装。
構文
HRESULT put_Rate( double dRate );
パラメータ
- dRate
- 再生レート。ゼロであってはならない。
戻り値
dRate がゼロなら E_INVALIDARG を返す。それ以外なら、接続されているピンから HRESULT 値を返す。
注意
マイナス値はリバース再生を示す。すべてのメディアがリバース再生をサポートしているわけではない。
再生の終了タイムを設定する、ストリームの全時間幅からの相対値。IMediaPosition::put_StopTime メソッドの実装。
構文
HRESULT put_StopTime( REFTIME llTime );
パラメータ
- llTime
- 停止 タイムの double 値、秒単位。
戻り値
接続されているピンから HRESULT 値を返す。
ストリームで許容されるタイム フォーマットを取得する。IMediaSeeking::QueryPreferredFormat メソッドの実装。
構文
HRESULT QueryPreferredFormat( GUID *pFormat );
パラメータ
- pFormat
- タイム フォーマット GUID を受け取る変数へのポインタ。
戻り値
接続されているピンから HRESULT 値を返す。
現在位置と停止位置を設定する。IMediaSeeking::SetPositions メソッドの実装。
構文
HRESULT SetPositions( LONGLONG *pCurrent, DWORD dwCurrentFlags, LONGLONG *pStop, DWORD dwStopFlags );
パラメータ
- pCurrent
- 現在位置を指定する変数へのポインタ、現在のタイム フォーマットの単位。
- dwCurrentFlags
- フラグのビットの組み合わせ。詳細については、「IMediaSeeking::SetPositions」を参照すること。
- pStop
- 停止位置を指定する変数へのポインタ、現在のタイム フォーマットの単位。
- dwStopFlags
- フラグのビットの組み合わせ。詳細については、IMediaSeeking::SetPositions」を参照すること。
戻り値
接続されているピンから HRESULT 値を返す。
再生レートを設定する。IMediaSeeking::SetRate メソッドの実装。
構文
HRESULT SetRate( double dRate );
パラメータ
- dRate
- 再生レート。ゼロであってはならない。
戻り値
dRate がゼロなら E_INVALIDARG を返す。それ以外なら、接続されているピンから HRESULT 値を返す。
タイム フォーマットを設定する。IMediaSeeking::SetTimeFormat メソッドの実装。
構文
HRESULT SetTimeFormat( const GUID *pFormat );
パラメータ
- pFormat
- タイム フォーマット GUID へのポインタ。
戻り値
接続されているピンから HRESULT 値を返す。
CPosPassThru オブジェクトまたは CRendererPosPassThru オブジェクトを作成する。
構文
STDAPI CreatePosPassThru( LPUNKNOWN pAgg, BOOL bRenderer, IPin *pPin, IUnknown **ppPassThru );
パラメータ
戻り値
成功の場合は S_OK を返す。それ以外の場合は HRESULT 値を返し、エラーの原因を示す。
注意
bSupportRendering の値が TRUE の場合、このメソッドは CRendererPosPassThru クラスのインスタンスを作成する。それ以外の場合は、CPosPassThru クラスのインスタンスを作成する。詳細については、「CSeekingPassThru」を参照すること。