diff options
author | Wim Taymans <wim.taymans@collabora.co.uk> | 2009-04-22 10:16:26 +0200 |
---|---|---|
committer | Wim Taymans <wim@metal.(none)> | 2009-05-12 00:09:30 +0200 |
commit | 5eccc07856f6725a1cd25413cf7720822342c0cb (patch) | |
tree | 1283e50085b9217267b77ca727b1747ce67b6e8d /tests/examples/streams/stream-status.c | |
parent | 2d8a22c1da74eecb144fe5f554124e38f81c1337 (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.c | 134 |
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); +} |