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
*
"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
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")) {
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) {
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 {
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);
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);
}
}
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;