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

IMFDeviceTransform

COM
IIDd818fbd8-fc46-42f2-87ac-1ea2d1f9bf32継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

このセクションでは、IMFDeviceTransform インターフェイスのリファレンス情報を扱います。

メソッド 20

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

vtbl 3 HRESULT InitializeTransform(IMFAttributes* pAttributes)

InitializeTransform は、Device MFT を初期化するために呼び出されます。

pAttributesIMFAttributes*in

初期化パラメーターを含む属性へのポインターを格納します。これはキャプチャ パイプラインから渡されます。次の属性値が関数に渡されます。

属性キー 説明
MF_DEVICEMFT_CONNECTED_FILTER_KSCONTROL
直前の DeviceTransform オブジェクトの IKsControl インターフェイスです。有効なパイプラインの作成に必要な情報を取得するために使用され、IMFDeviceTransform も実装します。
MF_DEVSOURCE_ATTRIBUTE_SOURCE_TYPE_VIDCAP_SYMBOLIC_LINK
ビデオ キャプチャ ドライバーのシンボリック リンクを表します。
MF_DEVSOURCE_ATTRIBUTE_FRIENDLY_NAME
デバイスの表示名を指定します。表示名は人間が読める文字列で、ユーザー インターフェイスでの表示に適しています。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。

戻り値 説明
S_OK
初期化に成功しました。
MF_E_INVALIDREQUEST
Device MFT は現時点でこの要求をサポートできませんでした。

解説(Remarks)

Device MFT はこの関数を利用して、さまざまな内部オブジェクトや状態を初期化できます。パイプラインは、入力の IMFAttributes パラメーターを使用して、特定の構成情報を Device MFT に伝えることもできます。

vtbl 4 HRESULT GetInputAvailableType(DWORD dwInputStreamID, DWORD dwTypeIndex, IMFMediaType** pMediaType)

GetInputAvailableType メソッドは、この Media Foundation Transform (MFT) の入力ストリームに対して利用可能なメディア タイプを取得します。

dwInputStreamIDDWORDin入力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFDeviceTransform::GetStreamID を呼び出します。
dwTypeIndexDWORDin取得するメディア タイプのインデックスです。メディア タイプは 0 から始まるインデックスが付けられ、おおよその優先順位で返されます。
pMediaTypeIMFMediaType**outIMFMediaType インターフェイスへのポインターを受け取ります。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。

戻り値 説明
S_OK
初期化に成功しました。
MF_E_INVALIDREQUEST
Device MFT は現時点でこの要求をサポートできませんでした。
MF_E_INVALIDSTREAMNUMBER
ストリーム ID が有効ではありません。
MF_E_NO_MORE_TYPES
指定されたインデックスに利用可能なメディア タイプがありません。

解説(Remarks)

MFT は入力ストリームごとに利用可能なメディア タイプの一覧を定義し、優先順位で並べます。このメソッドは、入力ストリームで利用可能なメディア タイプを列挙します。利用可能なタイプを列挙するには、メソッドが MF_E_NO_MORE_TYPES を返すまで dwTypeIndex をインクリメントします。

実装上の注意

MFT がメディア タイプを内部に保持している場合、MFT は元のタイプへのポインターではなく、メディア タイプのクローンを返す必要があります。そうしないと、呼び出し元がそのタイプを変更し、MFT の内部状態を変えてしまう可能性があります。
vtbl 5 HRESULT GetInputCurrentType(DWORD dwInputStreamID, IMFMediaType** pMediaType)

GetInputCurrentType メソッドは、この Media Foundation Transform (MFT) の入力ストリームに対する現在のメディア タイプを取得します。

dwInputStreamIDDWORDin入力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFDeviceTransform::GetStreamIDs を呼び出します。
pMediaTypeIMFMediaType**outそのストリームが使用している現在のタイプを表す IMFMediaType インターフェイスへのポインターを受け取ります。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。

戻り値 説明
S_OK
初期化に成功しました。
MF_E_INVALIDREQUEST
Device MFT は現時点でこの要求をサポートできませんでした。
MF_E_INVALIDSTREAMNUMBER
ストリーム ID が有効ではありません。
MF_E_NO_MORE_TYPES
指定されたインデックスに利用可能なメディア タイプがありません。
MF_E_TRANSFORM_TYPE_NOT_SET
メディア タイプがまだ設定されていません。

