gstreamer: как передать структуру в качестве аргумента g_object_set()?

Привет всем. В настоящее время я могу установить одно свойство за раз для плагина gstreamer, например, парного.

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); 

Затем в функции копирования этот код устанавливает значение по умолчанию как false как для оставленного, так и для удаленного. Пожалуйста, помогите мне, где я ошибаюсь.


person Kuldeep More    schedule 07.09.2015    source источник
comment
пожалуйста, переименуйте вопрос как gobject: это не относится к gstreamer.   -  person ensonic    schedule 07.09.2015


Ответы (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 (источник), "lettremoved-settings", &settings, NULL);

person ensonic    schedule 07.09.2015
comment
спасибо за ответ, также я упомянул в своем вопросе, как получить значение из моей функции gst_ivue_get_property(), например, если мы хотим получить значение int, мы вызываем g_value_set_int (value, filter->maxH_object); для одного значения, но теперь я хочу получить структуру _Leftremoved, так какую функцию мне вызвать? - person Kuldeep More; 08.09.2015
comment
Ваша реализация gst_ivue_set_property() неверна, вы не принимаете там результат g_boxed_copy. Но, пожалуйста, поймите, что это не форум для написания кода для вас. Вы можете просматривать все проекты в git gnome и искать проекты, используя типы g_boxed (например, на зеркале github: github. ком/гном) - person ensonic; 08.09.2015