次の方法で共有


ビデオインターレース

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

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

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

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

  • 最初のフィールドを繰り返します。 フレームがプログレッシブだがストリームがインターレースされている場合、このフラグは 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を使用します。 フィールドが上位と下位の間で交互に使用される場合、これら 2 つの値のうちどれが使用されるかは関係ありません。 書式に上位のフィールドだけが含まれている場合、または下のフィールドだけが含まれている場合は、コンテンツに対応する値を設定します。
  • ストリームにインターレースフレームとプログレッシブフレームが混在している場合、またはフィールドの支配が切り替わる場合は、メディアタイプをMFVideoInterlace_MixedInterlaceOrProgressiveに設定します。 各フレームを記述するには、サンプル属性を使用します。

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

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

 

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

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

あるサンプルから次のサンプルに変更できる情報は、サンプル属性を使用して示されます。 これらの属性を取得または設定するには、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_BottomFieldFirstMFSampleExtension_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

価値 サンプル属性
フレーム MFSAMPLEEXTENSION_SINGLEFIELD = FALSE
top_field MFSampleExtension_SingleField = TRUE
MFSAMPLEEXTENSION_BOTTOMFIELDFIRST = FALSE
bottom_field MFSampleExtension_SingleField = TRUE
MFSAMPLEEXTENSION_BOTTOMFIELDFIRST = TRUE

 

progressive_frame

価値 サンプル属性
0 MFSAMPLEEXTENSION_INTERLACED = TRUE
1 MFSAMPLEEXTENSION_INTERLACED = FALSE

 

top_field_first

価値 サンプル属性
0 MFSAMPLEEXTENSION_BOTTOMFIELDFIRST = TRUE
1 MFSAMPLEEXTENSION_BOTTOMFIELDFIRST = FALSE

 

repeat_first_field

価値 サンプル属性
0 MFSAMPLEEXTENSION_REPEATFIRSTFIELD = FALSE
1 MFSAMPLEEXTENSION_REPEATFIRSTFIELD = TRUE

 

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 FALSEMFSampleExtension_SingleField = します。
AM_VIDEO_FLAG_FIELD1 TRUEMFSampleExtension_Interlaced = します。
trueMFSampleExtension_SingleField = します。
FALSEMFSampleExtension_BottomFieldFirst = します。
AM_VIDEO_FLAG_FIELD2 TRUEMFSampleExtension_Interlaced = します。
trueMFSampleExtension_SingleField = します。
TRUEMFSampleExtension_BottomFieldFirst = します。
AM_VIDEO_FLAG_WEAVE FALSEMFSampleExtension_Interlaced = します。 (このフラグは、ドライバーが 2 つのフィールドのインターレースを解除しないことを示します)。
AM_VIDEO_FLAG_FIELD1FIRST FALSEMFSampleExtension_BottomFieldFirst = します。 コンテンツがインターレースされていて、AM_VIDEO_FLAG_FIELD1FIRST フラグが存在しない場合は、この属性を TRUEに設定します。
AM_VIDEO_FLAG_REPEAT_FIELD TRUEMFSampleExtension_RepeatFirstField = します。 AM_VIDEO_FLAG_REPEAT_FIELD フラグが存在しない場合は、この属性を FALSEに設定します。

 

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

DirectShow インターレース フラグ Media Foundation のサンプル属性
AMINTERLACE_IsInterlaced TRUEMFSampleExtension_Interlaced = します。
AMINTERLACE_1FieldPerSample trueMFSampleExtension_SingleField = します。
AMINTERLACE_Field1First FALSEMFSampleExtension_BottomFieldFirst = します。

 

ビデオ メディアの種類

メディアの種類の