|
Packit |
a6ee4b |
#include <stdlib.h>
|
|
Packit |
a6ee4b |
#include <gst/gst.h>
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
static void
|
|
Packit |
a6ee4b |
event_loop (GstBus * bus, GstElement * pipe)
|
|
Packit |
a6ee4b |
{
|
|
Packit |
a6ee4b |
GstMessage *message = NULL;
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
while (TRUE) {
|
|
Packit |
a6ee4b |
message = gst_bus_poll (bus, GST_MESSAGE_ANY, -1);
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
g_assert (message != NULL);
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
switch (message->type) {
|
|
Packit |
a6ee4b |
case GST_MESSAGE_EOS:
|
|
Packit |
a6ee4b |
g_message ("received EOS");
|
|
Packit |
a6ee4b |
gst_message_unref (message);
|
|
Packit |
a6ee4b |
return;
|
|
Packit |
a6ee4b |
case GST_MESSAGE_WARNING:{
|
|
Packit |
a6ee4b |
GError *gerror;
|
|
Packit |
a6ee4b |
gchar *debug;
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
gst_message_parse_warning (message, &gerror, &debug);
|
|
Packit |
a6ee4b |
gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
|
|
Packit |
a6ee4b |
gst_message_unref (message);
|
|
Packit |
a6ee4b |
g_error_free (gerror);
|
|
Packit |
a6ee4b |
g_free (debug);
|
|
Packit |
a6ee4b |
break;
|
|
Packit |
a6ee4b |
}
|
|
Packit |
a6ee4b |
case GST_MESSAGE_ERROR:{
|
|
Packit |
a6ee4b |
GError *gerror;
|
|
Packit |
a6ee4b |
gchar *debug;
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
gst_message_parse_error (message, &gerror, &debug);
|
|
Packit |
a6ee4b |
gst_object_default_error (GST_MESSAGE_SRC (message), gerror, debug);
|
|
Packit |
a6ee4b |
gst_message_unref (message);
|
|
Packit |
a6ee4b |
g_error_free (gerror);
|
|
Packit |
a6ee4b |
g_free (debug);
|
|
Packit |
a6ee4b |
return;
|
|
Packit |
a6ee4b |
}
|
|
Packit |
a6ee4b |
default:
|
|
Packit |
a6ee4b |
gst_message_unref (message);
|
|
Packit |
a6ee4b |
break;
|
|
Packit |
a6ee4b |
}
|
|
Packit |
a6ee4b |
}
|
|
Packit |
a6ee4b |
}
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
static GstBusSyncReply
|
|
Packit |
a6ee4b |
sync_bus_handler (GstBus * bus, GstMessage * message, GstElement * bin)
|
|
Packit |
a6ee4b |
{
|
|
Packit |
a6ee4b |
switch (GST_MESSAGE_TYPE (message)) {
|
|
Packit |
a6ee4b |
case GST_MESSAGE_STREAM_STATUS:
|
|
Packit |
a6ee4b |
{
|
|
Packit |
a6ee4b |
GstStreamStatusType type;
|
|
Packit |
a6ee4b |
GstElement *owner;
|
|
Packit |
a6ee4b |
const GValue *val;
|
|
Packit |
a6ee4b |
gchar *path;
|
|
Packit |
a6ee4b |
GstTask *task = NULL;
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
g_message ("received STREAM_STATUS");
|
|
Packit |
a6ee4b |
gst_message_parse_stream_status (message, &type, &owner);
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
val = gst_message_get_stream_status_object (message);
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
g_message ("type: %d", type);
|
|
Packit |
a6ee4b |
path = gst_object_get_path_string (GST_MESSAGE_SRC (message));
|
|
Packit |
a6ee4b |
g_message ("source: %s", path);
|
|
Packit |
a6ee4b |
g_free (path);
|
|
Packit |
a6ee4b |
path = gst_object_get_path_string (GST_OBJECT (owner));
|
|
Packit |
a6ee4b |
g_message ("owner: %s", path);
|
|
Packit |
a6ee4b |
g_free (path);
|
|
Packit |
a6ee4b |
g_message ("object: type %s, value %p", G_VALUE_TYPE_NAME (val),
|
|
Packit |
a6ee4b |
g_value_get_object (val));
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
/* see if we know how to deal with this object */
|
|
Packit |
a6ee4b |
if (G_VALUE_TYPE (val) == GST_TYPE_TASK) {
|
|
Packit |
a6ee4b |
task = g_value_get_object (val);
|
|
Packit |
a6ee4b |
}
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
switch (type) {
|
|
Packit |
a6ee4b |
case GST_STREAM_STATUS_TYPE_CREATE:
|
|
Packit |
a6ee4b |
g_message ("created task %p", task);
|
|
Packit |
a6ee4b |
break;
|
|
Packit |
a6ee4b |
case GST_STREAM_STATUS_TYPE_ENTER:
|
|
Packit |
a6ee4b |
/* g_message ("raising task priority"); */
|
|
Packit |
a6ee4b |
/* setpriority (PRIO_PROCESS, 0, -10); */
|
|
Packit |
a6ee4b |
break;
|
|
Packit |
a6ee4b |
case GST_STREAM_STATUS_TYPE_LEAVE:
|
|
Packit |
a6ee4b |
break;
|
|
Packit |
a6ee4b |
default:
|
|
Packit |
a6ee4b |
break;
|
|
Packit |
a6ee4b |
}
|
|
Packit |
a6ee4b |
break;
|
|
Packit |
a6ee4b |
}
|
|
Packit |
a6ee4b |
default:
|
|
Packit |
a6ee4b |
break;
|
|
Packit |
a6ee4b |
}
|
|
Packit |
a6ee4b |
/* pass all messages on the async queue */
|
|
Packit |
a6ee4b |
return GST_BUS_PASS;
|
|
Packit |
a6ee4b |
}
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
int
|
|
Packit |
a6ee4b |
main (int argc, char *argv[])
|
|
Packit |
a6ee4b |
{
|
|
Packit |
a6ee4b |
GstElement *bin, *fakesrc, *fakesink;
|
|
Packit |
a6ee4b |
GstBus *bus;
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
gst_init (&argc, &argv);
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
/* create a new bin to hold the elements */
|
|
Packit |
a6ee4b |
bin = gst_pipeline_new ("pipeline");
|
|
Packit |
a6ee4b |
g_assert (bin);
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
/* create a source */
|
|
Packit |
a6ee4b |
fakesrc = gst_element_factory_make ("fakesrc", "fakesrc");
|
|
Packit |
a6ee4b |
g_assert (fakesrc);
|
|
Packit |
a6ee4b |
g_object_set (fakesrc, "num-buffers", 50, NULL);
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
/* and a sink */
|
|
Packit |
a6ee4b |
fakesink = gst_element_factory_make ("fakesink", "fakesink");
|
|
Packit |
a6ee4b |
g_assert (fakesink);
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
/* add objects to the main pipeline */
|
|
Packit |
a6ee4b |
gst_bin_add_many (GST_BIN (bin), fakesrc, fakesink, NULL);
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
/* link the elements */
|
|
Packit |
a6ee4b |
gst_element_link (fakesrc, fakesink);
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
/* get the bus, we need to install a sync handler */
|
|
Packit |
a6ee4b |
bus = gst_pipeline_get_bus (GST_PIPELINE (bin));
|
|
Packit |
a6ee4b |
gst_bus_set_sync_handler (bus, (GstBusSyncHandler) sync_bus_handler, bin,
|
|
Packit |
a6ee4b |
NULL);
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
/* start playing */
|
|
Packit |
a6ee4b |
gst_element_set_state (bin, GST_STATE_PLAYING);
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
/* Run event loop listening for bus messages until EOS or ERROR */
|
|
Packit |
a6ee4b |
event_loop (bus, bin);
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
/* stop the bin */
|
|
Packit |
a6ee4b |
gst_element_set_state (bin, GST_STATE_NULL);
|
|
Packit |
a6ee4b |
gst_object_unref (bus);
|
|
Packit |
a6ee4b |
|
|
Packit |
a6ee4b |
exit (0);
|
|
Packit |
a6ee4b |
}
|