IMFTransform
COM公式ドキュメント
すべての Media Foundation Transform (MFT) が実装するインターフェイスです。
メソッド 23
vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。
この Media Foundation transform (MFT) の入力ストリームおよび出力ストリームの最小数と最大数を取得します。
| pdwInputMinimum | DWORD* | out | 入力ストリームの最小数を受け取ります。 |
| pdwInputMaximum | DWORD* | out | 入力ストリームの最大数を受け取ります。最大数が存在しない場合は、値 MFT_STREAMS_UNLIMITED を受け取ります。 |
| pdwOutputMinimum | DWORD* | out | 出力ストリームの最小数を受け取ります。 |
| pdwOutputMaximum | DWORD* | out | 出力ストリームの最大数を受け取ります。最大数が存在しない場合は、値 MFT_STREAMS_UNLIMITED を受け取ります。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
MFT のストリーム数が固定である場合、最小値と最大値は同じになります。
入力が 0 個または出力が 0 個の MFT を作成することは推奨されません。入力または出力を持たない MFT は、Media Foundation パイプラインの他の部分と互換性がない場合があります。この目的には、代わりに Media Foundation のシンクまたはソースを作成してください。
MFT が最初に作成された時点では、最小数のストリームを持つことは保証されていません。実際のストリーム数を確認するには、IMFTransform::GetStreamCount を呼び出してください。
このメソッドは NULL パラメーターを指定して呼び出すべきではありませんが、実際には一部の実装で NULL パラメーターが許容される場合があります。
mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTGetStreamLimits に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。
この Media Foundation transform (MFT) の現在の入力ストリーム数および出力ストリーム数を取得します。
| pcInputStreams | DWORD* | out | 入力ストリーム数を受け取ります。 |
| pcOutputStreams | DWORD* | out | 出力ストリーム数を受け取ります。 |
戻り値
このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。
解説(Remarks)
このストリーム数には、選択されていないストリーム(メディアタイプを持たない、またはメディアタイプが NULL のストリーム)も含まれます。
このメソッドは NULL パラメーターを指定して呼び出すべきではありませんが、実際には一部の実装で NULL パラメーターが許容される場合があります。
mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTGetStreamCount に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。
この Media Foundation transform (MFT) の入力ストリームおよび出力ストリームのストリーム識別子を取得します。
| dwInputIDArraySize | DWORD | in | pdwInputIDs 配列の要素数です。 |
| pdwInputIDs | DWORD* | out | 呼び出し側が確保した配列へのポインターです。メソッドはこの配列に入力ストリーム識別子を格納します。配列のサイズは、少なくとも入力ストリーム数以上でなければなりません。入力ストリーム数を取得するには、IMFTransform::GetStreamCount を呼び出してください。 呼び出し側が入力ストリーム数より大きい配列を渡した場合、MFT は余分な配列エントリーに値を書き込んではなりません。 |
| dwOutputIDArraySize | DWORD | in | pdwOutputIDs 配列の要素数です。 |
| pdwOutputIDs | DWORD* | out | 呼び出し側が確保した配列へのポインターです。メソッドはこの配列に出力ストリーム識別子を格納します。配列のサイズは、少なくとも出力ストリーム数以上でなければなりません。出力ストリーム数を取得するには、GetStreamCount を呼び出してください。 呼び出し側が出力ストリーム数より大きい配列を渡した場合、MFT は余分な配列エントリーに値を書き込んではなりません。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 実装されていません。「解説」を参照してください。 | |
| いずれか一方または両方の配列が小さすぎます。 |
解説(Remarks)
一部の MFT はストリームの追加や削除を行えるため、ストリームのインデックスが一意でない場合があります。そのため、ストリーム識別子が必要になります。したがって、ストリームを操作する IMFTransform のメソッドはストリーム識別子を受け取ります。
このメソッドは、以下の両方の条件が満たされる場合に E_NOTIMPL を返すことがあります。
- 変換のストリーム数が固定である。
- ストリームが 0 から n - 1 まで連番で番号付けされている(n は入力ストリーム数または出力ストリーム数)。つまり、最初の入力ストリームが 0、2 番目が 1、以下同様であり、最初の出力ストリームが 0、2 番目が 1、以下同様である。
- MFT が出力ストリームを追加または削除できる。
- MFT がクライアントによる入力ストリームの追加または削除を許可している。
- ストリーム識別子が連番でない。
クライアントが入力ストリームを追加する場合、識別子はクライアントが割り当てるため、MFT は一意である限り任意の識別子を許容しなければなりません。MFT が出力ストリームを作成する場合は、MFT が識別子を割り当てます。
慣例として、MFT が固定の入力ストリーム 1 つと固定の出力ストリーム 1 つのみを持つ場合、両方のストリームに識別子 0 を割り当てるべきです。
mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTGetStreamIDs に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。
この Media Foundation transform (MFT) の入力ストリームに関するバッファー要件やその他の情報を取得します。
| dwInputStreamID | DWORD | in | 入力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。 |
| pStreamInfo | MFT_INPUT_STREAM_INFO* | out | MFT_INPUT_STREAM_INFO 構造体へのポインターです。メソッドはこの構造体に入力ストリームに関する情報を格納します。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 無効なストリーム識別子です。 |
解説(Remarks)
このメソッドはメディアタイプを設定する前に呼び出しても問題ありません。ただし、この呼び出しの結果はメディアタイプの変更後や ProcessInput の呼び出し後に動的に変化することがあるため、これらのいずれかが発生した後にこのメソッドを再度呼び出す必要がある場合があります。
mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTGetInputStreamInfo に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。
この Media Foundation transform (MFT) の出力ストリームに関するバッファー要件やその他の情報を取得します。
| dwOutputStreamID | DWORD | in | 出力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。 |
| pStreamInfo | MFT_OUTPUT_STREAM_INFO* | out | MFT_OUTPUT_STREAM_INFO 構造体へのポインターです。メソッドはこの構造体に出力ストリームに関する情報を格納します。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 無効なストリーム番号です。 |
解説(Remarks)
このメソッドはメディアタイプを設定する前に呼び出しても問題ありません。ただし、この呼び出しの結果はメディアタイプの変更後や ProcessOutput の呼び出し後に動的に変化することがあるため、これらのいずれかが発生した後にこのメソッドを再度呼び出す必要がある場合があります。
mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTGetOutputStreamInfo に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。
この Media Foundation transform (MFT) のグローバル属性ストアを取得します。
| pAttributes | IMFAttributes** | out | IMFAttributes インターフェイスへのポインターを受け取ります。呼び出し側はこのインターフェイスを解放する必要があります。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| MFT は属性をサポートしていません。 |
解説(Remarks)
このメソッドで取得した IMFAttributes ポインターを使用して、MFT 全体に適用される属性を取得または設定します。入力ストリームの属性ストアを取得するには、IMFTransform::GetInputStreamAttributes を呼び出してください。出力ストリームの属性ストアを取得するには、IMFTransform::GetOutputStreamAttributes を呼び出してください。
このメソッドの実装は、MFT が特定の属性セットをサポートする必要がある場合を除き、任意です。例外として、ハードウェアベースの MFT はこのメソッドを実装しなければなりません。Hardware MFTs を参照してください。
この Media Foundation transform (MFT) の入力ストリームの属性ストアを取得します。
| dwInputStreamID | DWORD | in | 入力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。 |
| pAttributes | IMFAttributes** | out | IMFAttributes インターフェイスへのポインターを受け取ります。呼び出し側はこのインターフェイスを解放する必要があります。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| MFT は入力ストリーム属性をサポートしていません。 | |
| 無効なストリーム識別子です。 |
解説(Remarks)
このメソッドの実装は、MFT が特定の属性セットをサポートする必要がある場合を除き、任意です。
MFT 全体の属性ストアを取得するには、IMFTransform::GetAttributes を呼び出してください。
この Media Foundation transform (MFT) の出力ストリームの属性ストアを取得します。
| dwOutputStreamID | DWORD | in | 出力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。 |
| pAttributes | IMFAttributes** | out | IMFAttributes インターフェイスへのポインターを受け取ります。呼び出し側はこのインターフェイスを解放する必要があります。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| MFT は出力ストリーム属性をサポートしていません。 | |
| 無効なストリーム識別子です。 |
解説(Remarks)
このメソッドの実装は、MFT が特定の属性セットをサポートする必要がある場合を除き、任意です。
MFT 全体の属性ストアを取得するには、IMFTransform::GetAttributes を呼び出してください。
この Media Foundation transform (MFT) から入力ストリームを削除します。
| dwStreamID | DWORD | in | 削除する入力ストリームの識別子です。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 変換の入力ストリーム数は固定です。 | |
| ストリームは削除できないか、または変換が現在サポートできる入力ストリームの最小数になっています。 | |
| 無効なストリーム識別子です。 | |
| 変換には、指定されたストリームに対する未処理の入力バッファーがあります。 |
解説(Remarks)
変換の入力ストリーム数が固定である場合、このメソッドは E_NOTIMPL を返します。
MFT はこのメソッドをサポートしていても、特定の入力ストリームの削除を許可しない場合があります。入力ストリームが削除可能な場合、そのストリームに対して IMFTransform::GetInputStreamInfo メソッドが MFT_INPUT_STREAM_REMOVABLE フラグを返します。それ以外の場合、ストリームは削除できず、メソッドは MF_E_INVALIDREQUEST を返します。また、MFT が現在必要とする入力ストリームの最小数になっている場合も、メソッドは失敗します。ストリームの最小数を確認するには、IMFTransform::GetStreamLimits を呼び出してください。
変換にそのストリームの未処理の入力がまだ残っている場合、メソッドは成功することもあれば、MF_E_TRANSFORM_INPUT_REMAINING を返すこともあります。メソッドが成功した場合、MFT はストリームの削除後も残りの入力の処理を続行します。メソッドが MF_E_TRANSFORM_INPUT_REMAINING を返した場合は、ストリームを削除する前に入力バッファーをクリアする必要があります。入力バッファーをクリアするには、IMFTransform::ProcessOutput を呼び出すか、または MFT_MESSAGE_COMMAND_FLUSH を指定して IMFTransform::ProcessMessage を呼び出して MFT をフラッシュします。その後、再度 DeleteInputStream を呼び出してください。MFT は DeleteInputStream が呼び出されたときに入力バッファーを破棄してはなりません。
mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTDeleteInputStream に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。
この Media Foundation transform (MFT) に 1 つ以上の新しい入力ストリームを追加します。
| cStreams | DWORD | in | 追加するストリームの数です。 |
| adwStreamIDs | DWORD* | in | ストリーム識別子の配列です。新しいストリーム識別子は、既存のどの入力ストリームとも一致してはなりません。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 無効な引数です。 | |
| MFT の入力ストリーム数は固定です。 |
解説(Remarks)
新しいストリームがこの変換の入力ストリームの最大数を超える場合、メソッドは E_INVALIDARG を返します。入力ストリームの最大数を確認するには、IMFTransform::GetStreamLimits を呼び出してください。
新しいストリーム識別子のいずれかが既存の入力ストリームと競合する場合、メソッドは E_INVALIDARG を返します。
mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTAddInputStreams に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。
この Media Foundation transform (MFT) の入力ストリームで利用可能なメディアタイプを取得します。
| dwInputStreamID | DWORD | in | 入力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。 |
| dwTypeIndex | DWORD | in | 取得するメディアタイプのインデックスです。メディアタイプは 0 から番号付けされ、おおよその優先順位順に返されます。 |
| ppType | IMFMediaType** | out | IMFMediaType インターフェイスへのポインターを受け取ります。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| MFT は利用可能な入力タイプの一覧を持っていません。 | |
| 無効なストリーム識別子です。 | |
| dwTypeIndex パラメーターが範囲外です。 | |
| 入力タイプを設定する前に、出力タイプを設定する必要があります。 |
解説(Remarks)
MFT は各入力ストリームに対して利用可能なメディアタイプの一覧を定義し、優先順位順に並べます。このメソッドは入力ストリームで利用可能なメディアタイプを列挙します。利用可能なタイプを列挙するには、メソッドが MF_E_NO_MORE_TYPES を返すまで dwTypeIndex をインクリメントしてください。
あるストリームでメディアタイプを設定すると、別のストリームで利用可能なタイプが変わったり、優先順位が変わったりする場合があります。ただし、MFT は利用可能なタイプの一覧を動的に更新する必要はありません。特定の入力タイプを設定できるかどうかを確実にテストする唯一の方法は、IMFTransform::SetInputType を呼び出すことです。
場合によっては、MFT は 1 つ以上の出力タイプが設定されるまで入力タイプの一覧を返せないことがあります。その場合、メソッドは MF_E_TRANSFORM_TYPE_NOT_SET を返します。
MFT はこのメソッドを実装する必要はありません。ただし、サポートするタイプが単純で MFTGetInfo 関数を通じて検出できる場合を除き、ほとんどの MFT はこのメソッドを実装すべきです。
mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTGetInputAvailableType に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。
エンコーダーの場合、出力タイプが設定された後、GetInputAvailableType は現在の出力タイプと互換性のある入力タイプの一覧を返さなければなりません。つまり、出力タイプが設定された後に GetInputAvailableType が返すすべてのタイプは、SetInputType に対して有効なタイプでなければなりません。
エンコーダーは、入力メディアタイプと出力メディアタイプの属性が一致しない場合、入力タイプを拒否すべきです。例えば、MF_MT_FRAME_SIZE による解像度の設定、MF_MT_VIDEO_NOMINAL_RANGE による公称範囲の設定、または MF_MT_FRAME_SIZE によるフレームレートの設定などです。
実装に関する注意
MFT がメディアタイプを内部的に保持している場合、MFT は元のタイプへのポインターではなく、メディアタイプのクローンを返すべきです。そうしないと、呼び出し側がタイプを変更して MFT の内部状態を変更してしまう可能性があります。この Media Foundation transform (MFT) の出力ストリームで利用可能なメディアタイプを取得します。
| dwOutputStreamID | DWORD | in | 出力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。 |
| dwTypeIndex | DWORD | in | 取得するメディアタイプのインデックスです。メディアタイプは 0 から番号付けされ、おおよその優先順位順に返されます。 |
| ppType | IMFMediaType** | out | IMFMediaType インターフェイスへのポインターを受け取ります。呼び出し側はこのインターフェイスを解放する必要があります。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| MFT は利用可能な出力タイプの一覧を持っていません。 | |
| 無効なストリーム識別子です。 | |
| dwTypeIndex パラメーターが範囲外です。 | |
| 出力タイプを設定する前に、入力タイプを設定する必要があります。 |
解説(Remarks)
MFT は各出力ストリームに対して利用可能なメディアタイプの一覧を定義し、優先順位順に並べます。このメソッドは出力ストリームで利用可能なメディアタイプを列挙します。利用可能なタイプを列挙するには、メソッドが MF_E_NO_MORE_TYPES を返すまで dwTypeIndex をインクリメントしてください。
あるストリームでメディアタイプを設定すると、別のストリームで利用可能なタイプが変わる(または優先順位が変わる)場合があります。ただし、MFT は利用可能なタイプの一覧を動的に更新する必要はありません。特定の入力タイプを設定できるかどうかを確実にテストする唯一の方法は、IMFTransform::SetOutputType を呼び出すことです。
場合によっては、MFT は 1 つ以上の入力タイプが設定されるまで出力タイプの一覧を返せないことがあります。その場合、メソッドは MF_E_TRANSFORM_TYPE_NOT_SET を返します。
MFT はこのメソッドを実装する必要はありません。ただし、サポートするタイプが単純で MFTGetInfo 関数を通じて検出できる場合を除き、ほとんどの MFT はこのメソッドを実装すべきです。
このメソッドは部分的なメディアタイプを返すことがあります。部分的なメディアタイプはフォーマットの記述が不完全であり、呼び出し側にヒントを提供するために使用されます。例えば、部分的なタイプにはメジャータイプとサブタイプの GUID のみが含まれる場合があります。ただし、クライアントが MFT に入力タイプを設定した後は、MFT は通常、そのまま変更せずに使用できる完全な出力タイプを少なくとも 1 つ返すべきです。 詳細については、Complete and Partial Media Types を参照してください。
一部の MFT は、最初の入力サンプルを受け取るまで正確な出力タイプの一覧を提供できません。例えば、MFT はフォーマットを推定するために最初のパケットヘッダーを読み取る必要がある場合があります。MFT はこの状況を以下のように処理すべきです。
- MFT が入力を受け取る前に、生成し得る 1 つ以上の出力タイプの一覧を提示します。例えば、MPEG-2 デコーダーは MPEG-2 メインプロファイル/メインレベルを記述するメディアタイプを返す場合があります。
- クライアントはこれらのタイプの 1 つ(通常は最初のもの)を選択し、出力ストリームに設定します。
- クライアントは IMFTransform::ProcessInput を呼び出して最初の入力サンプルを配信します。
- 出力タイプが入力データに適合しない場合、変換は ProcessOutput メソッドでフォーマット変更を通知します。フォーマット変更の詳細については、IMFTransform::ProcessOutput を参照してください。
- 再度 GetOutputAvailableType を呼び出します。この時点で、メソッドは入力データを反映した更新済みのタイプの一覧を返すべきです。
- クライアントはこの一覧から新しい出力タイプを選択し、SetOutputType を呼び出します。
実装に関する注意
MFT がメディアタイプを内部的に保持している場合、MFT は元のタイプへのポインターではなく、メディアタイプのクローンを返すべきです。そうしないと、呼び出し側がタイプを変更して MFT の内部状態を変更してしまう可能性があります。この Media Foundation transform (MFT) の入力ストリームに対してメディアタイプを設定、テスト、またはクリアします。
| dwInputStreamID | DWORD | in | 入力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。 |
| pType | IMFMediaType* | in | IMFMediaType インターフェイスへのポインター、または NULL です。 |
| dwFlags | DWORD | in | _MFT_SET_TYPE_FLAGS 列挙型の 0 個以上のフラグです。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| MFT は提案されたメディアタイプを使用できません。 | |
| 無効なストリーム識別子です。 | |
| 提案されたタイプが有効ではありません。このエラーコードは、メディアタイプ自体が正しく構成されていないことを示します。例えば、相互に矛盾する属性が含まれている可能性があります。 | |
| MFT はデータの処理中にタイプを切り替えることができません。MFT のドレインまたはフラッシュを試みてください。 | |
| 入力タイプを設定する前に、出力タイプを設定する必要があります。 | |
| MFT は適切な DirectX Video Acceleration (DXVA) 構成を見つけることができませんでした。 |
解説(Remarks)
このメソッドは、メディアタイプの設定、設定せずにテスト、またはクリアに使用できます。
- メディアタイプを設定するには、dwFlags を 0 に設定し、pType をメディアタイプを指定する非 NULL ポインターに設定します。
- メディアタイプを設定せずにテストするには、dwFlags を MFT_SET_TYPE_TEST_ONLY に設定し、pType をメディアタイプを指定する非 NULL ポインターに設定します。メディアタイプが受け入れ可能な場合、メソッドは S_OK を返します。それ以外の場合は MF_E_INVALIDMEDIATYPE を返します。戻り値にかかわらず、現在のメディアタイプは変更されません。
- メディアタイプをクリアするには、pType を NULL に設定します。
MFT は、入力タイプを設定する前に呼び出し側が 1 つ以上の出力タイプを設定することを要求する場合があります。その場合、メソッドは MF_E_TRANSFORM_TYPE_NOT_SET を返します。
MFT が DirectX Video Acceleration (DXVA) をサポートしていても、適切な DXVA 構成を見つけられない場合(例えば、グラフィックスドライバーが適切な機能を持っていない場合)、メソッドは MF_E_UNSUPPORTED_D3D_TYPE を返すべきです。詳細については、Supporting DXVA 2.0 in Media Foundation を参照してください。
mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTSetInputType に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。
この Media Foundation transform (MFT) の出力ストリームに対してメディアタイプを設定、テスト、またはクリアします。
| dwOutputStreamID | DWORD | in | 出力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。 |
| pType | IMFMediaType* | in | IMFMediaType インターフェイスへのポインター、または NULL です。 |
| dwFlags | DWORD | in | _MFT_SET_TYPE_FLAGS 列挙型の 0 個以上のフラグです。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 変換は提案されたメディアタイプを使用できません。 | |
| 無効なストリーム識別子です。 | |
| 提案されたタイプが有効ではありません。このエラーコードは、メディアタイプ自体が正しく構成されていないことを示します。例えば、相互に矛盾するフラグが含まれている可能性があります。 | |
| MFT はデータの処理中にタイプを切り替えることができません。MFT のドレインまたはフラッシュを試みてください。 | |
| 出力タイプを設定する前に、入力タイプを設定する必要があります。 | |
| MFT は適切な DirectX Video Acceleration (DXVA) 構成を見つけることができませんでした。 |
解説(Remarks)
このメソッドは、メディアタイプの設定、設定せずにテスト、またはクリアに使用できます。
- メディアタイプを設定するには、dwFlags を 0 に設定し、pType をメディアタイプを指定する非 NULL ポインターに設定します。
- メディアタイプを設定せずにテストするには、dwFlags を MFT_SET_TYPE_TEST_ONLY に設定し、pType をメディアタイプを指定する非 NULL ポインターに設定します。メディアタイプが受け入れ可能な場合、メソッドは S_OK を返します。それ以外の場合は MF_E_INVALIDMEDIATYPE を返します。戻り値にかかわらず、現在のメディアタイプは変更されません。
- メディアタイプをクリアするには、pType を NULL に設定します。
MFT は、出力タイプを設定する前に呼び出し側が 1 つ以上の入力タイプを設定することを要求する場合があります。その場合、メソッドは MF_E_TRANSFORM_TYPE_NOT_SET を返します。
MFT が DirectX Video Acceleration (DXVA) をサポートしていても、適切な DXVA 構成を見つけられない場合(例えば、グラフィックスドライバーが適切な機能を持っていない場合)、メソッドは MF_E_UNSUPPORTED_D3D_TYPE を返すべきです。詳細については、Supporting DXVA 2.0 in Media Foundation を参照してください。
mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTSetOutputType に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。
この Media Foundation transform (MFT) の入力ストリームの現在のメディアタイプを取得します。
| dwInputStreamID | DWORD | in | 入力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。 |
| ppType | IMFMediaType** | out | IMFMediaType インターフェイスへのポインターを受け取ります。呼び出し側はこのインターフェイスを解放する必要があります。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 無効なストリーム識別子です。 | |
| 入力メディアタイプが設定されていません。 |
解説(Remarks)
指定された入力ストリームにまだメディアタイプが設定されていない場合、メソッドは MF_E_TRANSFORM_TYPE_NOT_SET を返します。ほとんどの MFT は、最初に作成された時点では既定のメディアタイプを設定しません。代わりに、クライアントが IMFTransform::SetInputType を呼び出してメディアタイプを設定する必要があります。
mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTGetInputCurrentType に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。
実装に関する注意
MFT は元のタイプへのポインターではなく、メディアタイプのクローンを返すべきです。そうしないと、呼び出し側がタイプを変更して MFT の内部状態を変更してしまう可能性があります。この Media Foundation transform (MFT) の出力ストリームの現在のメディアタイプを取得します。
| dwOutputStreamID | DWORD | in | 出力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。 |
| ppType | IMFMediaType** | out | IMFMediaType インターフェイスへのポインターを受け取ります。呼び出し側はこのインターフェイスを解放する必要があります。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 無効なストリーム識別子です。 | |
| 出力メディアタイプが設定されていません。 |
解説(Remarks)
指定された出力ストリームにまだメディアタイプが設定されていない場合、メソッドは MF_E_TRANSFORM_TYPE_NOT_SET を返します。ほとんどの MFT は、最初に作成された時点では既定のメディアタイプを設定しません。代わりに、クライアントが IMFTransform::SetOutputType を呼び出してメディアタイプを設定する必要があります。
mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTGetOutputCurrentType に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。
実装に関する注意
MFT は元のタイプへのポインターではなく、メディアタイプのクローンを返すべきです。そうしないと、呼び出し側がタイプを変更して MFT の内部状態を変更してしまう可能性があります。この Media Foundation transform (MFT) の入力ストリームがさらにデータを受け入れられるかどうかを照会します。
| dwInputStreamID | DWORD | in | 入力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。 |
| pdwFlags | DWORD* | out | _MFT_INPUT_STATUS_FLAGS 列挙型のメンバー、または 0 を受け取ります。値が MFT_INPUT_STATUS_ACCEPT_DATA の場合、dwInputStreamID で指定されたストリームはさらに入力データを受け入れることができます。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 無効なストリーム識別子です。 | |
| 1 つ以上のストリームでメディアタイプが設定されていません。 |
解説(Remarks)
メソッドが MFT_INPUT_STATUS_ACCEPT_DATA フラグを返した場合、IMFTransform::ProcessInput を呼び出して、指定したストリームに入力サンプルを配信できます。メソッドが成功しても pdwFlags パラメーターにフラグを返さない場合は、入力ストリームがすでに受け入れ可能な限りのデータを保持していることを意味します。
このメソッドを使用すると、新しいサンプルの確保や ProcessInput の呼び出しに伴うオーバーヘッドを発生させずに、入力ストリームがさらにデータを受け入れる準備ができているかどうかをテストできます。
すべてのストリームに有効なメディアタイプが設定された後、MFT は常に次の 2 つの状態のいずれか(またはその両方)にあるべきです。さらに入力を受け入れられる状態、または、さらに出力を生成できる状態です。
mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTGetInputStatus に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。
この Media Foundation transform (MFT) が出力データを生成する準備ができているかどうかを照会します。
| pdwFlags | DWORD* | out | _MFT_OUTPUT_STATUS_FLAGS 列挙型のメンバー、または 0 を受け取ります。値が MFT_OUTPUT_STATUS_SAMPLE_READY の場合、MFT は出力サンプルを生成できます。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 実装されていません。 | |
| 1 つ以上のストリームでメディアタイプが設定されていません。 |
解説(Remarks)
メソッドが MFT_OUTPUT_STATUS_SAMPLE_READY フラグを返した場合、IMFTransform::ProcessOutput を呼び出すことで 1 つ以上の出力サンプルを生成できることを意味します。
MFT はこのメソッドを実装する必要はありません。メソッドが E_NOTIMPL を返す場合は、ProcessOutput を呼び出して、変換に出力データがあるかどうかを判断する必要があります。
MFT が複数の出力ストリームを持ち、各ストリームで同時にサンプルを生成しない場合、1 つのストリームのみが準備できた時点で MFT_OUTPUT_STATUS_SAMPLE_READY フラグを設定できます。ただし、MFT が通常は各出力ストリームで同時にサンプルを生成する場合は、すべてのストリームが準備できるまでこのフラグを設定すべきではありません。
すべてのストリームに有効なメディアタイプが設定された後、MFT は常に次の 2 つの状態のいずれかにあるべきです。さらに入力を受け入れられる状態、または、さらに出力を生成できる状態です。
mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTGetOutputStatus に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。
クライアントが出力に必要とするタイムスタンプの範囲を設定します。
| hnsLowerBound | LONGLONG | in | 最も早いタイムスタンプを指定します。Media Foundation transform (MFT) は、この時刻に開始する出力サンプルを生成できるようになるまで、または、この時刻以降に終了するサンプルを生成できるようになるまで、入力を受け入れます。下限がない場合は、値 MFT_OUTPUT_BOUND_LOWER_UNBOUNDED を使用してください。 |
| hnsUpperBound | LONGLONG | in | 最も遅いタイムスタンプを指定します。MFT は、この時刻より後のタイムスタンプを持つ出力サンプルを生成しません。上限がない場合は、値 MFT_OUTPUT_BOUND_UPPER_UNBOUNDED を使用してください。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 実装されていません。 | |
| 1 つ以上のストリームでメディアタイプが設定されていません。 |
解説(Remarks)
このメソッドは、プリロールを最適化するために使用できます。特に、タイムスタンプ間にギャップがあるフォーマットや、MPEG-2 のようにデータが同期ポイントから開始しなければならないフォーマットで有用です。このメソッドの呼び出しは任意であり、MFT によるこのメソッドの実装も任意です。MFT がこのメソッドを実装していない場合、戻り値は E_NOTIMPL です。
MFT がこのメソッドを実装する場合、出力データを hnsLowerBound と hnsUpperBound で指定された時刻の範囲に制限しなければなりません。MFT は、この範囲内で出力を生成するために必要のない入力データを破棄します。サンプルの境界が範囲と正確に一致しない場合、MFT は可能であれば出力サンプルを分割すべきです。それができない場合、出力サンプルが範囲と重なることがあります。
例えば、出力範囲が 100 ~ 150 ミリ秒 (ms) で、出力フォーマットが各フレーム 33 ms のビデオであるとします。タイムスタンプが 67 ms のサンプルは範囲と重なる (67 + 33 = 100) ため、出力として生成されます。タイムスタンプが 66 ms のサンプルは破棄されます (66 + 33 = 99)。同様に、タイムスタンプが 150 ms のサンプルは出力として生成されますが、タイムスタンプが 151 のサンプルは破棄されます。
mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTSetOutputBounds に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。
この Media Foundation transform (MFT) の入力ストリームにイベントを送信します。
| dwInputStreamID | DWORD | in | 入力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。 |
| pEvent | IMFMediaEvent* | in | イベントオブジェクトの IMFMediaEvent インターフェイスへのポインターです。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 実装されていません。 | |
| 無効なストリーム番号です。 | |
| 1 つ以上のストリームでメディアタイプが設定されていません。 | |
| パイプラインはこのイベントを伝播すべきではありません。 |
解説(Remarks)
MFT はイベントを下流へ送信する処理を自身で行うことも、パイプラインに任せることもできます。これは戻り値によって示されます。
- E_NOTIMPL: MFT はすべてのイベントを無視し、パイプラインはすべてのイベントを下流へ送信すべきです。この戻り値をパイプラインが受け取った後、ProcessEvent が再度呼び出されないことがあります。
- S_OK: MFT はこのイベントを検査しましたが、パイプラインはイベントを下流へ送信すべきです。内部的には、MFT が何らかの方法でイベントに応答することも、イベントを無視することもあります。
- MF_S_TRANSFORM_DO_NOT_PROPAGATE_EVENT: パイプラインはこのイベントを下流へ伝播すべきではありません。MFT がイベントを下流へ送信するか、あるいは MFT がイベントを消費して下流へ送信しないかのいずれかです。MFT は、イベントがこの MFT で止まりこれ以上下流へ伝わるべきでない場合にのみ、イベントを消費すべきです。ただし、ほとんどの場合、イベントは下流へ伝わるべきです。
イベントは、その前後に来るサンプルとシリアル化(順序付け)されなければなりません。イベントは、そのイベントに続く出力サンプルに付加してください。(パイプラインは最初にイベントを処理し、その後サンプルを処理します。) MFT が IMFTransform::ProcessInput と ProcessOutput の呼び出し間で 1 つ以上のサンプルを保持している場合、この状況ではパイプラインが入力サンプルと出力サンプルを対応付けられないため、MFT はすべてのイベントを下流へ送信する処理を自身で行うべきです。
MFT がサンプルを保持せず、かつイベントを検査する必要もない場合は、E_NOTIMPL を返すことができます。
mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTProcessEvent に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。
この Media Foundation transform (MFT) にメッセージを送信します。
| eMessage | MFT_MESSAGE_TYPE | in | 送信するメッセージです。MFT_MESSAGE_TYPE 列挙型のメンバーとして指定します。 |
| ulParam | UINT_PTR | in | メッセージパラメーターです。このパラメーターの意味はメッセージの種類によって異なります。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 無効なストリーム番号です。MFT_MESSAGE_NOTIFY_END_OF_STREAM メッセージに適用されます。 | |
| 1 つ以上のストリームでメディアタイプが設定されていません。 |
解説(Remarks)
各メッセージの種類には異なる呼び出し順序の要件があります。詳細については MFT_MESSAGE_TYPE 列挙型を参照してください。
MFT は特定の種類のメッセージを無視することがあります。その場合、メソッドは S_OK を返します。エラーコードは、変換がその種類のメッセージを処理するものの、この場合にメッセージを処理できなかったことを示します。
mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTProcessMessage に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。
この Media Foundation transform (MFT) の入力ストリームにデータを配信します。
| dwInputStreamID | DWORD | in | 入力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。 |
| pSample | IMFSample* | in | 入力サンプルの IMFSample インターフェイスへのポインターです。サンプルには、有効な入力データを含むメディアバッファーが少なくとも 1 つ含まれていなければなりません。 |
| dwFlags | DWORD | in | 予約されています。0 でなければなりません。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| 無効な引数です。 | |
| 無効なストリーム識別子です。 | |
|
入力サンプルには有効なサンプル継続時間が必要です。継続時間を設定するには、IMFSample::SetSampleDuration を呼び出してください。
一部の MFT は入力サンプルに有効な継続時間を必要とします。一部の MFT はサンプル継続時間を必要としません。 |
|
|
入力サンプルにはタイムスタンプが必要です。タイムスタンプを設定するには、IMFSample::SetSampleTime を呼び出してください。
一部の MFT は入力サンプルに有効なタイムスタンプを必要とします。一部の MFT はタイムスタンプを必要としません。 |
|
| 変換は現時点でこれ以上入力を処理できません。 | |
| 1 つ以上のストリームでメディアタイプが設定されていません。 | |
| メディアタイプが DirectX Video Acceleration (DXVA) でサポートされていません。DXVA 対応のデコーダーがこのエラーコードを返す場合があります。 |
解説(Remarks)
ほとんどの場合、メソッドが成功すると、MFT はサンプルを保存し、IMFSample ポインターに対する参照カウントを保持します。MFT がサンプルを解放するまで、サンプルを再利用しないでください。ただし、MFT はサンプルを保存する代わりに、サンプルデータを新しいバッファーにコピーする場合があります。その場合、MFT は IMFTransform::GetInputStreamInfo メソッドで MFT_INPUT_STREAM_DOES_NOT_ADDREF フラグを設定すべきです。
MFT がすでに出力サンプルを生成するのに十分な入力データを持っている場合、新しい入力データを受け入れず、ProcessInput は MF_E_NOTACCEPTING を返します。その時点で、クライアントは以下のいずれかを行って保留中の入力データをクリアすべきです。
- IMFTransform::ProcessOutput を呼び出して新しい出力を生成する。
- MFT_MESSAGE_COMMAND_FLUSH メッセージを指定して IMFTransform::ProcessMessage を呼び出し、入力データをフラッシュする。
MFT は ProcessInput メソッドの中で入力データを処理できます。ただし、ほとんどの MFT はクライアントが ProcessOutput を呼び出すまで待機します。
すべてのストリームに有効なメディアタイプが設定された後、MFT は常に次の 2 つの状態のいずれかにあるべきです。さらに入力を受け入れられる状態、または、さらに出力を生成できる状態です。両方の状態にあることも、どちらの状態にもないこともあってはなりません。MFT は、少なくとも 1 つの出力サンプルを生成するのに必要な量の入力のみを受け入れるべきであり、その時点で ProcessInput は MF_E_NOTACCEPTING を返します。ProcessInput が MF_E_NOTACCEPTING を返した場合、クライアントは MFT が出力を生成する準備ができていると想定できます。
MFT が入力データで致命的でないエラーに遭遇した場合、そのデータを単純に破棄し、さらに入力データを受け取ったときに回復を試みることができます。さらに入力データを要求するには、MFT は IMFTransform::ProcessOutput メソッドから MF_E_TRANSFORM_NEED_MORE_INPUT を返します。MFT がデータを破棄した場合、データストリームにギャップがあることを呼び出し側に通知するために、次の出力サンプルに MFSampleExtension_Discontinuity 属性を設定すべきです。
mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTProcessInput に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。
非同期処理
上記の解説は同期処理モデルについて説明しています。非同期処理をサポートするには、Asynchronous MFTs を参照してください。現在の入力データから出力を生成します。
| dwFlags | DWORD | in | _MFT_PROCESS_OUTPUT_FLAGS 列挙型の 0 個以上のフラグのビットごとの OR です。 |
| cOutputBufferCount | DWORD | in | pOutputSamples 配列の要素数です。値は 1 以上でなければなりません。 |
| pOutputSamples | MFT_OUTPUT_DATA_BUFFER* | inout | 呼び出し側が確保した MFT_OUTPUT_DATA_BUFFER 構造体の配列へのポインターです。MFT はこの配列を使用して呼び出し側に出力データを返します。 |
| pdwStatus | DWORD* | out | _MFT_PROCESS_OUTPUT_STATUS 列挙型の 0 個以上のフラグのビットごとの OR を受け取ります。 |
戻り値
このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。
| 戻り値 | 説明 |
|---|---|
| メソッドは成功しました。 | |
| ProcessOutput メソッドが、この呼び出しを想定していない非同期 MFT に対して呼び出されました。 | |
| 1 つ以上の MFT_OUTPUT_DATA_BUFFER 構造体の dwStreamID メンバーに無効なストリーム識別子があります。 | |
| 変換は、さらに入力データを受け取るまで出力データを生成できません。 | |
| 出力ストリームでフォーマットが変更されたか、新しい優先フォーマットがあるか、または新しい出力ストリームがあります。 | |
| MFT の 1 つ以上のストリームでメディアタイプを設定する必要があります。 |
解説(Remarks)
pOutputSamples 配列のサイズは、選択されている出力ストリームの数以上でなければなりません。選択されている出力ストリームの数は、出力ストリームの総数から選択解除されているストリームの数を引いたものです。ストリームが MFT_OUTPUT_STREAM_OPTIONAL フラグを持ち、呼び出し側がメディアタイプを設定しない(またはメディアタイプを NULL に設定した)場合、そのストリームは選択解除されます。詳細については、_MFT_OUTPUT_STREAM_INFO_FLAGS 列挙型を参照してください。
このメソッドは出力サンプルを生成し、イベントを生成することもできます。メソッドが成功した場合、以下の条件の少なくとも 1 つが真になります。
- pOutputSamples 配列内の 1 つ以上のサンプルに出力データが含まれている。
- pOutputSamples 配列の 1 つ以上のメンバーに、空でないイベントのコレクションが含まれている。
出力バッファー
MFT は、MFT_OUTPUT_DATA_BUFFER 構造体の pSample メンバーを通じてストリームの出力データを返します。この構造体メンバーは、メディアサンプルの IMFSample インターフェイスへのポインターです。(Media Samples を参照してください。) メディアサンプルは、MFT の割り当てモデルに応じて、呼び出し側または MFT のいずれかが確保します。割り当てモデルを確認するには、IMFTransform::GetOutputStreamInfo を呼び出し、MFT_OUTPUT_STREAM_INFO 構造体の dwFlags メンバーを調べてください。- MFT_OUTPUT_STREAM_PROVIDES_SAMPLES フラグが存在する場合、MFT がメディアサンプルを確保します。
- MFT_OUTPUT_STREAM_CAN_PROVIDE_SAMPLES フラグが存在する場合、呼び出し側は任意でメディアサンプルを提供できます。pSample が NULL の場合、MFT がメディアサンプルを確保します。
- これら 2 つのフラグのどちらも存在しない場合、呼び出し側がメディアサンプルを確保しなければなりません。
呼び出し側がメディアサンプルを確保する場合、そのメディアサンプルには出力データを保持するのに十分な大きさのバッファーが含まれていなければなりません。バッファー要件を確認するには、GetOutputStreamInfo を呼び出してください。MFT は出力データをバッファーの先頭に書き込み、バッファーにすでに存在するデータを上書きします。
MFT がサンプルを確保する場合、MFT はそのサンプルのバッファーも確保します。
MFT が複数の出力ストリームを持つ場合、各ストリームは異なるレートで出力を生成する可能性があるため、一部のストリームには出力があり、他のストリームには出力がないことがあります。ストリームが出力を生成しなかった場合、MFT はそのストリームの MFT_OUTPUT_DATA_BUFFER 構造体の dwStatus メンバーに MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE フラグを設定します。その場合、呼び出し側が pSample を確保していたなら、サンプル内のバッファーには有効なデータが含まれていません。呼び出し側が pSample を確保していなかった場合、MFT_OUTPUT_DATA_BUFFER_NO_SAMPLE フラグは、メソッドが戻った後も pSample が NULL のままであることを示します。
出力ストリームのいずれにもデータがなく、MFT に返すべきイベントもない場合、ProcessOutput は MF_E_TRANSFORM_NEED_MORE_INPUT を返します。
MFT は、ProcessOutput の 1 回の呼び出しでストリームごとに複数のサンプルを返すことはできません。ProcessOutput が戻った後にストリームでさらに利用可能な出力データがある場合、MFT はそのストリームの MFT_OUTPUT_DATA_BUFFER 構造体の dwStatus メンバーに MFT_OUTPUT_DATA_BUFFER_INCOMPLETE フラグを設定します。
MFT が出力を生成するのに十分なデータを持っている場合、利用可能なすべての出力を取り出すのに十分な回数だけ ProcessOutput が呼び出されるまで、これ以上の入力を受け入れることを拒否すべきです。(例外は、IMFTransform::GetOutputStreamInfo メソッドが MFT_OUTPUT_STREAM_LAZY_READ フラグを返す場合です。) 一般に、複数の出力ストリームを持つ MFT は、すべてのストリームに出力があるのを待つのではなく、できるだけ早くストリームの出力を生成すべきです。
インバンドイベント
MFT は、各 MFT_OUTPUT_DATA_BUFFER 構造体の pEvents メンバーでイベントオブジェクトのコレクションを返すことができます。MFT はコレクションオブジェクトとイベントの両方を確保します。イベントを呼び出し側に送信するには、MFT は ProcessOutput の中で以下の手順を実行します。
- MFCreateCollection を呼び出して新しいコレクションオブジェクトを作成します。
- IMFCollection::AddElement を呼び出して、コレクションに 1 つ以上のイベントを追加します。
- MFT_OUTPUT_DATA_BUFFER 構造体の pEvents メンバーを IMFCollection ポインターに設定します。MFT はこのインターフェイスに参照カウントを残すため、呼び出し側はポインターを解放しなければなりません。
ProcessOutput メソッドが 1 つ以上のイベントと 0 個の出力サンプルを返すことは有効です。
MFT が確保したイベントを解放する責任は呼び出し側にあります。メソッドが戻ったら、各 MFT_OUTPUT_DATA_BUFFER 構造体の pEvents メンバーを確認してください。値が NULL でない場合、呼び出し側は IMFCollection インターフェイスポインターを解放しなければなりません。
// Release the events that an MFT might allocate in IMFTransform::ProcessOutput().
void ReleaseEventCollection(DWORD cOutputBuffers, MFT_OUTPUT_DATA_BUFFER* pBuffers)
{
for (DWORD i = 0; i < cOutputBuffers; i++)
{
if (pBuffers[i].pEvents)
{
pBuffers[i].pEvents->Release();
pBuffers[i].pEvents = NULL;
}
}
}
MFT は、インバンドイベントの送信に IMFMediaEventGenerator インターフェイスを使用すべきではありません。
ストリームの変更
ProcessOutput メソッドは、出力ストリームに次のいずれかの変更を引き起こす可能性があります。- 出力ストリームの削除。ストリームの削除を通知するには、MFT はそのストリームの MFT_OUTPUT_DATA_BUFFER 構造体の dwStatus メンバーに MFT_OUTPUT_DATA_BUFFER_STREAM_END フラグを設定します。
- 新しい出力ストリームの作成。新しい出力ストリームを通知するには、MFT は pdwStatus パラメーターに MFT_PROCESS_OUTPUT_STATUS_NEW_STREAMS フラグを設定します。新しいストリームは、削除されたストリームと同じストリーム識別子を持つことができます。
- 出力ストリームでのフォーマット変更。フォーマット変更を通知するには、MFT はそのストリームの MFT_OUTPUT_DATA_BUFFER 構造体の dwStatus メンバーに MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE フラグを設定します。
MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE フラグは、出力ストリームでのフォーマット変更を通知します。これは、現在のメディアタイプが無効になったこと、または優先順位が変更されてより効率的なフォーマットが利用可能になったことを意味する場合があります。後者の場合、クライアントが元のメディアタイプを再設定する可能性があります。無限ループを防ぐため、MFT は別の変更が発生するまで MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE フラグを再度設定すべきではありません。また、優先順位が変更されても現在のメディアタイプが依然として最も優先されるタイプである場合は、このフラグの設定を避けてください。
サンプル属性
入力サンプルは属性を持つことがあり、これらは IMFAttributes インターフェイスを通じてアクセスされます。特定の属性が適用されなくなった場合を除き、すべての属性は対応する出力サンプルにコピーされるべきです。属性をコピーする責任は次のように決まります。- MFT の MFPKEY_EXATTRIBUTE_SUPPORTED プロパティの値が VARIANT_TRUE の場合、MFT が属性をコピーします。
- MFPKEY_EXATTRIBUTE_SUPPORTED の値が VARIANT_FALSE の場合、またはプロパティが設定されていない場合、クライアントがサンプル属性をコピーしなければなりません。MFT が出力サンプルに設定する属性を上書きしないでください。
非同期処理
上記の解説は同期処理モデルについて説明しています。非同期処理をサポートするには、Asynchronous MFTs を参照してください。Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)
HSP用 COM定義
#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"。
#define global IID_IMFTransform "{BF94C121-5B05-4E6F-8000-BA598961414D}" #usecom global IMFTransform IID_IMFTransform "{}" #comfunc global IMFTransform_GetStreamLimits 3 var,var,var,var #comfunc global IMFTransform_GetStreamCount 4 var,var #comfunc global IMFTransform_GetStreamIDs 5 int,var,int,var #comfunc global IMFTransform_GetInputStreamInfo 6 int,var #comfunc global IMFTransform_GetOutputStreamInfo 7 int,var #comfunc global IMFTransform_GetAttributes 8 sptr #comfunc global IMFTransform_GetInputStreamAttributes 9 int,sptr #comfunc global IMFTransform_GetOutputStreamAttributes 10 int,sptr #comfunc global IMFTransform_DeleteInputStream 11 int #comfunc global IMFTransform_AddInputStreams 12 int,var #comfunc global IMFTransform_GetInputAvailableType 13 int,int,sptr #comfunc global IMFTransform_GetOutputAvailableType 14 int,int,sptr #comfunc global IMFTransform_SetInputType 15 int,sptr,int #comfunc global IMFTransform_SetOutputType 16 int,sptr,int #comfunc global IMFTransform_GetInputCurrentType 17 int,sptr #comfunc global IMFTransform_GetOutputCurrentType 18 int,sptr #comfunc global IMFTransform_GetInputStatus 19 int,var #comfunc global IMFTransform_GetOutputStatus 20 var #comfunc global IMFTransform_SetOutputBounds 21 int64,int64 #comfunc global IMFTransform_ProcessEvent 22 int,sptr #comfunc global IMFTransform_ProcessMessage 23 int,sptr #comfunc global IMFTransform_ProcessInput 24 int,sptr,int #comfunc global IMFTransform_ProcessOutput 25 int,int,var,var ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。#define global IID_IMFTransform "{BF94C121-5B05-4E6F-8000-BA598961414D}" #usecom global IMFTransform IID_IMFTransform "{}" #comfunc global IMFTransform_GetStreamLimits 3 sptr,sptr,sptr,sptr #comfunc global IMFTransform_GetStreamCount 4 sptr,sptr #comfunc global IMFTransform_GetStreamIDs 5 int,sptr,int,sptr #comfunc global IMFTransform_GetInputStreamInfo 6 int,sptr #comfunc global IMFTransform_GetOutputStreamInfo 7 int,sptr #comfunc global IMFTransform_GetAttributes 8 sptr #comfunc global IMFTransform_GetInputStreamAttributes 9 int,sptr #comfunc global IMFTransform_GetOutputStreamAttributes 10 int,sptr #comfunc global IMFTransform_DeleteInputStream 11 int #comfunc global IMFTransform_AddInputStreams 12 int,sptr #comfunc global IMFTransform_GetInputAvailableType 13 int,int,sptr #comfunc global IMFTransform_GetOutputAvailableType 14 int,int,sptr #comfunc global IMFTransform_SetInputType 15 int,sptr,int #comfunc global IMFTransform_SetOutputType 16 int,sptr,int #comfunc global IMFTransform_GetInputCurrentType 17 int,sptr #comfunc global IMFTransform_GetOutputCurrentType 18 int,sptr #comfunc global IMFTransform_GetInputStatus 19 int,sptr #comfunc global IMFTransform_GetOutputStatus 20 sptr #comfunc global IMFTransform_SetOutputBounds 21 int64,int64 #comfunc global IMFTransform_ProcessEvent 22 int,sptr #comfunc global IMFTransform_ProcessMessage 23 int,sptr #comfunc global IMFTransform_ProcessInput 24 int,sptr,int #comfunc global IMFTransform_ProcessOutput 25 int,int,sptr,sptr ; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。 ; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。 ; ※出力/バッファ引数はポインタ方式(token=sptr / 呼び出しは varptr(変数))。 ; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。