IMFStreamSink
COM公式ドキュメント
メディアシンクオブジェクト上のストリームを表します。
メソッド 6
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
このストリームシンクを所有するメディアシンクを取得します。
| ppMediaSink | IMFMediaSink** | out | メディアシンクの IMFMediaSink インターフェイスへのポインターを受け取ります。呼び出し元はこのインターフェイスを解放する必要があります。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| メディアシンクの Shutdown メソッドが呼び出されました。 | |
| このストリームはメディアシンクから削除されており、もはや有効ではありません。 |
このストリームシンクのストリーム識別子を取得します。
| pdwIdentifier | DWORD* | out | ストリーム識別子を受け取ります。このストリームシンクが IMFMediaSink::AddStreamSink の呼び出しによって追加された場合、ストリーム識別子はそのメソッドの dwStreamSinkIdentifier パラメーターの値になります。それ以外の場合は、メディアシンクが識別子を定義します。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| メディアシンクの Shutdown メソッドが呼び出されました。 | |
| このストリームはメディアシンクから削除されており、もはや有効ではありません。 |
ストリームシンクのメディアタイプハンドラーを取得します。メディアタイプハンドラーを使用すると、ストリームがサポートする形式を調べたり、ストリームにメディアタイプを設定したりできます。
| ppHandler | IMFMediaTypeHandler** | out | IMFMediaTypeHandler インターフェイスへのポインターを受け取ります。呼び出し元はこのインターフェイスを解放する必要があります。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| メディアシンクの Shutdown メソッドが呼び出されました。 | |
| このストリームはメディアシンクから削除されており、もはや有効ではありません。 |
解説(Remarks)
ストリームシンクが現在いずれのメディアタイプもサポートしていない場合、このメソッドは、IMFMediaTypeHandler::GetCurrentMediaType および IMFMediaTypeHandler::IsMediaTypeSupported への呼び出しがすべて失敗するメディアタイプハンドラーを返します。
サンプルをストリームに配信します。メディアシンクがそのサンプルを処理します。
| pSample | IMFSample* | in | ストリームの有効なデータを含むサンプルの IMFSample インターフェイスへのポインター。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| メディアシンクは、サンプルを受け取るには不適切な状態にあります。たとえば、プリロールは完了しているが、プレゼンテーションクロックがまだ開始されていない場合です。 | |
| サンプルのタイムスタンプが無効です。「解説」を参照してください。 | |
| メディアシンクは一時停止または停止しており、サンプルを処理できません。 | |
| プレゼンテーションクロックが設定されていません。IMFMediaSink::SetPresentationClock を呼び出してください。 | |
| サンプルにタイムスタンプがありません。 | |
| ストリームシンクが初期化されていません。 | |
| メディアシンクの Shutdown メソッドが呼び出されました。 | |
| このストリームはメディアシンクから削除されており、もはや有効ではありません。 |
解説(Remarks)
ストリームシンクが MEStreamSinkRequestSample イベントを送信したときに、このメソッドを呼び出します。
このメソッドは、メディアシンクの実装に応じて、さまざまな理由により MF_E_INVALID_TIMESTAMP を返すことがあります。
- 負のタイムスタンプ。
- (同一ストリーム内で) 逆方向にジャンプするタイムスタンプ。
- 同一メディアシンク内で、あるストリームのタイムスタンプが別のストリームのタイムスタンプから大きくずれてしまった場合 (たとえば、ストリームを多重化するアーカイブシンクなど)。
ストリームにマーカーを配置します。
| eMarkerType | MFSTREAMSINK_MARKER_TYPE | in | MFSTREAMSINK_MARKER_TYPE 列挙体のメンバーとして、マーカーの種類を指定します。 |
| pvarMarkerValue | PROPVARIANT* | in | マーカーに関連する追加情報を含む PROPVARIANT への省略可能なポインター。この値の意味はマーカーの種類によって異なります。このパラメーターには NULL を指定できます。 |
| pvarContextValue | PROPVARIANT* | in | MEStreamSinkMarker イベントに付加される PROPVARIANT への省略可能なポインター。この値をイベントから取得するには IMFMediaEvent::GetValue を呼び出します。呼び出し元はこの情報を任意の目的で使用できます。このパラメーターには NULL を指定できます。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| メディアシンクの Shutdown メソッドが呼び出されました。 | |
| このストリームはメディアシンクから削除されており、もはや有効ではありません。 |
解説(Remarks)
このメソッドは、ここまで (PlaceMarker の呼び出し前まで) に配信されたすべてのサンプルをストリームシンクが消費し終えた後に、ストリームシンクに MEStreamSinkMarker イベントを送信させます。
ストリームシンクが受信済みでまだレンダリングしていないサンプルを、すべて破棄させます。
戻り値
このメソッドは HRESULT を返します。取り得る値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| ストリームシンクがまだ初期化されていません。メディアタイプの設定が必要な場合があります。 | |
| メディアシンクの Shutdown メソッドが呼び出されました。 | |
| このストリームはメディアシンクから削除されており、もはや有効ではありません。 |
解説(Remarks)
以前の IMFStreamSink::ProcessSample メソッドの呼び出しによってキューに残っているサンプルがある場合、メディアシンクはそれらを処理せずに直ちに破棄します。これによりレンダリング出力にグリッチが生じる場合があります。シンクの実行状態 (実行中、一時停止、停止) は変化しません。
IMFStreamSink::PlaceMarker メソッドによる保留中のマーカーイベントは、ステータスコード E_ABORT とともに直ちにディスパッチされます。
このメソッドは同期的です。シンクが保留中のサンプルをすべて破棄するまで戻りません。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMFStreamSink "{0A97B3CF-8E7C-4A3D-8F8C-0C843DC247FB}" #usecom global IMFStreamSink IID_IMFStreamSink "{}" #comfunc global IMFStreamSink_GetMediaSink 7 sptr #comfunc global IMFStreamSink_GetIdentifier 8 var #comfunc global IMFStreamSink_GetMediaTypeHandler 9 sptr #comfunc global IMFStreamSink_ProcessSample 10 sptr #comfunc global IMFStreamSink_PlaceMarker 11 int,var,var #comfunc global IMFStreamSink_Flush 12 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IMFStreamSink "{0A97B3CF-8E7C-4A3D-8F8C-0C843DC247FB}" #usecom global IMFStreamSink IID_IMFStreamSink "{}" #comfunc global IMFStreamSink_GetMediaSink 7 sptr #comfunc global IMFStreamSink_GetIdentifier 8 sptr #comfunc global IMFStreamSink_GetMediaTypeHandler 9 sptr #comfunc global IMFStreamSink_ProcessSample 10 sptr #comfunc global IMFStreamSink_PlaceMarker 11 int,sptr,sptr #comfunc global IMFStreamSink_Flush 12 ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。