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

IMFTransform

COM
IIDbf94c121-5b05-4e6f-8000-ba598961414d継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

すべての Media Foundation Transform (MFT) が実装するインターフェイスです。

メソッド 23

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

vtbl 3 HRESULT GetStreamLimits(DWORD* pdwInputMinimum, DWORD* pdwInputMaximum, DWORD* pdwOutputMinimum, DWORD* pdwOutputMaximum)

この Media Foundation transform (MFT) の入力ストリームおよび出力ストリームの最小数と最大数を取得します。

pdwInputMinimumDWORD*out入力ストリームの最小数を受け取ります。
pdwInputMaximumDWORD*out入力ストリームの最大数を受け取ります。最大数が存在しない場合は、値 MFT_STREAMS_UNLIMITED を受け取ります。
pdwOutputMinimumDWORD*out出力ストリームの最小数を受け取ります。
pdwOutputMaximumDWORD*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 を参照してください。

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

この Media Foundation transform (MFT) の現在の入力ストリーム数および出力ストリーム数を取得します。

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

戻り値

このメソッドが成功した場合は S_OK を返します。それ以外の場合は HRESULT エラーコードを返します。

解説(Remarks)

このストリーム数には、選択されていないストリーム(メディアタイプを持たない、またはメディアタイプが NULL のストリーム)も含まれます。

このメソッドは NULL パラメーターを指定して呼び出すべきではありませんが、実際には一部の実装で NULL パラメーターが許容される場合があります。

mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTGetStreamCount に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。

vtbl 5 HRESULT GetStreamIDs(DWORD dwInputIDArraySize, DWORD* pdwInputIDs, DWORD dwOutputIDArraySize, DWORD* pdwOutputIDs)

この Media Foundation transform (MFT) の入力ストリームおよび出力ストリームのストリーム識別子を取得します。

dwInputIDArraySizeDWORDinpdwInputIDs 配列の要素数です。
pdwInputIDsDWORD*out

呼び出し側が確保した配列へのポインターです。メソッドはこの配列に入力ストリーム識別子を格納します。配列のサイズは、少なくとも入力ストリーム数以上でなければなりません。入力ストリーム数を取得するには、IMFTransform::GetStreamCount を呼び出してください。

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

dwOutputIDArraySizeDWORDinpdwOutputIDs 配列の要素数です。
pdwOutputIDsDWORD*out

呼び出し側が確保した配列へのポインターです。メソッドはこの配列に出力ストリーム識別子を格納します。配列のサイズは、少なくとも出力ストリーム数以上でなければなりません。出力ストリーム数を取得するには、GetStreamCount を呼び出してください。

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

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
E_NOTIMPL
実装されていません。「解説」を参照してください。
MF_E_BUFFERTOOSMALL
いずれか一方または両方の配列が小さすぎます。

解説(Remarks)

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

このメソッドは、以下の両方の条件が満たされる場合に E_NOTIMPL を返すことがあります。

以下のいずれかの条件が満たされる場合、このメソッドを実装しなければなりません。 すべての入力ストリーム識別子は MFT 内で一意でなければならず、すべての出力ストリーム識別子も一意でなければなりません。ただし、入力ストリームと出力ストリームは同じ識別子を共有できます。

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

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

mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTGetStreamIDs に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。

vtbl 6 HRESULT GetInputStreamInfo(DWORD dwInputStreamID, MFT_INPUT_STREAM_INFO* pStreamInfo)

この Media Foundation transform (MFT) の入力ストリームに関するバッファー要件やその他の情報を取得します。

dwInputStreamIDDWORDin入力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。
pStreamInfoMFT_INPUT_STREAM_INFO*outMFT_INPUT_STREAM_INFO 構造体へのポインターです。メソッドはこの構造体に入力ストリームに関する情報を格納します。

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
MF_E_INVALIDSTREAMNUMBER
無効なストリーム識別子です。

解説(Remarks)

