mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-12-25 17:50:36 +00:00
74 lines
2.3 KiB
Text
74 lines
2.3 KiB
Text
|
GstController:
|
||
|
==============
|
||
|
|
||
|
Implementation:
|
||
|
---------------
|
||
|
|
||
|
Ideas and plans:
|
||
|
- Deprecate control-rate property and add a control-period property
|
||
|
that does the same and is named appropiately. Damn confusing names.
|
||
|
|
||
|
- gst_object_suggest_next_sync() will not be used at all anymore.
|
||
|
Note this in the docs and explain correct usage in elements.
|
||
|
|
||
|
- Optimize get_value_array() functions to not just call get() but be
|
||
|
a bit more intelligent.
|
||
|
- Optimize trigger interpolator's get_value_array() to set trigger if
|
||
|
a requested value's timestamp is before the trigger timestamp and
|
||
|
this timestamp + sample period is after the trigger timestamp.
|
||
|
|
||
|
- Get tempo interface in base (or core?) and have it modify the
|
||
|
control rate to get expected results.
|
||
|
|
||
|
- ? Let get_value_array() sample the values with control-period if
|
||
|
the given sample_interval is zero ?
|
||
|
|
||
|
|
||
|
Usage in elements:
|
||
|
------------------
|
||
|
|
||
|
- In the beginning of the processing loop call
|
||
|
gst_object_sync_values() with the current timestamp.
|
||
|
- Convert the controller's control-period property into frames/samples
|
||
|
and request values sampled with control-period to apply one value to
|
||
|
each control-period frames/samples.
|
||
|
- Update controlled GObject properties with the last values, i.e.
|
||
|
call gst_object_sync_values() with the end timestamp.
|
||
|
|
||
|
- ! The user has to choose a good control-period to prevent two trigger
|
||
|
timestamps separated by less than control-period nanoseconds.
|
||
|
|
||
|
code:
|
||
|
|
||
|
FIXME: can this be simplified? bugs in corner cases?
|
||
|
|
||
|
[...]
|
||
|
GstController ctrl = gst_object_get_controller (self);
|
||
|
GstValueArray prop1;
|
||
|
prop1.property_name = "prop1";
|
||
|
if (ctrl) {
|
||
|
gst_controller_sync_values (ctrl, GST_BUFFER_TIMESTAMP);
|
||
|
samples_per_period = control-period / sample-rate;
|
||
|
nvalues = num_samples / samples_per_period;
|
||
|
prop1.nbsamples = nvalues;
|
||
|
prop1.sample_interval = control-period;
|
||
|
prop1.values = g_new (type, nvalues);
|
||
|
gst_controller_get_value_array (ctrl, GST_BUFFER_TIMESTAMP, &prop1);
|
||
|
} else {
|
||
|
prop1.values = &self->prop1;
|
||
|
samples_per_period = num_samples;
|
||
|
}
|
||
|
[...]
|
||
|
|
||
|
for (i = 0; i < num_samples; i++) {
|
||
|
prop1_val = prop1.values[i / samples_per_period];
|
||
|
process();
|
||
|
}
|
||
|
|
||
|
[...]
|
||
|
if (ctrl) {
|
||
|
gst_controller_sync_values (ctrl, GST_BUFFER_TIMESTAMP + GST_BUFFER_DURATION);
|
||
|
g_free (prop1.values);
|
||
|
}
|
||
|
|