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

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

Для правильного декодирования и отрисовки чередуемого видео необходимо следующее:

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

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

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

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

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

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

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

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

Сведения о чередовке в типе носителя

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

  • Если поток содержит только прогрессивные кадры без чередуемых кадров, используйте 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 или не задан. Если атрибут не задан, значение берется из типа носителя. Если задан атрибут, значение переопределяет тип носителя. Некоторые сочетания флагов и типов носителей недопустимы.

attribute Описание
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. Не задавайте. Не задавайте. Не задавайте.
Чередующиеся поля Необязательный; Значение , если задано, должно иметь значение 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_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

Значение Пример атрибута
frame = MFSampleExtension_SingleField ЛОЖНЫХ
top_field = MFSampleExtension_SingleField ИСТИННЫЙ
= MFSampleExtension_BottomFieldFirst ЛОЖНЫХ
bottom_field = MFSampleExtension_SingleField ИСТИННЫЙ
= MFSampleExtension_BottomFieldFirst ИСТИННЫЙ

 

progressive_frame

Значение Пример атрибута
0 = MFSampleExtension_Interlaced ИСТИННЫЙ
1 = MFSampleExtension_Interlaced ЛОЖНЫХ

 

top_field_first

Значение Пример атрибута
0 = MFSampleExtension_BottomFieldFirst ИСТИННЫЙ
1 = MFSampleExtension_BottomFieldFirst ЛОЖНЫХ

 

repeat_first_field

Значение Пример атрибута
0 = MFSampleExtension_RepeatFirstField ЛОЖНЫХ
1 = MFSampleExtension_RepeatFirstField ИСТИННЫЙ

 

Примеры 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.

 

Типы видеофайла

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