このメソッドはメディアタイプを設定する前に呼び出しても問題ありません。ただし、この呼び出しの結果はメディアタイプの変更後や ProcessInput の呼び出し後に動的に変化することがあるため、これらのいずれかが発生した後にこのメソッドを再度呼び出す必要がある場合があります。

mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTGetInputStreamInfo に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。

vtbl 7 HRESULT GetOutputStreamInfo(DWORD dwOutputStreamID, MFT_OUTPUT_STREAM_INFO* pStreamInfo)

この Media Foundation transform (MFT) の出力ストリームに関するバッファー要件やその他の情報を取得します。

dwOutputStreamIDDWORDin出力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。
pStreamInfoMFT_OUTPUT_STREAM_INFO*outMFT_OUTPUT_STREAM_INFO 構造体へのポインターです。メソッドはこの構造体に出力ストリームに関する情報を格納します。

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
MF_E_INVALIDSTREAMNUMBER
無効なストリーム番号です。

解説(Remarks)

このメソッドはメディアタイプを設定する前に呼び出しても問題ありません。ただし、この呼び出しの結果はメディアタイプの変更後や ProcessOutput の呼び出し後に動的に変化することがあるため、これらのいずれかが発生した後にこのメソッドを再度呼び出す必要がある場合があります。

mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTGetOutputStreamInfo に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。

vtbl 8 HRESULT GetAttributes(IMFAttributes** pAttributes)

この Media Foundation transform (MFT) のグローバル属性ストアを取得します。

pAttributesIMFAttributes**outIMFAttributes インターフェイスへのポインターを受け取ります。呼び出し側はこのインターフェイスを解放する必要があります。

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
E_NOTIMPL
MFT は属性をサポートしていません。

解説(Remarks)

このメソッドで取得した IMFAttributes ポインターを使用して、MFT 全体に適用される属性を取得または設定します。入力ストリームの属性ストアを取得するには、IMFTransform::GetInputStreamAttributes を呼び出してください。出力ストリームの属性ストアを取得するには、IMFTransform::GetOutputStreamAttributes を呼び出してください。

このメソッドの実装は、MFT が特定の属性セットをサポートする必要がある場合を除き、任意です。例外として、ハードウェアベースの MFT はこのメソッドを実装しなければなりません。Hardware MFTs を参照してください。

vtbl 9 HRESULT GetInputStreamAttributes(DWORD dwInputStreamID, IMFAttributes** pAttributes)

この Media Foundation transform (MFT) の入力ストリームの属性ストアを取得します。

dwInputStreamIDDWORDin入力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。
pAttributesIMFAttributes**outIMFAttributes インターフェイスへのポインターを受け取ります。呼び出し側はこのインターフェイスを解放する必要があります。

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
E_NOTIMPL
MFT は入力ストリーム属性をサポートしていません。
MF_E_INVALIDSTREAMNUMBER
無効なストリーム識別子です。

解説(Remarks)

このメソッドの実装は、MFT が特定の属性セットをサポートする必要がある場合を除き、任意です。

MFT 全体の属性ストアを取得するには、IMFTransform::GetAttributes を呼び出してください。

vtbl 10 HRESULT GetOutputStreamAttributes(DWORD dwOutputStreamID, IMFAttributes** pAttributes)

この Media Foundation transform (MFT) の出力ストリームの属性ストアを取得します。

dwOutputStreamIDDWORDin出力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。
pAttributesIMFAttributes**outIMFAttributes インターフェイスへのポインターを受け取ります。呼び出し側はこのインターフェイスを解放する必要があります。

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
E_NOTIMPL
MFT は出力ストリーム属性をサポートしていません。
MF_E_INVALIDSTREAMNUMBER
無効なストリーム識別子です。

解説(Remarks)

このメソッドの実装は、MFT が特定の属性セットをサポートする必要がある場合を除き、任意です。

MFT 全体の属性ストアを取得するには、IMFTransform::GetAttributes を呼び出してください。

vtbl 11 HRESULT DeleteInputStream(DWORD dwStreamID)

