IAMPushSource
COM公式ドキュメント
IAMPushSource インターフェイスは、ライブソースをレンダリングするフィルターグラフを同期します。
解説(Remarks)
Filter Graph Manager は、このインターフェイスのメソッドを使用して、ライブソースのレンダリング時に一般的に発生する 2 つの問題に対処します。
- レイテンシ: フィルターグラフに複数のライブソースが含まれる場合、それぞれのソースはしばしば異なるレイテンシを持ち、その結果として同期がずれることがあります。たとえば、音声キャプチャの方が映像キャプチャよりもレイテンシ時間が長い場合、グラフがその差を補正しない限り、音声は映像より遅れます。
- レートマッチング: レンダラーフィルターがライブソースに接続されている場合、そのデータ消費レートをソースフィルターの生成レートに一致させる必要があります。そうしないと、データにギャップが生じたり(レンダラーがソースより速く動作する場合)、データが破棄されたり(ソースの方が速く動作する場合)することがあります。
IAMPushSource インターフェイスを公開している各出力ピンに対して IAMLatency::GetLatency を呼び出し、グラフ内の最大レイテンシを判定します。次に、最大レイテンシより小さいレイテンシを持つフィルターに対して IAMPushSource::SetStreamOffset を呼び出し、それらのフィルターが生成するタイムスタンプを正しいオフセットで調整するようにします。
レートマッチングを実行するために、フィルターグラフは、レンダラーフィルターがソースフィルターとクロックレートを一致させられるかどうかを判定する必要があります。IAMPushSource::GetPushSourceFlags メソッドは、レンダラーがソースとレートを一致させても安全かどうかを示す一連のフラグを返します。
これらの問題は、ファイルへのキャプチャには影響しません。File Writer フィルターは、ファイルを正しく書き込むために、受信サンプルのタイムスタンプに依存します。ストリームは再生時に同期されます。レートマッチングについては、データは常に可能な限り高速にファイルへ書き込まれます。
メソッド 6
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
GetPushSourceFlags メソッドは、フィルターの動作を記述するフラグの組み合わせを取得します。
| pFlags | DWORD* | out | AM_PUSHSOURCE_FLAGS 列挙型のフラグの組み合わせを受け取る変数へのポインター。 |
戻り値
インターフェイスの実装に依存する HRESULT 値を返します。
解説(Remarks)
レンダラーフィルターがこのソースフィルターと安全にクロックレートを一致させられるかどうかを判定するには、このメソッドを呼び出します。
SetPushSourceFlags メソッドは、フィルターの動作を指定するフラグを設定します。現在のところ、要求フラグはサポートされておらず、またアプリケーションがフィルターによって設定されたフラグをオーバーライドすべきではないため、アプリケーションはこのメソッドを呼び出すべきではありません。
| Flags | DWORD | in | AM_PUSHSOURCE_FLAGS 列挙型のフラグの組み合わせ。 |
戻り値
インターフェイスの実装に依存する HRESULT 値を返します。
SetStreamOffset メソッドは、このフィルターが生成するタイムスタンプのオフセットを設定します。
| rtOffset | LONGLONG | in | フィルターの新しいストリームオフセット。 |
戻り値
解説(Remarks)
フィルターグラフは、異なるレイテンシ値を持つストリームを同期させるために、フィルターのストリームオフセットを調整する目的でこのメソッドを呼び出します。
戻り値が S_FALSE の場合、フィルターは要求されたオフセットに十分な大きさのバッファーをサポートしていない可能性があります。ダウンストリームに別のバッファーがない限り、データが失われる可能性があります。フィルターの最大優先オフセットを取得するには、IAMPushSource::GetMaxStreamOffset メソッドを呼び出します。
GetStreamOffset メソッドは、フィルターがタイムスタンプを生成する際に使用するオフセットを取得します。
| prtOffset | LONGLONG* | out | 現在のストリームオフセットを示す参照時間を受け取る変数へのポインター。 |
戻り値
インターフェイスの実装に依存する HRESULT 値を返します。
GetMaxStreamOffset メソッドは、フィルターがサポートできる最大ストリームオフセットを取得します。
| prtMaxOffset | LONGLONG* | out | フィルターがサポートできる最大オフセットを示す参照時間を受け取る変数へのポインター。 |
戻り値
解説(Remarks)
ストリームオフセットがサポートされる最大オフセットより大きい値に設定された場合、フィルターがオフセット全体分のデータを保持できる十分な大きさのバッファーを持つことは保証されません。ダウンストリームに別のバッファーがない限り、データが失われる可能性があります。
SetMaxStreamOffset メソッドは、フィルターグラフで許可されるストリームオフセットを指定します。
| rtMaxOffset | LONGLONG | in | 最大ストリームオフセットを指定する参照時間。 |
戻り値
インターフェイスの実装に依存する HRESULT 値を返します。
解説(Remarks)
フィルターを接続する前にこのメソッドを呼び出すと、フィルターは適切なサイズのバッファーを割り当てることができます。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IAMPushSource "{F185FE76-E64E-11D2-B76E-00C04FB6BD3D}" #usecom global IAMPushSource IID_IAMPushSource "{}" #comfunc global IAMPushSource_GetPushSourceFlags 4 var #comfunc global IAMPushSource_SetPushSourceFlags 5 int #comfunc global IAMPushSource_SetStreamOffset 6 int64 #comfunc global IAMPushSource_GetStreamOffset 7 var #comfunc global IAMPushSource_GetMaxStreamOffset 8 var #comfunc global IAMPushSource_SetMaxStreamOffset 9 int64 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。#define global IID_IAMPushSource "{F185FE76-E64E-11D2-B76E-00C04FB6BD3D}" #usecom global IAMPushSource IID_IAMPushSource "{}" #comfunc global IAMPushSource_GetPushSourceFlags 4 sptr #comfunc global IAMPushSource_SetPushSourceFlags 5 int #comfunc global IAMPushSource_SetStreamOffset 6 int64 #comfunc global IAMPushSource_GetStreamOffset 7 sptr #comfunc global IAMPushSource_GetMaxStreamOffset 8 sptr #comfunc global IAMPushSource_SetMaxStreamOffset 9 int64 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。