2 * Copyright (C) 2001 Steve Baker <stevebaker_org@yahoo.co.uk>
4 * gstdparammanager.c: Dynamic Parameter group functionality
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Library General Public
8 * License as published by the Free Software Foundation; either
9 * version 2 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Library General Public License for more details.
16 * You should have received a copy of the GNU Library General Public
17 * License along with this library; if not, write to the
18 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
19 * Boston, MA 02111-1307, USA.
22 #include <gst/control/dparammanager.h>
23 #include <gst/gstelement.h>
24 #include <gst/gstinfo.h>
26 static GHashTable *_element_registry;
32 static void gst_dpman_class_init (GstDParamManagerClass *klass);
33 static void gst_dpman_init (GstDParamManager *dpman);
34 static void gst_dpman_dispose (GObject *object);
35 static GstDParamWrapper* gst_dpman_new_wrapper(GstDParamManager *dpman, GParamSpec *param_spec, gboolean is_log, gboolean is_rate, GstDPMUpdateMethod update_method);
36 static GstDParamWrapper* gst_dpman_get_wrapper(GstDParamManager *dpman, gchar *dparam_name);
37 static void gst_dpman_state_change (GstElement *element, gint old_state, gint new_state, GstDParamManager *dpman);
38 static void gst_dpman_caps_changed (GstPad *pad, GstCaps *caps, GstDParamManager *dpman);
39 static guint gst_dpman_preprocess_synchronous(GstDParamManager *dpman, guint frames, gint64 timestamp);
40 static guint gst_dpman_preprocess_noop(GstDParamManager *dpman, guint frames, gint64 timestamp);
41 static guint gst_dpman_process_noop(GstDParamManager *dpman, guint frame_count);
43 static GObjectClass *parent_class;
44 static guint gst_dpman_signals[LAST_SIGNAL] = { 0 };
47 _gst_dpman_initialize()
52 gst_dpman_get_type (void)
54 static GType dpman_type = 0;
57 static const GTypeInfo dpman_info = {
58 sizeof(GstDParamManagerClass),
61 (GClassInitFunc)gst_dpman_class_init,
64 sizeof(GstDParamManager),
66 (GInstanceInitFunc)gst_dpman_init,
68 dpman_type = g_type_register_static(GST_TYPE_OBJECT, "GstDParamManager", &dpman_info, 0);
74 gst_dpman_class_init (GstDParamManagerClass *klass)
76 GstObjectClass *gstobject_class;
77 GObjectClass *gobject_class;
79 parent_class = g_type_class_peek_parent (klass);
81 gstobject_class = (GstObjectClass*) klass;
82 gobject_class = (GObjectClass*) klass;
83 gobject_class->dispose = gst_dpman_dispose;
85 klass->modes = g_hash_table_new(g_str_hash,g_str_equal);
87 gst_dpman_register_mode (klass, "synchronous",
88 gst_dpman_preprocess_synchronous, gst_dpman_process_noop, NULL, NULL);
89 gst_dpman_register_mode (klass, "asynchronous",
90 gst_dpman_preprocess_noop, gst_dpman_process_noop, NULL, NULL);
91 gst_dpman_register_mode (klass, "disabled",
92 gst_dpman_preprocess_noop, gst_dpman_process_noop, NULL, NULL);
94 _element_registry = g_hash_table_new(NULL,NULL);
96 gst_dpman_signals[NEW_REQUIRED_DPARAM] =
97 g_signal_new ("new_required_dparam", G_TYPE_FROM_CLASS(klass), G_SIGNAL_RUN_LAST,
98 G_STRUCT_OFFSET (GstDParamManagerClass, new_required_dparam), NULL, NULL,
99 gst_marshal_VOID__STRING, G_TYPE_NONE, 1,
105 gst_dpman_init (GstDParamManager *dpman)
107 GST_DPMAN_DPARAMS(dpman) = g_hash_table_new(g_str_hash,g_str_equal);
108 GST_DPMAN_DPARAMS_LIST(dpman) = NULL;
109 GST_DPMAN_NAME(dpman) = NULL;
110 GST_DPMAN_PARENT(dpman) = NULL;
111 GST_DPMAN_MODE_NAME(dpman) = NULL;
112 GST_DPMAN_MODE(dpman) = NULL;
113 GST_DPMAN_MODE_DATA(dpman) = NULL;
114 GST_DPMAN_RATE(dpman) = 0;
119 * @name: name of the GstDParamManager instance
120 * @parent: element which created this instance
122 * Returns: a new instance of GstDParamManager
125 gst_dpman_new (gchar *name, GstElement *parent)
127 GstDParamManager *dpman;
129 g_return_val_if_fail (name != NULL, NULL);
131 dpman = g_object_new (gst_dpman_get_type (), NULL);
132 gst_object_set_name (GST_OBJECT (dpman), name);
133 gst_dpman_set_parent(dpman, parent);
135 gst_dpman_set_mode(dpman, "disabled");
142 gst_dpman_dispose (GObject *object)
144 /* GstDParamManager *dpman = GST_DPMAN(object); */
146 G_OBJECT_CLASS (parent_class)->dispose (object);
150 * gst_dpman_add_required_dparam_callback:
151 * @dpman: GstDParamManager instance
152 * @update_func: callback to update the element with the new value
153 * @update_data: will be included in the call to update_func
155 * Returns: true if it was successfully added
158 gst_dpman_add_required_dparam_callback (GstDParamManager *dpman,
159 GParamSpec *param_spec,
162 GstDPMUpdateFunction update_func,
163 gpointer update_data)
165 GstDParamWrapper* dpwrap;
167 g_return_val_if_fail (dpman != NULL, FALSE);
168 g_return_val_if_fail (GST_IS_DPMAN (dpman), FALSE);
169 g_return_val_if_fail (update_func != NULL, FALSE);
171 dpwrap = gst_dpman_new_wrapper(dpman, param_spec, is_log, is_rate, GST_DPMAN_CALLBACK);
173 g_return_val_if_fail (dpwrap != NULL, FALSE);
175 GST_DEBUG(GST_CAT_PARAMS,"adding required callback dparam '%s'", g_param_spec_get_name(param_spec));
177 dpwrap->update_func = update_func;
178 dpwrap->update_data = update_data;
180 g_signal_emit (G_OBJECT (dpman), gst_dpman_signals[NEW_REQUIRED_DPARAM], 0, g_param_spec_get_name(param_spec));
186 * gst_dpman_add_required_dparam_direct:
187 * @dpman: GstDParamManager instance
188 * @update_data: pointer to the member to be updated
190 * Returns: true if it was successfully added
193 gst_dpman_add_required_dparam_direct (GstDParamManager *dpman,
194 GParamSpec *param_spec,
197 gpointer update_data)
199 GstDParamWrapper* dpwrap;
201 g_return_val_if_fail (dpman != NULL, FALSE);
202 g_return_val_if_fail (GST_IS_DPMAN (dpman), FALSE);
203 g_return_val_if_fail (update_data != NULL, FALSE);
205 dpwrap = gst_dpman_new_wrapper(dpman, param_spec, is_log, is_rate, GST_DPMAN_DIRECT);
207 g_return_val_if_fail (dpwrap != NULL, FALSE);
209 GST_DEBUG(GST_CAT_PARAMS,"adding required direct dparam '%s'", g_param_spec_get_name(param_spec));
211 dpwrap->update_data = update_data;
213 g_signal_emit (G_OBJECT (dpman), gst_dpman_signals[NEW_REQUIRED_DPARAM], 0, g_param_spec_get_name(param_spec));
219 * gst_dpman_add_required_dparam_array:
220 * @dpman: GstDParamManager instance
221 * @dparam_name: a parameter name unique to this GstDParamManager
222 * @update_data: pointer to where the array will be stored
224 * Returns: true if it was successfully added
227 gst_dpman_add_required_dparam_array (GstDParamManager *dpman,
228 GParamSpec *param_spec,
231 gpointer update_data)
233 GstDParamWrapper* dpwrap;
235 g_return_val_if_fail (dpman != NULL, FALSE);
236 g_return_val_if_fail (GST_IS_DPMAN (dpman), FALSE);
237 g_return_val_if_fail (update_data != NULL, FALSE);
239 dpwrap = gst_dpman_new_wrapper(dpman, param_spec, is_log, is_rate, GST_DPMAN_ARRAY);
241 g_return_val_if_fail (dpwrap != NULL, FALSE);
243 GST_DEBUG(GST_CAT_PARAMS,"adding required array dparam '%s'", g_param_spec_get_name(param_spec));
245 dpwrap->update_data = update_data;
247 g_signal_emit (G_OBJECT (dpman), gst_dpman_signals[NEW_REQUIRED_DPARAM], 0, g_param_spec_get_name(param_spec));
253 * gst_dpman_remove_required_dparam:
254 * @dpman: GstDParamManager instance
255 * @dparam_name: the name of an existing parameter
259 gst_dpman_remove_required_dparam (GstDParamManager *dpman, gchar *dparam_name)
261 GstDParamWrapper* dpwrap;
263 g_return_if_fail (dpman != NULL);
264 g_return_if_fail (GST_IS_DPMAN (dpman));
265 g_return_if_fail (dparam_name != NULL);
267 dpwrap = gst_dpman_get_wrapper(dpman, dparam_name);
269 g_return_if_fail(dpwrap != NULL);
270 g_return_if_fail(dpwrap->dparam == NULL);
272 GST_DEBUG(GST_CAT_PARAMS, "removing required dparam: %s", dparam_name);
274 g_hash_table_remove(GST_DPMAN_DPARAMS(dpman), dparam_name);
275 GST_DPMAN_DPARAMS_LIST(dpman) = g_slist_remove(GST_DPMAN_DPARAMS_LIST(dpman), dpwrap);
277 g_free(dpwrap->value);
282 * gst_dpman_attach_dparam:
283 * @dpman: GstDParamManager instance
284 * @dparam_name: a name previously added with gst_dpman_add_required_dparam
285 * @dparam: GstDParam instance to attach
287 * Returns: true if it was successfully attached
290 gst_dpman_attach_dparam (GstDParamManager *dpman, gchar *dparam_name, GstDParam *dparam)
292 GstDParamWrapper* dpwrap;
294 g_return_val_if_fail (dpman != NULL, FALSE);
295 g_return_val_if_fail (GST_IS_DPMAN (dpman), FALSE);
296 g_return_val_if_fail (dparam_name != NULL, FALSE);
297 g_return_val_if_fail (dparam != NULL, FALSE);
298 g_return_val_if_fail (GST_IS_DPARAM (dparam), FALSE);
299 g_return_val_if_fail (dparam != NULL, FALSE);
301 dpwrap = gst_dpman_get_wrapper(dpman, dparam_name);
303 g_return_val_if_fail(dpwrap != NULL, FALSE);
304 g_return_val_if_fail(dpwrap->value != NULL, FALSE);
306 dpwrap->dparam = dparam;
307 gst_dparam_attach(dparam, dpman, dpwrap->param_spec, dpwrap->is_log, dpwrap->is_rate);
313 * gst_dpman_detach_dparam:
314 * @dpman: GstDParamManager instance
315 * @dparam_name: the name of a parameter with a previously attached GstDParam
319 gst_dpman_detach_dparam (GstDParamManager *dpman, gchar *dparam_name)
321 GstDParamWrapper* dpwrap;
323 g_return_if_fail (dpman != NULL);
324 g_return_if_fail (GST_IS_DPMAN (dpman));
325 g_return_if_fail (dparam_name != NULL);
327 dpwrap = gst_dpman_get_wrapper(dpman, dparam_name);
329 g_return_if_fail(dpwrap);
331 gst_dparam_detach(dpwrap->dparam);
332 dpwrap->dparam = NULL;
337 * gst_dpman_get_dparam:
338 * @dpman: GstDParamManager instance
339 * @name: the name of an existing dparam instance
341 * Returns: the dparam with the given name - or NULL otherwise
344 gst_dpman_get_dparam (GstDParamManager *dpman, gchar *name)
346 GstDParamWrapper* dpwrap;
348 g_return_val_if_fail (dpman != NULL, NULL);
349 g_return_val_if_fail (GST_IS_DPMAN (dpman), NULL);
350 g_return_val_if_fail (name != NULL, NULL);
352 dpwrap = g_hash_table_lookup(GST_DPMAN_DPARAMS(dpman), name);
353 g_return_val_if_fail (dpwrap != NULL, NULL);
355 return dpwrap->dparam;
359 * gst_dpman_get_dparam_type:
360 * @dpman: GstDParamManager instance
361 * @name: the name of dparam
363 * Returns: the type that this dparam requires/uses
366 gst_dpman_get_dparam_type (GstDParamManager *dpman, gchar *name)
368 GstDParamWrapper* dpwrap;
370 g_return_val_if_fail (dpman != NULL, 0);
371 g_return_val_if_fail (GST_IS_DPMAN (dpman), 0);
372 g_return_val_if_fail (name != NULL, 0);
374 dpwrap = g_hash_table_lookup(GST_DPMAN_DPARAMS(dpman), name);
375 g_return_val_if_fail (dpwrap != NULL, 0);
377 return G_VALUE_TYPE(dpwrap->value);
381 gst_dpman_list_dparam_specs(GstDParamManager *dpman)
383 GstDParamWrapper* dpwrap;
385 GParamSpec** param_specs;
388 g_return_val_if_fail (dpman != NULL, NULL);
389 g_return_val_if_fail (GST_IS_DPMAN (dpman), NULL);
391 dpwraps = GST_DPMAN_DPARAMS_LIST(dpman);
393 param_specs = g_new0(GParamSpec*, g_slist_length(dpwraps) + 1);
396 dpwrap = (GstDParamWrapper*)dpwraps->data;
397 param_specs[x++] = dpwrap->param_spec;
398 dpwraps = g_slist_next(dpwraps);
404 gst_dpman_get_param_spec (GstDParamManager *dpman, gchar *dparam_name)
406 GstDParamWrapper* dpwrap;
408 g_return_val_if_fail (dpman != NULL, NULL);
409 g_return_val_if_fail (GST_IS_DPMAN (dpman), NULL);
410 g_return_val_if_fail (dparam_name != NULL, NULL);
412 dpwrap = gst_dpman_get_wrapper(dpman, dparam_name);
413 return dpwrap->param_spec;
417 * gst_dpman_register_mode
418 * @klass: GstDParamManagerClass class instance
419 * @modename: the unique name of the new mode
420 * @preprocessfunc: the function which will be called before each buffer is processed
421 * @processfunc: the function which may be called throughout the processing of a buffer
422 * @setupfunc: the function which initialises the mode when activated
423 * @teardownfunc: the function which frees any resources the mode uses
427 gst_dpman_register_mode (GstDParamManagerClass *klass,
429 GstDPMModePreProcessFunction preprocessfunc,
430 GstDPMModeProcessFunction processfunc,
431 GstDPMModeSetupFunction setupfunc,
432 GstDPMModeTeardownFunction teardownfunc)
436 g_return_if_fail (klass != NULL);
437 g_return_if_fail (modename != NULL);
438 g_return_if_fail (GST_IS_DPMAN_CLASS (klass));
440 mode = g_new0(GstDPMMode,1);
442 mode->preprocessfunc = preprocessfunc;
443 mode->processfunc = processfunc;
444 mode->setupfunc = setupfunc;
445 mode->teardownfunc = teardownfunc;
447 g_hash_table_insert(klass->modes, modename, mode);
448 GST_DEBUG(GST_CAT_PARAMS, "mode '%s' registered", modename);
453 * @dpman: GstDParamManager instance
454 * @modename: the name of the mode to use
456 * Returns: TRUE if the mode was set, FALSE otherwise
459 gst_dpman_set_mode(GstDParamManager *dpman, gchar *modename)
461 GstDPMMode *mode=NULL;
462 GstDParamManagerClass *oclass;
464 g_return_val_if_fail (dpman != NULL, FALSE);
465 g_return_val_if_fail (GST_IS_DPMAN (dpman), FALSE);
466 g_return_val_if_fail (modename != NULL, FALSE);
468 oclass = (GstDParamManagerClass*)(G_OBJECT_GET_CLASS(dpman));
470 mode = g_hash_table_lookup(oclass->modes, modename);
471 g_return_val_if_fail (mode != NULL, FALSE);
473 if (GST_DPMAN_MODE(dpman) == mode) {
474 GST_DEBUG(GST_CAT_PARAMS, "mode %s already set", modename);
478 GST_DEBUG(GST_CAT_PARAMS, "setting mode to %s", modename);
479 if (GST_DPMAN_MODE(dpman) && GST_DPMAN_TEARDOWNFUNC(dpman)){
480 GST_DPMAN_TEARDOWNFUNC(dpman)(dpman);
483 GST_DPMAN_MODE(dpman) = mode;
485 if (GST_DPMAN_SETUPFUNC(dpman)){
486 GST_DPMAN_SETUPFUNC(dpman)(dpman);
493 * gst_dpman_set_parent
494 * @dpman: GstDParamManager instance
495 * @parent: the element that this GstDParamManager belongs to
499 gst_dpman_set_parent (GstDParamManager *dpman, GstElement *parent)
501 g_return_if_fail (dpman != NULL);
502 g_return_if_fail (GST_IS_DPMAN (dpman));
503 g_return_if_fail (parent != NULL);
504 g_return_if_fail (GST_IS_ELEMENT (parent));
506 g_hash_table_insert(_element_registry, parent, dpman);
507 gst_object_set_parent (GST_OBJECT (dpman), GST_OBJECT(parent));
508 g_signal_connect(G_OBJECT(parent), "state_change",
509 G_CALLBACK (gst_dpman_state_change), dpman);
513 * gst_dpman_get_manager
514 * @parent: the element that the desired GstDParamManager belongs to
516 * Returns: the GstDParamManager which belongs to this element or NULL
517 * if it doesn't exist
520 gst_dpman_get_manager (GstElement *parent)
522 GstDParamManager *dpman;
523 g_return_val_if_fail (parent != NULL, NULL);
524 g_return_val_if_fail (GST_IS_ELEMENT (parent), NULL);
526 dpman = (GstDParamManager*)g_hash_table_lookup(_element_registry, parent);
531 * gst_dpman_set_rate_change_pad
532 * @dpman: GstDParamManager instance
533 * @pad: the pad which may have a "rate" caps property
537 gst_dpman_set_rate_change_pad(GstDParamManager *dpman, GstPad *pad)
539 g_return_if_fail (dpman != NULL);
540 g_return_if_fail (GST_IS_DPMAN (dpman));
541 g_return_if_fail (pad != NULL);
542 g_return_if_fail (GST_IS_PAD (pad));
544 g_signal_connect(G_OBJECT(pad), "caps_changed",
545 G_CALLBACK (gst_dpman_caps_changed), dpman);
549 * gst_dpman_bypass_dparam:
550 * @dpman: GstDParamManager instance
551 * @dparam_name: the name of dparam
553 * If a dparam is attached to this dparam_name, it will be detached
554 * and a warning will be issued. This should be called in the _set_property
555 * function of an element if the value it changes is also changed by a dparam.
559 gst_dpman_bypass_dparam(GstDParamManager *dpman, gchar *dparam_name)
561 GstDParamWrapper* dpwrap;
563 g_return_if_fail (dpman != NULL);
564 g_return_if_fail (GST_IS_DPMAN (dpman));
565 g_return_if_fail (dparam_name != NULL);
567 dpwrap = gst_dpman_get_wrapper(dpman, dparam_name);
568 g_return_if_fail (dpwrap != NULL);
570 if (dpwrap->dparam != NULL){
571 g_warning("Bypassing attached dparam '%s'. It will be detached", dparam_name);
572 gst_dpman_detach_dparam(dpman, dparam_name);
576 static GstDParamWrapper*
577 gst_dpman_get_wrapper(GstDParamManager *dpman, gchar *dparam_name)
579 g_return_val_if_fail (dpman != NULL, NULL);
580 g_return_val_if_fail (GST_IS_DPMAN (dpman), NULL);
581 g_return_val_if_fail (dparam_name != NULL, NULL);
583 return g_hash_table_lookup(GST_DPMAN_DPARAMS(dpman), dparam_name);
586 static GstDParamWrapper*
587 gst_dpman_new_wrapper(GstDParamManager *dpman,
588 GParamSpec *param_spec,
591 GstDPMUpdateMethod update_method)
593 GstDParamWrapper* dpwrap;
596 g_return_val_if_fail (dpman != NULL, NULL);
597 g_return_val_if_fail (GST_IS_DPMAN (dpman), NULL);
598 g_return_val_if_fail (param_spec != NULL, NULL);
600 dparam_name = g_strdup(g_param_spec_get_name(param_spec));
601 g_return_val_if_fail(gst_dpman_get_wrapper(dpman, dparam_name) == NULL, NULL);
603 dpwrap = g_new0(GstDParamWrapper,1);
604 dpwrap->update_method = update_method;
605 dpwrap->value = g_new0(GValue,1);
606 g_value_init(dpwrap->value, G_PARAM_SPEC_VALUE_TYPE(param_spec));
607 dpwrap->param_spec = param_spec;
608 dpwrap->is_log = is_log;
609 dpwrap->is_rate = is_rate;
611 g_hash_table_insert(GST_DPMAN_DPARAMS(dpman), dparam_name, dpwrap);
612 GST_DPMAN_DPARAMS_LIST(dpman) = g_slist_append(GST_DPMAN_DPARAMS_LIST(dpman), dpwrap);
619 gst_dpman_state_change (GstElement *element, gint old_state, gint new_state, GstDParamManager *dpman)
623 GstDParamWrapper *dpwrap;
625 g_return_if_fail (dpman != NULL);
626 g_return_if_fail (GST_IS_DPMAN (dpman));
628 if (new_state == GST_STATE_PLAYING){
629 GST_DEBUG(GST_CAT_PARAMS, "initialising params");
631 /* force all params to be updated */
632 dwraps = GST_DPMAN_DPARAMS_LIST(dpman);
634 dpwrap = (GstDParamWrapper*)dwraps->data;
635 dparam = dpwrap->dparam;
638 GST_DPARAM_READY_FOR_UPDATE(dparam) = TRUE;
640 g_value_copy(dparam->spec->default_val, dpwrap->value);
643 dwraps = g_slist_next(dwraps);
649 gst_dpman_caps_changed (GstPad *pad, GstCaps *caps, GstDParamManager *dpman)
653 g_return_if_fail (caps != NULL);
654 g_return_if_fail (dpman != NULL);
655 g_return_if_fail (GST_IS_DPMAN (dpman));
657 gst_caps_get_int (caps, "rate", &rate);
658 GST_DPMAN_RATE(dpman) = rate;
660 GST_DEBUG(GST_CAT_PARAMS, "got caps change %d", GST_DPMAN_RATE(dpman));
664 gst_dpman_preprocess_synchronous(GstDParamManager *dpman, guint frames, gint64 timestamp)
668 GstDParamWrapper *dpwrap;
670 g_return_val_if_fail (dpman != NULL, frames);
671 g_return_val_if_fail (GST_IS_DPMAN (dpman), frames);
673 /* now check whether any passive dparams are ready for an update */
674 dwraps = GST_DPMAN_DPARAMS_LIST(dpman);
676 dpwrap = (GstDParamWrapper*)dwraps->data;
677 dparam = dpwrap->dparam;
679 if (dparam && (GST_DPARAM_READY_FOR_UPDATE(dparam) &&
680 (GST_DPARAM_NEXT_UPDATE_TIMESTAMP(dparam) <= timestamp))){
682 switch (dpwrap->update_method) {
684 /* direct method - set the value directly in the struct of the element */
685 case GST_DPMAN_DIRECT:
686 GST_DPARAM_DO_UPDATE(dparam, timestamp, dpwrap->value);
687 GST_DEBUG(GST_CAT_PARAMS, "doing direct update");
688 switch (G_VALUE_TYPE(dpwrap->value)){
690 *(gint*)dpwrap->update_data = g_value_get_int(dpwrap->value);
693 *(gint64*)dpwrap->update_data = g_value_get_int64(dpwrap->value);
696 *(gfloat*)dpwrap->update_data = g_value_get_float(dpwrap->value);
703 /* callback method - call the element's callback so it can do what it likes */
704 case GST_DPMAN_CALLBACK:
705 GST_DPARAM_DO_UPDATE(dparam, timestamp, dpwrap->value);
706 GST_DEBUG(GST_CAT_PARAMS, "doing callback update");
707 GST_DPMAN_DO_UPDATE(dpwrap);
710 /* array method - generate an array of the right size */
711 /* with each value being the same (in synchronous update mode) */
712 case GST_DPMAN_ARRAY:
713 GST_DEBUG(GST_CAT_PARAMS, "doing array update");
714 switch (G_VALUE_TYPE(dpwrap->value)){
729 dwraps = g_slist_next(dwraps);
735 gst_dpman_preprocess_noop(GstDParamManager *dpman, guint frames, gint64 timestamp)
741 gst_dpman_process_noop(GstDParamManager *dpman, guint frame_count)