/* Called in the gl thread */ static void gst_glimage_sink_thread_init_redisplay (GstGLImageSink * gl_sink) { GError *error = NULL; gl_sink->redisplay_shader = gst_gl_shader_new (gl_sink->context); gst_gl_shader_set_vertex_source (gl_sink->redisplay_shader, redisplay_vertex_shader_str_gles2); gst_gl_shader_set_fragment_source (gl_sink->redisplay_shader, redisplay_fragment_shader_str_gles2); gst_gl_shader_compile (gl_sink->redisplay_shader, &error); if (error) { gst_gl_context_set_error (gl_sink->context, "%s", error->message); g_error_free (error); error = NULL; gst_gl_context_clear_shader (gl_sink->context); } else { gl_sink->redisplay_attr_position_loc = gst_gl_shader_get_attribute_location (gl_sink->redisplay_shader, "a_position"); gl_sink->redisplay_attr_texture_loc = gst_gl_shader_get_attribute_location (gl_sink->redisplay_shader, "a_texCoord"); } }
static void init (gpointer data) { GstGLContext *context = data; /* has to be called in the thread that is going to use the framebuffer */ fbo = gst_gl_framebuffer_new (context); gst_gl_framebuffer_generate (fbo, 320, 240, &fbo_id, &rbo); fail_if (fbo == NULL || fbo_id == 0, "failed to create framebuffer object"); gst_gl_context_gen_texture (context, &tex, GST_VIDEO_FORMAT_RGBA, 320, 240); fail_if (tex == 0, "failed to create texture"); #if GST_GL_HAVE_GLES2 if (gst_gl_context_get_gl_api (context) & GST_GL_API_GLES2) { shader = gst_gl_shader_new (context); fail_if (shader == NULL, "failed to create shader object"); gst_gl_shader_set_vertex_source (shader, vertex_shader_str_gles2); gst_gl_shader_set_fragment_source (shader, fragment_shader_str_gles2); error = NULL; gst_gl_shader_compile (shader, &error); fail_if (error != NULL, "Error compiling shader %s\n", error ? error->message : "Unknown Error"); shader_attr_position_loc = gst_gl_shader_get_attribute_location (shader, "a_position"); shader_attr_texture_loc = gst_gl_shader_get_attribute_location (shader, "a_texCoord"); } #endif }
static void _compile_shader (GstGLContext * context, GstGLShader ** shader) { GError *error = NULL; gst_gl_shader_compile (*shader, &error); if (error) { gst_gl_context_set_error (context, "%s", error->message); g_error_free (error); error = NULL; gst_gl_context_clear_shader (context); gst_object_unref (*shader); *shader = NULL; } }
static void init (gpointer data) { #if GST_GL_HAVE_GLES2 if (gst_gl_context_get_gl_api (context) & GST_GL_API_GLES2) { shader = gst_gl_shader_new (context); fail_if (shader == NULL, "failed to create shader object"); gst_gl_shader_set_vertex_source (shader, vertex_shader_str_gles2); gst_gl_shader_set_fragment_source (shader, fragment_shader_str_gles2); error = NULL; gst_gl_shader_compile (shader, &error); fail_if (error != NULL, "Error compiling shader %s\n", error ? error->message : "Unknown Error"); shader_attr_position_loc = gst_gl_shader_get_attribute_location (shader, "a_position"); shader_attr_texture_loc = gst_gl_shader_get_attribute_location (shader, "a_texCoord"); } #endif }