summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2012-12-30 14:22:43 +0100
committerJosep Torra <n770galaxy@gmail.com>2013-03-07 14:02:37 +0100
commitce23de57685de1a8d78f8a94130c55448e90e736 (patch)
treea2ffcdac77b8e35651a57e3a3a18c1f983ff18a1
parentfb00d4df506e9889e52f1656be20fd10a0caa23d (diff)
downloadgstreamer-plugins-bad-ce23de57685de1a8d78f8a94130c55448e90e736.tar.gz
eglglessink: Make last_flow handling more threadsafe
Conflicts: ext/eglgles/gsteglglessink.c
-rw-r--r--ext/eglgles/gsteglglessink.c36
1 files changed, 23 insertions, 13 deletions
diff --git a/ext/eglgles/gsteglglessink.c b/ext/eglgles/gsteglglessink.c
index 95cc662ad..380a0273f 100644
--- a/ext/eglgles/gsteglglessink.c
+++ b/ext/eglgles/gsteglglessink.c
@@ -586,6 +586,7 @@ render_thread_func (GstEglGlesSink * eglglessink)
GstMessage *message;
GValue val = { 0 };
GstDataQueueItem *item = NULL;
+ GstFlowReturn last_flow = GST_FLOW_OK;
g_value_init (&val, G_TYPE_POINTER);
g_value_set_pointer (&val, g_thread_self ());
@@ -611,8 +612,8 @@ render_thread_func (GstEglGlesSink * eglglessink)
caps = GST_BUFFER_CAPS (buf);
if (caps != eglglessink->configured_caps) {
if (!gst_eglglessink_configure_caps (eglglessink, caps)) {
- eglglessink->last_flow = GST_FLOW_NOT_NEGOTIATED;
g_mutex_lock (eglglessink->render_lock);
+ eglglessink->last_flow = GST_FLOW_NOT_NEGOTIATED;
g_cond_broadcast (eglglessink->render_cond);
g_mutex_unlock (eglglessink->render_lock);
item->destroy (item);
@@ -622,26 +623,29 @@ render_thread_func (GstEglGlesSink * eglglessink)
}
if (eglglessink->configured_caps) {
- eglglessink->last_flow =
- gst_eglglessink_render_and_display (eglglessink, buf);
+ last_flow = gst_eglglessink_render_and_display (eglglessink, buf);
} else {
GST_DEBUG_OBJECT (eglglessink,
"No caps configured yet, not drawing anything");
}
- if (buf) {
- g_mutex_lock (eglglessink->render_lock);
- g_cond_broadcast (eglglessink->render_cond);
- g_mutex_unlock (eglglessink->render_lock);
- }
item->destroy (item);
- if (eglglessink->last_flow != GST_FLOW_OK)
+ g_mutex_lock (eglglessink->render_lock);
+ eglglessink->last_flow = last_flow;
+ g_cond_broadcast (eglglessink->render_cond);
+ g_mutex_unlock (eglglessink->render_lock);
+
+ if (last_flow != GST_FLOW_OK)
break;
GST_DEBUG_OBJECT (eglglessink, "Successfully handled object");
}
- if (eglglessink->last_flow == GST_FLOW_OK)
+ if (last_flow == GST_FLOW_OK) {
+ g_mutex_lock (eglglessink->render_lock);
eglglessink->last_flow = GST_FLOW_WRONG_STATE;
+ g_cond_broadcast (eglglessink->render_cond);
+ g_mutex_unlock (eglglessink->render_lock);
+ }
GST_DEBUG_OBJECT (eglglessink, "Shutting down thread");
@@ -1651,9 +1655,14 @@ static GstFlowReturn
gst_eglglessink_queue_buffer (GstEglGlesSink * eglglessink, GstBuffer * buf)
{
GstDataQueueItem *item;
+ GstFlowReturn last_flow;
+
+ g_mutex_lock (eglglessink->render_lock);
+ last_flow = eglglessink->last_flow;
+ g_mutex_unlock (eglglessink->render_lock);
- if (eglglessink->last_flow != GST_FLOW_OK)
- return eglglessink->last_flow;
+ if (last_flow != GST_FLOW_OK)
+ return last_flow;
item = g_slice_new0 (GstDataQueueItem);
@@ -1679,10 +1688,11 @@ gst_eglglessink_queue_buffer (GstEglGlesSink * eglglessink, GstBuffer * buf)
g_cond_wait (eglglessink->render_cond, eglglessink->render_lock);
GST_DEBUG_OBJECT (eglglessink, "Buffer rendered: %s",
gst_flow_get_name (eglglessink->last_flow));
+ last_flow = eglglessink->last_flow;
g_mutex_unlock (eglglessink->render_lock);
}
- return (buf ? eglglessink->last_flow : GST_FLOW_OK);
+ return (buf ? last_flow : GST_FLOW_OK);
}
/* Rendering and display */