Microsoft DirectX 8.0

CSourceSeeking クラス

CSourceSeeking クラスの階層

1 つの出力ピンを持つソース フィルタで、シークを実装する抽象クラス。

宣言 : Ctlutil.h

このクラスは、IMediaSeeking インターフェイスをサポートし、すべての IMediaSeeking メソッドにデフォルトの実装を提供する。プロテクト メンバ変数は、開始タイム、終了タイム、および現在のレートを格納する。デフォルトでは、このクラスによってサポートされる唯一のタイム フォーマットは、TIME_FORMAT_MEDIA_TIME (100 ナノ秒単位) である。

CSourceSeeking オブジェクトは、開始位置、停止位置、または再生レートが変更されるたびに、次のように対応する純粋仮想メソッドを呼び出す。

派生クラスは、これらのメソッドを実装しなければならない。シーク処理後、フィルタは次のことを行う必要がある。

  1. ダウンストリームの入力ピンで IPin::BeginFlush メソッドを呼び出す。
  2. データを提供するワーカー スレッドを停止する。
  3. 入力ピンで IPin::EndFlush メソッドを呼び出す。
  4. ワーカー スレッドを再起動する。
  5. 入力ピンで IPin::NewSegment メソッドを呼び出す。
  6. 最初のサンプルで非継続プロパティを設定する。IMediaSample::SetDiscontinuity メソッドを呼び出す。

ワーカー スレッドがブロックされ、サンプル出力の待機状態になっている場合は、BeginFlush を呼び出してワーカー スレッドを解放する。

ステップ 2 で、スレッドによるデータの送信が停止したことを確認する。実装によっては、スレッドが終了するのを待つか、またはスレッドがなんらかの応答を示すまで待つ必要がある。フィルタで CSourceStream クラスを使っている場合、CSourceStream::Stop メソッドは、ワーカー スレッドが応答するまで待機状態となる。

理想的には、新しいセグメント (ステップ 5) がワーカー スレッドから提供されることが望ましい。これは、フィルタがサンプルを使って継続して処理する限り、CSourceSeeking オブジェクトによっても実行できる。

次の例は、可能な実装を示している。ここでは、ソース フィルタの出力ピンが CSourceSeekingCSourceStream から派生することを想定している。この例では、ステップ 1 〜 4 を実行するヘルパー メソッド UpdateFromSeek を定義している。CSourceStream::OnThreadStartPlay メソッドはオーバーライドされ、新しいセグメントを送るとともに、非連続を示すフラグを設定する。ワーカー スレッドはこのフラグをピックアップし、IMediaSample::SetDiscontinuity を呼び出す。

void CMyStream::UpdateFromSeek()
{
    if (ThreadExists()) 
    {
        DeliverBeginFlush();
        Stop();
        DeliverEndFlush();
        Run();
    }
}

HRESULT CMyStream::OnThreadStartPlay()
{
    m_bDiscontinuity = TRUE;
    return DeliverNewSegment(m_rtStart, m_rtStop, m_dRateSeeking);
}
プロテクト メンバ変数
m_rtDurationストリームが再生される時間。
m_rtStart開始タイム。
m_rtStop終了タイム。
m_dRateSeeking再生レート。
m_dwSeekingCapsシーク能力。
m_pLockロックのためのクリティカル セクション オブジェクトへのポインタ。
プロテクト メソッド
CSourceSeekingコンストラクタ メソッド。
純粋仮想メソッド
ChangeRate再生レートが変更されたときに呼び出される。
ChangeStart開始位置が変更されたときに呼び出される。
ChangeStop停止位置が変更されたときに呼び出される。
IMediaSeeking メソッド
IsFormatSupported指定されたタイム フォーマットがサポートされているかどうかを判定する。
QueryPreferredFormatオブジェクトの優先タイム フォーマットを取得する。
SetTimeFormatタイム フォーマットを設定する。
IsUsingTimeFormat指定されたタイム フォーマットが、現在使用されているフォーマットかどうかを判定する。
GetTimeFormat現在のタイム フォーマットを取得する。
GetDurationストリームの時間幅を取得する。
GetStopPositionストリームの時間幅に対して、再生が停止するタイムを取得する。
GetCurrentPositionストリームの合計時間幅に対する、現在の位置を取得する。
GetCapabilitiesストリームのすべてのシーク能力を取得する。
CheckCapabilitiesストリームに指定されたシーク能力があるかどうかを照会する。
ConvertTimeFormat1 つのタイム フォーマットから別のタイム フォーマットに変換する。
SetPositions現在の位置と停止位置を設定する。
GetPositions現在の位置と停止位置を取得する。
GetAvailableシークが有効であるタイムの範囲を取得する。
SetRate再生レートを設定する。
GetRate再生レートを取得する。
GetPrerollプリロール タイムを取得する。

