summaryrefslogtreecommitdiff
path: root/ext/eglgles
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2013-01-03 10:40:34 +0100
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2013-01-03 10:43:43 +0100
commitc6d9191abe2ed8feaae9bb3bc772b59d456cc8a5 (patch)
tree72e2ca5a52a48badda5d240d2b435cfae40ad4cc /ext/eglgles
parent24b5dd72bd4b85181d729c18d1e20a8f5b3cc5f5 (diff)
downloadgstreamer-plugins-bad-c6d9191abe2ed8feaae9bb3bc772b59d456cc8a5.tar.gz
eglglessink: Make sure to wait for the right object to be dequeued
Diffstat (limited to 'ext/eglgles')
-rw-r--r--ext/eglgles/gsteglglessink.c29
-rw-r--r--ext/eglgles/gsteglglessink.h1
2 files changed, 18 insertions, 12 deletions
diff --git a/ext/eglgles/gsteglglessink.c b/ext/eglgles/gsteglglessink.c
index d1fe3c390..6e8920d74 100644
--- a/ext/eglgles/gsteglglessink.c
+++ b/ext/eglgles/gsteglglessink.c
@@ -147,7 +147,7 @@
GST_DEBUG_CATEGORY_STATIC (gst_eglglessink_debug);
#define GST_CAT_DEFAULT gst_eglglessink_debug
-GST_DEBUG_CATEGORY_EXTERN(GST_CAT_PERFORMANCE);
+GST_DEBUG_CATEGORY_EXTERN (GST_CAT_PERFORMANCE);
/* GLESv2 GLSL Shaders
*
@@ -305,8 +305,7 @@ GST_STATIC_PAD_TEMPLATE ("sink",
"RGBA, BGRA, ARGB, ABGR, "
"RGBx, BGRx, xRGB, xBGR, "
"AYUV, Y444, I420, YV12, "
- "NV12, NV21, Y42B, Y41B, "
- "RGB, BGR, RGB16 }")));
+ "NV12, NV21, Y42B, Y41B, " "RGB, BGR, RGB16 }")));
/* Filter signals and args */
enum
@@ -612,19 +611,20 @@ render_thread_func (GstEglGlesSink * eglglessink)
eglBindAPI (EGL_OPENGL_ES_API);
while (gst_data_queue_pop (eglglessink->queue, &item)) {
- GST_DEBUG_OBJECT (eglglessink, "Handling object %" GST_PTR_FORMAT,
- item->object);
+ GstMiniObject *object = item->object;
- if (GST_IS_CAPS (item->object)) {
- GstCaps *caps = GST_CAPS_CAST (item->object);
+ GST_DEBUG_OBJECT (eglglessink, "Handling object %" GST_PTR_FORMAT, object);
+
+ if (GST_IS_CAPS (object)) {
+ GstCaps *caps = GST_CAPS_CAST (object);
if (caps != eglglessink->configured_caps) {
if (!gst_eglglessink_configure_caps (eglglessink, caps)) {
last_flow = GST_FLOW_NOT_NEGOTIATED;
}
}
- } else if (GST_IS_QUERY (item->object)) {
- GstQuery *query = GST_QUERY_CAST (item->object);
+ } else if (GST_IS_QUERY (object)) {
+ GstQuery *query = GST_QUERY_CAST (object);
GstStructure *s = (GstStructure *) gst_query_get_structure (query);
if (gst_structure_has_name (s, "eglglessink-allocate-eglimage")) {
@@ -651,7 +651,7 @@ render_thread_func (GstEglGlesSink * eglglessink)
g_assert_not_reached ();
}
last_flow = GST_FLOW_OK;
- } else if (GST_IS_BUFFER (item->object)) {
+ } else if (GST_IS_BUFFER (object)) {
GstBuffer *buf = GST_BUFFER_CAST (item->object);
if (eglglessink->configured_caps) {
@@ -661,7 +661,7 @@ render_thread_func (GstEglGlesSink * eglglessink)
GST_DEBUG_OBJECT (eglglessink,
"No caps configured yet, not drawing anything");
}
- } else if (!item->object) {
+ } else if (!object) {
if (eglglessink->configured_caps) {
last_flow = gst_eglglessink_render (eglglessink);
} else {
@@ -676,6 +676,7 @@ render_thread_func (GstEglGlesSink * eglglessink)
item->destroy (item);
g_mutex_lock (&eglglessink->render_lock);
eglglessink->last_flow = last_flow;
+ eglglessink->dequeued_object = object;
g_cond_broadcast (&eglglessink->render_cond);
g_mutex_unlock (&eglglessink->render_lock);
@@ -687,6 +688,7 @@ render_thread_func (GstEglGlesSink * eglglessink)
if (last_flow == GST_FLOW_OK) {
g_mutex_lock (&eglglessink->render_lock);
eglglessink->last_flow = GST_FLOW_FLUSHING;
+ eglglessink->dequeued_object = NULL;
g_cond_broadcast (&eglglessink->render_cond);
g_mutex_unlock (&eglglessink->render_lock);
}
@@ -1695,7 +1697,10 @@ gst_eglglessink_queue_object (GstEglGlesSink * eglglessink, GstMiniObject * obj)
}
GST_DEBUG_OBJECT (eglglessink, "Waiting for object to be handled");
- g_cond_wait (&eglglessink->render_cond, &eglglessink->render_lock);
+ do {
+ g_cond_wait (&eglglessink->render_cond, &eglglessink->render_lock);
+ } while (eglglessink->dequeued_object != obj
+ && eglglessink->last_flow != GST_FLOW_FLUSHING);
GST_DEBUG_OBJECT (eglglessink, "Object handled: %s",
gst_flow_get_name (eglglessink->last_flow));
last_flow = eglglessink->last_flow;
diff --git a/ext/eglgles/gsteglglessink.h b/ext/eglgles/gsteglglessink.h
index 901108c2e..984f6c57a 100644
--- a/ext/eglgles/gsteglglessink.h
+++ b/ext/eglgles/gsteglglessink.h
@@ -233,6 +233,7 @@ struct _GstEglGlesSink
GCond render_cond;
GMutex render_lock;
GstFlowReturn last_flow;
+ GstMiniObject *dequeued_object;
/* Properties */
gboolean create_window;