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

UnixForum





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

Фреймворк GStreamer. Руководство разработчика плагинов. Создаваемые по запросу и не постоянно доступные точки соединения

Оригинал: GStreamer Plugin Writer's Guide
Авторы: Richard John Boulton, Erik Walthinsen, Steve Baker, Leif Johnson, Ronald S. Bultje, Stefan Kost, Tim-Philipp Muller, Wim Taymans
Дата публикации: 19 июля 2014 г.
Перевод: А.Панин
Дата перевода: 27 июля 2014 г.

Часть III. Сложные концепции фильтров

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

Глава 12. Создаваемые по запросу и не постоянно доступные точки соединения

До текущего момента мы имели дело исключительно с точками соединения, которые всегда доступны. Однако, также существуют точки соединения, которые создаются в некоторых случаях или только тогда, когда приложение отправляет запрос создания точки соединения. Первые точки соединения называются не постоянно доступными точками соединения (sometimes pads); вторые - создаваемыми по запросу точками соединения (request pads). Доступность точки соединения (постоянная, не постоянная или по запросу) может быть установлена в процессе создания шаблона точки соединения. В данной главе мы будем обсуждать ситуации, в которых использование описанных типов точек соединения является обоснованным, методику их создания, а также условия, в которых они должны создаваться и уничтожаться.

12.1. Не постоянно доступные точки соединения

"Не постоянно доступная" точка соединения является точкой соединения, создаваемой в определенных условиях не во всех случаях. Ее создание главным образом обуславливается содержимым потока данных: демультиплексоры в общем случае будут осуществлять разбор заголовка потока данных, выяснять, какие элементарные мультимедийные потоки (потоки аудиоданных, видеоданных, данных субтитров, и.т.д.) включены в состав основного потока данных, после чего создавать не постоянно доступные точки соединения для каждого из этих элементарных мультимедийных потоков. По своему усмотрению элемент также может создавать более одной точки соединения для каждого из элементарных мультимедийных потоков. Единственное ограничение состоит в том, что каждая созданная точка соединения должна иметь уникальное имя. Не постоянно доступные точки соединения уничтожаются в момент уничтожения потока данных (т.е., в момент перехода элемента из состояния "пауза" (PAUSED) в состояние "готов к работе" (READY)). Вы не должны уничтожать точку соединения при приеме сообщения об окончании мультимедийного потока (EOS), так как кто-либо может повторно активировать конвейер и осуществить перемещение в мультимедийном потоке в точку, находящуюся перед его конечной точкой. Мультимедийный поток должен быть доступен для обработки с помощью конвейера после достижения окончания (EOS), по крайней мере до того момента, когда данные этого мультимедийного потока будут уничтожены. В любом случае, элемент всегда должен быть владельцем точки соединения описываемого типа.

В коде примера ниже будет осуществляться разбор текстового файла, в первой строке которого записано число (n). Все следующие строки начинаются с чисел (в диапазоне от 0 до n-1), которые являются номерами выходных точек соединения, через которые должны передаваться данные.
3
0: foo
1: bar
0: boo
2: bye

Код для разбора этого файла и создания динамических "не постоянно доступных" точек соединения выглядит следующим образом:

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

12.2. Создаваемые по запросу точки соединения

"Создаваемые по запросу" точки соединения аналогичны обычным точкам соединения, за исключением того, что они создаются по запросу от какого-либо программного компонента, реализованного вне элемента, а не в рамках самого элемента. Эта концепция обычно используется в мультиплексорах, где для каждого элементарного потока, который будет размещаться в общем выходном потоке данных, будет запрашиваться создание одной входной точки соединения. Также она может использоваться в элементах с переменным числом входных или выходных точек соединения, таких, как элемент разделения мультимедийного потока tee (множество выходных точек соединения) или элемент выбора входного мультимедийного потока input-selector (множество входных точек соединения).

Для реализации создаваемых по запросу точек соединения вам придется предоставить шаблон точки соединения с идентификатором режима доступности GST_PAD_REQUEST и реализовать виртуальный метод request_new_pad класса GstElement. Для освобождения ресурсов вам также придется реализовать виртуальный метод release_pad.


Следующий раздел : Различные режимы планирования работы точек соединения элементов.