この Media Foundation transform (MFT) から入力ストリームを削除します。

dwStreamIDDWORDin削除する入力ストリームの識別子です。

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
E_NOTIMPL
変換の入力ストリーム数は固定です。
MF_E_INVALIDREQUEST
ストリームは削除できないか、または変換が現在サポートできる入力ストリームの最小数になっています。
MF_E_INVALIDSTREAMNUMBER
無効なストリーム識別子です。
MF_E_TRANSFORM_INPUT_REMAINING
変換には、指定されたストリームに対する未処理の入力バッファーがあります。

解説(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 を参照してください。

vtbl 12 HRESULT AddInputStreams(DWORD cStreams, DWORD* adwStreamIDs)

この Media Foundation transform (MFT) に 1 つ以上の新しい入力ストリームを追加します。

cStreamsDWORDin追加するストリームの数です。
adwStreamIDsDWORD*inストリーム識別子の配列です。新しいストリーム識別子は、既存のどの入力ストリームとも一致してはなりません。

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
E_INVALIDARG
無効な引数です。
E_NOTIMPL
MFT の入力ストリーム数は固定です。

解説(Remarks)

新しいストリームがこの変換の入力ストリームの最大数を超える場合、メソッドは E_INVALIDARG を返します。入力ストリームの最大数を確認するには、IMFTransform::GetStreamLimits を呼び出してください。

新しいストリーム識別子のいずれかが既存の入力ストリームと競合する場合、メソッドは E_INVALIDARG を返します。

mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTAddInputStreams に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。

vtbl 13 HRESULT GetInputAvailableType(DWORD dwInputStreamID, DWORD dwTypeIndex, IMFMediaType** ppType)

この Media Foundation transform (MFT) の入力ストリームで利用可能なメディアタイプを取得します。

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

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
E_NOTIMPL
MFT は利用可能な入力タイプの一覧を持っていません。
MF_E_INVALIDSTREAMNUMBER
無効なストリーム識別子です。
MF_E_NO_MORE_TYPES
dwTypeIndex パラメーターが範囲外です。
MF_E_TRANSFORM_TYPE_NOT_SET
入力タイプを設定する前に、出力タイプを設定する必要があります。

解説(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 の内部状態を変更してしまう可能性があります。
vtbl 14 HRESULT GetOutputAvailableType(DWORD dwOutputStreamID, DWORD dwTypeIndex, IMFMediaType** ppType)

この Media Foundation transform (MFT) の出力ストリームで利用可能なメディアタイプを取得します。

dwOutputStreamIDDWORDin出力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。
dwTypeIndexDWORDin取得するメディアタイプのインデックスです。メディアタイプは 0 から番号付けされ、おおよその優先順位順に返されます。
ppTypeIMFMediaType**outIMFMediaType インターフェイスへのポインターを受け取ります。呼び出し側はこのインターフェイスを解放する必要があります。

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
E_NOTIMPL
MFT は利用可能な出力タイプの一覧を持っていません。
MF_E_INVALIDSTREAMNUMBER
無効なストリーム識別子です。
MF_E_NO_MORE_TYPES
dwTypeIndex パラメーターが範囲外です。
MF_E_TRANSFORM_TYPE_NOT_SET
出力タイプを設定する前に、入力タイプを設定する必要があります。

解説(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 はこの状況を以下のように処理すべきです。

  1. MFT が入力を受け取る前に、生成し得る 1 つ以上の出力タイプの一覧を提示します。例えば、MPEG-2 デコーダーは MPEG-2 メインプロファイル/メインレベルを記述するメディアタイプを返す場合があります。
  2. クライアントはこれらのタイプの 1 つ(通常は最初のもの)を選択し、出力ストリームに設定します。
  3. クライアントは IMFTransform::ProcessInput を呼び出して最初の入力サンプルを配信します。
  4. 出力タイプが入力データに適合しない場合、変換は ProcessOutput メソッドでフォーマット変更を通知します。フォーマット変更の詳細については、IMFTransform::ProcessOutput を参照してください。
  5. 再度 GetOutputAvailableType を呼び出します。この時点で、メソッドは入力データを反映した更新済みのタイプの一覧を返すべきです。
  6. クライアントはこの一覧から新しい出力タイプを選択し、SetOutputType を呼び出します。
mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTGetOutputAvailableType に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。

実装に関する注意

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

この Media Foundation transform (MFT) の入力ストリームに対してメディアタイプを設定、テスト、またはクリアします。

dwInputStreamIDDWORDin入力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。
pTypeIMFMediaType*inIMFMediaType インターフェイスへのポインター、または NULL です。
dwFlagsDWORDin_MFT_SET_TYPE_FLAGS 列挙型の 0 個以上のフラグです。

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
MF_E_INVALIDMEDIATYPE
MFT は提案されたメディアタイプを使用できません。
MF_E_INVALIDSTREAMNUMBER
無効なストリーム識別子です。
MF_E_INVALIDTYPE
提案されたタイプが有効ではありません。このエラーコードは、メディアタイプ自体が正しく構成されていないことを示します。例えば、相互に矛盾する属性が含まれている可能性があります。
MF_E_TRANSFORM_CANNOT_CHANGE_MEDIATYPE_WHILE_PROCESSING
MFT はデータの処理中にタイプを切り替えることができません。MFT のドレインまたはフラッシュを試みてください。
MF_E_TRANSFORM_TYPE_NOT_SET
入力タイプを設定する前に、出力タイプを設定する必要があります。
MF_E_UNSUPPORTED_D3D_TYPE
MFT は適切な DirectX Video Acceleration (DXVA) 構成を見つけることができませんでした。

解説(Remarks)

このメソッドは、メディアタイプの設定、設定せずにテスト、またはクリアに使用できます。

あるストリームでメディアタイプを設定すると、別のストリームで受け入れ可能なタイプが変わる場合があります。

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 を参照してください。

vtbl 16 HRESULT SetOutputType(DWORD dwOutputStreamID, IMFMediaType* pType, DWORD dwFlags)

この Media Foundation transform (MFT) の出力ストリームに対してメディアタイプを設定、テスト、またはクリアします。

dwOutputStreamIDDWORDin出力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。
pTypeIMFMediaType*inIMFMediaType インターフェイスへのポインター、または NULL です。
dwFlagsDWORDin_MFT_SET_TYPE_FLAGS 列挙型の 0 個以上のフラグです。

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
MF_E_INVALIDMEDIATYPE
変換は提案されたメディアタイプを使用できません。
MF_E_INVALIDSTREAMNUMBER
無効なストリーム識別子です。
MF_E_INVALIDTYPE
提案されたタイプが有効ではありません。このエラーコードは、メディアタイプ自体が正しく構成されていないことを示します。例えば、相互に矛盾するフラグが含まれている可能性があります。
MF_E_TRANSFORM_CANNOT_CHANGE_MEDIATYPE_WHILE_PROCESSING
MFT はデータの処理中にタイプを切り替えることができません。MFT のドレインまたはフラッシュを試みてください。
MF_E_TRANSFORM_TYPE_NOT_SET
出力タイプを設定する前に、入力タイプを設定する必要があります。
MF_E_UNSUPPORTED_D3D_TYPE
MFT は適切な DirectX Video Acceleration (DXVA) 構成を見つけることができませんでした。

解説(Remarks)

このメソッドは、メディアタイプの設定、設定せずにテスト、またはクリアに使用できます。

あるストリームでメディアタイプを設定すると、別のストリームで受け入れ可能なタイプが変わる場合があります。

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 を参照してください。

vtbl 17 HRESULT GetInputCurrentType(DWORD dwInputStreamID, IMFMediaType** ppType)

この Media Foundation transform (MFT) の入力ストリームの現在のメディアタイプを取得します。

dwInputStreamIDDWORDin入力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。
ppTypeIMFMediaType**outIMFMediaType インターフェイスへのポインターを受け取ります。呼び出し側はこのインターフェイスを解放する必要があります。

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
MF_E_INVALIDSTREAMNUMBER
無効なストリーム識別子です。
MF_E_TRANSFORM_TYPE_NOT_SET
入力メディアタイプが設定されていません。

解説(Remarks)

指定された入力ストリームにまだメディアタイプが設定されていない場合、メソッドは MF_E_TRANSFORM_TYPE_NOT_SET を返します。ほとんどの MFT は、最初に作成された時点では既定のメディアタイプを設定しません。代わりに、クライアントが IMFTransform::SetInputType を呼び出してメディアタイプを設定する必要があります。

mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTGetInputCurrentType に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。

実装に関する注意

MFT は元のタイプへのポインターではなく、メディアタイプのクローンを返すべきです。そうしないと、呼び出し側がタイプを変更して MFT の内部状態を変更してしまう可能性があります。
vtbl 18 HRESULT GetOutputCurrentType(DWORD dwOutputStreamID, IMFMediaType** ppType)

この Media Foundation transform (MFT) の出力ストリームの現在のメディアタイプを取得します。

dwOutputStreamIDDWORDin出力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。
ppTypeIMFMediaType**outIMFMediaType インターフェイスへのポインターを受け取ります。呼び出し側はこのインターフェイスを解放する必要があります。

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
MF_E_INVALIDSTREAMNUMBER
無効なストリーム識別子です。
MF_E_TRANSFORM_TYPE_NOT_SET
出力メディアタイプが設定されていません。

解説(Remarks)

指定された出力ストリームにまだメディアタイプが設定されていない場合、メソッドは MF_E_TRANSFORM_TYPE_NOT_SET を返します。ほとんどの MFT は、最初に作成された時点では既定のメディアタイプを設定しません。代わりに、クライアントが IMFTransform::SetOutputType を呼び出してメディアタイプを設定する必要があります。

mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTGetOutputCurrentType に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。

実装に関する注意

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

この Media Foundation transform (MFT) の入力ストリームがさらにデータを受け入れられるかどうかを照会します。

dwInputStreamIDDWORDin入力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。
pdwFlagsDWORD*out_MFT_INPUT_STATUS_FLAGS 列挙型のメンバー、または 0 を受け取ります。値が MFT_INPUT_STATUS_ACCEPT_DATA の場合、dwInputStreamID で指定されたストリームはさらに入力データを受け入れることができます。

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
MF_E_INVALIDSTREAMNUMBER
無効なストリーム識別子です。
MF_E_TRANSFORM_TYPE_NOT_SET
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 を参照してください。

vtbl 20 HRESULT GetOutputStatus(DWORD* pdwFlags)

この Media Foundation transform (MFT) が出力データを生成する準備ができているかどうかを照会します。

pdwFlagsDWORD*out_MFT_OUTPUT_STATUS_FLAGS 列挙型のメンバー、または 0 を受け取ります。値が MFT_OUTPUT_STATUS_SAMPLE_READY の場合、MFT は出力サンプルを生成できます。

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
E_NOTIMPL
実装されていません。
MF_E_TRANSFORM_TYPE_NOT_SET
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 を参照してください。

vtbl 21 HRESULT SetOutputBounds(LONGLONG hnsLowerBound, LONGLONG hnsUpperBound)

クライアントが出力に必要とするタイムスタンプの範囲を設定します。

hnsLowerBoundLONGLONGin最も早いタイムスタンプを指定します。Media Foundation transform (MFT) は、この時刻に開始する出力サンプルを生成できるようになるまで、または、この時刻以降に終了するサンプルを生成できるようになるまで、入力を受け入れます。下限がない場合は、値 MFT_OUTPUT_BOUND_LOWER_UNBOUNDED を使用してください。
hnsUpperBoundLONGLONGin最も遅いタイムスタンプを指定します。MFT は、この時刻より後のタイムスタンプを持つ出力サンプルを生成しません。上限がない場合は、値 MFT_OUTPUT_BOUND_UPPER_UNBOUNDED を使用してください。

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
E_NOTIMPL
実装されていません。
MF_E_TRANSFORM_TYPE_NOT_SET
1 つ以上のストリームでメディアタイプが設定されていません。

解説(Remarks)

このメソッドは、プリロールを最適化するために使用できます。特に、タイムスタンプ間にギャップがあるフォーマットや、MPEG-2 のようにデータが同期ポイントから開始しなければならないフォーマットで有用です。このメソッドの呼び出しは任意であり、MFT によるこのメソッドの実装も任意です。MFT がこのメソッドを実装していない場合、戻り値は E_NOTIMPL です。

MFT がこのメソッドを実装する場合、出力データを hnsLowerBoundhnsUpperBound で指定された時刻の範囲に制限しなければなりません。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 を参照してください。

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

この Media Foundation transform (MFT) の入力ストリームにイベントを送信します。

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

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
E_NOTIMPL
実装されていません。
MF_E_INVALIDSTREAMNUMBER
無効なストリーム番号です。
MF_E_TRANSFORM_TYPE_NOT_SET
1 つ以上のストリームでメディアタイプが設定されていません。
MF_S_TRANSFORM_DO_NOT_PROPAGATE_EVENT
パイプラインはこのイベントを伝播すべきではありません。

解説(Remarks)

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

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

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

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

mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTProcessEvent に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。

vtbl 23 HRESULT ProcessMessage(MFT_MESSAGE_TYPE eMessage, UINT_PTR ulParam)

この Media Foundation transform (MFT) にメッセージを送信します。

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

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
MF_E_INVALIDSTREAMNUMBER
無効なストリーム番号です。MFT_MESSAGE_NOTIFY_END_OF_STREAM メッセージに適用されます。
MF_E_TRANSFORM_TYPE_NOT_SET
1 つ以上のストリームでメディアタイプが設定されていません。

解説(Remarks)

各メッセージの種類には異なる呼び出し順序の要件があります。詳細については MFT_MESSAGE_TYPE 列挙型を参照してください。

MFT は特定の種類のメッセージを無視することがあります。その場合、メソッドは S_OK を返します。エラーコードは、変換がその種類のメッセージを処理するものの、この場合にメッセージを処理できなかったことを示します。

mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTProcessMessage に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。

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

この Media Foundation transform (MFT) の入力ストリームにデータを配信します。

dwInputStreamIDDWORDin入力ストリーム識別子です。ストリーム識別子の一覧を取得するには、IMFTransform::GetStreamIDs を呼び出してください。
pSampleIMFSample*in入力サンプルの IMFSample インターフェイスへのポインターです。サンプルには、有効な入力データを含むメディアバッファーが少なくとも 1 つ含まれていなければなりません。
dwFlagsDWORDin予約されています。0 でなければなりません。

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
E_INVALIDARG
無効な引数です。
MF_E_INVALIDSTREAMNUMBER
無効なストリーム識別子です。
MF_E_NO_SAMPLE_DURATION
入力サンプルには有効なサンプル継続時間が必要です。継続時間を設定するには、IMFSample::SetSampleDuration を呼び出してください。

一部の MFT は入力サンプルに有効な継続時間を必要とします。一部の MFT はサンプル継続時間を必要としません。

MF_E_NO_SAMPLE_TIMESTAMP
入力サンプルにはタイムスタンプが必要です。タイムスタンプを設定するには、IMFSample::SetSampleTime を呼び出してください。

一部の MFT は入力サンプルに有効なタイムスタンプを必要とします。一部の MFT はタイムスタンプを必要としません。

MF_E_NOTACCEPTING
変換は現時点でこれ以上入力を処理できません。
MF_E_TRANSFORM_TYPE_NOT_SET
1 つ以上のストリームでメディアタイプが設定されていません。
MF_E_UNSUPPORTED_D3D_TYPE
メディアタイプが DirectX Video Acceleration (DXVA) でサポートされていません。DXVA 対応のデコーダーがこのエラーコードを返す場合があります。
注意 DirectX Media Object (DMO) を MFT に変換する場合、IMediaObject::ProcessInput メソッドとは異なり、S_FALSEIMFTransform::ProcessInput の有効な戻り値ではないことに注意してください。

解説(Remarks)

ほとんどの場合、メソッドが成功すると、MFT はサンプルを保存し、IMFSample ポインターに対する参照カウントを保持します。MFT がサンプルを解放するまで、サンプルを再利用しないでください。ただし、MFT はサンプルを保存する代わりに、サンプルデータを新しいバッファーにコピーする場合があります。その場合、MFT は IMFTransform::GetInputStreamInfo メソッドで MFT_INPUT_STREAM_DOES_NOT_ADDREF フラグを設定すべきです。

MFT がすでに出力サンプルを生成するのに十分な入力データを持っている場合、新しい入力データを受け入れず、ProcessInputMF_E_NOTACCEPTING を返します。その時点で、クライアントは以下のいずれかを行って保留中の入力データをクリアすべきです。

このルールの例外は MFT_OUTPUT_STREAM_LAZY_READ フラグです。このフラグが存在する場合、変換に追加の入力を与えると、保存済みのサンプルが破棄されます。詳細については、IMFTransform::GetOutputStreamInfo を参照してください。変換は、正しい出力を生成するために必要な量を超えて入力データをキューに保持すべきではありません。

MFT は ProcessInput メソッドの中で入力データを処理できます。ただし、ほとんどの MFT はクライアントが ProcessOutput を呼び出すまで待機します。

すべてのストリームに有効なメディアタイプが設定された後、MFT は常に次の 2 つの状態のいずれかにあるべきです。さらに入力を受け入れられる状態、または、さらに出力を生成できる状態です。両方の状態にあることも、どちらの状態にもないこともあってはなりません。MFT は、少なくとも 1 つの出力サンプルを生成するのに必要な量の入力のみを受け入れるべきであり、その時点で ProcessInputMF_E_NOTACCEPTING を返します。ProcessInputMF_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 を参照してください。
vtbl 25 HRESULT ProcessOutput(DWORD dwFlags, DWORD cOutputBufferCount, MFT_OUTPUT_DATA_BUFFER* pOutputSamples, DWORD* pdwStatus)

現在の入力データから出力を生成します。

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

戻り値

このメソッドは HRESULT を返します。指定可能な値には、以下の表に示すものが含まれますが、これらに限定されません。

戻り値 説明
S_OK
メソッドは成功しました。
E_UNEXPECTED
ProcessOutput メソッドが、この呼び出しを想定していない非同期 MFT に対して呼び出されました。
MF_E_INVALIDSTREAMNUMBER
1 つ以上の MFT_OUTPUT_DATA_BUFFER 構造体の dwStreamID メンバーに無効なストリーム識別子があります。
MF_E_TRANSFORM_NEED_MORE_INPUT
変換は、さらに入力データを受け取るまで出力データを生成できません。
MF_E_TRANSFORM_STREAM_CHANGE
出力ストリームでフォーマットが変更されたか、新しい優先フォーマットがあるか、または新しい出力ストリームがあります。
MF_E_TRANSFORM_TYPE_NOT_SET
MFT の 1 つ以上のストリームでメディアタイプを設定する必要があります。
注意 DirectX Media Object (DMO) を MFT に変換する場合、IMediaObject::ProcessOutput メソッドとは異なり、S_FALSEIMFTransform::ProcessOutput の有効な戻り値ではないことに注意してください。

解説(Remarks)

pOutputSamples 配列のサイズは、選択されている出力ストリームの数以上でなければなりません。選択されている出力ストリームの数は、出力ストリームの総数から選択解除されているストリームの数を引いたものです。ストリームが MFT_OUTPUT_STREAM_OPTIONAL フラグを持ち、呼び出し側がメディアタイプを設定しない(またはメディアタイプを NULL に設定した)場合、そのストリームは選択解除されます。詳細については、_MFT_OUTPUT_STREAM_INFO_FLAGS 列挙型を参照してください。

このメソッドは出力サンプルを生成し、イベントを生成することもできます。メソッドが成功した場合、以下の条件の少なくとも 1 つが真になります。

Mftransform.h をインクルードする前に MFT_UNIQUE_METHOD_NAMES が定義されている場合、このメソッドは MFTProcessOutput に名前が変更されます。Creating Hybrid DMO/MFT Objects を参照してください。

出力バッファー

MFT は、MFT_OUTPUT_DATA_BUFFER 構造体の pSample メンバーを通じてストリームの出力データを返します。この構造体メンバーは、メディアサンプルの IMFSample インターフェイスへのポインターです。(Media Samples を参照してください。) メディアサンプルは、MFT の割り当てモデルに応じて、呼び出し側または MFT のいずれかが確保します。割り当てモデルを確認するには、IMFTransform::GetOutputStreamInfo を呼び出し、MFT_OUTPUT_STREAM_INFO 構造体の dwFlags メンバーを調べてください。 これらのフラグは、出力ストリームのメディアタイプが変更されない限り一定です。

呼び出し側がメディアサンプルを確保する場合、そのメディアサンプルには出力データを保持するのに十分な大きさのバッファーが含まれていなければなりません。バッファー要件を確認するには、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 フラグは、メソッドが戻った後も pSampleNULL のままであることを示します。

出力ストリームのいずれにもデータがなく、MFT に返すべきイベントもない場合、ProcessOutputMF_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 の中で以下の手順を実行します。

  1. MFCreateCollection を呼び出して新しいコレクションオブジェクトを作成します。
  2. IMFCollection::AddElement を呼び出して、コレクションに 1 つ以上のイベントを追加します。
  3. MFT_OUTPUT_DATA_BUFFER 構造体の pEvents メンバーを IMFCollection ポインターに設定します。MFT はこのインターフェイスに参照カウントを残すため、呼び出し側はポインターを解放しなければなりません。
イベントにはタイムスタンプがありません。呼び出し側は、出力サンプルを処理する前にイベントを処理すべきです。言い換えると、イベントは、直前の ProcessOutput の呼び出しの直後、かつ現在の ProcessOutput の呼び出しから返される出力サンプルより前のストリーム上のポイントで発生します。

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 メソッドは、出力ストリームに次のいずれかの変更を引き起こす可能性があります。 ProcessOutput の 1 回の呼び出しで、これら 3 つのアクションすべてが発生する可能性があります。呼び出し側は、ここに示す順序、すなわち最初に削除、次に追加、最後にフォーマット変更の順で対応しなければなりません。

MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE フラグは、出力ストリームでのフォーマット変更を通知します。これは、現在のメディアタイプが無効になったこと、または優先順位が変更されてより効率的なフォーマットが利用可能になったことを意味する場合があります。後者の場合、クライアントが元のメディアタイプを再設定する可能性があります。無限ループを防ぐため、MFT は別の変更が発生するまで MFT_OUTPUT_DATA_BUFFER_FORMAT_CHANGE フラグを再度設定すべきではありません。また、優先順位が変更されても現在のメディアタイプが依然として最も優先されるタイプである場合は、このフラグの設定を避けてください。

サンプル属性

入力サンプルは属性を持つことがあり、これらは IMFAttributes インターフェイスを通じてアクセスされます。特定の属性が適用されなくなった場合を除き、すべての属性は対応する出力サンプルにコピーされるべきです。属性をコピーする責任は次のように決まります。 サンプル属性の一覧については、Sample Attributes を参照してください。

非同期処理

上記の解説は同期処理モデルについて説明しています。非同期処理をサポートするには、Asynchronous MFTs を参照してください。
出典・ライセンス: 上記「公式ドキュメント」の内容は 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_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 指定が可能。