После установки change_state в функции class_init больше ничего не работает - PullRequest
0 голосов
/ 24 апреля 2020

Я следовал учебному пособию 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 или проблема кроется где-то еще? Что я могу сделать, чтобы отладить это?

1 Ответ

0 голосов
/ 25 апреля 2020

Этот комментарий был правильным - проблема действительно в функции, имеющей дело с change_state. Я посмотрел на исходный код waylandsink и обнаружил эту странную строку:

ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);

Я понятия не имею, что делает эта строка, но, очевидно, она необходима. И это нигде не объяснено ни в учебнике для плагинов, ни на странице, описывающей GstElementClass.

Если кто-то может объяснить, зачем это нужно, я был бы очень признателен:)

...