簡體   English   中英

在 class_init function 中設置 change_state 后,沒有其他工作

[英]After setting change_state in class_init function, nothing else works

我遵循了gstreamer 的關於如何編寫插件的教程,我的目標是創建一個視頻接收器。 現在我只會發布相關代碼,但如果需要,我可以將整個插件代碼上傳到某個地方。 無論如何,這將是一個開源項目。

class 結構如下所示:

struct _GstIviOpenglSinkClass
{
  GstVideoSinkClass base_iviopenglsink_class;
};

我的 class_init() function 看起來像這樣:

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 function,那么回調 set_caps、get_caps 和 show_frame 將不起作用(根本沒有被調用)。 如果我評價 change_state 的分配,則將調用這 3 個回調。

我在 class_init function 中做錯了什么,還是問題出在其他地方? 我能做些什么來調試這個?

此評論是正確的 - 問題確實出在 function 處理 change_state 中。 我查看了 waylandsink 的源代碼,發現了這個奇怪的行:

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

我不知道那條線在做什么,但顯然它是必需的。 在插件教程和描述 GstElementClass 的頁面中都沒有解釋。

如果有人可以解釋為什么需要這樣做,我將不勝感激:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM