static gboolean gst_gl_filter_cube_filter_texture (GstGLFilter * filter, guint in_tex, guint out_tex) { GstGLFilterCube *cube_filter = GST_GL_FILTER_CUBE (filter); GLCB cb = NULL; GstGLAPI api; api = gst_gl_context_get_gl_api (GST_GL_FILTER (cube_filter)->context); #if GST_GL_HAVE_OPENGL if (api & GST_GL_API_OPENGL) cb = _callback_opengl; #endif #if GST_GL_HAVE_GLES2 if (api & GST_GL_API_GLES2) cb = _callback_gles2; #endif /* blocking call, use a FBO */ gst_gl_context_use_fbo (filter->context, GST_VIDEO_INFO_WIDTH (&filter->out_info), GST_VIDEO_INFO_HEIGHT (&filter->out_info), filter->fbo, filter->depthbuffer, out_tex, cb, GST_VIDEO_INFO_WIDTH (&filter->in_info), GST_VIDEO_INFO_HEIGHT (&filter->in_info), in_tex, cube_filter->fovy, cube_filter->aspect, cube_filter->znear, cube_filter->zfar, GST_GL_DISPLAY_PROJECTION_PERSPECTIVE, (gpointer) cube_filter); return TRUE; }
/** * gst_gl_filter_render_to_target: * @filter: a #GstGLFilter * @resize: whether to automatically resize the texture between the input size * and the output size * @input: the input texture * @target: the output texture * @func: the function to transform @input into @output. called with @data * @data: the data associated with @func * * Transforms @input into @output using @func on through FBO. @resize should * only ever be %TRUE whenever @input is the input texture of @filter. */ void gst_gl_filter_render_to_target (GstGLFilter * filter, gboolean resize, GLuint input, GLuint target, GLCB func, gpointer data) { guint in_width, in_height, out_width, out_height; out_width = GST_VIDEO_INFO_WIDTH (&filter->out_info); out_height = GST_VIDEO_INFO_HEIGHT (&filter->out_info); if (resize) { in_width = GST_VIDEO_INFO_WIDTH (&filter->in_info); in_height = GST_VIDEO_INFO_HEIGHT (&filter->in_info); } else { in_width = out_width; in_height = out_height; } GST_LOG ("rendering to target. in %u, %ux%u out %u, %ux%u", input, in_width, in_height, target, out_width, out_height); gst_gl_context_use_fbo (filter->context, out_width, out_height, filter->fbo, filter->depthbuffer, target, func, in_width, in_height, input, 0, in_width, 0, in_height, GST_GL_DISPLAY_PROJECTION_ORTHO2D, data); }
static gboolean gst_gl_bumper_filter_texture (GstGLFilter * filter, guint in_tex, guint out_tex) { gpointer bumper_filter = GST_GL_BUMPER (filter); //blocking call, use a FBO gst_gl_context_use_fbo (filter->context, GST_VIDEO_INFO_WIDTH (&filter->out_info), GST_VIDEO_INFO_HEIGHT (&filter->out_info), filter->fbo, filter->depthbuffer, out_tex, gst_gl_bumper_callback, GST_VIDEO_INFO_WIDTH (&filter->in_info), GST_VIDEO_INFO_HEIGHT (&filter->in_info), in_tex, 45, (gdouble) GST_VIDEO_INFO_WIDTH (&filter->out_info) / (gdouble) GST_VIDEO_INFO_HEIGHT (&filter->out_info), 0.1, 50, GST_GL_DISPLAY_PROJECTION_PERSPECTIVE, bumper_filter); return TRUE; }
static gboolean gst_gl_filter_reflected_screen_filter_texture (GstGLFilter * filter, guint in_tex, guint out_tex) { GstGLFilterReflectedScreen *reflected_screen_filter = GST_GL_FILTER_REFLECTED_SCREEN (filter); //blocking call, use a FBO gst_gl_context_use_fbo (filter->context, GST_VIDEO_INFO_WIDTH (&filter->out_info), GST_VIDEO_INFO_HEIGHT (&filter->out_info), filter->fbo, filter->depthbuffer, out_tex, gst_gl_filter_reflected_screen_callback, GST_VIDEO_INFO_WIDTH (&filter->in_info), GST_VIDEO_INFO_HEIGHT (&filter->in_info), in_tex, reflected_screen_filter->fovy, reflected_screen_filter->aspect, reflected_screen_filter->znear, reflected_screen_filter->zfar, GST_GL_DISPLAY_PROJECTION_PERSPECTIVE, (gpointer) reflected_screen_filter); return TRUE; }