IMFPresentationClock
COM公式ドキュメント
プレゼンテーションクロックを表します。サンプルをレンダリングするタイミングをスケジュールし、複数のストリームを同期するために使用します。
解説(Remarks)
プレゼンテーションクロックの新しいインスタンスを作成するには、MFCreatePresentationClock 関数を呼び出します。プレゼンテーションクロックには、クロック時刻を提供するオブジェクトであるタイムソースが必要です。たとえば、オーディオレンダラーは、サウンドカードを使用してクロックを駆動するタイムソースです。タイムソースは IMFPresentationTimeSource インターフェイスを公開します。タイムソースを設定するには、SetTimeSource を呼び出します。プレゼンテーションクロックは、Start メソッドが呼び出されるまで動作を開始しません。
メディアセッションからプレゼンテーションクロックを取得するには、IMFMediaSession::GetClock を呼び出します。
メソッド 8
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
プレゼンテーションクロックのタイムソースを設定します。タイムソースは、現在の時刻を提供してクロックを駆動するオブジェクトです。
| pTimeSource | IMFPresentationTimeSource* | in | タイムソースの IMFPresentationTimeSource インターフェイスへのポインター。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表の値が含まれますが、これらに限定されません。
| Return code | Description |
|---|---|
| メソッドが成功しました。 | |
| タイムソースの周波数が 10 MHz ではありません。 | |
| タイムソースが初期化されていません。 |
解説(Remarks)
プレゼンテーションクロックは、タイムソースを持つまで開始できません。
タイムソースは、すべてのタイムソースが実装しなければならない IMFClockStateSink インターフェイスを通じて、クロックからの状態変更通知を受け取るように自動的に登録されます。
このタイムソースは 10 MHz の周波数を持ちます。IMFClock::GetClockCharacteristics を参照してください。そうでない場合、このメソッドは MF_E_CLOCK_NOT_SIMPLE を返します。
クロックのプレゼンテーションタイムソースを取得します。
| ppTimeSource | IMFPresentationTimeSource** | out | タイムソースの IMFPresentationTimeSource インターフェイスへのポインターを受け取ります。呼び出し元はこのインターフェイスを解放する必要があります。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表の値が含まれますが、これらに限定されません。
| Return code | Description |
|---|---|
| メソッドが成功しました。 | |
| このクロックにタイムソースが設定されていません。 |
最新のクロック時刻を取得します。
| phnsClockTime | LONGLONG* | out | 最新のクロック時刻を 100 ナノ秒単位で受け取ります。この時刻は、クロックが最後に開始された時点を基準とした相対値です。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表の値が含まれますが、これらに限定されません。
| Return code | Description |
|---|---|
| メソッドが成功しました。 | |
| クロックにプレゼンテーションタイムソースがありません。IMFPresentationClock::SetTimeSource を呼び出してください。 |
解説(Remarks)
このメソッドは、ジッターを平滑化したり、クロック時刻の不正確さを補正したりする処理は行いません。
クロックが開始、停止、一時停止、またはレート変更されるたびに通知を受け取るオブジェクトを登録します。
| pStateSink | IMFClockStateSink* | in | オブジェクトの IMFClockStateSink インターフェイスへのポインター。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表の値が含まれますが、これらに限定されません。
| Return code | Description |
|---|---|
| メソッドが成功しました。 |
解説(Remarks)
オブジェクトを解放する前に、IMFPresentationClock::RemoveClockStateSink を呼び出して、状態変更通知の登録を解除してください。
クロックから状態変更通知を受け取っているオブジェクトの登録を解除します。
| pStateSink | IMFClockStateSink* | in | オブジェクトの IMFClockStateSink インターフェイスへのポインター。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表の値が含まれますが、これらに限定されません。
| Return code | Description |
|---|---|
| メソッドが成功しました。 |
プレゼンテーションクロックを開始します。
| llClockStartOffset | LONGLONG | in | 開始時刻の初期値を 100 ナノ秒単位で指定します。Start メソッドが呼び出された時点で、クロックの IMFPresentationClock::GetTime メソッドはこの値を返し、クロック時刻はそこから増加します。値が PRESENTATION_CURRENT_POSITION の場合、クロックは現在の位置から開始します。クロックが一時停止しており、同じ位置から再開したい場合はこの値を使用してください。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表の値が含まれますが、これらに限定されません。
| Return code | Description |
|---|---|
| メソッドが成功しました。 | |
| このクロックにタイムソースが設定されていません。 |
解説(Remarks)
このメソッドは、すべての状態(停止、一時停止、または実行中)で有効です。
クロックが一時停止しており、同じ位置から再開する場合(llClockStartOffset が PRESENTATION_CURRENT_POSITION の場合)、プレゼンテーションクロックは IMFClockStateSink::OnClockRestart 通知を送信します。それ以外の場合、クロックは IMFClockStateSink::OnClockStart 通知を送信します。
プレゼンテーションクロックは、クロックのタイムソースに対して OnClockStart または OnClockRestart を呼び出すことで状態変更を開始します。この呼び出しは同期的に行われます。失敗した場合、状態変更は行われません。呼び出しが成功すると状態が変更され、クロックは他の状態変更サブスクライバーの OnClockStart または OnClockRestart メソッドを呼び出して通知します。これらの呼び出しは非同期的に行われます。
クロックが既に実行中の場合、Start を再度呼び出すと、クロックを新しい StartOffset の位置にシークする効果があります。
プレゼンテーションクロックを停止します。クロックが停止している間、クロック時刻は進まず、クロックの IMFPresentationClock::GetTime メソッドは 0 を返します。
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表の値が含まれますが、これらに限定されません。
| Return code | Description |
|---|---|
| メソッドが成功しました。 | |
| このクロックにタイムソースが設定されていません。 | |
| クロックは既に停止しています。 |
解説(Remarks)
このメソッドは、クロックが実行中または一時停止中のときに有効です。
プレゼンテーションクロックは、クロックのタイムソースに対して IMFClockStateSink::OnClockStop を呼び出すことで状態変更を開始します。この呼び出しは同期的に行われます。失敗した場合、状態変更は行われません。呼び出しが成功すると状態が変更され、クロックは他の状態変更サブスクライバーの OnClockStop メソッドを呼び出して通知します。これらの呼び出しは非同期的に行われます。
プレゼンテーションクロックを一時停止します。クロックが一時停止している間、クロック時刻は進まず、クロックの IMFPresentationClock::GetTime はクロックが一時停止された時刻を返します。
戻り値
このメソッドは HRESULT を返します。取り得る値には次の表の値が含まれますが、これらに限定されません。
| Return code | Description |
|---|---|
| メソッドが成功しました。 | |
| このクロックにタイムソースが設定されていません。 | |
| クロックは既に一時停止しています。 | |
| クロックが停止しています。この要求は、クロックが停止しているときには無効です。 |
解説(Remarks)
このメソッドは、クロックが実行中のときに有効です。クロックが一時停止中または停止中のときには無効です。
プレゼンテーションクロックは、クロックのタイムソースに対して IMFClockStateSink::OnClockPause を呼び出すことで状態変更を開始します。この呼び出しは同期的に行われます。失敗した場合、状態変更は行われません。呼び出しが成功すると状態が変更され、クロックは他の状態変更サブスクライバーの OnClockPause メソッドを呼び出して通知します。これらの呼び出しは非同期的に行われます。
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 指定が可能。#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 sptr #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が無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。