summaryrefslogtreecommitdiff
path: root/tests/examples/streams/stream-status.c
diff options
context:
space:
mode:
authorWim Taymans <wim.taymans@collabora.co.uk>2009-04-22 10:16:26 +0200
committerWim Taymans <wim@metal.(none)>2009-05-12 00:09:30 +0200
commit5eccc07856f6725a1cd25413cf7720822342c0cb (patch)
tree1283e50085b9217267b77ca727b1747ce67b6e8d /tests/examples/streams/stream-status.c
parent2d8a22c1da74eecb144fe5f554124e38f81c1337 (diff)
tests: add example app for stream-status
Add an example application that adjusts the thread priority of a task using the stream-status messages.
Diffstat (limited to 'tests/examples/streams/stream-status.c')
-rw-r--r--tests/examples/streams/stream-status.c134
1 files changed, 134 insertions, 0 deletions
diff --git a/tests/examples/streams/stream-status.c b/tests/examples/streams/stream-status.c
new file mode 100644
index 0000000000..a9bcc769b4
--- /dev/null
+++ b/tests/examples/streams/stream-status.c
@@ -0,0 +1,134 @@
+#include <stdlib.h>
+#include <gst/gst.h>
+
+static void
+event_loop (GstBus * bus, GstElement * pipe)
+{
+ GstMessage *message = NULL;
+
+ while (TRUE) {
+ message = gst_bus_poll (bus, GST_MESSAGE_ANY, -1);
+
+ g_assert (message != NULL);
+
+ switch (message->type) {
+ case GST_MESSAGE_EOS:
+ g_message ("received EOS");
+ gst_message_unref (message);
+ return;
+ case GST_MESSAGE_WARNING:
+ case GST_MESSAGE_ERROR:{
+ GError *gerror;
+ gchar *debug;
+
+ gst_message_parse_error (message, &gerror, &debug);
+ gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
+ gst_message_unref (message);
+ g_error_free (gerror);
+ g_free (debug);
+ return;
+ }
+ default:
+ gst_message_unref (message);
+ break;
+ }
+ }
+}
+
+static GstBusSyncReply
+sync_bus_handler (GstBus * bus, GstMessage * message, GstElement * bin)
+{
+ switch (GST_MESSAGE_TYPE (message)) {
+ case GST_MESSAGE_STREAM_STATUS:
+ {
+ GstStreamStatusType type;
+ GstElement *owner;
+ const GValue *val;
+ gchar *path;
+
+ g_message ("received STREAM_STATUS");
+ gst_message_parse_stream_status (message, &type, &owner);
+
+ val = gst_message_get_stream_status_object (message);
+
+ g_message ("type: %d", type);
+ path = gst_object_get_path_string (GST_MESSAGE_SRC (message));
+ g_message ("source: %s", path);
+ g_free (path);
+ path = gst_object_get_path_string (GST_OBJECT (owner));
+ g_message ("owner: %s", path);
+ g_free (path);
+ g_message ("object: type %s, value %p", G_VALUE_TYPE_NAME (val),
+ g_value_get_object (val));
+
+ switch (type) {
+ case GST_STREAM_STATUS_TYPE_ENTER:
+ {
+ /* see if we know how to deal with this object */
+ if (G_VALUE_TYPE (val) == GST_TYPE_TASK) {
+ GstTask *task;
+
+ task = g_value_get_object (val);
+
+ g_message ("raising task priority");
+ gst_task_set_priority (task, G_THREAD_PRIORITY_HIGH);
+ }
+ break;
+ }
+ case GST_STREAM_STATUS_TYPE_LEAVE:
+ break;
+ default:
+ break;
+ }
+ break;
+ }
+ default:
+ break;
+ }
+ /* pass all messages on the async queue */
+ return GST_BUS_PASS;
+}
+
+int
+main (int argc, char *argv[])
+{
+ GstElement *bin, *fakesrc, *fakesink;
+ GstBus *bus;
+
+ gst_init (&argc, &argv);
+
+ /* create a new bin to hold the elements */
+ bin = gst_pipeline_new ("pipeline");
+ g_assert (bin);
+
+ /* create a source */
+ fakesrc = gst_element_factory_make ("fakesrc", "fakesrc");
+ g_assert (fakesrc);
+ g_object_set (fakesrc, "num-buffers", 50, NULL);
+
+ /* and a sink */
+ fakesink = gst_element_factory_make ("fakesink", "fakesink");
+ g_assert (fakesink);
+
+ /* add objects to the main pipeline */
+ gst_bin_add_many (GST_BIN (bin), fakesrc, fakesink, NULL);
+
+ /* link the elements */
+ gst_element_link (fakesrc, fakesink);
+
+ /* start playing */
+ gst_element_set_state (bin, GST_STATE_PLAYING);
+
+ /* get the bus, we need to install a sync handler */
+ bus = gst_pipeline_get_bus (GST_PIPELINE (bin));
+ gst_bus_set_sync_handler (bus, (GstBusSyncHandler) sync_bus_handler, bin);
+
+ /* Run event loop listening for bus messages until EOS or ERROR */
+ event_loop (bus, bin);
+
+ /* stop the bin */
+ gst_element_set_state (bin, GST_STATE_NULL);
+ gst_object_unref (bus);
+
+ exit (0);
+}