Win32 API 日本語リファレンス
ホームMedia.MediaFoundation › IMFSourceReaderEx

IMFSourceReaderEx

COM
IID7b981cf0-560e-4116-9875-b099895f23d7継承元IMFSourceReader自前メソッド開始 vtbl13

公式ドキュメント

IMFSourceReader インターフェイスを拡張します。

メソッド 4

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 13 HRESULT SetNativeMediaType(DWORD dwStreamIndex, IMFMediaType* pMediaType, DWORD* pdwStreamFlags)

メディアソース上のストリームに対してネイティブメディアタイプを設定します。

dwStreamIndexDWORDin対象ストリームのインデックス。特殊値も指定可。
pMediaTypeIMFMediaType*inoptionalメディアタイプの IMFMediaType インターフェイスへのポインター。
pdwStreamFlagsDWORD*out

次のフラグのうち 0 個以上のビットごとの OR を受け取ります。

意味
MF_SOURCE_READERF_ALLEFFECTSREMOVED
ストリームからすべてのエフェクトが削除されました。
MF_SOURCE_READERF_CURRENTMEDIATYPECHANGED
現在の出力タイプが変更されました。

戻り値

このメソッドは次のいずれかの値を返します。

戻り値 説明
S_OK
成功しました。
MF_E_INVALIDREQUEST
無効な要求です。
MF_E_INVALIDSTREAMNUMBER
dwStreamIndex パラメーターが無効です。

解説(Remarks)

このメソッドは、メディアソースが生成する出力タイプを設定します。IMFSourceReader::SetCurrentMediaType メソッドとは異なり、このメソッドはデコーダー、ビデオプロセッサー、その他のトランスフォームを一切挿入しません。メディアソースは、指定されたメディアタイプをネイティブにサポートしている必要があります。メディアソースからサポートされているタイプの一覧を取得するには、IMFSourceReader::GetNativeMediaType を呼び出します。

非同期モードでは、サンプル要求が保留中の場合、このメソッドは失敗します。その場合は、メソッドを呼び出す前に OnReadSample コールバックが呼び出されるのを待ってください。非同期モードでの Source Reader の使用について詳しくは、IMFSourceReader::ReadSample を参照してください。

このメソッドは、ストリームの出力形式の変更を引き起こす場合があります。その場合、pdwStreamFlags パラメーターで MF_SOURCE_READERF_CURRENTMEDIATYPECHANGED フラグが返されます。また、このメソッドは、IMFSourceReaderEx::AddTransformForStream メソッドによって追加されたエフェクトを Source Reader が削除する原因になることもあります。この場合、pdwStreamFlagsMF_SOURCE_READERF_ALLEFFECTSREMOVED フラグが返されます。

このメソッドは、オーディオおよびビデオのキャプチャデバイスで役立ちます。デバイスは複数の出力形式をサポートしていることがあるためです。このメソッドを使用すると、デコーダーやその他のトランスフォームが追加される前に、アプリケーションがデバイスの形式を選択できます。

vtbl 14 HRESULT AddTransformForStream(DWORD dwStreamIndex, IUnknown* pTransformOrActivate)

オーディオまたはビデオのエフェクトなどのトランスフォームをストリームに追加します。

dwStreamIndexDWORDin

構成するストリーム。値は次のいずれかを指定できます。

意味
0~0xFFFFFFFB
ストリームの 0 から始まるインデックス。
MF_SOURCE_READER_FIRST_VIDEO_STREAM
0xFFFFFFFC
最初のビデオストリーム。
MF_SOURCE_READER_FIRST_AUDIO_STREAM
0xFFFFFFFD
最初のオーディオストリーム。
pTransformOrActivateIUnknown*in

次のいずれかへのポインター:

  • IMFTransform インターフェイスを公開する Media Foundation トランスフォーム (MFT)。
  • IMFActivate インターフェイスを公開する MFT アクティブ化オブジェクト。

戻り値

このメソッドは次のいずれかの値を返します。

戻り値 説明
S_OK
成功しました。
MF_E_INVALIDMEDIATYPE
トランスフォームが現在のストリーム形式をサポートしておらず、変換も不可能でした。詳細については「解説」を参照してください。
MF_E_INVALIDREQUEST
無効な要求です。
MF_E_INVALIDSTREAMNUMBER
dwStreamIndex パラメーターが無効です。

解説(Remarks)

このメソッドは、現在の処理チェーンの末尾にトランスフォームを追加しようとします。

このメソッドを使用するには、次の順序で呼び出します。

  1. IMFSourceReader::SetCurrentMediaType を呼び出して、ストリームに必要な出力タイプを設定します。この手順では、メジャータイプとサブタイプの GUID のみを含むメディアタイプを指定できます。たとえば、32 ビット RGB 出力を取得するには、メジャータイプに MFMediaType_Video、サブタイプに MFVideoFormat_RGB32 を設定します。(詳細については、Media Type GUIDs を参照してください。)
  2. AddTransformForStream を呼び出します。Source Reader がトランスフォームの接続に成功すると、トランスフォームに出力タイプが設定されます。
  3. IMFSourceReader::GetCurrentMediaType を呼び出して、トランスフォームから出力タイプを取得します。このメソッドは、完全な形式記述を含むメディアタイプを返します。
  4. 必要に応じて、出力タイプを変更する場合は、再度 IMFSourceReader::SetCurrentMediaType を呼び出して、トランスフォームに完全なメディアタイプを設定します。
