blob: d814a916a5ad268695829d43d9d8f7b9fdaa22e8 [file] [log] [blame]
GstController:
==============
Implementation:
---------------
Ideas and plans:
- Deprecate control-rate property and add a control-period property
that does the same and is named appropriately. 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);
}