Add a simple example of inclusion

0.7.9.3 is needed, but it's pushed on pip so it shouldn't
be too complicated.

Need the C extension as well, README updated to reflect
that.

This allowed noticing and fixing two errors in the
link_to_multiplexer snippet, as clang complained,
check the differences between the previous version
and the new one :)
This commit is contained in:
Mathieu Duponchelle 2016-06-04 18:19:38 +02:00
parent 2b89969d95
commit e256a61106
6 changed files with 128 additions and 128 deletions

3
README
View file

@ -24,6 +24,9 @@ for *stable* automatic formatting.
* Follow [hotdoc's installation guide](https://people.collabora.com/~meh/hotdoc_hotdoc/html/installing.html), * Follow [hotdoc's installation guide](https://people.collabora.com/~meh/hotdoc_hotdoc/html/installing.html),
preferably in a virtualenv. preferably in a virtualenv.
* We *experimentally* use the hotdoc C extension to include functions by
name, follow the steps outlined [here](https://github.com/hotdoc/hotdoc_c_extension)
* Optionally install the `hotdoc_search_extension`: * Optionally install the `hotdoc_search_extension`:
``` ```

82
examples/bus_example.c Normal file
View file

@ -0,0 +1,82 @@
#include <gst/gst.h>
static GMainLoop *loop;
static gboolean
my_bus_callback (GstBus *bus,
GstMessage *message,
gpointer data)
{
g_print ("Got %s message\n", GST_MESSAGE_TYPE_NAME (message));
switch (GST_MESSAGE_TYPE (message)) {
case GST_MESSAGE_ERROR: {
GError *err;
gchar *debug;
gst_message_parse_error (message, &err, &debug);
g_print ("Error: %s\n", err->message);
g_error_free (err);
g_free (debug);
g_main_loop_quit (loop);
break;
}
case GST_MESSAGE_EOS:
/* end-of-stream */
g_main_loop_quit (loop);
break;
default:
/* unhandled message */
break;
}
/* we want to be notified again the next time there is a message
* on the bus, so returning TRUE (FALSE means we want to stop watching
* for messages on the bus and our callback should not be called again)
*/
return TRUE;
}
gint
main (gint argc,
gchar *argv[])
{
GstElement *pipeline;
GstBus *bus;
guint bus_watch_id;
/* init */
gst_init (&argc, &argv);
/* create pipeline, add handler */
pipeline = gst_pipeline_new ("my_pipeline");
/* adds a watch for new message on our pipeline's message bus to
* the default GLib main context, which is the main context that our
* GLib main loop is attached to below
*/
bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
bus_watch_id = gst_bus_add_watch (bus, my_bus_callback, NULL);
gst_object_unref (bus);
/* [...] */
/* create a mainloop that runs/iterates the default GLib main context
* (context NULL), in other words: makes the context check if anything
* it watches for has happened. When a message has been posted on the
* bus, the default main context will automatically call our
* my_bus_callback() function to notify us of that message.
* The main loop will be run until someone calls g_main_loop_quit()
*/
loop = g_main_loop_new (NULL, FALSE);
g_main_loop_run (loop);
/* clean up */
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
g_source_remove (bus_watch_id);
g_main_loop_unref (loop);
return 0;
}

38
examples/snippets.c Normal file
View file

@ -0,0 +1,38 @@
#include <gst/gst.h>
static void
link_to_multiplexer (GstPad *tolink_pad,
GstElement *mux)
{
GstPad *pad;
gchar *srcname, *sinkname;
srcname = gst_pad_get_name (tolink_pad);
pad = gst_element_get_compatible_pad (mux, tolink_pad, NULL);
gst_pad_link (tolink_pad, pad);
sinkname = gst_pad_get_name (pad);
gst_object_unref (GST_OBJECT (pad));
g_print ("A new pad %s was created and linked to %s\n", sinkname, srcname);
g_free (sinkname);
g_free (srcname);
}
static void
some_function (GstElement *tee)
{
GstPad * pad;
gchar *name;
pad = gst_element_get_request_pad (tee, "src%d");
name = gst_pad_get_name (pad);
g_print ("A new pad %s was created\n", name);
g_free (name);
/* here, you would link the pad */
/* [..] */
/* and, after doing that, free our reference */
gst_object_unref (GST_OBJECT (pad));
}

View file

@ -5,5 +5,6 @@
"output": "built_doc", "output": "built_doc",
"project_name": "gstdotcom", "project_name": "gstdotcom",
"sitemap": "sitemap.txt", "sitemap": "sitemap.txt",
"extra_assets": ["attachments", "images"] "extra_assets": ["attachments", "images"],
"pkg_config_packages": ["gstreamer-1.0"]
} }

