Библиотека сайта 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 г.
Перевод: А.Панин
Дата перевода: 31 июля 2014 г.
Часть V. Приложения
В данной части содержатся главы, которые невозможно отнести к какой-либо из уже существующих частей.
Глава 27. Вещи, на которые следует обратить внимание при разработке элемента
Данная глава содержит достаточно разрозненные описания вещей, на которые стоит обратить внимание при разработке элемента. Решение о том, насколько четко следовать данному руководству, может быть принято исключительно вами. Однако, помните, что в том случае, если вы разрабатываете элемент с расчетом на его включение в основной комплект поставки фреймворка GStreamer, он должен соответствовать описанным в данной главе требованиям. По мере возможности я постараюсь объяснять причины появления тех или иных требований.
27.1. О состояниях
- Убедитесь в том, что значения параметров состояния элемента возвращается к исходным при переходе элемента в "отключенное" состояние (
NULL
). В идеальном случае соответствующая функция должна возвращать значения всех свойств объекта элемента к стандартным значениям. Также данная функция должна быть вызвана из функции инициализации объекта элемента_init
. - Убедитесь в том, что элемент забывает обо всех значениях параметров обрабатываемого мультимедийного потока при переходе из состояния "пауза" (
PAUSED
) в состояние "готовности к работе" (READY
). В состоянии "готовности к работе" (READY
) все значения параметров состояния, связанных с мультимедийным потоком, должны быть возвращены к стандартным. Элемент, переводимый из состояния "пауза" (PAUSED
) в состояние "готовности к работе" (READY
) и назад в состояние "пауза" (PAUSED
) должен начинать чтение мультимедийных данных из начальной точки потока. - Разработчики, использующие утилиту gst-launch для тестирования элементов, имеют склонность к игнорированию функций освобождения ресурсов. Это неправильный подход. Элемент должен тестироваться с помощью различных приложений, причем тестирование должно заключаться не только в проверке работоспособности элемента без аварийных завершений работы приложений, но также в тестировании на наличие утечек памяти с помощью таких инструментов, как valgrind. Элементы должны быть повторно используемыми в рамках конвейера после возвращения к исходному состоянию.
27.2. Отладка
-
Элементы ни при каких обстоятельствах не должны использовать поток стандартного вывода для отладки (выводить данные с помощью таких функций, как
printf ()
илиg_print ()
). Вместо этого элементы должны использовать предоставляемые фреймворком GStreamer функции журналирования с именамиGST_DEBUG ()
,GST_LOG ()
,GST_INFO ()
,GST_WARNING ()
иGST_ERROR ()
. Различные уровни отладки могут быть активированы и деактивированы в процессе работы приложения и, таким образом, могут использоваться для решения проблем по мере их выявления. Вместо функцииGST_LOG ()
(например), вы также можете использовать функциюGST_LOG_OBJECT ()
для вывода информации об объекте, отладочные данные методов которого вы отслеживаете. -
В идеальном случае элементы должны использовать свои собственные категории отладки. Большая часть элементов использует для этой цели следующий код:
GST_DEBUG_CATEGORY_STATIC (myelement_debug); #define GST_CAT_DEFAULT myelement_debug [..] static void gst_myelement_class_init (GstMyelementClass *klass) { [..] GST_DEBUG_CATEGORY_INIT (myelement_debug, "myelement", 0, "Мой элемент"); }
В процессе работы приложения вы можете активировать режим отладки с помощью параметра командной строки --gst-debug=myelement:5.
-
Элементы должны использовать макрос
GST_DEBUG_FUNCPTR
при установке функций объектов точек соединения или перекрытии методов классов элементов, например:gst_pad_set_event_func (myelement->srcpad, GST_DEBUG_FUNCPTR (my_element_src_event));
Такой подход позволяет значительно упростить последующее чтение отладочных данных.
-
Элементы, разрабатываемые для последующего включения в один из модулей фреймворка GStreamer, должны использовать последовательную схему именования самого элемента, его структур и функций. Например, в том случае, если разрабатывается элемент типа
GstYellowFooDec
, функции должны использовать префиксgst_yellow_foo_dec_
и элемент должен быть зарегистрирован под именем'yellowfoodec'
. В данной схеме отдельные слова должны разделяться, поэтому могут быть использованы идентификаторыGstFooDec
иgst_foo_dec
, но не идентификаторыGstFoodec
иgst_foodec
.
27.3. Запросы, события и аналогичные механизмы
- Все элементы, к которым это относится (элементы для ввода и вывода данных, а также демультиплексоры), должны реализовывать функции обработки запросов, полученных с помощью их точек соединения, для того, чтобы приложения и соседние элементы могли запросить информацию о текущей позиции в мультимедийном потоке, продолжительности потока (в том случае, если такая информация доступна), а также другую подобную информацию.
- Элементы должны гарантированно передавать не обрабатываемые ими события дальше по конвейеру с помощью функции
gst_pad_event_default (pad, parent, event)
вместо простого отбрасывания этих событий. События никогда не должны отбрасываться за исключением тех случаев, когда это делается умышленно с определенной целью. - Элементы должны гарантированно передавать по конвейеру не обрабатываемые ими запросы с помощью функции
gst_pad_query_default (pad, parent, query)
вместо простого отбрасывания этих запросов.
27.4. Тестирование вашего элемента
- Утилита gst-launch не является хорошим инструментом для определения степени готовности вашего элемента к использованию. Такие приложения, как Rhythmbox и Totem (для окружения рабочего стола GNOME) или Amarok (для окружения рабочего стола KDE) являются такими инструментами. Утилита gst-launch не позволяет протестировать корректность работы различных механизмов, таких, как механизм освобождения использованных ресурсов при возвращении элемента к исходному состоянию, механизм обработки событий, механизм обработки запросов и других аналогичных механизмов.
- Элементы для разбора потоков данных и демультиплексоры должны в любом случае проверять корректность входящих данных. Нельзя безоговорочно рассматривать данные из входящего мультимедийного потока как корректные. Проверка корректности данных позволит предотвратить эксплуатацию уязвимостей переполнения буфера и других аналогичных уязвимостей. Не стесняйтесь генерировать ошибки при обнаружении неустранимых нарушений структуры мультимедийного потока. Тестируйте ваш демультиплексор с помощью элементов для искусственного повреждения мультимедийного потока, таких, как
breakmydata
(элемент включен в состав пакета gst-plugins). Он позволяет случайным образом добавлять, удалять или модифицировать байты мультимедийного потока и, следовательно, является хорошим инструментом для тестирования надежности элемента. В том случае если из-за вашего элемента происходит аварийное завершение работы тестового приложения при условии использования упомянутого элемента для тестирования, код вашего элемента нуждается в доработке. В том случае, если элемент корректно генерирует ошибку, качество его кода является достаточно высоким. В идеальном случае элемент должен просто продолжать работу и передавать столько данных дальше по конвейеру, сколько возможно. - Демультиплексоры не должны строить предположений о том, что механизм перемещения в мультимедийном потоке работоспособен. Также будьте готовы и к работе с входными мультимедийными потоками (например, потоками из сетевых источников), перемещение в рамках которых невозможно.
- Элементы для ввода и вывода данных должны быть готовы к использованию таймера, отличного от того, который они предоставляют. Всегда используйте предлагаемый таймер для синхронизации, так как в противном случае вы столкнетесь с проблемами синхронизации аудиопотоков и видеопотоков.
Следующий раздел : Портирование плагинов для работы с версией фреймворка 0.10 вместо 0.8.