解説(Remarks)

指定した入力ストリームにまだメディア タイプが設定されていない場合、このメソッドは MF_E_TRANSFORM_TYPE_NOT_SET を返します。

実装上の注意

MFT は、元のタイプへのポインターではなく、メディア タイプのクローンを返す必要があります。そうしないと、呼び出し元がそのタイプを変更し、MFT の内部状態を変えてしまう可能性があります。
vtbl 6 HRESULT GetInputStreamAttributes(DWORD dwInputStreamID, IMFAttributes** ppAttributes)

GetInputStreamAttributes メソッドは、この Media Foundation Transform (MFT) の入力ストリームに対する属性ストアを取得します。

dwInputStreamIDDWORDin状態を取得する対象の入力ストリームのストリーム ID です。
ppAttributesIMFAttributes**outIMFAttributes インターフェイスへのポインターを受け取ります。呼び出し元はこのインターフェイスを解放する必要があります。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。

戻り値 説明
S_OK
ストリーム状態の遷移に成功しました。
MF_E_INVALIDREQUEST
Device MFT は現時点でこの要求をサポートできませんでした。
MF_E_INVALIDSTREAMNUMBER
ストリーム ID が有効ではありません。

解説(Remarks)

このメソッドは、特定の入力ストリームの属性ストアを取得するために DTM によって使用されます。

vtbl 7 HRESULT GetOutputAvailableType(DWORD dwOutputStreamID, DWORD dwTypeIndex, IMFMediaType** pMediaType)

GetOutputAvailableType メソッドは、この Media Foundation Transform (MFT) の出力ストリームに対して利用可能なメディア タイプを取得します。

dwOutputStreamIDDWORDin出力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFDeviceTransform::GetStreamIDs を呼び出します。
dwTypeIndexDWORDin取得するメディア タイプのインデックスです。メディア タイプは 0 から始まるインデックスが付けられ、おおよその優先順位で返されます。
pMediaTypeIMFMediaType**outIMFMediaType インターフェイスへのポインターを受け取ります。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。

戻り値 説明
S_OK
初期化に成功しました。
MF_E_INVALIDREQUEST
Device MFT は現時点でこの要求をサポートできませんでした。
MF_E_INVALIDSTREAMNUMBER
ストリーム ID が有効ではありません。
MF_E_NO_MORE_TYPES
指定されたインデックスに利用可能なメディア タイプがありません。

解説(Remarks)

MFT は出力ストリームごとに利用可能なメディア タイプの一覧を定義し、優先順位で並べます。

このメソッドは、出力ストリームで利用可能なメディア タイプを列挙します。利用可能なタイプを列挙するには、メソッドが MF_E_NO_MORE_TYPES を返すまで dwTypeIndex をインクリメントします。

実装上の注意

MFT がメディア タイプを内部に保持している場合、MFT は元のタイプへのポインターではなく、メディア タイプのクローンを返す必要があります。そうしないと、呼び出し元がそのタイプを変更し、MFT の内部状態を変えてしまう可能性があります。
vtbl 8 HRESULT GetOutputCurrentType(DWORD dwOutputStreamID, IMFMediaType** pMediaType)

GetOutputCurrentType メソッドは、この Media Foundation Transform (MFT) の出力ストリームに対する現在のメディア タイプを取得します。

dwOutputStreamIDDWORDin出力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFDeviceTransform::GetStreamIDs を呼び出します。
pMediaTypeIMFMediaType**outそのストリームが使用している現在のタイプを表す IMFMediaType インターフェイスへのポインターを受け取ります。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。

戻り値 説明
S_OK
初期化に成功しました。
MF_E_INVALIDREQUEST
Device MFT は現時点でこの要求をサポートできませんでした。
MF_E_INVALIDSTREAMNUMBER
ストリーム ID が有効ではありません。
MF_E_NO_MORE_TYPES
指定されたインデックスに利用可能なメディア タイプがありません。
MF_E_TRANSFORM_TYPE_NOT_SET
メディア タイプがまだ設定されていません。

解説(Remarks)

