[Spice-devel] [client v11 27/27] spice-gtk: Avoid GAsyncQueue for compatibility with GLib < 2.46
Francois Gouget
fgouget at codeweavers.com
Fri Mar 25 12:47:54 UTC 2016
The GAsyncQueue code really needs g_async_queue_push_front() which is
only available with GLib >= 2.46.
Signed-off-by: Francois Gouget <fgouget at codeweavers.com>
---
This helps with Debian 8 for instance.
src/channel-display-gst.c | 41 +++++++++++++++++++++++++++++++++--------
1 file changed, 33 insertions(+), 8 deletions(-)
diff --git a/src/channel-display-gst.c b/src/channel-display-gst.c
index e729a70..8dc7363 100644
--- a/src/channel-display-gst.c
+++ b/src/channel-display-gst.c
@@ -52,7 +52,8 @@ typedef struct SpiceGstDecoder {
/* ---------- Display queue ---------- */
- GAsyncQueue *display_queue;
+ GMutex display_mutex;
+ GQueue *display_queue;
guint timer_id;
} SpiceGstDecoder;
@@ -171,6 +172,28 @@ static void decoder_unref(SpiceGstDecoder *decoder)
/* ---------- GStreamer pipeline ---------- */
+static GstSample *pop_sample(SpiceGstDecoder *decoder)
+{
+ g_mutex_lock(&decoder->display_mutex);
+ GstSample *sample = g_queue_pop_head(decoder->display_queue);
+ g_mutex_unlock(&decoder->display_mutex);
+ return sample;
+}
+
+static void push_sample_head(SpiceGstDecoder *decoder, GstSample *sample)
+{
+ g_mutex_lock(&decoder->display_mutex);
+ g_queue_push_head(decoder->display_queue, sample);
+ g_mutex_unlock(&decoder->display_mutex);
+}
+
+static void push_sample_tail(SpiceGstDecoder *decoder, GstSample *sample)
+{
+ g_mutex_lock(&decoder->display_mutex);
+ g_queue_push_tail(decoder->display_queue, sample);
+ g_mutex_unlock(&decoder->display_mutex);
+}
+
static void schedule_frame(SpiceGstDecoder *decoder);
/* main context */
@@ -180,7 +203,7 @@ static gboolean display_frame(gpointer video_decoder)
decoder->timer_id = 0;
if (decoder->appsink) {
- GstSample *sample = g_async_queue_try_pop(decoder->display_queue);
+ GstSample *sample = pop_sample(decoder);
if (!sample) {
spice_warning("GStreamer error: display_frame() got no frame to display");
return G_SOURCE_REMOVE;
@@ -211,7 +234,7 @@ static void schedule_frame(SpiceGstDecoder *decoder)
{
guint32 time = stream_get_time(decoder->base.stream);
while (!decoder->timer_id) {
- GstSample *sample = g_async_queue_try_pop(decoder->display_queue);
+ GstSample *sample = pop_sample(decoder);
if (!sample) {
break;
}
@@ -228,7 +251,7 @@ static void schedule_frame(SpiceGstDecoder *decoder)
SpiceStreamDataHeader *op = spice_msg_in_parsed(frame_meta->msg);
if (time < op->multi_media_time) {
guint32 d = op->multi_media_time - time;
- g_async_queue_push_front(decoder->display_queue, sample);
+ push_sample_head(decoder, sample);
decoder->timer_id = g_timeout_add(d, display_frame, decoder);
} else {
@@ -260,7 +283,7 @@ GstFlowReturn new_sample(GstAppSink *gstappsink, gpointer video_decoder)
* schedule_frame() or display_frame() runs.
*/
decoder_ref(decoder);
- g_async_queue_push(decoder->display_queue, sample);
+ push_sample_tail(decoder, sample);
schedule_frame(decoder);
} else {
spice_warning("GStreamer error: could not pull sample");
@@ -393,11 +416,12 @@ static void spice_gst_decoder_destroy(VideoDecoder *video_decoder)
decoder->timer_id = 0;
}
GstSample *sample;
- while ((sample = g_async_queue_try_pop(decoder->display_queue))) {
+ while ((sample = pop_sample(decoder))) {
gst_sample_unref(sample);
decoder_unref(decoder);
}
- g_async_queue_unref(decoder->display_queue);
+ g_mutex_clear(&decoder->display_mutex);
+ g_queue_free(decoder->display_queue);
decoder->display_queue = NULL;
decoder_unref(decoder);
@@ -505,7 +529,8 @@ VideoDecoder* create_gstreamer_decoder(int codec_type, display_stream *stream)
decoder->base.codec_type = codec_type;
decoder->base.stream = stream;
decoder->refs = 1;
- decoder->display_queue = g_async_queue_new();
+ g_mutex_init(&decoder->display_mutex);
+ decoder->display_queue = g_queue_new();
}
return (VideoDecoder*)decoder;
--
2.7.0
More information about the Spice-devel
mailing list