summaryrefslogtreecommitdiff
path: root/ext/eglgles/gstegladaptation.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/eglgles/gstegladaptation.c')
-rw-r--r--ext/eglgles/gstegladaptation.c395
1 files changed, 65 insertions, 330 deletions
diff --git a/ext/eglgles/gstegladaptation.c b/ext/eglgles/gstegladaptation.c
index db6357d04..e075ea9f5 100644
--- a/ext/eglgles/gstegladaptation.c
+++ b/ext/eglgles/gstegladaptation.c
@@ -45,19 +45,6 @@
#include <gst/video/video.h>
#include "gstegladaptation.h"
-/* Some EGL implementations are reporting wrong
- * values for the display's EGL_PIXEL_ASPECT_RATIO.
- * They are required by the khronos specs to report
- * this value as w/h * EGL_DISPLAY_SCALING (Which is
- * a constant with value 10000) but at least the
- * Galaxy SIII (Android) is reporting just 1 when
- * w = h. We use these two to bound returned values to
- * sanity.
- */
-#define EGL_SANE_DAR_MIN ((EGL_DISPLAY_SCALING)/10)
-#define EGL_SANE_DAR_MAX ((EGL_DISPLAY_SCALING)*10)
-
-
/* GLESv2 GLSL Shaders
*
* OpenGL ES Standard does not mandate YUV support. This is
@@ -212,35 +199,6 @@ static const char *frag_NV12_NV21_prog = {
};
/* *INDENT-ON* */
-/* will probably move elsewhere */
-static const EGLint eglglessink_RGBA8888_attribs[] = {
- EGL_RED_SIZE, 8,
- EGL_GREEN_SIZE, 8,
- EGL_BLUE_SIZE, 8,
- EGL_ALPHA_SIZE, 8,
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
- EGL_NONE
-};
-
-static const EGLint eglglessink_RGB888_attribs[] = {
- EGL_RED_SIZE, 8,
- EGL_GREEN_SIZE, 8,
- EGL_BLUE_SIZE, 8,
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
- EGL_NONE
-};
-
-static const EGLint eglglessink_RGB565_attribs[] = {
- EGL_RED_SIZE, 5,
- EGL_GREEN_SIZE, 6,
- EGL_BLUE_SIZE, 5,
- EGL_SURFACE_TYPE, EGL_WINDOW_BIT,
- EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
- EGL_NONE
-};
-
static gboolean
create_shader_program (GstEglAdaptationContext * ctx, GLuint * prog,
GLuint * vert, GLuint * frag, const gchar * vert_text,
@@ -337,62 +295,6 @@ HANDLE_ERROR:
}
-gboolean
-gst_egl_adaptation_init_display (GstEglAdaptationContext * ctx)
-{
- EGLDisplay display;
- GST_DEBUG_OBJECT (ctx->element, "Enter EGL initial configuration");
-
-#ifdef USE_EGL_RPI
- /* See https://github.com/raspberrypi/firmware/issues/99 */
- if (!eglMakeCurrent ((EGLDisplay) 1, EGL_NO_SURFACE, EGL_NO_SURFACE,
- EGL_NO_CONTEXT)) {
- got_egl_error ("eglMakeCurrent");
- GST_ERROR_OBJECT (ctx->element, "Couldn't unbind context");
- return FALSE;
- }
-#endif
-
- display = eglGetDisplay (EGL_DEFAULT_DISPLAY);
- if (display == EGL_NO_DISPLAY) {
- GST_ERROR_OBJECT (ctx->element, "Could not get EGL display connection");
- goto HANDLE_ERROR; /* No EGL error is set by eglGetDisplay() */
- }
- ctx->eglglesctx.display = display;
-
- if (!eglInitialize (display,
- &ctx->eglglesctx.egl_major,
- &ctx->eglglesctx.egl_minor)) {
- got_egl_error ("eglInitialize");
- GST_ERROR_OBJECT (ctx->element, "Could not init EGL display connection");
- goto HANDLE_EGL_ERROR;
- }
-
- /* Check against required EGL version
- * XXX: Need to review the version requirement in terms of the needed API
- */
- if (ctx->eglglesctx.egl_major < GST_EGLGLESSINK_EGL_MIN_VERSION) {
- GST_ERROR_OBJECT (ctx->element, "EGL v%d needed, but you only have v%d.%d",
- GST_EGLGLESSINK_EGL_MIN_VERSION, ctx->eglglesctx.egl_major,
- ctx->eglglesctx.egl_minor);
- goto HANDLE_ERROR;
- }
-
- GST_INFO_OBJECT (ctx->element, "System reports supported EGL version v%d.%d",
- ctx->eglglesctx.egl_major, ctx->eglglesctx.egl_minor);
-
- eglBindAPI (EGL_OPENGL_ES_API);
-
- return TRUE;
-
- /* Errors */
-HANDLE_EGL_ERROR:
- GST_ERROR_OBJECT (ctx->element, "EGL call returned error %x", eglGetError ());
-HANDLE_ERROR:
- GST_ERROR_OBJECT (ctx->element, "Couldn't setup window/surface from handle");
- return FALSE;
-}
-
GstEglAdaptationContext *
gst_egl_adaptation_context_new (GstElement * element)
{
@@ -427,12 +329,9 @@ got_egl_error (const char *wtf)
gboolean
gst_egl_adaptation_choose_config (GstEglAdaptationContext * ctx)
{
- EGLint con_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
- GLint egl_configs;
+ gint egl_configs;
- if ((eglChooseConfig (ctx->eglglesctx.display,
- eglglessink_RGBA8888_attribs,
- &ctx->eglglesctx.config, 1, &egl_configs)) == EGL_FALSE) {
+ if (!_gst_egl_choose_config (ctx, FALSE, &egl_configs)) {
got_egl_error ("eglChooseConfig");
GST_ERROR_OBJECT (ctx->element, "eglChooseConfig failed");
goto HANDLE_EGL_ERROR;
@@ -444,18 +343,11 @@ gst_egl_adaptation_choose_config (GstEglAdaptationContext * ctx)
goto HANDLE_ERROR;
}
- ctx->eglglesctx.eglcontext =
- eglCreateContext (ctx->eglglesctx.display,
- ctx->eglglesctx.config, EGL_NO_CONTEXT, con_attribs);
-
- if (ctx->eglglesctx.eglcontext == EGL_NO_CONTEXT) {
+ if (!gst_egl_adaptation_create_egl_context (ctx)) {
GST_ERROR_OBJECT (ctx->element, "Error getting context, eglCreateContext");
goto HANDLE_EGL_ERROR;
}
- GST_DEBUG_OBJECT (ctx->element, "EGL Context: %p",
- ctx->eglglesctx.eglcontext);
-
return TRUE;
/* Errors */
@@ -470,7 +362,6 @@ gint gst_egl_adaptation_context_fill_supported_fbuffer_configs
(GstEglAdaptationContext * ctx, GstCaps ** ret_caps)
{
gboolean ret = FALSE;
- EGLint cfg_number;
GstCaps *caps;
GST_DEBUG_OBJECT (ctx->element,
@@ -479,8 +370,7 @@ gint gst_egl_adaptation_context_fill_supported_fbuffer_configs
/* Init supported format/caps list */
caps = gst_caps_new_empty ();
- if (eglChooseConfig (ctx->eglglesctx.display,
- eglglessink_RGBA8888_attribs, NULL, 1, &cfg_number) != EGL_FALSE) {
+ if (_gst_egl_choose_config (ctx, TRUE, NULL)) {
gst_caps_append (caps,
gst_video_format_new_template_caps (GST_VIDEO_FORMAT_RGBA));
gst_caps_append (caps,
@@ -533,45 +423,6 @@ gint gst_egl_adaptation_context_fill_supported_fbuffer_configs
return ret;
}
-gboolean
-gst_egl_adaptation_context_make_current (GstEglAdaptationContext * ctx,
- gboolean bind)
-{
- g_assert (ctx->eglglesctx.display != NULL);
-
- if (bind && ctx->eglglesctx.surface &&
- ctx->eglglesctx.eglcontext) {
- EGLContext *cur_ctx = eglGetCurrentContext ();
-
- if (cur_ctx == ctx->eglglesctx.eglcontext) {
- GST_DEBUG_OBJECT (ctx->element,
- "Already attached the context to thread %p", g_thread_self ());
- return TRUE;
- }
-
- GST_DEBUG_OBJECT (ctx->element, "Attaching context to thread %p",
- g_thread_self ());
- if (!eglMakeCurrent (ctx->eglglesctx.display,
- ctx->eglglesctx.surface, ctx->eglglesctx.surface,
- ctx->eglglesctx.eglcontext)) {
- got_egl_error ("eglMakeCurrent");
- GST_ERROR_OBJECT (ctx->element, "Couldn't bind context");
- return FALSE;
- }
- } else {
- GST_DEBUG_OBJECT (ctx->element, "Detaching context from thread %p",
- g_thread_self ());
- if (!eglMakeCurrent (ctx->eglglesctx.display, EGL_NO_SURFACE,
- EGL_NO_SURFACE, EGL_NO_CONTEXT)) {
- got_egl_error ("eglMakeCurrent");
- GST_ERROR_OBJECT (ctx->element, "Couldn't unbind context");
- return FALSE;
- }
- }
-
- return TRUE;
-}
-
void
gst_egl_adaptation_context_cleanup (GstEglAdaptationContext * ctx)
{
@@ -580,144 +431,58 @@ gst_egl_adaptation_context_cleanup (GstEglAdaptationContext * ctx)
glUseProgram (0);
if (ctx->have_vbo) {
- glDeleteBuffers (1, &ctx->eglglesctx.position_buffer);
- glDeleteBuffers (1, &ctx->eglglesctx.index_buffer);
+ glDeleteBuffers (1, &ctx->position_buffer);
+ glDeleteBuffers (1, &ctx->index_buffer);
ctx->have_vbo = FALSE;
}
if (ctx->have_texture) {
- glDeleteTextures (ctx->eglglesctx.n_textures,
- ctx->eglglesctx.texture);
+ glDeleteTextures (ctx->n_textures, ctx->texture);
ctx->have_texture = FALSE;
- ctx->eglglesctx.n_textures = 0;
+ ctx->n_textures = 0;
}
for (i = 0; i < 2; i++) {
- if (ctx->eglglesctx.glslprogram[i]) {
- glDetachShader (ctx->eglglesctx.glslprogram[i],
- ctx->eglglesctx.fragshader[i]);
- glDetachShader (ctx->eglglesctx.glslprogram[i],
- ctx->eglglesctx.vertshader[i]);
- glDeleteProgram (ctx->eglglesctx.glslprogram[i]);
- glDeleteShader (ctx->eglglesctx.fragshader[i]);
- glDeleteShader (ctx->eglglesctx.vertshader[i]);
- ctx->eglglesctx.glslprogram[i] = 0;
- ctx->eglglesctx.fragshader[i] = 0;
- ctx->eglglesctx.vertshader[i] = 0;
+ if (ctx->glslprogram[i]) {
+ glDetachShader (ctx->glslprogram[i], ctx->fragshader[i]);
+ glDetachShader (ctx->glslprogram[i], ctx->vertshader[i]);
+ glDeleteProgram (ctx->glslprogram[i]);
+ glDeleteShader (ctx->fragshader[i]);
+ glDeleteShader (ctx->vertshader[i]);
+ ctx->glslprogram[i] = 0;
+ ctx->fragshader[i] = 0;
+ ctx->vertshader[i] = 0;
}
}
gst_egl_adaptation_context_make_current (ctx, FALSE);
- if (ctx->eglglesctx.surface) {
- eglDestroySurface (ctx->eglglesctx.display,
- ctx->eglglesctx.surface);
- ctx->eglglesctx.surface = NULL;
- ctx->have_surface = FALSE;
- }
-
- if (ctx->eglglesctx.eglcontext) {
- eglDestroyContext (ctx->eglglesctx.display,
- ctx->eglglesctx.eglcontext);
- ctx->eglglesctx.eglcontext = NULL;
- }
+ gst_egl_adaptation_destroy_surface (ctx);
+ gst_egl_adaptation_destroy_context (ctx);
}
-/* XXX: Lock eglgles context? */
-gboolean
-gst_egl_adaptation_context_update_surface_dimensions (GstEglAdaptationContext *
- ctx)
-{
- gint width, height;
-
- /* Save surface dims */
- eglQuerySurface (ctx->eglglesctx.display,
- ctx->eglglesctx.surface, EGL_WIDTH, &width);
- eglQuerySurface (ctx->eglglesctx.display,
- ctx->eglglesctx.surface, EGL_HEIGHT, &height);
-
- if (width != ctx->eglglesctx.surface_width ||
- height != ctx->eglglesctx.surface_height) {
- ctx->eglglesctx.surface_width = width;
- ctx->eglglesctx.surface_height = height;
- GST_INFO_OBJECT (ctx->element, "Got surface of %dx%d pixels", width, height);
- return TRUE;
- }
-
- return FALSE;
-}
-
-
gboolean
gst_egl_adaptation_init_egl_surface (GstEglAdaptationContext * ctx,
GstVideoFormat format)
{
GLboolean ret;
- EGLint display_par;
const gchar *texnames[3] = { NULL, };
gchar *frag_prog = NULL;
gboolean free_frag_prog = FALSE;
- EGLint swap_behavior;
gint i;
GST_DEBUG_OBJECT (ctx->element, "Enter EGL surface setup");
- ctx->eglglesctx.surface =
- eglCreateWindowSurface (ctx->eglglesctx.display,
- ctx->eglglesctx.config, ctx->eglglesctx.used_window,
- NULL);
-
- if (ctx->eglglesctx.surface == EGL_NO_SURFACE) {
- got_egl_error ("eglCreateWindowSurface");
- GST_ERROR_OBJECT (ctx->element, "Can't create surface");
+ if (!gst_egl_adaptation_create_surface (ctx)) {
goto HANDLE_EGL_ERROR_LOCKED;
}
- ctx->eglglesctx.buffer_preserved = FALSE;
- if (eglQuerySurface (ctx->eglglesctx.display,
- ctx->eglglesctx.surface, EGL_SWAP_BEHAVIOR, &swap_behavior)) {
- GST_DEBUG_OBJECT (ctx->element, "Buffer swap behavior %x", swap_behavior);
- ctx->eglglesctx.buffer_preserved =
- swap_behavior == EGL_BUFFER_PRESERVED;
- } else {
- GST_DEBUG_OBJECT (ctx->element, "Can't query buffer swap behavior");
- }
+ gst_egl_adaptation_query_buffer_preserved (ctx);
if (!gst_egl_adaptation_context_make_current (ctx, TRUE))
goto HANDLE_EGL_ERROR_LOCKED;
- /* Save display's pixel aspect ratio
- *
- * 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.
- * or some other one time check. Right now it's being called once
- * per frame.
- */
- if (ctx->eglglesctx.egl_major == 1 &&
- ctx->eglglesctx.egl_minor < 2) {
- GST_DEBUG_OBJECT (ctx->element, "Can't query PAR. Using default: %dx%d",
- EGL_DISPLAY_SCALING, EGL_DISPLAY_SCALING);
- ctx->eglglesctx.pixel_aspect_ratio = EGL_DISPLAY_SCALING;
- } else {
- eglQuerySurface (ctx->eglglesctx.display,
- ctx->eglglesctx.surface, EGL_PIXEL_ASPECT_RATIO, &display_par);
- /* 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_DAR_MIN ||
- display_par > EGL_SANE_DAR_MAX) {
- GST_DEBUG_OBJECT (ctx->element, "Nonsensical PAR value returned: %d. "
- "Bad EGL implementation? "
- "Will use default: %d/%d", ctx->eglglesctx.pixel_aspect_ratio,
- EGL_DISPLAY_SCALING, EGL_DISPLAY_SCALING);
- ctx->eglglesctx.pixel_aspect_ratio = EGL_DISPLAY_SCALING;
- } else {
- ctx->eglglesctx.pixel_aspect_ratio = display_par;
- }
- }
+ gst_egl_adaptation_query_par (ctx);
/* Save surface dims */
gst_egl_adaptation_context_update_surface_dimensions (ctx);
@@ -741,7 +506,7 @@ gst_egl_adaptation_init_egl_surface (GstEglAdaptationContext * ctx,
case GST_VIDEO_FORMAT_AYUV:
frag_prog = (gchar *) frag_AYUV_prog;
free_frag_prog = FALSE;
- ctx->eglglesctx.n_textures = 1;
+ ctx->n_textures = 1;
texnames[0] = "tex";
break;
case GST_VIDEO_FORMAT_Y444:
@@ -751,7 +516,7 @@ gst_egl_adaptation_init_egl_surface (GstEglAdaptationContext * ctx,
case GST_VIDEO_FORMAT_Y41B:
frag_prog = (gchar *) frag_PLANAR_YUV_prog;
free_frag_prog = FALSE;
- ctx->eglglesctx.n_textures = 3;
+ ctx->n_textures = 3;
texnames[0] = "Ytex";
texnames[1] = "Utex";
texnames[2] = "Vtex";
@@ -759,35 +524,35 @@ gst_egl_adaptation_init_egl_surface (GstEglAdaptationContext * ctx,
case GST_VIDEO_FORMAT_YUY2:
frag_prog = g_strdup_printf (frag_YUY2_YVYU_UYVY_prog, 'r', 'g', 'a');
free_frag_prog = TRUE;
- ctx->eglglesctx.n_textures = 2;
+ ctx->n_textures = 2;
texnames[0] = "Ytex";
texnames[1] = "UVtex";
break;
case GST_VIDEO_FORMAT_YVYU:
frag_prog = g_strdup_printf (frag_YUY2_YVYU_UYVY_prog, 'r', 'a', 'g');
free_frag_prog = TRUE;
- ctx->eglglesctx.n_textures = 2;
+ ctx->n_textures = 2;
texnames[0] = "Ytex";
texnames[1] = "UVtex";
break;
case GST_VIDEO_FORMAT_UYVY:
frag_prog = g_strdup_printf (frag_YUY2_YVYU_UYVY_prog, 'a', 'r', 'b');
free_frag_prog = TRUE;
- ctx->eglglesctx.n_textures = 2;
+ ctx->n_textures = 2;
texnames[0] = "Ytex";
texnames[1] = "UVtex";
break;
case GST_VIDEO_FORMAT_NV12:
frag_prog = g_strdup_printf (frag_NV12_NV21_prog, 'r', 'a');
free_frag_prog = TRUE;
- ctx->eglglesctx.n_textures = 2;
+ ctx->n_textures = 2;
texnames[0] = "Ytex";
texnames[1] = "UVtex";
break;
case GST_VIDEO_FORMAT_NV21:
frag_prog = g_strdup_printf (frag_NV12_NV21_prog, 'a', 'r');
free_frag_prog = TRUE;
- ctx->eglglesctx.n_textures = 2;
+ ctx->n_textures = 2;
texnames[0] = "Ytex";
texnames[1] = "UVtex";
break;
@@ -796,21 +561,21 @@ gst_egl_adaptation_init_egl_surface (GstEglAdaptationContext * ctx,
case GST_VIDEO_FORMAT_BGRA:
frag_prog = g_strdup_printf (frag_REORDER_prog, 'b', 'g', 'r');
free_frag_prog = TRUE;
- ctx->eglglesctx.n_textures = 1;
+ ctx->n_textures = 1;
texnames[0] = "tex";
break;
case GST_VIDEO_FORMAT_xRGB:
case GST_VIDEO_FORMAT_ARGB:
frag_prog = g_strdup_printf (frag_REORDER_prog, 'g', 'b', 'a');
free_frag_prog = TRUE;
- ctx->eglglesctx.n_textures = 1;
+ ctx->n_textures = 1;
texnames[0] = "tex";
break;
case GST_VIDEO_FORMAT_xBGR:
case GST_VIDEO_FORMAT_ABGR:
frag_prog = g_strdup_printf (frag_REORDER_prog, 'a', 'b', 'g');
free_frag_prog = TRUE;
- ctx->eglglesctx.n_textures = 1;
+ ctx->n_textures = 1;
texnames[0] = "tex";
break;
case GST_VIDEO_FORMAT_RGB:
@@ -819,7 +584,7 @@ gst_egl_adaptation_init_egl_surface (GstEglAdaptationContext * ctx,
case GST_VIDEO_FORMAT_RGB16:
frag_prog = (gchar *) frag_COPY_prog;
free_frag_prog = FALSE;
- ctx->eglglesctx.n_textures = 1;
+ ctx->n_textures = 1;
texnames[0] = "tex";
break;
default:
@@ -828,9 +593,9 @@ gst_egl_adaptation_init_egl_surface (GstEglAdaptationContext * ctx,
}
if (!create_shader_program (ctx,
- &ctx->eglglesctx.glslprogram[0],
- &ctx->eglglesctx.vertshader[0],
- &ctx->eglglesctx.fragshader[0], vert_COPY_prog, frag_prog)) {
+ &ctx->glslprogram[0],
+ &ctx->vertshader[0],
+ &ctx->fragshader[0], vert_COPY_prog, frag_prog)) {
if (free_frag_prog)
g_free (frag_prog);
frag_prog = NULL;
@@ -840,39 +605,34 @@ gst_egl_adaptation_init_egl_surface (GstEglAdaptationContext * ctx,
g_free (frag_prog);
frag_prog = NULL;
- ctx->eglglesctx.position_loc[0] =
- glGetAttribLocation (ctx->eglglesctx.glslprogram[0], "position");
- ctx->eglglesctx.texpos_loc[0] =
- glGetAttribLocation (ctx->eglglesctx.glslprogram[0], "texpos");
+ ctx->position_loc[0] = glGetAttribLocation (ctx->glslprogram[0], "position");
+ ctx->texpos_loc[0] = glGetAttribLocation (ctx->glslprogram[0], "texpos");
- glEnableVertexAttribArray (ctx->eglglesctx.position_loc[0]);
+ glEnableVertexAttribArray (ctx->position_loc[0]);
if (got_gl_error ("glEnableVertexAttribArray"))
goto HANDLE_ERROR;
- glEnableVertexAttribArray (ctx->eglglesctx.texpos_loc[0]);
+ glEnableVertexAttribArray (ctx->texpos_loc[0]);
if (got_gl_error ("glEnableVertexAttribArray"))
goto HANDLE_ERROR;
- for (i = 0; i < ctx->eglglesctx.n_textures; i++) {
- ctx->eglglesctx.tex_loc[0][i] =
- glGetUniformLocation (ctx->eglglesctx.glslprogram[0],
- texnames[i]);
+ for (i = 0; i < ctx->n_textures; i++) {
+ ctx->tex_loc[0][i] =
+ glGetUniformLocation (ctx->glslprogram[0], texnames[i]);
}
- if (!ctx->eglglesctx.buffer_preserved) {
+ if (!ctx->buffer_preserved) {
/* Build shader program for black borders */
if (!create_shader_program (ctx,
- &ctx->eglglesctx.glslprogram[1],
- &ctx->eglglesctx.vertshader[1],
- &ctx->eglglesctx.fragshader[1], vert_COPY_prog_no_tex,
- frag_BLACK_prog))
+ &ctx->glslprogram[1],
+ &ctx->vertshader[1],
+ &ctx->fragshader[1], vert_COPY_prog_no_tex, frag_BLACK_prog))
goto HANDLE_ERROR;
- ctx->eglglesctx.position_loc[1] =
- glGetAttribLocation (ctx->eglglesctx.glslprogram[1],
- "position");
+ ctx->position_loc[1] =
+ glGetAttribLocation (ctx->glslprogram[1], "position");
- glEnableVertexAttribArray (ctx->eglglesctx.position_loc[1]);
+ glEnableVertexAttribArray (ctx->position_loc[1]);
if (got_gl_error ("glEnableVertexAttribArray"))
goto HANDLE_ERROR;
}
@@ -881,13 +641,12 @@ gst_egl_adaptation_init_egl_surface (GstEglAdaptationContext * ctx,
if (!ctx->have_texture) {
GST_INFO_OBJECT (ctx->element, "Performing initial texture setup");
- glGenTextures (ctx->eglglesctx.n_textures,
- ctx->eglglesctx.texture);
+ glGenTextures (ctx->n_textures, ctx->texture);
if (got_gl_error ("glGenTextures"))
goto HANDLE_ERROR_LOCKED;
- for (i = 0; i < ctx->eglglesctx.n_textures; i++) {
- glBindTexture (GL_TEXTURE_2D, ctx->eglglesctx.texture[i]);
+ for (i = 0; i < ctx->n_textures; i++) {
+ glBindTexture (GL_TEXTURE_2D, ctx->texture[i]);
if (got_gl_error ("glBindTexture"))
goto HANDLE_ERROR;
@@ -932,51 +691,27 @@ got_gl_error (const char *wtf)
return FALSE;
}
-
void
-gst_egl_adaptation_context_terminate_display (GstEglAdaptationContext * ctx)
+gst_egl_adaptation_context_set_window (GstEglAdaptationContext * ctx,
+ EGLNativeWindowType window)
{
- if (ctx->eglglesctx.display) {
- eglTerminate (ctx->eglglesctx.display);
- ctx->eglglesctx.display = NULL;
- }
+ ctx->window = window;
}
-void
-gst_egl_adaptation_context_bind_API (GstEglAdaptationContext * ctx)
+GLuint
+gst_egl_adaptation_context_get_texture (GstEglAdaptationContext * ctx, gint i)
{
- eglBindAPI (EGL_OPENGL_ES_API);
+ return ctx->texture[i];
}
-gboolean
-gst_egl_adaptation_context_swap_buffers (GstEglAdaptationContext * ctx)
+gint
+gst_egl_adaptation_context_get_surface_width (GstEglAdaptationContext * ctx)
{
- gboolean ret =
- eglSwapBuffers (ctx->eglglesctx.display, ctx->eglglesctx.surface);
- if (ret == EGL_FALSE) {
- got_egl_error ("eglSwapBuffers");
- }
- return ret;
+ return ctx->surface_width;
}
-/* Prints avilable EGL/GLES extensions
- * If another rendering path is implemented this is the place
- * where you want to check for the availability of its supporting
- * EGL/GLES extensions.
- */
-void
-gst_egl_adaptation_context_init_egl_exts (GstEglAdaptationContext * ctx)
+gint
+gst_egl_adaptation_context_get_surface_height (GstEglAdaptationContext * ctx)
{
- const char *eglexts;
- unsigned const char *glexts;
-
- eglexts = eglQueryString (ctx->eglglesctx.display, EGL_EXTENSIONS);
- glexts = glGetString (GL_EXTENSIONS);
-
- GST_DEBUG_OBJECT (ctx->element, "Available EGL extensions: %s\n",
- GST_STR_NULL (eglexts));
- GST_DEBUG_OBJECT (ctx->element, "Available GLES extensions: %s\n",
- GST_STR_NULL ((const char *) glexts));
-
- return;
+ return ctx->surface_height;
}