static GstGhostPad * _create_video_mixer_input (GstGLMixerBin * self, GstPad * mixer_pad) { GstGLVideoMixerInput *input = g_object_new (gst_gl_video_mixer_input_get_type (), "name", GST_OBJECT_NAME (mixer_pad), "direction", GST_PAD_DIRECTION (mixer_pad), NULL); GstControlBinding *cb; if (!gst_ghost_pad_construct (GST_GHOST_PAD (input))) { gst_object_unref (input); return NULL; } #define ADD_PROXY_CONTROL_BINDING(prop) \ cb = gst_gl_mixer_control_binding_proxy_new (GST_OBJECT (mixer_pad), \ G_STRINGIFY (prop), GST_OBJECT (input), G_STRINGIFY (prop)); \ gst_object_add_control_binding (GST_OBJECT (mixer_pad), cb) ADD_PROXY_CONTROL_BINDING (zorder); ADD_PROXY_CONTROL_BINDING (xpos); ADD_PROXY_CONTROL_BINDING (ypos); ADD_PROXY_CONTROL_BINDING (width); ADD_PROXY_CONTROL_BINDING (height); ADD_PROXY_CONTROL_BINDING (alpha); #undef ADD_PROXY_CONTROL_BINDING input->mixer_pad = mixer_pad; return GST_GHOST_PAD (input); }
static GstPad * gst_ghost_pad_new_full (const gchar * name, GstPadDirection dir, GstPadTemplate * templ) { GstGhostPad *ret; g_return_val_if_fail (dir != GST_PAD_UNKNOWN, NULL); /* OBJECT CREATION */ if (templ) { ret = g_object_new (GST_TYPE_GHOST_PAD, "name", name, "direction", dir, "template", templ, NULL); } else { ret = g_object_new (GST_TYPE_GHOST_PAD, "name", name, "direction", dir, NULL); } if (!gst_ghost_pad_construct (ret)) goto construct_failed; return GST_PAD_CAST (ret); construct_failed: /* already logged */ gst_object_unref (ret); return NULL; }