ビデオインターレース
このトピックでは、メディア ソースとデコーダーがインターレースされたビデオ コンテンツを処理する方法について説明します。
インターレースされたビデオを正しくデコードしてレンダリングするには、次の情報が必要です。
プログレッシブまたはインターレース。 ビデオ ストリームには、プログレッシブ フレーム、インターレース フレーム、またはその両方の組み合わせを含めることができます。
フィールドの支配。 フィールドの支配は、最初に表示されるフィールド、上のフィールド、または下のフィールドを表します。
最初のフィールドを繰り返します。 このフラグは、フレームがプログレッシブであるがストリームがインターレースされている場合に、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 インターフェイスを使用します。
このセクションに記載されているすべてのインターレース属性には、ブール値があります。 実際には、これらの各属性には、 TRUE、 FALSE、または未設定の 3 つの値を指定できます。 属性が設定されていない場合、値はメディアの種類から取得されます。 属性が設定されている場合、値はメディアの種類をオーバーライドします。 フラグとメディアの種類の一部の組み合わせが無効です。
属性 | 説明 |
---|---|
MFSampleExtension_Interlaced |
TRUE の場合、フレームはインターレースされます。
FALSE の場合、フレームはプログレッシブになります。 メディアの種類がMFVideoInterlace_MixedInterlaceOrProgressive場合は、すべてのサンプルでこの属性を設定します。 |
MFSampleExtension_BottomFieldFirst | このフラグの意味は、サンプルにインターリーブ フィールドと単一フィールドのどちらが含まれているかによって異なります。
|
MFSampleExtension_RepeatFirstField | TRUE の場合、最初のフィールドが繰り返されます。 FALSE を設定しない場合、最初のフィールドは繰り返されません。 |
MFSampleExtension_SingleField | TRUE の場合、サンプルには 1 つのフィールドが含まれます。 FALSE の場合、サンプルにはインターリーブされたフィールドが含まれます。 |
次の表は、メディアの種類に基づいて、必須、省略可能、または禁止されているフラグを示しています。
メディアの種類 | インターレース フラグ | BottomFieldFirst フラグ | RepeatFirstField フラグ | SingleField フラグ |
---|---|---|---|---|
プログレッシブ | オプション;設定する場合は、 FALSE にする必要があります。 | 設定しないでください。 | 設定しないでください。 | 設定しないでください。 |
インターリーブフィールド | オプション;設定する場合は、 TRUE にする必要があります。 | オプション;が設定されている場合は、メディアの種類と一致する必要があります。 | 設定しないでください。 | オプション;設定する場合は、 FALSE にする必要があります。 |
単一フィールド | オプション;設定する場合は、 TRUE にする必要があります。 | 必須。 | 設定しないでください。 | TRUE に設定 します。 |
混在 | 必須。 | 必須。 | 必須。 | オプション;設定する場合は、 FALSE にする必要があります。 |
属性が省略可能な場合は、メディアの種類によって情報が既に定義されています。 属性を一致するように設定することは有効ですが、必須ではありません。
たとえば、メディアの種類がMFVideoInterlace_Progressive場合、ストリーム内のすべてのフレームがプログレッシブであることを意味します。 したがって、 MFSampleExtension_Interlaced 属性を FALSE に設定するか、属性を未設定のままにすることができます。
推奨事項
このセクションには、さまざまな種類のコンテンツに関する推奨事項が含まれています。
- ビデオはすべてプログレッシブ フレームです。
メディアの種類を [MFVideoInterlace_Progressive] に設定します。
MFSampleExtension_Interlaced属性を設定したり、フレームごとに FALSE に設定したりしないでください。
MFSampleExtension_BottomFieldFirst、MFSampleExtension_RepeatFirstField、またはMFSampleExtension_SingleField属性は設定しないでください。
- ビデオは、同じフィールド支配を持つすべてのインターレース フィールドです。 サンプルにはインターリーブフィールドが含まれています。
メディアの種類をMFVideoInterlace_FieldInterleavedUpperFirstまたはMFVideoInterlace_FieldInterleavedLowerFirstに設定します。
MFSampleExtension_Interlaced属性を設定したり、フレームごとに TRUE に設定したりしないでください。
MFSampleExtension_BottomFieldFirst属性を設定したり、メディアの種類に合わせてフレームごとに値を設定したりしないでください。
MFSampleExtension_RepeatFirstField属性を設定したり、フレームごとに FALSE に設定したりしないでください。
MFSampleExtension_SingleField属性を設定したり、フレームごとに FALSE に設定したりしないでください。
- ビデオには、インターレースフレームとプログレッシブフレームの組み合わせが含まれており、フィールドが繰り返され、フィールドの支配が異なります (DVD ビデオなど)。
メディアの種類を [MFVideoInterlace_MixedInterlaceOrProgressive] に設定します。
フレームごとに、 MFSampleExtension_Interlaced、 MFSampleExtension_BottomFieldFirst、 およびMFSampleExtension_RepeatFirstField 属性を設定します。
MFSampleExtension_SingleField属性を設定したり、フレームごとに FALSE に設定したりしないでください。
- ビデオはインターレースされ、サンプルには 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。 |
関連トピック