首页 > 解决方案 > 在 class_init 函数中设置 change_state 后,没有其他工作

问题描述

我遵循了gstreamer 的关于如何编写插件的教程,我的目标是创建一个视频接收器。现在我只会发布相关代码,但如果需要,我可以将整个插件代码上传到某个地方。无论如何,这将是一个开源项目。

类结构如下所示:

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 函数中做错了什么,还是问题出在其他地方?我能做些什么来调试这个?

标签: clinuxpluginsgstreamer

解决方案


这条评论是正确的——问题确实出在处理 change_state 的函数中。我查看了 waylandsink 的源代码,发现了这条奇怪的行:

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

我不知道那条线在做什么,但显然它是必需的。在插件教程和描述 GstElementClass 的页面中都没有解释。

如果有人可以解释为什么需要这样做,我将不胜感激:)


推荐阅读