AddTransformForStream メソッドは、処理チェーンにデコーダーを挿入しません。ネイティブのストリーム形式がエンコードされており、トランスフォームが非圧縮形式を必要とする場合は、SetCurrentMediaType を呼び出して非圧縮形式を設定します (前述のリストの手順 1)。ただし、必要な場合、このメソッドは RGB 形式と YUV 形式の間で変換を行うビデオプロセッサーを挿入します。

Source Reader が MF_READWRITE_DISABLE_CONVERTERS または MF_SOURCE_READER_ENABLE_VIDEO_PROCESSING 属性で構成されている場合、このメソッドは失敗します。

非同期モードでは、サンプル要求が保留中の場合もこのメソッドは失敗します。その場合は、メソッドを呼び出す前に OnReadSample コールバックが呼び出されるのを待ってください。非同期モードでの Source Reader の使用について詳しくは、IMFSourceReader::ReadSample を参照してください。

ストリーミング中の任意のタイミングでトランスフォームを追加できます。ただし、このメソッドはトランスフォームを挿入する前にパイプラインをフラッシュまたはドレインしません。そのため、既にデータがパイプライン内にある場合、次のサンプルにトランスフォームが適用される保証はありません。

vtbl 15 HRESULT RemoveAllTransformsForStream(DWORD dwStreamIndex)

指定されたストリームについて、デコーダーを除くすべての Media Foundation トランスフォーム (MFT) を削除します。

dwStreamIndexDWORDin

MFT を削除するストリーム。値は次のいずれかを指定できます。

意味
0~0xFFFFFFFB
ストリームの 0 から始まるインデックス。
MF_SOURCE_READER_FIRST_VIDEO_STREAM
0xFFFFFFFC
最初のビデオストリーム。
MF_SOURCE_READER_FIRST_AUDIO_STREAM
0xFFFFFFFD
最初のオーディオストリーム。

戻り値

このメソッドは次のいずれかの値を返します。

戻り値 説明
S_OK
成功しました。
MF_E_INVALIDREQUEST
無効な要求です。
MF_E_INVALIDSTREAMNUMBER
dwStreamIndex パラメーターが無効です。

解説(Remarks)

このメソッドを呼び出すと、ストリームの現在の出力タイプがリセットされる場合があります。新しい出力タイプを取得するには、IMFSourceReader::GetCurrentMediaType を呼び出します。

非同期モードでは、サンプル要求が保留中の場合、このメソッドは失敗します。その場合は、メソッドを呼び出す前に OnReadSample コールバックが呼び出されるのを待ってください。非同期モードでの Source Reader の使用について詳しくは、IMFSourceReader::ReadSample を参照してください。

vtbl 16 HRESULT GetTransformForStream(DWORD dwStreamIndex, DWORD dwTransformIndex, GUID* pGuidCategory, IMFTransform** ppTransform)

指定されたストリームの Media Foundation トランスフォーム (MFT) へのポインターを取得します。(IMFSourceReaderEx.GetTransformForStream)

dwStreamIndexDWORDin

MFT を照会するストリーム。値は次のいずれかを指定できます。

意味
0~0xFFFFFFFB
ストリームの 0 から始まるインデックス。
MF_SOURCE_READER_FIRST_VIDEO_STREAM
0xFFFFFFFC
最初のビデオストリーム。
MF_SOURCE_READER_FIRST_AUDIO_STREAM
0xFFFFFFFD
最初のオーディオストリーム。
dwTransformIndexDWORDin取得する MFT の 0 から始まるインデックス。
pGuidCategoryGUID*outoptionalMFT のカテゴリを指定する GUID を受け取ります。指定可能な値の一覧については、MFT_CATEGORY を参照してください。
ppTransformIMFTransform**outMFT の IMFTransform インターフェイスへのポインターを受け取ります。呼び出し元はこのインターフェイスを解放する必要があります。

戻り値

このメソッドは次のいずれかの値を返します。

戻り値 説明
S_OK
成功しました。
MF_E_INVALIDINDEX
dwTransformIndex パラメーターが範囲外です。
MF_E_INVALIDSTREAMNUMBER
dwStreamIndex パラメーターが無効です。

解説(Remarks)

このメソッドを使用すると、処理チェーンに挿入された後の MFT を構成できます。ppTransform で返されるポインターを使用して、MFT にメディアタイプを設定したり、データを処理したりしないでください。特に、次の IMFTransform メソッドのいずれかを呼び出すと、予期しない結果になる可能性があります。

デコーダーが存在する場合は、インデックス位置 0 に現れます。

データを失わないようにするには、このメソッドを呼び出す前に Source Reader をドレインしてください。詳細については、Draining the Data Pipeline を参照してください。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
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 指定が可能。