指定した出力ストリームにまだメディア タイプが設定されていない場合、このメソッドは MF_E_TRANSFORM_TYPE_NOT_SET を返します。

実装上の注意

MFT は、元のタイプへのポインターではなく、メディア タイプのクローンを返す必要があります。そうしないと、呼び出し元がそのタイプを変更し、MFT の内部状態を変えてしまう可能性があります。
vtbl 9 HRESULT GetOutputStreamAttributes(DWORD dwOutputStreamID, IMFAttributes** ppAttributes)

GetOutputStreamAttributes メソッドは、この Media Foundation Transform (MFT) の出力ストリームに対する属性ストアを取得します。

dwOutputStreamIDDWORDin状態を取得する対象の出力ストリームのストリーム ID です。
ppAttributesIMFAttributes**outIMFAttributes インターフェイスへのポインターを受け取ります。呼び出し元はこのインターフェイスを解放する必要があります。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。

戻り値 説明
S_OK
初期化に成功しました。
MF_E_INVALIDREQUEST
Device MFT は現時点でこの要求をサポートできませんでした。
MF_E_INVALIDSTREAMNUMBER
無効なストリーム ID が渡された場合に返されます。

解説(Remarks)

この関数は、特定の出力ストリームの属性ストアを取得するために DTM によって使用されます。

vtbl 10 HRESULT GetStreamCount(DWORD* pcInputStreams, DWORD* pcOutputStreams)

GetStreamCount メソッドは、この Media Foundation Transform (MFT) の入力ストリームと出力ストリームの現在の数を取得します。

pcInputStreamsDWORD*out入力ストリームの数を受け取ります。
pcOutputStreamsDWORD*out出力ストリームの数を受け取ります。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。

戻り値 説明
S_OK
ストリーム状態の遷移に成功しました。
E_POINTER
無効なポインターが渡されました。

解説(Remarks)

この関数は、Device MFT がサポートするストリームの数を取得するために DTM によって使用されます。ストリームの数には、選択されていないストリーム (たとえば、メディア タイプがない、または NULL のメディア タイプを持つストリームなど) も含まれます。

このメソッドは NULL パラメーターで呼び出されることはありません。

vtbl 11 HRESULT GetStreamIDs(DWORD dwInputIDArraySize, DWORD* pdwInputStreamIds, DWORD dwOutputIDArraySize, DWORD* pdwOutputStreamIds)

GetStreamIDs メソッドは、この Media Foundation Transform (MFT) の入力ストリームおよび出力ストリームのストリーム識別子を取得します。

dwInputIDArraySizeDWORDinpdwInputStreamIDs の要素数です。
pdwInputStreamIdsDWORD*out

呼び出し元が割り当てた配列へのポインターです。このメソッドは、入力ストリーム識別子で配列を埋めます。配列のサイズは、少なくとも入力ストリームの数と等しくなければなりません。入力ストリームの数を取得するには、IMFDeviceTransform::GetStreamCount を呼び出します。

呼び出し元が入力ストリームの数より大きい配列を渡した場合、MFT は余分な配列エントリに値を書き込んではなりません。

dwOutputIDArraySizeDWORDinpdwOutputStreamIDs の要素数です。
pdwOutputStreamIdsDWORD*out呼び出し元が割り当てた配列へのポインターです。このメソッドは、出力ストリーム識別子で配列を埋めます。配列のサイズは、少なくとも出力ストリームの数と等しくなければなりません。出力ストリームの数を取得するには、IMFDeviceTransform::GetStreamCount を呼び出します。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。

戻り値 説明
S_OK
ストリーム状態の遷移に成功しました。
E_POINTER
無効なポインターが渡されました。
MF_E_BUFFERTOOSMALL
渡されたバッファーには、ストリーム ID を書き込むのに十分な空きがありません。

解説(Remarks)

一部の MFT はストリームを追加または削除できるため、ストリームのインデックスが一意にならない場合があります。そのため、ストリーム識別子が必要です。したがって、ストリームを操作する IMFDeviceTransform メソッドはストリーム識別子を受け取ります。

すべての入力ストリーム識別子は MFT 内で一意でなければならず、すべての出力ストリーム識別子も一意でなければなりません。ただし、入力ストリームと出力ストリームは同じ識別子を共有できます。 I

