IMFDeviceTransform
COM公式ドキュメント
このセクションでは、IMFDeviceTransform インターフェイスのリファレンス情報を扱います。
メソッド 20
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
InitializeTransform は、Device MFT を初期化するために呼び出されます。
| pAttributes | IMFAttributes* | in | 初期化パラメーターを含む属性へのポインターを格納します。これはキャプチャ パイプラインから渡されます。次の属性値が関数に渡されます。
|
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| 初期化に成功しました。 | |
| Device MFT は現時点でこの要求をサポートできませんでした。 |
解説(Remarks)
Device MFT はこの関数を利用して、さまざまな内部オブジェクトや状態を初期化できます。パイプラインは、入力の IMFAttributes パラメーターを使用して、特定の構成情報を Device MFT に伝えることもできます。
GetInputAvailableType メソッドは、この Media Foundation Transform (MFT) の入力ストリームに対して利用可能なメディア タイプを取得します。
| dwInputStreamID | DWORD | in | 入力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFDeviceTransform::GetStreamID を呼び出します。 |
| dwTypeIndex | DWORD | in | 取得するメディア タイプのインデックスです。メディア タイプは 0 から始まるインデックスが付けられ、おおよその優先順位で返されます。 |
| pMediaType | IMFMediaType** | out | IMFMediaType インターフェイスへのポインターを受け取ります。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| 初期化に成功しました。 | |
| Device MFT は現時点でこの要求をサポートできませんでした。 | |
| ストリーム ID が有効ではありません。 | |
| 指定されたインデックスに利用可能なメディア タイプがありません。 |
解説(Remarks)
MFT は入力ストリームごとに利用可能なメディア タイプの一覧を定義し、優先順位で並べます。このメソッドは、入力ストリームで利用可能なメディア タイプを列挙します。利用可能なタイプを列挙するには、メソッドが MF_E_NO_MORE_TYPES を返すまで dwTypeIndex をインクリメントします。
実装上の注意
MFT がメディア タイプを内部に保持している場合、MFT は元のタイプへのポインターではなく、メディア タイプのクローンを返す必要があります。そうしないと、呼び出し元がそのタイプを変更し、MFT の内部状態を変えてしまう可能性があります。GetInputCurrentType メソッドは、この Media Foundation Transform (MFT) の入力ストリームに対する現在のメディア タイプを取得します。
| dwInputStreamID | DWORD | in | 入力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFDeviceTransform::GetStreamIDs を呼び出します。 |
| pMediaType | IMFMediaType** | out | そのストリームが使用している現在のタイプを表す IMFMediaType インターフェイスへのポインターを受け取ります。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| 初期化に成功しました。 | |
| Device MFT は現時点でこの要求をサポートできませんでした。 | |
| ストリーム ID が有効ではありません。 | |
| 指定されたインデックスに利用可能なメディア タイプがありません。 | |
| メディア タイプがまだ設定されていません。 |
解説(Remarks)
指定した入力ストリームにまだメディア タイプが設定されていない場合、このメソッドは MF_E_TRANSFORM_TYPE_NOT_SET を返します。
実装上の注意
MFT は、元のタイプへのポインターではなく、メディア タイプのクローンを返す必要があります。そうしないと、呼び出し元がそのタイプを変更し、MFT の内部状態を変えてしまう可能性があります。GetInputStreamAttributes メソッドは、この Media Foundation Transform (MFT) の入力ストリームに対する属性ストアを取得します。
| dwInputStreamID | DWORD | in | 状態を取得する対象の入力ストリームのストリーム ID です。 |
| ppAttributes | IMFAttributes** | out | IMFAttributes インターフェイスへのポインターを受け取ります。呼び出し元はこのインターフェイスを解放する必要があります。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| ストリーム状態の遷移に成功しました。 | |
| Device MFT は現時点でこの要求をサポートできませんでした。 | |
| ストリーム ID が有効ではありません。 |
解説(Remarks)
このメソッドは、特定の入力ストリームの属性ストアを取得するために DTM によって使用されます。
GetOutputAvailableType メソッドは、この Media Foundation Transform (MFT) の出力ストリームに対して利用可能なメディア タイプを取得します。
| dwOutputStreamID | DWORD | in | 出力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFDeviceTransform::GetStreamIDs を呼び出します。 |
| dwTypeIndex | DWORD | in | 取得するメディア タイプのインデックスです。メディア タイプは 0 から始まるインデックスが付けられ、おおよその優先順位で返されます。 |
| pMediaType | IMFMediaType** | out | IMFMediaType インターフェイスへのポインターを受け取ります。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| 初期化に成功しました。 | |
| Device MFT は現時点でこの要求をサポートできませんでした。 | |
| ストリーム ID が有効ではありません。 | |
| 指定されたインデックスに利用可能なメディア タイプがありません。 |
解説(Remarks)
MFT は出力ストリームごとに利用可能なメディア タイプの一覧を定義し、優先順位で並べます。
このメソッドは、出力ストリームで利用可能なメディア タイプを列挙します。利用可能なタイプを列挙するには、メソッドが MF_E_NO_MORE_TYPES を返すまで dwTypeIndex をインクリメントします。
実装上の注意
MFT がメディア タイプを内部に保持している場合、MFT は元のタイプへのポインターではなく、メディア タイプのクローンを返す必要があります。そうしないと、呼び出し元がそのタイプを変更し、MFT の内部状態を変えてしまう可能性があります。GetOutputCurrentType メソッドは、この Media Foundation Transform (MFT) の出力ストリームに対する現在のメディア タイプを取得します。
| dwOutputStreamID | DWORD | in | 出力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFDeviceTransform::GetStreamIDs を呼び出します。 |
| pMediaType | IMFMediaType** | out | そのストリームが使用している現在のタイプを表す IMFMediaType インターフェイスへのポインターを受け取ります。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| 初期化に成功しました。 | |
| Device MFT は現時点でこの要求をサポートできませんでした。 | |
| ストリーム ID が有効ではありません。 | |
| 指定されたインデックスに利用可能なメディア タイプがありません。 | |
| メディア タイプがまだ設定されていません。 |
解説(Remarks)
指定した出力ストリームにまだメディア タイプが設定されていない場合、このメソッドは MF_E_TRANSFORM_TYPE_NOT_SET を返します。
実装上の注意
MFT は、元のタイプへのポインターではなく、メディア タイプのクローンを返す必要があります。そうしないと、呼び出し元がそのタイプを変更し、MFT の内部状態を変えてしまう可能性があります。GetOutputStreamAttributes メソッドは、この Media Foundation Transform (MFT) の出力ストリームに対する属性ストアを取得します。
| dwOutputStreamID | DWORD | in | 状態を取得する対象の出力ストリームのストリーム ID です。 |
| ppAttributes | IMFAttributes** | out | IMFAttributes インターフェイスへのポインターを受け取ります。呼び出し元はこのインターフェイスを解放する必要があります。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| 初期化に成功しました。 | |
| Device MFT は現時点でこの要求をサポートできませんでした。 | |
| 無効なストリーム ID が渡された場合に返されます。 |
解説(Remarks)
この関数は、特定の出力ストリームの属性ストアを取得するために DTM によって使用されます。
GetStreamCount メソッドは、この Media Foundation Transform (MFT) の入力ストリームと出力ストリームの現在の数を取得します。
| pcInputStreams | DWORD* | out | 入力ストリームの数を受け取ります。 |
| pcOutputStreams | DWORD* | out | 出力ストリームの数を受け取ります。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| ストリーム状態の遷移に成功しました。 | |
| 無効なポインターが渡されました。 |
解説(Remarks)
この関数は、Device MFT がサポートするストリームの数を取得するために DTM によって使用されます。ストリームの数には、選択されていないストリーム (たとえば、メディア タイプがない、または NULL のメディア タイプを持つストリームなど) も含まれます。
このメソッドは NULL パラメーターで呼び出されることはありません。
GetStreamIDs メソッドは、この Media Foundation Transform (MFT) の入力ストリームおよび出力ストリームのストリーム識別子を取得します。
| dwInputIDArraySize | DWORD | in | pdwInputStreamIDs の要素数です。 |
| pdwInputStreamIds | DWORD* | out | 呼び出し元が割り当てた配列へのポインターです。このメソッドは、入力ストリーム識別子で配列を埋めます。配列のサイズは、少なくとも入力ストリームの数と等しくなければなりません。入力ストリームの数を取得するには、IMFDeviceTransform::GetStreamCount を呼び出します。 呼び出し元が入力ストリームの数より大きい配列を渡した場合、MFT は余分な配列エントリに値を書き込んではなりません。 |
| dwOutputIDArraySize | DWORD | in | pdwOutputStreamIDs の要素数です。 |
| pdwOutputStreamIds | DWORD* | out | 呼び出し元が割り当てた配列へのポインターです。このメソッドは、出力ストリーム識別子で配列を埋めます。配列のサイズは、少なくとも出力ストリームの数と等しくなければなりません。出力ストリームの数を取得するには、IMFDeviceTransform::GetStreamCount を呼び出します。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| ストリーム状態の遷移に成功しました。 | |
| 無効なポインターが渡されました。 | |
| 渡されたバッファーには、ストリーム ID を書き込むのに十分な空きがありません。 |
解説(Remarks)
一部の MFT はストリームを追加または削除できるため、ストリームのインデックスが一意にならない場合があります。そのため、ストリーム識別子が必要です。したがって、ストリームを操作する IMFDeviceTransform メソッドはストリーム識別子を受け取ります。
すべての入力ストリーム識別子は MFT 内で一意でなければならず、すべての出力ストリーム識別子も一意でなければなりません。ただし、入力ストリームと出力ストリームは同じ識別子を共有できます。 I
クライアントが入力ストリームを追加する場合、クライアントが識別子を割り当てるため、MFT は一意である限り任意の識別子を許容しなければなりません。MFT が出力ストリームを作成する場合、MFT が識別子を割り当てます。
慣例として、MFT が固定の入力ストリーム 1 つと固定の出力ストリーム 1 つだけを持つ場合、両方のストリームに識別子 0 を割り当てるべきです。
ProcessEvent メソッドは、この Media Foundation Transform (MFT) の入力ストリームにイベントを送信します。
| dwInputStreamID | DWORD | in | ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFDeviceTransform::GetStreamIDs を呼び出します。 |
| pEvent | IMFMediaEvent* | in | イベント オブジェクトの IMFMediaEvent インターフェイスへのポインターです。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| イベントは正常に処理されました。イベントは下流に伝播されます。 | |
| 無効なストリーム ID が渡されました。 | |
|
Device MFT がイベントをこれ以上伝播させないことを望んでいることを示します。 |
| 関数が実装されていません。 |
解説(Remarks)
MFT は、イベントの下流への送信を自身で処理することも、DTM に任せることもできます。これは戻り値によって示されます。
- E_NOTIMPL: MFT はすべてのイベントを無視し、DTM がすべてのイベントを下流に送信する必要があります。パイプラインがこの戻り値を受け取った後の動作です。
- S_OK: MFT はこのイベントを確認しましたが、DTM がイベントを下流に送信する必要があります。内部的には、MFT はイベントに何らかの形で応答する場合も、無視する場合もあります。
- MF_S_TRANSFORM_DO_NOT_PROPAGATE_EVENT: DTM はこのイベントを下流に伝播させてはなりません。MFT がイベントを下流に送信するか、あるいは MFT がイベントを消費して下流に送信しないかのいずれかです。MFT がイベントを消費するのは、イベントがこの MFT で止まり、それ以上下流に進んではならない場合のみです。ただし、ほとんどの場合、イベントは下流に伝わるべきです。
イベントは、その前後に来るサンプルとシリアル化する必要があります。イベントの後に続く出力サンプルにイベントを付加してください (パイプラインはまずイベントを処理し、その後にサンプルを処理します)。MFT が IMFTransform::ProcessInput と IMFTransform::ProcessOutput の呼び出し間で 1 つ以上のサンプルを保持している場合、この状況ではパイプラインが入力サンプルと出力サンプルを対応付けられないため、MFT がすべてのイベントの下流への送信を処理する必要があります。
MFT がサンプルを保持せず、いかなるイベントも確認する必要がない場合は、E_NOTIMPL を返すことができます。
ProcessInput メソッドは、この Media Foundation Transform (MFT) の入力ストリームにデータを配信します。
| dwInputStreamID | DWORD | in | 入力ストリーム識別子です。 |
| pSample | IMFSample* | in | 入力サンプルの IMFSample インターフェイスへのポインターです。サンプルには、有効な入力データを含むメディア バッファーが少なくとも 1 つ含まれている必要があります。 |
| dwFlags | DWORD | in | ゼロにする必要があります。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 無効な引数が渡されました。 | |
| Device MFT は現時点でこの要求をサポートできませんでした。 | |
|
無効なストリーム ID が渡されました。 |
| 要求されたストリーム遷移は実行できません。 | |
| 入力メディア タイプが設定されていません。 |
解説(Remarks)
ほとんどの場合、メソッドが成功すると、MFT はサンプルを保存し、IMFSample ポインターの参照カウントを保持します。MFT がサンプルの使用を終えたら、メモリ リークを防ぐためにこれを解放する必要があります。
DTM がすべてのストリームに有効なメディア タイプを設定した後は、MFT は常により多くの入力を受け入れることができ、より多くの出力を生成できる状態でなければなりません。
MFT が入力データで致命的でないエラーに遭遇した場合は、単にそのデータを破棄し、次の入力データを取得したときに回復を試みることができます。MFT がデータを破棄した場合は、データ ストリームにギャップがあることを呼び出し元に通知するため、次の出力サンプルに MFSampleExtension_Discontinuity 属性を設定する必要があります。
ProcessMessage メソッドは、Device Media Foundation Transform (MFT) にメッセージを送信します。
| eMessage | MFT_MESSAGE_TYPE | in | 送信するメッセージです。MFT_MESSAGE_TYPE 列挙型のメンバーとして指定します。 |
| ulParam | UINT_PTR | in | メッセージ パラメーターです。このパラメーターの意味はメッセージの種類によって異なります。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 無効な引数が渡されました。 | |
| Device MFT は現時点でこの要求をサポートできませんでした。 | |
|
無効なストリーム ID が渡されました。 |
| 要求されたストリーム遷移は実行できません。 | |
| 入力メディア タイプが設定されていません。 |
解説(Remarks)
このメソッドを呼び出す前に、すべての入力ストリームと出力ストリームにメディア タイプを設定してください。
MFT は特定のメッセージ タイプを無視する場合があります。その場合、メソッドは S_OK を返します。エラー コードは、トランスフォームがこのメッセージ タイプを処理するものの、この場合はメッセージを処理できなかったことを示します。
詳細については、MFT_MESSAGE_TYPE を参照してください。
ProcessOutput メソッドは、Device MFT の出力ストリームから処理済みの出力を取得します。
| dwFlags | DWORD | in | _MFT_PROCESS_OUTPUT_FLAGS 列挙型からの 0 個以上のフラグのビットごとの OR です。 |
| cOutputBufferCount | DWORD | in | pOutputSamples 配列の要素数です。値は少なくとも 1 でなければなりません。 |
| pOutputSample | MFT_OUTPUT_DATA_BUFFER* | inout | 呼び出し元が割り当てた MFT_OUTPUT_DATA_BUFFER 構造体の配列へのポインターです。MFT はこの配列を使用して、呼び出し元に出力データを返します。 |
| pdwStatus | DWORD* | out | _MFT_PROCESS_OUTPUT_STATUS 列挙型からの 0 個以上のフラグのビットごとの OR を受け取ります。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 無効な引数が渡されました。 | |
| Device MFT は現時点でこの要求をサポートできませんでした。 | |
|
無効なストリーム ID が渡されました。 |
| 要求されたストリーム遷移は実行できません。 | |
| 入力メディア タイプが設定されていません。 |
解説(Remarks)
ほとんどの場合、メソッドが成功すると、Media Foundation Transform (MFT) はサンプルを保存し、IMFSample ポインターの参照カウントを保持します。MFT がサンプルの使用を終えたら、メモリ リークを防ぐためにこれを解放する必要があります。
device transform manager (DTM) がすべてのストリームに有効なメディア タイプを設定した後は、MFT は常により多くの入力を受け入れることができ、より多くの出力を生成できる状態でなければなりません。
MFT が入力データで致命的でないエラーに遭遇した場合は、単にそのデータを破棄し、次の入力データを取得したときに回復を試みることができます。MFT がデータを破棄した場合は、データ ストリームにギャップがあることを呼び出し元に通知するため、次の出力サンプルに MFSampleExtension_Discontinuity 属性を設定する必要があります。
SetInputStreamState メソッドは、Device MFT の入力ストリームの状態とメディア タイプを設定します。
| dwStreamID | DWORD | in | 状態とメディア タイプを変更する対象の入力ストリームのストリーム ID です。 |
| pMediaType | IMFMediaType* | in | 入力ストリームの優先メディア タイプは、このパラメーターを通じて渡されます。Device MFT は、渡されたメディア タイプが現在のメディア タイプと異なる場合にのみメディア タイプを変更する必要があります。 |
| value | DeviceStreamState | in | 入力ストリームが遷移すべき DeviceStreamState を指定します。 |
| dwFlags | DWORD | in | S_OK が返された場合は、状態変更操作を実行します。それ以外の場合、これには devproxy の出力ピンにメディア タイプを設定する際に発生したエラーが含まれます。その場合は、エラーを適切に伝播してください。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| 初期化に成功しました。 | |
| Device MFT は現時点でこの要求をサポートできませんでした。 | |
|
無効なストリーム ID が渡されました。 |
| 要求されたストリーム遷移は実行できません。 |
解説(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 に要求する必要があります。
GetInputStreamState メソッドは、Device MFT の入力ストリームの状態を取得します。
| dwStreamID | DWORD | in | 状態を取得する対象の入力ストリームのストリーム ID です。 |
| value | DeviceStreamState* | out | 指定された入力 Device MFT ストリームの現在の DeviceStreamState を指定します。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| ストリーム状態の遷移に成功しました。 | |
| Device MFT は現時点でこの要求をサポートできませんでした。 | |
|
無効なストリーム ID が渡されました。 |
解説(Remarks)
このメソッドは、特定の入力ストリームの状態を取得するために device transform manager (DTM) によって使用されます。
SetOutputStreamState メソッドは、Device MFT の出力ストリームの状態とメディア タイプを設定します。
| dwStreamID | DWORD | in | 状態とメディア タイプを変更する対象の入力ストリームのストリーム ID です。 |
| pMediaType | IMFMediaType* | in | 入力ストリームの優先メディア タイプは、このパラメーターを通じて渡されます。Device MFT は、渡されたメディア タイプが現在のメディア タイプと異なる場合にのみメディア タイプを変更する必要があります。 |
| value | DeviceStreamState | in | 入力ストリームが遷移すべき DeviceStreamState を指定します。 |
| dwFlags | DWORD | in | ゼロにする必要があります。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| ストリーム状態の遷移に成功しました。 | |
| Device MFT は現時点でこの要求をサポートできませんでした。 | |
|
無効なストリーム ID が渡されました。 |
| 要求されたストリーム遷移は実行できません。 |
解説(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 は戻る必要があります。
GetOutputStreamState メソッドは、Device MFT の出力ストリームの状態を取得します。
| dwStreamID | DWORD | in | 状態を取得する対象の出力ストリームのストリーム ID です。 |
| value | DeviceStreamState* | out | 指定された出力 Device MFT ストリームの現在の DeviceStreamState を指定します。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| ストリーム状態の遷移に成功しました。 | |
| Device MFT は現時点でこの要求をサポートできませんでした。 | |
|
無効なストリーム ID が渡されました。 |
解説(Remarks)
このメソッドは、特定の出力ストリームの状態を取得するために device transform manager (DTM) によって使用されます。
GetInputStreamPreferredState メソッドは、Device MFT の入力ストリームの優先状態とメディア タイプを取得します。
| dwStreamID | DWORD | in | 状態を取得する対象の入力ストリームのストリーム ID です。 |
| value | DeviceStreamState* | out | 指定された入力 Device MFT ストリームの現在の DeviceStreamState を指定します。 |
| ppMediaType | IMFMediaType** | out | 入力ストリームの優先メディア タイプは、このパラメーターを通じて渡されます。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| ストリーム状態の遷移に成功しました。 | |
| Device MFT は現時点でこの要求をサポートできませんでした。 | |
|
無効なストリーム ID が渡されました。 |
| 要求されたストリーム遷移は実行できません。 |
解説(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 を呼び出して、入力ストリームのメディア タイプと状態を変更します。
FlushInputStream メソッドは、Device MFT の入力ストリームをフラッシュします。
| dwStreamIndex | DWORD | in | フラッシュする対象の入力ストリームのストリーム ID です。 |
| dwFlags | DWORD | in | 対応する devproxy 出力ストリームをフラッシュした結果の HRESULT を含みます。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| ストリーム状態の遷移に成功しました。 | |
| Device MFT は現時点でこの要求をサポートできませんでした。 | |
|
無効なストリーム ID が渡されました。 |
| 要求されたストリーム遷移は実行できません。 |
解説(Remarks)
このインターフェイス メソッドは、Device MFT の入力ストリームをフラッシュするのに役立ちます。
Device MFT は、そのキュー内のすべてのサンプルを破棄し、その入力ストリームに関連するすべての内部データ構造をリセットする必要があります。これは入力ストリームをリセットすることと同等です。メディア タイプとストリーム状態は変更してはなりません。
呼び出されるタイミング
入力ストリームをリセットする必要があるとき、device transform manager (DTM) がこのメソッドを呼び出します。FlushOutputStream メソッドは、Device MFT の出力ストリームをフラッシュします。
| dwStreamIndex | DWORD | in | フラッシュする対象の出力ストリームのストリーム ID です。 |
| dwFlags | DWORD | in | ゼロにする必要があります。 |
戻り値
このメソッドは HRESULT を返します。指定できる値には次の表の値が含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| ストリーム状態の遷移に成功しました。 | |
| Device MFT は現時点でこの要求をサポートできませんでした。 | |
|
無効なストリーム ID が渡されました。 |
| 要求されたストリーム遷移は実行できません。 |
解説(Remarks)
このインターフェイス関数は、Device MFT の出力ストリームをフラッシュするのに役立ちます。
Device MFT は、そのキュー内のすべてのサンプルを破棄し、その出力ストリームに関連するすべての内部データ構造をリセットする必要があります。これは出力ストリームをリセットすることと同等です。メディア タイプとストリーム状態は変更してはなりません。
呼び出されるタイミング
出力ストリームをリセットする必要があるとき、device transform manager (DTM) がこのメソッドを呼び出します。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 指定が可能。#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 sptr,sptr #comfunc global IMFDeviceTransform_GetStreamIDs 11 int,sptr,int,sptr #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,sptr,sptr #comfunc global IMFDeviceTransform_SetInputStreamState 16 int,sptr,int,int #comfunc global IMFDeviceTransform_GetInputStreamState 17 int,sptr #comfunc global IMFDeviceTransform_SetOutputStreamState 18 int,sptr,int,int #comfunc global IMFDeviceTransform_GetOutputStreamState 19 int,sptr #comfunc global IMFDeviceTransform_GetInputStreamPreferredState 20 int,sptr,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が無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。