次の方法で共有


CPosPassThru クラス

[このページに関連付けられている機能 DirectShow は、従来の機能です。 MediaPlayer、IMFMediaEngine、Media Foundation のオーディオ/ビデオ キャプチャに置き換わりました。 これらの機能は、Windows 10とWindows 11用に最適化されています。 新しいコードでは、可能であれば、DirectShow ではなく Media Foundation で MediaPlayerIMFMediaEngineAudio/Video Capture を使用することを強くお勧めします。 Microsoft は、レガシ API を使用する既存のコードを、可能であれば新しい API を使用するように書き換えるよう提案しています。]

cpospassthru 基本クラス階層

クラスは CPosPassThru 、変換フィルターの seek コマンドを次のフィルターに上流に渡すことによって処理します。

アプリケーションがフィルター グラフをシークすると、フィルター グラフ マネージャーによって seek コマンドがレンダラー フィルターに渡されます。 コマンドは、コマンドを実行できるフィルター (存在する場合) に達するまで、各フィルターの出力ピンを介してアップストリームに渡されます。 詳細については、「 Seeking」を参照してください。 クラスは CPosPassThru 、次の図に示すように、すべての seek コマンドをアップストリーム フィルターの出力ピンに渡します。

cpospassthru クラスは、シーク コマンドをアップストリームに送信します。

このクラスは基底クラス ライブラリで提供されますが、DirectShow は Quartz.dll でも同じクラスを提供します。 Quartz.dll バージョンを使用すると、クラスが DLL から実行時に読み込まれるため、フィルター内のコード サイズを多少小さくできます。 そのバージョンを使用するには、 CreatePosPassThru 関数を呼び出します。

次のコードに示すように、出力ピンの NonDelegatingQueryInterface メソッドで、要求されたインターフェイスが IMediaSeeking または IMediaPosition である場合は常に CPosPassThru オブジェクトにデリゲートします。

// The following member variables are assumed:
IPin *m_pInput;    // Pointer to the input pin on your filter.
IUnknown *m_pPos;  // Pointer to the CPosPassThru object.

STDMETHODIMP CMyPin::NonDelegatingQueryInterface(REFIID riid, void **ppv)
{
    HRESULT hr
    if (riid == IID_IMediaPosition || riid == IID_IMediaSeeking) 
    {
        if (m_pPos == NULL) 
        {
            // We have not created the CPosPassThru object yet. Do so now.
            hr = CreatePosPassThru(GetOwner(), FALSE, m_pInput, &m_pPos);
            if (FAILED(hr)) return hr;
        }
        return m_pPos->QueryInterface(riid, ppv);
    } 
    else
    {
         // Other interfaces (not shown).
    }
}

~CMyPin::CMyPin() 
{
    // Release the CPosPassThruObject.
    if (m_pPos != NULL) m_pPos->Release();
}

記載されている場合を除き、このクラスのすべての IMediaPosition メソッドと IMediaSeeking メソッドは、接続されたピンの対応するメソッドを呼び出し、結果を返します。

パブリック メソッド 説明
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 オブジェクトを作成します。

要件

要件
ヘッダー
Ctlutil.h (Streams.h を含む)
ライブラリ
Strmbase.lib (製品版ビルド);
Strmbasd.lib (デバッグ ビルド)