CSourceSeeking.m_rtDuration

CSourceSeeking クラス

ストリームの時間幅。デフォルトでは、この値は m_rtStop メンバ変数の値に設定される。

構文

CRefTime m_rtDuration;

CSourceSeeking.m_rtStart

CSourceSeeking クラス

開始タイム。デフォルトでは、この値はゼロに設定される。

構文

CRefTime m_rtStart;

CSourceSeeking.m_rtStop

CSourceSeeking クラス

終了タイム。デフォルトでは、この値は非常に大きな数値に設定される。派生クラスは、コンストラクタにおいて、またはフィルタが初期化されたときに、この値をリセットできる。

構文

CRefTime m_rtStop;

CSourceSeeking.m_dRateSeeking

CSourceSeeking クラス

再生レート。デフォルトでは、この値は 1.0 に設定される。

構文

double m_dRateSeeking;

CSourceSeeking.m_dwSeekingCaps

CSourceSeeking クラス

シーク能力。

構文

DWORD m_dwSeekingCaps;

注意

デフォルトでは、この値は次のフラグのビットごとの組み合わせに設定される。

フィルタが異なる能力の集まりをサポートしている場合、この値をオーバーライドする必要がある。

CSourceSeeking.m_pLock

CSourceSeeking クラス

ロックのためのクリティカル セクション オブジェクトへのポインタ。

構文

CCritSec *m_pLock;

CSourceSeeking::ChangeRate

CSourceSeeking クラス

再生レートが変更されたときに呼び出される。

構文

virtual HRESULT ChangeRate(void) PURE;

戻り値

HRESULT 値を返す。

注意

SetRate メソッドは、このクラスを呼び出す。このクラスは、派生クラスが実装しなければならない。SetRate メソッドは、m_dRateSeeking メンバ変数を更新するが、新しい値を確認しない。レート 0 は、常に拒否される。ゼロ以下のレートは、逆再生を示す。ほとんどのフィルタは、負のレートをサポートしていない。

次の例は、可能な実装を示している。

HRESULT CMyStream::ChangeRate( )
{
    {
        CAutoLock cAutoLockSeeking(CSourceSeeking::m_pLock);
        if( m_dRateSeeking <= 0 ) {
            m_dRateSeeking = 1.0;  // 妥当な値にリセットする。
            return E_FAIL;
        }
    }
    UpdateFromSeek();
    return S_OK;
}

CSourceSeeking::ChangeStart

CSourceSeeking クラス

開始位置が変更されたときに呼び出される。

構文

virtual HRESULT ChangeStart(void) PURE;

戻り値

HRESULT 値を返す。

注意

SetPositions メソッドは、開始位置が変更された場合にこのメソッドを呼び出す。これは、純粋仮想メソッドであり、派生クラスはこのメソッドを実装しなければならない。シーク処理後は、タイム スタンプはゼロからもう一度開始する必要がある。また、メディア タイムは、新しい開始タイムを反映する必要がある。次の例は、可能な実装を示している。

HRESULT CMyStream::ChangeStart( )
{
    m_rtSampleTime = 0;          // タイム スタンプをリセットする。
    m_rtMediaTime = m_rtStart;   // メディア タイムをリセットする。
    UpdateFromSeek();
    return S_OK;
}

CSourceSeeking::ChangeStop

CSourceSeeking クラス

停止位置が変更されたときに呼び出される。

構文

virtual HRESULT ChangeStop(void) PURE;

戻り値

HRESULT 値を返す。

注意

SetPositions メソッドは、停止位置が変更された場合にこのメソッドを呼び出す。これは純粋仮想メソッドであり、派生クラスはこのメソッドを実装しなければならない。次の例は、可能な実装を示している。

HRESULT CMyStream::ChangeStop( )
{
    UpdateFromSeek();
    return S_OK;
}

CSourceSeeking::CheckCapabilities

CSourceSeeking クラス

指定されたシーク能力があるかどうかをストリームに照会する。IMediaSeeking::CheckCapabilities メソッドを実装する。

構文

HRESULT CheckCapabilities(
    DWORD *pCapabilities
);

