Ogg Media (OGM) — формат, контейнер для хранения потоков данных, таких как видео, аудио, и субтитры. Обеспечивает необходимые средства для надёжной транспортировки файла, контроля целостности файла, минимизации количества перемещений по файлу во время воспроизведения нескольких потоков (чередование).
Контейнер Ogg Media — сторонняя модификация контейнера Ogg, рассчитанного на свободные кодеки, поддерживаемые Xiph.Org, сделанная для поддержки несвободных кодеков, обычно используемых с контейнером AVI, с помощью DirectShow. Ogg Media была создана в 2002 году независимо от Xiph.Org, которая в 2004 году опубликовала просьбу убрать вводящее в заблуждение слово «Ogg» из названия контейнера.[1]
Формат OGM
Каждый поток данных в терминах ogg называется логический поток (англ. logical bitstream), несколько логических потоков объединяются в физический поток (англ. physical bitstream).
Существуют следующие методы объединения логических потоков в один физический:
- последовательное объединение (англ. chaining), все страницы первого логического потока следуют до страниц второго логического потока
- группировка (англ. grouping), страницы потоков перемешиваются для обеспечения возможности одновременно читать данные из разных потоков без существенного изменения смещения в файле (для RIFF-контейнера такое положение потоков называется чередованием).
Каждый логический поток разбивается на пакеты (англ. packets). Формат пакета определяется используемым кодеком. Пакеты делятся на сегменты (англ. segments), размер каждого из сегментов не превышает 255 байт. Сегменты объединяются в страницы (англ. pages), каждая страница содержит в себе не более 255 сегментов (общий размер данных в одной странице никогда не превышает 64 Кб). Пакет может содержаться более чем в одной странице (то есть быть в размере больше 64 Кб), в этом случае для страницы содержащей продолжение пакета выставляется специальный флаг «продолжение пакета» (англ. continued_packet_flag).
Структура пакета
смещение (hex)
|
размер
|
тип
|
название
|
описание
|
0x0
|
4
|
FOURCC
|
capture_pattern
|
всегда равен 'OggS', 0x4f 0x67 0x67 0x53
|
0x4
|
1
|
BYTE
|
stream_structure_version
|
версия структуры, должна быть равна 0
|
0x5
|
1
|
битовое поле
|
header_type_flag
|
0x1 continued_packet_flag страница содержит продолжение пакета
|
0x2 begin_of_stream страница является первой страницей потока
|
0x4 end_of_stream страница является последней страницей потока
|
0x6
|
8
|
INT64
|
absolute_granule_position
|
номер последнего фрейма или семпла (отсчёта), закодированного целиком в этом пакете. Фреймы, не поместившиеся в пакет целиком не учитываются, если нет фреймов, поместившихся в пакет целиком, указывается величина -1
|
0xE
|
4
|
INT32
|
page_serial_number
|
номер логического потока (в рамках заданного физического потока), к которому относится содержимое страницы. Должно быть уникальным в рамках одного физического потока.
|
0x12
|
4
|
INT32
|
page_sequence_no
|
порядковый номер страницы в логическом потоке
|
0x16
|
4
|
UINT32
|
page_checksum
|
CRC32-код страницы
|
0x1A
|
1
|
BYTE
|
page_segments
|
количество сегментов в странице. Число [0-255], числа 0 и 255 допустимы (при числе 0 страница не содержит сегментов (и информации) и должна быть просто пропущена).
|
0x1B
|
page_segments
|
BYTE[]
|
segment_table
|
таблица размеров сегментов в странице. Количество записей в таблице определяется page_segment, в случае нулевого значения, segment_table отсутствует
|
Существенной особенностью формата является отсутствие общего заголовка для физического потока. Например, бинарное объединение двух файлов будет давать рабочий файл. В OGM-файлах отсутствует индекс у видеопотока (что увеличивает устойчивость формата при передаче данных, но затрудняет воспроизведение).
Каждая страница содержит CRC-код для проверки правильности данных при передаче и воспроизведении.
См. также
Примечания