IMFMediaStream
COM公式ドキュメント
メディアソース内の 1 つのストリームを表します。
解説(Remarks)
ストリームは、メディアソースが開始されたときに作成されます。各ストリームについて、メディアソースはストリームの IMFMediaStream インターフェイスへのポインターを伴う MENewStream イベントを送信します。
メソッド 3
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
このメディアストリームを作成したメディアソースへのポインターを取得します。
| ppMediaSource | IMFMediaSource** | out | メディアソースの IMFMediaSource インターフェイスへのポインターを受け取ります。呼び出し元はこのインターフェイスを解放する必要があります。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドが成功しました。 | |
| メディアソースの Shutdown メソッドが呼び出されています。 |
このメディアストリームのストリーム記述子を取得します。
| ppStreamDescriptor | IMFStreamDescriptor** | out | IMFStreamDescriptor インターフェイスへのポインターを受け取ります。呼び出し元はこのインターフェイスを解放する必要があります。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドが成功しました。 | |
| メディアソースの Shutdown メソッドが呼び出されています。 |
解説(Remarks)
ストリーム記述子を変更しないでください。プレゼンテーションを変更するには、IMFMediaSource::CreatePresentationDescriptor を呼び出し、プレゼンテーション記述子を変更してください。
メディアソースにサンプルを要求します。
| pToken | IUnknown* | in | 要求のトークンとして使用されるオブジェクトの IUnknown インターフェイスへのポインター。呼び出し元はこのオブジェクトを実装する必要があります。このパラメーターは NULL にすることができます。「解説」を参照してください。 |
戻り値
このメソッドは HRESULT を返します。取り得る値には、次の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドが成功しました。 | |
| ストリームの終端に達しました。 | |
| メディアソースが停止しています。 | |
| ソースの Shutdown メソッドが呼び出されています。 |
解説(Remarks)
pToken が NULL でない場合、メディアストリームは pToken に対して AddRef を呼び出し、そのトークンを先入れ先出し (FIFO) キューに配置します。
次のサンプルが利用可能になると、メディアストリームは次の処理を行います。
- キューから最初のトークンを取り出します。
- メディアサンプルに MFSampleExtension_Token 属性を設定します。属性データはトークンオブジェクトへのポインターです。
- MEMediaSample イベントを送信します。イベントデータはメディアサンプルの IMFSample インターフェイスへのポインターです。
- トークンに対して Release を呼び出します。
呼び出し元は要求トークンの参照カウントを監視する必要があります。メディアストリームが MEMediaSample イベントを送信した場合は、サンプルから MFSampleExtension_Token 属性を取得し、その属性値をトークンと照合します。トークンの参照カウントがゼロになったにもかかわらず MEMediaSample イベントを受信していない場合は、その要求が破棄されたことを意味します。
Media Foundation パイプラインはマルチスレッドであるため、ソースの RequestSample メソッドはソースが停止した後に呼び出される可能性があります。メディアソースが停止している場合、このメソッドは MF_E_MEDIA_SOURCE_WRONGSTATE を返す必要があります。パイプラインはこの戻り値をエラー状態として扱いません。ソースがこれ以外のエラーコードを返した場合、パイプラインはそれを致命的なエラーとして扱い、セッションを停止します。
メディアソースが一時停止している場合、このメソッドは成功しますが、ソースが再び開始されるまでストリームはサンプルを配信しません。
メディアソースがデータの処理中に非同期でエラーに遭遇した場合は、次のいずれかの方法(両方ではなく)でエラーを通知する必要があります。
- 次の RequestSample 呼び出しからエラーコードを返します。
- MEError イベントを送信します。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMFMediaStream "{D182108F-4EC6-443F-AA42-A71106EC825F}"
#usecom global IMFMediaStream IID_IMFMediaStream "{}"
#comfunc global IMFMediaStream_GetMediaSource 7 sptr
#comfunc global IMFMediaStream_GetStreamDescriptor 8 sptr
#comfunc global IMFMediaStream_RequestSample 9 sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。