Win32 API 日本語リファレンス
ホームMedia.MediaFoundation › IMFPresentationClock

IMFPresentationClock

COM
IID868ce85c-8ea9-4f55-ab82-b009a910a805継承元IMFClock自前メソッド開始 vtbl8

公式ドキュメント

プレゼンテーションクロックを表します。サンプルをレンダリングするタイミングをスケジュールし、複数のストリームを同期するために使用します。

解説(Remarks)

プレゼンテーションクロックの新しいインスタンスを作成するには、MFCreatePresentationClock 関数を呼び出します。プレゼンテーションクロックには、クロック時刻を提供するオブジェクトであるタイムソースが必要です。たとえば、オーディオレンダラーは、サウンドカードを使用してクロックを駆動するタイムソースです。タイムソースは IMFPresentationTimeSource インターフェイスを公開します。タイムソースを設定するには、SetTimeSource を呼び出します。プレゼンテーションクロックは、Start メソッドが呼び出されるまで動作を開始しません。

メディアセッションからプレゼンテーションクロックを取得するには、IMFMediaSession::GetClock を呼び出します。

メソッド 8

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 8 HRESULT SetTimeSource(IMFPresentationTimeSource* pTimeSource)

プレゼンテーションクロックのタイムソースを設定します。タイムソースは、現在の時刻を提供してクロックを駆動するオブジェクトです。

pTimeSourceIMFPresentationTimeSource*inタイムソースの IMFPresentationTimeSource インターフェイスへのポインター。

戻り値

このメソッドは HRESULT を返します。取り得る値には次の表の値が含まれますが、これらに限定されません。

Return code Description
S_OK
メソッドが成功しました。
MF_E_CLOCK_NOT_SIMPLE
タイムソースの周波数が 10 MHz ではありません。
MF_E_NOT_INITIALIZED
タイムソースが初期化されていません。

解説(Remarks)

プレゼンテーションクロックは、タイムソースを持つまで開始できません。

タイムソースは、すべてのタイムソースが実装しなければならない IMFClockStateSink インターフェイスを通じて、クロックからの状態変更通知を受け取るように自動的に登録されます。

このタイムソースは 10 MHz の周波数を持ちます。IMFClock::GetClockCharacteristics を参照してください。そうでない場合、このメソッドは MF_E_CLOCK_NOT_SIMPLE を返します。

vtbl 9 HRESULT GetTimeSource(IMFPresentationTimeSource** ppTimeSource)

クロックのプレゼンテーションタイムソースを取得します。

ppTimeSourceIMFPresentationTimeSource**outタイムソースの IMFPresentationTimeSource インターフェイスへのポインターを受け取ります。呼び出し元はこのインターフェイスを解放する必要があります。

戻り値

このメソッドは HRESULT を返します。取り得る値には次の表の値が含まれますが、これらに限定されません。

Return code Description
S_OK
メソッドが成功しました。
MF_E_CLOCK_NO_TIME_SOURCE
このクロックにタイムソースが設定されていません。
vtbl 10 HRESULT GetTime(LONGLONG* phnsClockTime)

最新のクロック時刻を取得します。

phnsClockTimeLONGLONG*out最新のクロック時刻を 100 ナノ秒単位で受け取ります。この時刻は、クロックが最後に開始された時点を基準とした相対値です。

戻り値

このメソッドは HRESULT を返します。取り得る値には次の表の値が含まれますが、これらに限定されません。

Return code Description
S_OK
メソッドが成功しました。
MF_E_CLOCK_NO_TIME_SOURCE
クロックにプレゼンテーションタイムソースがありません。IMFPresentationClock::SetTimeSource を呼び出してください。

解説(Remarks)

このメソッドは、ジッターを平滑化したり、クロック時刻の不正確さを補正したりする処理は行いません。

vtbl 11 HRESULT AddClockStateSink(IMFClockStateSink* pStateSink)

クロックが開始、停止、一時停止、またはレート変更されるたびに通知を受け取るオブジェクトを登録します。

pStateSinkIMFClockStateSink*inオブジェクトの IMFClockStateSink インターフェイスへのポインター。

戻り値

このメソッドは HRESULT を返します。取り得る値には次の表の値が含まれますが、これらに限定されません。

Return code Description
S_OK
メソッドが成功しました。

解説(Remarks)

オブジェクトを解放する前に、IMFPresentationClock::RemoveClockStateSink を呼び出して、状態変更通知の登録を解除してください。

vtbl 12 HRESULT RemoveClockStateSink(IMFClockStateSink* pStateSink)

クロックから状態変更通知を受け取っているオブジェクトの登録を解除します。

pStateSinkIMFClockStateSink*inオブジェクトの IMFClockStateSink インターフェイスへのポインター。

戻り値

このメソッドは HRESULT を返します。取り得る値には次の表の値が含まれますが、これらに限定されません。

