[Spice-devel] [PATCH v10 00/27] Add GStreamer support for video streaming

Francois Gouget fgouget at codeweavers.com
Fri Mar 25 08:32:45 UTC 2016


On Mon, 21 Mar 2016, Francois Gouget wrote:
[...]
> I think I have reproduced this though it's not systematic. Setting 
> GST_DEBUG=4 I noticed some messages indicating that the process is 
> running out of file descriptors. Indeed a look into /proc showed 4096 
> file descriptors open.

This was a red herring. The bug was in one of my local patches tracing 
the messages on the pipeline's bus. It was not unref-ing the messages, 
causing the whole pipeline to leak. I fixed that and hacked the code to 
recreate the pipeline for every frame and was able to play for a good 
hour with no visible leak. So at least I know the pipeline 'freeing' is 
ok.

Then I sometimes got Xspice to go into an infinite loop. I had seen that 
before but I have now confirmed that it is the expected behavior if the 
client stops responding ('killall -STOP spicy' or 'iptables -I INPUT -j 
DROP' for instance). My understanding is that's because when the client 
stops responding the channel gets full (1) in red_process_display(), 
causing it to stop processing QXL commands (2), so that the QXL ring 
gets full, causing the applications X operations to 'block' by means of 
a spin loop in qxl_ring_push() (3).
Yuck!

So then I found the race condition causing the client to freeze: we 
would schedule a call to display_frame(), but before that happened 
another frame came along with a different size, causing a pipeline 
rebuild. So when display_frame() was actually called the pipeline would 
still exist but would end up being short one decoded frame so that 
gst_app_sink_pull_sample() would block after a while.

So now I grab the sample in the pipeline callback and queue it in a 
GAsyncQueue. I would have liked to avoid this extra complexity but it's 
relatively modest. To make the most of it the GStreamer encoder now 
schedules the frames rendering itself which lets it adapt to mm-time 
changes. GStreamer now passes frames to our queuing immediately, thus 
minimising the number of frames stored in the pipeline that can be lost 
when rebuilding the pipeline.

So now hovering madly over the YouTube seek bar seems to work ok 
(i.e. it's as ugly as expected).


(1) red-worker.c: red_channel_max_pipe_size(RED_CHANNEL(worker->display_channel)) > MAX_PIPE_SIZE
(2) red-worker.c: red_qxl_get_command(worker->qxl, &ext_cmd) is no longer called
(3) qxl_ring.c: while (header->prod - header->cons == header->num_items)

-- 
Francois Gouget <fgouget at codeweavers.com>


More information about the Spice-devel mailing list