クライアントが入力ストリームを追加する場合、クライアントが識別子を割り当てるため、MFT は一意である限り任意の識別子を許容しなければなりません。MFT が出力ストリームを作成する場合、MFT が識別子を割り当てます。

慣例として、MFT が固定の入力ストリーム 1 つと固定の出力ストリーム 1 つだけを持つ場合、両方のストリームに識別子 0 を割り当てるべきです。

vtbl 12 HRESULT ProcessEvent(DWORD dwInputStreamID, IMFMediaEvent* pEvent)

ProcessEvent メソッドは、この Media Foundation Transform (MFT) の入力ストリームにイベントを送信します。

dwInputStreamIDDWORDinストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFDeviceTransform::GetStreamIDs を呼び出します。
pEventIMFMediaEvent*inイベント オブジェクトの IMFMediaEvent インターフェイスへのポインターです。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。

戻り値 説明
S_OK
イベントは正常に処理されました。イベントは下流に伝播されます。
MF_E_INVALIDSTREAMNUMBER
無効なストリーム ID が渡されました。
MF_S_TRANSFORM_DO_NO_PROPOGATE_EVENT
Device MFT がイベントをこれ以上伝播させないことを望んでいることを示します。
E_NOTIMPL
関数が実装されていません。

解説(Remarks)

MFT は、イベントの下流への送信を自身で処理することも、DTM に任せることもできます。これは戻り値によって示されます。

イベントを下流に送信するには、クライアントが IMFTransform::ProcessOutput を呼び出したときに MFT_OUTPUT_DATA_BUFFER 構造体の pEvents メンバーでクライアントが提供するコレクション オブジェクトに、MFT がイベントを追加します。

イベントは、その前後に来るサンプルとシリアル化する必要があります。イベントの後に続く出力サンプルにイベントを付加してください (パイプラインはまずイベントを処理し、その後にサンプルを処理します)。MFT が IMFTransform::ProcessInputIMFTransform::ProcessOutput の呼び出し間で 1 つ以上のサンプルを保持している場合、この状況ではパイプラインが入力サンプルと出力サンプルを対応付けられないため、MFT がすべてのイベントの下流への送信を処理する必要があります。

MFT がサンプルを保持せず、いかなるイベントも確認する必要がない場合は、E_NOTIMPL を返すことができます。

vtbl 13 HRESULT ProcessInput(DWORD dwInputStreamID, IMFSample* pSample, DWORD dwFlags)

ProcessInput メソッドは、この Media Foundation Transform (MFT) の入力ストリームにデータを配信します。

dwInputStreamIDDWORDin入力ストリーム識別子です。
pSampleIMFSample*in入力サンプルの IMFSample インターフェイスへのポインターです。サンプルには、有効な入力データを含むメディア バッファーが少なくとも 1 つ含まれている必要があります。
dwFlagsDWORDinゼロにする必要があります。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
E_INVALIDARG
無効な引数が渡されました。
MF_E_INVALIDREQUEST
Device MFT は現時点でこの要求をサポートできませんでした。
MF_E_INVAILIDSTREAMNUMBER
無効なストリーム ID が渡されました。
MF_E_INVALID_STREAM_STATE
要求されたストリーム遷移は実行できません。
MF_E_TRANSFORM_TYPE_NOT_SET
入力メディア タイプが設定されていません。

解説(Remarks)

ほとんどの場合、メソッドが成功すると、MFT はサンプルを保存し、IMFSample ポインターの参照カウントを保持します。MFT がサンプルの使用を終えたら、メモリ リークを防ぐためにこれを解放する必要があります。

DTM がすべてのストリームに有効なメディア タイプを設定した後は、MFT は常により多くの入力を受け入れることができ、より多くの出力を生成できる状態でなければなりません。

MFT が入力データで致命的でないエラーに遭遇した場合は、単にそのデータを破棄し、次の入力データを取得したときに回復を試みることができます。MFT がデータを破棄した場合は、データ ストリームにギャップがあることを呼び出し元に通知するため、次の出力サンプルに MFSampleExtension_Discontinuity 属性を設定する必要があります。

vtbl 14 HRESULT ProcessMessage(MFT_MESSAGE_TYPE eMessage, UINT_PTR ulParam)

