[486/906] libvisual-gl: add minimal support to libvisual plugins that uses Framebuffer objects

Fix bug #310775

gst-launch audiotestsrc ! libvisual_gl_projectM ! glimagesink is working
but for now you cannot append any other opengl filters between
libvisual_gl_projectM and glimagesink because our FBO is turned OFF.

It would require that libvisual allows to split rendering between
pass1,2,3... and final rendering. In order to unbind our FBO before
the passN, and then rebind it just before the final libvisual rendering.
This commit is contained in:
Julien Isorce 2011-12-22 15:30:38 +01:00 committed by Matthew Waters
parent 06d73faac4
commit 6f1530c658
2 changed files with 65 additions and 4 deletions

View file

@ -704,11 +704,34 @@ actor_negotiate (GstGLDisplay * display, GstVisualGL * visual)
err =
visual_video_set_dimension (visual->video, visual->width, visual->height);
if (err != VISUAL_OK)
g_warning ("failed to visual_video_set_depth\n");
g_warning ("failed to visual_video_set_dimension\n");
err = visual_actor_video_negotiate (visual->actor, 0, FALSE, FALSE);
if (err != VISUAL_OK)
g_warning ("failed to visual_video_set_depth\n");
g_warning ("failed to visual_actor_video_negotiate\n");
}
static void
check_gl_matrix (void)
{
GLdouble projection_matrix[16];
GLdouble modelview_matrix[16];
gint i = 0;
gint j = 0;
glGetDoublev (GL_PROJECTION_MATRIX, projection_matrix);
glGetDoublev (GL_MODELVIEW_MATRIX, modelview_matrix);
for (j = 0; j < 4; ++j) {
for (i = 0; i < 4; ++i) {
if (projection_matrix[i + 4 * j] != projection_matrix[i + 4 * j])
g_warning ("invalid projection matrix at coordiante %dx%d: %f\n", i, j,
projection_matrix[i + 4 * j]);
if (modelview_matrix[i + 4 * j] != modelview_matrix[i + 4 * j])
g_warning ("invalid modelview_matrix matrix at coordiante %dx%d: %f\n",
i, j, modelview_matrix[i + 4 * j]);
}
}
}
static void
@ -718,6 +741,7 @@ render_frame (gint width, gint height, guint texture, GstVisualGL * visual)
VisBuffer *lbuf, *rbuf;
guint16 ldata[VISUAL_SAMPLES], rdata[VISUAL_SAMPLES];
guint i;
//GLint current_fbo = 0;
/* Read VISUAL_SAMPLES samples per channel */
data =
@ -762,6 +786,18 @@ render_frame (gint width, gint height, guint texture, GstVisualGL * visual)
glPushMatrix ();
glLoadMatrixd (visual->actor_modelview_matrix);
/* This line try to hacks compatiblity with libprojectM
* You have to do that before calling glDrawBuffer(GL_BACK)
* Actually, at this point the current fbo is attached.
* then the folowing line unbind it.
* TODO: We have to rebind it just before final drawing
* if we want to append other glfilters after it.
*/
//glGetIntegerv(GL_FRAMEBUFFER_BINDING, &current_fbo);
if (g_ascii_strncasecmp (gst_element_get_name (GST_ELEMENT (visual)),
"visualglprojectm", 16) == 0)
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, 0);
actor_negotiate (visual->display, visual);
if (visual->is_enabled_gl_depth_test) {
@ -777,8 +813,17 @@ render_frame (gint width, gint height, guint texture, GstVisualGL * visual)
glMatrixMode (GL_MODELVIEW);
glScaled (1.0, -1.0, 1.0);
/* TODO: It should be possible to split libvisual rendering:
* framebuffer pass1,2,3 ... and final rendering
* This way we could rebind our fbo just before the
* final libvisual rendering
*/
//glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, current_fbo);
visual_actor_run (visual->actor, visual->audio);
check_gl_matrix ();
glMatrixMode (GL_PROJECTION);
glPopMatrix ();
@ -790,6 +835,12 @@ render_frame (gint width, gint height, guint texture, GstVisualGL * visual)
glDisable (GL_DEPTH_TEST);
glDisable (GL_BLEND);
/*glDisable (GL_LIGHT0);
glDisable (GL_LIGHTING);
glDisable (GL_POLYGON_OFFSET_FILL);
glDisable (GL_COLOR_MATERIAL);
glDisable (GL_CULL_FACE); */
GST_DEBUG_OBJECT (visual, "rendered one frame");
}
@ -959,8 +1010,8 @@ gst_visual_gl_change_state (GstElement * element, GstStateChange transition)
gst_visual_gl_reset (visual);
visual->actor =
visual_actor_new (GST_VISUAL_GL_GET_CLASS (visual)->plugin->
info->plugname);
visual_actor_new (GST_VISUAL_GL_GET_CLASS (visual)->plugin->info->
plugname);
visual->video = visual_video_new ();
visual->audio = visual_audio_new ();

View file

@ -1908,6 +1908,7 @@ gst_gl_display_on_draw (GstGLDisplay * display)
glEnable (GL_TEXTURE_RECTANGLE_ARB);
glBegin (GL_QUADS);
/* gst images are top-down while opengl plane is bottom-up */
glTexCoord2i (display->redisplay_texture_width, 0);
glVertex2f (1.0f, 1.0f);
glTexCoord2i (0, 0);
@ -1917,6 +1918,15 @@ gst_gl_display_on_draw (GstGLDisplay * display)
glTexCoord2i (display->redisplay_texture_width,
display->redisplay_texture_height);
glVertex2f (1.0f, -1.0f);
/*glTexCoord2i (display->redisplay_texture_width, 0);
glVertex2i (1, -1);
glTexCoord2i (0, 0);
glVertex2f (-1.0f, -1.0f);
glTexCoord2i (0, display->redisplay_texture_height);
glVertex2f (-1.0f, 1.0f);
glTexCoord2i (display->redisplay_texture_width,
display->redisplay_texture_height);
glVertex2f (1.0f, 1.0f); */
glEnd ();
glDisable (GL_TEXTURE_RECTANGLE_ARB);