Библиотека сайта rus-linux.net
Фреймворк GStreamer. Руководство разработчика приложений. Портирование приложения на основе GStreamer 0.8 для работы с GStreamer 0.10
Оригинал: GStreamer Application Development ManualАвторы: Wim Taymans, Steve Baker, Andy Wingo, Ronald S. Bultje, Stefan Kost
Дата публикации: 21 мая 2014 г.
Перевод: А.Панин
Дата перевода: 23 июня 2014 г.
Глава 24. Портирование приложения на основе GStreamer 0.8 для работы с GStreamer 0.10
В этом разделе руководства мы кратко обсудим изменения, которые необходимо внести в приложения на основе Gstreamer-0.8 для быстрого и комфортного перехода к использованию GStreamer-0.10, приведя ссылки на соответствующие разделы данного руководства разработчика приложений в случае необходимости. При использовании этого списка изменений процесс портирования простых приложений для работы с GStreamer-0.10 должен длится более одного для.
24.1. Список изменений
- Большинство функций, возвращающих объект или значение свойства объекта, было изменено для возврата собственной ссылки вместо постоянной ссылки, которой владел сам объект. Причина данного изменения связана главным образом с работой по улучшению потокобезопасности. Это значит, что после использования значений, возвращаемых такими функциями, как
gst_element_get_pad ()
,gst_pad_get_name ()
и многими другими аналогичными функциями, должна освобождаться память, в которой они хранились, либо должны удаляться ссылки на них. Обратитесь к описанию API для каждой функции, чтобы убедиться в том, должна ли освобождаться память, используемая для хранения возвращаемых значений. Важно, чтобы для всех объектов, унаследованных от классов GstObject, устанавливались и удалялись ссылки с помощью функций gst_object_ref () и gst_object_unref () соответственно (вместо функций g_object_ref/unref). - Приложения больше не должны использовать обработчики сигналов для получения уведомлений об ошибках, окончании мультимедийного потока и других аналогичных событиях конвейера. Вместо этого они должны использовать объект шины сообщений типа GstBus, который обсуждался в Главе 7, "Шина сообщений". Шина сообщений позаботится о доставке сообщений в контексте главного цикла обработки событий, который почти наверняка будет исполняться в главном программном потоке приложения. Большое преимущество данного решения заключается в том, что приложениям больше не требуется принимать меры предосторожности при работе с программными потоками; они не должны использовать функцию
g_idle_add ()
в рамках обработчика сигналов для выполнения реальной работы в рамках функции обратного вызова периода бездействия. Фреймворк GStreamer теперь делает все это самостоятельно. - В связи с описанным выше изменением, функция
gst_bin_iterate ()
была удалена. Конвейеры будут производить итерации в рамках собственных программных потоков и приложения могут просто использовать главный цикл обработки событий типаGMainLoop
(или вызывать главный цикл обработки событий своего тулкита для создания пользовательского интерфейса с помощью такой функции, какgst_main ()
). - Изменения состояния могут откладываться (ASYNC). Из-за новой, полностью основанной на программных потоках архитектуры версии фреймворка GStreamer-0.10 изменения состояния не всегда выполняются мгновенно, в особенности это относится к переходам из состояния "готовность" (READY) в состояние "пауза" (PAUSED). В контексте портирования приложений это изменение связано с двумя аспектами: во-первых, теперь не всегда имеется возможность вызова функции
gst_element_set_state ()
и проверки соответствия возвращаемого функцией значения значению GST_STATE_CHANGE_SUCCESS, так как изменение состояния может быть отложено (ASYNC) и результат этого изменения будет неизвестен до определенного момента. Вам все же придется проверять соответствие возвращаемого функцией значения значению GST_STATE_CHANGE_FAILURE сразу после вызова функции, но теперь невозможно будет сделать вывод о том, что все значения, не соответствующие значению успешного изменения состояния (SUCCESS) указывают на неудачу. Во-вторых, изменения состояний могут быть не мгновенными, что должно учитываться в вашем коде. Вы можете ожидать завершения операции изменения состояния, использовав значение GST_CLOCK_TIME_NONE в качестве значения длительности периода ожидания при вызове функцииgst_element_get_state ()
. - В версии 0.8 события и запросы должны были вручную передаваться элементам для вывода данных конвейеров (конечно же, в том случае, если вы не использовали элемент playbin). Это требование не актуально для версии 0.10. В версии 0.10 запросы и события могут отправляться конвейерам верхнего уровня, после чего конвейеры самостоятельно осуществят их передачу для вас. Это позволяет сократить объем логики вашего приложения. Если вам нужен краткий пример использования описанного механизма, вы можете обратиться к Главе 11, "Отслеживание позиции и перемещение в мультимедийном потоке". Благодаря описанному выше изменению, операция перемещения в мультимедийном потоке стала потокобезопасной, причем после перемещения будет выводиться кадр из новой позиции потоке, что улучшит пользовательские качества приложения.
- Объект программного потока типа
GstThread
был удален. Теперь приложения могут просто размещать элементы в конвейере, добавляя при необходимости между ними элементы "очередей" для буферизации мультимедийных данных, а фреймворк GStreamer самостоятельно позаботится о создании программных потоков. Имеется возможность размещения отдельных частей конвейера в отдельных программных потоках путем использования элемента "очереди". Обратитесь к Главе 17, "Программные потоки" для получения дополнительной информации. - Для фильтрации возможностей представлен элемент capsfilter (при этом синтаксис команд приложения gst-launch не изменился).
- Статической библиотеки libgstgconf-0.10 больше не существует. Вместо нее следует использовать элементы "gconfvideosink" и "gconfaudiosink", которые обновляют данные в процессе эксплуатации и не требуют связывания с приложением дополнительных библиотек.
- Сигналы "new-pad" и "state-change" объекта элемента типа
GstElement
были переименованы в "pad-added" и "state-changed". - Функция
gst_init_get_popt_table ()
была удалена, а вместо нее предлагается использовать новый API для обработки параметров командной строки GOption, который был добавлен в версию библиотеки Glib 2.6. Функцияgst_init_get_option_group ()
является эквивалентом из API GOption для функцииgst_init_get_ptop_table ()
.
Следующий раздел : Портирование приложения на основе GStreamer 0.10 для работы с GStreamer 1.0.