mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-10 03:19:40 +00:00
[107/906] fix opengl version checker
git-svn-id: svn://svn.wobow.com/GStreamer_playground/gst-plugins-gl@534 93df14bb-0f41-7a43-8087-d3e2a2f0e464
This commit is contained in:
parent
6fe0a756a1
commit
04946b3f1d
1 changed files with 163 additions and 160 deletions
|
@ -1,4 +1,4 @@
|
||||||
/*
|
/*
|
||||||
* GStreamer
|
* GStreamer
|
||||||
* Copyright (C) 2008 Julien Isorce <julien.isorce@gmail.com>
|
* Copyright (C) 2008 Julien Isorce <julien.isorce@gmail.com>
|
||||||
*
|
*
|
||||||
|
@ -64,7 +64,7 @@ GST_BOILERPLATE (GstGLDisplay, gst_gl_display, GObject, G_TYPE_OBJECT);
|
||||||
|
|
||||||
//------------------------------------------------------------
|
//------------------------------------------------------------
|
||||||
//-------------------- Glut context management ---------------
|
//-------------------- Glut context management ---------------
|
||||||
//------------------------------------------------------------
|
//------------------------------------------------------------
|
||||||
|
|
||||||
//(key=int glutWinId) and (value=GstGLDisplay *display)
|
//(key=int glutWinId) and (value=GstGLDisplay *display)
|
||||||
static GHashTable *gst_gl_display_map = NULL;
|
static GHashTable *gst_gl_display_map = NULL;
|
||||||
|
@ -87,7 +87,7 @@ gst_gl_display_base_init (gpointer g_class)
|
||||||
|
|
||||||
static void
|
static void
|
||||||
gst_gl_display_class_init (GstGLDisplayClass * klass)
|
gst_gl_display_class_init (GstGLDisplayClass * klass)
|
||||||
{
|
{
|
||||||
G_OBJECT_CLASS (klass)->finalize = gst_gl_display_finalize;
|
G_OBJECT_CLASS (klass)->finalize = gst_gl_display_finalize;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -219,7 +219,7 @@ gst_gl_display_init (GstGLDisplay *display, GstGLDisplayClass *klass)
|
||||||
"uniform sampler2DRect Ytex, UVtex;\n"
|
"uniform sampler2DRect Ytex, UVtex;\n"
|
||||||
"void main(void) {\n"
|
"void main(void) {\n"
|
||||||
" float fx, fy, y, u, v, r, g, b;\n"
|
" float fx, fy, y, u, v, r, g, b;\n"
|
||||||
" fx = gl_TexCoord[0].x;\n"
|
" fx = gl_TexCoord[0].x;\n"
|
||||||
" fy = gl_TexCoord[0].y;\n"
|
" fy = gl_TexCoord[0].y;\n"
|
||||||
" y = texture2DRect(Ytex,vec2(fx,fy)).%c;\n"
|
" y = texture2DRect(Ytex,vec2(fx,fy)).%c;\n"
|
||||||
" u = texture2DRect(UVtex,vec2(fx*0.5,fy)).%c;\n"
|
" u = texture2DRect(UVtex,vec2(fx*0.5,fy)).%c;\n"
|
||||||
|
@ -273,7 +273,7 @@ gst_gl_display_init (GstGLDisplay *display, GstGLDisplayClass *klass)
|
||||||
"uniform sampler2DRect tex;\n"
|
"uniform sampler2DRect tex;\n"
|
||||||
"void main(void) {\n"
|
"void main(void) {\n"
|
||||||
" float fx,fy,r,g,b,r2,g2,b2,y1,y2,u,v;\n"
|
" float fx,fy,r,g,b,r2,g2,b2,y1,y2,u,v;\n"
|
||||||
" fx = gl_TexCoord[0].x;\n"
|
" fx = gl_TexCoord[0].x;\n"
|
||||||
" fy = gl_TexCoord[0].y;\n"
|
" fy = gl_TexCoord[0].y;\n"
|
||||||
" r=texture2DRect(tex,vec2(fx*2.0,fy)).r;\n"
|
" r=texture2DRect(tex,vec2(fx*2.0,fy)).r;\n"
|
||||||
" g=texture2DRect(tex,vec2(fx*2.0,fy)).g;\n"
|
" g=texture2DRect(tex,vec2(fx*2.0,fy)).g;\n"
|
||||||
|
@ -338,7 +338,7 @@ static void
|
||||||
gst_gl_display_finalize (GObject *object)
|
gst_gl_display_finalize (GObject *object)
|
||||||
{
|
{
|
||||||
GstGLDisplay *display = GST_GL_DISPLAY (object);
|
GstGLDisplay *display = GST_GL_DISPLAY (object);
|
||||||
|
|
||||||
//request glut window destruction
|
//request glut window destruction
|
||||||
//blocking call because display must be alive
|
//blocking call because display must be alive
|
||||||
gst_gl_display_lock (display);
|
gst_gl_display_lock (display);
|
||||||
|
@ -349,12 +349,12 @@ gst_gl_display_finalize (GObject *object)
|
||||||
if (display->texturePool) {
|
if (display->texturePool) {
|
||||||
g_queue_free (display->texturePool);
|
g_queue_free (display->texturePool);
|
||||||
display->texturePool = NULL;
|
display->texturePool = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (display->title) {
|
if (display->title) {
|
||||||
g_string_free (display->title, TRUE);
|
g_string_free (display->title, TRUE);
|
||||||
display->title = NULL;
|
display->title = NULL;
|
||||||
}
|
}
|
||||||
if (display->mutex) {
|
if (display->mutex) {
|
||||||
g_mutex_free (display->mutex);
|
g_mutex_free (display->mutex);
|
||||||
display->mutex = NULL;
|
display->mutex = NULL;
|
||||||
|
@ -423,8 +423,8 @@ gst_gl_display_finalize (GObject *object)
|
||||||
display->p1 = NULL;
|
display->p1 = NULL;
|
||||||
if (display->p2)
|
if (display->p2)
|
||||||
display->p2 = NULL;
|
display->p2 = NULL;
|
||||||
|
|
||||||
//at this step, the next condition imply that the last display has been pushed
|
//at this step, the next condition imply that the last display has been pushed
|
||||||
if (g_hash_table_size (gst_gl_display_map) == 0)
|
if (g_hash_table_size (gst_gl_display_map) == 0)
|
||||||
{
|
{
|
||||||
g_thread_join (gst_gl_display_glutThread);
|
g_thread_join (gst_gl_display_glutThread);
|
||||||
|
@ -441,14 +441,14 @@ static gpointer
|
||||||
gst_gl_display_glutThreadFunc (GstGLDisplay *display)
|
gst_gl_display_glutThreadFunc (GstGLDisplay *display)
|
||||||
{
|
{
|
||||||
static char *argv = "gst-launch-0.10";
|
static char *argv = "gst-launch-0.10";
|
||||||
static gint argc = 1;
|
static gint argc = 1;
|
||||||
|
|
||||||
//-display DISPLAY
|
//-display DISPLAY
|
||||||
//Specify the X server to connect to. If not specified, the value of the DISPLAY environment variable is used.
|
//Specify the X server to connect to. If not specified, the value of the DISPLAY environment variable is used.
|
||||||
//Should be pass through a glimagesink property
|
//Should be pass through a glimagesink property
|
||||||
glutInit(&argc, &argv);
|
glutInit(&argc, &argv);
|
||||||
glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION);
|
glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_CONTINUE_EXECUTION);
|
||||||
|
|
||||||
glutIdleFunc (gst_gl_display_glut_idle);
|
glutIdleFunc (gst_gl_display_glut_idle);
|
||||||
|
|
||||||
gst_gl_display_lock (display);
|
gst_gl_display_lock (display);
|
||||||
|
@ -474,7 +474,7 @@ gst_gl_display_glutCreateWindow (GstGLDisplay *display)
|
||||||
//prepare opengl context
|
//prepare opengl context
|
||||||
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
|
glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH);
|
||||||
glutInitWindowPosition(display->win_xpos, display->win_ypos);
|
glutInitWindowPosition(display->win_xpos, display->win_ypos);
|
||||||
glutInitWindowSize(display->glcontext_width, display->glcontext_height);
|
glutInitWindowSize(display->glcontext_width, display->glcontext_height);
|
||||||
|
|
||||||
//create opengl context
|
//create opengl context
|
||||||
sprintf(buffer, "%d", glutWinId);
|
sprintf(buffer, "%d", glutWinId);
|
||||||
|
@ -497,25 +497,28 @@ gst_gl_display_glutCreateWindow (GstGLDisplay *display)
|
||||||
{
|
{
|
||||||
//OpenGL > 2.1.0 and Glew > 1.5.0
|
//OpenGL > 2.1.0 and Glew > 1.5.0
|
||||||
GString* opengl_version = g_string_truncate (g_string_new ((gchar*) glGetString (GL_VERSION)), 3);
|
GString* opengl_version = g_string_truncate (g_string_new ((gchar*) glGetString (GL_VERSION)), 3);
|
||||||
gfloat opengl_version_f = 0.0f;
|
gint opengl_version_major = 0.;
|
||||||
|
gint opengl_version_minor = 0;
|
||||||
GString* glew_version = g_string_truncate (g_string_new ((gchar*) glewGetString (GLEW_VERSION)), 3);
|
GString* glew_version = g_string_truncate (g_string_new ((gchar*) glewGetString (GLEW_VERSION)), 3);
|
||||||
gfloat glew_version_f = 0.0f;
|
gint glew_version_major = 0.;
|
||||||
|
gint glew_version_minor = 0;
|
||||||
|
|
||||||
sscanf(opengl_version->str, "%f", &opengl_version_f);
|
sscanf(opengl_version->str, "%d.%d", &opengl_version_major, &opengl_version_minor);
|
||||||
sscanf(glew_version->str, "%f", &glew_version_f);
|
sscanf(glew_version->str, "%d.%d", &glew_version_major, &glew_version_minor);
|
||||||
|
|
||||||
GST_DEBUG ("GL_VERSION: %s", glGetString (GL_VERSION));
|
g_print ("GL_VERSION: %s\n", glGetString (GL_VERSION));
|
||||||
GST_DEBUG ("GLEW_VERSION: %s", glewGetString (GLEW_VERSION));
|
g_print ("GLEW_VERSION: %s\n", glewGetString (GLEW_VERSION));
|
||||||
|
|
||||||
GST_DEBUG ("GL_VENDOR: %s", glGetString (GL_VENDOR));
|
g_print ("GL_VENDOR: %s\n", glGetString (GL_VENDOR));
|
||||||
GST_DEBUG ("GL_RENDERER: %s", glGetString (GL_RENDERER));
|
g_print ("GL_RENDERER: %s\n", glGetString (GL_RENDERER));
|
||||||
|
|
||||||
g_string_free (opengl_version, TRUE);
|
g_string_free (opengl_version, TRUE);
|
||||||
g_string_free (glew_version, TRUE);
|
g_string_free (glew_version, TRUE);
|
||||||
|
|
||||||
if (opengl_version_f < 1.4f || glew_version_f < 1.4)
|
if ( (opengl_version_major < 1 && opengl_version_minor < 4) ||
|
||||||
|
(glew_version_major < 1 && glew_version_minor < 4) )
|
||||||
{
|
{
|
||||||
GST_DEBUG ("Required OpenGL >= 1.4.0 and Glew >= 1.4.0");
|
g_print ("Required OpenGL >= 1.4.0 and Glew >= 1.4.0\n");
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -530,7 +533,7 @@ gst_gl_display_glutCreateWindow (GstGLDisplay *display)
|
||||||
glGenFramebuffersEXT (1, &display->fbo);
|
glGenFramebuffersEXT (1, &display->fbo);
|
||||||
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, display->fbo);
|
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, display->fbo);
|
||||||
|
|
||||||
//setup the render buffer for depth
|
//setup the render buffer for depth
|
||||||
glGenRenderbuffersEXT(1, &display->depthBuffer);
|
glGenRenderbuffersEXT(1, &display->depthBuffer);
|
||||||
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, display->depthBuffer);
|
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, display->depthBuffer);
|
||||||
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT,
|
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT,
|
||||||
|
@ -539,7 +542,7 @@ gst_gl_display_glutCreateWindow (GstGLDisplay *display)
|
||||||
//setup a texture to render to
|
//setup a texture to render to
|
||||||
glGenTextures (1, &display->textureFBO);
|
glGenTextures (1, &display->textureFBO);
|
||||||
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->textureFBO);
|
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->textureFBO);
|
||||||
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
||||||
display->textureFBOWidth, display->textureFBOHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
display->textureFBOWidth, display->textureFBOHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
@ -547,11 +550,11 @@ gst_gl_display_glutCreateWindow (GstGLDisplay *display)
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
|
||||||
//attach the texture to the FBO to renderer to
|
//attach the texture to the FBO to renderer to
|
||||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
|
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
|
||||||
GL_TEXTURE_RECTANGLE_ARB, display->textureFBO, 0);
|
GL_TEXTURE_RECTANGLE_ARB, display->textureFBO, 0);
|
||||||
|
|
||||||
//attach the depth render buffer to the FBO
|
//attach the depth render buffer to the FBO
|
||||||
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
|
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
|
||||||
GL_RENDERBUFFER_EXT, display->depthBuffer);
|
GL_RENDERBUFFER_EXT, display->depthBuffer);
|
||||||
|
|
||||||
g_assert (glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT) ==
|
g_assert (glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT) ==
|
||||||
|
@ -561,7 +564,7 @@ gst_gl_display_glutCreateWindow (GstGLDisplay *display)
|
||||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
||||||
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GST_DEBUG ("Context %d, EXT_framebuffer_object supported: no", glutWinId);
|
GST_DEBUG ("Context %d, EXT_framebuffer_object supported: no", glutWinId);
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
|
@ -588,7 +591,7 @@ gst_gl_display_glutCreateWindow (GstGLDisplay *display)
|
||||||
|
|
||||||
display->GLSLProgram_AYUV = gst_gl_display_loadGLSLprogram (display->textFProgram_AYUV);
|
display->GLSLProgram_AYUV = gst_gl_display_loadGLSLprogram (display->textFProgram_AYUV);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GST_DEBUG ("Context %d, ARB_fragment_program supported: no", glutWinId);
|
GST_DEBUG ("Context %d, ARB_fragment_program supported: no", glutWinId);
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
|
@ -617,8 +620,8 @@ static void
|
||||||
gst_gl_display_glutGenerateOutputVideoFBO (GstGLDisplay *display)
|
gst_gl_display_glutGenerateOutputVideoFBO (GstGLDisplay *display)
|
||||||
{
|
{
|
||||||
glutSetWindow (display->glutWinId);
|
glutSetWindow (display->glutWinId);
|
||||||
|
|
||||||
|
|
||||||
if (GLEW_EXT_framebuffer_object)
|
if (GLEW_EXT_framebuffer_object)
|
||||||
{
|
{
|
||||||
GST_DEBUG ("Context %d, EXT_framebuffer_object supported: yes", display->glutWinId);
|
GST_DEBUG ("Context %d, EXT_framebuffer_object supported: yes", display->glutWinId);
|
||||||
|
@ -630,16 +633,16 @@ gst_gl_display_glutGenerateOutputVideoFBO (GstGLDisplay *display)
|
||||||
glGenFramebuffersEXT (1, &display->graphicFBO);
|
glGenFramebuffersEXT (1, &display->graphicFBO);
|
||||||
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, display->graphicFBO);
|
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, display->graphicFBO);
|
||||||
|
|
||||||
//setup the render buffer for depth
|
//setup the render buffer for depth
|
||||||
glGenRenderbuffersEXT(1, &display->graphicDepthBuffer);
|
glGenRenderbuffersEXT(1, &display->graphicDepthBuffer);
|
||||||
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, display->graphicDepthBuffer);
|
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, display->graphicDepthBuffer);
|
||||||
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT,
|
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT,
|
||||||
display->glcontext_width, display->glcontext_height);
|
display->glcontext_width, display->glcontext_height);
|
||||||
|
|
||||||
//setup a texture to render to
|
//setup a texture to render to
|
||||||
glGenTextures (1, &display->graphicTexture);
|
glGenTextures (1, &display->graphicTexture);
|
||||||
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->graphicTexture);
|
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->graphicTexture);
|
||||||
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
||||||
display->glcontext_width, display->glcontext_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
display->glcontext_width, display->glcontext_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
@ -647,11 +650,11 @@ gst_gl_display_glutGenerateOutputVideoFBO (GstGLDisplay *display)
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
|
||||||
//attach the texture to the FBO to renderer to
|
//attach the texture to the FBO to renderer to
|
||||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
|
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
|
||||||
GL_TEXTURE_RECTANGLE_ARB, display->graphicTexture, 0);
|
GL_TEXTURE_RECTANGLE_ARB, display->graphicTexture, 0);
|
||||||
|
|
||||||
//attach the depth render buffer to the FBO
|
//attach the depth render buffer to the FBO
|
||||||
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
|
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
|
||||||
GL_RENDERBUFFER_EXT, display->graphicDepthBuffer);
|
GL_RENDERBUFFER_EXT, display->graphicDepthBuffer);
|
||||||
|
|
||||||
g_assert (glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT) ==
|
g_assert (glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT) ==
|
||||||
|
@ -669,16 +672,16 @@ gst_gl_display_glutGenerateOutputVideoFBO (GstGLDisplay *display)
|
||||||
glGenFramebuffersEXT (1, &display->videoFBO);
|
glGenFramebuffersEXT (1, &display->videoFBO);
|
||||||
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, display->videoFBO);
|
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, display->videoFBO);
|
||||||
|
|
||||||
//setup the render buffer for depth
|
//setup the render buffer for depth
|
||||||
glGenRenderbuffersEXT(1, &display->videoDepthBuffer);
|
glGenRenderbuffersEXT(1, &display->videoDepthBuffer);
|
||||||
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, display->videoDepthBuffer);
|
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, display->videoDepthBuffer);
|
||||||
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT,
|
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT,
|
||||||
display->outputWidth, display->outputHeight);
|
display->outputWidth, display->outputHeight);
|
||||||
|
|
||||||
//setup a first texture to render to
|
//setup a first texture to render to
|
||||||
glGenTextures (1, &display->videoTexture);
|
glGenTextures (1, &display->videoTexture);
|
||||||
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->videoTexture);
|
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->videoTexture);
|
||||||
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
||||||
display->outputWidth, display->outputHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
display->outputWidth, display->outputHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
@ -686,13 +689,13 @@ gst_gl_display_glutGenerateOutputVideoFBO (GstGLDisplay *display)
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
|
||||||
//attach the first texture to the FBO to renderer to
|
//attach the first texture to the FBO to renderer to
|
||||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
|
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
|
||||||
GL_TEXTURE_RECTANGLE_ARB, display->videoTexture, 0);
|
GL_TEXTURE_RECTANGLE_ARB, display->videoTexture, 0);
|
||||||
|
|
||||||
//setup a second texture to render to
|
//setup a second texture to render to
|
||||||
glGenTextures (1, &display->videoTexture_u);
|
glGenTextures (1, &display->videoTexture_u);
|
||||||
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->videoTexture_u);
|
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->videoTexture_u);
|
||||||
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
||||||
display->outputWidth, display->outputHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
display->outputWidth, display->outputHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
@ -700,13 +703,13 @@ gst_gl_display_glutGenerateOutputVideoFBO (GstGLDisplay *display)
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
|
||||||
//attach the second texture to the FBO to renderer to
|
//attach the second texture to the FBO to renderer to
|
||||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT,
|
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT,
|
||||||
GL_TEXTURE_RECTANGLE_ARB, display->videoTexture_u, 0);
|
GL_TEXTURE_RECTANGLE_ARB, display->videoTexture_u, 0);
|
||||||
|
|
||||||
//setup a third texture to render to
|
//setup a third texture to render to
|
||||||
glGenTextures (1, &display->videoTexture_v);
|
glGenTextures (1, &display->videoTexture_v);
|
||||||
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->videoTexture_v);
|
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->videoTexture_v);
|
||||||
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
||||||
display->outputWidth, display->outputHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
display->outputWidth, display->outputHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
@ -714,11 +717,11 @@ gst_gl_display_glutGenerateOutputVideoFBO (GstGLDisplay *display)
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
|
||||||
//attach the third texture to the FBO to renderer to
|
//attach the third texture to the FBO to renderer to
|
||||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT2_EXT,
|
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT2_EXT,
|
||||||
GL_TEXTURE_RECTANGLE_ARB, display->videoTexture_v, 0);
|
GL_TEXTURE_RECTANGLE_ARB, display->videoTexture_v, 0);
|
||||||
|
|
||||||
//attach the depth render buffer to the FBO
|
//attach the depth render buffer to the FBO
|
||||||
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
|
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
|
||||||
GL_RENDERBUFFER_EXT, display->videoDepthBuffer);
|
GL_RENDERBUFFER_EXT, display->videoDepthBuffer);
|
||||||
|
|
||||||
checkFramebufferStatus();
|
checkFramebufferStatus();
|
||||||
|
@ -733,7 +736,7 @@ gst_gl_display_glutGenerateOutputVideoFBO (GstGLDisplay *display)
|
||||||
display->multipleRT[1] = GL_COLOR_ATTACHMENT1_EXT;
|
display->multipleRT[1] = GL_COLOR_ATTACHMENT1_EXT;
|
||||||
display->multipleRT[2] = GL_COLOR_ATTACHMENT2_EXT;
|
display->multipleRT[2] = GL_COLOR_ATTACHMENT2_EXT;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GST_DEBUG ("Context %d, EXT_framebuffer_object supported: no", display->glutWinId);
|
GST_DEBUG ("Context %d, EXT_framebuffer_object supported: no", display->glutWinId);
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
|
@ -755,7 +758,7 @@ gst_gl_display_glutGenerateOutputVideoFBO (GstGLDisplay *display)
|
||||||
|
|
||||||
display->GLSLProgram_to_AYUV = gst_gl_display_loadGLSLprogram (display->textFProgram_to_AYUV);
|
display->GLSLProgram_to_AYUV = gst_gl_display_loadGLSLprogram (display->textFProgram_to_AYUV);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
GST_DEBUG ("Context %d, ARB_fragment_program supported: no", display->glutWinId);
|
GST_DEBUG ("Context %d, ARB_fragment_program supported: no", display->glutWinId);
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
|
@ -769,16 +772,16 @@ gst_gl_display_glutGenerateOutputVideoFBO (GstGLDisplay *display)
|
||||||
static void
|
static void
|
||||||
gst_gl_display_glutGenerateFBO (GstGLDisplay *display)
|
gst_gl_display_glutGenerateFBO (GstGLDisplay *display)
|
||||||
{
|
{
|
||||||
|
|
||||||
glutSetWindow (display->glutWinId);
|
glutSetWindow (display->glutWinId);
|
||||||
|
|
||||||
//-- generate frame buffer object
|
//-- generate frame buffer object
|
||||||
|
|
||||||
//setup FBO
|
//setup FBO
|
||||||
glGenFramebuffersEXT (1, &display->requestedFBO);
|
glGenFramebuffersEXT (1, &display->requestedFBO);
|
||||||
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, display->requestedFBO);
|
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, display->requestedFBO);
|
||||||
|
|
||||||
//setup the render buffer for depth
|
//setup the render buffer for depth
|
||||||
glGenRenderbuffersEXT(1, &display->requestedDepthBuffer);
|
glGenRenderbuffersEXT(1, &display->requestedDepthBuffer);
|
||||||
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, display->requestedDepthBuffer);
|
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, display->requestedDepthBuffer);
|
||||||
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT,
|
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT,
|
||||||
|
@ -787,7 +790,7 @@ gst_gl_display_glutGenerateFBO (GstGLDisplay *display)
|
||||||
//setup a texture to render to
|
//setup a texture to render to
|
||||||
glGenTextures (1, &display->requestedTextureFBO);
|
glGenTextures (1, &display->requestedTextureFBO);
|
||||||
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->requestedTextureFBO);
|
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->requestedTextureFBO);
|
||||||
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
||||||
display->requestedTextureFBOWidth, display->requestedTextureFBOHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
display->requestedTextureFBOWidth, display->requestedTextureFBOHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
||||||
|
@ -795,11 +798,11 @@ gst_gl_display_glutGenerateFBO (GstGLDisplay *display)
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
|
||||||
//attach the texture to the FBO to renderer to
|
//attach the texture to the FBO to renderer to
|
||||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
|
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
|
||||||
GL_TEXTURE_RECTANGLE_ARB, display->requestedTextureFBO, 0);
|
GL_TEXTURE_RECTANGLE_ARB, display->requestedTextureFBO, 0);
|
||||||
|
|
||||||
//attach the depth render buffer to the FBO
|
//attach the depth render buffer to the FBO
|
||||||
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
|
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
|
||||||
GL_RENDERBUFFER_EXT, display->requestedDepthBuffer);
|
GL_RENDERBUFFER_EXT, display->requestedDepthBuffer);
|
||||||
|
|
||||||
g_assert (glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT) ==
|
g_assert (glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT) ==
|
||||||
|
@ -816,7 +819,7 @@ gst_gl_display_glutGenerateFBO (GstGLDisplay *display)
|
||||||
static void
|
static void
|
||||||
gst_gl_display_glutUseFBO (GstGLDisplay *display)
|
gst_gl_display_glutUseFBO (GstGLDisplay *display)
|
||||||
{
|
{
|
||||||
|
|
||||||
glutSetWindow (display->glutWinId);
|
glutSetWindow (display->glutWinId);
|
||||||
|
|
||||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, display->usedFBO);
|
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, display->usedFBO);
|
||||||
|
@ -826,7 +829,7 @@ gst_gl_display_glutUseFBO (GstGLDisplay *display)
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
gluPerspective(45, (gfloat)display->usedTextureFBOWidth/(gfloat)display->usedTextureFBOHeight, 0.1, 100);
|
gluPerspective(45, (gfloat)display->usedTextureFBOWidth/(gfloat)display->usedTextureFBOHeight, 0.1, 100);
|
||||||
//gluOrtho2D(0.0, display->usedTextureFBOWidth, 0.0, display->usedTextureFBOHeight);
|
//gluOrtho2D(0.0, display->usedTextureFBOWidth, 0.0, display->usedTextureFBOHeight);
|
||||||
|
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
@ -856,7 +859,7 @@ gst_gl_display_glutUseFBO (GstGLDisplay *display)
|
||||||
glPopAttrib();
|
glPopAttrib();
|
||||||
|
|
||||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
||||||
|
|
||||||
g_cond_signal (display->cond_useFBO);
|
g_cond_signal (display->cond_useFBO);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -874,7 +877,7 @@ gst_gl_display_glutUseFBO2 (GstGLDisplay *display)
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
//gluPerspective(45, (gfloat)display->usedTextureFBOWidth/(gfloat)display->usedTextureFBOHeight, 0.1, 100);
|
//gluPerspective(45, (gfloat)display->usedTextureFBOWidth/(gfloat)display->usedTextureFBOHeight, 0.1, 100);
|
||||||
gluOrtho2D(0.0, display->usedTextureFBOWidth, 0.0, display->usedTextureFBOHeight);
|
gluOrtho2D(0.0, display->usedTextureFBOWidth, 0.0, display->usedTextureFBOHeight);
|
||||||
|
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
@ -903,7 +906,7 @@ gst_gl_display_glutUseFBO2 (GstGLDisplay *display)
|
||||||
glPopAttrib();
|
glPopAttrib();
|
||||||
|
|
||||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
||||||
|
|
||||||
g_cond_signal (display->cond_useFBO2);
|
g_cond_signal (display->cond_useFBO2);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -914,7 +917,7 @@ gst_gl_display_glutDestroyFBO (GstGLDisplay* display)
|
||||||
{
|
{
|
||||||
glutSetWindow (display->glutWinId);
|
glutSetWindow (display->glutWinId);
|
||||||
|
|
||||||
glDeleteFramebuffersEXT (1, &display->rejectedFBO);
|
glDeleteFramebuffersEXT (1, &display->rejectedFBO);
|
||||||
glDeleteRenderbuffersEXT(1, &display->rejectedDepthBuffer);
|
glDeleteRenderbuffersEXT(1, &display->rejectedDepthBuffer);
|
||||||
glDeleteTextures (1, &display->rejectedTextureFBO);
|
glDeleteTextures (1, &display->rejectedTextureFBO);
|
||||||
display->rejectedFBO = 0;
|
display->rejectedFBO = 0;
|
||||||
|
@ -965,15 +968,15 @@ gst_gl_display_glutDestroyWindow (GstGLDisplay *display)
|
||||||
glDeleteObjectARB (display->GLSLProgram_to_I420_YV12);
|
glDeleteObjectARB (display->GLSLProgram_to_I420_YV12);
|
||||||
glDeleteObjectARB (display->GLSLProgram_to_AYUV);
|
glDeleteObjectARB (display->GLSLProgram_to_AYUV);
|
||||||
|
|
||||||
glDeleteFramebuffersEXT (1, &display->fbo);
|
glDeleteFramebuffersEXT (1, &display->fbo);
|
||||||
glDeleteRenderbuffersEXT(1, &display->depthBuffer);
|
glDeleteRenderbuffersEXT(1, &display->depthBuffer);
|
||||||
glDeleteTextures (1, &display->textureFBO);
|
glDeleteTextures (1, &display->textureFBO);
|
||||||
|
|
||||||
glDeleteFramebuffersEXT (1, &display->graphicFBO);
|
glDeleteFramebuffersEXT (1, &display->graphicFBO);
|
||||||
glDeleteRenderbuffersEXT(1, &display->graphicDepthBuffer);
|
glDeleteRenderbuffersEXT(1, &display->graphicDepthBuffer);
|
||||||
glDeleteTextures (1, &display->graphicTexture);
|
glDeleteTextures (1, &display->graphicTexture);
|
||||||
|
|
||||||
glDeleteFramebuffersEXT (1, &display->videoFBO);
|
glDeleteFramebuffersEXT (1, &display->videoFBO);
|
||||||
glDeleteRenderbuffersEXT(1, &display->videoDepthBuffer);
|
glDeleteRenderbuffersEXT(1, &display->videoDepthBuffer);
|
||||||
glDeleteTextures (1, &display->videoTexture);
|
glDeleteTextures (1, &display->videoTexture);
|
||||||
glDeleteTextures (1, &display->videoTexture_u);
|
glDeleteTextures (1, &display->videoTexture_u);
|
||||||
|
@ -983,7 +986,7 @@ gst_gl_display_glutDestroyWindow (GstGLDisplay *display)
|
||||||
while (g_queue_get_length (display->texturePool))
|
while (g_queue_get_length (display->texturePool))
|
||||||
{
|
{
|
||||||
GstGLDisplayTex* tex = g_queue_pop_head (display->texturePool);
|
GstGLDisplayTex* tex = g_queue_pop_head (display->texturePool);
|
||||||
|
|
||||||
//delete textures
|
//delete textures
|
||||||
glDeleteTextures (1, &tex->texture);
|
glDeleteTextures (1, &tex->texture);
|
||||||
if (tex->texture_u) {
|
if (tex->texture_u) {
|
||||||
|
@ -994,7 +997,7 @@ gst_gl_display_glutDestroyWindow (GstGLDisplay *display)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
g_hash_table_remove (gst_gl_display_map, GINT_TO_POINTER (display->glutWinId));
|
g_hash_table_remove (gst_gl_display_map, GINT_TO_POINTER (display->glutWinId));
|
||||||
g_print ("glut window destroyed: %d\n", display->glutWinId);
|
g_print ("glut window destroyed: %d\n", display->glutWinId);
|
||||||
|
|
||||||
//if the map is empty, leaveMainloop and join the thread
|
//if the map is empty, leaveMainloop and join the thread
|
||||||
|
@ -1095,9 +1098,9 @@ gst_gl_display_glutPostRedisplay (GstGLDisplay * display)
|
||||||
|
|
||||||
|
|
||||||
/* Called continuously from freeglut while no events are pending */
|
/* Called continuously from freeglut while no events are pending */
|
||||||
static void
|
static void
|
||||||
gst_gl_display_glut_idle (void)
|
gst_gl_display_glut_idle (void)
|
||||||
{
|
{
|
||||||
GTimeVal timeout;
|
GTimeVal timeout;
|
||||||
GstGLDisplayMsg *msg;
|
GstGLDisplayMsg *msg;
|
||||||
|
|
||||||
|
@ -1105,7 +1108,7 @@ gst_gl_display_glut_idle (void)
|
||||||
g_get_current_time (&timeout);
|
g_get_current_time (&timeout);
|
||||||
g_time_val_add (&timeout, 1000000L); //timeout 1 sec
|
g_time_val_add (&timeout, 1000000L); //timeout 1 sec
|
||||||
msg = g_async_queue_timed_pop (gst_gl_display_messageQueue, &timeout);
|
msg = g_async_queue_timed_pop (gst_gl_display_messageQueue, &timeout);
|
||||||
if (msg)
|
if (msg)
|
||||||
{
|
{
|
||||||
if (gst_gl_display_checkMsgValidity (msg))
|
if (gst_gl_display_checkMsgValidity (msg))
|
||||||
gst_gl_display_glutDispatchAction (msg);
|
gst_gl_display_glutDispatchAction (msg);
|
||||||
|
@ -1113,7 +1116,7 @@ gst_gl_display_glut_idle (void)
|
||||||
{
|
{
|
||||||
msg = g_async_queue_pop (gst_gl_display_messageQueue);
|
msg = g_async_queue_pop (gst_gl_display_messageQueue);
|
||||||
if (gst_gl_display_checkMsgValidity (msg))
|
if (gst_gl_display_checkMsgValidity (msg))
|
||||||
gst_gl_display_glutDispatchAction (msg);
|
gst_gl_display_glutDispatchAction (msg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else g_print ("timeout reached in idle func\n");
|
else g_print ("timeout reached in idle func\n");
|
||||||
|
@ -1194,12 +1197,12 @@ gst_gl_display_checkMsgValidity (GstGLDisplayMsg *msg)
|
||||||
case GST_GL_DISPLAY_ACTION_CREATE:
|
case GST_GL_DISPLAY_ACTION_CREATE:
|
||||||
valid = TRUE;
|
valid = TRUE;
|
||||||
break;
|
break;
|
||||||
case GST_GL_DISPLAY_ACTION_DESTROY:
|
case GST_GL_DISPLAY_ACTION_DESTROY:
|
||||||
case GST_GL_DISPLAY_ACTION_VISIBLE:
|
case GST_GL_DISPLAY_ACTION_VISIBLE:
|
||||||
case GST_GL_DISPLAY_ACTION_RESHAPE:
|
case GST_GL_DISPLAY_ACTION_RESHAPE:
|
||||||
case GST_GL_DISPLAY_ACTION_PREPARE:
|
case GST_GL_DISPLAY_ACTION_PREPARE:
|
||||||
case GST_GL_DISPLAY_ACTION_CHANGE:
|
case GST_GL_DISPLAY_ACTION_CHANGE:
|
||||||
case GST_GL_DISPLAY_ACTION_CLEAR:
|
case GST_GL_DISPLAY_ACTION_CLEAR:
|
||||||
case GST_GL_DISPLAY_ACTION_VIDEO:
|
case GST_GL_DISPLAY_ACTION_VIDEO:
|
||||||
case GST_GL_DISPLAY_ACTION_REDISPLAY:
|
case GST_GL_DISPLAY_ACTION_REDISPLAY:
|
||||||
case GST_GL_DISPLAY_ACTION_GENFBO:
|
case GST_GL_DISPLAY_ACTION_GENFBO:
|
||||||
|
@ -1233,13 +1236,13 @@ gst_gl_display_new (void)
|
||||||
|
|
||||||
/* Init an opengl context */
|
/* Init an opengl context */
|
||||||
void
|
void
|
||||||
gst_gl_display_initGLContext (GstGLDisplay *display,
|
gst_gl_display_initGLContext (GstGLDisplay *display,
|
||||||
GLint x, GLint y,
|
GLint x, GLint y,
|
||||||
GLint graphic_width, GLint graphic_height,
|
GLint graphic_width, GLint graphic_height,
|
||||||
GLint video_width, GLint video_height,
|
GLint video_width, GLint video_height,
|
||||||
gulong winId,
|
gulong winId,
|
||||||
gboolean visible)
|
gboolean visible)
|
||||||
{
|
{
|
||||||
gst_gl_display_lock (display);
|
gst_gl_display_lock (display);
|
||||||
|
|
||||||
display->winId = winId;
|
display->winId = winId;
|
||||||
|
@ -1261,24 +1264,24 @@ gst_gl_display_initGLContext (GstGLDisplay *display,
|
||||||
g_cond_wait (display->cond_create, display->mutex);
|
g_cond_wait (display->cond_create, display->mutex);
|
||||||
}
|
}
|
||||||
//request glut window creation
|
//request glut window creation
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//blocking call because glut context must be alive
|
//blocking call because glut context must be alive
|
||||||
gst_gl_display_postMessage (GST_GL_DISPLAY_ACTION_CREATE, display);
|
gst_gl_display_postMessage (GST_GL_DISPLAY_ACTION_CREATE, display);
|
||||||
g_cond_wait (display->cond_create, display->mutex);
|
g_cond_wait (display->cond_create, display->mutex);
|
||||||
}
|
}
|
||||||
gst_gl_display_unlock (display);
|
gst_gl_display_unlock (display);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
gst_gl_display_lock (GstGLDisplay * display)
|
gst_gl_display_lock (GstGLDisplay * display)
|
||||||
{
|
{
|
||||||
g_mutex_lock (display->mutex);
|
g_mutex_lock (display->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
void
|
void
|
||||||
gst_gl_display_unlock (GstGLDisplay * display)
|
gst_gl_display_unlock (GstGLDisplay * display)
|
||||||
{
|
{
|
||||||
g_mutex_unlock (display->mutex);
|
g_mutex_unlock (display->mutex);
|
||||||
|
@ -1318,7 +1321,7 @@ gst_gl_display_setClientDrawCallback (GstGLDisplay * display, CDCB cb)
|
||||||
|
|
||||||
|
|
||||||
/* Called by gst gl elements */
|
/* Called by gst gl elements */
|
||||||
void
|
void
|
||||||
gst_gl_display_setVisibleWindow (GstGLDisplay* display, gboolean visible)
|
gst_gl_display_setVisibleWindow (GstGLDisplay* display, gboolean visible)
|
||||||
{
|
{
|
||||||
gst_gl_display_lock (display);
|
gst_gl_display_lock (display);
|
||||||
|
@ -1332,7 +1335,7 @@ gst_gl_display_setVisibleWindow (GstGLDisplay* display, gboolean visible)
|
||||||
|
|
||||||
|
|
||||||
/* Called by gst gl elements */
|
/* Called by gst gl elements */
|
||||||
void
|
void
|
||||||
gst_gl_display_resizeWindow (GstGLDisplay* display, gint width, gint height)
|
gst_gl_display_resizeWindow (GstGLDisplay* display, gint width, gint height)
|
||||||
{
|
{
|
||||||
gst_gl_display_lock (display);
|
gst_gl_display_lock (display);
|
||||||
|
@ -1344,8 +1347,8 @@ gst_gl_display_resizeWindow (GstGLDisplay* display, gint width, gint height)
|
||||||
|
|
||||||
|
|
||||||
/* Called by gstglbuffer */
|
/* Called by gstglbuffer */
|
||||||
void
|
void
|
||||||
gst_gl_display_textureRequested (GstGLDisplay* display, GstVideoFormat video_format,
|
gst_gl_display_textureRequested (GstGLDisplay* display, GstVideoFormat video_format,
|
||||||
gint width, gint height, guint* texture,
|
gint width, gint height, guint* texture,
|
||||||
guint* texture_u, guint* texture_v)
|
guint* texture_u, guint* texture_v)
|
||||||
{
|
{
|
||||||
|
@ -1363,9 +1366,9 @@ gst_gl_display_textureRequested (GstGLDisplay* display, GstVideoFormat video_for
|
||||||
|
|
||||||
|
|
||||||
/* Called by gst_gl elements */
|
/* Called by gst_gl elements */
|
||||||
void
|
void
|
||||||
gst_gl_display_textureChanged (GstGLDisplay* display, GstVideoFormat video_format,
|
gst_gl_display_textureChanged (GstGLDisplay* display, GstVideoFormat video_format,
|
||||||
GLuint texture, GLuint texture_u, GLuint texture_v,
|
GLuint texture, GLuint texture_u, GLuint texture_v,
|
||||||
gint width, gint height, gpointer data, GLuint* outputTexture)
|
gint width, gint height, gpointer data, GLuint* outputTexture)
|
||||||
{
|
{
|
||||||
gst_gl_display_lock (display);
|
gst_gl_display_lock (display);
|
||||||
|
@ -1386,8 +1389,8 @@ gst_gl_display_textureChanged (GstGLDisplay* display, GstVideoFormat video_forma
|
||||||
|
|
||||||
|
|
||||||
/* Called by gstglbuffer */
|
/* Called by gstglbuffer */
|
||||||
void
|
void
|
||||||
gst_gl_display_clearTexture (GstGLDisplay* display, guint texture,
|
gst_gl_display_clearTexture (GstGLDisplay* display, guint texture,
|
||||||
guint texture_u, guint texture_v)
|
guint texture_u, guint texture_v)
|
||||||
{
|
{
|
||||||
gst_gl_display_lock (display);
|
gst_gl_display_lock (display);
|
||||||
|
@ -1401,7 +1404,7 @@ gst_gl_display_clearTexture (GstGLDisplay* display, guint texture,
|
||||||
|
|
||||||
|
|
||||||
/* Called by gst_gl elements */
|
/* Called by gst_gl elements */
|
||||||
void
|
void
|
||||||
gst_gl_display_videoChanged (GstGLDisplay* display, GstVideoFormat video_format,
|
gst_gl_display_videoChanged (GstGLDisplay* display, GstVideoFormat video_format,
|
||||||
gint width, gint height, GLuint recordedTexture, gpointer data)
|
gint width, gint height, GLuint recordedTexture, gpointer data)
|
||||||
{
|
{
|
||||||
|
@ -1419,11 +1422,11 @@ gst_gl_display_videoChanged (GstGLDisplay* display, GstVideoFormat video_format,
|
||||||
|
|
||||||
|
|
||||||
/* Called by gst_gl elements */
|
/* Called by gst_gl elements */
|
||||||
gboolean
|
gboolean
|
||||||
gst_gl_display_postRedisplay (GstGLDisplay* display, GLuint texture, gint width , gint height)
|
gst_gl_display_postRedisplay (GstGLDisplay* display, GLuint texture, gint width , gint height)
|
||||||
{
|
{
|
||||||
gboolean isAlive = TRUE;
|
gboolean isAlive = TRUE;
|
||||||
|
|
||||||
gst_gl_display_lock (display);
|
gst_gl_display_lock (display);
|
||||||
isAlive = display->isAlive;
|
isAlive = display->isAlive;
|
||||||
if (texture)
|
if (texture)
|
||||||
|
@ -1441,8 +1444,8 @@ gst_gl_display_postRedisplay (GstGLDisplay* display, GLuint texture, gint width
|
||||||
|
|
||||||
|
|
||||||
/* Called by gst_gl elements */
|
/* Called by gst_gl elements */
|
||||||
void
|
void
|
||||||
gst_gl_display_requestFBO (GstGLDisplay* display, gint width, gint height,
|
gst_gl_display_requestFBO (GstGLDisplay* display, gint width, gint height,
|
||||||
guint* fbo, guint* depthbuffer, guint* texture)
|
guint* fbo, guint* depthbuffer, guint* texture)
|
||||||
{
|
{
|
||||||
gst_gl_display_lock (display);
|
gst_gl_display_lock (display);
|
||||||
|
@ -1458,8 +1461,8 @@ gst_gl_display_requestFBO (GstGLDisplay* display, gint width, gint height,
|
||||||
|
|
||||||
|
|
||||||
/* Called by gst_gl elements */
|
/* Called by gst_gl elements */
|
||||||
void
|
void
|
||||||
gst_gl_display_useFBO (GstGLDisplay* display, gint textureFBOWidth, gint textureFBOheight,
|
gst_gl_display_useFBO (GstGLDisplay* display, gint textureFBOWidth, gint textureFBOheight,
|
||||||
guint fbo, guint depthbuffer, guint textureFBO, GLCB cb,
|
guint fbo, guint depthbuffer, guint textureFBO, GLCB cb,
|
||||||
guint inputTextureWidth, guint inputTextureHeight, guint inputTexture,
|
guint inputTextureWidth, guint inputTextureHeight, guint inputTexture,
|
||||||
GLhandleARB handleShader)
|
GLhandleARB handleShader)
|
||||||
|
@ -1482,8 +1485,8 @@ gst_gl_display_useFBO (GstGLDisplay* display, gint textureFBOWidth, gint texture
|
||||||
|
|
||||||
|
|
||||||
/* Called by gst_gl elements */
|
/* Called by gst_gl elements */
|
||||||
void
|
void
|
||||||
gst_gl_display_useFBO2 (GstGLDisplay* display, gint textureFBOWidth, gint textureFBOheight,
|
gst_gl_display_useFBO2 (GstGLDisplay* display, gint textureFBOWidth, gint textureFBOheight,
|
||||||
guint fbo, guint depthbuffer, guint textureFBO, GLCB2 cb2,
|
guint fbo, guint depthbuffer, guint textureFBO, GLCB2 cb2,
|
||||||
gpointer* p1, gpointer* p2)
|
gpointer* p1, gpointer* p2)
|
||||||
{
|
{
|
||||||
|
@ -1501,8 +1504,8 @@ gst_gl_display_useFBO2 (GstGLDisplay* display, gint textureFBOWidth, gint textur
|
||||||
|
|
||||||
|
|
||||||
/* Called by gst_gl elements */
|
/* Called by gst_gl elements */
|
||||||
void
|
void
|
||||||
gst_gl_display_rejectFBO (GstGLDisplay* display, guint fbo,
|
gst_gl_display_rejectFBO (GstGLDisplay* display, guint fbo,
|
||||||
guint depthbuffer, guint texture)
|
guint depthbuffer, guint texture)
|
||||||
{
|
{
|
||||||
gst_gl_display_lock (display);
|
gst_gl_display_lock (display);
|
||||||
|
@ -1516,7 +1519,7 @@ gst_gl_display_rejectFBO (GstGLDisplay* display, guint fbo,
|
||||||
|
|
||||||
|
|
||||||
/* Called by gst_gl elements */
|
/* Called by gst_gl elements */
|
||||||
void
|
void
|
||||||
gst_gl_display_initDonwloadFBO (GstGLDisplay* display, gint width, gint height)
|
gst_gl_display_initDonwloadFBO (GstGLDisplay* display, gint width, gint height)
|
||||||
{
|
{
|
||||||
gst_gl_display_lock (display);
|
gst_gl_display_lock (display);
|
||||||
|
@ -1529,7 +1532,7 @@ gst_gl_display_initDonwloadFBO (GstGLDisplay* display, gint width, gint height)
|
||||||
|
|
||||||
|
|
||||||
/* Called by gst_gl elements */
|
/* Called by gst_gl elements */
|
||||||
void
|
void
|
||||||
gst_gl_display_initShader (GstGLDisplay* display, gchar* textShader, GLhandleARB* handleShader)
|
gst_gl_display_initShader (GstGLDisplay* display, gchar* textShader, GLhandleARB* handleShader)
|
||||||
{
|
{
|
||||||
gst_gl_display_lock (display);
|
gst_gl_display_lock (display);
|
||||||
|
@ -1542,7 +1545,7 @@ gst_gl_display_initShader (GstGLDisplay* display, gchar* textShader, GLhandleARB
|
||||||
|
|
||||||
|
|
||||||
/* Called by gst_gl elements */
|
/* Called by gst_gl elements */
|
||||||
void
|
void
|
||||||
gst_gl_display_destroyShader (GstGLDisplay* display, GLhandleARB shader)
|
gst_gl_display_destroyShader (GstGLDisplay* display, GLhandleARB shader)
|
||||||
{
|
{
|
||||||
gst_gl_display_lock (display);
|
gst_gl_display_lock (display);
|
||||||
|
@ -1554,7 +1557,7 @@ gst_gl_display_destroyShader (GstGLDisplay* display, GLhandleARB shader)
|
||||||
|
|
||||||
|
|
||||||
/* Called by gst_gl elements */
|
/* Called by gst_gl elements */
|
||||||
void
|
void
|
||||||
gst_gl_display_set_windowId (GstGLDisplay* display, gulong winId)
|
gst_gl_display_set_windowId (GstGLDisplay* display, gulong winId)
|
||||||
{
|
{
|
||||||
static gint glheight = 0;
|
static gint glheight = 0;
|
||||||
|
@ -1575,8 +1578,8 @@ gst_gl_display_set_windowId (GstGLDisplay* display, gulong winId)
|
||||||
}
|
}
|
||||||
|
|
||||||
//init opengl context
|
//init opengl context
|
||||||
gst_gl_display_initGLContext (display,
|
gst_gl_display_initGLContext (display,
|
||||||
50, glheight++ * (display->glcontext_height+50) + 50,
|
50, glheight++ * (display->glcontext_height+50) + 50,
|
||||||
display->glcontext_width, display->glcontext_height,
|
display->glcontext_width, display->glcontext_height,
|
||||||
display->textureFBOWidth, display->textureFBOHeight,
|
display->textureFBOWidth, display->textureFBOHeight,
|
||||||
winId,
|
winId,
|
||||||
|
@ -1584,13 +1587,13 @@ gst_gl_display_set_windowId (GstGLDisplay* display, gulong winId)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* glutReshapeFunc callback */
|
/* glutReshapeFunc callback */
|
||||||
void
|
void
|
||||||
gst_gl_display_onReshape(gint width, gint height)
|
gst_gl_display_onReshape(gint width, gint height)
|
||||||
{
|
{
|
||||||
gint glutWinId = 0;
|
gint glutWinId = 0;
|
||||||
GstGLDisplay *display = NULL;
|
GstGLDisplay *display = NULL;
|
||||||
|
|
||||||
//retrieve the display associated to the glut context
|
//retrieve the display associated to the glut context
|
||||||
glutWinId = glutGetWindow ();
|
glutWinId = glutGetWindow ();
|
||||||
display = g_hash_table_lookup (gst_gl_display_map, GINT_TO_POINTER (glutWinId));
|
display = g_hash_table_lookup (gst_gl_display_map, GINT_TO_POINTER (glutWinId));
|
||||||
|
@ -1601,7 +1604,7 @@ gst_gl_display_onReshape(gint width, gint height)
|
||||||
gst_gl_display_lock (display);
|
gst_gl_display_lock (display);
|
||||||
|
|
||||||
//check if a client reshape callback is registered
|
//check if a client reshape callback is registered
|
||||||
if (display->clientReshapeCallback)
|
if (display->clientReshapeCallback)
|
||||||
display->clientReshapeCallback(width, height);
|
display->clientReshapeCallback(width, height);
|
||||||
|
|
||||||
//default reshape
|
//default reshape
|
||||||
|
@ -1609,31 +1612,31 @@ gst_gl_display_onReshape(gint width, gint height)
|
||||||
{
|
{
|
||||||
glViewport(0, 0, width, height);
|
glViewport(0, 0, width, height);
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
gluOrtho2D(0, width, 0, height);
|
gluOrtho2D(0, width, 0, height);
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
}
|
}
|
||||||
|
|
||||||
gst_gl_display_unlock (display);
|
gst_gl_display_unlock (display);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* glutDisplayFunc callback */
|
/* glutDisplayFunc callback */
|
||||||
void gst_gl_display_draw(void)
|
void gst_gl_display_draw(void)
|
||||||
{
|
{
|
||||||
gint glutWinId = 0;
|
gint glutWinId = 0;
|
||||||
GstGLDisplay *display = NULL;
|
GstGLDisplay *display = NULL;
|
||||||
|
|
||||||
//retrieve the display associated to the glut context
|
//retrieve the display associated to the glut context
|
||||||
glutWinId = glutGetWindow ();
|
glutWinId = glutGetWindow ();
|
||||||
display = g_hash_table_lookup (gst_gl_display_map, GINT_TO_POINTER (glutWinId));
|
display = g_hash_table_lookup (gst_gl_display_map, GINT_TO_POINTER (glutWinId));
|
||||||
|
|
||||||
//glutGetWindow return 0 if no windows exists, then g_hash_table_lookup return NULL
|
//glutGetWindow return 0 if no windows exists, then g_hash_table_lookup return NULL
|
||||||
if (display == NULL) return;
|
if (display == NULL) return;
|
||||||
|
|
||||||
//lock the display because gstreamer elements
|
//lock the display because gstreamer elements
|
||||||
//(and so the main thread) may modify it
|
//(and so the main thread) may modify it
|
||||||
gst_gl_display_lock (display);
|
gst_gl_display_lock (display);
|
||||||
|
|
||||||
//check if video format has been setup
|
//check if video format has been setup
|
||||||
if (!display->displayedTexture)
|
if (!display->displayedTexture)
|
||||||
{
|
{
|
||||||
|
@ -1641,19 +1644,19 @@ void gst_gl_display_draw(void)
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
//opengl scene
|
//opengl scene
|
||||||
|
|
||||||
glUseProgramObjectARB (0);
|
glUseProgramObjectARB (0);
|
||||||
glDisable (GL_TEXTURE_RECTANGLE_ARB);
|
glDisable (GL_TEXTURE_RECTANGLE_ARB);
|
||||||
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, 0);
|
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, 0);
|
||||||
|
|
||||||
//check if a client draw callback is registered
|
//check if a client draw callback is registered
|
||||||
if (display->clientDrawCallback)
|
if (display->clientDrawCallback)
|
||||||
{
|
{
|
||||||
gboolean doRedisplay =
|
gboolean doRedisplay =
|
||||||
display->clientDrawCallback(display->displayedTexture,
|
display->clientDrawCallback(display->displayedTexture,
|
||||||
display->displayedTextureWidth, display->displayedTextureHeight);
|
display->displayedTextureWidth, display->displayedTextureHeight);
|
||||||
|
|
||||||
glFlush();
|
glFlush();
|
||||||
glutSwapBuffers();
|
glutSwapBuffers();
|
||||||
|
|
||||||
|
@ -1662,13 +1665,13 @@ void gst_gl_display_draw(void)
|
||||||
}
|
}
|
||||||
//default opengl scene
|
//default opengl scene
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
glMatrixMode (GL_PROJECTION);
|
glMatrixMode (GL_PROJECTION);
|
||||||
glLoadIdentity ();
|
glLoadIdentity ();
|
||||||
|
|
||||||
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->displayedTexture);
|
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->displayedTexture);
|
||||||
glEnable (GL_TEXTURE_RECTANGLE_ARB);
|
glEnable (GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
|
||||||
|
@ -1694,19 +1697,19 @@ void gst_gl_display_draw(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/* glutCloseFunc callback */
|
/* glutCloseFunc callback */
|
||||||
void gst_gl_display_onClose (void)
|
void gst_gl_display_onClose (void)
|
||||||
{
|
{
|
||||||
gint glutWinId = 0;
|
gint glutWinId = 0;
|
||||||
GstGLDisplay* display = NULL;
|
GstGLDisplay* display = NULL;
|
||||||
|
|
||||||
//retrieve the display associated to the glut context
|
//retrieve the display associated to the glut context
|
||||||
glutWinId = glutGetWindow ();
|
glutWinId = glutGetWindow ();
|
||||||
display = g_hash_table_lookup (gst_gl_display_map, GINT_TO_POINTER (glutWinId));
|
display = g_hash_table_lookup (gst_gl_display_map, GINT_TO_POINTER (glutWinId));
|
||||||
|
|
||||||
//glutGetWindow return 0 if no windows exists, then g_hash_table_lookup return NULL
|
//glutGetWindow return 0 if no windows exists, then g_hash_table_lookup return NULL
|
||||||
if (display == NULL) return;
|
if (display == NULL) return;
|
||||||
|
|
||||||
GST_DEBUG ("on close");
|
GST_DEBUG ("on close");
|
||||||
|
|
||||||
gst_gl_display_lock (display);
|
gst_gl_display_lock (display);
|
||||||
|
@ -1717,13 +1720,13 @@ void gst_gl_display_onClose (void)
|
||||||
|
|
||||||
/* called by gst_gl_display_glutPrepareTexture (in the glut thread) */
|
/* called by gst_gl_display_glutPrepareTexture (in the glut thread) */
|
||||||
void gst_gl_display_make_texture (GstGLDisplay * display)
|
void gst_gl_display_make_texture (GstGLDisplay * display)
|
||||||
{
|
{
|
||||||
GstGLDisplayTex* tex = NULL;
|
GstGLDisplayTex* tex = NULL;
|
||||||
|
|
||||||
//check if there is a tex available in the pool
|
//check if there is a tex available in the pool
|
||||||
if (g_queue_get_length (display->texturePool))
|
if (g_queue_get_length (display->texturePool))
|
||||||
tex = g_queue_pop_head (display->texturePool);
|
tex = g_queue_pop_head (display->texturePool);
|
||||||
|
|
||||||
//one tex is available
|
//one tex is available
|
||||||
if (tex)
|
if (tex)
|
||||||
display->requestedTexture = tex->texture;
|
display->requestedTexture = tex->texture;
|
||||||
|
@ -1853,7 +1856,7 @@ gst_gl_display_fill_texture (GstGLDisplay * display)
|
||||||
gint offsetU = 0;
|
gint offsetU = 0;
|
||||||
gint offsetV = 0;
|
gint offsetV = 0;
|
||||||
|
|
||||||
switch (video_format)
|
switch (video_format)
|
||||||
{
|
{
|
||||||
case GST_VIDEO_FORMAT_I420:
|
case GST_VIDEO_FORMAT_I420:
|
||||||
offsetU = 1;
|
offsetU = 1;
|
||||||
|
@ -1882,7 +1885,7 @@ gst_gl_display_fill_texture (GstGLDisplay * display)
|
||||||
GST_ROUND_UP_2 (width) / 2, GST_ROUND_UP_2 (height) / 2,
|
GST_ROUND_UP_2 (width) / 2, GST_ROUND_UP_2 (height) / 2,
|
||||||
GL_LUMINANCE, GL_UNSIGNED_BYTE,
|
GL_LUMINANCE, GL_UNSIGNED_BYTE,
|
||||||
(guint8 *) data +
|
(guint8 *) data +
|
||||||
gst_video_format_get_component_offset (video_format, offsetV, width, height));
|
gst_video_format_get_component_offset (video_format, offsetV, width, height));
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
@ -1932,7 +1935,7 @@ gst_gl_display_draw_texture (GstGLDisplay* display)
|
||||||
{
|
{
|
||||||
glMatrixMode (GL_PROJECTION);
|
glMatrixMode (GL_PROJECTION);
|
||||||
glLoadIdentity ();
|
glLoadIdentity ();
|
||||||
|
|
||||||
glEnable(GL_TEXTURE_RECTANGLE_ARB);
|
glEnable(GL_TEXTURE_RECTANGLE_ARB);
|
||||||
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->currentTexture);
|
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->currentTexture);
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
||||||
|
@ -1948,8 +1951,8 @@ gst_gl_display_draw_texture (GstGLDisplay* display)
|
||||||
{
|
{
|
||||||
gint i=0;
|
gint i=0;
|
||||||
GLhandleARB GLSLProgram_YUY2_UYVY = 0;
|
GLhandleARB GLSLProgram_YUY2_UYVY = 0;
|
||||||
|
|
||||||
switch (display->currentVideo_format)
|
switch (display->currentVideo_format)
|
||||||
{
|
{
|
||||||
case GST_VIDEO_FORMAT_YUY2:
|
case GST_VIDEO_FORMAT_YUY2:
|
||||||
GLSLProgram_YUY2_UYVY = display->GLSLProgram_YUY2;
|
GLSLProgram_YUY2_UYVY = display->GLSLProgram_YUY2;
|
||||||
|
@ -1965,7 +1968,7 @@ gst_gl_display_draw_texture (GstGLDisplay* display)
|
||||||
|
|
||||||
glMatrixMode (GL_PROJECTION);
|
glMatrixMode (GL_PROJECTION);
|
||||||
glLoadIdentity ();
|
glLoadIdentity ();
|
||||||
|
|
||||||
glActiveTextureARB(GL_TEXTURE1_ARB);
|
glActiveTextureARB(GL_TEXTURE1_ARB);
|
||||||
i = glGetUniformLocationARB (GLSLProgram_YUY2_UYVY, "UVtex");
|
i = glGetUniformLocationARB (GLSLProgram_YUY2_UYVY, "UVtex");
|
||||||
glUniform1iARB (i, 1);
|
glUniform1iARB (i, 1);
|
||||||
|
@ -1995,7 +1998,7 @@ gst_gl_display_draw_texture (GstGLDisplay* display)
|
||||||
|
|
||||||
glMatrixMode (GL_PROJECTION);
|
glMatrixMode (GL_PROJECTION);
|
||||||
glLoadIdentity ();
|
glLoadIdentity ();
|
||||||
|
|
||||||
glActiveTextureARB(GL_TEXTURE1_ARB);
|
glActiveTextureARB(GL_TEXTURE1_ARB);
|
||||||
i = glGetUniformLocationARB (display->GLSLProgram_I420_YV12, "Utex");
|
i = glGetUniformLocationARB (display->GLSLProgram_I420_YV12, "Utex");
|
||||||
glUniform1iARB (i, 1);
|
glUniform1iARB (i, 1);
|
||||||
|
@ -2090,7 +2093,7 @@ gst_gl_display_draw_graphic (GstGLDisplay* display)
|
||||||
glMatrixMode(GL_PROJECTION);
|
glMatrixMode(GL_PROJECTION);
|
||||||
glPushMatrix();
|
glPushMatrix();
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
gluPerspective(45, (gfloat)display->glcontext_width/(gfloat)display->glcontext_height, 0.1, 100);
|
gluPerspective(45, (gfloat)display->glcontext_width/(gfloat)display->glcontext_height, 0.1, 100);
|
||||||
//gluOrtho2D(0.0, display->glcontext_width, 0.0, display->glcontext_height);
|
//gluOrtho2D(0.0, display->glcontext_width, 0.0, display->glcontext_height);
|
||||||
|
|
||||||
glMatrixMode(GL_MODELVIEW);
|
glMatrixMode(GL_MODELVIEW);
|
||||||
|
@ -2105,7 +2108,7 @@ gst_gl_display_draw_graphic (GstGLDisplay* display)
|
||||||
|
|
||||||
|
|
||||||
//check if a client draw callback is registered
|
//check if a client draw callback is registered
|
||||||
if (display->clientDrawCallback)
|
if (display->clientDrawCallback)
|
||||||
{
|
{
|
||||||
display->clientDrawCallback(display->recordedTexture,
|
display->clientDrawCallback(display->recordedTexture,
|
||||||
display->recordedTextureWidth, display->recordedTextureHeight);
|
display->recordedTextureWidth, display->recordedTextureHeight);
|
||||||
|
@ -2117,7 +2120,7 @@ gst_gl_display_draw_graphic (GstGLDisplay* display)
|
||||||
|
|
||||||
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->recordedTexture);
|
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->recordedTexture);
|
||||||
glEnable (GL_TEXTURE_RECTANGLE_ARB);
|
glEnable (GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
|
||||||
glBegin (GL_QUADS);
|
glBegin (GL_QUADS);
|
||||||
glTexCoord2i (display->recordedTextureWidth, 0);
|
glTexCoord2i (display->recordedTextureWidth, 0);
|
||||||
glVertex2f (1.0f, 1.0f);
|
glVertex2f (1.0f, 1.0f);
|
||||||
|
@ -2152,12 +2155,12 @@ gst_gl_display_draw_graphic (GstGLDisplay* display)
|
||||||
void
|
void
|
||||||
gst_gl_display_fill_video (GstGLDisplay* display)
|
gst_gl_display_fill_video (GstGLDisplay* display)
|
||||||
{
|
{
|
||||||
|
|
||||||
gint width = display->outputWidth;
|
gint width = display->outputWidth;
|
||||||
gint height = display->outputHeight;
|
gint height = display->outputHeight;
|
||||||
GstVideoFormat outputVideo_format = display->outputVideo_format;
|
GstVideoFormat outputVideo_format = display->outputVideo_format;
|
||||||
gpointer data = display->outputData;
|
gpointer data = display->outputData;
|
||||||
|
|
||||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, display->videoFBO);
|
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, display->videoFBO);
|
||||||
|
|
||||||
glPushAttrib(GL_VIEWPORT_BIT);
|
glPushAttrib(GL_VIEWPORT_BIT);
|
||||||
|
@ -2179,15 +2182,15 @@ gst_gl_display_fill_video (GstGLDisplay* display)
|
||||||
case GST_VIDEO_FORMAT_BGRx:
|
case GST_VIDEO_FORMAT_BGRx:
|
||||||
case GST_VIDEO_FORMAT_xRGB:
|
case GST_VIDEO_FORMAT_xRGB:
|
||||||
case GST_VIDEO_FORMAT_xBGR:
|
case GST_VIDEO_FORMAT_xBGR:
|
||||||
{
|
{
|
||||||
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
|
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
|
||||||
|
|
||||||
glClearColor(0.0, 0.0, 0.0, 0.0);
|
glClearColor(0.0, 0.0, 0.0, 0.0);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
glMatrixMode (GL_PROJECTION);
|
glMatrixMode (GL_PROJECTION);
|
||||||
glLoadIdentity ();
|
glLoadIdentity ();
|
||||||
|
|
||||||
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->graphicTexture);
|
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->graphicTexture);
|
||||||
glEnable(GL_TEXTURE_RECTANGLE_ARB);
|
glEnable(GL_TEXTURE_RECTANGLE_ARB);
|
||||||
}
|
}
|
||||||
|
@ -2198,8 +2201,8 @@ gst_gl_display_fill_video (GstGLDisplay* display)
|
||||||
{
|
{
|
||||||
gint i=0;
|
gint i=0;
|
||||||
GLhandleARB GLSLProgram_to_YUY2_UYVY = 0;
|
GLhandleARB GLSLProgram_to_YUY2_UYVY = 0;
|
||||||
|
|
||||||
switch (outputVideo_format)
|
switch (outputVideo_format)
|
||||||
{
|
{
|
||||||
case GST_VIDEO_FORMAT_YUY2:
|
case GST_VIDEO_FORMAT_YUY2:
|
||||||
GLSLProgram_to_YUY2_UYVY = display->GLSLProgram_to_YUY2;
|
GLSLProgram_to_YUY2_UYVY = display->GLSLProgram_to_YUY2;
|
||||||
|
@ -2209,7 +2212,7 @@ gst_gl_display_fill_video (GstGLDisplay* display)
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
}
|
}
|
||||||
|
|
||||||
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
|
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
|
||||||
|
|
||||||
|
@ -2232,9 +2235,9 @@ gst_gl_display_fill_video (GstGLDisplay* display)
|
||||||
case GST_VIDEO_FORMAT_YV12:
|
case GST_VIDEO_FORMAT_YV12:
|
||||||
{
|
{
|
||||||
gint i=0;
|
gint i=0;
|
||||||
|
|
||||||
glDrawBuffers(3, display->multipleRT);
|
glDrawBuffers(3, display->multipleRT);
|
||||||
|
|
||||||
glClearColor(0.0, 0.0, 0.0, 0.0);
|
glClearColor(0.0, 0.0, 0.0, 0.0);
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
||||||
|
|
||||||
|
@ -2289,7 +2292,7 @@ gst_gl_display_fill_video (GstGLDisplay* display)
|
||||||
glVertex2f (-1.0f, -1.0f);
|
glVertex2f (-1.0f, -1.0f);
|
||||||
glTexCoord2i (width, height);
|
glTexCoord2i (width, height);
|
||||||
glVertex2f (1.0f, -1.0f);
|
glVertex2f (1.0f, -1.0f);
|
||||||
glEnd ();
|
glEnd ();
|
||||||
|
|
||||||
glDrawBuffer(GL_NONE);
|
glDrawBuffer(GL_NONE);
|
||||||
|
|
||||||
|
@ -2339,7 +2342,7 @@ gst_gl_display_fill_video (GstGLDisplay* display)
|
||||||
gint offsetU = 0;
|
gint offsetU = 0;
|
||||||
gint offsetV = 0;
|
gint offsetV = 0;
|
||||||
|
|
||||||
switch (outputVideo_format)
|
switch (outputVideo_format)
|
||||||
{
|
{
|
||||||
case GST_VIDEO_FORMAT_I420:
|
case GST_VIDEO_FORMAT_I420:
|
||||||
offsetU = 1;
|
offsetU = 1;
|
||||||
|
@ -2357,13 +2360,13 @@ gst_gl_display_fill_video (GstGLDisplay* display)
|
||||||
GL_UNSIGNED_BYTE, data);
|
GL_UNSIGNED_BYTE, data);
|
||||||
|
|
||||||
glReadBuffer(GL_COLOR_ATTACHMENT1_EXT);
|
glReadBuffer(GL_COLOR_ATTACHMENT1_EXT);
|
||||||
glReadPixels (0, 0, GST_ROUND_UP_2 (width) / 2, GST_ROUND_UP_2 (height) / 2,
|
glReadPixels (0, 0, GST_ROUND_UP_2 (width) / 2, GST_ROUND_UP_2 (height) / 2,
|
||||||
GL_LUMINANCE, GL_UNSIGNED_BYTE,
|
GL_LUMINANCE, GL_UNSIGNED_BYTE,
|
||||||
(guint8 *) data +
|
(guint8 *) data +
|
||||||
gst_video_format_get_component_offset (outputVideo_format, offsetU, width, height));
|
gst_video_format_get_component_offset (outputVideo_format, offsetU, width, height));
|
||||||
|
|
||||||
glReadBuffer(GL_COLOR_ATTACHMENT2_EXT);
|
glReadBuffer(GL_COLOR_ATTACHMENT2_EXT);
|
||||||
glReadPixels (0, 0, GST_ROUND_UP_2 (width) / 2, GST_ROUND_UP_2 (height) / 2,
|
glReadPixels (0, 0, GST_ROUND_UP_2 (width) / 2, GST_ROUND_UP_2 (height) / 2,
|
||||||
GL_LUMINANCE, GL_UNSIGNED_BYTE,
|
GL_LUMINANCE, GL_UNSIGNED_BYTE,
|
||||||
(guint8 *) data +
|
(guint8 *) data +
|
||||||
gst_video_format_get_component_offset (outputVideo_format, offsetV, width, height));
|
gst_video_format_get_component_offset (outputVideo_format, offsetV, width, height));
|
||||||
|
@ -2380,11 +2383,11 @@ gst_gl_display_fill_video (GstGLDisplay* display)
|
||||||
|
|
||||||
/* called by gst_gl_display_glutCreateWindow (in the glut thread) */
|
/* called by gst_gl_display_glutCreateWindow (in the glut thread) */
|
||||||
GLhandleARB
|
GLhandleARB
|
||||||
gst_gl_display_loadGLSLprogram (gchar* textFProgram)
|
gst_gl_display_loadGLSLprogram (gchar* textFProgram)
|
||||||
{
|
{
|
||||||
GLhandleARB FHandle = 0;
|
GLhandleARB FHandle = 0;
|
||||||
GLhandleARB PHandle = 0;
|
GLhandleARB PHandle = 0;
|
||||||
gchar s[32768];
|
gchar s[32768];
|
||||||
gint i = 0;
|
gint i = 0;
|
||||||
|
|
||||||
//Set up program objects
|
//Set up program objects
|
||||||
|
@ -2413,7 +2416,7 @@ gst_gl_display_loadGLSLprogram (gchar* textFProgram)
|
||||||
|
|
||||||
|
|
||||||
/* Called by gst_gl_display_fill_video */
|
/* Called by gst_gl_display_fill_video */
|
||||||
void
|
void
|
||||||
checkFramebufferStatus(void)
|
checkFramebufferStatus(void)
|
||||||
{
|
{
|
||||||
GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
|
GLenum status = glCheckFramebufferStatusEXT(GL_FRAMEBUFFER_EXT);
|
||||||
|
|
Loading…
Reference in a new issue