LINUX.ORG.RU

Gstreamer plugin инициализация


0

1

Разбираюсь с сабжем по GStreamer Plugin Writer's Guide Дошел до примера:

static gboolean
plugin_init (GstPlugin *plugin)
{
  return gst_element_register (plugin, "my_filter",
			       GST_RANK_NONE,
			       GST_TYPE_MY_FILTER);
}

GST_PLUGIN_DEFINE (
  GST_VERSION_MAJOR,
  GST_VERSION_MINOR,
  "my_filter",
  "My filter plugin",
  plugin_init,
  VERSION,
  "LGPL",
  "GStreamer",
  "http://gstreamer.net/"
)

Я понимаю как рантайм ЖеСтремера находит шареную библиотеку, и как из шаренной библиотеки можно получить плагин.

Но как имея указатель на плагин можно создать какой либо фильтр из этого плагина!?

Пока у меня есть только одна версия - имена методов фильтра не могут быть произвольными. Они должны начитаться с префикса, указанного при вызове gst_element_register и остальная часть имени должна быть точно такая, как указанно вдокументации. Неужели это так и есть? О_о

★★★

Gstreamer основывается на объектной библиотеке Glib. Используются классы и объекты glib. Когда модуль регистрируется, в реестр заносится его класс GST_TYPE_MY_FILTER. Далее фильтры создаются по классу

filter = g_object_new (GST_TYPE_MY_FILTER)

и с фильтром можно работать, вызывая его методы. Методы для класса определяются в шаблоне выше.

welkam ★★
()
Ответ на: комментарий от welkam

И да, если используются шаблоны,

http://www.gstreamer.net/data/doc/gstreamer/head/pwg/html/section-boiler-exam...

GST_BOILERPLATE (GstMyFilter, gst_my_filter, GstElement, GST_TYPE_ELEMENT);

то методы вроде gst_my_filter_init и gst_my_filter_class_init должны начинаться с gst_my_filter. Далее методы уже инициализируются в _class_init и могут называться произвольно. Но лучше всё-таки сохранять схему именования функций.

welkam ★★
()
Ответ на: комментарий от welkam

Спасибо кэп)

Это и так понятно. Вопрос в том, как все это реализованно?

AF ★★★
() автор топика
Ответ на: комментарий от welkam

>то методы вроде gst_my_filter_init и gst_my_filter_class_init должны начинаться с gst_my_filter

Значит я прfвильно понял, что после загрузки плагина рантайм ЖеСтримера генерит имя gst_my_filter_init и пытается получить указатель на эту функцию через dlsym?

AF ★★★
() автор топика
Ответ на: комментарий от AF

Значит я прfвильно понял, что после загрузки плагина рантайм ЖеСтримера генерит имя gst_my_filter_init и пытается получить указатель на эту функцию через dlsym?

Нет, dlsym не используется для получения на gst_my_myfilter_init. Процесс выглядит так:

При загрузке so выполняется plugin_init

Внутри функции plugin_init в реестре Glib регистрируется тип GST_TYPE_MY_FILTER. Ссылки на gst_my_filter_init хранятся в статической структуре &info которая инициализируется при использовании макроса GST_TYPE_MY_FILTER.

#define GST_TYPE_MY_FILTER gst_my_filter_get_type()

GType gst_my_filter_get_type (void)
{
  static GType type = 0;
  if (type == 0) {
    static const GTypeInfo info = {
      /* You fill this structure. */
    };
    type = g_type_register_static (G_TYPE_OBJECT,
                                   "MamanBarType",
                                   &info, 0);
  }
  return type;
}

Подробнее смотрите документацию по glib http://library.gnome.org/devel/gobject/unstable/gtype-conventions.html

При использовании фильтра в реестре находится класс GST_TYPE_MY_FILTER и создаётся объект класса.

welkam ★★
()
Ответ на: комментарий от welkam

Sehr gut!

Теперь все стало на свои места.

Спасибо!

AF ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.