Я следовал учебному пособию gstreamer о том, как писать плагины , и моя цель - создать сток видео. Сейчас я просто опубликую соответствующий код, но при необходимости я могу загрузить куда-нибудь весь код плагина. В любом случае это будет open source.
Структура класса выглядит следующим образом:
struct _GstIviOpenglSinkClass
{
GstVideoSinkClass base_iviopenglsink_class;
};
, а моя функция class_init () выглядит так:
static void
gst_iviopenglsink_class_init (GstIviOpenglSinkClass * klass)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
GstElementClass *gstelement_class = GST_ELEMENT_CLASS (klass);
GstBaseSinkClass *gstbasesink_class = GST_BASE_SINK_CLASS (klass);
GstVideoSinkClass *gstvideosink_class = GST_VIDEO_SINK_CLASS (klass);
GST_DEBUG ("START");
gobject_class->set_property = gst_iviopenglsink_set_property;
gobject_class->get_property = gst_iviopenglsink_get_property;
gobject_class->finalize = gst_iviopenglsink_finalize;
gst_element_class_add_pad_template (gstelement_class,
gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS,
gst_caps_from_string (VIDEO_SINK_CAPS)));
gst_element_class_set_static_metadata (gstelement_class,
"desc", "Sink/Video",
"desc",
"me <me@com.com>");
gstbasesink_class->get_caps = gst_iviopenglsink_get_caps;
gstbasesink_class->set_caps = gst_iviopenglsink_set_caps;
/* makes problems?!? */
gstelement_class->change_state = gst_iviopenglsink_change_state;
gstvideosink_class->show_frame = gst_iviopenglsink_show_frame;
GST_DEBUG ("END");
}
Если я оставьте функцию class_init следующим образом, тогда обратные вызовы set_caps, get_caps и show_frame не работают (вообще не вызываются). Если я закомментирую присвоение change_state, то будут вызваны эти 3 обратных вызова.
Я что-то не так делаю в функции class_init или проблема кроется где-то еще? Что я могу сделать, чтобы отладить это?