パラメータ

pCapabilities
1 つまたは複数の AM_SEEKING_SEEKING_CAPABILITIES 属性の、ビットごとの組み合わせへのポインタ。

戻り値

次の表に示す、いずれかの HRESULT 値を返す。

S_FALSEpCapabilities のすべての能力は存在しない。
S_OKpCapabilities のすべての能力が存在する。
E_POINTERNULL ポインタ引数。

注意

実装されているように、このメソッドは m_dwSeekingCaps メンバ変数に対する *pCapabilities の値をチェックする。しかし、IMediaSeeking::CheckCapabilities メソッドで説明しているように、このメソッドは *pCapabilitiesm_dwSeekingCaps と等しく設定しない。また、指定された能力のいずれも存在しない場合、このメソッドは E_FAIL を返さない。次に示すのは、より完全な実装である。

DWORD dwCaps;
HRESULT hr = GetCapabilities(&dwCaps);
if (SUCCEEDED(hr))
{
    dwCaps &= *pCapabilities;
    hr =  dwCaps ? ( dwCaps == *pCapabilities ? S_OK : S_FALSE ) : E_FAIL;
    *pCapabilities = dwCaps;
}
else *pCapabilities = 0;
return hr;

CSourceSeeking::ConvertTimeFormat

CSourceSeeking クラス

1 つのフォーマットを別のフォーマットに変換する。IMediaSeeking::ConvertTimeFormat メソッドを実装する。

構文

HRESULT ConvertTimeFormat(
    LONGLONG *pTarget,
    const GUID *pTargetFormat,
    LONGLONG Source,
    const GUID *pSourceFormat
);

パラメータ

pTarget
変換されたタイムを受け取る変数へのポインタ。
pTargetFormat
目的のフォーマットのタイム フォーマット GUID へのポインタ。NULL の場合は、現在のフォーマットが使用される。
Source
変換されるタイム値。
pSourceFormat
変換するフォーマットのタイム フォーマット GUID へのポインタ。NULL の場合は、現在のフォーマットが使われる。

戻り値

次の表に示す、いずれかの HRESULT 値を返す。

S_OK成功。
E_INVALIDARG無効な引数。
E_POINTERNULL ポインタ引数。

注意

基底クラスによってサポートされる唯一のタイム フォーマットは、TIME_FORMAT_MEDIA_TIME (100 ナノ秒単位) である。pTargetFormatpSourceFormat の両方が TIME_FORMAT_MEDIA_TIME を指定する単純な場合をのぞいて、このメソッドは、E_INVALIDARG を返す。

CSourceSeeking::CSourceSeeking

CSourceSeeking クラス

コンストラクタ メソッド。

構文

CSourceSeeking(
    const TCHAR *pName,
    LPUNKNOWN pUnk,
    HRESULT *phr,
    CCritSec *pLock
);

パラメータ

pName
オブジェクトの名前が含まれた文字列へのポインタ。詳細については、「CBaseObject」を参照すること。
pUnk
このオブジェクトの所有者へのポインタ。このオブジェクトが集成される場合、集成オブジェクトの IUnknown インターフェイスにポインタを渡す。それ以外の場合は、このパラメータに NULL を設定する。
phr
HRESULT 値へのポインタ。無視される。
pLock
このクラスによって使用される共有データを保護する、CCritSec オブジェクトへのポインタ。

CSourceSeeking::GetAvailable

CSourceSeeking クラス

シークが有効であるタイムの範囲を取得する。IMediaSeeking::GetAvailable メソッドを実装する。

構文

HRESULT GetAvailable(
    LONGLONG *pEarliest,
    LONGLONG *pLatest
);

パラメータ

pEarliest
有効なシークのため最も古いタイムを受け取る変数へのポインタ。この変数はゼロに設定される。
pLatest
有効なシークのために最も新しいタイムを受け取る変数へのポインタ。この変数は、m_rtDuration メンバ変数の値に設定される。

戻り値

S_OK を返す。

CSourceSeeking::GetCapabilities

CSourceSeeking クラス

ストリームのすべてのシーク能力を取得する。IMediaSeeking::GetCapabilities メソッドを実装する。

構文

HRESULT GetCapabilities(
    DWORD *pCapabilities
);

パラメータ

pCapabilities
AM_SEEKING_SEEKING_CAPABILITIES フラグのビットごとの組み合わせを受け取る変数へのポインタ。

戻り値

