次の方法で共有


ビデオインターレース

このトピックでは、メディア ソースとデコーダーがインターレースされたビデオ コンテンツを処理する方法について説明します。

インターレースされたビデオを正しくデコードしてレンダリングするには、次の情報が必要です。

  • プログレッシブまたはインターレース。 ビデオ ストリームには、プログレッシブ フレーム、インターレース フレーム、またはその両方の組み合わせを含めることができます。

  • フィールドの支配。 フィールドの支配は、最初に表示されるフィールド、上のフィールド、または下のフィールドを表します。

  • 最初のフィールドを繰り返します。 このフラグは、フレームがプログレッシブであるがストリームがインターレースされている場合に、3:2 プルダウンで使用されます。 このコンテキストでは、最初のフィールドを上または下のフィールドにすることができます。

  • インターリーブされたフィールドまたは単一のフィールド。 サンプルでは、1 つのフィールドまたは 2 つのインターリーブ フィールドを保持できます。 サンプルに 1 つのフィールドが含まれている場合、サンプルの高さはフレームの高さの半分になります。これは、サンプルに含まれるフレームのスキャン ラインの半分のみであるためです。 ソース コンテンツの特性が特に指定されていない限り、インターリーブされたフィールドをお勧めします。

これらの特性は、1 つのサンプルから次のサンプルに変更できます。 ただし、ビデオ コンポーネントは、ストリーミングを開始する前に、コンテンツ全体について何かを知る必要があります。 たとえば、ビデオがインターレースされている場合、拡張ビデオ レンダラー (EVR) は、デインターレース用にビデオ メモリを予約する必要があります。 一方、ビデオが完全にプログレッシブ フレームである場合、EVR はレンダリング パイプラインを最適化できます。 パイプラインにデインターレース ステップを追加すると、レンダリングの待機時間が長くなります。

インターレースに関する情報は、次の 2 つの場所に格納されます。

  • ストリーム内のインターレースに関する一般的な情報は、メディアの種類に配置されます。 メディアの種類の詳細については、「メディアの 種類」を参照してください。

  • 各サンプルで変更できる情報は、属性としてサンプルに配置されます。 サンプルの詳細については、「 メディア サンプル」を参照してください。

メディアタイプの情報をインターレースする

メディアの種類の MF_MT_INTERLACE_MODE 属性は、ストリーム全体がどのようにインターレースされるかを示します。 この属性の値は、 MFVideoInterlaceMode 列挙体のメンバーです。 ビデオ メディアの種類には、常にこの属性が必要です。

  • ストリームにプログレッシブ フレームのみが含まれている場合は、インターレース フレームがない場合は、MFVideoInterlace_Progressiveを使用します。
  • ストリームにインターレース フレームのみが含まれており、すべてのサンプルに 2 つのインターリーブ フィールドが含まれている場合は、MFVideoInterlace_FieldInterleavedUpperFirstまたはMFVideoInterlace_FieldInterleavedLowerFirstを使用します。
  • ストリームにインターレース フレームのみが含まれており、すべてのサンプルに 1 つのフィールドが含まれている場合は、MFVideoInterlace_FieldSingleUpperまたはMFVideoInterlace_FieldSingleLowerを使用します。 フィールドが upper と lower の間で交互に使用される場合、これら 2 つの値のうちどれが使用されるかは関係ありません。 書式に上位のフィールドだけが含まれている場合、または下のフィールドだけが含まれている場合は、コンテンツに対応する値を設定します。
  • ストリームにインターレースフレームとプログレッシブフレームが混在している場合、またはフィールド支配が切り替わる場合は、メディアタイプをMFVideoInterlace_MixedInterlaceOrProgressiveに設定します。 各フレームを記述するには、サンプル属性を使用します。

この属性の概要を次の表に示します。

MF_MT_INTERLACE_MODE インター レース。 サンプル 最初のフィールド
MFVideoInterlace_Progressive いいえ プログレッシブ フレーム 該当なし
MFVideoInterlace_FieldInterleavedUpperFirst はい インターリーブフィールド 先頭の上
MFVideoInterlace_FieldInterleavedLowerFirst はい インターリーブフィールド 最初に低い
MFVideoInterlace_FieldSingleUpper はい 単一フィールド 先頭の上
MFVideoInterlace_FieldSingleLower はい 単一フィールド 最初に低い
MFVideoInterlace_MixedInterlaceOrProgressive 異なる場合があります インターリーブされたフィールドまたはプログレッシブ フレーム 異なる場合があります

 

インターリーブされたフィールドと単一のフィールドを混在させることはできません。 1 つから別のメディアに切り替える場合は、メディアの種類を変更する必要があります。

サンプルでのフラグのインターレース

あるサンプルから次のサンプルに変更できる情報は、サンプル属性を使用して示されます。 これらの属性を取得または設定するには、 IMFSample インターフェイスを使用します。