ProcessMessage メソッドは、Device Media Foundation Transform (MFT) にメッセージを送信します。

eMessageMFT_MESSAGE_TYPEin送信するメッセージです。MFT_MESSAGE_TYPE 列挙型のメンバーとして指定します。
ulParamUINT_PTRinメッセージ パラメーターです。このパラメーターの意味はメッセージの種類によって異なります。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
E_INVALIDARG
無効な引数が渡されました。
MF_E_INVALIDREQUEST
Device MFT は現時点でこの要求をサポートできませんでした。
MF_E_INVAILIDSTREAMNUMBER
無効なストリーム ID が渡されました。
MF_E_INVALID_STREAM_STATE
要求されたストリーム遷移は実行できません。
MF_E_TRANSFORM_TYPE_NOT_SET
入力メディア タイプが設定されていません。

解説(Remarks)

このメソッドを呼び出す前に、すべての入力ストリームと出力ストリームにメディア タイプを設定してください。

MFT は特定のメッセージ タイプを無視する場合があります。その場合、メソッドは S_OK を返します。エラー コードは、トランスフォームがこのメッセージ タイプを処理するものの、この場合はメッセージを処理できなかったことを示します。

詳細については、MFT_MESSAGE_TYPE を参照してください。

vtbl 15 HRESULT ProcessOutput(DWORD dwFlags, DWORD cOutputBufferCount, MFT_OUTPUT_DATA_BUFFER* pOutputSample, DWORD* pdwStatus)

ProcessOutput メソッドは、Device MFT の出力ストリームから処理済みの出力を取得します。

dwFlagsDWORDin_MFT_PROCESS_OUTPUT_FLAGS 列挙型からの 0 個以上のフラグのビットごとの OR です。
cOutputBufferCountDWORDinpOutputSamples 配列の要素数です。値は少なくとも 1 でなければなりません。
pOutputSampleMFT_OUTPUT_DATA_BUFFER*inout呼び出し元が割り当てた MFT_OUTPUT_DATA_BUFFER 構造体の配列へのポインターです。MFT はこの配列を使用して、呼び出し元に出力データを返します。
pdwStatusDWORD*out_MFT_PROCESS_OUTPUT_STATUS 列挙型からの 0 個以上のフラグのビットごとの OR を受け取ります。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
E_INVALIDARG
無効な引数が渡されました。
MF_E_INVALIDREQUEST
Device MFT は現時点でこの要求をサポートできませんでした。
MF_E_INVAILIDSTREAMNUMBER
無効なストリーム ID が渡されました。
MF_E_INVALID_STREAM_STATE
要求されたストリーム遷移は実行できません。
MF_E_TRANSFORM_TYPE_NOT_SET
入力メディア タイプが設定されていません。

解説(Remarks)

ほとんどの場合、メソッドが成功すると、Media Foundation Transform (MFT) はサンプルを保存し、IMFSample ポインターの参照カウントを保持します。MFT がサンプルの使用を終えたら、メモリ リークを防ぐためにこれを解放する必要があります。

device transform manager (DTM) がすべてのストリームに有効なメディア タイプを設定した後は、MFT は常により多くの入力を受け入れることができ、より多くの出力を生成できる状態でなければなりません。

MFT が入力データで致命的でないエラーに遭遇した場合は、単にそのデータを破棄し、次の入力データを取得したときに回復を試みることができます。MFT がデータを破棄した場合は、データ ストリームにギャップがあることを呼び出し元に通知するため、次の出力サンプルに MFSampleExtension_Discontinuity 属性を設定する必要があります。

vtbl 16 HRESULT SetInputStreamState(DWORD dwStreamID, IMFMediaType* pMediaType, DeviceStreamState value, DWORD dwFlags)

SetInputStreamState メソッドは、Device MFT の入力ストリームの状態とメディア タイプを設定します。

dwStreamIDDWORDin状態とメディア タイプを変更する対象の入力ストリームのストリーム ID です。
pMediaTypeIMFMediaType*in入力ストリームの優先メディア タイプは、このパラメーターを通じて渡されます。Device MFT は、渡されたメディア タイプが現在のメディア タイプと異なる場合にのみメディア タイプを変更する必要があります。
valueDeviceStreamStatein入力ストリームが遷移すべき DeviceStreamState を指定します。
dwFlagsDWORDinS_OK が返された場合は、状態変更操作を実行します。それ以外の場合、これには devproxy の出力ピンにメディア タイプを設定する際に発生したエラーが含まれます。その場合は、エラーを適切に伝播してください。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。

