Blame tests/examples/streams/stream-status.c

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
}