Поделиться через


Чередовка видео

В этом разделе описывается, как источники мультимедиа и декодеры должны обрабатывать чередуемое видеосодержимое содержимое.

Чтобы правильно декодировать и отрисовывать видео, необходимы следующие сведения:

  • Прогрессивная или переплетаемая. Видеопоток может содержать прогрессивные кадры, чередуемые кадры или сочетание обоих.

  • Доминирование полей. Преобладание полей описывает, какое поле отображается сначала, верхний или нижний.

  • Повторите первое поле. Этот флаг используется в раскрывающемся списке 3:2, если кадр прогрессивен, но поток переплетается. В этом контексте первое поле может быть верхним или нижним.

  • Чередуемые поля или одно поле. Пример может содержать одно поле или два чередуемых поля. Если пример содержит одно поле, высота образца составляет половину высоты кадра, так как этот пример содержит только половину строк сканирования для кадра. Переключенные поля рекомендуется, если характеристики исходного содержимого не диктуются в противном случае.

Любой из этих характеристик может измениться с одного образца на следующий. Однако перед началом потоковой передачи необходимо знать что-то о общем содержимом. Например, если видео переплетается, расширенный отрисовщик видео (EVR) должен зарезервировать память видео для деинтерлакирования. Если видео полностью прогрессивные кадры, с другой стороны, EVR может оптимизировать конвейер отрисовки. Добавление шага деинтерлакирования в конвейер увеличивает задержку отрисовки.

Сведения о перемежении хранятся в двух местах:

  • Общие сведения о перемежении в потоке помещаются в тип носителя. Дополнительные сведения о типах носителей см. в типов мультимедиа.

  • Сведения, которые могут изменяться с каждым примером, помещаются в пример в качестве атрибута. Дополнительные сведения о примерах см. в примерах мультимедиа.

Перемешив сведения в типе мультимедиа

Атрибут MF_MT_INTERLACE_MODE в типе мультимедиа описывает, как поток в целом переплетается. Значение этого атрибута является членом перечисления MFVideoInterlac eMode. Тип мультимедиа видео всегда должен иметь этот атрибут.

  • Если поток содержит только прогрессивные кадры без чередуемых кадров, используйте MFVideoInterlace_Progressive.
  • Если поток содержит только чередующиеся кадры, а каждый пример содержит два чередуемых поля, используйте MFVideoInterlace_FieldInterleavedUpperFirst или MFVideoInterlace_FieldInterleavedLowerFirst.
  • Если поток содержит только чередуемые кадры, а каждый пример содержит одно поле, используйте MFVideoInterlace_FieldSingleUpper или MFVideoInterlace_FieldSingleLower. Если поля чередуются между верхним и нижним, то не имеет значения, какие из этих двух значений используются. Если формат содержит только верхние поля или просто нижние поля, задайте значение, соответствующее содержимому.
  • Если поток содержит сочетание чередуемых и прогрессивных кадров, или если поле переключается, задайте тип носителя для MFVideoInterlace_MixedInterlaceOrProgressive. Используйте примеры атрибутов для описания каждого кадра.

В следующей таблице приведены итоги этого атрибута.

MF_MT_INTERLACE_MODE Чересстрочной? Образцы Первое поле
MFVideoInterlace_Progressive Нет Прогрессивный кадр Неприменимо
MFVideoInterlace_FieldInterleavedUpperFirst Да Чередуемые поля Верхний первый
MFVideoInterlace_FieldInterleavedLowerFirst Да Чередуемые поля Нижний первый
MFVideoInterlace_FieldSingleUpper Да Одно поле Верхний первый
MFVideoInterlace_FieldSingleLower Да Одно поле Нижний первый
MFVideoInterlace_MixedInterlaceOrProgressive Может отличаться Чередуемые поля или прогрессивные кадры Может отличаться

 

Перемеченные поля и отдельные поля не могут быть смешанными. Для перехода с одного на другой требуется изменение типа носителя.

Перемешивает флаги на примерах

Сведения, которые могут меняться с одного примера на следующий, указываются с помощью примеров атрибутов. Используйте интерфейсIMFSample для получения или задания этих атрибутов.

Все атрибуты перемешивание, перечисленные в этом разделе, имеют логические значения. Фактически каждый из этих атрибутов может иметь три значения: TRUE, FALSEили нет. Если атрибут не задан, значение берется из типа носителя. Если задан атрибут, значение переопределяет тип носителя. Некоторые сочетания флагов и типов носителей недопустимы.

