summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthew Waters <matthew@centricular.com>2016-02-17 20:51:03 +1100
committerMatthew Waters <matthew@centricular.com>2016-02-17 20:59:58 +1100
commit705d7722fbe05da17f2bedfdc34476382687c95f (patch)
tree675a103df40fc778e49a770303e695bb98e5ef0a
parente4ff24a907000beeeceff9e1b193d6aa83cb8e48 (diff)
examples: update egl example for gstgl API changes
https://bugzilla.gnome.org/show_bug.cgi?id=762053 https://bugzilla.gnome.org/show_bug.cgi?id=753917
-rw-r--r--examples/egl/testegl.c63
1 files changed, 27 insertions, 36 deletions
diff --git a/examples/egl/testegl.c b/examples/egl/testegl.c
index 99aa810..29214d6 100644
--- a/examples/egl/testegl.c
+++ b/examples/egl/testegl.c
@@ -323,6 +323,7 @@ typedef struct
GstElement *pipeline;
GstElement *vsink;
GstGLDisplayEGL *gst_display;
+ GstGLContext *gl_context;
gboolean can_avoid_upload;
/* Interthread comunication */
@@ -487,6 +488,11 @@ init_ogl (APP_STATE_T * state)
eglMakeCurrent (state->display, state->surface, state->surface,
state->context);
assert (EGL_FALSE != result);
+
+ state->gst_display = gst_gl_display_egl_new_with_egl_display (state->display);
+ state->gl_context =
+ gst_gl_context_new_wrapped (GST_GL_DISPLAY (state->gst_display),
+ (guintptr) state->context, GST_GL_PLATFORM_EGL, GST_GL_API_GLES2);
}
/***********************************************************
@@ -726,13 +732,17 @@ init_textures (APP_STATE_T * state, GstBuffer * buffer)
} else if (gst_caps_features_contains (feature,
"meta:GstVideoGLTextureUploadMeta")) {
GstVideoMeta *meta = NULL;
+ guint internal_format =
+ gst_gl_sized_gl_format_from_gl_format_type (state->gl_context,
+ GL_RGBA, GL_UNSIGNED_BYTE);
+
g_print ("Prepare texture for GstVideoGLTextureUploadMeta\n");
meta = gst_buffer_get_video_meta (buffer);
state->can_avoid_upload = FALSE;
glGenTextures (1, &state->tex);
glBindTexture (GL_TEXTURE_2D, state->tex);
- glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA8, meta->width, meta->height, 0,
- GL_RGBA, GL_UNSIGNED_BYTE, NULL);
+ glTexImage2D (GL_TEXTURE_2D, 0, internal_format, meta->width, meta->height,
+ 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
} else {
g_assert_not_reached ();
}
@@ -1050,36 +1060,14 @@ query_cb (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
{
APP_STATE_T *state = (APP_STATE_T *) user_data;
GstQuery *query = GST_PAD_PROBE_INFO_QUERY (info);
- GstStructure *external_gl_context_desc = NULL;
- gchar *platform = NULL;
- gchar *gl_apis = NULL;
switch (GST_QUERY_TYPE (query)) {
- case GST_QUERY_ALLOCATION:
- {
- platform = gst_gl_platform_to_string (GST_GL_PLATFORM_EGL);
- gl_apis = gst_gl_api_to_string (GST_GL_API_GLES2);
-
- external_gl_context_desc =
- gst_structure_new ("GstVideoGLTextureUploadMeta",
- "gst.gl.context.handle", G_TYPE_POINTER, state->context,
- "gst.gl.context.type", G_TYPE_STRING, platform,
- "gst.gl.context.apis", G_TYPE_STRING, gl_apis, NULL);
- gst_query_add_allocation_meta (query,
- GST_VIDEO_GL_TEXTURE_UPLOAD_META_API_TYPE, external_gl_context_desc);
- gst_structure_free (external_gl_context_desc);
-
- g_free (gl_apis);
- g_free (platform);
-
- GST_DEBUG ("done alocation");
- return GST_PAD_PROBE_OK;
- break;
- }
case GST_QUERY_CONTEXT:
{
- return gst_gl_handle_context_query (state->pipeline, query,
- (GstGLDisplay **) & state->gst_display);
+ if (gst_gl_handle_context_query (state->pipeline, query,
+ (GstGLDisplay **) & state->gst_display,
+ (GstGLContext **) & state->gl_context))
+ return GST_PAD_PROBE_HANDLED;
break;
}
case GST_QUERY_DRAIN:
@@ -1103,16 +1091,20 @@ init_playbin_player (APP_STATE_T * state, const gchar * uri)
/* insert a gl filter so that the GstGLBufferPool
* is managed automatically */
- GstElement *glfilter = gst_element_factory_make ("glcolorscale", "glfilter");
+ GstElement *glfilter = gst_element_factory_make ("glupload", "glfilter");
+ GstElement *capsfilter = gst_element_factory_make ("capsfilter", NULL);
GstElement *vsink = gst_element_factory_make ("fakesink", "vsink");
+
+ g_object_set (capsfilter, "caps",
+ gst_caps_from_string ("video/x-raw(memory:GLMemory)"), NULL);
g_object_set (vsink, "sync", TRUE, "silent", TRUE, "qos", TRUE,
- "enable-last-sample", FALSE,
- "max-lateness", 20 * GST_MSECOND, "signal-handoffs", TRUE, NULL);
+ "enable-last-sample", FALSE, "max-lateness", 20 * GST_MSECOND,
+ "signal-handoffs", TRUE, NULL);
g_signal_connect (vsink, "preroll-handoff", G_CALLBACK (preroll_cb), state);
g_signal_connect (vsink, "handoff", G_CALLBACK (buffers_cb), state);
- gst_bin_add_many (GST_BIN (vbin), glfilter, vsink, NULL);
+ gst_bin_add_many (GST_BIN (vbin), glfilter, capsfilter, vsink, NULL);
pad = gst_element_get_static_pad (glfilter, "sink");
ghostpad = gst_ghost_pad_new ("sink", pad);
@@ -1126,7 +1118,8 @@ init_playbin_player (APP_STATE_T * state, const gchar * uri)
NULL);
gst_object_unref (pad);
- gst_element_link (glfilter, vsink);
+ gst_element_link (glfilter, capsfilter);
+ gst_element_link (capsfilter, vsink);
/* Instantiate and configure playbin */
state->pipeline = gst_element_factory_make ("playbin", "player");
@@ -1420,6 +1413,7 @@ close_ogl (void)
EGL_NO_CONTEXT);
eglDestroySurface (state->display, state->surface);
eglDestroyContext (state->display, state->context);
+ gst_object_unref (state->gl_context);
gst_object_unref (state->gst_display);
#if defined (USE_OMX_TARGET_RPI)
@@ -1445,9 +1439,6 @@ open_ogl (void)
/* Create surface and gl context */
init_ogl (state);
TRACE_VC_MEMORY ("after init_ogl");
-
- /* Wrap the EGLDisplay to GstGLDisplayEGL */
- state->gst_display = gst_gl_display_egl_new_with_egl_display (state->display);
}
static gpointer