Чередовка видео
В этом разделе описывается, как источники мультимедиа и декодеры должны обрабатывать чередуемое видеосодержимое содержимое.
Чтобы правильно декодировать и отрисовывать видео, необходимы следующие сведения:
Прогрессивная или переплетаемая. Видеопоток может содержать прогрессивные кадры, чередуемые кадры или сочетание обоих.
Доминирование полей. Преобладание полей описывает, какое поле отображается сначала, верхний или нижний.
Повторите первое поле. Этот флаг используется в раскрывающемся списке 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 | Значение этого флага зависит от того, содержат ли примеры чередующиеся поля или отдельные поля.
|
MFSampleExtension_RepeatFirstField | Если TRUE, первое поле повторяется. Если false или нет, первое поле не повторяется. |
MFSampleExtension_SingleField | Если TRUE, пример содержит одно поле. Если FALSE, пример содержит чередуемые поля. |
В следующей таблице показано, какие флаги являются обязательными, необязательными или запрещенными на основе типа носителя.
Тип носителя | Перемешанный флаг | Флаг BottomFieldFirst | Флаг RepeatFirstField | Флаг SingleField |
---|---|---|---|---|
Прогрессивный | Необязательный; Значение false, если задано, должно быть false. | Не устанавливайте. | Не устанавливайте. | Не устанавливайте. |
Чередуемые поля | Необязательный; Значение |
Необязательный; Значение , если задано, должно соответствовать типу носителя. | Не устанавливайте. | Необязательный; Значение false, если задано, должно быть false. |
Отдельные поля | Необязательный; Значение |
Обязательно. | Не устанавливайте. | Установите значение TRUE. |
Смешанный | Обязательно. | Обязательно. | Обязательно. | Необязательный; Значение false, если задано, должно быть 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 false на каждом кадре.
Не устанавливайте атрибут MFSampleExtension_SingleField или не устанавливайте для него значение FALSE для каждого кадра.
- Видео содержит сочетание чередуемых и прогрессивных кадров, с повторяющиеся поля и разное доминирование поля (например, DVD-видео).
Задайте для типа носителя значение MFVideoInterlace_MixedInterlaceOrProgressive.
В каждом кадре задайте атрибуты MFSampleExtension_Interlaced, MFSampleExtension_BottomFieldFirstи MFSampleExtension_RepeatFirstField.
Не устанавливайте атрибут MFSampleExtension_SingleField или не устанавливайте для него значение FALSE для каждого кадра.
- Видео переплетается и примеры содержат отдельные поля.
Задайте тип носителя 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. |
Связанные разделы