18 #ifndef __GST_DS_DEEPSTREAM_BINS_UTILS_H__
19 #define __GST_DS_DEEPSTREAM_BINS_UTILS_H__
27 const gchar * (*property_name_map)[2], guint map_size,
28 GType child_elem_type, guint * prop_index,
29 GPtrArray * orig_prop_names_ordered)
31 GObject *child_obj = G_OBJECT (g_type_create_instance (child_elem_type));
32 GObjectClass *child_class = G_OBJECT_GET_CLASS (child_obj);
33 if (orig_prop_names_ordered)
34 g_ptr_array_set_size (orig_prop_names_ordered, *prop_index + map_size);
36 for (guint i = 0; i < map_size; i++) {
38 g_object_class_find_property (child_class, property_name_map[i][0]);
40 g_printerr (
"Property '%s' not found on element '%s'\n",
41 property_name_map[i][0], G_OBJECT_CLASS_NAME (child_class));
44 GParamSpec *binspec = NULL;
45 switch (spec->value_type) {
48 gchar *default_val = NULL;
49 g_object_get (child_obj, property_name_map[i][0], &default_val, NULL);
51 g_param_spec_string (property_name_map[i][1], spec->_nick,
52 spec->_blurb, default_val, spec->flags);
58 gboolean default_val =
FALSE;
59 g_object_get (child_obj, property_name_map[i][0], &default_val, NULL);
61 g_param_spec_boolean (property_name_map[i][1], spec->_nick,
62 spec->_blurb, default_val, spec->flags);
67 GParamSpecUInt *puint = G_PARAM_SPEC_UINT (spec);
68 guint default_val = 0;
69 g_object_get (child_obj, property_name_map[i][0], &default_val, NULL);
72 g_param_spec_uint (property_name_map[i][1], spec->_nick,
73 spec->_blurb, puint->minimum, puint->maximum,
74 default_val, spec->flags);
79 GParamSpecInt *pint = G_PARAM_SPEC_INT (spec);
81 g_object_get (child_obj, property_name_map[i][0], &default_val, NULL);
83 g_param_spec_int (property_name_map[i][1], spec->_nick,
84 spec->_blurb, pint->minimum, pint->maximum,
85 default_val, spec->flags);
91 g_param_spec_pointer (spec->name, spec->_nick,
92 spec->_blurb, spec->flags);
96 if (G_IS_PARAM_SPEC_ENUM (spec)) {
98 g_object_get (child_obj, property_name_map[i][0], &default_val, NULL);
99 binspec = g_param_spec_enum (property_name_map[i][1], spec->_nick,
100 spec->_blurb, spec->value_type, default_val, spec->flags);
105 g_object_class_install_property (parent_elem_class, *prop_index, binspec);
107 g_printerr (
"Cannot forward '%s' property '%s' of type '%s'\n",
108 G_OBJECT_CLASS_NAME (child_class), property_name_map[i][0],
109 g_type_name (spec->value_type));
112 if (orig_prop_names_ordered)
113 g_ptr_array_insert (orig_prop_names_ordered, *prop_index,
114 (gpointer) property_name_map[i][0]);
117 g_object_unref (child_obj);
123 guint * prop_id = NULL)
125 GObject *child_obj = G_OBJECT (g_type_create_instance (child_elem_type));
126 GObjectClass *child_class = G_OBJECT_GET_CLASS (child_obj);
127 guint param_id = prop_id ? *prop_id : 1;
130 GParamSpec **spec = g_object_class_list_properties (child_class, &num_specs);
131 for (
uint prop_index = 0; prop_index < num_specs; ++prop_index) {
132 GParamSpec *cur_spec = spec[prop_index];
133 GParamSpec *binspec = NULL;
135 if (!g_strcmp0 (cur_spec->name,
"parent")
136 || !g_strcmp0 (cur_spec->name,
"name"))
138 switch (cur_spec->value_type) {
141 gchar *default_val = NULL;
142 g_object_get (child_obj, cur_spec->name, &default_val, NULL);
144 g_param_spec_string (cur_spec->name, cur_spec->_nick,
145 cur_spec->_blurb, default_val, cur_spec->flags);
146 g_free (default_val);
151 gboolean default_val =
FALSE;
152 g_object_get (child_obj, cur_spec->name, &default_val, NULL);
154 g_param_spec_boolean (cur_spec->name, cur_spec->_nick,
155 cur_spec->_blurb, default_val, cur_spec->flags);
160 GParamSpecUInt *puint = G_PARAM_SPEC_UINT (cur_spec);
161 guint default_val = 0;
162 g_object_get (child_obj, cur_spec->name, &default_val, NULL);
164 g_param_spec_uint (cur_spec->name, cur_spec->_nick,
165 cur_spec->_blurb, puint->minimum, puint->maximum,
166 default_val, cur_spec->flags);
171 GParamSpecInt *pint = G_PARAM_SPEC_INT (cur_spec);
172 gint default_val = 0;
173 g_object_get (child_obj, cur_spec->name, &default_val, NULL);
175 g_param_spec_int (cur_spec->name, cur_spec->_nick,
176 cur_spec->_blurb, pint->minimum, pint->maximum,
177 default_val, cur_spec->flags);
183 g_param_spec_pointer (cur_spec->name, cur_spec->_nick,
184 cur_spec->_blurb, cur_spec->flags);
188 if (G_IS_PARAM_SPEC_ENUM (cur_spec)) {
190 g_object_get (child_obj, cur_spec->name, &default_val, NULL);
191 binspec = g_param_spec_enum (cur_spec->name, cur_spec->_nick,
192 cur_spec->_blurb, cur_spec->value_type, default_val,
198 g_object_class_install_property (parent_elem_class, param_id, binspec);
200 g_printerr (
"Cannot forward '%s' property '%s' of type '%s'\n",
201 G_OBJECT_CLASS_NAME (child_class), cur_spec->name,
202 g_type_name (cur_spec->value_type));
208 g_object_unref (child_obj);
215 const gchar * child_tmpl_name,
const gchar * pad_tmpl_name =
nullptr)
217 GstElementClass *child_elem_class =
218 (GstElementClass *) g_type_class_ref (child_elem_type);
219 GstPadTemplate *tmpl =
220 gst_element_class_get_pad_template (child_elem_class, child_tmpl_name);
221 tmpl = gst_pad_template_new (pad_tmpl_name ? pad_tmpl_name : child_tmpl_name,
222 tmpl->direction, tmpl->presence, tmpl->caps);
223 gst_element_class_add_pad_template (bin_class, tmpl);
224 g_type_class_unref (child_elem_class);
232 operator T* ()
const {
return this->
get (); }
239 operator GstCaps* ()
const {
return this->
get (); }
244 #define NVGSTDS_ELEM_ADD_PROBE(parent_elem, elem, pad, probe_func, probe_type, probe_data) \
246 gulong probe_id = 0; \
247 GstPad *gstpad = gst_element_get_static_pad (elem, pad); \
249 GST_ELEMENT_ERROR(parent_elem, RESOURCE, FAILED, \
250 ("Could not find '%s' in '%s'", pad, \
251 GST_ELEMENT_NAME(elem)), (NULL)); \
253 probe_id = gst_pad_add_probe(gstpad, (GstPadProbeType) (probe_type), probe_func, probe_data, NULL); \
254 gst_object_unref (gstpad); \
259 #define NVGSTDS_LINK_ELEMENT(elem1, elem2, ...) \
261 if (!gst_element_link (elem1,elem2)) { \
262 GstCaps * src_caps, *sink_caps; \
263 src_caps = gst_pad_query_caps ((GstPad *) (elem1)->srcpads->data, NULL); \
264 sink_caps = gst_pad_query_caps ((GstPad *) (elem2)->sinkpads->data, NULL); \
265 GST_ELEMENT_ERROR (GST_ELEMENT_PARENT(elem1), STREAM, FAILED, \
266 ("Failed to link '%s' (%s) and '%s' (%s)", \
267 GST_ELEMENT_NAME (elem1), \
268 gst_caps_to_string (src_caps), \
269 GST_ELEMENT_NAME (elem2), \
270 gst_caps_to_string (sink_caps)), (NULL)); \
271 return __VA_ARGS__; \
275 #define NVGSTDS_BIN_ADD_GHOST_PAD(bin, elem, pad, ...) \
277 GstPadUPtr gstpad = gst_element_get_static_pad (elem, pad); \
279 GST_ELEMENT_ERROR(bin, STREAM, FAILED, ("Could not find '%s' in '%s'", pad, \
280 GST_ELEMENT_NAME(elem)), (NULL)); \
281 return __VA_ARGS__; \
283 GstElementClass *klass = GST_ELEMENT_GET_CLASS(bin); \
284 GstPadTemplate *tmpl = gst_element_class_get_pad_template(klass, pad); \
285 gst_element_add_pad (bin, gst_ghost_pad_new_from_template (pad, gstpad, tmpl)); \
288 #define NVGSTDS_BIN_SET_GHOST_PAD_TARGET(bin, bin_pad, target, target_pad_name, ...) \
290 GstPadUPtr pad = gst_element_get_static_pad (target, target_pad_name); \
292 GST_ELEMENT_ERROR(bin, STREAM, FAILED, ("Could not find '%s' in '%s'", target_pad_name, \
293 GST_ELEMENT_NAME(target)), (NULL)); \
294 return __VA_ARGS__; \
296 if (!gst_ghost_pad_set_target (GST_GHOST_PAD \
298 GST_ELEMENT_ERROR (bin, RESOURCE, NOT_FOUND, \
299 ("Failed to set '%s' as target of '%s' pad", \
300 GST_ELEMENT_NAME (target), \
301 GST_PAD_NAME (bin_pad)), (NULL)); \
302 return __VA_ARGS__; \
309 GstIterator *it = gst_bin_iterate_elements (bin);
310 GValue elem = G_VALUE_INIT;
311 while (gst_iterator_next (it, &elem) == GST_ITERATOR_OK) {
312 gst_bin_remove (bin, GST_ELEMENT (g_value_get_object (&elem)));
313 gst_iterator_resync (it);
315 gst_iterator_free (it);