View file

@ -39,94 +39,8 @@ There are two different ways to use a bus:
- Check for messages on the bus yourself. This can be done using - Check for messages on the bus yourself. This can be done using
`gst_bus_peek ()` and/or `gst_bus_poll ()`. `gst_bus_peek ()` and/or `gst_bus_poll ()`.
<!-- end list -->
``` {{ examples/bus_example.c }}
#include <gst/gst.h>
static GMainLoop *loop;
static gboolean
my_bus_callback (GstBus *bus,
GstMessage *message,
gpointer data)
{
g_print ("Got %s message\n", GST_MESSAGE_TYPE_NAME (message));
switch (GST_MESSAGE_TYPE (message)) {
case GST_MESSAGE_ERROR: {
GError *err;
gchar *debug;
gst_message_parse_error (message, &err, &debug);
g_print ("Error: %s\n", err->message);
g_error_free (err);
g_free (debug);
g_main_loop_quit (loop);
break;
}
case GST_MESSAGE_EOS:
/* end-of-stream */
g_main_loop_quit (loop);
break;
default:
/* unhandled message */
break;
}
/* we want to be notified again the next time there is a message
* on the bus, so returning TRUE (FALSE means we want to stop watching
* for messages on the bus and our callback should not be called again)
*/
return TRUE;
}
gint
main (gint argc,
gchar *argv[])
{
GstElement *pipeline;
GstBus *bus;
guint bus_watch_id;
/* init */
gst_init (&argc, &argv);
/* create pipeline, add handler */
pipeline = gst_pipeline_new ("my_pipeline");
/* adds a watch for new message on our pipeline's message bus to
* the default GLib main context, which is the main context that our
* GLib main loop is attached to below
*/
bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
bus_watch_id = gst_bus_add_watch (bus, my_bus_callback, NULL);
gst_object_unref (bus);
[..]
/* create a mainloop that runs/iterates the default GLib main context
* (context NULL), in other words: makes the context check if anything
* it watches for has happened. When a message has been posted on the
* bus, the default main context will automatically call our
* my_bus_callback() function to notify us of that message.
* The main loop will be run until someone calls g_main_loop_quit()
*/
loop = g_main_loop_new (NULL, FALSE);
g_main_loop_run (loop);
/* clean up */
gst_element_set_state (pipeline, GST_STATE_NULL);
gst_object_unref (pipeline);
g_source_remove (bus_watch_id);
g_main_loop_unref (loop);
return 0;
}
```
It is important to know that the handler will be called in the thread It is important to know that the handler will be called in the thread
context of the mainloop. This means that the interaction between the context of the mainloop. This means that the interaction between the

View file

@ -123,26 +123,7 @@ the stream, it can simply request a new output pad from the tee element.
The following piece of code shows how you can request a new output pad The following piece of code shows how you can request a new output pad
from a “tee” element: from a “tee” element:
``` {{ examples/snippets.c#some_function }}
static void
some_function (GstElement *tee)
{
GstPad * pad;
gchar *name;
pad = gst_element_get_request_pad (tee, "src%d");
name = gst_pad_get_name (pad);
g_print ("A new pad %s was created\n", name);
g_free (name);
/* here, you would link the pad */
[..]
/* and, after doing that, free our reference */
gst_object_unref (GST_OBJECT (pad));
}
```
The `gst_element_get_request_pad ()` method can be used to get a pad The `gst_element_get_request_pad ()` method can be used to get a pad
from the element based on the name of the pad template. It is also from the element based on the name of the pad template. It is also
@ -153,26 +134,7 @@ element and you need to request a pad that is compatible. The method
pad, as shown in the next example. It will request a compatible pad from pad, as shown in the next example. It will request a compatible pad from
an Ogg multiplexer from any input. an Ogg multiplexer from any input.
``` {{ examples/snippets.c#link_to_multiplexer }}
static void
link_to_multiplexer (GstPad *tolink_pad,
GstElement *mux)
{
GstPad *pad;
gchar *srcname, *sinkname;
srcname = gst_pad_get_name (tolink_pad);
pad = gst_element_get_compatible_pad (mux, tolink_pad);
gst_pad_link (tolinkpad, pad);
sinkname = gst_pad_get_name (pad);
gst_object_unref (GST_OBJECT (pad));
g_print ("A new pad %s was created and linked to %s\n", sinkname, srcname);
g_free (sinkname);
g_free (srcname);
}
```
# Capabilities of a pad # Capabilities of a pad