IMFSourceReaderEx
COM公式ドキュメント
IMFSourceReader インターフェイスを拡張します。
メソッド 4
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
メディアソース上のストリームに対してネイティブメディアタイプを設定します。
| dwStreamIndex | DWORD | in | 対象ストリームのインデックス。特殊値も指定可。 | ||||||
| pMediaType | IMFMediaType* | inoptional | メディアタイプの IMFMediaType インターフェイスへのポインター。 | ||||||
| pdwStreamFlags | DWORD* | out | 次のフラグのうち 0 個以上のビットごとの OR を受け取ります。
|
戻り値
このメソッドは次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| 無効な要求です。 | |
| dwStreamIndex パラメーターが無効です。 |
解説(Remarks)
このメソッドは、メディアソースが生成する出力タイプを設定します。IMFSourceReader::SetCurrentMediaType メソッドとは異なり、このメソッドはデコーダー、ビデオプロセッサー、その他のトランスフォームを一切挿入しません。メディアソースは、指定されたメディアタイプをネイティブにサポートしている必要があります。メディアソースからサポートされているタイプの一覧を取得するには、IMFSourceReader::GetNativeMediaType を呼び出します。
非同期モードでは、サンプル要求が保留中の場合、このメソッドは失敗します。その場合は、メソッドを呼び出す前に OnReadSample コールバックが呼び出されるのを待ってください。非同期モードでの Source Reader の使用について詳しくは、IMFSourceReader::ReadSample を参照してください。
このメソッドは、ストリームの出力形式の変更を引き起こす場合があります。その場合、pdwStreamFlags パラメーターで MF_SOURCE_READERF_CURRENTMEDIATYPECHANGED フラグが返されます。また、このメソッドは、IMFSourceReaderEx::AddTransformForStream メソッドによって追加されたエフェクトを Source Reader が削除する原因になることもあります。この場合、pdwStreamFlags で MF_SOURCE_READERF_ALLEFFECTSREMOVED フラグが返されます。
このメソッドは、オーディオおよびビデオのキャプチャデバイスで役立ちます。デバイスは複数の出力形式をサポートしていることがあるためです。このメソッドを使用すると、デコーダーやその他のトランスフォームが追加される前に、アプリケーションがデバイスの形式を選択できます。
オーディオまたはビデオのエフェクトなどのトランスフォームをストリームに追加します。
| dwStreamIndex | DWORD | in | 構成するストリーム。値は次のいずれかを指定できます。
| ||||||||
| pTransformOrActivate | IUnknown* | in | 次のいずれかへのポインター:
|
戻り値
このメソッドは次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| トランスフォームが現在のストリーム形式をサポートしておらず、変換も不可能でした。詳細については「解説」を参照してください。 | |
| 無効な要求です。 | |
| dwStreamIndex パラメーターが無効です。 |
解説(Remarks)
このメソッドは、現在の処理チェーンの末尾にトランスフォームを追加しようとします。
このメソッドを使用するには、次の順序で呼び出します。
- IMFSourceReader::SetCurrentMediaType を呼び出して、ストリームに必要な出力タイプを設定します。この手順では、メジャータイプとサブタイプの GUID のみを含むメディアタイプを指定できます。たとえば、32 ビット RGB 出力を取得するには、メジャータイプに MFMediaType_Video、サブタイプに MFVideoFormat_RGB32 を設定します。(詳細については、Media Type GUIDs を参照してください。)
- AddTransformForStream を呼び出します。Source Reader がトランスフォームの接続に成功すると、トランスフォームに出力タイプが設定されます。
- IMFSourceReader::GetCurrentMediaType を呼び出して、トランスフォームから出力タイプを取得します。このメソッドは、完全な形式記述を含むメディアタイプを返します。
- 必要に応じて、出力タイプを変更する場合は、再度 IMFSourceReader::SetCurrentMediaType を呼び出して、トランスフォームに完全なメディアタイプを設定します。
Source Reader が MF_READWRITE_DISABLE_CONVERTERS または MF_SOURCE_READER_ENABLE_VIDEO_PROCESSING 属性で構成されている場合、このメソッドは失敗します。
非同期モードでは、サンプル要求が保留中の場合もこのメソッドは失敗します。その場合は、メソッドを呼び出す前に OnReadSample コールバックが呼び出されるのを待ってください。非同期モードでの Source Reader の使用について詳しくは、IMFSourceReader::ReadSample を参照してください。
ストリーミング中の任意のタイミングでトランスフォームを追加できます。ただし、このメソッドはトランスフォームを挿入する前にパイプラインをフラッシュまたはドレインしません。そのため、既にデータがパイプライン内にある場合、次のサンプルにトランスフォームが適用される保証はありません。
指定されたストリームについて、デコーダーを除くすべての Media Foundation トランスフォーム (MFT) を削除します。
| dwStreamIndex | DWORD | in | MFT を削除するストリーム。値は次のいずれかを指定できます。
|
戻り値
このメソッドは次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| 無効な要求です。 | |
| dwStreamIndex パラメーターが無効です。 |
解説(Remarks)
このメソッドを呼び出すと、ストリームの現在の出力タイプがリセットされる場合があります。新しい出力タイプを取得するには、IMFSourceReader::GetCurrentMediaType を呼び出します。
非同期モードでは、サンプル要求が保留中の場合、このメソッドは失敗します。その場合は、メソッドを呼び出す前に OnReadSample コールバックが呼び出されるのを待ってください。非同期モードでの Source Reader の使用について詳しくは、IMFSourceReader::ReadSample を参照してください。
指定されたストリームの Media Foundation トランスフォーム (MFT) へのポインターを取得します。(IMFSourceReaderEx.GetTransformForStream)
| dwStreamIndex | DWORD | in | MFT を照会するストリーム。値は次のいずれかを指定できます。
| ||||||||
| dwTransformIndex | DWORD | in | 取得する MFT の 0 から始まるインデックス。 | ||||||||
| pGuidCategory | GUID* | outoptional | MFT のカテゴリを指定する GUID を受け取ります。指定可能な値の一覧については、MFT_CATEGORY を参照してください。 | ||||||||
| ppTransform | IMFTransform** | out | MFT の IMFTransform インターフェイスへのポインターを受け取ります。呼び出し元はこのインターフェイスを解放する必要があります。 |
戻り値
このメソッドは次のいずれかの値を返します。
| 戻り値 | 説明 |
|---|---|
| 成功しました。 | |
| dwTransformIndex パラメーターが範囲外です。 | |
| dwStreamIndex パラメーターが無効です。 |
解説(Remarks)
このメソッドを使用すると、処理チェーンに挿入された後の MFT を構成できます。ppTransform で返されるポインターを使用して、MFT にメディアタイプを設定したり、データを処理したりしないでください。特に、次の IMFTransform メソッドのいずれかを呼び出すと、予期しない結果になる可能性があります。
- AddInputStreams
- DeleteInputStream
- ProcessEvent
- ProcessInput
- ProcessMessage
- ProcessOutput
- SetInputType
- SetOutputType
データを失わないようにするには、このメソッドを呼び出す前に Source Reader をドレインしてください。詳細については、Draining the Data Pipeline を参照してください。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMFSourceReaderEx "{7B981CF0-560E-4116-9875-B099895F23D7}" #usecom global IMFSourceReaderEx IID_IMFSourceReaderEx "{}" #comfunc global IMFSourceReaderEx_SetNativeMediaType 13 int,sptr,var #comfunc global IMFSourceReaderEx_AddTransformForStream 14 int,sptr #comfunc global IMFSourceReaderEx_RemoveAllTransformsForStream 15 int #comfunc global IMFSourceReaderEx_GetTransformForStream 16 int,int,var,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IMFSourceReaderEx "{7B981CF0-560E-4116-9875-B099895F23D7}" #usecom global IMFSourceReaderEx IID_IMFSourceReaderEx "{}" #comfunc global IMFSourceReaderEx_SetNativeMediaType 13 int,sptr,sptr #comfunc global IMFSourceReaderEx_AddTransformForStream 14 int,sptr #comfunc global IMFSourceReaderEx_RemoveAllTransformsForStream 15 int #comfunc global IMFSourceReaderEx_GetTransformForStream 16 int,int,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。