ビデオインターレース
このトピックでは、メディア ソースとデコーダーがインターレースされたビデオ コンテンツを処理する方法について説明します。
インターレースされたビデオを正しくデコードしてレンダリングするには、次の情報が必要です。
プログレッシブまたはインターレース。 ビデオ ストリームには、プログレッシブ フレーム、インターレース フレーム、またはその両方の組み合わせを含めることができます。
フィールドの支配。 フィールドの支配は、最初に表示されるフィールド、上のフィールド、または下のフィールドを表します。
最初のフィールドを繰り返します。 フレームがプログレッシブだがストリームがインターレースされている場合、このフラグは 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 インターフェイスを使用します。
このセクションに記載されているすべてのインターレース属性には、ブール値があります。 実際には、これらの各属性には、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
価値 | サンプル属性 |
---|---|
フレーム | 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 | FALSEを MFSampleExtension_SingleField = します。 |
AM_VIDEO_FLAG_FIELD1 | TRUEを MFSampleExtension_Interlaced = します。 trueを MFSampleExtension_SingleField = します。 FALSEを MFSampleExtension_BottomFieldFirst = します。 |
AM_VIDEO_FLAG_FIELD2 | TRUEを MFSampleExtension_Interlaced = します。 trueを MFSampleExtension_SingleField = します。 TRUEを MFSampleExtension_BottomFieldFirst = します。 |
AM_VIDEO_FLAG_WEAVE | FALSEを MFSampleExtension_Interlaced = します。 (このフラグは、ドライバーが 2 つのフィールドのインターレースを解除しないことを示します)。 |
AM_VIDEO_FLAG_FIELD1FIRST | FALSEを MFSampleExtension_BottomFieldFirst = します。 コンテンツがインターレースされていて、AM_VIDEO_FLAG_FIELD1FIRST フラグが存在しない場合は、この属性を TRUEに設定します。 |
AM_VIDEO_FLAG_REPEAT_FIELD | TRUEを MFSampleExtension_RepeatFirstField = します。 AM_VIDEO_FLAG_REPEAT_FIELD フラグが存在しない場合は、この属性を FALSEに設定します。 |
DirectShow サンプルにサンプル フラグが含まれていない場合は、VIDEOINFOHEADER2 構造体 dwInterlaceFlags の値を使用します。
DirectShow インターレース フラグ | Media Foundation のサンプル属性 |
---|---|
AMINTERLACE_IsInterlaced | TRUEを MFSampleExtension_Interlaced = します。 |
AMINTERLACE_1FieldPerSample | trueを MFSampleExtension_SingleField = します。 |
AMINTERLACE_Field1First | FALSEを MFSampleExtension_BottomFieldFirst = します。 |
関連トピック