GNOME Bugzilla – Bug 345708
[ADM] Example code incorrect / does not compile / Typo
Last modified: 2006-06-23 10:30:27 UTC
Documentation Section: III-18 > Data Access http://gstreamer.freedesktop.org/data/doc/gstreamer/head/manual/html/chapter-dataaccess.html the example reads: #include <gst/gst.h> static gboolean cb_have_data (GstPad *pad, GstBuffer *buffer, gpointer u_data) { gint x, y; guint16 *data = (guint16 *) GST_BUFFER_DATA (buffer), t; /* invert data */ for (y = 0; y < 288; y++) { for (x = 0; x < 384 / 2; x++) { t = data[384 - 1 - x]; data[384 - 1 - x] = data[x]; data[x] = t; } data += 384; } return TRUE; } gint main (gint argc, gchar *argv[]) { GMainLoop *loop; GstElement *pipeline, *src, *sink, *filter, *csp; GstCaps *caps; GstPad *pad; /* init GStreamer */ gst_init (&argc, &argv); loop = g_main_loop_new (NULL, FALSE); /* build */ pipeline = gst_pipeline_new ("my-pipeline"); src = gst_element_factory_make ("videotestsrc", "src"); if (src == NULL) g_error ("Could not create 'videotestsrc' element"); filter = gst_element_factory_make ("capsfilter", "filter"); g_assert (filer != NULL); /* should always exist */ csp = gst_element_factory_make ("ffmpegcolorspace", "csp"); if (csp == NULL) g_error ("Could not create 'ffmpegcolorspace' element"); sink = gst_element_factory_make ("xvimagesink", "sink"); if (sink == NULL) { sink = gst_element_factory_make ("ximagesink", "sink"); if (sink == NULL) g_error ("Could not create neither 'xvimagesink' nor 'ximagesink' element"); } gst_bin_add_many (GST_BIN (pipeline), src, filter, csp, sink, NULL); gst_element_link_many (src, filter, csp, sink, NULL); filtercaps = gst_caps_new_simple ("video/x-raw-rgb", "width", G_TYPE_INT, 384, "height", G_TYPE_INT, 288, "framerate", GST_TYPE_FRACTION, 25, 1, "bpp", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, "endianness", G_TYPE_INT, G_BYTE_ORDER, NULL); g_object_set (G_OBJECT (filter), "caps", filtercaps, NULL); gst_caps_unref (filtercaps); pad = gst_element_get_pad (src, "src"); gst_pad_add_buffer_probe (pad, G_CALLBACK (cb_have_data), NULL); gst_object_unref (pad); /* run */ gst_element_set_state (pipeline, GST_STATE_PLAYING); /* wait until it's up and running or failed */ if (gst_element_get_state (pipeline, NULL, NULL, -1) == GST_STATE_CHANGE_FAILURE) { g_error ("Failed to go into PLAYING state"); } g_print ("Running ...\n"); g_main_loop_run (loop); /* exit */ gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); return 0; } Correct version: the example should be: #include <gst/gst.h> static gboolean cb_have_data (GstPad *pad, GstBuffer *buffer, gpointer u_data) { gint x, y; guint16 *data = (guint16 *) GST_BUFFER_DATA (buffer), t; /* invert data */ for (y = 0; y < 288; y++) { for (x = 0; x < 384 / 2; x++) { t = data[384 - 1 - x]; data[384 - 1 - x] = data[x]; data[x] = t; } data += 384; } return TRUE; } gint main (gint argc, gchar *argv[]) { GMainLoop *loop; GstElement *pipeline, *src, *sink, *filter, *csp; GstCaps *filtercaps; GstPad *pad; /* init GStreamer */ gst_init (&argc, &argv); loop = g_main_loop_new (NULL, FALSE); /* build */ pipeline = gst_pipeline_new ("my-pipeline"); src = gst_element_factory_make ("videotestsrc", "src"); if (src == NULL) g_error ("Could not create 'videotestsrc' element"); filter = gst_element_factory_make ("capsfilter", "filter"); g_assert (filter != NULL); /* should always exist */ csp = gst_element_factory_make ("ffmpegcolorspace", "csp"); if (csp == NULL) g_error ("Could not create 'ffmpegcolorspace' element"); sink = gst_element_factory_make ("xvimagesink", "sink"); if (sink == NULL) { sink = gst_element_factory_make ("ximagesink", "sink"); if (sink == NULL) g_error ("Could not create neither 'xvimagesink' nor 'ximagesink' element"); } gst_bin_add_many (GST_BIN (pipeline), src, filter, csp, sink, NULL); gst_element_link_many (src, filter, csp, sink, NULL); filtercaps = gst_caps_new_simple ("video/x-raw-rgb", "width", G_TYPE_INT, 384, "height", G_TYPE_INT, 288, "framerate", GST_TYPE_FRACTION, 25, 1, "bpp", G_TYPE_INT, 16, "depth", G_TYPE_INT, 16, "endianness", G_TYPE_INT, G_BYTE_ORDER, NULL); g_object_set (G_OBJECT (filter), "caps", filtercaps, NULL); gst_caps_unref (filtercaps); pad = gst_element_get_pad (src, "src"); gst_pad_add_buffer_probe (pad, G_CALLBACK (cb_have_data), NULL); gst_object_unref (pad); /* run */ gst_element_set_state (pipeline, GST_STATE_PLAYING); /* wait until it's up and running or failed */ if (gst_element_get_state (pipeline, NULL, NULL, -1) == GST_STATE_CHANGE_FAILURE) { g_error ("Failed to go into PLAYING state"); } g_print ("Running ...\n"); g_main_loop_run (loop); /* exit */ gst_element_set_state (pipeline, GST_STATE_NULL); gst_object_unref (pipeline); return 0; } Other information: The example above doesn't compile ad hoc. Minor typo. The example in the next example compiles but does nothing. Need to verify the error there.
Could you point out where the typo/error is by any chance? Comparing line-by-line is a bit tedious ...
Fixed, thanks for the bug report. 2006-06-23 Tim-Philipp Müller <tim at centricular dot net> * docs/manual/advanced-dataaccess.xml: Fix buffer probe example compilation in ADM (#345708).