このセクションに記載されているすべてのインターレース属性には、ブール値があります。 実際には、これらの各属性には、 TRUEFALSE、または未設定の 3 つの値を指定できます。 属性が設定されていない場合、値はメディアの種類から取得されます。 属性が設定されている場合、値はメディアの種類をオーバーライドします。 フラグとメディアの種類の一部の組み合わせが無効です。

属性 説明
MFSampleExtension_Interlaced TRUE の場合、フレームはインターレースされます。 FALSE の場合、フレームはプログレッシブになります。
メディアの種類がMFVideoInterlace_MixedInterlaceOrProgressive場合は、すべてのサンプルでこの属性を設定します。
MFSampleExtension_BottomFieldFirst このフラグの意味は、サンプルにインターリーブ フィールドと単一フィールドのどちらが含まれているかによって異なります。
  • インターリーブ フィールド: TRUE の場合、下位のフィールドが最初になります。 FALSE の場合、上のフィールドが最初になります。
  • 単一フィールド: TRUE の場合、サンプルには下位のフィールドが含まれます。 FALSE の場合、サンプルには上のフィールドが含まれます。
メディアの種類がMFVideoInterlace_FieldSingleUpper、MFVideoInterlace_FieldSingleLower、またはMFVideoInterlace_MixedInterlaceOrProgressiveの場合は、すべてのインターレース サンプルでこの属性を設定します。
MFSampleExtension_RepeatFirstField TRUE の場合、最初のフィールドが繰り返されます。 FALSE を設定しない場合、最初のフィールドは繰り返されません。
MFSampleExtension_SingleField TRUE の場合、サンプルには 1 つのフィールドが含まれます。 FALSE の場合、サンプルにはインターリーブされたフィールドが含まれます。

 

次の表は、メディアの種類に基づいて、必須、省略可能、または禁止されているフラグを示しています。

メディアの種類 インターレース フラグ BottomFieldFirst フラグ RepeatFirstField フラグ SingleField フラグ
プログレッシブ オプション;設定する場合は、 FALSE にする必要があります。 設定しないでください。 設定しないでください。 設定しないでください。
インターリーブフィールド オプション;設定する場合は、 TRUE にする必要があります。 オプション;が設定されている場合は、メディアの種類と一致する必要があります。 設定しないでください。 オプション;設定する場合は、 FALSE にする必要があります。
単一フィールド オプション;設定する場合は、 TRUE にする必要があります。 必須。 設定しないでください。 TRUE に設定 します
混在 必須。 必須。 必須。 オプション;設定する場合は、 FALSE にする必要があります。

 

属性が省略可能な場合は、メディアの種類によって情報が既に定義されています。 属性を一致するように設定することは有効ですが、必須ではありません。

たとえば、メディアの種類がMFVideoInterlace_Progressive場合、ストリーム内のすべてのフレームがプログレッシブであることを意味します。 したがって、 MFSampleExtension_Interlaced 属性を FALSE に設定するか、属性を未設定のままにすることができます。

推奨事項

このセクションには、さまざまな種類のコンテンツに関する推奨事項が含まれています。

  1. ビデオはすべてプログレッシブ フレームです。
  • メディアの種類を [MFVideoInterlace_Progressive] に設定します。

  • MFSampleExtension_Interlaced属性を設定したり、フレームごとに FALSE に設定したりしないでください。

  • MFSampleExtension_BottomFieldFirst、MFSampleExtension_RepeatFirstField、またはMFSampleExtension_SingleField属性は設定しないでください。

  1. ビデオは、同じフィールド支配を持つすべてのインターレース フィールドです。 サンプルにはインターリーブフィールドが含まれています。
  • メディアの種類をMFVideoInterlace_FieldInterleavedUpperFirstまたはMFVideoInterlace_FieldInterleavedLowerFirstに設定します。

  • MFSampleExtension_Interlaced属性を設定したり、フレームごとに TRUE に設定したりしないでください。

  • MFSampleExtension_BottomFieldFirst属性を設定したり、メディアの種類に合わせてフレームごとに値を設定したりしないでください。

  • MFSampleExtension_RepeatFirstField属性を設定したり、フレームごとに FALSE に設定したりしないでください。

  • MFSampleExtension_SingleField属性を設定したり、フレームごとに FALSE に設定したりしないでください。

  1. ビデオには、インターレースフレームとプログレッシブフレームの組み合わせが含まれており、フィールドが繰り返され、フィールドの支配が異なります (DVD ビデオなど)。
  • メディアの種類を [MFVideoInterlace_MixedInterlaceOrProgressive] に設定します。

  • フレームごとに、 MFSampleExtension_InterlacedMFSampleExtension_BottomFieldFirstおよびMFSampleExtension_RepeatFirstField 属性を設定します。

  • MFSampleExtension_SingleField属性を設定したり、フレームごとに FALSE に設定したりしないでください。

  1. ビデオはインターレースされ、サンプルには 1 つのフィールドが含まれています。
  • メディアの種類を [MFVideoInterlace_FieldSingleUpper] または [MFVideoInterlace_FieldSingleLower] に設定します。

  • フレームごとに、 MFSampleExtension_BottomFieldFirst 属性を設定します。

  • MFSampleExtension_Interlaced属性を設定したり、フレームごとに TRUE に設定したりしないでください。

  • MFSampleExtension_RepeatFirstField属性を設定したり、フレームごとに FALSE に設定したりしないでください。

  • MFSampleExtension_SingleField属性を設定したり、フレームごとに TRUE に設定したりしないでください。

