2015-09-07 777 views
0

大家好,我現在可以一次設置一個屬性gstreamer插件像休閒。gstreamer:我如何將結構作爲參數傳遞給g_object_set()?

GstElement *source = gst_bin_get_by_name (GST_BIN (m_pu_pipeline), "ue"); 

g_object_set(G_OBJECT(source), "objectLeftEnabled", settings.m_b_left, NULL);   
g_object_set(G_OBJECT(source), "objectRemovedEnabled", settings.m_b_removed, NULL); 

但是我想要像休閒一樣設置整個結構。

g_object_set (G_OBJECT (source), "lettremoved-settings", settings, NULL); 

以下是我到目前爲止將結構直接設置爲gstreamer插件所做的工作。

struct _LeftRemoved 
{ 
    bool left; 
    bool removed; 
}; 

//Declaration of copy and free function. 
static gpointer lr_copy (gpointer data); 
static void lr_free (gpointer data); 

G_DEFINE_BOXED_TYPE (_Leftremoved, lettremoved_settings, 
        lr_copy, 
        lr_free); 

//Defination of copy and free. 
static gpointer lr_copy (gpointer data) 
{ 
    struct _LeftRemoved *details = (struct _LeftRemoved *)data; 
    struct _LeftRemoved *copy = g_new (struct _LeftRemoved, 1); 

    // We need to copy 
    copy->left= details->left; 
    copy->removed = details->removed; 

    g_print("Set Property From Copy left=%d\n",copy->left); 
    g_print("Set Property From Copy removed=%d\n",copy->removed); 

    return (gpointer) copy; 
} 


static void lr_free (gpointer data) 
{ 
     //code for free memory. 
} 

enum ePropertyType 
{ 
    PROP_OBJ_LR 
} 

static void gst_ivue_class_init (GstIVUEClass * klass) 
{ 
    GObjectClass *gobject_class; 
    GstElementClass *gstelement_class; 

    gobject_class = (GObjectClass *) klass; 
    gstelement_class = (GstElementClass *) klass; 

    gobject_class->set_property = gst_ivue_set_property; 
    gobject_class->get_property = gst_ivue_get_property; 
    gobject_class->finalize = gst_ivue_finalize; 

    GParamSpec *pspec; 
    pspec = g_param_spec_boxed ("lettremoved_settings",  "lettremoved_settings", "Left Removed Settings",lettremoved_settings_get_type(), (GParamFlags)G_PARAM_READWRITE); 
    g_object_class_install_property (gobject_class, PROP_OBJ_LR, pspec); 

} 

static void gst_ivue_set_property (GObject * object, guint prop_id, const GValue * value, GParamSpec * pspec) 
{ 
    GstIVUE *filter = GST_IVUE (object); 

    switch (prop_id) 
    { 
     case PROP_OBJ_LR: 
      g_boxed_copy(lettremoved_settings_get_type(),&value); 
      break; 
     default: 
      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); 
    } 
} 

static void gst_ivue_get_property(GObject* object, guint prop_id, GValue* value, GParamSpec* pspec) 
{ 
    GstIVUE* filter = GST_IVUE (object); 
    switch (prop_id) 
    { 
     case PROP_OBJ_LR: 
      // Also I don't know how to get value 
    } 
} 

上面的代碼運行成功,但它不是我設置的值。 例如,如果我叫g_object_set()函數爲:

settings.left=true; 
    settings.removed=true; 
    g_object_set (G_OBJECT (source), "lettremoved-settings", settings, NULL); 

然後複製功能,該代碼設置左,取出假的默認值。 請幫我我哪裏錯了。

+0

請將問題重新標爲「gobject:」這不是gstreamer特定的。 – ensonic

回答

1

g_object_set和g_object_get是varrag函數。這意味着您可以在一個通話中設置:

g_object_set(G_OBJECT(source), 
    "objectLeftEnabled", settings.m_b_left, 
    "objectRemovedEnabled", settings.m_b_removed, 
    NULL); 

也是供參考。在代替g_new和手動複製時,可以使用g_memdup()。

當你嘗試你的盒裝類型時,你傳遞了一個指針嗎?這可能是你需要調用

g_object_set(G_OBJECT(source),「lettremoved-settings」,& settings,NULL);

+0

thanx回答,我也提到我的問題如何獲取我的函數gst_ivue_get_property()的值exap​​mle如果我們想獲得int值,我們稱之爲g_value_set_int(value,filter-> maxH_object);對於一個值,但現在我想在這裏獲得_Leftremoved結構,以便我應該調用哪個函數? –

+0

您的gst_ivue_set_property()impl不正確,您沒有在那裏獲取g_boxed_copy的結果。但請理解,這不是一個爲您編寫代碼的論壇。您可以查看gnome git上的所有項目,並使用g_boxed類型搜索項目(例如,在github鏡像上:https://github.com/gnome/) – ensonic

相關問題