IMediaSeeking::SetPositions
SetPositions メソッドは、現在位置と停止位置を設定する。
構文
HRESULT SetPositions(
LONGLONG *pCurrent,
DWORD dwCurrentFlags,
LONGLONG *pStop,
DWORD dwStopFlags
);
パラメータ
pCurrent
[in,out] 現在のタイムを指定する変数へのポインタ (現在のタイム フォーマットの単位)。
dwCurrentFlags
[in] フラグのビットごとの組み合わせ。「注意」を参照。
pStop
[in,out] 終了タイムを指定する変数へのポインタ (現在のタイム フォーマットの単位)。
dwStopFlags
[in] フラグのビットごとの組み合わせ。「注意」を参照。
戻り値
HRESULT 値を返す。可能な値は次のとおりである。
値 | 説明 |
S_FALSE | 位置変更はない (両方のフラグがシークしないと指定)。 |
S_OK | 成功。 |
E_INVALIDARG | 無効な引数。 |
E_NOTIMPL | メソッドはサポートされていない。 |
E_POINTER | NULL ポインタ引数。 |
注意
dwCurrentFlags 引数と dwStopFlags 引数には、シーク タイプを定義する。次のフラグが定義されている。
位置フラグ | 説明 |
AM_SEEKING_NoPositioning | 位置変更はない。タイム 引数は、NULL とすることもできる。 |
AM_SEEKING_AbsolutePositioning | 指定した位置は絶対値である。 |
AM_SEEKING_RelativePositioning | 指定した位置は以前の値からの相対値である。 |
AM_SEEKING_IncrementalPositioning | 停止位置 (pStop) は現在位置 (pCurrent) からの相対値である。 |
修飾フラグ | 説明 |
AM_SEEKING_SeekToKeyFrame | 最も近いキー フレームをシークする。これは高速だが、精度は落ちる。 |
AM_SEEKING_ReturnTime | 等しい基準タイムを返す。 |
AM_SEEKING_Segment | セグメント シークを使う。 |
AM_SEEKING_NoFlush | フラッシュしない。 |
各引数に対して、1 つの位置フラグを使う。1 つまたは複数の修飾子フラグを含めることもできる。
AM_SEEKING_ReturnTime フラグが指定されると、メソッドはその位置の値を基準タイムに変換し、pCurrent 変数または pStop 変数で返す。フレームのような別のタイム フォーマットを使っているときに、このフラグは有用である。
AM_SEEKING_Segment フラグと AM_SEEKING_NoFlush フラグは、シームレス ループをサポートする。
- AM_SEEKING_Segment が存在する場合、ソースフィルタは停止位置に到達したときに、IPin::EndOfStream を呼び出す代わりに EC_END_OF_SEGMENT イベントを送る。アプリケーションはこのイベントを待って、もう 1 つのシーク コマンドを発行できる。
- AM_SEEKING_NoFlush フラグが存在する場合、グラフはシーク中にデータをフラッシュしない。このフラグは AM_SEEKING_Segment と共に使う。
ループを実行するためには、グラフは IMediaSeeking::GetCapabilities メソッドの AM_SEEKING_CanDoSegments を報告しなければならない。現在、この機能をサポートしているのは WAVE パーサー フィルタだけである。
pCurrent および pStop が受信する値は現在のタイム フォーマットで表される。デフォルトのタイム フォーマットは、REFERENCE_TIME 単位 (100 ナノ秒) である。タイム フォーマットを変更するには、IMediaSeeking::SetTimeFormat メソッドを使う。AM_SEEKING_ReturnTime フラグが存在する場合、メソッドは送信する値を REFERENCE_TIME 単位に変換する。
フィルタ開発者への注意点
このメソッドを実装すると、現在の位置または停止位置での変更を呼び出し元が要求しているかどうかを確認できる。修飾子フラグをマスク アウトするため、AM_SEEKING_PositioningBitsMask という値を使用して確認する。たとえば、次のように記述する。
DWORD dwCurrentPos = dwCurrentFlags & AM_SEEKING_PositioningBitsMask
if (dwCurrentPos == AM_SEEKING_AbsolutePositioning)
{
// 新しい位置を pCurrent に設定する。
m_rtStart = *pCurrent;
}
else if (dwCurrentPos == AM_SEEKING_RelativePositioning)
{
// pCurrent だけ現在の位置をインクリメントする。
m_rtStart += *pCurrent;
}
詳細については、基底クラス ライブラリの CSourceSeeking::SetPositions メソッドのソース コードを参照すること。
参照