次の表に示す、いずれかの HRESULT 値を返す。

S_OK成功。
E_POINTERNULL ポインタ値。

注意

シーク能力は、m_dwSeekingCaps メンバ変数によって指定される。

CSourceSeeking::GetCurrentPosition

CSourceSeeking クラス

ストリームの合計時間幅に対する、現在の位置を取得する。実装されていない。

構文

HRESULT GetCurrentPosition(
  LONGLONG *pCurrent
);

パラメータ

pCurrent
現在の位置を受け取る変数へのポインタ。現在のタイム フォーマット単位で示される。

戻り値

E_NOTIMPL を返す。

注意

通常、ソース フィルタはこのメソッドをサポートしていない。その代わり、レンダリング フィルタが CRendererPosPassThru クラスを使って現在の位置を報告する。

CSourceSeeking::GetDuration

CSourceSeeking クラス

ストリームの時間幅を取得する。IMediaSeeking::GetDuration メソッドを実装する。

構文

HRESULT GetDuration(
    LONGLONG *pDuration
);

パラメータ

pDuration
時間幅を現在のタイム フォーマット単位で受け取る変数へのポインタ。

戻り値

次の表に示す、いずれかの HRESULT 値を返す。

S_OK成功。
E_POINTERNULL ポインタ値。

注意

この時間幅は、m_rtDuration メンバ変数によって指定される。

CSourceSeeking::GetPositions

CSourceSeeking クラス

現在の位置および停止位置を取得する。IMediaSeeking::GetPositions メソッドを実装する。

構文

HRESULT GetPositions(
    LONGLONG *pCurrent,
    LONGLONG *pStop
);

パラメータ

pCurrent
開始位置を受け取る変数へのポインタ。
pStop
停止位置を受け取る変数へのポインタ。

戻り値

S_OK を返す。

注意

このメソッドは、pCurrent パラメータ用に m_rtStart メンバ変数の値を返す。この変数は、現在のストリーミング位置ではない最後のシーク タイムを表す。しかし、アプリケーションがフィルタ グラフ マネージャを使って IMediaSeeking::GetPositions を呼び出すと、通常この値はソース フィルタではなく、レンダリング フィルタから提供される。

CSourceSeeking::GetPreroll

CSourceSeeking クラス

プリロール タイムを取得する。IMediaSeeking::GetPreroll メソッドを実装する。

構文

HRESULT GetPreroll(
    LONGLONG *pPreroll
);

パラメータ

pPreroll
プリロール タイムを受け取る変数へのポインタ。この値はゼロに設定される。

戻り値

次の表に示す、いずれかの値を HRESULT 値を返す。

S_OK成功。
E_POINTERNULL ポインタ値。

CSourceSeeking::GetRate

CSourceSeeking クラス

再生レートを取得する。IMediaSeeking::GetRate メソッドを実装する。

構文

HRESULT GetRate(
    double *pdRate
);

パラメータ

pdRate
再生レートを受け取る変数へのポインタ。

戻り値

次の表に示す、いずれかの HRESULT 値を返す。

S_OK成功。
E_POINTERNULL ポインタ値。

注意

再生レートは、m_dRateSeeking メンバ変数によって指定される。

CSourceSeeking::GetStopPosition

CSourceSeeking クラス

ストリームの時間幅に対して、再生が停止するタイムを取得する。IMediaSeeking::GetStopPosition メソッドを実装する。

構文

HRESULT GetStopPosition(
    LONGLONG *pStop
);

パラメータ

pStop
終了タイムを現在のタイム フォーマット単位で受け取る変数へのポインタ。

戻り値

次の表に示す、いずれかの HRESULT 値を返す。

S_OK成功。
E_POINTERNULL ポインタ値。

注意

終了タイムは、m_rtStop メンバ関数によって指定される。

CSourceSeeking::GetTimeFormat

CSourceSeeking クラス

現在のタイム フォーマットを取得する。IMediaSeeking::GetTimeFormat メソッドを実装する。

構文

HRESULT GetTimeFormat(
    const GUID *pFormat
);

パラメータ

pFormat
タイム フォーマット GUID を受け取る変数へのポインタ。

戻り値

次の表に示す、いずれかの HRESULT 値を返す。

S_OK成功。
E_POINTERNULL ポインタ値。

注意

基底クラスによってサポートされる唯一のタイム フォーマットは、TIME_FORMAT_MEDIA_TIME (100 ナノ秒単位) である。

