2012-10-26 124 views
1

我是新來的Gstreamer。我有一個關於插件的change_state函數的問題。 正如我在本指南中寫着:http://gstreamer.freedesktop.org/data/doc/gstreamer/head/pwg/html/chapter-statemanage-states.html#section-statemanage-filters的Gstreamer更改狀態函數

static GstStateChangeReturn 
gst_my_filter_change_state (GstElement *element, GstStateChange transition) 
{ 
    GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; 
    GstMyFilter *filter = GST_MY_FILTER (element); 

    switch (transition) { 
    **//Downwards state change;** 

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

    **//upward state change** 
    } 

    return ret; 
} 

我真的不知道我們如何使用parent_class,並呼籲parent_class-> change_state 因爲在此元素的初始化函數:

gst_my_filter_class_init (GstMyFilterClass *klass) 
{ 
    GstElementClass *element_class = GST_ELEMENT_CLASS (klass); 

    element_class->change_state = gst_my_filter_change_state;**strong text** 
} 

element_class-> change_state被分配給gst_my_filter_change_state。爲什麼我們仍然可以撥打element_class-> change_stategst_my_filter_change_state時element_class-> change_state是分配給另一個功能。 謝謝!

回答

2

變化gst_my_filter_class_init (GstMyFilterClass *klass)到這樣的事情:

gst_my_filter_class_init (GstMyFilterClass *klass) 
{ 
    GstElementClass *element_class = GST_ELEMENT_CLASS (klass); 
    parent_class = (GstXyzClass *) g_type_class_peek_parent (klass); 
    element_class->change_state = gst_my_filter_change_state;**strong text** 
} 

,並添加一個static全局變量GstXyzClass *parent_class;附近某處你的插件的頂部。只有GstXyzClass將是您繼承的元素的類型,例如GstElementClass。看看其他插件來源的例子。

0

謝謝您的回答。實際上,我引用的這段代碼可以正常運行。但是我無法理解的是我們在頭文件中聲明:GstMyFilterClass {GstElementClass parent_class;}這意味着GstElementClass是GstMyFilterClass的父類, 但爲什麼我們可以在源文件中使用parent_class這個插件(.c文件)?對不起,我缺乏Gobject的知識,但據我所知GstMyFilterClass是一個結構和(不像C++類),並且屬性parent_class不能用於插件的功能(在C++中我們可以很容易地使用屬性的方法)。而在gst_my_filter_class_init

gst_my_filter_class_init (GstMyFilterClass *klass) 
{ 
    GstElementClass *element_class = GST_ELEMENT_CLASS (klass); 

    element_class->change_state = gst_my_filter_change_state;//assign to function pointer state change 
} 

是否聲明:GstElementClass * element_class = GST_ELEMENT_CLASS(克拉斯);意味着我們投GST_ELEMENT_CLASS(克拉斯)來獲取它的父類(GstElementClass parent_class)? 如果這是真的,這樣的change_state函數指針parent_class不爲空。所以在

gst_my_filter_change_state (GstElement *element, GstStateChange transition) 
{ 
    GstStateChangeReturn ret = GST_STATE_CHANGE_SUCCESS; 
    GstMyFilter *filter = GST_MY_FILTER (element); 

    switch (transition) { 
    **//Downwards state change;** 

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

    **//upward state change** 
    } 

    return ret; 
} 

是什麼GST_ELEMENT_CLASS(parent_class) - > change_state(元素,過渡)? 據我所知每個GstElementClass有一個默認功能change_state但在這種情況下,功能change_state已經分配給另一個指針函數(gst_my_filter_class_init爲此分配),對嗎?希望儘快收到你的回答。非常感謝