戻り値 説明
S_OK
初期化に成功しました。
MF_E_INVALIDREQUEST
Device MFT は現時点でこの要求をサポートできませんでした。
MF_E_INVAILIDSTREAMNUMBER
無効なストリーム ID が渡されました。
MF_E_INVALID_STREAM_STATE
要求されたストリーム遷移は実行できません。

解説(Remarks)

このインターフェイス関数は、入力ストリームを、指定されたメディア タイプが設定された指定の状態へ遷移させるのに役立ちます。これは、Device MFT が特定の入力ストリームの状態とメディア タイプの変更を要求したときに device transform manager (DTM) によって使用されます。Device MFT は、その出力の 1 つが変化したときに、このような変更を要求する必要があります。

例として、2 つの入力ストリームと 3 つの出力ストリームを持つ Device MFT を考えます。Output 1 と Output 2 が Input 1 をソースとし、720p でストリーミングしているとします。ここで、Output 2 のメディア タイプが 1080p に変わった場合、Device MFT は Input 1 のメディア タイプを 1080p に変更しなければなりません。これを実現するには、Device MFT は METransformInputStreamStateChanged メッセージを使用して、このメソッドを呼び出すよう DTM に要求する必要があります。

vtbl 17 HRESULT GetInputStreamState(DWORD dwStreamID, DeviceStreamState* value)

GetInputStreamState メソッドは、Device MFT の入力ストリームの状態を取得します。

dwStreamIDDWORDin状態を取得する対象の入力ストリームのストリーム ID です。
valueDeviceStreamState*out指定された入力 Device MFT ストリームの現在の DeviceStreamState を指定します。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。

戻り値 説明
S_OK
ストリーム状態の遷移に成功しました。
MF_E_INVALIDREQUEST
Device MFT は現時点でこの要求をサポートできませんでした。
MF_E_INVAILIDSTREAMNUMBER
無効なストリーム ID が渡されました。

解説(Remarks)

このメソッドは、特定の入力ストリームの状態を取得するために device transform manager (DTM) によって使用されます。

vtbl 18 HRESULT SetOutputStreamState(DWORD dwStreamID, IMFMediaType* pMediaType, DeviceStreamState value, DWORD dwFlags)

SetOutputStreamState メソッドは、Device MFT の出力ストリームの状態とメディア タイプを設定します。

dwStreamIDDWORDin状態とメディア タイプを変更する対象の入力ストリームのストリーム ID です。
pMediaTypeIMFMediaType*in入力ストリームの優先メディア タイプは、このパラメーターを通じて渡されます。Device MFT は、渡されたメディア タイプが現在のメディア タイプと異なる場合にのみメディア タイプを変更する必要があります。
valueDeviceStreamStatein入力ストリームが遷移すべき DeviceStreamState を指定します。
dwFlagsDWORDinゼロにする必要があります。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。

戻り値 説明
S_OK
ストリーム状態の遷移に成功しました。
MF_E_INVALIDREQUEST
Device MFT は現時点でこの要求をサポートできませんでした。
MF_E_INVAILIDSTREAMNUMBER
無効なストリーム ID が渡されました。
MF_E_INVALID_STREAM_STATE
要求されたストリーム遷移は実行できません。

解説(Remarks)

このインターフェイス メソッドは、出力ストリームを、指定されたメディア タイプが設定された指定の状態へ遷移させるのに役立ちます。これは、Device Source が特定の出力ストリームの状態とメディア タイプの変更を要求したときに DTM によって使用されます。Device MFT は、指定された出力ストリームのメディア タイプと状態を、要求されたメディア タイプに変更する必要があります。

渡されたメディア タイプとストリーム状態が現在のメディア タイプとストリーム状態と同じ場合、このメソッドは S_OK を返します。

渡されたメディア タイプとストリームの現在のメディア タイプが同じ場合、Device MFT はストリームの状態を要求された値に変更し、適切な HRESULT を返さなければなりません。

