Наши партнеры








Книги по Linux (с отзывами читателей)

Библиотека сайта rus-linux.net

На главную -> MyLDP -> Тематический каталог -> Графика, звук, видео в Linux

Gstreamer: прошлое, настоящее и будущее

Оригинал: "GStreamer: Past, present, and future"
Автор: Jake Edge
Дата публикации: October 26, 2010
Перевод: Н.Ромоданов
Дата перевода: декабрь 2010 г.

Вим Тайманс (Wim Taymans), специалист, многие годы занимающийся разработкой Gstreamer, открыл первую международную конференцию по Gstreamer и рассказал, откуда появился этот мультимедийный фреймворк, в каком состоянии он сейчас находится и куда будет двигаться в будущем. Как в своем вступительном слове отметил организатор конференции Христиан Шаллер (Christian Schaller ), фреймворку чуть более 11 лет, а Тайманс занимается им в течение 10 лет. От простого проекта, который был начат Эриком Уолсинсеном (Eric Walthinsen ) на борту самолета во время полета, GStreamer вырос в очень емкий фреймворк, который двигается к своему релизу с номером 1.0 — по обещанию Тайманса к концу 2011 года.

Начав с "одного слайда, утверждающего что GStreamer существует", Тайманс описал фреймворк как библиотеку, предназначенную для создания мультимедийных приложений. Его интересной частью является ядро фреймворка, которое представляет собой систему, позволяющую подключать плагины, предназначенные для ввода данных, использования кодеков, работы с сетевыми устройствами и т. д. Конкретные плагины находятся в отдельных библиотеках плагинов, а ядро представляет собой "конвейер, позволяющий соединять их вместе".

Немного истории

Когда проект GStreamer был запущен, состояние дел с мультимедиа в Linux было "очень плохим". Для воспроизведения мультимедийных форматов в Linux использовалась утилита XAnim , но с ней было много проблем. Кроме GStreamer, в течение 1999 — 2000 годов были также запущены некоторые другие мультимедийные проекты (например, VLC, Ogle, MPlayer, FFmpeg и т. д.), что также указывает на тогдашнее положение вещей. Конкуренты, такие как QuickTime, появившийся в 1991 году, и DirectShow - в 1996 году, были вне досягаемости. Linux был "далеко позади", рассказывал Тайманс.

Когда в 1999 году проект GStreamer был запущен, его архитектура была взята из исследовательского проекта, разработанного в институте Oregon Graduate Institute, а некоторые идеи — из DirectShow (не худшие). Как завил Тайманс, первоначально проект не ориентировался на мультимедиа.

Использование Gstreamer было весьма разнообразным, причем на первом месте были музыкальные плейеры. Они были "одними из первых приложений, которые действительно работали" с использованием GStreamer. В настоящее время фреймворк также используется в видеоплейерах (которые используются и в веб-браузерах), серверах потокового вещания, аудио- и видео-редакторах, а также в программах перекодировки. Одним из самых последних применений GStreamer, которое оказалось, по словам Тайманс, "неожиданным", является технология VoIP, где фреймворк используется как в приложении обмена сообщениями Empathy, так и в приложении Tandberg, предназначенном для проведения видеоконференций.

После того исторического полета Уолсинсен в июне 1999 года выпустил версию 0.0.1. К июлю 2002 года была выпущена версия 0.4.0 с поддержкой GNOME, хотя это было сделано "очень грубо". В феврале 2003 года была выпущена версия 0.6.0, которая была первым вариантом, в котором хорошо работало аудио. После основного редизайна, направленного на поддержку многопоточности, в декабре 2005 года была выпущена версия 0.10.0. Это по-прежнему самая последняя основная версия, хотя было 30 мелких релизов и в ближайшее время выйдет версия 0.10.31. Версия 0.10.x работает очень хорошо и, как сказал Тайманс, поднимается вопрос о том, когда будет версия 1.0.

Чтобы попытаться оценить размер сообщества (поддерживающее фреймворк — прим.пер.) и его рост, Тайманс собрал некоторую статистику. В проекте участвует более 30 разработчиков ядра и более чем 200 авторов кода, размер которого составляет примерно 205 тысяч строк. Тайманс также показал различные графики, показывающие помесячные изменения, и отметил всплеск интереса в период редезайна версии 0.10. Имел место также спад интереса в момент перехода на использование Git. Как и следовало ожидать, в течение всего срока существования проекта наблюдается тенденция повышения интереса к нему.

Для того, чтобы проверить имевшиеся у него подозрения, Тайманс построил аналогичный график только для ядра без учета плагинов и обнаружил, что в течение последнего года наблюдается постоянный спад интереса к проекту. В последнее время в ядре проекта не было ничего нового и это нашло отражение в статистике.

Если посмотреть на график числа строк кода, то также можно увидеть различие в темпах роста ядра и плагинов. График для ядра ровный с линейной скоростью роста. Наоборот, график для плагинов показывает экспоненциальный рост. Это отражает увеличивающееся количество плагинов, во многих из которых также добавляются новые функции, тогда как в ядро просто постепенно добавляются улучшения и возможности.

Текущее состояние

