//opengl scene, params: input texture (not the output filter->texture) static void gst_gl_deinterlace_callback (gint width, gint height, guint texture, gpointer stuff) { GstGLDeinterlace *deinterlace_filter = GST_GL_DEINTERLACE (stuff); GstGLFilter *filter = GST_GL_FILTER (stuff); GstGLBuffer *gl_buffer_prev = deinterlace_filter->gl_buffer_prev; glMatrixMode (GL_PROJECTION); glLoadIdentity (); gst_gl_shader_use (deinterlace_filter->shader); glEnable (GL_TEXTURE_RECTANGLE_ARB); if (gl_buffer_prev) { glActiveTexture (GL_TEXTURE1_ARB); gst_gl_shader_set_uniform_1i (deinterlace_filter->shader, "tex_prev", 1); glBindTexture (GL_TEXTURE_RECTANGLE_ARB, gl_buffer_prev->texture); } glActiveTexture (GL_TEXTURE0_ARB); gst_gl_shader_set_uniform_1i (deinterlace_filter->shader, "tex", 0); glBindTexture (GL_TEXTURE_RECTANGLE_ARB, texture); gst_gl_shader_set_uniform_1f (deinterlace_filter->shader, "max_comb", 5.0f / 255.0f); gst_gl_shader_set_uniform_1f (deinterlace_filter->shader, "motion_threshold", 25.0f / 255.0f); gst_gl_shader_set_uniform_1f (deinterlace_filter->shader, "motion_sense", 30.0f / 255.0f); gst_gl_shader_set_uniform_1i (deinterlace_filter->shader, "width", filter->width); gst_gl_shader_set_uniform_1i (deinterlace_filter->shader, "height", filter->height); glBegin (GL_QUADS); glMultiTexCoord2iARB (GL_TEXTURE0_ARB, 0, 0); glMultiTexCoord2iARB (GL_TEXTURE1_ARB, 0, 0); glVertex2i (-1, -1); glMultiTexCoord2iARB (GL_TEXTURE0_ARB, width, 0); glMultiTexCoord2iARB (GL_TEXTURE1_ARB, width, 0); glVertex2i (1, -1); glMultiTexCoord2iARB (GL_TEXTURE0_ARB, width, height); glMultiTexCoord2iARB (GL_TEXTURE1_ARB, width, height); glVertex2i (1, 1); glMultiTexCoord2iARB (GL_TEXTURE0_ARB, 0, height); glMultiTexCoord2iARB (GL_TEXTURE1_ARB, 0, height); glVertex2i (-1, 1); glEnd (); glDisable (GL_TEXTURE_RECTANGLE_ARB); }
void __stdcall glMultiTexCoord2i(GLenum target, GLint s, GLint t) { if (!ARB_multitexture) return; glMultiTexCoord2iARB(target, s, t); }