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) { GstElement *pipeline; GstElement *shapewipe; GstControlSource *cs; GMainLoop *loop; GstBus *bus; gchar *pipeline_string; gfloat border = 0.05; if (argc < 2) { g_print ("Usage: shapewipe mask.png <border>\n"); return -1; } gst_init (&argc, &argv); if (argc > 2) { border = atof (argv[2]); } pipeline_string = g_strdup_printf ("videotestsrc ! video/x-raw,format=(string)AYUV,width=640,height=480 ! shapewipe name=shape border=%f ! videomixer name=mixer ! videoconvert ! autovideosink filesrc location=%s ! typefind ! decodebin2 ! videoconvert ! videoscale ! queue ! shape.mask_sink videotestsrc pattern=snow ! video/x-raw,format=(string)AYUV,width=640,height=480 ! queue ! mixer.", border, argv[1]); pipeline = gst_parse_launch (pipeline_string, NULL); g_free (pipeline_string); if (pipeline == NULL) { g_print ("Failed to create pipeline\n"); return -2; } shapewipe = gst_bin_get_by_name (GST_BIN (pipeline), "shape"); cs = gst_lfo_control_source_new (); gst_object_add_control_binding (GST_OBJECT_CAST (shapewipe), gst_direct_control_binding_new (GST_OBJECT_CAST (shapewipe), "position", cs)); g_object_set (cs, "amplitude", 0.5, "offset", 0.5, "frequency", 0.25, "timeshift", 500 * GST_MSECOND, NULL); g_object_unref (cs); loop = g_main_loop_new (NULL, FALSE); bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline)); gst_bus_add_signal_watch (bus); g_signal_connect (G_OBJECT (bus), "message", G_CALLBACK (on_message), loop); gst_object_unref (GST_OBJECT (bus)); if (gst_element_set_state (pipeline, GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) { g_error ("Failed to go into PLAYING state"); return -4; } g_main_loop_run (loop); gst_element_set_state (pipeline, GST_STATE_NULL); g_main_loop_unref (loop); gst_object_unref (G_OBJECT (pipeline)); return 0; }