summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorSebastian Dröge <sebastian.droege@collabora.co.uk>2012-10-16 14:15:58 +0200
committerSebastian Dröge <sebastian.droege@collabora.co.uk>2012-10-18 14:35:19 +0200
commitba3274c8f02c644b477b14963f711528912a1474 (patch)
tree8855e39cf82440c6566a8de16d7df1089b4518f3 /ext
parent2b3279c9b5597c286252940f6e6487274e56f6f4 (diff)
eglglessink: Remove unneeded flow_lock
Use the object lock in the few places necessary, everything else is protected by other things already. Also store the context directly inside the instance struct instead of allocating some memory for it.
Diffstat (limited to 'ext')
-rw-r--r--ext/eglgles/gsteglglessink.c593
1 files changed, 262 insertions, 331 deletions
diff --git a/ext/eglgles/gsteglglessink.c b/ext/eglgles/gsteglglessink.c
index f7ac91095..4d63c9c2d 100644
--- a/ext/eglgles/gsteglglessink.c
+++ b/ext/eglgles/gsteglglessink.c
@@ -151,8 +151,8 @@
* w = h. We use these two to bound returned values to
* sanity.
*/
-#define EGL_SANE_PAR_MIN ((EGL_DISPLAY_SCALING)/10)
-#define EGL_SANE_PAR_MAX ((EGL_DISPLAY_SCALING)*10)
+#define EGL_SANE_DAR_MIN ((EGL_DISPLAY_SCALING)/10)
+#define EGL_SANE_DAR_MAX ((EGL_DISPLAY_SCALING)*10)
GST_DEBUG_CATEGORY_STATIC (gst_eglglessink_debug);
#define GST_CAT_DEFAULT gst_eglglessink_debug
@@ -383,6 +383,8 @@ static GstStateChangeReturn gst_eglglessink_change_state (GstElement * element,
static GstFlowReturn gst_eglglessink_show_frame (GstVideoSink * vsink,
GstBuffer * buf);
static gboolean gst_eglglessink_setcaps (GstBaseSink * bsink, GstCaps * caps);
+static gboolean gst_eglglessink_start (GstBaseSink * sink);
+static gboolean gst_eglglessink_stop (GstBaseSink * sink);
static GstFlowReturn gst_eglglessink_buffer_alloc (GstBaseSink * sink,
guint64 offset, guint size, GstCaps * caps, GstBuffer ** buf);
static GstCaps *gst_eglglessink_getcaps (GstBaseSink * bsink);
@@ -537,8 +539,8 @@ gst_eglglesbuffer_new (GstEglGlesSink * eglglessink, GstCaps * caps)
eglglesbuffer->eglglessink = gst_object_ref (eglglessink);
eglglesbuffer->image = gst_eglglesbuffer_create_native
- (eglglessink->eglglesctx->used_window, eglglessink->eglglesctx->config,
- eglglessink->eglglesctx->display, NULL);
+ (eglglessink->eglglesctx.used_window, eglglessink->eglglesctx.config,
+ eglglessink->eglglesctx.display, NULL);
if (!eglglesbuffer->image) {
GST_ERROR_OBJECT (eglglessink,
"Failed to create native %dx%d image buffer", eglglesbuffer->width,
@@ -942,11 +944,9 @@ gst_eglglessink_fill_supported_fbuffer_configs (GstEglGlesSink * eglglessink)
"Building initial list of wanted eglattribs per format");
/* Init supported format/caps list */
- g_mutex_lock (eglglessink->flow_lock);
-
caps = gst_caps_new_empty ();
- if (eglChooseConfig (eglglessink->eglglesctx->display,
+ if (eglChooseConfig (eglglessink->eglglesctx.display,
eglglessink_RGBA8888_attribs, NULL, 1, &cfg_number) != EGL_FALSE) {
format = g_new0 (GstEglGlesImageFmt, 1);
format->fmt = GST_EGLGLESSINK_IMAGE_RGBA8888;
@@ -997,7 +997,7 @@ gst_eglglessink_fill_supported_fbuffer_configs (GstEglGlesSink * eglglessink)
"EGL display doesn't support RGBA8888 config");
}
- if (eglChooseConfig (eglglessink->eglglesctx->display,
+ if (eglChooseConfig (eglglessink->eglglesctx.display,
eglglessink_RGB888_attribs, NULL, 1, &cfg_number) != EGL_FALSE) {
format = g_new0 (GstEglGlesImageFmt, 1);
format->fmt = GST_EGLGLESSINK_IMAGE_RGB888;
@@ -1013,7 +1013,7 @@ gst_eglglessink_fill_supported_fbuffer_configs (GstEglGlesSink * eglglessink)
GST_INFO_OBJECT (eglglessink, "EGL display doesn't support RGB888 config");
}
- if (eglChooseConfig (eglglessink->eglglesctx->display,
+ if (eglChooseConfig (eglglessink->eglglesctx.display,
eglglessink_RGB565_attribs, NULL, 1, &cfg_number) != EGL_FALSE) {
format = g_new0 (GstEglGlesImageFmt, 1);
format->fmt = GST_EGLGLESSINK_IMAGE_RGB565;
@@ -1027,11 +1027,11 @@ gst_eglglessink_fill_supported_fbuffer_configs (GstEglGlesSink * eglglessink)
GST_INFO_OBJECT (eglglessink, "EGL display doesn't support RGB565 config");
}
+ GST_OBJECT_LOCK (eglglessink);
gst_caps_replace (&eglglessink->sinkcaps, caps);
+ GST_OBJECT_UNLOCK (eglglessink);
gst_caps_unref (caps);
- g_mutex_unlock (eglglessink->flow_lock);
-
return ret;
}
@@ -1055,9 +1055,7 @@ egl_init (GstEglGlesSink * eglglessink)
goto HANDLE_ERROR;
}
- g_mutex_lock (eglglessink->flow_lock);
eglglessink->egl_started = TRUE;
- g_mutex_unlock (eglglessink->flow_lock);
return TRUE;
@@ -1066,9 +1064,11 @@ HANDLE_ERROR:
return FALSE;
}
-static gboolean
-gst_eglglessink_start (GstEglGlesSink * eglglessink)
+gboolean
+gst_eglglessink_start (GstBaseSink * sink)
{
+ GstEglGlesSink *eglglessink = GST_EGLGLESSINK (sink);
+
if (!eglglessink->egl_started) {
GST_ERROR_OBJECT (eglglessink, "EGL uninitialized. Bailing out");
goto HANDLE_ERROR;
@@ -1091,9 +1091,11 @@ HANDLE_ERROR:
return FALSE;
}
-static gboolean
-gst_eglglessink_stop (GstEglGlesSink * eglglessink)
+gboolean
+gst_eglglessink_stop (GstBaseSink * sink)
{
+ GstEglGlesSink *eglglessink = GST_EGLGLESSINK (sink);
+
/* EGL/GLES2 cleanup */
if (!gst_eglglessink_context_make_current (eglglessink, TRUE, FALSE))
return FALSE;
@@ -1102,54 +1104,54 @@ gst_eglglessink_stop (GstEglGlesSink * eglglessink)
glUseProgram (0);
if (eglglessink->have_vbo) {
- glDeleteBuffers (1, &eglglessink->eglglesctx->position_buffer);
- glDeleteBuffers (1, &eglglessink->eglglesctx->texpos_buffer);
- glDeleteBuffers (1, &eglglessink->eglglesctx->index_buffer);
+ glDeleteBuffers (1, &eglglessink->eglglesctx.position_buffer);
+ glDeleteBuffers (1, &eglglessink->eglglesctx.texpos_buffer);
+ glDeleteBuffers (1, &eglglessink->eglglesctx.index_buffer);
eglglessink->have_vbo = FALSE;
}
if (eglglessink->have_texture) {
- glDeleteTextures (eglglessink->eglglesctx->n_textures,
- eglglessink->eglglesctx->texture);
+ glDeleteTextures (eglglessink->eglglesctx.n_textures,
+ eglglessink->eglglesctx.texture);
eglglessink->have_texture = FALSE;
- eglglessink->eglglesctx->n_textures = 0;
+ eglglessink->eglglesctx.n_textures = 0;
}
- if (eglglessink->eglglesctx->glslprogram) {
- glDetachShader (eglglessink->eglglesctx->glslprogram,
- eglglessink->eglglesctx->fragshader);
- glDetachShader (eglglessink->eglglesctx->glslprogram,
- eglglessink->eglglesctx->vertshader);
- glDeleteProgram (eglglessink->eglglesctx->glslprogram);
- glDeleteShader (eglglessink->eglglesctx->fragshader);
- glDeleteShader (eglglessink->eglglesctx->vertshader);
- eglglessink->eglglesctx->glslprogram = 0;
+ if (eglglessink->eglglesctx.glslprogram) {
+ glDetachShader (eglglessink->eglglesctx.glslprogram,
+ eglglessink->eglglesctx.fragshader);
+ glDetachShader (eglglessink->eglglesctx.glslprogram,
+ eglglessink->eglglesctx.vertshader);
+ glDeleteProgram (eglglessink->eglglesctx.glslprogram);
+ glDeleteShader (eglglessink->eglglesctx.fragshader);
+ glDeleteShader (eglglessink->eglglesctx.vertshader);
+ eglglessink->eglglesctx.glslprogram = 0;
}
}
if (!gst_eglglessink_context_make_current (eglglessink, FALSE, FALSE))
return FALSE;
- if (eglglessink->eglglesctx->surface) {
- eglDestroySurface (eglglessink->eglglesctx->display,
- eglglessink->eglglesctx->surface);
- eglglessink->eglglesctx->surface = NULL;
+ if (eglglessink->eglglesctx.surface) {
+ eglDestroySurface (eglglessink->eglglesctx.display,
+ eglglessink->eglglesctx.surface);
+ eglglessink->eglglesctx.surface = NULL;
eglglessink->have_surface = FALSE;
}
- if (eglglessink->eglglesctx->eglcontext) {
- eglDestroyContext (eglglessink->eglglesctx->display,
- eglglessink->eglglesctx->eglcontext);
- eglglessink->eglglesctx->eglcontext = NULL;
+ if (eglglessink->eglglesctx.eglcontext) {
+ eglDestroyContext (eglglessink->eglglesctx.display,
+ eglglessink->eglglesctx.eglcontext);
+ eglglessink->eglglesctx.eglcontext = NULL;
}
if (eglglessink->using_own_window) {
- platform_destroy_native_window (eglglessink->eglglesctx->display,
- eglglessink->eglglesctx->used_window);
- eglglessink->eglglesctx->used_window = NULL;
+ platform_destroy_native_window (eglglessink->eglglesctx.display,
+ eglglessink->eglglesctx.used_window);
+ eglglessink->eglglesctx.used_window = NULL;
eglglessink->have_window = FALSE;
}
- eglglessink->eglglesctx->used_window = NULL;
+ eglglessink->eglglesctx.used_window = NULL;
if (eglglessink->current_caps) {
gst_caps_unref (eglglessink->current_caps);
eglglessink->current_caps = NULL;
@@ -1247,7 +1249,7 @@ gst_eglglessink_init_egl_exts (GstEglGlesSink * eglglessink)
const char *eglexts;
unsigned const char *glexts;
- eglexts = eglQueryString (eglglessink->eglglesctx->display, EGL_EXTENSIONS);
+ eglexts = eglQueryString (eglglessink->eglglesctx.display, EGL_EXTENSIONS);
glexts = glGetString (GL_EXTENSIONS);
GST_DEBUG_OBJECT (eglglessink, "Available EGL extensions: %s\n", GST_STR_NULL (eglexts));
@@ -1328,106 +1330,103 @@ SLOW_PATH_SELECTED:
static gboolean
gst_eglglessink_setup_vbo (GstEglGlesSink * eglglessink, gboolean reset)
{
-
- g_mutex_lock (eglglessink->flow_lock);
-
GST_INFO_OBJECT (eglglessink, "VBO setup. have_vbo:%d, should reset %d",
eglglessink->have_vbo, reset);
if (eglglessink->have_vbo && reset) {
- glDeleteBuffers (1, &eglglessink->eglglesctx->position_buffer);
- glDeleteBuffers (1, &eglglessink->eglglesctx->texpos_buffer);
- glDeleteBuffers (1, &eglglessink->eglglesctx->index_buffer);
+ glDeleteBuffers (1, &eglglessink->eglglesctx.position_buffer);
+ glDeleteBuffers (1, &eglglessink->eglglesctx.texpos_buffer);
+ glDeleteBuffers (1, &eglglessink->eglglesctx.index_buffer);
eglglessink->have_vbo = FALSE;
}
if (!eglglessink->have_vbo) {
GST_DEBUG_OBJECT (eglglessink, "Performing VBO setup");
- eglglessink->eglglesctx->position_array[0].x = 1;
- eglglessink->eglglesctx->position_array[0].y = 1;
- eglglessink->eglglesctx->position_array[0].z = 0;
+ eglglessink->eglglesctx.position_array[0].x = 1;
+ eglglessink->eglglesctx.position_array[0].y = 1;
+ eglglessink->eglglesctx.position_array[0].z = 0;
- eglglessink->eglglesctx->position_array[1].x = 1;
- eglglessink->eglglesctx->position_array[1].y = -1;
- eglglessink->eglglesctx->position_array[1].z = 0;
+ eglglessink->eglglesctx.position_array[1].x = 1;
+ eglglessink->eglglesctx.position_array[1].y = -1;
+ eglglessink->eglglesctx.position_array[1].z = 0;
- eglglessink->eglglesctx->position_array[2].x = -1;
- eglglessink->eglglesctx->position_array[2].y = 1;
- eglglessink->eglglesctx->position_array[2].z = 0;
+ eglglessink->eglglesctx.position_array[2].x = -1;
+ eglglessink->eglglesctx.position_array[2].y = 1;
+ eglglessink->eglglesctx.position_array[2].z = 0;
- eglglessink->eglglesctx->position_array[3].x = -1;
- eglglessink->eglglesctx->position_array[3].y = -1;
- eglglessink->eglglesctx->position_array[3].z = 0;
+ eglglessink->eglglesctx.position_array[3].x = -1;
+ eglglessink->eglglesctx.position_array[3].y = -1;
+ eglglessink->eglglesctx.position_array[3].z = 0;
- eglglessink->eglglesctx->texpos_array[0].x = 1;
- eglglessink->eglglesctx->texpos_array[0].y = 0;
+ eglglessink->eglglesctx.texpos_array[0].x = 1;
+ eglglessink->eglglesctx.texpos_array[0].y = 0;
- eglglessink->eglglesctx->texpos_array[1].x = 1;
- eglglessink->eglglesctx->texpos_array[1].y = 1;
+ eglglessink->eglglesctx.texpos_array[1].x = 1;
+ eglglessink->eglglesctx.texpos_array[1].y = 1;
- eglglessink->eglglesctx->texpos_array[2].x = 0;
- eglglessink->eglglesctx->texpos_array[2].y = 0;
+ eglglessink->eglglesctx.texpos_array[2].x = 0;
+ eglglessink->eglglesctx.texpos_array[2].y = 0;
- eglglessink->eglglesctx->texpos_array[3].x = 0;
- eglglessink->eglglesctx->texpos_array[3].y = 1;
+ eglglessink->eglglesctx.texpos_array[3].x = 0;
+ eglglessink->eglglesctx.texpos_array[3].y = 1;
- eglglessink->eglglesctx->index_array[0] = 0;
- eglglessink->eglglesctx->index_array[1] = 1;
- eglglessink->eglglesctx->index_array[2] = 2;
- eglglessink->eglglesctx->index_array[3] = 3;
+ eglglessink->eglglesctx.index_array[0] = 0;
+ eglglessink->eglglesctx.index_array[1] = 1;
+ eglglessink->eglglesctx.index_array[2] = 2;
+ eglglessink->eglglesctx.index_array[3] = 3;
- glGenBuffers (1, &eglglessink->eglglesctx->position_buffer);
- glGenBuffers (1, &eglglessink->eglglesctx->texpos_buffer);
- glGenBuffers (1, &eglglessink->eglglesctx->index_buffer);
+ glGenBuffers (1, &eglglessink->eglglesctx.position_buffer);
+ glGenBuffers (1, &eglglessink->eglglesctx.texpos_buffer);
+ glGenBuffers (1, &eglglessink->eglglesctx.index_buffer);
if (got_gl_error ("glGenBuffers"))
goto HANDLE_ERROR_LOCKED;
- glBindBuffer (GL_ARRAY_BUFFER, eglglessink->eglglesctx->position_buffer);
+ glBindBuffer (GL_ARRAY_BUFFER, eglglessink->eglglesctx.position_buffer);
if (got_gl_error ("glBindBuffer position_buffer"))
goto HANDLE_ERROR_LOCKED;
glBufferData (GL_ARRAY_BUFFER,
- sizeof (eglglessink->eglglesctx->position_array),
- eglglessink->eglglesctx->position_array, GL_STATIC_DRAW);
+ sizeof (eglglessink->eglglesctx.position_array),
+ eglglessink->eglglesctx.position_array, GL_STATIC_DRAW);
if (got_gl_error ("glBufferData position_buffer"))
goto HANDLE_ERROR_LOCKED;
- glVertexAttribPointer (eglglessink->eglglesctx->position_loc, 3, GL_FLOAT,
+ glVertexAttribPointer (eglglessink->eglglesctx.position_loc, 3, GL_FLOAT,
GL_FALSE, 0, 0);
if (got_gl_error ("glVertexAttribPointer"))
goto HANDLE_ERROR_LOCKED;
- glEnableVertexAttribArray (eglglessink->eglglesctx->position_loc);
+ glEnableVertexAttribArray (eglglessink->eglglesctx.position_loc);
if (got_gl_error ("glEnableVertexAttribArray"))
goto HANDLE_ERROR_LOCKED;
- glBindBuffer (GL_ARRAY_BUFFER, eglglessink->eglglesctx->texpos_buffer);
+ glBindBuffer (GL_ARRAY_BUFFER, eglglessink->eglglesctx.texpos_buffer);
if (got_gl_error ("glBindBuffer texpos_buffer"))
goto HANDLE_ERROR_LOCKED;
glBufferData (GL_ARRAY_BUFFER,
- sizeof (eglglessink->eglglesctx->texpos_array),
- eglglessink->eglglesctx->texpos_array, GL_STATIC_DRAW);
+ sizeof (eglglessink->eglglesctx.texpos_array),
+ eglglessink->eglglesctx.texpos_array, GL_STATIC_DRAW);
if (got_gl_error ("glBufferData texpos_buffer"))
goto HANDLE_ERROR_LOCKED;
- glVertexAttribPointer (eglglessink->eglglesctx->texpos_loc, 2, GL_FLOAT,
+ glVertexAttribPointer (eglglessink->eglglesctx.texpos_loc, 2, GL_FLOAT,
GL_FALSE, 0, 0);
if (got_gl_error ("glVertexAttribPointer"))
goto HANDLE_ERROR_LOCKED;
- glEnableVertexAttribArray (eglglessink->eglglesctx->texpos_loc);
+ glEnableVertexAttribArray (eglglessink->eglglesctx.texpos_loc);
if (got_gl_error ("glEnableVertexAttribArray"))
goto HANDLE_ERROR_LOCKED;
glBindBuffer (GL_ELEMENT_ARRAY_BUFFER,
- eglglessink->eglglesctx->index_buffer);
+ eglglessink->eglglesctx.index_buffer);
if (got_gl_error ("glBindBuffer index_buffer"))
goto HANDLE_ERROR_LOCKED;
glBufferData (GL_ELEMENT_ARRAY_BUFFER,
- sizeof (eglglessink->eglglesctx->index_array),
- eglglessink->eglglesctx->index_array, GL_STATIC_DRAW);
+ sizeof (eglglessink->eglglesctx.index_array),
+ eglglessink->eglglesctx.index_array, GL_STATIC_DRAW);
if (got_gl_error ("glBufferData index_buffer"))
goto HANDLE_ERROR_LOCKED;
@@ -1436,11 +1435,9 @@ gst_eglglessink_setup_vbo (GstEglGlesSink * eglglessink, gboolean reset)
GST_INFO_OBJECT (eglglessink, "Won't perform VBO setup");
}
- g_mutex_unlock (eglglessink->flow_lock);
return TRUE;
HANDLE_ERROR_LOCKED:
- g_mutex_unlock (eglglessink->flow_lock);
GST_ERROR_OBJECT (eglglessink, "Unable to perform VBO setup");
return FALSE;
}
@@ -1453,14 +1450,14 @@ gst_eglglessink_update_surface_dimensions (GstEglGlesSink * eglglessink)
EGLint display_par;
/* Save surface dims */
- eglQuerySurface (eglglessink->eglglesctx->display,
- eglglessink->eglglesctx->surface, EGL_WIDTH, &width);
- eglQuerySurface (eglglessink->eglglesctx->display,
- eglglessink->eglglesctx->surface, EGL_HEIGHT, &height);
+ eglQuerySurface (eglglessink->eglglesctx.display,
+ eglglessink->eglglesctx.surface, EGL_WIDTH, &width);
+ eglQuerySurface (eglglessink->eglglesctx.display,
+ eglglessink->eglglesctx.surface, EGL_HEIGHT, &height);
/* Save display's pixel aspect ratio
*
- * PAR is reported as w/h * EGL_DISPLAY_SCALING wich is
+ * DAR is reported as w/h * EGL_DISPLAY_SCALING wich is
* a constant with value 10000. This attribute is only
* supported if the EGL version is >= 1.2
* XXX: Setup this as a property.
@@ -1468,35 +1465,35 @@ gst_eglglessink_update_surface_dimensions (GstEglGlesSink * eglglessink)
* or some other one time check. Right now it's being called once
* per frame.
*/
- if (eglglessink->eglglesctx->egl_major == 1 &&
- eglglessink->eglglesctx->egl_minor < 2) {
+ if (eglglessink->eglglesctx.egl_major == 1 &&
+ eglglessink->eglglesctx.egl_minor < 2) {
GST_DEBUG_OBJECT (eglglessink, "Can't query PAR. Using default: %dx%d",
EGL_DISPLAY_SCALING, EGL_DISPLAY_SCALING);
- eglglessink->eglglesctx->pixel_aspect_ratio = EGL_DISPLAY_SCALING;
+ eglglessink->eglglesctx.pixel_aspect_ratio = EGL_DISPLAY_SCALING;
} else {
- eglQuerySurface (eglglessink->eglglesctx->display,
- eglglessink->eglglesctx->surface, EGL_PIXEL_ASPECT_RATIO,
+ eglQuerySurface (eglglessink->eglglesctx.display,
+ eglglessink->eglglesctx.surface, EGL_PIXEL_ASPECT_RATIO,
&display_par);
- /* Fix for outbound PAR reporting on some implementations not
+ /* Fix for outbound DAR reporting on some implementations not
* honoring the 'should return w/h * EGL_DISPLAY_SCALING' spec
* requirement
*/
- if (display_par == EGL_UNKNOWN || display_par < EGL_SANE_PAR_MIN ||
- display_par > EGL_SANE_PAR_MAX) {
+ if (display_par == EGL_UNKNOWN || display_par < EGL_SANE_DAR_MIN ||
+ display_par > EGL_SANE_DAR_MAX) {
GST_DEBUG_OBJECT (eglglessink, "Nonsensical PAR value returned: %d. "
"Bad EGL implementation? "
- "Will use default: %d/%d", display_par,
+ "Will use default: %d/%d", eglglessink->eglglesctx.pixel_aspect_ratio,
EGL_DISPLAY_SCALING, EGL_DISPLAY_SCALING);
- eglglessink->eglglesctx->pixel_aspect_ratio = EGL_DISPLAY_SCALING;
+ eglglessink->eglglesctx.pixel_aspect_ratio = EGL_DISPLAY_SCALING;
} else {
- eglglessink->eglglesctx->pixel_aspect_ratio = display_par;
+ eglglessink->eglglesctx.pixel_aspect_ratio = display_par;
}
}
- if (width != eglglessink->eglglesctx->surface_width ||
- height != eglglessink->eglglesctx->surface_height) {
- eglglessink->eglglesctx->surface_width = width;
- eglglessink->eglglesctx->surface_height = height;
+ if (width != eglglessink->eglglesctx.surface_width ||
+ height != eglglessink->eglglesctx.surface_height) {
+ eglglessink->eglglesctx.surface_width = width;
+ eglglessink->eglglesctx.surface_height = height;
GST_INFO_OBJECT (eglglessink, "Got surface of %dx%d pixels", width, height);
return TRUE;
}
@@ -1521,23 +1518,23 @@ static gboolean
gst_eglglessink_context_make_current (GstEglGlesSink * eglglessink,
gboolean bind, gboolean streaming_thread)
{
- g_assert (eglglessink->eglglesctx->display != NULL);
+ g_assert (eglglessink->eglglesctx.display != NULL);
- if (bind && eglglessink->eglglesctx->surface &&
- eglglessink->eglglesctx->eglcontext) {
+ if (bind && eglglessink->eglglesctx.surface &&
+ eglglessink->eglglesctx.eglcontext) {
if (streaming_thread) {
EGLContext *ctx = eglGetCurrentContext ();
- if (ctx == eglglessink->eglglesctx->eglcontext) {
+ if (ctx == eglglessink->eglglesctx.eglcontext) {
GST_DEBUG_OBJECT (eglglessink, "Already attached the context");
return TRUE;
}
GST_DEBUG_OBJECT (eglglessink, "Attaching context to streaming thread");
- if (!eglMakeCurrent (eglglessink->eglglesctx->display,
- eglglessink->eglglesctx->surface,
- eglglessink->eglglesctx->surface,
- eglglessink->eglglesctx->eglcontext)) {
+ if (!eglMakeCurrent (eglglessink->eglglesctx.display,
+ eglglessink->eglglesctx.surface,
+ eglglessink->eglglesctx.surface,
+ eglglessink->eglglesctx.eglcontext)) {
show_egl_error ("eglMakeCurrent");
GST_ERROR_OBJECT (eglglessink, "Couldn't bind context");
return FALSE;
@@ -1548,10 +1545,10 @@ gst_eglglessink_context_make_current (GstEglGlesSink * eglglessink,
}
} else {
GST_DEBUG_OBJECT (eglglessink, "Attaching context");
- if (!eglMakeCurrent (eglglessink->eglglesctx->display,
- eglglessink->eglglesctx->surface,
- eglglessink->eglglesctx->surface,
- eglglessink->eglglesctx->eglcontext)) {
+ if (!eglMakeCurrent (eglglessink->eglglesctx.display,
+ eglglessink->eglglesctx.surface,
+ eglglessink->eglglesctx.surface,
+ eglglessink->eglglesctx.eglcontext)) {
show_egl_error ("eglMakeCurrent");
GST_ERROR_OBJECT (eglglessink, "Couldn't bind context");
return FALSE;
@@ -1559,7 +1556,7 @@ gst_eglglessink_context_make_current (GstEglGlesSink * eglglessink,
}
} else {
GST_DEBUG_OBJECT (eglglessink, "Detaching context");
- if (!eglMakeCurrent (eglglessink->eglglesctx->display,
+ if (!eglMakeCurrent (eglglessink->eglglesctx.display,
EGL_NO_SURFACE, EGL_NO_SURFACE, EGL_NO_CONTEXT)) {
show_egl_error ("eglMakeCurrent");
GST_ERROR_OBJECT (eglglessink, "Couldn't unbind context");
@@ -1581,14 +1578,12 @@ gst_eglglessink_init_egl_surface (GstEglGlesSink * eglglessink)
GST_DEBUG_OBJECT (eglglessink, "Enter EGL surface setup");
- g_mutex_lock (eglglessink->flow_lock);
-
- eglglessink->eglglesctx->surface =
- eglCreateWindowSurface (eglglessink->eglglesctx->display,
- eglglessink->eglglesctx->config, eglglessink->eglglesctx->used_window,
+ eglglessink->eglglesctx.surface =
+ eglCreateWindowSurface (eglglessink->eglglesctx.display,
+ eglglessink->eglglesctx.config, eglglessink->eglglesctx.used_window,
NULL);
- if (eglglessink->eglglesctx->surface == EGL_NO_SURFACE) {
+ if (eglglessink->eglglesctx.surface == EGL_NO_SURFACE) {
show_egl_error ("eglCreateWindowSurface");
GST_ERROR_OBJECT (eglglessink, "Can't create surface");
goto HANDLE_EGL_ERROR_LOCKED;
@@ -1602,7 +1597,6 @@ gst_eglglessink_init_egl_surface (GstEglGlesSink * eglglessink)
/* We have a surface! */
eglglessink->have_surface = TRUE;
- g_mutex_unlock (eglglessink->flow_lock);
/* Init vertex and fragment GLSL shaders. This entire block might need to be
* runtime conditional once the fast rendering path gets fully implemented.
@@ -1616,39 +1610,39 @@ gst_eglglessink_init_egl_surface (GstEglGlesSink * eglglessink)
goto HANDLE_ERROR;
}
- eglglessink->eglglesctx->vertshader = glCreateShader (GL_VERTEX_SHADER);
+ eglglessink->eglglesctx.vertshader = glCreateShader (GL_VERTEX_SHADER);
GST_DEBUG_OBJECT (eglglessink, "Sending %s to handle %d", vert_COPY_prog,
- eglglessink->eglglesctx->vertshader);
- glShaderSource (eglglessink->eglglesctx->vertshader, 1, &vert_COPY_prog,
+ eglglessink->eglglesctx.vertshader);
+ glShaderSource (eglglessink->eglglesctx.vertshader, 1, &vert_COPY_prog,
NULL);
if (got_gl_error ("glShaderSource vertex"))
goto HANDLE_ERROR;
- glCompileShader (eglglessink->eglglesctx->vertshader);
+ glCompileShader (eglglessink->eglglesctx.vertshader);
if (got_gl_error ("glCompileShader vertex"))
goto HANDLE_ERROR;
- glGetShaderiv (eglglessink->eglglesctx->vertshader, GL_COMPILE_STATUS, &test);
+ glGetShaderiv (eglglessink->eglglesctx.vertshader, GL_COMPILE_STATUS, &test);
if (test != GL_FALSE)
GST_DEBUG_OBJECT (eglglessink, "Successfully compiled vertex shader");
else {
GST_ERROR_OBJECT (eglglessink, "Couldn't compile vertex shader");
- glGetShaderiv (eglglessink->eglglesctx->vertshader, GL_INFO_LOG_LENGTH,
+ glGetShaderiv (eglglessink->eglglesctx.vertshader, GL_INFO_LOG_LENGTH,
&test);
info_log = g_new0 (GLchar, test);
- glGetShaderInfoLog (eglglessink->eglglesctx->vertshader, test, NULL,
+ glGetShaderInfoLog (eglglessink->eglglesctx.vertshader, test, NULL,
info_log);
GST_INFO_OBJECT (eglglessink, "Compilation info log:\n%s", info_log);
g_free (info_log);
goto HANDLE_ERROR;
}
- eglglessink->eglglesctx->fragshader = glCreateShader (GL_FRAGMENT_SHADER);
+ eglglessink->eglglesctx.fragshader = glCreateShader (GL_FRAGMENT_SHADER);
switch (eglglessink->format) {
case GST_VIDEO_FORMAT_AYUV:
- glShaderSource (eglglessink->eglglesctx->fragshader, 1, &frag_AYUV_prog,
+ glShaderSource (eglglessink->eglglesctx.fragshader, 1, &frag_AYUV_prog,
NULL);
- eglglessink->eglglesctx->n_textures = 1;
+ eglglessink->eglglesctx.n_textures = 1;
texnames[0] = "tex";
break;
case GST_VIDEO_FORMAT_Y444:
@@ -1656,50 +1650,50 @@ gst_eglglessink_init_egl_surface (GstEglGlesSink * eglglessink)
case GST_VIDEO_FORMAT_YV12:
case GST_VIDEO_FORMAT_Y42B:
case GST_VIDEO_FORMAT_Y41B:
- glShaderSource (eglglessink->eglglesctx->fragshader, 1,
+ glShaderSource (eglglessink->eglglesctx.fragshader, 1,
&frag_PLANAR_YUV_prog, NULL);
- eglglessink->eglglesctx->n_textures = 3;
+ eglglessink->eglglesctx.n_textures = 3;
texnames[0] = "Ytex";
texnames[1] = "Utex";
texnames[2] = "Vtex";
break;
case GST_VIDEO_FORMAT_YUY2:
tmp_prog = g_strdup_printf (frag_YUY2_YVYU_UYVY_prog, 'r', 'g', 'a');
- glShaderSource (eglglessink->eglglesctx->fragshader, 1,
+ glShaderSource (eglglessink->eglglesctx.fragshader, 1,
(const GLchar **) &tmp_prog, NULL);
- eglglessink->eglglesctx->n_textures = 2;
+ eglglessink->eglglesctx.n_textures = 2;
texnames[0] = "Ytex";
texnames[1] = "UVtex";
break;
case GST_VIDEO_FORMAT_YVYU:
tmp_prog = g_strdup_printf (frag_YUY2_YVYU_UYVY_prog, 'r', 'a', 'g');
- glShaderSource (eglglessink->eglglesctx->fragshader, 1,
+ glShaderSource (eglglessink->eglglesctx.fragshader, 1,
(const GLchar **) &tmp_prog, NULL);
- eglglessink->eglglesctx->n_textures = 2;
+ eglglessink->eglglesctx.n_textures = 2;
texnames[0] = "Ytex";
texnames[1] = "UVtex";
break;
case GST_VIDEO_FORMAT_UYVY:
tmp_prog = g_strdup_printf (frag_YUY2_YVYU_UYVY_prog, 'a', 'r', 'b');
- glShaderSource (eglglessink->eglglesctx->fragshader, 1,
+ glShaderSource (eglglessink->eglglesctx.fragshader, 1,
(const GLchar **) &tmp_prog, NULL);
- eglglessink->eglglesctx->n_textures = 2;
+ eglglessink->eglglesctx.n_textures = 2;
texnames[0] = "Ytex";
texnames[1] = "UVtex";
break;
case GST_VIDEO_FORMAT_NV12:
tmp_prog = g_strdup_printf (frag_NV12_NV21_prog, 'r', 'a');
- glShaderSource (eglglessink->eglglesctx->fragshader, 1,
+ glShaderSource (eglglessink->eglglesctx.fragshader, 1,
(const GLchar **) &tmp_prog, NULL);
- eglglessink->eglglesctx->n_textures = 2;
+ eglglessink->eglglesctx.n_textures = 2;
texnames[0] = "Ytex";
texnames[1] = "UVtex";
break;
case GST_VIDEO_FORMAT_NV21:
tmp_prog = g_strdup_printf (frag_NV12_NV21_prog, 'a', 'r');
- glShaderSource (eglglessink->eglglesctx->fragshader, 1,
+ glShaderSource (eglglessink->eglglesctx.fragshader, 1,
(const GLchar **) &tmp_prog, NULL);
- eglglessink->eglglesctx->n_textures = 2;
+ eglglessink->eglglesctx.n_textures = 2;
texnames[0] = "Ytex";
texnames[1] = "UVtex";
break;
@@ -1707,34 +1701,34 @@ gst_eglglessink_init_egl_surface (GstEglGlesSink * eglglessink)
case GST_VIDEO_FORMAT_BGRx:
case GST_VIDEO_FORMAT_BGRA:
tmp_prog = g_strdup_printf (frag_REORDER_prog, 'b', 'g', 'r');
- glShaderSource (eglglessink->eglglesctx->fragshader, 1,
+ glShaderSource (eglglessink->eglglesctx.fragshader, 1,
(const GLchar **) &tmp_prog, NULL);
- eglglessink->eglglesctx->n_textures = 1;
+ eglglessink->eglglesctx.n_textures = 1;
texnames[0] = "tex";
break;
case GST_VIDEO_FORMAT_xRGB:
case GST_VIDEO_FORMAT_ARGB:
tmp_prog = g_strdup_printf (frag_REORDER_prog, 'g', 'b', 'a');
- glShaderSource (eglglessink->eglglesctx->fragshader, 1,
+ glShaderSource (eglglessink->eglglesctx.fragshader, 1,
(const GLchar **) &tmp_prog, NULL);
- eglglessink->eglglesctx->n_textures = 1;
+ eglglessink->eglglesctx.n_textures = 1;
texnames[0] = "tex";
break;
case GST_VIDEO_FORMAT_xBGR:
case GST_VIDEO_FORMAT_ABGR:
tmp_prog = g_strdup_printf (frag_REORDER_prog, 'a', 'b', 'g');
- glShaderSource (eglglessink->eglglesctx->fragshader, 1,
+ glShaderSource (eglglessink->eglglesctx.fragshader, 1,
(const GLchar **) &tmp_prog, NULL);
- eglglessink->eglglesctx->n_textures = 1;
+ eglglessink->eglglesctx.n_textures = 1;
texnames[0] = "tex";
break;
case GST_VIDEO_FORMAT_RGB:
case GST_VIDEO_FORMAT_RGBx:
case GST_VIDEO_FORMAT_RGBA:
case GST_VIDEO_FORMAT_RGB16:
- glShaderSource (eglglessink->eglglesctx->fragshader, 1, &frag_COPY_prog,
+ glShaderSource (eglglessink->eglglesctx.fragshader, 1, &frag_COPY_prog,
NULL);
- eglglessink->eglglesctx->n_textures = 1;
+ eglglessink->eglglesctx.n_textures = 1;
texnames[0] = "tex";
break;
default:
@@ -1745,38 +1739,38 @@ gst_eglglessink_init_egl_surface (GstEglGlesSink * eglglessink)
if (got_gl_error ("glShaderSource fragment"))
goto HANDLE_ERROR;
- glCompileShader (eglglessink->eglglesctx->fragshader);
+ glCompileShader (eglglessink->eglglesctx.fragshader);
if (got_gl_error ("glCompileShader fragment"))
goto HANDLE_ERROR;
- glGetShaderiv (eglglessink->eglglesctx->fragshader, GL_COMPILE_STATUS, &test);
+ glGetShaderiv (eglglessink->eglglesctx.fragshader, GL_COMPILE_STATUS, &test);
if (test != GL_FALSE)
GST_DEBUG_OBJECT (eglglessink, "Successfully compiled fragment shader");
else {
GST_ERROR_OBJECT (eglglessink, "Couldn't compile fragment shader");
- glGetShaderiv (eglglessink->eglglesctx->fragshader, GL_INFO_LOG_LENGTH,
+ glGetShaderiv (eglglessink->eglglesctx.fragshader, GL_INFO_LOG_LENGTH,
&test);
info_log = g_new0 (GLchar, test);
- glGetShaderInfoLog (eglglessink->eglglesctx->fragshader, test, NULL,
+ glGetShaderInfoLog (eglglessink->eglglesctx.fragshader, test, NULL,
info_log);
GST_INFO_OBJECT (eglglessink, "Compilation info log:\n%s", info_log);
g_free (info_log);
goto HANDLE_ERROR;
}
- eglglessink->eglglesctx->glslprogram = glCreateProgram ();
+ eglglessink->eglglesctx.glslprogram = glCreateProgram ();
if (got_gl_error ("glCreateProgram"))
goto HANDLE_ERROR;
- glAttachShader (eglglessink->eglglesctx->glslprogram,
- eglglessink->eglglesctx->vertshader);
+ glAttachShader (eglglessink->eglglesctx.glslprogram,
+ eglglessink->eglglesctx.vertshader);
if (got_gl_error ("glAttachShader vertices"))
goto HANDLE_ERROR;
- glAttachShader (eglglessink->eglglesctx->glslprogram,
- eglglessink->eglglesctx->fragshader);
+ glAttachShader (eglglessink->eglglesctx.glslprogram,
+ eglglessink->eglglesctx.fragshader);
if (got_gl_error ("glAttachShader fragments"))
goto HANDLE_ERROR;
- glLinkProgram (eglglessink->eglglesctx->glslprogram);
- glGetProgramiv (eglglessink->eglglesctx->glslprogram, GL_LINK_STATUS, &test);
+ glLinkProgram (eglglessink->eglglesctx.glslprogram);
+ glGetProgramiv (eglglessink->eglglesctx.glslprogram, GL_LINK_STATUS, &test);
if (test != GL_FALSE)
GST_DEBUG_OBJECT (eglglessink, "GLES: Successfully linked program");
else {
@@ -1784,14 +1778,14 @@ gst_eglglessink_init_egl_surface (GstEglGlesSink * eglglessink)
goto HANDLE_ERROR;
}
- glUseProgram (eglglessink->eglglesctx->glslprogram);
+ glUseProgram (eglglessink->eglglesctx.glslprogram);
if (got_gl_error ("glUseProgram"))
goto HANDLE_ERROR;
- eglglessink->eglglesctx->position_loc =
- glGetAttribLocation (eglglessink->eglglesctx->glslprogram, "position");
- eglglessink->eglglesctx->texpos_loc =
- glGetAttribLocation (eglglessink->eglglesctx->glslprogram, "texpos");
+ eglglessink->eglglesctx.position_loc =
+ glGetAttribLocation (eglglessink->eglglesctx.glslprogram, "position");
+ eglglessink->eglglesctx.texpos_loc =
+ glGetAttribLocation (eglglessink->eglglesctx.glslprogram, "texpos");
/* Generate and bind texture */
if (!eglglessink->have_texture) {
@@ -1799,9 +1793,7 @@ gst_eglglessink_init_egl_surface (GstEglGlesSink * eglglessink)
GST_INFO_OBJECT (eglglessink, "Performing initial texture setup");
- g_mutex_lock (eglglessink->flow_lock);
-
- for (i = 0; i < eglglessink->eglglesctx->n_textures; i++) {
+ for (i = 0; i < eglglessink->eglglesctx.n_textures; i++) {
if (i == 0)
glActiveTexture (GL_TEXTURE0);
else if (i == 1)
@@ -1809,18 +1801,18 @@ gst_eglglessink_init_egl_surface (GstEglGlesSink * eglglessink)
else if (i == 2)
glActiveTexture (GL_TEXTURE2);
- glGenTextures (1, &eglglessink->eglglesctx->texture[i]);
+ glGenTextures (1, &eglglessink->eglglesctx.texture[i]);
if (got_gl_error ("glGenTextures"))
goto HANDLE_ERROR_LOCKED;
- glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx->texture[i]);
+ glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx.texture[i]);
if (got_gl_error ("glBindTexture"))
goto HANDLE_ERROR_LOCKED;
- eglglessink->eglglesctx->tex_loc[i] =
- glGetUniformLocation (eglglessink->eglglesctx->glslprogram,
+ eglglessink->eglglesctx.tex_loc[i] =
+ glGetUniformLocation (eglglessink->eglglesctx.glslprogram,
texnames[i]);
- glUniform1i (eglglessink->eglglesctx->tex_loc[i], i);
+ glUniform1i (eglglessink->eglglesctx.tex_loc[i], i);
/* Set 2D resizing params */
glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
@@ -1836,7 +1828,6 @@ gst_eglglessink_init_egl_surface (GstEglGlesSink * eglglessink)
}
eglglessink->have_texture = TRUE;
- g_mutex_unlock (eglglessink->flow_lock);
}
g_free (tmp_prog);
@@ -1847,7 +1838,6 @@ gst_eglglessink_init_egl_surface (GstEglGlesSink * eglglessink)
HANDLE_EGL_ERROR_LOCKED:
GST_ERROR_OBJECT (eglglessink, "EGL call returned error %x", eglGetError ());
HANDLE_ERROR_LOCKED:
- g_mutex_unlock (eglglessink->flow_lock);
HANDLE_ERROR:
GST_ERROR_OBJECT (eglglessink, "Couldn't setup EGL surface");
g_free (tmp_prog);
@@ -1859,15 +1849,15 @@ gst_eglglessink_init_egl_display (GstEglGlesSink * eglglessink)
{
GST_DEBUG_OBJECT (eglglessink, "Enter EGL initial configuration");
- eglglessink->eglglesctx->display = eglGetDisplay (EGL_DEFAULT_DISPLAY);
- if (eglglessink->eglglesctx->display == EGL_NO_DISPLAY) {
+ eglglessink->eglglesctx.display = eglGetDisplay (EGL_DEFAULT_DISPLAY);
+ if (eglglessink->eglglesctx.display == EGL_NO_DISPLAY) {
GST_ERROR_OBJECT (eglglessink, "Could not get EGL display connection");
goto HANDLE_ERROR; /* No EGL error is set by eglGetDisplay() */
}
- if (!eglInitialize (eglglessink->eglglesctx->display,
- &eglglessink->eglglesctx->egl_major,
- &eglglessink->eglglesctx->egl_minor)) {
+ if (!eglInitialize (eglglessink->eglglesctx.display,
+ &eglglessink->eglglesctx.egl_major,
+ &eglglessink->eglglesctx.egl_minor)) {
show_egl_error ("eglInitialize");
GST_ERROR_OBJECT (eglglessink, "Could not init EGL display connection");
goto HANDLE_EGL_ERROR;
@@ -1876,15 +1866,15 @@ gst_eglglessink_init_egl_display (GstEglGlesSink * eglglessink)
/* Check against required EGL version
* XXX: Need to review the version requirement in terms of the needed API
*/
- if (eglglessink->eglglesctx->egl_major < GST_EGLGLESSINK_EGL_MIN_VERSION) {
+ if (eglglessink->eglglesctx.egl_major < GST_EGLGLESSINK_EGL_MIN_VERSION) {
GST_ERROR_OBJECT (eglglessink, "EGL v%d needed, but you only have v%d.%d",
- GST_EGLGLESSINK_EGL_MIN_VERSION, eglglessink->eglglesctx->egl_major,
- eglglessink->eglglesctx->egl_minor);
+ GST_EGLGLESSINK_EGL_MIN_VERSION, eglglessink->eglglesctx.egl_major,
+ eglglessink->eglglesctx.egl_minor);
goto HANDLE_ERROR;
}
GST_INFO_OBJECT (eglglessink, "System reports supported EGL version v%d.%d",
- eglglessink->eglglesctx->egl_major, eglglessink->eglglesctx->egl_minor);
+ eglglessink->eglglesctx.egl_major, eglglessink->eglglesctx.egl_minor);
eglBindAPI (EGL_OPENGL_ES_API);
@@ -1904,9 +1894,9 @@ gst_eglglessink_choose_config (GstEglGlesSink * eglglessink)
EGLint con_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
GLint egl_configs;
- if ((eglChooseConfig (eglglessink->eglglesctx->display,
+ if ((eglChooseConfig (eglglessink->eglglesctx.display,
eglglessink->selected_fmt->attribs,
- &eglglessink->eglglesctx->config, 1,
+ &eglglessink->eglglesctx.config, 1,
&egl_configs)) == EGL_FALSE) {
show_egl_error ("eglChooseConfig");
GST_ERROR_OBJECT (eglglessink, "eglChooseConfig failed");
@@ -1919,17 +1909,17 @@ gst_eglglessink_choose_config (GstEglGlesSink * eglglessink)
goto HANDLE_ERROR;
}
- eglglessink->eglglesctx->eglcontext =
- eglCreateContext (eglglessink->eglglesctx->display,
- eglglessink->eglglesctx->config, EGL_NO_CONTEXT, con_attribs);
+ eglglessink->eglglesctx.eglcontext =
+ eglCreateContext (eglglessink->eglglesctx.display,
+ eglglessink->eglglesctx.config, EGL_NO_CONTEXT, con_attribs);
- if (eglglessink->eglglesctx->eglcontext == EGL_NO_CONTEXT) {
+ if (eglglessink->eglglesctx.eglcontext == EGL_NO_CONTEXT) {
GST_ERROR_OBJECT (eglglessink, "Error getting context, eglCreateContext");
goto HANDLE_EGL_ERROR;
}
GST_DEBUG_OBJECT (eglglessink, "EGL Context: %p",
- eglglessink->eglglesctx->eglcontext);
+ eglglessink->eglglesctx.eglcontext);
return TRUE;
@@ -1950,10 +1940,10 @@ gst_eglglessink_set_window_handle (GstXOverlay * overlay, guintptr id)
GST_DEBUG_OBJECT (eglglessink, "We got a window handle!");
/* OK, we have a new window */
- g_mutex_lock (eglglessink->flow_lock);
- eglglessink->eglglesctx->window = (EGLNativeWindowType) id;
+ GST_OBJECT_LOCK (eglglessink);
+ eglglessink->eglglesctx.window = (EGLNativeWindowType) id;
eglglessink->have_window = TRUE;
- g_mutex_unlock (eglglessink->flow_lock);
+ GST_OBJECT_UNLOCK (eglglessink);
return;
}
@@ -1966,8 +1956,7 @@ gst_eglglessink_set_render_rectangle (GstXOverlay * overlay, gint x, gint y,
g_return_if_fail (GST_IS_EGLGLESSINK (eglglessink));
- g_mutex_lock (eglglessink->flow_lock);
-
+ GST_OBJECT_LOCK (eglglessink);
if (width == -1 && height == -1) {
/* This is the set-defaults condition according to
* the xOverlay interface docs
@@ -1975,14 +1964,12 @@ gst_eglglessink_set_render_rectangle (GstXOverlay * overlay, gint x, gint y,
eglglessink->display_region.w = 0;
eglglessink->display_region.h = 0;
} else {
- g_mutex_lock (eglglessink->flow_lock);
eglglessink->display_region.x = x;
eglglessink->display_region.y = y;
eglglessink->display_region.w = width;
eglglessink->display_region.h = height;
}
-
- g_mutex_unlock (eglglessink->flow_lock);
+ GST_OBJECT_UNLOCK (eglglessink);
return;
}
@@ -2018,7 +2005,7 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
case GST_EGLGLESSINK_RENDER_FAST:
/* XXX: Not Fully implemented */
img =
- my_eglCreateImageKHR (eglglessink->eglglesctx->display,
+ my_eglCreateImageKHR (eglglessink->eglglesctx.display,
EGL_NO_CONTEXT, EGL_NATIVE_PIXMAP_KHR,
(EGLClientBuffer) GST_BUFFER_DATA (buf), attrs);
@@ -2037,13 +2024,13 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
switch (eglglessink->selected_fmt->fmt) {
case GST_EGLGLESSINK_IMAGE_RGB888:
glActiveTexture (GL_TEXTURE0);
- glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx->texture[0]);
+ glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx.texture[0]);
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB,
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf));
break;
case GST_EGLGLESSINK_IMAGE_RGB565:
glActiveTexture (GL_TEXTURE0);
- glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx->texture[0]);
+ glBindTexture (GL_TEXTURE_2D, eglglessink->eglglesctx.texture[0]);
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB, w, h, 0, GL_RGB,
GL_UNSIGNED_SHORT_5_6_5, GST_BUFFER_DATA (buf));
break;
@@ -2059,14 +2046,14 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
case GST_VIDEO_FORMAT_xBGR:
glActiveTexture (GL_TEXTURE0);
glBindTexture (GL_TEXTURE_2D,
- eglglessink->eglglesctx->texture[0]);
+ eglglessink->eglglesctx.texture[0]);
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA,
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf));
break;
case GST_VIDEO_FORMAT_AYUV:
glActiveTexture (GL_TEXTURE0);
glBindTexture (GL_TEXTURE_2D,
- eglglessink->eglglesctx->texture[0]);
+ eglglessink->eglglesctx.texture[0]);
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, w, h, 0, GL_RGBA,
GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf));
break;
@@ -2086,7 +2073,7 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
0, h);
glActiveTexture (GL_TEXTURE0);
glBindTexture (GL_TEXTURE_2D,
- eglglessink->eglglesctx->texture[0]);
+ eglglessink->eglglesctx.texture[0]);
glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE, cw, ch, 0,
GL_LUMINANCE, GL_UNSIGNED_BYTE,
GST_BUFFER_DATA (buf) + coffset);
@@ -2099,7 +2086,7 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
1, h);
glActiveTexture (GL_TEXTURE1);
glBindTexture (GL_TEXTURE_2D,
- eglglessink->eglglesctx->texture[1]);
+ eglglessink->eglglesctx.texture[1]);
glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE, cw, ch, 0,
GL_LUMINANCE, GL_UNSIGNED_BYTE,
GST_BUFFER_DATA (buf) + coffset);
@@ -2112,7 +2099,7 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
2, h);
glActiveTexture (GL_TEXTURE2);
glBindTexture (GL_TEXTURE_2D,
- eglglessink->eglglesctx->texture[2]);
+ eglglessink->eglglesctx.texture[2]);
glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE, cw, ch, 0,
GL_LUMINANCE, GL_UNSIGNED_BYTE,
GST_BUFFER_DATA (buf) + coffset);
@@ -2123,13 +2110,13 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
case GST_VIDEO_FORMAT_UYVY:
glActiveTexture (GL_TEXTURE0);
glBindTexture (GL_TEXTURE_2D,
- eglglessink->eglglesctx->texture[0]);
+ eglglessink->eglglesctx.texture[0]);
glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, w, h, 0,
GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
GST_BUFFER_DATA (buf));
glActiveTexture (GL_TEXTURE1);
glBindTexture (GL_TEXTURE_2D,
- eglglessink->eglglesctx->texture[1]);
+ eglglessink->eglglesctx.texture[1]);
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, GST_ROUND_UP_2 (w) / 2,
h, 0, GL_RGBA, GL_UNSIGNED_BYTE, GST_BUFFER_DATA (buf));
break;
@@ -2146,7 +2133,7 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
0, h);
glActiveTexture (GL_TEXTURE0);
glBindTexture (GL_TEXTURE_2D,
- eglglessink->eglglesctx->texture[0]);
+ eglglessink->eglglesctx.texture[0]);
glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE, cw, ch, 0,
GL_LUMINANCE, GL_UNSIGNED_BYTE,
GST_BUFFER_DATA (buf) + coffset);
@@ -2161,7 +2148,7 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
1, h);
glActiveTexture (GL_TEXTURE1);
glBindTexture (GL_TEXTURE_2D,
- eglglessink->eglglesctx->texture[1]);
+ eglglessink->eglglesctx.texture[1]);
glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE_ALPHA, cw, ch, 0,
GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE,
GST_BUFFER_DATA (buf) + coffset);
@@ -2186,18 +2173,18 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
*/
if (gst_eglglessink_update_surface_dimensions (eglglessink) ||
!eglglessink->display_region.w || !eglglessink->display_region.h) {
- g_mutex_lock (eglglessink->flow_lock);
+ GST_OBJECT_LOCK (eglglessink);
if (!eglglessink->force_aspect_ratio) {
eglglessink->display_region.x = 0;
eglglessink->display_region.y = 0;
eglglessink->display_region.w =
- eglglessink->eglglesctx->surface_width;
+ eglglessink->eglglesctx.surface_width;
eglglessink->display_region.h =
- eglglessink->eglglesctx->surface_height;
+ eglglessink->eglglesctx.surface_height;
} else {
if (!gst_video_calculate_display_ratio (&dar_n, &dar_d, w, h,
eglglessink->par_n, eglglessink->par_d,
- eglglessink->eglglesctx->pixel_aspect_ratio,
+ eglglessink->eglglesctx.pixel_aspect_ratio,
EGL_DISPLAY_SCALING)) {
GST_WARNING_OBJECT (eglglessink, "Could not compute resulting DAR");
frame.w = w;
@@ -2223,12 +2210,12 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
}
}
- surface.w = eglglessink->eglglesctx->surface_width;
- surface.h = eglglessink->eglglesctx->surface_height;
+ surface.w = eglglessink->eglglesctx.surface_width;
+ surface.h = eglglessink->eglglesctx.surface_height;
gst_video_sink_center_rect (frame, surface,
&eglglessink->display_region, TRUE);
}
- g_mutex_unlock (eglglessink->flow_lock);
+ GST_OBJECT_UNLOCK (eglglessink);
glViewport (eglglessink->display_region.x,
eglglessink->display_region.y,
eglglessink->display_region.w, eglglessink->display_region.h);
@@ -2238,8 +2225,8 @@ gst_eglglessink_render_and_display (GstEglGlesSink * eglglessink,
if (got_gl_error ("glDrawElements"))
goto HANDLE_ERROR;
- if ((eglSwapBuffers (eglglessink->eglglesctx->display,
- eglglessink->eglglesctx->surface))
+ if ((eglSwapBuffers (eglglessink->eglglesctx.display,
+ eglglessink->eglglesctx.surface))
== EGL_FALSE) {
show_egl_error ("eglSwapBuffers");
goto HANDLE_ERROR;
@@ -2292,7 +2279,7 @@ gst_eglglessink_getcaps (GstBaseSink * bsink)
eglglessink = GST_EGLGLESSINK (bsink);
- g_mutex_lock (eglglessink->flow_lock);
+ GST_OBJECT_LOCK (eglglessink);
if (eglglessink->sinkcaps) {
ret = gst_caps_ref (eglglessink->sinkcaps);
} else {
@@ -2300,8 +2287,7 @@ gst_eglglessink_getcaps (GstBaseSink * bsink)
gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SINK_PAD
(bsink)));
}
-
- g_mutex_unlock (eglglessink->flow_lock);
+ GST_OBJECT_UNLOCK (eglglessink);
return ret;
}
@@ -2344,13 +2330,11 @@ gst_eglglessink_setcaps (GstBaseSink * bsink, GstCaps * caps)
GST_INFO_OBJECT (eglglessink, "Selected compatible EGL/GLES format %d",
format->fmt);
- g_mutex_lock (eglglessink->flow_lock);
eglglessink->selected_fmt = format;
eglglessink->par_n = par_n;
eglglessink->par_d = par_d;
GST_VIDEO_SINK_WIDTH (eglglessink) = width;
GST_VIDEO_SINK_HEIGHT (eglglessink) = height;
- g_mutex_unlock (eglglessink->flow_lock);
if (eglglessink->current_caps) {
GST_ERROR_OBJECT (eglglessink, "Caps were already set");
@@ -2370,58 +2354,58 @@ gst_eglglessink_setcaps (GstBaseSink * bsink, GstCaps * caps)
glUseProgram (0);
if (eglglessink->have_vbo) {
- glDeleteBuffers (1, &eglglessink->eglglesctx->position_buffer);
- glDeleteBuffers (1, &eglglessink->eglglesctx->texpos_buffer);
- glDeleteBuffers (1, &eglglessink->eglglesctx->index_buffer);
+ glDeleteBuffers (1, &eglglessink->eglglesctx.position_buffer);
+ glDeleteBuffers (1, &eglglessink->eglglesctx.texpos_buffer);
+ glDeleteBuffers (1, &eglglessink->eglglesctx.index_buffer);
eglglessink->have_vbo = FALSE;
}
if (eglglessink->have_texture) {
- glDeleteTextures (eglglessink->eglglesctx->n_textures,
- eglglessink->eglglesctx->texture);
+ glDeleteTextures (eglglessink->eglglesctx.n_textures,
+ eglglessink->eglglesctx.texture);
eglglessink->have_texture = FALSE;
- eglglessink->eglglesctx->n_textures = 0;
+ eglglessink->eglglesctx.n_textures = 0;
}
- if (eglglessink->eglglesctx->glslprogram) {
- glDetachShader (eglglessink->eglglesctx->glslprogram,
- eglglessink->eglglesctx->fragshader);
- glDetachShader (eglglessink->eglglesctx->glslprogram,
- eglglessink->eglglesctx->vertshader);
- glDeleteProgram (eglglessink->eglglesctx->glslprogram);
- glDeleteShader (eglglessink->eglglesctx->fragshader);
- glDeleteShader (eglglessink->eglglesctx->vertshader);
- eglglessink->eglglesctx->glslprogram = 0;
+ if (eglglessink->eglglesctx.glslprogram) {
+ glDetachShader (eglglessink->eglglesctx.glslprogram,
+ eglglessink->eglglesctx.fragshader);
+ glDetachShader (eglglessink->eglglesctx.glslprogram,
+ eglglessink->eglglesctx.vertshader);
+ glDeleteProgram (eglglessink->eglglesctx.glslprogram);
+ glDeleteShader (eglglessink->eglglesctx.fragshader);
+ glDeleteShader (eglglessink->eglglesctx.vertshader);
+ eglglessink->eglglesctx.glslprogram = 0;
}
}
if (!gst_eglglessink_context_make_current (eglglessink, FALSE, TRUE))
return FALSE;
- if (eglglessink->eglglesctx->surface) {
- eglDestroySurface (eglglessink->eglglesctx->display,
- eglglessink->eglglesctx->surface);
- eglglessink->eglglesctx->surface = NULL;
+ if (eglglessink->eglglesctx.surface) {
+ eglDestroySurface (eglglessink->eglglesctx.display,
+ eglglessink->eglglesctx.surface);
+ eglglessink->eglglesctx.surface = NULL;
eglglessink->have_surface = FALSE;
}
- if (eglglessink->eglglesctx->eglcontext) {
- eglDestroyContext (eglglessink->eglglesctx->display,
- eglglessink->eglglesctx->eglcontext);
- eglglessink->eglglesctx->eglcontext = NULL;
+ if (eglglessink->eglglesctx.eglcontext) {
+ eglDestroyContext (eglglessink->eglglesctx.display,
+ eglglessink->eglglesctx.eglcontext);
+ eglglessink->eglglesctx.eglcontext = NULL;
}
- g_mutex_lock (eglglessink->flow_lock);
+ GST_OBJECT_LOCK (eglglessink);
/* Reset display region
* XXX: Should probably keep old ones if set_render_rect()
* has been called.
*/
eglglessink->display_region.w = 0;
eglglessink->display_region.h = 0;
+ GST_OBJECT_UNLOCK (eglglessink);
gst_caps_unref (eglglessink->current_caps);
eglglessink->current_caps = NULL;
- g_mutex_unlock (eglglessink->flow_lock);
}
if (!gst_eglglessink_choose_config (eglglessink)) {
@@ -2429,9 +2413,7 @@ gst_eglglessink_setcaps (GstBaseSink * bsink, GstCaps * caps)
goto HANDLE_ERROR;
}
- g_mutex_lock (eglglessink->flow_lock);
eglglessink->current_caps = gst_caps_ref (caps);
- g_mutex_unlock (eglglessink->flow_lock);
/* By now the application should have set a window
* if it meant to do so
@@ -2443,13 +2425,11 @@ gst_eglglessink_setcaps (GstBaseSink * bsink, GstCaps * caps)
GST_ERROR_OBJECT (eglglessink, "Internal window creation failed!");
goto HANDLE_ERROR;
}
- g_mutex_lock (eglglessink->flow_lock);
eglglessink->using_own_window = TRUE;
- g_mutex_unlock (eglglessink->flow_lock);
gst_eglglessink_set_window_handle (GST_X_OVERLAY (eglglessink),
(guintptr) window);
}
- eglglessink->eglglesctx->used_window = eglglessink->eglglesctx->window;
+ eglglessink->eglglesctx.used_window = eglglessink->eglglesctx.window;
if (!eglglessink->have_surface) {
if (!gst_eglglessink_init_egl_surface (eglglessink)) {
@@ -2482,36 +2462,6 @@ gst_eglglessink_wipe_fmt (gpointer data)
g_free (format);
}
-static gboolean
-gst_eglglessink_open (GstEglGlesSink * eglglessink)
-{
- if (!egl_init (eglglessink)) {
- return FALSE;
- }
-
- return TRUE;
-}
-
-static gboolean
-gst_eglglessink_close (GstEglGlesSink * eglglessink)
-{
- g_mutex_lock (eglglessink->flow_lock);
- if (eglglessink->eglglesctx->display) {
- eglTerminate (eglglessink->eglglesctx->display);
- eglglessink->eglglesctx->display = NULL;
- }
-
- eglglessink->selected_fmt = NULL;
- g_list_free_full (eglglessink->supported_fmts, gst_eglglessink_wipe_fmt);
- eglglessink->supported_fmts = NULL;
- gst_caps_unref (eglglessink->sinkcaps);
- eglglessink->sinkcaps = NULL;
- eglglessink->egl_started = FALSE;
- g_mutex_unlock (eglglessink->flow_lock);
-
- return TRUE;
-}
-
static GstStateChangeReturn
gst_eglglessink_change_state (GstElement * element, GstStateChange transition)
{
@@ -2520,17 +2470,9 @@ gst_eglglessink_change_state (GstElement * element, GstStateChange transition)
eglglessink = GST_EGLGLESSINK (element);
- GST_ERROR_OBJECT (eglglessink, "Changing state %d -> %d", GST_STATE_TRANSITION_CURRENT (transition), GST_STATE_TRANSITION_NEXT (transition));
-
switch (transition) {
case GST_STATE_CHANGE_NULL_TO_READY:
- if (!gst_eglglessink_open (eglglessink)) {
- ret = GST_STATE_CHANGE_FAILURE;
- goto done;
- }
- break;
- case GST_STATE_CHANGE_READY_TO_PAUSED:
- if (!gst_eglglessink_start (eglglessink)) {
+ if (!egl_init (eglglessink)) {
ret = GST_STATE_CHANGE_FAILURE;
goto done;
}
@@ -2545,16 +2487,17 @@ gst_eglglessink_change_state (GstElement * element, GstStateChange transition)
switch (transition) {
case GST_STATE_CHANGE_READY_TO_NULL:
- if (!gst_eglglessink_close (eglglessink)) {
- ret = GST_STATE_CHANGE_FAILURE;
- goto done;
- }
- break;
- case GST_STATE_CHANGE_PAUSED_TO_READY:
- if (!gst_eglglessink_stop (eglglessink)) {
- ret = GST_STATE_CHANGE_FAILURE;
- goto done;
+ if (eglglessink->eglglesctx.display) {
+ eglTerminate (eglglessink->eglglesctx.display);
+ eglglessink->eglglesctx.display = NULL;
}
+
+ eglglessink->selected_fmt = NULL;
+ g_list_free_full (eglglessink->supported_fmts, gst_eglglessink_wipe_fmt);
+ eglglessink->supported_fmts = NULL;
+ gst_caps_unref (eglglessink->sinkcaps);
+ eglglessink->sinkcaps = NULL;
+ eglglessink->egl_started = FALSE;
break;
default:
break;
@@ -2567,18 +2510,6 @@ done:
static void
gst_eglglessink_finalize (GObject * object)
{
- GstEglGlesSink *eglglessink;
-
- g_return_if_fail (GST_IS_EGLGLESSINK (object));
-
- eglglessink = GST_EGLGLESSINK (object);
-
- g_mutex_free (eglglessink->flow_lock);
- eglglessink->flow_lock = NULL;
-
- g_free (eglglessink->eglglesctx);
- eglglessink->eglglesctx = NULL;
-
G_OBJECT_CLASS (parent_class)->finalize (object);
}
@@ -2669,6 +2600,8 @@ gst_eglglessink_class_init (GstEglGlesSinkClass * klass)
gstelement_class->change_state = gst_eglglessink_change_state;
+ gstbasesink_class->start = gst_eglglessink_start;
+ gstbasesink_class->stop = gst_eglglessink_stop;
gstbasesink_class->set_caps = GST_DEBUG_FUNCPTR (gst_eglglessink_setcaps);
gstbasesink_class->get_caps = GST_DEBUG_FUNCPTR (gst_eglglessink_getcaps);
gstbasesink_class->buffer_alloc = GST_DEBUG_FUNCPTR
@@ -2720,8 +2653,6 @@ gst_eglglessink_init (GstEglGlesSink * eglglessink,
eglglessink->par_n = 1;
eglglessink->par_d = 1;
- eglglessink->eglglesctx = g_new0 (GstEglGlesRenderContext, 1);
- eglglessink->flow_lock = g_mutex_new ();
}
/* Interface initializations. Used here for initializing the XOverlay