eglglessink: Generate the sink caps exactly once

This commit is contained in:
Sebastian Dröge 2012-09-24 11:48:59 +02:00
parent ad6e314a6e
commit 15c93da54e
2 changed files with 24 additions and 17 deletions

View file

@ -294,7 +294,7 @@ enum
}; };
/* will probably move elsewhere */ /* will probably move elsewhere */
static EGLint eglglessink_RGBA8888_attribs[] = { static const EGLint eglglessink_RGBA8888_attribs[] = {
EGL_RED_SIZE, 8, EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 8, EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE, 8, EGL_BLUE_SIZE, 8,
@ -304,7 +304,7 @@ static EGLint eglglessink_RGBA8888_attribs[] = {
EGL_NONE EGL_NONE
}; };
static EGLint eglglessink_RGB888_attribs[] = { static const EGLint eglglessink_RGB888_attribs[] = {
EGL_RED_SIZE, 8, EGL_RED_SIZE, 8,
EGL_GREEN_SIZE, 8, EGL_GREEN_SIZE, 8,
EGL_BLUE_SIZE, 8, EGL_BLUE_SIZE, 8,
@ -313,7 +313,7 @@ static EGLint eglglessink_RGB888_attribs[] = {
EGL_NONE EGL_NONE
}; };
static EGLint eglglessink_RGB565_attribs[] = { static const EGLint eglglessink_RGB565_attribs[] = {
EGL_RED_SIZE, 5, EGL_RED_SIZE, 5,
EGL_GREEN_SIZE, 6, EGL_GREEN_SIZE, 6,
EGL_BLUE_SIZE, 5, EGL_BLUE_SIZE, 5,
@ -885,6 +885,7 @@ gst_eglglessink_fill_supported_fbuffer_configs (GstEglGlesSink * eglglessink)
gint ret = 0; gint ret = 0;
EGLint cfg_number; EGLint cfg_number;
GstEglGlesImageFmt *format; GstEglGlesImageFmt *format;
GstCaps *caps;
GST_DEBUG_OBJECT (eglglessink, GST_DEBUG_OBJECT (eglglessink,
"Building initial list of wanted eglattribs per format"); "Building initial list of wanted eglattribs per format");
@ -892,6 +893,8 @@ gst_eglglessink_fill_supported_fbuffer_configs (GstEglGlesSink * eglglessink)
/* Init supported format/caps list */ /* Init supported format/caps list */
g_mutex_lock (eglglessink->flow_lock); g_mutex_lock (eglglessink->flow_lock);
caps = gst_caps_new_empty ();
if (eglChooseConfig (eglglessink->display, eglglessink_RGBA8888_attribs, if (eglChooseConfig (eglglessink->display, eglglessink_RGBA8888_attribs,
NULL, 1, &cfg_number) != EGL_FALSE) { NULL, 1, &cfg_number) != EGL_FALSE) {
format = g_new0 (GstEglGlesImageFmt, 1); format = g_new0 (GstEglGlesImageFmt, 1);
@ -935,10 +938,11 @@ gst_eglglessink_fill_supported_fbuffer_configs (GstEglGlesSink * eglglessink)
eglglessink->supported_fmts = eglglessink->supported_fmts =
g_list_append (eglglessink->supported_fmts, format); g_list_append (eglglessink->supported_fmts, format);
ret++; ret++;
gst_caps_append (caps, gst_caps_ref (format->caps));
} else } else {
GST_INFO_OBJECT (eglglessink, GST_INFO_OBJECT (eglglessink,
"EGL display doesn't support RGBA8888 config"); "EGL display doesn't support RGBA8888 config");
}
if (eglChooseConfig (eglglessink->display, eglglessink_RGB888_attribs, if (eglChooseConfig (eglglessink->display, eglglessink_RGB888_attribs,
NULL, 1, &cfg_number) != EGL_FALSE) { NULL, 1, &cfg_number) != EGL_FALSE) {
@ -951,8 +955,10 @@ gst_eglglessink_fill_supported_fbuffer_configs (GstEglGlesSink * eglglessink)
eglglessink->supported_fmts = eglglessink->supported_fmts =
g_list_append (eglglessink->supported_fmts, format); g_list_append (eglglessink->supported_fmts, format);
ret++; ret++;
} else gst_caps_append (caps, gst_caps_ref (format->caps));
} else {
GST_INFO_OBJECT (eglglessink, "EGL display doesn't support RGB888 config"); GST_INFO_OBJECT (eglglessink, "EGL display doesn't support RGB888 config");
}
if (eglChooseConfig (eglglessink->display, eglglessink_RGB565_attribs, if (eglChooseConfig (eglglessink->display, eglglessink_RGB565_attribs,
NULL, 1, &cfg_number) != EGL_FALSE) { NULL, 1, &cfg_number) != EGL_FALSE) {
@ -963,8 +969,13 @@ gst_eglglessink_fill_supported_fbuffer_configs (GstEglGlesSink * eglglessink)
eglglessink->supported_fmts = eglglessink->supported_fmts =
g_list_append (eglglessink->supported_fmts, format); g_list_append (eglglessink->supported_fmts, format);
ret++; ret++;
} else gst_caps_append (caps, gst_caps_ref (format->caps));
} else {
GST_INFO_OBJECT (eglglessink, "EGL display doesn't support RGB565 config"); GST_INFO_OBJECT (eglglessink, "EGL display doesn't support RGB565 config");
}
gst_caps_replace (&eglglessink->sinkcaps, caps);
gst_caps_unref (caps);
g_mutex_unlock (eglglessink->flow_lock); g_mutex_unlock (eglglessink->flow_lock);
@ -1064,6 +1075,9 @@ gst_eglglessink_stop (GstBaseSink * sink)
if (eglglessink->using_own_window) if (eglglessink->using_own_window)
platform_destroy_native_window (eglglessink->display, eglglessink->window); platform_destroy_native_window (eglglessink->display, eglglessink->window);
gst_caps_unref (eglglessink->sinkcaps);
eglglessink->sinkcaps = NULL;
g_mutex_free (eglglessink->flow_lock); g_mutex_free (eglglessink->flow_lock);
eglglessink->flow_lock = NULL; eglglessink->flow_lock = NULL;
@ -2034,16 +2048,8 @@ gst_eglglessink_getcaps (GstBaseSink * bsink)
eglglessink = GST_EGLGLESSINK (bsink); eglglessink = GST_EGLGLESSINK (bsink);
g_mutex_lock (eglglessink->flow_lock); g_mutex_lock (eglglessink->flow_lock);
if (eglglessink->egl_started) { if (eglglessink->sinkcaps) {
GList *l; ret = gst_caps_ref (eglglessink->sinkcaps);
ret = gst_caps_new_empty ();
for (l = eglglessink->supported_fmts; l; l = l->next) {
GstEglGlesImageFmt *format = l->data;
gst_caps_append (ret, gst_caps_ref (format->caps));
}
} else { } else {
ret = ret =
gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SINK_PAD gst_caps_copy (gst_pad_get_pad_template_caps (GST_BASE_SINK_PAD

View file

@ -130,6 +130,7 @@ struct _GstEglGlesSink
GstVideoRectangle display_region; GstVideoRectangle display_region;
GList *supported_fmts; GList *supported_fmts;
GstEglGlesImageFmt *selected_fmt; GstEglGlesImageFmt *selected_fmt;
GstCaps *sinkcaps;
GMutex *flow_lock; GMutex *flow_lock;