出力ストリームのメディア タイプの変更に伴って入力側にも対応する変更が必要な場合、Device MFT は関連する入力ストリームを変更するために、METransformInputStreamStateChanged イベントを DTM にポストする必要があります。この呼び出しは、入力ストリームのメディア タイプを変更した後にのみ戻り、適切な HRESULT を返さなければなりません。

例として、2 つの入力ストリームと 3 つの出力ストリームを持つ Device MFT を考えます。Output 1 と Output 2 が Input 1 をソースとし、720p でストリーミングしているとします。ここで、Output 2 のメディア タイプが 1080p に変わったとします。この要求を満たすために、Device MFT は METransformInputStreamStateChanged イベントを DTM にポストすることで、Input 1 のメディア タイプを 1080p に変更しなければなりません。DTM は SetInputStreamState を呼び出して、入力ストリームのメディア タイプと状態を変更します。この呼び出しの後、SetOutputStreamState は戻る必要があります。

vtbl 19 HRESULT GetOutputStreamState(DWORD dwStreamID, DeviceStreamState* value)

GetOutputStreamState メソッドは、Device MFT の出力ストリームの状態を取得します。

dwStreamIDDWORDin状態を取得する対象の出力ストリームのストリーム ID です。
valueDeviceStreamState*out指定された出力 Device MFT ストリームの現在の DeviceStreamState を指定します。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。

戻り値 説明
S_OK
ストリーム状態の遷移に成功しました。
MF_E_INVALIDREQUEST
Device MFT は現時点でこの要求をサポートできませんでした。
MF_E_INVAILIDSTREAMNUMBER
無効なストリーム ID が渡されました。

解説(Remarks)

このメソッドは、特定の出力ストリームの状態を取得するために device transform manager (DTM) によって使用されます。

vtbl 20 HRESULT GetInputStreamPreferredState(DWORD dwStreamID, DeviceStreamState* value, IMFMediaType** ppMediaType)

GetInputStreamPreferredState メソッドは、Device MFT の入力ストリームの優先状態とメディア タイプを取得します。

dwStreamIDDWORDin状態を取得する対象の入力ストリームのストリーム ID です。
valueDeviceStreamState*out指定された入力 Device MFT ストリームの現在の DeviceStreamState を指定します。
ppMediaTypeIMFMediaType**out入力ストリームの優先メディア タイプは、このパラメーターを通じて渡されます。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。

戻り値 説明
S_OK
ストリーム状態の遷移に成功しました。
MF_E_INVALIDREQUEST
Device MFT は現時点でこの要求をサポートできませんでした。
MF_E_INVAILIDSTREAMNUMBER
無効なストリーム ID が渡されました。
MF_E_INVALID_STREAM_STATE
要求されたストリーム遷移は実行できません。

解説(Remarks)

このインターフェイス関数は、Device MFT の入力ストリームが遷移すべき優先状態とメディア タイプを照会するのに役立ちます。

出力ストリームのメディア タイプの変更に伴って入力側にも対応する変更が必要な場合、Device MFT は関連する入力ストリームを変更するために、METransformInputStreamStateChanged を DTM にポストします。DTM は GetInputStreamPreferredState を呼び出して、Device MFT の入力ストリームの優先メディア タイプと状態を取得します。

例として、2 つの入力ストリームと 3 つの出力ストリームを持つ Device MFT を考えます。Output 1 と Output 2 が Input 1 をソースとし、720p でストリーミングしているとします。ここで、Output 2 のメディア タイプが 1080p に変わったとします。この要求を満たすために、Device MFT は METransformInputStreamStateChanged イベントを DTM にポストすることで、Input 1 のメディア タイプを 1080p に変更しなければなりません。DTM は GetInputStreamPreferredState を呼び出して、優先状態とメディア タイプを取得します。DTM は SetInputStreamState を呼び出して、入力ストリームのメディア タイプと状態を変更します。

vtbl 21 HRESULT FlushInputStream(DWORD dwStreamIndex, DWORD dwFlags)

FlushInputStream メソッドは、Device MFT の入力ストリームをフラッシュします。

dwStreamIndexDWORDinフラッシュする対象の入力ストリームのストリーム ID です。
dwFlagsDWORDin対応する devproxy 出力ストリームをフラッシュした結果の HRESULT を含みます。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。

