[gst-devel] GStreamer in double loop

Jeffrey Barish jeff_barish at earthlink.net
Thu Jun 18 21:53:29 CEST 2009


Jan Schmidt wrote:

> On Thu, 2009-06-18 at 10:21 -0600, Jeffrey Barish wrote:
>> GStreamer requires gobject.  gobject runs in a loop, normally by calling
>> the
>> run method on the main loop.  That loop blocks until there is something
>> to
>> do.  I also need to monitor sockets over which I send commands about what
>> GStreamer is supposed to do.  Normally, it runs in a loop that blocks
>> until
>> a command arrives on a socket.  It is not possible to run both of these
>> loops in the same thread using the normal procedure because they both
>> block.  One possibility is to perform the looping manually.  gobject has
>> a
>> method that makes it possible to perform an iteration of the context.  I
>> could check the sockets and then perform an iteration that blocks.  I
>> would
>> repeat those two steps every time a message arrives from gobject.  But
>> there are long periods when no messages arrive, so I could be missing
>> commands that have arrived on a socket while I am waiting for a GStreamer
>> message.  If I make the iteration nonblocking, then the loop will buzz
>> too
>> quickly and the CPU load will go to 100%.  If I put in a sleep, I can get
>> the CPU load under control, but then I will be missing both GStreamer
>> messages and socket commands while sleeping.  If I block on the socket
>> access, I could be tardy in responding to GStreamer messages.  So this
>> approach doesn't work.
> 
> You can use GLib's GIOChannel API to register the socket file
> descriptor, and get the GObject mainloop to poll it for you efficiently.
> 
> See g_io_channel_unix_new () and g_io_add_watch ()

Normally a good approach.  One detail I omitted was that the sockets can
change, so in this case I don't see how I can use this approach.
-- 
Jeffrey Barish





More information about the gstreamer-devel mailing list