CSourceSeeking::IsFormatSupported

CSourceSeeking クラス

特定のタイム フォーマットがサポートされているかどうかを判定する。IMediaSeeking::IsFormatSupported メソッドを実装する。

構文

HRESULT IsFormatSupported(
    const GUID *pFormat
);

パラメータ

pFormat
タイム フォーマット GUID へのポインタ。

戻り値

次の表に示す、いずれかの HRESULT 値を返す。

S_FALSEフォーマットはサポートされていない。
S_OKフォーマットはサポートされている。
E_POINTERNULL ポインタ引数。

注意

基底クラスによってサポートされている唯一のタイム フォーマットは、TIME_FORMAT_MEDIA_TIME (100 ナノ秒) である。

CSourceSeeking::IsUsingTimeFormat

CSourceSeeking クラス

特定のタイム フォーマットが現在使用されているフォーマットかどうかを判定する。

構文

HRESULT IsUsingTimeFormat(
    const GUID *pFormat
);

パラメータ

pFormat
タイム フォーマット GUID へのポインタ。

戻り値

次の表に示す、いずれかの HRESULT 値を返す。

S_FALSE指定されたフォーマットは、現在のフォーマットではない。
S_OK指定されたフォーマットは、現在のフォーマットである。
E_POINTERNULL ポインタ引数。

注意

基底クラスによってサポートされている唯一のタイム フォーマットは、TIME_FORMAT_MEDIA_TIME (100 ナノ秒単位) である。

CSourceSeeking::QueryPreferredFormat

CSourceSeeking クラス

オブジェクトの優先タイム フォーマットを取得する。IMediaSeeking::QueryPreferredFormat メソッドを実装する。

構文

HRESULT QueryPreferredFormat(
    GUID *pFormat
);

パラメータ

pFormat
タイム フォーマット GUID を受け取る変数へのポインタ。

戻り値

次の表に示す、いずれかの HRESULT 値を返す。

S_OK成功。
E_POINTERNULL ポインタ値。

注意

基底クラスによってサポートされている唯一のタイム フォーマットは、TIME_FORMAT_MEDIA_TIME (100 ナノ秒単位) である。

CSourceSeeking::SetPositions

CSourceSeeking クラス

現在の位置と停止位置を設定する。IMediaSeeking::SetPositions メソッドを実装する。

構文

HRESULT SetPositions(
    LONGLONG *pCurrent,
    DWORD CurrentFlags,
    LONGLONG *pStop,
    DWORD StopFlags
);

パラメータ

pCurrent
現在の位置を指定する変数へのポインタ。
CurrentFlags
フラグのビットごとの組み合わせ。「注意」を参照すること。
pStop
終了タイムを現在のタイム フォーマットで指定する変数へのポインタ。
StopFlags
フラグのビットごとの組み合わせ。「注意」を参照すること。

戻り値

HRESULT 値を返す。次の可能な値がある。

S_OK成功。
E_INVALIDARG無効なフラグ。
E_POINTERNULL ポインタ引数。

注意

次のフラグがサポートされる。

詳細については、「IMediaSeeking::SetPositions」を参照すること。

このメソッドは、m_rtStart メンバ変数および m_rtStop メンバ変数の値を更新し、純粋仮想メソッド ChangeStart および ChangeStop を呼び出す。

CSourceSeeking::SetRate

CSourceSeeking クラス

再生レートを設定する。IMediaSeeking::SetRate メソッドを実装する。

構文

HRESULT SetRate(
    double dRate
);

パラメータ

dRate
再生レート。

戻り値

HRESULT 値を返す。

注意

このメソッドは、m_dRateSeeking メンバ変数の値を更新し、純粋仮想メソッド ChangeRate を呼び出す。このメソッドは、dRate パラメータを確認しない。

CSourceSeeking::SetTimeFormat

CSourceSeeking クラス

タイム フォーマットを設定する。IMediaSeeking::SetTimeFormat メソッドを実装する。

構文

HRESULT SetTimeFormat(
    const GUID *pFormat
);

パラメータ

pFormat
タイム フォーマット GUID へのポインタ。

戻り値

次の表に示す、いずれかの HRESULT 値を返す。

S_OK成功。
E_INVALIDARG指定されたフォーマットはサポートされていない。
E_POINTERNULL ポインタ引数。

注意

基底クラスによってサポートされている唯一のフォーマットは、TIME_FORMAT_MEDIA_TIME (100 ナノ秒単位) である。