gstreamer C API

R C cjvijf at
Fri May 31 23:02:42 UTC 2019


I have been playing with the "basic tutorial" C API a bit, and can 
create a stream in c code. However, when the strea is running, how can I 
quit/terminate that stream?

For example,  basic tutorial 3:

After creating a pipeline, one can start it. Then there's a loop that 
listens for msgs from the 'bus', in a loop. Whenever there is a msg, the 
loop runs through a switch, and and listens for a new msg again.

I want to create "some sort of event"  that terminates that loop (for 
example existence (or not) of a lock file.).

(or can I create a handler, set an option, that will make 
gst_element_get_bus(..)  return, even if there isn't a msg, with an 
empty msg or so?  (I am fairly sure, gst_element_get_bus, is not 
returning and only will if there is a msg waiting.)

Here's a/the code snippet from the basic tutorial 3 example:

   /* Start playing */
   ret = gst_element_set_state (data.pipeline, GST_STATE_PLAYING);
     g_printerr ("Unable to set the pipeline to the playing state.\n");
     gst_object_unref (data.pipeline);
     return -1;

   /* Listen to the bus */
   bus = gst_element_get_bus (data.pipeline);
   do {
     msg = gst_bus_timed_pop_filtered (bus, GST_CLOCK_TIME_NONE,

     /* Parse message */
     if (msg != NULL) {
       GError *err;
       gchar *debug_info;

       switch (GST_MESSAGE_TYPE (msg)) {
         case GST_MESSAGE_ERROR:
           gst_message_parse_error (msg, &err, &debug_info);
           g_printerr ("Error received from element %s: %s\n", 
GST_OBJECT_NAME (msg->src), err->message);
           g_printerr ("Debugging information: %s\n", debug_info ? 
debug_info : "none");
           g_clear_error (&err);
           g_free (debug_info);
           terminate = TRUE;
         case GST_MESSAGE_EOS:
           g_print ("End-Of-Stream reached.\n");
           terminate = TRUE;
           /* We are only interested in state-changed messages from the 
pipeline */
           if (GST_MESSAGE_SRC (msg) == GST_OBJECT (data.pipeline)) {
             GstState old_state, new_state, pending_state;
             gst_message_parse_state_changed (msg, &old_state, 
&new_state, &pending_state);
             g_print ("Pipeline state changed from %s to %s:\n",
                 gst_element_state_get_name (old_state), 
gst_element_state_get_name (new_state));
           /* We should not reach here */
           g_printerr ("Unexpected message received.\n");
       gst_message_unref (msg);
   } while (!terminate);

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <>

More information about the gstreamer-devel mailing list