Return code Description
S_OK
メソッドが成功しました。
vtbl 13 HRESULT Start(LONGLONG llClockStartOffset)

プレゼンテーションクロックを開始します。

llClockStartOffsetLONGLONGin開始時刻の初期値を 100 ナノ秒単位で指定します。Start メソッドが呼び出された時点で、クロックの IMFPresentationClock::GetTime メソッドはこの値を返し、クロック時刻はそこから増加します。値が PRESENTATION_CURRENT_POSITION の場合、クロックは現在の位置から開始します。クロックが一時停止しており、同じ位置から再開したい場合はこの値を使用してください。

戻り値

このメソッドは HRESULT を返します。取り得る値には次の表の値が含まれますが、これらに限定されません。

Return code Description
S_OK
メソッドが成功しました。
MF_E_CLOCK_NO_TIME_SOURCE
このクロックにタイムソースが設定されていません。

解説(Remarks)

このメソッドは、すべての状態(停止、一時停止、または実行中)で有効です。

クロックが一時停止しており、同じ位置から再開する場合(llClockStartOffsetPRESENTATION_CURRENT_POSITION の場合)、プレゼンテーションクロックは IMFClockStateSink::OnClockRestart 通知を送信します。それ以外の場合、クロックは IMFClockStateSink::OnClockStart 通知を送信します。

プレゼンテーションクロックは、クロックのタイムソースに対して OnClockStart または OnClockRestart を呼び出すことで状態変更を開始します。この呼び出しは同期的に行われます。失敗した場合、状態変更は行われません。呼び出しが成功すると状態が変更され、クロックは他の状態変更サブスクライバーの OnClockStart または OnClockRestart メソッドを呼び出して通知します。これらの呼び出しは非同期的に行われます。

クロックが既に実行中の場合、Start を再度呼び出すと、クロックを新しい StartOffset の位置にシークする効果があります。

vtbl 14 HRESULT Stop()

プレゼンテーションクロックを停止します。クロックが停止している間、クロック時刻は進まず、クロックの IMFPresentationClock::GetTime メソッドは 0 を返します。

戻り値

このメソッドは HRESULT を返します。取り得る値には次の表の値が含まれますが、これらに限定されません。

Return code Description
S_OK
メソッドが成功しました。
MF_E_CLOCK_NO_TIME_SOURCE
このクロックにタイムソースが設定されていません。
MF_E_CLOCK_STATE_ALREADY_SET
クロックは既に停止しています。

解説(Remarks)

このメソッドは、クロックが実行中または一時停止中のときに有効です。

プレゼンテーションクロックは、クロックのタイムソースに対して IMFClockStateSink::OnClockStop を呼び出すことで状態変更を開始します。この呼び出しは同期的に行われます。失敗した場合、状態変更は行われません。呼び出しが成功すると状態が変更され、クロックは他の状態変更サブスクライバーの OnClockStop メソッドを呼び出して通知します。これらの呼び出しは非同期的に行われます。

vtbl 15 HRESULT Pause()

プレゼンテーションクロックを一時停止します。クロックが一時停止している間、クロック時刻は進まず、クロックの IMFPresentationClock::GetTime はクロックが一時停止された時刻を返します。

戻り値

このメソッドは HRESULT を返します。取り得る値には次の表の値が含まれますが、これらに限定されません。

Return code Description
S_OK
メソッドが成功しました。
MF_E_CLOCK_NO_TIME_SOURCE
このクロックにタイムソースが設定されていません。
MF_E_CLOCK_STATE_ALREADY_SET
クロックは既に一時停止しています。
MF_E_INVALIDREQUEST
クロックが停止しています。この要求は、クロックが停止しているときには無効です。

解説(Remarks)

このメソッドは、クロックが実行中のときに有効です。クロックが一時停止中または停止中のときには無効です。

プレゼンテーションクロックは、クロックのタイムソースに対して IMFClockStateSink::OnClockPause を呼び出すことで状態変更を開始します。この呼び出しは同期的に行われます。失敗した場合、状態変更は行われません。呼び出しが成功すると状態が変更され、クロックは他の状態変更サブスクライバーの OnClockPause メソッドを呼び出して通知します。これらの呼び出しは非同期的に行われます。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_IMFPresentationClock "{868CE85C-8EA9-4F55-AB82-B009A910A805}"
#usecom global IMFPresentationClock IID_IMFPresentationClock "{}"
#comfunc global IMFPresentationClock_SetTimeSource         8 sptr
#comfunc global IMFPresentationClock_GetTimeSource         9 sptr
#comfunc global IMFPresentationClock_GetTime               10 var
#comfunc global IMFPresentationClock_AddClockStateSink     11 sptr
#comfunc global IMFPresentationClock_RemoveClockStateSink  12 sptr
#comfunc global IMFPresentationClock_Start                 13 int64
#comfunc global IMFPresentationClock_Stop                  14
#comfunc global IMFPresentationClock_Pause                 15
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。