[英]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.