Атрибут Описание
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, пример содержит одно поле. Если FALSE, пример содержит чередуемые поля.

 

В следующей таблице показано, какие флаги являются обязательными, необязательными или запрещенными на основе типа носителя.

Тип носителя Перемешанный флаг Флаг BottomFieldFirst Флаг RepeatFirstField Флаг SingleField
Прогрессивный Необязательный; Значение false, если задано, должно быть false. Не устанавливайте. Не устанавливайте. Не устанавливайте.
Чередуемые поля Необязательный; Значение если задано, должно бытьTRUE. Необязательный; Значение , если задано, должно соответствовать типу носителя. Не устанавливайте. Необязательный; Значение false, если задано, должно быть false.
Отдельные поля Необязательный; Значение если задано, должно бытьTRUE. Обязательно. Не устанавливайте. Установите значение TRUE.
Смешанный Обязательно. Обязательно. Обязательно. Необязательный; Значение false, если задано, должно быть 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 false на каждом кадре.

  • Не устанавливайте атрибут MFSampleExtension_SingleField или не устанавливайте для него значение FALSE для каждого кадра.

  1. Видео содержит сочетание чередуемых и прогрессивных кадров, с повторяющиеся поля и разное доминирование поля (например, 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 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, это означает, что каждый пример содержит одно поле. Однако тип носителя описывает весь кадр. Таким образом, каждый буфер содержит только половину числа строк полей, заданных в типе носителя. Например, если тип носителя описывает видео как 720 × 480, каждое поле содержит 240 строк сканирования, поэтому каждый буфер содержит только 240 строк пикселей. Если вы пишете компонент, принимаюющий типы мультимедиа с примерами с одним полем, необходимо учитывать этот факт при доступе к данным в буфере.

То же правило применяется к геометрической диафрагме (атрибутуMF_MT_GEOMETRIC_APERTURE) и минимальной диафрагме отображения (MF_MT_MINIMUM_DISPLAY_APERTURE атрибуту). Эти области указываются с точки зрения всего кадра, а не отдельных полей.

Сопоставления DirectShow

В DirectShow сведения о чередовании выборок содержатся в dwTypeSpecificFlags элемент структуры AM_SAMPLE2_PROPERTIES. В следующей таблице показаны эквивалентные атрибуты Media Foundation.

Пример флага DirectShow Пример атрибута Media Foundation
AM_VIDEO_FLAG_INTERLEAVED_FRAME MFSampleExtension_SingleField = FALSE.
AM_VIDEO_FLAG_FIELD1 MFSampleExtension_Interlaced = TRUE.
MFSampleExtension_SingleField = TRUE.
MFSampleExtension_BottomFieldFirst = FALSE.
AM_VIDEO_FLAG_FIELD2 MFSampleExtension_Interlaced = TRUE.
MFSampleExtension_SingleField = TRUE.
MFSampleExtension_BottomFieldFirst = TRUE.
AM_VIDEO_FLAG_WEAVE MFSampleExtension_Interlaced = FALSE. (Этот флаг указывает, что драйвер не должен деинтерлацировать два поля.)
AM_VIDEO_FLAG_FIELD1FIRST MFSampleExtension_BottomFieldFirst = FALSE. Если содержимое переплетается и флаг AM_VIDEO_FLAG_FIELD1FIRST отсутствует, задайте для этого атрибута значение TRUE.
AM_VIDEO_FLAG_REPEAT_FIELD MFSampleExtension_RepeatFirstField = TRUE. Если флаг AM_VIDEO_FLAG_REPEAT_FIELD отсутствует, задайте для этого атрибута значение FALSE.

 

Если пример DirectShow не содержит примеры флагов, используйте значение dwInterlaceFlags из структуры VIDEOINFOHEADER2:

Флаг переплета DirectShow Пример атрибута Media Foundation
AMINTERLACE_IsInterlaced MFSampleExtension_Interlaced = TRUE.
AMINTERLACE_1FieldPerSample MFSampleExtension_SingleField = TRUE.
AMINTERLACE_Field1First MFSampleExtension_BottomFieldFirst = FALSE.

 

Типы мультимедиа видео

Типы носителей