IMFTransform::P rocessOutput メソッド (mftransform.h)
現在の入力データから出力を生成します。
構文
HRESULT ProcessOutput(
[in] DWORD dwFlags,
[in] DWORD cOutputBufferCount,
[in, out] MFT_OUTPUT_DATA_BUFFER *pOutputSamples,
[out] DWORD *pdwStatus
);
パラメーター
[in] dwFlags
_MFT_PROCESS_OUTPUT_FLAGS列挙からの 0 個以上のフラグのビットごとの OR。
[in] cOutputBufferCount
pOutputSamples 配列内の要素の数。 値は少なくとも 1 である必要があります。
[in, out] pOutputSamples
呼び出し元によって割り当てられた MFT_OUTPUT_DATA_BUFFER 構造体の配列へのポインター。 MFT は、この配列を使用して、出力データを呼び出し元に返します。
[out] pdwStatus
_MFT_PROCESS_OUTPUT_STATUS列挙から 0 個以上のフラグのビットごとの OR を受け取ります。
戻り値
このメソッドは HRESULT を返します。 有効な値を次の表に示しますが、これ以外にもあります。
リターン コード | 説明 |
---|---|
|
メソッドが成功しました。 |
|
ProcessOutput メソッドは、このメソッド呼び出しを想定していない非同期 MFT で呼び出されました。 |
|
1 つ以上のMFT_OUTPUT_DATA_BUFFER構造体の dwStreamID メンバーのストリーム識別子が無効です。 |
|
変換は、より多くの入力データを受け取るまで出力データを生成できません。 |
|
出力ストリームで形式が変更されたか、新しい優先形式があるか、新しい出力ストリームが存在します。 |
|
MFT の 1 つ以上のストリームにメディアの種類を設定する必要があります。 |
注釈
pOutputSamples 配列のサイズは、選択した出力ストリームの数以上である必要があります。 選択した出力ストリームの数は、出力ストリームの合計数から 選択解除された ストリームの数を差し引いた値と等しくなります。 ストリームに MFT_OUTPUT_STREAM_OPTIONAL フラグがあり、呼び出し元がメディアの種類を設定していない (またはメディアの種類を NULL に設定する) 場合、ストリームの選択は解除されます。 詳細については、「 _MFT_OUTPUT_STREAM_INFO_FLAGS 列挙」を参照してください。
このメソッドは出力サンプルを生成し、イベントを生成することもできます。 メソッドが成功した場合、次の条件のうち少なくとも 1 つが true になります。
- pOutputSamples 配列内の 1 つ以上のサンプルに出力データが含まれています。
- pOutputSamples 配列の 1 つ以上のメンバーに、空でないイベントのコレクションが含まれています。
出力バッファー
MFT は、MFT_OUTPUT_DATA_BUFFER構造体の pSample メンバーを介してストリームの出力データを返します。 この構造体メンバーは、メディア サンプルの IMFSample インターフェイスへのポインターです。 ( 「メディア サンプル」を参照してください)。メディア サンプルは、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 インターフェイスを使用しないでください。
変更のStream
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 によって設定される属性は上書きしないでください。
非同期処理
前の解説では、 同期 処理モデルについて説明します。 非同期処理をサポートするには、「 非同期 MFT」を参照してください。要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows Vista [デスクトップ アプリのみ | UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2008 [デスクトップ アプリ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | mftransform.h |
Library | Mfuuid.lib |