Размышление над проблемами формата Ogg

Один из разработчиков проекта FFmpeg в статье "Ogg objections" подробно рассказал о недостатках мультимедиа контейнера Ogg. Вывод в статье сделан неутешительный, свободность и независимость от патентов - это конечно хорошо, но с технической стороны формат не может конкурировать с аналогами и требует полной переработки. Изначально Ogg создан для работы с простейшими аудео-потоками, из чего следует его излишняя усложненность и нестандартность при работе с другими видами данных, например, при при инкапсуляции видео-потоков.

Основные недостатки Ogg:

  • Трудность интеграции поддержки новых кодеков: для каждого кодека требуется оформления подробной карты, идентифицирующей кодек, показывающей как извлекать данные и как интерпретировать временные метки. Например, для поддержки кодеков Microsoft пришлось расширить формат Ogg, что привело к непринятию данных расширений курирующей формат Ogg организацией Xiph. В качестве примера для подражания приводится формат Matroska, который может работать с любым кодеком, при этом для обеспечения поддержки кодека достаточно определить его уникальный идентификатор.
  • Излишнее расходование ресурсов при организации хранения привязанной к потоку служебной информации. Заголовок страницы данных имеет размер 27 байт, в то время как его без проблем можно было бы ужать до 12 байт. Большой объем лишних полей в заголовке страницы данных, приводит к увеличению размера итогового файла примерно на 1%, в то время как для формата MP4 этот показатель равен 0.05%;
  • Низкая отзывчивость (latency): возникновение паразитной задержки при передаче и приеме кадров (на стороне отправителя и получателя) мешает использованию Ogg при организации интерактивной передачи, например, при проведении видеоконференций или для организации IP-телефонии. Задержка на стороне отправителя возникает из-за того что заголовок страницы данных в Ogg зависит от содержимого страницы, т.е. отображение и передача страниц осуществляется только блоками - пока весь блок данных не будет получен, невозможно рассчитать передаваемую в заголовке контрольную сумму и размер страницы, что приводит к задержке из-за лишней буферизации. На стороне получателя возникает задержка из-за невозможности продолжить обработку до момента получения пактов всех элементарных потоков (звук, видео), в случае отключения проверки контрольных сумм это приводит к постоянному отставанию на одну страницу данных, а если включен режим проверки контрольных сумм, то на две.
  • Непродуманный механизм получения случайного доступа к разным позициям в потоке: индекс в Ogg создается налету (требует дополнительного прохода по данным) или прикрепляется к концу файла, что мешает быстрой смене позиции в не до конца загруженном потоке. Определение позиции осуществляется через операции бинарного поиска, что для больших файлов приводит к выполнению множества лишних проверок (например для перехода в заданному позицию файла размером 10 Гб может потребовать до 50 дополнительных перемещений). Более того, формат хранения времени в Ogg зависит от используемого в текущий момент кодека и приводит к выполнению дополнительных операций на уровне кодека.
  • Проблемы с синхронизацией потоков. Для синхронизации звука и видео каждый пакет данных снабжен временной меткой, но эта казалось бы простая операция в Ogg сильно усложнена - метка отождествлена со временем конца проигрывания блока данных, что приводит к ряду неудобств, таких как трудности планирования, расхождение с общепринятой практикой, для определения начальной точки требуется декодирование пакетов на первой странице.
  • Общая усложненность процесса декодирования и разбора данных, необходимость выполнения лишних действий, использование нестандартных методов и применение в документации необщепринятых терминов. Для обхода ограничения на размер страницы в Ogg возможно разбиение пакета на две страницы, что возлагает на декодер дополнительную нагрузку по сборке фрагментированных пакетов данных. Дополнительно наблюдаются проблемы с требованием лишнего объема памяти для буферизации, на настольных системах это не критично, но для встраиваемых систем приводит к трате драгоценных ресурсов.

©  OpenNet