mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-24 10:41:04 +00:00
eglglessink: Caps nego EGL fixes
- Fix alloc lol on format list: Asked for 2 slices and used 3. - Reordered display & context init logic to prepare for actual config checking before claiming support for a given format. Change deals basically with setting up EGL display at start() and choose an EGL config only at setcaps time.
This commit is contained in:
parent
a8f60690aa
commit
59b1870ac1
1 changed files with 27 additions and 14 deletions
|
@ -263,6 +263,7 @@ static EGLint *gst_eglglesbuffer_create_native (EGLNativeWindowType win,
|
||||||
static EGLNativeWindowType gst_eglglessink_create_window (GstEglGlesSink *
|
static EGLNativeWindowType gst_eglglessink_create_window (GstEglGlesSink *
|
||||||
eglglessink, gint width, gint height);
|
eglglessink, gint width, gint height);
|
||||||
static gboolean gst_eglglessink_init_egl_display (GstEglGlesSink * eglglessink);
|
static gboolean gst_eglglessink_init_egl_display (GstEglGlesSink * eglglessink);
|
||||||
|
static gboolean gst_eglglessink_choose_config (GstEglGlesSink * eglglessink);
|
||||||
static gboolean gst_eglglessink_init_egl_surface (GstEglGlesSink * eglglessink);
|
static gboolean gst_eglglessink_init_egl_surface (GstEglGlesSink * eglglessink);
|
||||||
static void gst_eglglessink_init_egl_exts (GstEglGlesSink * eglglessink);
|
static void gst_eglglessink_init_egl_exts (GstEglGlesSink * eglglessink);
|
||||||
static gboolean gst_eglglessink_setup_vbo (GstEglGlesSink * eglglessink,
|
static gboolean gst_eglglessink_setup_vbo (GstEglGlesSink * eglglessink,
|
||||||
|
@ -514,10 +515,6 @@ gst_eglglesbuffer_get_type (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* This function is sort of meaningless right now as we
|
|
||||||
* Only Support one image format / caps but was left here
|
|
||||||
* as a reference for future improvements.
|
|
||||||
*/
|
|
||||||
static gint
|
static gint
|
||||||
gst_eglglessink_get_compat_format_from_caps (GstEglGlesSink * eglglessink,
|
gst_eglglessink_get_compat_format_from_caps (GstEglGlesSink * eglglessink,
|
||||||
GstCaps * caps)
|
GstCaps * caps)
|
||||||
|
@ -787,8 +784,12 @@ gst_eglglessink_start (GstBaseSink * sink)
|
||||||
goto HANDLE_ERROR;
|
goto HANDLE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!gst_eglglessink_init_egl_display (eglglessink)) {
|
||||||
|
GST_ERROR_OBJECT (eglglessink, "Couldn't init EGL display");
|
||||||
|
goto HANDLE_ERROR;
|
||||||
|
}
|
||||||
/* Init supported format/caps list */
|
/* Init supported format/caps list */
|
||||||
format = g_new0 (GstEglGlesImageFmt, 2);
|
format = g_new0 (GstEglGlesImageFmt, 3);
|
||||||
|
|
||||||
format->fmt = GST_EGLGLESSINK_IMAGE_RGB888;
|
format->fmt = GST_EGLGLESSINK_IMAGE_RGB888;
|
||||||
format->eglcfg = eglglessink_RGB888_config;
|
format->eglcfg = eglglessink_RGB888_config;
|
||||||
|
@ -1212,11 +1213,8 @@ HANDLE_ERROR:
|
||||||
static gboolean
|
static gboolean
|
||||||
gst_eglglessink_init_egl_display (GstEglGlesSink * eglglessink)
|
gst_eglglessink_init_egl_display (GstEglGlesSink * eglglessink)
|
||||||
{
|
{
|
||||||
GLint egl_configs;
|
|
||||||
EGLint egl_major, egl_minor;
|
EGLint egl_major, egl_minor;
|
||||||
|
|
||||||
EGLint con_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
|
|
||||||
|
|
||||||
GST_DEBUG_OBJECT (eglglessink, "Enter EGL initial configuration");
|
GST_DEBUG_OBJECT (eglglessink, "Enter EGL initial configuration");
|
||||||
|
|
||||||
eglglessink->display = eglGetDisplay (EGL_DEFAULT_DISPLAY);
|
eglglessink->display = eglGetDisplay (EGL_DEFAULT_DISPLAY);
|
||||||
|
@ -1241,6 +1239,24 @@ gst_eglglessink_init_egl_display (GstEglGlesSink * eglglessink)
|
||||||
GST_INFO_OBJECT (eglglessink, "System reports supported EGL version v%d.%d",
|
GST_INFO_OBJECT (eglglessink, "System reports supported EGL version v%d.%d",
|
||||||
egl_major, egl_minor);
|
egl_major, egl_minor);
|
||||||
|
|
||||||
|
eglBindAPI (EGL_OPENGL_ES_API);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
/* Errors */
|
||||||
|
HANDLE_EGL_ERROR:
|
||||||
|
GST_ERROR_OBJECT (eglglessink, "EGL call returned error %x", eglGetError ());
|
||||||
|
HANDLE_ERROR:
|
||||||
|
GST_ERROR_OBJECT (eglglessink, "Couldn't setup window/surface from handle");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
gst_eglglessink_choose_config (GstEglGlesSink * eglglessink)
|
||||||
|
{
|
||||||
|
EGLint con_attribs[] = { EGL_CONTEXT_CLIENT_VERSION, 2, EGL_NONE };
|
||||||
|
GLint egl_configs;
|
||||||
|
|
||||||
if (!eglChooseConfig (eglglessink->display, eglglessink->selected_fmt->eglcfg,
|
if (!eglChooseConfig (eglglessink->display, eglglessink->selected_fmt->eglcfg,
|
||||||
&eglglessink->config, 1, &egl_configs)) {
|
&eglglessink->config, 1, &egl_configs)) {
|
||||||
show_egl_error ("eglChooseConfig");
|
show_egl_error ("eglChooseConfig");
|
||||||
|
@ -1248,8 +1264,6 @@ gst_eglglessink_init_egl_display (GstEglGlesSink * eglglessink)
|
||||||
goto HANDLE_EGL_ERROR;
|
goto HANDLE_EGL_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
eglBindAPI (EGL_OPENGL_ES_API);
|
|
||||||
|
|
||||||
eglglessink->context = eglCreateContext (eglglessink->display,
|
eglglessink->context = eglCreateContext (eglglessink->display,
|
||||||
eglglessink->config, EGL_NO_CONTEXT, con_attribs);
|
eglglessink->config, EGL_NO_CONTEXT, con_attribs);
|
||||||
|
|
||||||
|
@ -1265,8 +1279,7 @@ gst_eglglessink_init_egl_display (GstEglGlesSink * eglglessink)
|
||||||
/* Errors */
|
/* Errors */
|
||||||
HANDLE_EGL_ERROR:
|
HANDLE_EGL_ERROR:
|
||||||
GST_ERROR_OBJECT (eglglessink, "EGL call returned error %x", eglGetError ());
|
GST_ERROR_OBJECT (eglglessink, "EGL call returned error %x", eglGetError ());
|
||||||
HANDLE_ERROR:
|
GST_ERROR_OBJECT (eglglessink, "Couldn't choose config");
|
||||||
GST_ERROR_OBJECT (eglglessink, "Couldn't setup window/surface from handle");
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1497,8 +1510,8 @@ gst_eglglessink_setcaps (GstBaseSink * bsink, GstCaps * caps)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!gst_eglglessink_init_egl_display (eglglessink)) {
|
if (!gst_eglglessink_choose_config (eglglessink)) {
|
||||||
GST_ERROR_OBJECT (eglglessink, "Couldn't init EGL display");
|
GST_ERROR_OBJECT (eglglessink, "Couldn't choose EGL config");
|
||||||
goto HANDLE_ERROR;
|
goto HANDLE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue