ストリームの変更の処理

このトピックでは、ストリーミング中にメディア ファンデーション変換 (MFT) で形式の変更を処理する方法について説明します。

重要

このトピックはエンコーダーには適用されません。 エンコーダーは、このトピックで説明するように形式の変更を伝達すべきではありません。 エンコーダーは、現在構成されている出力の種類と一致する入力の種類のみを受け入れる必要があります。

書式変更の概要

一般に、ストリーミング中に形式が変更される可能性がある理由は 2 つがあります。

  • クライアントは、新しい形式のストリームに切り替える場合があります。 たとえば、デジタル テレビでは、チャネルの変更が原因でこれが発生する可能性があります。
  • H.264 などの一部のビデオ形式では、ビットストリームは形式の変更を知らされます。 このような変更には、フィールドの支配、ビデオ解像度、ピクセルの縦横比の変更が含まれる場合があります。

エンコードの種類が変更された場合、クライアントはパイプラインから MFT を削除し、別の MFT に置き換える必要がある場合があります。 (たとえば、クライアントは新しいデコーダーでスワップする必要がある場合があります)。このトピックでは、その状況については説明します。 このトピックでは、現在の MFT が新しい形式を処理できる場合にのみ説明します。

形式が変更された場合、MFT では、新しい入力型、新しい出力型、または両方が必要になる場合があります。

  • 入力の種類に対する変更は、クライアントによって開始されます。 MFT は、独自の入力型を変更する必要があります。
  • 出力の種類に対する変更は、MFT によって開始されます。 MFT は、新しい出力の種類を必要とするとシグナルを送信し、クライアントは新しい出力の種類を MFT とネゴシエートします。

したがって、次の 3 つの異なるケースが可能です。

  • クライアントは、新しい入力の種類を設定します。 MFT では新しい形式が使用され、出力の種類は変更されません。
  • クライアントは新しい入力の種類を設定し、出力の種類の変更をトリガーします。
  • 入力の種類は変更されませんが、MFT はビットストリームの形式の変更を検出します。この場合、新しい出力型が必要です。

書式変更の実装

このトピックの残りの部分では、クライアントが形式の変更を処理する方法と、MFT で形式の変更を実装する方法について説明します。

出力の種類

すべての MFT は、次のように、出力の種類の変更を開始できます。

  1. クライアントは IMFTransform::P rocessOutput を呼び出します。 MFT は次のように応答します。
    1. MFT では 、ProcessOutput で出力サンプルが生成されません
    2. MFT は、MFT OUTPUT DATA BUFFER 構造体の dwStatus メンバーに MFT _ OUTPUT DATA BUFFER _ FORMAT _ _ _ CHANGE フラグ _ _ を _ 設定します。
    3. ProcessOutput メソッドは、エラー コード MF E TRANSFORM STREAM CHANGE _ _ _ を返 _ します
  2. クライアントは IMFTransform::GetOutputAvailableType を呼び出します。 このメソッドは、更新された出力型のセットを返します。
  3. クライアントは SetOutputType を呼び出して 、新しい出力の種類を設定します。
  4. クライアントは ProcessInput / ProcessOutput の呼び出しを再開します

入力タイプ

入力の種類に対する変更は、MFT によって開始されるのとは異なって、クライアントによって開始されます。 入力の種類が変更された場合は、出力の種類の変更がトリガーされる可能性があります。

イベントの正確なシーケンスは 、MFT SUPPORT DYNAMIC FORMAT CHANGE 属性の _ _ 値 _ によって _ 異 なります。

説明
FALSE クライアントが新しい入力の種類を設定する前に、MFT をドレインする必要があります。
TRUE クライアントは、MFT をドレインせずに新しい入力の種類を設定できます。

MFT は 、IMFTransform::GetAttributes メソッドを使用してこの属性を公開します。 この属性の既定値は FALSE です。MFT で 属性が設定されていない場合は、値を FALSE として扱 います

MFT _ サポート _ の動的 _ 形式 _ の変更が FALSE

  1. クライアントは 、MFT _ MESSAGE _ COMMAND DRAIN メッセージ _ を送信 します。
  2. クライアントは 、ProcessOutput が MF E TRANSFORM NEED MORE INPUT を返すまで IMFTransform::P rocessOutput を呼び出して MFT _ _ _ _ をドレイン _ します
  3. クライアントは IMFTransform::SetInputType を呼び出して、新しい入力の種類を設定します。
  4. MFT は入力型を検証します。 型が無効な場合 、SetInputTypeMF E _ _ INVALIDMEDIATYPE または 別のエラー コードを返します。 それ以外の場合 、SetInputType は S OK を返 _ します。
  5. 入力型が有効である場合、MFT は出力の種類も変更されるかどうかを評価します。 それがない場合、ストリーミングは続行され、それ以上の操作は必要ありません。
  6. 出力の種類が変更された場合:
    1. MFT は、現在の出力メディアの種類を無効にし、使用可能な出力メディアの種類の一覧を更新します。
    2. ProcessOutputの次の呼び出しでは、前のセクションで説明したように 、MF _ E TRANSFORM STREAM _ _ _ CHANGE が返されます。
    3. クライアントは IMFTransform::GetOutputAvailableType を呼び出して、出力の種類の更新された一覧を取得します。
    4. クライアントは SetOutputType を呼び出します

MFT _ サポート _ の動的 _ 形式 _ の変更が TRUE である

  1. クライアントは IMFTransform::SetInputType を呼び出して、新しい入力の種類を設定します。
  2. MFT は入力型を検証します。 型が無効な場合 、SetInputTypeMF E _ _ INVALIDMEDIATYPE または 別のエラー コードを返します。 それ以外の場合 、SetInputType は S OK を返 _ します。
  3. 入力型が有効である場合、MFT は出力の種類も変更されるかどうかを評価します。 それがない場合、ストリーミングは続行され、それ以上の操作は必要ありません。
  4. 出力の種類が変更される前に、MFT はキャッシュされた入力サンプルを次のように処理する必要があります。
    1. MFT では、現在の出力の種類は無効にされません。
    2. MFT は、キャッシュされた入力サンプルから可能な限り多くの出力を生成します。
    3. キャッシュされたサンプルの処理中に MFT が新しい入力サンプルを受け入れるかどうかは省略可能です。 その場合、新しい入力サンプルでは新しい入力形式が使用されます。そのため、MFT では、形式が変更された時点を追跡する必要があります。
  5. MFT が入力型が変更される前に受け取ったすべてのサンプルを処理した後 、IMFTransform::P rocessOutputMF E TRANSFORM STREAM _ _ _ _ CHANGE を返します。
  6. MFT は現在の出力の種類を無効にし、使用可能な出力メディアの種類の一覧を更新します。
  7. 前に説明したように、クライアントは新しい出力の種類をネゴシエートします。

非同期 MFT SUPPORT DYNAMIC FORMAT CHANGE 属性の 値 TRUE を返 _ _ _ _ す必要 があります。 非同期 MFT を使用する場合、クライアントは MFT _ SUPPORT DYNAMIC FORMAT _ _ _ CHANGE 属性が TRUE に設定されていると想定 できます

MFT _ SUPPORT _ DYNAMIC FORMAT _ _ CHANGETRUE の場合、主な違いは、新しい入力の種類を設定する前にクライアントが MFT をドレインする必要がなされない点です。 その結果、MFT が入力サンプルを保持している間に入力の種類が変更される可能性があります。 MFT では、これらのサンプルが単に削除されるのではない点が重要です。 また、MFT がキャッシュされたデータをすべて処理するまで、出力の種類を変更することはできません。

前の段落は、特にビデオ デコーダーに適用されます。ビデオ デコーダーは、一時的な順序でコード間フレームを受信するため、それらをキャッシュする必要があります。 MFT が入力サンプルをキャッシュしない場合、ドレインは基本的に問題ではありません。 その場合、MFT では MFT _ SUPPORT _ DYNAMIC FORMAT _ _ CHANGEFALSE に設定できます (または、属性を設定しないままにしてください)。

また、すべての MFT は、ドレイン後に形式の変更を正しく処理する必要があります。 MFT _ SUPPORT _ DYNAMIC FORMAT _ _ CHANGE属性は、MFT がドレインせずに形式の変更をサポートするかどうかを示します。

インターレース モードでの変更

ビデオ インターレース モードの変更は、現在のメディアの種類を無効にしないので、特殊なケースです。 代わりに、メディア サンプルの属性を設定することで、ビデオ フレームごとにインターレース モードが指定されます。 ビデオ MFT では、これらのフラグが存在する各入力サンプルを確認する必要があります。

インターレース モードは、フィールドの支配が上フィールドから下のフィールドに切り替わる場合、またはビデオがプログレッシブ画像とインターレース画像の間で切り替わるときに変更される可能性があります。

詳細については、「サンプルの インターレース フラグ」を参照してください

カスタム MFT の作成