mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-20 08:41:07 +00:00
examples: motioncells: port to 1.x
This commit is contained in:
parent
0f4ecf52ad
commit
d531f908e5
1 changed files with 55 additions and 85 deletions
|
@ -1,9 +1,8 @@
|
||||||
/* GStreamer
|
/* GStreamer
|
||||||
* Copyright (C) 2011 Robert Jobbagy <jobbagy.robert@gmail.com>
|
* Copyright (C) 2011 Robert Jobbagy <jobbagy.robert@gmail.com>
|
||||||
|
* Copyright (C) 2014 Tim-Philipp Müller <tim centricular com>
|
||||||
*
|
*
|
||||||
*
|
* motioncells_dynamic_test: test to show effect of property changes at runtime
|
||||||
* gst_motioncells_dynamic_test(): a test tool what can to do dynamic change properties
|
|
||||||
*
|
|
||||||
*
|
*
|
||||||
* This library is free software; you can redistribute it and/or
|
* This library is free software; you can redistribute it and/or
|
||||||
* modify it under the terms of the GNU Library General Public
|
* modify it under the terms of the GNU Library General Public
|
||||||
|
@ -106,129 +105,100 @@ setProperty (GstElement * mcells, char *property, char *prop_value, GType type,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// gst-launch v4l2src ! videoscale ! videorate ! capsfilter "caps=video/x-raw-yuv,width=320,height=240,framerate=10/1" ! videoconvert ! motioncells ! videoconvert ! xvimagesink
|
|
||||||
int
|
int
|
||||||
main (int argc, char *argv[])
|
main (int argc, char *argv[])
|
||||||
{
|
{
|
||||||
GstElement *pipeline, *source, *videor, *videos, *decodebin, *capsf,
|
GstElement *pipeline, *source, *videor, *capsf;
|
||||||
*colorsp0, *colorsp1, *mcells, *sink;
|
GstElement *colorsp0, *colorsp1, *mcells, *sink;
|
||||||
GstCaps *caps;
|
GstCaps *caps;
|
||||||
gchar property[20];
|
|
||||||
gchar prop_value[100];
|
|
||||||
GParamSpec **property_specs;
|
GParamSpec **property_specs;
|
||||||
guint num_properties, i;
|
guint num_properties, i;
|
||||||
GValue value = { 0, };
|
GValue value = { 0, };
|
||||||
gboolean found_property = FALSE;
|
gboolean found_property = FALSE;
|
||||||
int ret;
|
|
||||||
|
|
||||||
// Initialisation //
|
|
||||||
gst_init (&argc, &argv);
|
gst_init (&argc, &argv);
|
||||||
fprintf (stderr, "Usage: %s test or rtsp rtsp://your/cam/address\n", argv[0]);
|
|
||||||
// Create gstreamer elements //
|
pipeline = gst_pipeline_new ("motioncells-pipeline");
|
||||||
pipeline = gst_pipeline_new ("moitoncells-pipeline");
|
if (argc == 2 && strcmp (argv[1], "test") == 0) {
|
||||||
if (argc == 2 && (g_strcmp0 (argv[1], "test") == 0))
|
source = gst_element_factory_make ("videotestsrc", NULL);
|
||||||
source = gst_element_factory_make ("videotestsrc", "vidsrc");
|
gst_util_set_object_arg (G_OBJECT (source), "pattern", "ball");
|
||||||
else if (argc == 3 && (g_strcmp0 (argv[1], "rtsp") == 0))
|
} else if (argc == 1 || strncmp (argv[1], "v4l", 3) == 0) {
|
||||||
source = gst_element_factory_make ("rtspsrc", "rtspsrc0");
|
source = gst_element_factory_make ("v4l2src", NULL);
|
||||||
else if (argc == 1)
|
} else {
|
||||||
source = gst_element_factory_make ("v4l2src", "v4l2");
|
g_printerr ("Usage: %s [v4l2|test]\n", argv[0]);
|
||||||
else {
|
|
||||||
fprintf (stderr, "Usage: %s test or rtsp rtsp://your/cam/address\n",
|
|
||||||
argv[0]);
|
|
||||||
exit (-1);
|
exit (-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
videor = gst_element_factory_make ("videorate", "videor");
|
videor = gst_element_factory_make ("videorate", NULL);
|
||||||
videos = gst_element_factory_make ("videoscale", "videos");
|
capsf = gst_element_factory_make ("capsfilter", NULL);
|
||||||
capsf = gst_element_factory_make ("capsfilter", "capsf");
|
colorsp0 = gst_element_factory_make ("videoconvert", NULL);
|
||||||
if (argc == 3 && (g_strcmp0 (argv[1], "rtsp") == 0))
|
mcells = gst_element_factory_make ("motioncells", NULL);
|
||||||
decodebin = gst_element_factory_make ("decodebin", "decode");
|
colorsp1 = gst_element_factory_make ("videoconvert", NULL);
|
||||||
else
|
sink = gst_element_factory_make ("autovideosink", "videosink");
|
||||||
decodebin = NULL;
|
if (!pipeline || !source || !videor || !capsf || !colorsp0
|
||||||
colorsp0 = gst_element_factory_make ("videoconvert", "colorspace0");
|
|
||||||
mcells = gst_element_factory_make ("motioncells", "mcells");
|
|
||||||
colorsp1 = gst_element_factory_make ("videoconvert", "colorspace1");
|
|
||||||
sink = gst_element_factory_make ("xvimagesink", "xv-image-sink");
|
|
||||||
if (!pipeline || !source || !videor || !videos || !capsf || !colorsp0
|
|
||||||
|| !mcells || !colorsp1 || !sink) {
|
|| !mcells || !colorsp1 || !sink) {
|
||||||
g_printerr ("One element could not be created. Exiting.\n");
|
g_printerr ("One element could not be created. Exiting.\n");
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
if (argc == 3 && (g_strcmp0 (argv[1], "rtsp") == 0) && !decodebin) {
|
|
||||||
g_printerr ("Decodebin could not be created. Exiting.\n");
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if ((g_strcmp0 (argv[1], "rtsp") == 0)) {
|
|
||||||
g_object_set (G_OBJECT (source), "location", argv[2], NULL);
|
|
||||||
g_object_set (G_OBJECT (source), "latency", 1000, NULL);
|
|
||||||
} else if ((g_strcmp0 (argv[1], "test") == 0))
|
|
||||||
g_object_set (G_OBJECT (source), "pattern", 18, NULL);
|
|
||||||
|
|
||||||
caps =
|
caps = gst_caps_from_string ("video/x-raw,framerate=10/1");
|
||||||
gst_caps_from_string
|
|
||||||
("video/x-raw-yuv,width=320,height=240,framerate=10/1");
|
|
||||||
g_object_set (G_OBJECT (capsf), "caps", caps, NULL);
|
g_object_set (G_OBJECT (capsf), "caps", caps, NULL);
|
||||||
//g_object_set (G_OBJECT (sink), "sync",FALSE,NULL);
|
|
||||||
|
|
||||||
if (argc > 1) {
|
gst_bin_add_many (GST_BIN (pipeline), source, videor, capsf, colorsp0, mcells,
|
||||||
if (g_strcmp0 (argv[1], "test") == 0) {
|
|
||||||
gst_bin_add_many (GST_BIN (pipeline),
|
|
||||||
source, videor, videos, capsf, colorsp0, mcells, colorsp1, sink,
|
|
||||||
NULL);
|
|
||||||
|
|
||||||
gst_element_link_many (source, videor, videos, capsf, colorsp0, mcells,
|
|
||||||
colorsp1, sink, NULL);
|
colorsp1, sink, NULL);
|
||||||
} else if (g_strcmp0 (argv[1], "rtsp") == 0) {
|
|
||||||
gst_bin_add_many (GST_BIN (pipeline),
|
gst_element_link_many (source, videor, capsf, colorsp0, mcells, colorsp1,
|
||||||
source, videor, videos, capsf, decodebin, colorsp0, mcells, colorsp1,
|
|
||||||
sink, NULL);
|
sink, NULL);
|
||||||
|
|
||||||
gst_element_link_many (source, videor, videos, capsf, decodebin, colorsp0,
|
g_print ("Going to playing..\n");
|
||||||
mcells, colorsp1, sink, NULL);
|
|
||||||
}
|
|
||||||
} else { //default
|
|
||||||
gst_bin_add_many (GST_BIN (pipeline),
|
|
||||||
source, videor, videos, capsf, colorsp0, mcells, colorsp1, sink, NULL);
|
|
||||||
|
|
||||||
gst_element_link_many (source, videor, videos, capsf, colorsp0, mcells,
|
|
||||||
colorsp1, sink, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
g_print ("Now playing\n");
|
|
||||||
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
gst_element_set_state (pipeline, GST_STATE_PLAYING);
|
||||||
g_print ("Running...\n");
|
|
||||||
g_print ("You can use these properties: \n");
|
g_print ("You can use these properties: \n");
|
||||||
gst_element_print_properties (mcells);
|
gst_element_print_properties (mcells);
|
||||||
g_print ("change property here: example some_property property_value \n");
|
g_print ("See 'gst-inspect-1.0 motioncells' for all the details.\n");
|
||||||
|
g_print ("Change properties like this: propertyname=value\n");
|
||||||
g_print ("Quit with 'q'\n");
|
g_print ("Quit with 'q'\n");
|
||||||
//get all properties
|
|
||||||
|
/* Get all properties */
|
||||||
property_specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (mcells),
|
property_specs = g_object_class_list_properties (G_OBJECT_GET_CLASS (mcells),
|
||||||
&num_properties);
|
&num_properties);
|
||||||
while (TRUE) {
|
while (TRUE) {
|
||||||
|
gchar *prop_name, *prop_value;
|
||||||
|
gchar input_buf[1024];
|
||||||
|
|
||||||
found_property = FALSE;
|
found_property = FALSE;
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
||||||
ret = scanf ("%19s %99s", property, prop_value);
|
memset (input_buf, 0, sizeof (input_buf));
|
||||||
|
if (fgets (input_buf, sizeof (input_buf), stdin) == NULL)
|
||||||
if (ret < 1)
|
|
||||||
g_printerr ("Error parsing command.\n");
|
|
||||||
|
|
||||||
if ((g_strcmp0 (property, "q") == 0) || (g_strcmp0 (prop_value, "q") == 0))
|
|
||||||
break;
|
break;
|
||||||
printf ("property: %s -> value: %s \n", property, prop_value);
|
|
||||||
|
/* strip off trailing newline */
|
||||||
|
g_strdelimit (input_buf, "\n", '\0');
|
||||||
|
|
||||||
|
if (strcmp (input_buf, "q") == 0 || strcmp (input_buf, "quit") == 0)
|
||||||
|
break;
|
||||||
|
|
||||||
|
prop_value = strchr (input_buf, '=');
|
||||||
|
if (prop_value == NULL) {
|
||||||
|
g_printerr ("Please enter either 'property=value' or 'quit'.\n");
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
*prop_value++ = '\0';
|
||||||
|
prop_name = input_buf;
|
||||||
|
|
||||||
|
printf ("property: %s -> value: %s \n", prop_name, prop_value);
|
||||||
for (i = 0; i < num_properties; i++) {
|
for (i = 0; i < num_properties; i++) {
|
||||||
GParamSpec *param = property_specs[i];
|
GParamSpec *param = property_specs[i];
|
||||||
g_value_init (&value, param->value_type);
|
g_value_init (&value, param->value_type);
|
||||||
g_object_get_property (G_OBJECT (mcells), param->name, &value);
|
g_object_get_property (G_OBJECT (mcells), param->name, &value);
|
||||||
//fprintf(stderr,"property: %s and param name: %s and property value: %s \n",property,param->name,prop_value);
|
if ((g_strcmp0 (prop_name, param->name) == 0) && !found_property &&
|
||||||
if ((g_strcmp0 (property, param->name) == 0) && !found_property &&
|
|
||||||
(g_strcmp0 (prop_value, "") != 0)
|
(g_strcmp0 (prop_value, "") != 0)
|
||||||
&& (g_strcmp0 (prop_value, "\"") != 0)
|
&& (g_strcmp0 (prop_value, "\"") != 0)
|
||||||
&& (g_strcmp0 (prop_value, "\'") != 0)) {
|
&& (g_strcmp0 (prop_value, "\'") != 0)) {
|
||||||
GType type;
|
GType type;
|
||||||
found_property = TRUE;
|
found_property = TRUE;
|
||||||
type = param->value_type;
|
type = param->value_type;
|
||||||
setProperty (mcells, property, prop_value, type, &value);
|
setProperty (mcells, prop_name, prop_value, type, &value);
|
||||||
}
|
}
|
||||||
g_value_unset (&value);
|
g_value_unset (&value);
|
||||||
if (found_property)
|
if (found_property)
|
||||||
|
|
Loading…
Reference in a new issue