戻り値 説明
S_OK
ストリーム状態の遷移に成功しました。
MF_E_INVALIDREQUEST
Device MFT は現時点でこの要求をサポートできませんでした。
MF_E_INVAILIDSTREAMNUMBER
無効なストリーム ID が渡されました。
MF_E_INVALID_STREAM_STATE
要求されたストリーム遷移は実行できません。

解説(Remarks)

このインターフェイス メソッドは、Device MFT の入力ストリームをフラッシュするのに役立ちます。

Device MFT は、そのキュー内のすべてのサンプルを破棄し、その入力ストリームに関連するすべての内部データ構造をリセットする必要があります。これは入力ストリームをリセットすることと同等です。メディア タイプとストリーム状態は変更してはなりません。

呼び出されるタイミング

入力ストリームをリセットする必要があるとき、device transform manager (DTM) がこのメソッドを呼び出します。
vtbl 22 HRESULT FlushOutputStream(DWORD dwStreamIndex, DWORD dwFlags)

FlushOutputStream メソッドは、Device MFT の出力ストリームをフラッシュします。

dwStreamIndexDWORDinフラッシュする対象の出力ストリームのストリーム ID です。
dwFlagsDWORDinゼロにする必要があります。

戻り値

このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。

戻り値 説明
S_OK
ストリーム状態の遷移に成功しました。
MF_E_INVALIDREQUEST
Device MFT は現時点でこの要求をサポートできませんでした。
MF_E_INVAILIDSTREAMNUMBER
無効なストリーム ID が渡されました。
MF_E_INVALID_STREAM_STATE
要求されたストリーム遷移は実行できません。

解説(Remarks)

このインターフェイス関数は、Device MFT の出力ストリームをフラッシュするのに役立ちます。

Device MFT は、そのキュー内のすべてのサンプルを破棄し、その出力ストリームに関連するすべての内部データ構造をリセットする必要があります。これは出力ストリームをリセットすることと同等です。メディア タイプとストリーム状態は変更してはなりません。

呼び出されるタイミング

出力ストリームをリセットする必要があるとき、device transform manager (DTM) がこのメソッドを呼び出します。
出典・ライセンス: 上記「公式ドキュメント」の内容は 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_IMFDeviceTransform "{D818FBD8-FC46-42F2-87AC-1EA2D1F9BF32}"
#usecom global IMFDeviceTransform IID_IMFDeviceTransform "{}"
#comfunc global IMFDeviceTransform_InitializeTransform           3 sptr
#comfunc global IMFDeviceTransform_GetInputAvailableType         4 int,int,sptr
#comfunc global IMFDeviceTransform_GetInputCurrentType           5 int,sptr
#comfunc global IMFDeviceTransform_GetInputStreamAttributes      6 int,sptr
#comfunc global IMFDeviceTransform_GetOutputAvailableType        7 int,int,sptr
#comfunc global IMFDeviceTransform_GetOutputCurrentType          8 int,sptr
#comfunc global IMFDeviceTransform_GetOutputStreamAttributes     9 int,sptr
#comfunc global IMFDeviceTransform_GetStreamCount                10 var,var
#comfunc global IMFDeviceTransform_GetStreamIDs                  11 int,var,int,var
#comfunc global IMFDeviceTransform_ProcessEvent                  12 int,sptr
#comfunc global IMFDeviceTransform_ProcessInput                  13 int,sptr,int
#comfunc global IMFDeviceTransform_ProcessMessage                14 int,sptr
#comfunc global IMFDeviceTransform_ProcessOutput                 15 int,int,var,var
#comfunc global IMFDeviceTransform_SetInputStreamState           16 int,sptr,int,int
#comfunc global IMFDeviceTransform_GetInputStreamState           17 int,var
#comfunc global IMFDeviceTransform_SetOutputStreamState          18 int,sptr,int,int
#comfunc global IMFDeviceTransform_GetOutputStreamState          19 int,var
#comfunc global IMFDeviceTransform_GetInputStreamPreferredState  20 int,var,sptr
#comfunc global IMFDeviceTransform_FlushInputStream              21 int,int
#comfunc global IMFDeviceTransform_FlushOutputStream             22 int,int
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。