Ogg Media
(OGM) ? формат,
контейнер
для хранения
потоков
данных, таких как видео, аудио, и субтитры. Обеспечивает необходимые средства для надёжной транспортировки файла, контроля целостности файла, минимизации количества перемещений по файлу во время воспроизведения нескольких потоков (чередование).
Контейнер Ogg Media ? сторонняя модификация контейнера
Ogg
, рассчитанного на свободные кодеки, поддерживаемые
Xiph.Org
, сделанная для поддержки несвободных кодеков, обычно используемых с контейнером
AVI
, с помощью
DirectShow
. Ogg Media была создана в 2002 году независимо от
Xiph.Org
, которая в 2004 году опубликовала просьбу убрать вводящее в заблуждение слово ≪Ogg≫ из названия контейнера.
[1]
Каждый поток данных в терминах 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
-код для проверки правильности данных при передаче и воспроизведении.