summaryrefslogtreecommitdiff
path: root/libs/gst/controller/gsttriggercontrolsource.c
diff options
context:
space:
mode:
Diffstat (limited to 'libs/gst/controller/gsttriggercontrolsource.c')
-rw-r--r--libs/gst/controller/gsttriggercontrolsource.c263
1 files changed, 0 insertions, 263 deletions
diff --git a/libs/gst/controller/gsttriggercontrolsource.c b/libs/gst/controller/gsttriggercontrolsource.c
deleted file mode 100644
index 0b68cf1d5a..0000000000
--- a/libs/gst/controller/gsttriggercontrolsource.c
+++ /dev/null
@@ -1,263 +0,0 @@
-/* GStreamer
- *
- * Copyright (C) 2007,2009 Sebastian Dröge <sebastian.droege@collabora.co.uk>
- * 2011 Stefan Sauer <ensonic@users.sf.net>
- *
- * gsttriggercontrolsource.c: Control source that provides some values at time-
- * stamps
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Library General Public
- * License as published by the Free Software Foundation; either
- * version 2 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- * Library General Public License for more details.
- *
- * You should have received a copy of the GNU Library General Public
- * License along with this library; if not, write to the
- * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
- * Boston, MA 02110-1301, USA.
- */
-
- /**
- * SECTION:gsttriggercontrolsource
- * @title: GstTriggerControlSource
- * @short_description: trigger control source
- *
- * #GstTriggerControlSource is a #GstControlSource, that returns values from user-given
- * control points. It allows for a tolerance on the time-stamps.
- *
- * To use #GstTriggerControlSource get a new instance by calling
- * gst_trigger_control_source_new(), bind it to a #GParamSpec and set some
- * control points by calling gst_timed_value_control_source_set().
- *
- * All functions are MT-safe.
- */
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <glib-object.h>
-#include <gst/gst.h>
-
-#include "gsttriggercontrolsource.h"
-#include "gst/glib-compat-private.h"
-#include "gst/math-compat.h"
-
-#define GST_CAT_DEFAULT controller_debug
-GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
-
-struct _GstTriggerControlSourcePrivate
-{
- gint64 tolerance;
-};
-
-/* control point accessors */
-
-/* returns the default value of the property, except for times with specific values */
-/* needed for one-shot events, such as notes and triggers */
-
-static inline gdouble
-_interpolate_trigger (GstTimedValueControlSource * self, GSequenceIter * iter,
- GstClockTime timestamp)
-{
- GstControlPoint *cp;
- gint64 tolerance = ((GstTriggerControlSource *) self)->priv->tolerance;
- gboolean found = FALSE;
-
- cp = g_sequence_get (iter);
- if (GST_CLOCK_DIFF (cp->timestamp, timestamp) <= tolerance) {
- found = TRUE;
- } else {
- if ((iter = g_sequence_iter_next (iter)) && !g_sequence_iter_is_end (iter)) {
- cp = g_sequence_get (iter);
- if (GST_CLOCK_DIFF (timestamp, cp->timestamp) <= tolerance) {
- found = TRUE;
- }
- }
- }
- if (found) {
- return cp->value;
- }
- return NAN;
-}
-
-static gboolean
-interpolate_trigger_get (GstTimedValueControlSource * self,
- GstClockTime timestamp, gdouble * value)
-{
- gboolean ret = FALSE;
- GSequenceIter *iter;
-
- g_mutex_lock (&self->lock);
-
- iter =
- gst_timed_value_control_source_find_control_point_iter (self, timestamp);
- if (iter) {
- *value = _interpolate_trigger (self, iter, timestamp);
- if (!isnan (*value))
- ret = TRUE;
- }
- g_mutex_unlock (&self->lock);
- return ret;
-}
-
-static gboolean
-interpolate_trigger_get_value_array (GstTimedValueControlSource * self,
- GstClockTime timestamp, GstClockTime interval, guint n_values,
- gdouble * values)
-{
- gboolean ret = FALSE;
- guint i;
- GstClockTime ts = timestamp;
- GstClockTime next_ts = 0;
- gdouble val;
- GSequenceIter *iter1 = NULL, *iter2 = NULL;
- gboolean triggered = FALSE;
-
- g_mutex_lock (&self->lock);
- for (i = 0; i < n_values; i++) {
- val = NAN;
- if (ts >= next_ts) {
- iter1 = gst_timed_value_control_source_find_control_point_iter (self, ts);
- if (!iter1) {
- if (G_LIKELY (self->values))
- iter2 = g_sequence_get_begin_iter (self->values);
- else
- iter2 = NULL;
- } else {
- iter2 = g_sequence_iter_next (iter1);
- }
-
- if (iter2 && !g_sequence_iter_is_end (iter2)) {
- GstControlPoint *cp;
-
- cp = g_sequence_get (iter2);
- next_ts = cp->timestamp;
- } else {
- next_ts = GST_CLOCK_TIME_NONE;
- }
-
- if (iter1) {
- val = _interpolate_trigger (self, iter1, ts);
- if (!isnan (val))
- ret = TRUE;
- } else {
- g_mutex_unlock (&self->lock);
- return FALSE;
- }
- triggered = TRUE;
- } else if (triggered) {
- if (iter1) {
- val = _interpolate_trigger (self, iter1, ts);
- if (!isnan (val))
- ret = TRUE;
- } else {
- g_mutex_unlock (&self->lock);
- return FALSE;
- }
- triggered = FALSE;
- }
- *values = val;
- ts += interval;
- values++;
- }
- g_mutex_unlock (&self->lock);
- return ret;
-}
-
-enum
-{
- PROP_TOLERANCE = 1,
-};
-
-#define _do_init \
- GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "trigger control source", 0, \
- "timeline value trigger control source")
-
-G_DEFINE_TYPE_WITH_CODE (GstTriggerControlSource, gst_trigger_control_source,
- GST_TYPE_TIMED_VALUE_CONTROL_SOURCE, G_ADD_PRIVATE (GstTriggerControlSource)
- _do_init);
-
-/**
- * gst_trigger_control_source_new:
- *
- * This returns a new, unbound #GstTriggerControlSource.
- *
- * Returns: (transfer full): a new, unbound #GstTriggerControlSource.
- */
-GstControlSource *
-gst_trigger_control_source_new (void)
-{
- GstControlSource *csource =
- g_object_new (GST_TYPE_TRIGGER_CONTROL_SOURCE, NULL);
-
- /* Clear floating flag */
- gst_object_ref_sink (csource);
-
- return csource;
-}
-
-static void
-gst_trigger_control_source_init (GstTriggerControlSource * self)
-{
- GstControlSource *csource = (GstControlSource *) self;
-
- self->priv = gst_trigger_control_source_get_instance_private (self);
-
- csource->get_value = (GstControlSourceGetValue) interpolate_trigger_get;
- csource->get_value_array = (GstControlSourceGetValueArray)
- interpolate_trigger_get_value_array;
-}
-
-static void
-gst_trigger_control_source_set_property (GObject * object, guint prop_id,
- const GValue * value, GParamSpec * pspec)
-{
- GstTriggerControlSource *self = GST_TRIGGER_CONTROL_SOURCE (object);
-
- switch (prop_id) {
- case PROP_TOLERANCE:
- GST_TIMED_VALUE_CONTROL_SOURCE_LOCK (self);
- self->priv->tolerance = g_value_get_int64 (value);
- GST_TIMED_VALUE_CONTROL_SOURCE_UNLOCK (self);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gst_trigger_control_source_get_property (GObject * object, guint prop_id,
- GValue * value, GParamSpec * pspec)
-{
- GstTriggerControlSource *self = GST_TRIGGER_CONTROL_SOURCE (object);
-
- switch (prop_id) {
- case PROP_TOLERANCE:
- g_value_set_int64 (value, self->priv->tolerance);
- break;
- default:
- G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
- break;
- }
-}
-
-static void
-gst_trigger_control_source_class_init (GstTriggerControlSourceClass * klass)
-{
- GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
-
- gobject_class->set_property = gst_trigger_control_source_set_property;
- gobject_class->get_property = gst_trigger_control_source_get_property;
-
- g_object_class_install_property (gobject_class, PROP_TOLERANCE,
- g_param_spec_int64 ("tolerance", "Tolerance",
- "Amount of ns a control time can be off to still trigger",
- 0, G_MAXINT64, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
-}