ほとんどのビデオ コンテンツは、これらのカテゴリのいずれかに分類されます。

MPEG-2 マッピング

MPEG-2 コンテンツの場合は、次のマッピングを使用して、MPEG-2 フラグを Media Foundation のサンプル属性に変換します。

picture_structure

Sample 属性
frame = MFSampleExtension_SingleFieldFalse
top_field = MFSampleExtension_SingleFieldTrue
= MFSampleExtension_BottomFieldFirstFalse
bottom_field = MFSampleExtension_SingleFieldTrue
= MFSampleExtension_BottomFieldFirstTrue

 

progressive_frame

Sample 属性
0 = MFSampleExtension_InterlacedTrue
1 = MFSampleExtension_InterlacedFalse

 

top_field_first

Sample 属性
0 = MFSampleExtension_BottomFieldFirstTrue
1 = MFSampleExtension_BottomFieldFirstFalse

 

repeat_first_field

Sample 属性
0 = MFSampleExtension_RepeatFirstFieldFalse
1 = MFSampleExtension_RepeatFirstFieldTrue

 

Single-Field サンプル

メディアの種類がMFVideoInterlace_FieldSingleUpperまたはMFVideoInterlace_FieldSingleLower場合は、各サンプルに 1 つのフィールドが含まれていることを意味します。 ただし、メディアの種類はフレーム全体を表します。 したがって、各バッファーには、メディア・タイプで指定されたフィールド行の数の半分しか含められません。 たとえば、メディアの種類でビデオが 720 × 480 と記述されている場合、各フィールドには 240 行のスキャン行が含まれているため、各バッファーには 240 行のピクセルのみが含まれます。 単一フィールド サンプルを使用してメディアの種類を受け入れるコンポーネントを作成する場合は、バッファー内のデータにアクセスするときにこの事実を考慮する必要があります。

同じルールは、ジオメトリックアパーチャ(MF_MT_GEOMETRIC_APERTURE 属性)と最小表示絞り(MF_MT_MINIMUM_DISPLAY_APERTURE 属性)に適用されます。 これらの領域は、個々のフィールドではなく、フレーム全体の観点から指定されます。

DirectShow マッピング

DirectShow では、サンプルごとのインターレース情報は、AM_SAMPLE2_PROPERTIES構造体の dwTypeSpecificFlags メンバーに含まれています。 次の表は、Media Foundation の同等の属性を示しています。

DirectShow サンプル フラグ Media Foundation サンプル属性
AM_VIDEO_FLAG_INTERLEAVED_FRAME = MFSampleExtension_SingleFieldFALSE
AM_VIDEO_FLAG_FIELD1 = MFSampleExtension_InterlacedTRUE。
= MFSampleExtension_SingleFieldTRUE。
= MFSampleExtension_BottomFieldFirstFALSE。
AM_VIDEO_FLAG_FIELD2 = MFSampleExtension_InterlacedTRUE。
= MFSampleExtension_SingleFieldTRUE。
= MFSampleExtension_BottomFieldFirstTRUE。
AM_VIDEO_FLAG_WEAVE = MFSampleExtension_InterlacedFALSE。 (このフラグは、ドライバーが 2 つのフィールドのインターレースを解除しないことを示します)。
AM_VIDEO_FLAG_FIELD1FIRST = MFSampleExtension_BottomFieldFirstFALSE。 コンテンツがインターレースされていて、AM_VIDEO_FLAG_FIELD1FIRST フラグが存在しない場合は、この属性を TRUE に設定 します
AM_VIDEO_FLAG_REPEAT_FIELD = MFSampleExtension_RepeatFirstFieldTRUE。 AM_VIDEO_FLAG_REPEAT_FIELD フラグが存在しない場合は、この属性を FALSE に設定 します

 

DirectShow サンプルにサンプル フラグが含まれていない場合は、VIDEOINFOHEADER2 構造体の dwInterlaceFlags の値を使用します。

DirectShow インターレース フラグ Media Foundation サンプル属性
AMINTERLACE_IsInterlaced = MFSampleExtension_InterlacedTRUE。
AMINTERLACE_1FieldPerSample = MFSampleExtension_SingleFieldTRUE。
AMINTERLACE_Field1First = MFSampleExtension_BottomFieldFirstFALSE。

 

ビデオ メディアの種類

メディアの種類