Затем Тайманс потратил некоторое время, описывая особенности GStreamer. Сейчас это полностью многопоточное приложение; его код является стабильным и хорошо работает. Также был отмечен специальный режим воспроизведения, которые позволяет легко вести поиск внутри аудио- и видео- потоков. Есть продвижение с поддержкой редактирования видео, в то время как с RTP (транспортным протоколом реального времени — прим.пер.) и с поддержкой потоков все "на высшем уровне". Плагины многочисленны и хорошо проверены, поскольку ими пользуются многие. GStreamer используется в видео-плеере Totem в GNOME, что еще более расширяет область применения проекта. "С помощью GNOME", сообщил Тайманс.

Фреймворк есть расширенные возможности автоподключения, что позволяет переключать конвейер динамически и поддерживать работу широкого спектра различных приложений. Кроме того, есть "весьма дружественная" привязка к большинству языков, которыми может воспользоваться разработчик. Разработчики оценивают эту возможность как "исключительно отладочную".

В коде версии 0.10 есть много еще достижений, Тайманс им доволен и это является одной из причин такого долгого перехода к версии 1.0. Архитектура версии 0.10 является расширяемой и позволяет добавлять к ней сравнительно много возможностей. Структуры разработаны таким образом, что при добавлении к ним новых возможностей можно добавлять новые элементы, которые не нарушают API или ABI. Например, в процессе использования версии 0.10 был переписан код, обрабатывающий изменение состояний и работающий со временем. В версии 0.10 разработчики могут добавлять новые возможности, позволяющие использовать навигацию, сервисы, степпинг и буферизацию.

Еще одна вещь, которую Gstreamer делает хорошо, это добавление объектов более высокого уровня. Сам GStreamer сравнительно низкоуровневый, но для некоторых, кто хочет работать на уровне файлов, есть набор конструкций более высокого уровня, похожий на playbin2 для воспроизведения видео и аудио, и на tagreadbin для извлечения мультимедийных метаданных Также достижением фреймворка являются базовые классы, которые были реализованы в 0.10, в том числе и те, которые были добавлены в течение последних пяти лет. С помощью этих классов ведется работа с источниками и получателями потоков, преобразователями, кодерами и декодерами и т.п.

В текущем проекте GStreamer есть также ряд недостатков. Текущие обращения к форматам, кодекам, а также к другим различным свойствам осуществляются медленно. Первоначальная идея состояла в том, что был простой и понятный способ опросить объект, что он может делать. На этот запрос возвращается описание возможностей объекта, а также возможностей всего, что к нему подключено, поэтому фреймворк тратит массу времени на генерацию огромного списка возможностей. Эти возможности, по мнению Тайманса, используют слишком раздутый формат. Сокращение этого формата и переосмысление взаимодействия с API может привести к значительному повышению производительности.

"Самая большая ошибкой" в GStreamer является то, что в нем нет расширяемого буфера обмена метаданными. Буферы передаются между элементами GStreamer, и нет способа добавить в эти буферы новую информацию, например, указатели на многоплановое видео, или информацию для обработки нестандартных сдвигов в потоках. Там также должны быть обобщенные способы отображения данных между буферами и поддерживаемыми GPU и DSP, что особенно важно во встроенных устройствах. В текущей версии GStreamer это делать очень трудно, но это важно для повышения производительности встраиваемых решений.

Хотя динамические изменения конвейера работают в текущем коде, "в тот момент, когда вы это попробуете, вы будете проклинать все новое", сказал Тайманс. Из-за этого в приложении могут теряться хронометраж и синхронизация, а управлять хронометражом при работе с потоками нелегко. Первоначальная идея состояла в том, чтобы в приложениях создавались объекты, инкапсулирующие динамические изменения, но она оказалась неверной. В версии 0.10 есть также несколько незначительных проблем, в том числе с накоплением устаревших API, выходом за рамки некоторых структур и из-за этого становится все труднее добавлять новые возможности без нарушения API / ABI.

Взгляд в будущее

Для решения этих проблем, Тайманс предложил планы по работе над GStreamer на следующий год. В краткосрочной перспективе, внимание будет сосредоточено на ускорении работы ядра и одновременно на совершенствовании плагинов. Есть несколько приложений, которые пытаются использовать манипуляцию с конвейерами Gstreamer в режиме реального времени, поэтому для их поддержки необходимо ускорить работу ядра. Одним из способов увеличения производительности будет сокращение накладных расходов путем удаления блокировок в совместно используемых структурах данных.

В среднесрочной перспективе, в течение следующих 2 - 3 месяцев Тайманс будет собирать требования к следующей версии. Проект будет ориентирован на исправление проблем, которые уже обнаружены, так что если у кого-то "есть и другие проблемы, которые необходимо решить, пожалуйста, скажите мне об этом". Также будет проведены некоторые эксперименты с добавлением в различные ветви Git таких возможностей, как расширяемые буферы обмена метаданными.

Начиная с января, будут вместе слиты ветвь 0.11 и код. Затем начнется портирование плагинов в 0.11 и это будет сделано приблизительно к концу 2011 года. Как только начнется портирование плагинов, также начнется работа с приложениями. После этого появится версия 1.0 ближе к концу 2011 года, а не в 2010 году, как это было объявлено ранее. "На этот раз мы сделаем, обещаю". Тайманс закончил свой доклад шуткой о том, что в результате он обещает "мировое господство" версии GStreamer 1.0.