eglglessink: Make last_flow handling more threadsafe

This commit is contained in:
Sebastian Dröge 2012-12-30 14:22:43 +01:00
parent 4df3e56c9a
commit 9f14fd5cce

View file

@ -624,6 +624,7 @@ render_thread_func (GstEglGlesSink * eglglessink)
GstMessage *message; GstMessage *message;
GValue val = { 0 }; GValue val = { 0 };
GstDataQueueItem *item = NULL; GstDataQueueItem *item = NULL;
GstFlowReturn last_flow = GST_FLOW_OK;
g_value_init (&val, GST_TYPE_G_THREAD); g_value_init (&val, GST_TYPE_G_THREAD);
g_value_set_boxed (&val, g_thread_self ()); g_value_set_boxed (&val, g_thread_self ());
@ -645,12 +646,7 @@ render_thread_func (GstEglGlesSink * eglglessink)
if (caps != eglglessink->configured_caps) { if (caps != eglglessink->configured_caps) {
if (!gst_eglglessink_configure_caps (eglglessink, caps)) { if (!gst_eglglessink_configure_caps (eglglessink, caps)) {
eglglessink->last_flow = GST_FLOW_NOT_NEGOTIATED; last_flow = GST_FLOW_NOT_NEGOTIATED;
g_mutex_lock (&eglglessink->render_lock);
g_cond_broadcast (&eglglessink->render_cond);
g_mutex_unlock (&eglglessink->render_lock);
item->destroy (item);
break;
} }
} }
} else if (GST_IS_QUERY (item->object)) { } else if (GST_IS_QUERY (item->object)) {
@ -680,13 +676,14 @@ render_thread_func (GstEglGlesSink * eglglessink)
} else { } else {
g_assert_not_reached (); g_assert_not_reached ();
} }
last_flow = GST_FLOW_OK;
} else if (GST_IS_BUFFER (item->object) || !item->object) { } else if (GST_IS_BUFFER (item->object) || !item->object) {
GstBuffer *buf = GST_BUFFER_CAST (item->object); GstBuffer *buf = GST_BUFFER_CAST (item->object);
if (eglglessink->configured_caps) { if (eglglessink->configured_caps) {
eglglessink->last_flow = last_flow = gst_eglglessink_render_and_display (eglglessink, buf);
gst_eglglessink_render_and_display (eglglessink, buf);
} else { } else {
last_flow = GST_FLOW_OK;
GST_DEBUG_OBJECT (eglglessink, GST_DEBUG_OBJECT (eglglessink,
"No caps configured yet, not drawing anything"); "No caps configured yet, not drawing anything");
} }
@ -696,18 +693,26 @@ render_thread_func (GstEglGlesSink * eglglessink)
if (item->object) { if (item->object) {
item->destroy (item);
g_mutex_lock (&eglglessink->render_lock); g_mutex_lock (&eglglessink->render_lock);
eglglessink->last_flow = last_flow;
g_cond_broadcast (&eglglessink->render_cond); g_cond_broadcast (&eglglessink->render_cond);
g_mutex_unlock (&eglglessink->render_lock); g_mutex_unlock (&eglglessink->render_lock);
} else {
item->destroy (item);
} }
item->destroy (item);
if (eglglessink->last_flow != GST_FLOW_OK) if (last_flow != GST_FLOW_OK)
break; break;
GST_DEBUG_OBJECT (eglglessink, "Successfully handled object"); 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_FLUSHING; eglglessink->last_flow = GST_FLOW_FLUSHING;
g_cond_broadcast (&eglglessink->render_cond);
g_mutex_unlock (&eglglessink->render_lock);
}
GST_DEBUG_OBJECT (eglglessink, "Shutting down thread"); GST_DEBUG_OBJECT (eglglessink, "Shutting down thread");
@ -1701,9 +1706,14 @@ static GstFlowReturn
gst_eglglessink_queue_object (GstEglGlesSink * eglglessink, GstMiniObject * obj) gst_eglglessink_queue_object (GstEglGlesSink * eglglessink, GstMiniObject * obj)
{ {
GstDataQueueItem *item; GstDataQueueItem *item;
GstFlowReturn last_flow;
if (eglglessink->last_flow != GST_FLOW_OK) g_mutex_lock (&eglglessink->render_lock);
return eglglessink->last_flow; last_flow = eglglessink->last_flow;
g_mutex_unlock (&eglglessink->render_lock);
if (last_flow != GST_FLOW_OK)
return last_flow;
item = g_slice_new0 (GstDataQueueItem); item = g_slice_new0 (GstDataQueueItem);
@ -1734,10 +1744,11 @@ gst_eglglessink_queue_object (GstEglGlesSink * eglglessink, GstMiniObject * obj)
g_cond_wait (&eglglessink->render_cond, &eglglessink->render_lock); g_cond_wait (&eglglessink->render_cond, &eglglessink->render_lock);
GST_DEBUG_OBJECT (eglglessink, "Object handled: %s", GST_DEBUG_OBJECT (eglglessink, "Object handled: %s",
gst_flow_get_name (eglglessink->last_flow)); gst_flow_get_name (eglglessink->last_flow));
last_flow = eglglessink->last_flow;
g_mutex_unlock (&eglglessink->render_lock); g_mutex_unlock (&eglglessink->render_lock);
} }
return (obj ? eglglessink->last_flow : GST_FLOW_OK); return (obj ? last_flow : GST_FLOW_OK);
} }
static gboolean static gboolean
@ -3014,7 +3025,7 @@ gst_eglglessink_allocate_eglimage (GstEglGlesSink * eglglessink,
gst_video_info_set_format (&info, format, width, height); gst_video_info_set_format (&info, format, width, height);
gmem = (GstMemory *)g_slice_new0 (GstEGLImageMemory); gmem = (GstMemory *) g_slice_new0 (GstEGLImageMemory);
mem = GST_EGL_IMAGE_MEMORY (gmem); mem = GST_EGL_IMAGE_MEMORY (gmem);
switch (format) { switch (format) {