mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2025-04-26 06:54:49 +00:00
eglglessink: Make last_flow handling more threadsafe
This commit is contained in:
parent
4df3e56c9a
commit
9f14fd5cce
1 changed files with 26 additions and 15 deletions
|
@ -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) {
|
||||||
|
|
Loading…
Reference in a new issue