void ges_base_xml_formatter_add_control_binding (GESBaseXmlFormatter * self, const gchar * binding_type, const gchar * source_type, const gchar * property_name, gint mode, const gchar * track_id, GSList * timed_values) { GESBaseXmlFormatterPrivate *priv = _GET_PRIV (self); GESTrackElement *element = NULL; if (track_id[0] != '-' && priv->current_clip) element = _get_element_by_track_id (priv, track_id, priv->current_clip); else if (track_id[0] != '-' && priv->current_pending_clip) { PendingBinding *pbinding; pbinding = g_slice_new0 (PendingBinding); pbinding->source = gst_interpolation_control_source_new (); g_object_set (pbinding->source, "mode", mode, NULL); gst_timed_value_control_source_set_from_list (GST_TIMED_VALUE_CONTROL_SOURCE (pbinding->source), timed_values); pbinding->propname = g_strdup (property_name); pbinding->binding_type = g_strdup (binding_type); pbinding->track_id = g_strdup (track_id); priv->current_pending_clip->pending_bindings = g_list_append (priv->current_pending_clip->pending_bindings, pbinding); return; } else { element = priv->current_track_element; } if (element == NULL) { GST_WARNING ("No current track element to which we can append a binding"); return; } if (!g_strcmp0 (source_type, "interpolation")) { GstControlSource *source; source = gst_interpolation_control_source_new (); ges_track_element_set_control_source (element, source, property_name, binding_type); g_object_set (source, "mode", mode, NULL); gst_timed_value_control_source_set_from_list (GST_TIMED_VALUE_CONTROL_SOURCE (source), timed_values); } else GST_WARNING ("This interpolation type is not supported\n"); }
static void gst_controlled_property_add_interpolation_control_source (GstControlledProperty * self) { GstControlSource *csource = GST_CONTROL_SOURCE (gst_interpolation_control_source_new ()); GST_INFO ("Adding a GstInterpolationControlSource because of backward compatibility"); g_return_if_fail (!self->csource); gst_control_source_bind (GST_CONTROL_SOURCE (csource), self->pspec); self->csource = csource; }
static void set_program (GstObject * elem, GstStructure * prog) { const GstStructure *s; GstControlSource *cs; GstClockTime ts, dur; gdouble v; const GValue *frame; GHashTable *css; gint i, j; const gchar *name; css = g_hash_table_new (g_str_hash, g_str_equal); ts = 0; dur = gst_util_uint64_scale_int (GST_SECOND, 1, 15); /* loop over each image in prog */ for (i = 0; i < gst_structure_n_fields (prog); i++) { GST_DEBUG ("ctrl on %" GST_TIME_FORMAT, GST_TIME_ARGS (ts)); frame = gst_structure_get_value (prog, gst_structure_nth_field_name (prog, i)); s = gst_value_get_structure (frame); for (j = 0; j < gst_structure_n_fields (s); j++) { name = gst_structure_nth_field_name (s, j); cs = g_hash_table_lookup (css, name); if (!cs) { cs = gst_interpolation_control_source_new (); gst_object_add_control_binding (elem, gst_direct_control_binding_new (elem, name, cs)); g_object_set (cs, "mode", GST_INTERPOLATION_MODE_NONE, NULL); g_hash_table_insert (css, (gpointer) name, cs); gst_object_unref (cs); } gst_structure_get_double (s, name, &v); gst_timed_value_control_source_set ((GstTimedValueControlSource *) cs, ts, v); GST_DEBUG (" %s = %lf", name, v); } ts += dur; } g_hash_table_unref (css); }
static void set_interpolation (GstObject * element, GESTrackVideoTransitionPrivate * priv, const gchar * propname) { GstTimedValueControlSource *ts; if (priv->control_source) { ts = GST_TIMED_VALUE_CONTROL_SOURCE (priv->control_source); gst_timed_value_control_source_unset_all (ts); gst_object_unref (priv->control_source); } g_object_set (element, propname, (gfloat) 0.0, NULL); priv->control_source = gst_interpolation_control_source_new (); gst_object_add_control_binding (GST_OBJECT (element), gst_direct_control_binding_new (GST_OBJECT (element), propname, priv->control_source)); g_object_set (priv->control_source, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL); }
int main (int argc, char **argv) { GMainLoop *loop; gint i; GstElement *audiotestsrc; GstElement *audioconvert1, *audioconvert2; GstElement *pitch; GstElement *sink; GstElement *pipeline; GstControlSource *cs; GstTimedValueControlSource *tvcs; if (argc != 2) { g_printerr ("Usage: %s <audiosink>\n", argv[0]); return 1; } /* initialize GStreamer */ gst_init (&argc, &argv); loop = g_main_loop_new (NULL, FALSE); pipeline = gst_pipeline_new ("audio-player"); audiotestsrc = gst_element_factory_make ("audiotestsrc", "audiotestsrc"); g_assert (audiotestsrc != NULL); audioconvert1 = gst_element_factory_make ("audioconvert", "audioconvert1"); g_assert (audioconvert1 != NULL); audioconvert2 = gst_element_factory_make ("audioconvert", "audioconvert2"); g_assert (audioconvert2 != NULL); pitch = gst_element_factory_make ("pitch", "pitch"); g_assert (pitch != NULL); sink = gst_element_factory_make (argv[1], "sink"); g_assert (sink != NULL); gst_bin_add_many (GST_BIN (pipeline), audiotestsrc, audioconvert1, pitch, audioconvert2, sink, NULL); gst_element_link_many (audiotestsrc, audioconvert1, pitch, audioconvert2, sink, NULL); /* set up a controller */ cs = gst_interpolation_control_source_new (); g_object_set (cs, "mode", GST_INTERPOLATION_MODE_LINEAR, NULL); gst_object_add_control_binding (pitch, gst_direct_control_binding_new (pitch, "pitch", cs)); tvcs = (GstTimedValueControlSource *) cs; for (i = 0; i < 100; ++i) { if (i % 2) gst_timed_value_control_source_set (tvcs, i * GST_SECOND, 0.5); else gst_timed_value_control_source_set (tvcs, i * GST_SECOND, 1.5); } gst_element_set_state (pipeline, GST_STATE_PLAYING); g_print ("Running\n"); g_main_loop_run (loop); /* clean up nicely */ gst_object_unref (cs); g_print ("Returned, stopping playback\n"); gst_element_set_state (pipeline, GST_STATE_NULL); g_print ("Deleting pipeline\n"); gst_object_unref (GST_OBJECT (pipeline)); return 0; }
gint main (gint argc, gchar ** argv) { gint res = 1; GstElement *src, *sink; GstElement *bin; GstController *ctrl; GstInterpolationControlSource *csource1, *csource2; GstClock *clock; GstClockID clock_id; GstClockReturn wait_ret; GValue vol = { 0, }; gst_init (&argc, &argv); gst_controller_init (&argc, &argv); /* build pipeline */ bin = gst_pipeline_new ("pipeline"); clock = gst_pipeline_get_clock (GST_PIPELINE (bin)); src = gst_element_factory_make ("audiotestsrc", "gen_audio"); if (!src) { GST_WARNING ("need audiotestsrc from gst-plugins-base"); goto Error; } sink = gst_element_factory_make ("autoaudiosink", "play_audio"); if (!sink) { GST_WARNING ("need autoaudiosink from gst-plugins-base"); goto Error; } gst_bin_add_many (GST_BIN (bin), src, sink, NULL); if (!gst_element_link (src, sink)) { GST_WARNING ("can't link elements"); goto Error; } /* square wave g_object_set (G_OBJECT(src), "wave", 1, NULL); */ /* add a controller to the source */ if (!(ctrl = gst_controller_new (G_OBJECT (src), "freq", "volume", NULL))) { GST_WARNING ("can't control source element"); goto Error; } csource1 = gst_interpolation_control_source_new (); csource2 = gst_interpolation_control_source_new (); gst_controller_set_control_source (ctrl, "volume", GST_CONTROL_SOURCE (csource1)); gst_controller_set_control_source (ctrl, "freq", GST_CONTROL_SOURCE (csource2)); /* Set interpolation mode */ gst_interpolation_control_source_set_interpolation_mode (csource1, GST_INTERPOLATE_LINEAR); gst_interpolation_control_source_set_interpolation_mode (csource2, GST_INTERPOLATE_LINEAR); /* set control values */ g_value_init (&vol, G_TYPE_DOUBLE); g_value_set_double (&vol, 0.0); gst_interpolation_control_source_set (csource1, 0 * GST_SECOND, &vol); g_value_set_double (&vol, 1.0); gst_interpolation_control_source_set (csource1, 5 * GST_SECOND, &vol); g_object_unref (csource1); g_value_set_double (&vol, 220.0); gst_interpolation_control_source_set (csource2, 0 * GST_SECOND, &vol); g_value_set_double (&vol, 3520.0); gst_interpolation_control_source_set (csource2, 3 * GST_SECOND, &vol); g_value_set_double (&vol, 440.0); gst_interpolation_control_source_set (csource2, 6 * GST_SECOND, &vol); g_object_unref (csource2); clock_id = gst_clock_new_single_shot_id (clock, gst_clock_get_time (clock) + (7 * GST_SECOND)); /* run for 7 seconds */ if (gst_element_set_state (bin, GST_STATE_PLAYING)) { if ((wait_ret = gst_clock_id_wait (clock_id, NULL)) != GST_CLOCK_OK) { GST_WARNING ("clock_id_wait returned: %d", wait_ret); } gst_element_set_state (bin, GST_STATE_NULL); } /* cleanup */ g_object_unref (G_OBJECT (ctrl)); gst_clock_id_unref (clock_id); gst_object_unref (G_OBJECT (clock)); gst_object_unref (G_OBJECT (bin)); res = 0; Error: return (res); }
static GstElement * ges_track_video_transition_create_element (GESTrackObject * object) { GstElement *topbin, *iconva, *iconvb, *oconv; GObject *target = NULL; const gchar *propname = NULL; GstElement *mixer = NULL; GstPad *sinka_target, *sinkb_target, *src_target, *sinka, *sinkb, *src; GstController *controller; GstInterpolationControlSource *control_source; GESTrackVideoTransition *self; GESTrackVideoTransitionPrivate *priv; self = GES_TRACK_VIDEO_TRANSITION (object); priv = self->priv; GST_LOG ("creating a video bin"); topbin = gst_bin_new ("transition-bin"); iconva = gst_element_factory_make ("ffmpegcolorspace", "tr-csp-a"); iconvb = gst_element_factory_make ("ffmpegcolorspace", "tr-csp-b"); oconv = gst_element_factory_make ("ffmpegcolorspace", "tr-csp-output"); gst_bin_add_many (GST_BIN (topbin), iconva, iconvb, oconv, NULL); /* Prefer videomixer2 to videomixer */ mixer = gst_element_factory_make ("videomixer2", NULL); if (mixer == NULL) mixer = gst_element_factory_make ("videomixer", NULL); g_object_set (G_OBJECT (mixer), "background", 1, NULL); gst_bin_add (GST_BIN (topbin), mixer); if (priv->type != GES_VIDEO_STANDARD_TRANSITION_TYPE_CROSSFADE) { priv->sinka = (GstPad *) link_element_to_mixer_with_smpte (GST_BIN (topbin), iconva, mixer, priv->type, NULL); priv->sinkb = (GstPad *) link_element_to_mixer_with_smpte (GST_BIN (topbin), iconvb, mixer, priv->type, &priv->smpte); target = (GObject *) priv->smpte; propname = "position"; priv->start_value = 1.0; priv->end_value = 0.0; } else { priv->sinka = (GstPad *) link_element_to_mixer (iconva, mixer); priv->sinkb = (GstPad *) link_element_to_mixer (iconvb, mixer); target = (GObject *) priv->sinkb; propname = "alpha"; priv->start_value = 0.0; priv->end_value = 1.0; } priv->mixer = gst_object_ref (mixer); fast_element_link (mixer, oconv); sinka_target = gst_element_get_static_pad (iconva, "sink"); sinkb_target = gst_element_get_static_pad (iconvb, "sink"); src_target = gst_element_get_static_pad (oconv, "src"); sinka = gst_ghost_pad_new ("sinka", sinka_target); sinkb = gst_ghost_pad_new ("sinkb", sinkb_target); src = gst_ghost_pad_new ("src", src_target); gst_element_add_pad (topbin, src); gst_element_add_pad (topbin, sinka); gst_element_add_pad (topbin, sinkb); gst_object_unref (sinka_target); gst_object_unref (sinkb_target); gst_object_unref (src_target); /* set up interpolation */ g_object_set (target, propname, (gfloat) 0.0, NULL); controller = gst_object_control_properties (target, propname, NULL); control_source = gst_interpolation_control_source_new (); gst_controller_set_control_source (controller, propname, GST_CONTROL_SOURCE (control_source)); gst_interpolation_control_source_set_interpolation_mode (control_source, GST_INTERPOLATE_LINEAR); priv->controller = controller; priv->control_source = control_source; return topbin; }