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

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 г.
Перевод: А.Панин
Дата перевода: 29 июля 2014 г.

Внимание, в данной главе описывается методика работы с версией 0.10 фреймворка GStreamer, которая на данный момент является устаревшей.

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

20.1. Начало работы

Подсистема динамических параметров реализована в рамках библиотеки gstcontroller. Вам придется подключить следующие заголовочные файлы к исходному коду вашего элемента:
...
#include <gst/gst.h>
#include <gst/controller/gstcontroller.h>
...
Хотя библиотека gstcontroller и должна быть связана с результирующим приложением, вам в любом случае придется убедиться в том, что она инициализируется в рамках функции инициализации вашего плагина plugin_init аналогичным образом:
  static gboolean
  plugin_init (GstPlugin *plugin)
  {
    ...
    /* Инициализация библиотеки подсистемы динамических параметров */
    gst_controller_init (NULL, NULL);
    ...
  }
Не имеет смысла делать динамически изменяемыми в реальном времени все свойства объектной модели GObject объекта вашего элемента. Исходя из этого соображения, на следующем этапе нам придется обозначить все динамически изменяемые параметры. Это делается с помощью специального флага GST_PARAM_CONTROLLABLE при инициализации свойств объектной модели GObject в рамках метода инициализации класса _class_init.
  g_object_class_install_property (gobject_class, PROP_FREQ,
      g_param_spec_double ("freq", "Частота", "Частота тестового сигнала",
          0.0, 20000.0, 440.0,
          G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));

20.2. Цикл обработки данных

Из предыдущего раздела мы узнали о том, как обозначить параметры объектной модели GObject как динамические параметры. Впоследствии разработчики приложений смогут создавать очереди изменений значений этих параметров. Подход, реализуемый подсистемой динамических параметров, требует отзывчивости плагинов при передаче им данных изменений. Для реализации такого поведения необходимо выполнить всего лишь одно действие:
    gst_object_sync_values(element,timestamp);

Этот вызов выполняет все изменения значений параметров для заданной метки времени, изменяя значения свойств объектной модели GObject элемента. Установка частоты синхронизации изменений значений свойств выполняется самим элементом.

20.2.1. Цикл обработки данных для элементов, работающих с видеопотоками

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

20.2.2. Цикл обработки данных для элементов, работающих с аудиопотоками

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

При реализации элементов, для работы которых требуется осуществление синхронизации изменений значений динамических параметров с определенной интенсивностью, придется разделить цикл обработки данных на этапы и осуществлять синхронизацию изменений значений динамических параметров после обработки каждых n сэмплов.


Следующий раздел : Интерфейсы.