Чередование видео
В этом разделе описывается, как источники мультимедиа и декодеры должны обрабатывать чередование видеосодержимого.
Для правильного декодирования и отрисовки видео с чередованием требуются следующие сведения:
Прогрессивные или чередуемые. Видеопоток может содержать прогрессивные кадры, чередование кадров или сочетание обоих.
Доминирование поля. Доминирование поля описывает, какое поле отображается первым, верхнее или нижнее поле.
Повторите первое поле. Этот флаг используется в раскрывающемся списке 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 | Значение этого флага зависит от того, содержат ли примеры поля с чередованием или отдельные поля.
|
MFSampleExtension_RepeatFirstField | Если значение РАВНО TRUE, первое поле повторяется. Если значение FALSE или не задано, первое поле не повторяется. |
MFSampleExtension_SingleField | Если значение РАВНО TRUE, образец содержит одно поле. Если значение РАВНО 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 для каждого кадра.
- Видео чередуется, и примеры содержат отдельные поля.
Задайте тип носителя 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 ВЕРНО. = MFSampleExtension_SingleField ВЕРНО. = MFSampleExtension_BottomFieldFirst FALSE. |
AM_VIDEO_FLAG_FIELD2 |
= MFSampleExtension_Interlaced ВЕРНО. = MFSampleExtension_SingleField ВЕРНО. = MFSampleExtension_BottomFieldFirst ВЕРНО. |
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 ВЕРНО. Если флаг AM_VIDEO_FLAG_REPEAT_FIELD отсутствует, задайте для этого атрибута значение FALSE. |
Если пример DirectShow не содержит флаги образца, используйте значение dwInterlaceFlags из структуры VIDEOINFOHEADER2 :
Флаг сплести DirectShow | Пример атрибута Media Foundation |
---|---|
AMINTERLACE_IsInterlaced | = MFSampleExtension_Interlaced ВЕРНО. |
AMINTERLACE_1FieldPerSample | = MFSampleExtension_SingleField ВЕРНО. |
AMINTERLACE_Field1First | = MFSampleExtension_BottomFieldFirst FALSE. |
Связанные темы