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 gst_interpolation_control_source_reset (GstInterpolationControlSource * self) { GstControlSource *csource = GST_CONTROL_SOURCE (self); csource->get_value = NULL; csource->get_value_array = NULL; self->priv->type = self->priv->base = G_TYPE_INVALID; if (G_IS_VALUE (&self->priv->default_value)) g_value_unset (&self->priv->default_value); if (G_IS_VALUE (&self->priv->minimum_value)) g_value_unset (&self->priv->minimum_value); if (G_IS_VALUE (&self->priv->maximum_value)) g_value_unset (&self->priv->maximum_value); if (self->priv->values) { g_list_foreach (self->priv->values, (GFunc) gst_control_point_free, NULL); g_list_free (self->priv->values); self->priv->values = NULL; } self->priv->nvalues = 0; self->priv->last_requested_value = NULL; self->priv->valid_cache = FALSE; }
static void gst_lfo_control_source_reset (GstLFOControlSource * self) { GstControlSource *csource = GST_CONTROL_SOURCE (self); csource->get_value = NULL; csource->get_value_array = NULL; self->priv->type = self->priv->base = G_TYPE_INVALID; if (G_IS_VALUE (&self->priv->minimum_value)) g_value_unset (&self->priv->minimum_value); if (G_IS_VALUE (&self->priv->maximum_value)) g_value_unset (&self->priv->maximum_value); if (G_IS_VALUE (&self->priv->amplitude)) g_value_unset (&self->priv->amplitude); if (G_IS_VALUE (&self->priv->offset)) g_value_unset (&self->priv->offset); }
static gboolean gst_interpolation_control_source_set_interpolation_mode (GstInterpolationControlSource * self, GstInterpolationMode mode) { GstControlSource *csource = GST_CONTROL_SOURCE (self); if (mode >= num_interpolation_modes || (int) mode < 0) { GST_WARNING ("interpolation mode %d invalid or not implemented yet", mode); return FALSE; } GST_TIMED_VALUE_CONTROL_SOURCE_LOCK (self); csource->get_value = interpolation_modes[mode].get; csource->get_value_array = interpolation_modes[mode].get_value_array; gst_timed_value_control_invalidate_cache ((GstTimedValueControlSource *) csource); self->priv->interpolation_mode = mode; GST_TIMED_VALUE_CONTROL_SOURCE_UNLOCK (self); return TRUE; }
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; }
static gboolean gst_lfo_control_source_set_waveform (GstLFOControlSource * self, GstLFOWaveform waveform) { GstControlSource *csource = GST_CONTROL_SOURCE (self); gboolean ret = TRUE; if (waveform >= num_waveforms || waveform < 0) { GST_WARNING ("waveform %d invalid or not implemented yet", waveform); return FALSE; } if (self->priv->base == G_TYPE_INVALID) { GST_WARNING ("not bound to a property yet"); return FALSE; } switch (self->priv->base) { case G_TYPE_INT: csource->get_value = waveforms[waveform]->get_int; csource->get_value_array = waveforms[waveform]->get_int_value_array; break; case G_TYPE_UINT:{ csource->get_value = waveforms[waveform]->get_uint; csource->get_value_array = waveforms[waveform]->get_uint_value_array; break; } case G_TYPE_LONG:{ csource->get_value = waveforms[waveform]->get_long; csource->get_value_array = waveforms[waveform]->get_long_value_array; break; } case G_TYPE_ULONG:{ csource->get_value = waveforms[waveform]->get_ulong; csource->get_value_array = waveforms[waveform]->get_ulong_value_array; break; } case G_TYPE_INT64:{ csource->get_value = waveforms[waveform]->get_int64; csource->get_value_array = waveforms[waveform]->get_int64_value_array; break; } case G_TYPE_UINT64:{ csource->get_value = waveforms[waveform]->get_uint64; csource->get_value_array = waveforms[waveform]->get_uint64_value_array; break; } case G_TYPE_FLOAT:{ csource->get_value = waveforms[waveform]->get_float; csource->get_value_array = waveforms[waveform]->get_float_value_array; break; } case G_TYPE_DOUBLE:{ csource->get_value = waveforms[waveform]->get_double; csource->get_value_array = waveforms[waveform]->get_double_value_array; break; } default: ret = FALSE; break; } if (ret) self->priv->waveform = waveform; else GST_WARNING ("incomplete implementation for type '%s'", GST_STR_NULL (g_type_name (self->priv->type))); return ret; }
EXPORT_C #endif gboolean gst_interpolation_control_source_set_interpolation_mode (GstInterpolationControlSource * self, GstInterpolateMode mode) { gboolean ret = TRUE; GstControlSource *csource = GST_CONTROL_SOURCE (self); if (mode >= num_interpolation_methods || interpolation_methods[mode] == NULL) { GST_WARNING ("interpolation mode %d invalid or not implemented yet", mode); return FALSE; } if (mode == GST_INTERPOLATE_QUADRATIC) { GST_WARNING ("Quadratic interpolation mode is deprecated, using cubic" "interpolation mode"); } if (mode == GST_INTERPOLATE_USER) { GST_WARNING ("User interpolation mode is not implemented yet"); return FALSE; } g_mutex_lock (self->lock); switch (self->priv->base) { case G_TYPE_INT: csource->get_value = interpolation_methods[mode]->get_int; csource->get_value_array = interpolation_methods[mode]->get_int_value_array; break; case G_TYPE_UINT:{ csource->get_value = interpolation_methods[mode]->get_uint; csource->get_value_array = interpolation_methods[mode]->get_uint_value_array; break; } case G_TYPE_LONG:{ csource->get_value = interpolation_methods[mode]->get_long; csource->get_value_array = interpolation_methods[mode]->get_long_value_array; break; } case G_TYPE_ULONG:{ csource->get_value = interpolation_methods[mode]->get_ulong; csource->get_value_array = interpolation_methods[mode]->get_ulong_value_array; break; } case G_TYPE_INT64:{ csource->get_value = interpolation_methods[mode]->get_int64; csource->get_value_array = interpolation_methods[mode]->get_int64_value_array; break; } case G_TYPE_UINT64:{ csource->get_value = interpolation_methods[mode]->get_uint64; csource->get_value_array = interpolation_methods[mode]->get_uint64_value_array; break; } case G_TYPE_FLOAT:{ csource->get_value = interpolation_methods[mode]->get_float; csource->get_value_array = interpolation_methods[mode]->get_float_value_array; break; } case G_TYPE_DOUBLE:{ csource->get_value = interpolation_methods[mode]->get_double; csource->get_value_array = interpolation_methods[mode]->get_double_value_array; break; } case G_TYPE_BOOLEAN:{ csource->get_value = interpolation_methods[mode]->get_boolean; csource->get_value_array = interpolation_methods[mode]->get_boolean_value_array; break; } case G_TYPE_ENUM:{ csource->get_value = interpolation_methods[mode]->get_enum; csource->get_value_array = interpolation_methods[mode]->get_enum_value_array; break; } case G_TYPE_STRING:{ csource->get_value = interpolation_methods[mode]->get_string; csource->get_value_array = interpolation_methods[mode]->get_string_value_array; break; } default: ret = FALSE; break; } /* Incomplete implementation */ if (!ret || !csource->get_value || !csource->get_value_array) { gst_interpolation_control_source_reset (self); ret = FALSE; } self->priv->valid_cache = FALSE; self->priv->interpolation_mode = mode; g_mutex_unlock (self->lock); return ret; }
gint main (gint argc, gchar ** argv) { GstElement *pipeline; GstElement *shapewipe; GstController *ctrl; GstLFOControlSource *csource; GValue val = { 0, }; GMainLoop *loop; GstBus *bus; gchar *pipeline_string; if (argc != 2) { g_print ("Usage: shapewipe mask.png\n"); return -1; } gst_init (&argc, &argv); gst_controller_init (&argc, &argv); pipeline_string = g_strdup_printf ("videotestsrc ! video/x-raw-yuv,width=640,height=480 ! shapewipe name=shape border=0.05 ! videomixer name=mixer ! ffmpegcolorspace ! autovideosink filesrc location=%s ! typefind ! decodebin2 ! ffmpegcolorspace ! videoscale ! queue ! shape.mask_sink videotestsrc pattern=snow ! video/x-raw-yuv,width=640,height=480 ! queue ! mixer.", 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"); if (!(ctrl = gst_controller_new (G_OBJECT (shapewipe), "position", NULL))) { g_print ("can't control shapewipe element\n"); return -3; } csource = gst_lfo_control_source_new (); gst_controller_set_control_source (ctrl, "position", GST_CONTROL_SOURCE (csource)); g_value_init (&val, G_TYPE_FLOAT); g_value_set_float (&val, 0.5); g_object_set (G_OBJECT (csource), "amplitude", &val, NULL); g_value_set_float (&val, 0.5); g_object_set (G_OBJECT (csource), "offset", &val, NULL); g_value_unset (&val); g_object_set (G_OBJECT (csource), "frequency", 0.5, NULL); g_object_set (G_OBJECT (csource), "timeshift", 500 * GST_MSECOND, NULL); g_object_unref (csource); 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); g_object_unref (G_OBJECT (ctrl)); gst_object_unref (G_OBJECT (pipeline)); return 0; }