mirror of
https://gitlab.freedesktop.org/gstreamer/gstreamer.git
synced 2024-11-27 20:21:24 +00:00
[206/906] Do not use frame buffer object when "input video is RGB" or when "GLSL is not available and YCbCr is available". So frame buffer object is not a plugin requirement anymore. So I decreased the OpengGL version from 1.4 to 1.2 (maybe less?)
This commit is contained in:
parent
35d1c73109
commit
1b8b53fb1c
2 changed files with 317 additions and 278 deletions
|
@ -72,8 +72,8 @@ void gst_gl_display_check_framebuffer_status (void);
|
||||||
static void gst_gl_display_thread_do_upload_make (GstGLDisplay *display);
|
static void gst_gl_display_thread_do_upload_make (GstGLDisplay *display);
|
||||||
static void gst_gl_display_thread_do_upload_fill (GstGLDisplay *display);
|
static void gst_gl_display_thread_do_upload_fill (GstGLDisplay *display);
|
||||||
static void gst_gl_display_thread_do_upload_draw (GstGLDisplay *display);
|
static void gst_gl_display_thread_do_upload_draw (GstGLDisplay *display);
|
||||||
static void gst_gl_display_thread_do_download_draw (GstGLDisplay *display);
|
static void gst_gl_display_thread_do_download_draw_rgb (GstGLDisplay *display);
|
||||||
|
static void gst_gl_display_thread_do_download_draw_yuv (GstGLDisplay *display);
|
||||||
|
|
||||||
//------------------------------------------------------------
|
//------------------------------------------------------------
|
||||||
//-------------------- GL context management -----------------
|
//-------------------- GL context management -----------------
|
||||||
|
@ -169,7 +169,7 @@ gst_gl_display_init (GstGLDisplay *display, GstGLDisplayClass *klass)
|
||||||
display->upload_width = 0;
|
display->upload_width = 0;
|
||||||
display->upload_height = 0;
|
display->upload_height = 0;
|
||||||
display->upload_video_format = 0;
|
display->upload_video_format = 0;
|
||||||
display->colorspace_conversion = GST_GL_DISPLAY_CONVERSION_MESA;
|
display->upload_colorspace_conversion = GST_GL_DISPLAY_CONVERSION_MESA;
|
||||||
display->upload_data_width = 0;
|
display->upload_data_width = 0;
|
||||||
display->upload_data_height = 0;
|
display->upload_data_height = 0;
|
||||||
display->upload_data = NULL;
|
display->upload_data = NULL;
|
||||||
|
@ -689,7 +689,7 @@ gst_gl_display_thread_create_context (GstGLDisplay *display)
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
//OpenGL > 2.1.0 and Glew > 1.5.0
|
//OpenGL > 1.2.0 and Glew > 1.4.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);
|
||||||
gint opengl_version_major = 0;
|
gint opengl_version_major = 0;
|
||||||
gint opengl_version_minor = 0;
|
gint opengl_version_minor = 0;
|
||||||
|
@ -708,11 +708,11 @@ gst_gl_display_thread_create_context (GstGLDisplay *display)
|
||||||
|
|
||||||
if ((opengl_version_major < 1) ||
|
if ((opengl_version_major < 1) ||
|
||||||
(GLEW_VERSION_MAJOR < 1) ||
|
(GLEW_VERSION_MAJOR < 1) ||
|
||||||
(opengl_version_major < 2 && opengl_version_major >= 1 && opengl_version_minor < 4) ||
|
(opengl_version_major < 2 && opengl_version_major >= 1 && opengl_version_minor < 2) ||
|
||||||
(GLEW_VERSION_MAJOR < 2 && GLEW_VERSION_MAJOR >= 1 && GLEW_VERSION_MINOR < 4) )
|
(GLEW_VERSION_MAJOR < 2 && GLEW_VERSION_MAJOR >= 1 && GLEW_VERSION_MINOR < 4) )
|
||||||
{
|
{
|
||||||
//turn off the pipeline, the old drivers are not yet supported
|
//turn off the pipeline, the old drivers are not yet supported
|
||||||
g_warning ("Required OpenGL >= 1.4.0 and Glew >= 1.4.0\n");
|
g_warning ("Required OpenGL >= 1.2.0 and Glew >= 1.4.0\n");
|
||||||
display->isAlive = FALSE;
|
display->isAlive = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -744,7 +744,7 @@ gst_gl_display_thread_destroy_context (GstGLDisplay *display)
|
||||||
glutDestroyWindow (display->glutWinId);
|
glutDestroyWindow (display->glutWinId);
|
||||||
|
|
||||||
//colorspace_conversion specific
|
//colorspace_conversion specific
|
||||||
switch (display->colorspace_conversion)
|
switch (display->upload_colorspace_conversion)
|
||||||
{
|
{
|
||||||
case GST_GL_DISPLAY_CONVERSION_MESA:
|
case GST_GL_DISPLAY_CONVERSION_MESA:
|
||||||
case GST_GL_DISPLAY_CONVERSION_MATRIX:
|
case GST_GL_DISPLAY_CONVERSION_MATRIX:
|
||||||
|
@ -941,57 +941,6 @@ gst_gl_display_thread_init_upload (GstGLDisplay *display)
|
||||||
{
|
{
|
||||||
glutSetWindow (display->glutWinId);
|
glutSetWindow (display->glutWinId);
|
||||||
|
|
||||||
//Frame buffer object is a requirement for every cases
|
|
||||||
if (GLEW_EXT_framebuffer_object)
|
|
||||||
{
|
|
||||||
//a texture must be attached to the FBO
|
|
||||||
GLuint fake_texture = 0;
|
|
||||||
|
|
||||||
g_print ("Context %d, EXT_framebuffer_object supported: yes\n", display->glutWinId);
|
|
||||||
|
|
||||||
//-- init intput frame buffer object (video -> GL)
|
|
||||||
|
|
||||||
//setup FBO
|
|
||||||
glGenFramebuffersEXT (1, &display->upload_fbo);
|
|
||||||
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, display->upload_fbo);
|
|
||||||
|
|
||||||
//setup the render buffer for depth
|
|
||||||
glGenRenderbuffersEXT(1, &display->upload_depth_buffer);
|
|
||||||
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, display->upload_depth_buffer);
|
|
||||||
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT,
|
|
||||||
display->upload_width, display->upload_height);
|
|
||||||
|
|
||||||
//a fake texture is attached to the upload FBO (cannot init without it)
|
|
||||||
glGenTextures (1, &fake_texture);
|
|
||||||
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, fake_texture);
|
|
||||||
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
|
||||||
display->upload_width, display->upload_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
|
||||||
|
|
||||||
//attach the texture to the FBO to renderer to
|
|
||||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
|
|
||||||
GL_TEXTURE_RECTANGLE_ARB, fake_texture, 0);
|
|
||||||
|
|
||||||
//attach the depth render buffer to the FBO
|
|
||||||
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
|
|
||||||
GL_RENDERBUFFER_EXT, display->upload_depth_buffer);
|
|
||||||
|
|
||||||
gst_gl_display_check_framebuffer_status();
|
|
||||||
|
|
||||||
g_assert (glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT) ==
|
|
||||||
GL_FRAMEBUFFER_COMPLETE_EXT);
|
|
||||||
|
|
||||||
//unbind the FBO
|
|
||||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
|
||||||
|
|
||||||
glDeleteTextures (1, &fake_texture);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//turn off the pipeline because Frame buffer object is a requirement
|
|
||||||
g_print ("Context %d, EXT_framebuffer_object supported: no\n", display->glutWinId);
|
|
||||||
display->isAlive = FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (display->upload_video_format)
|
switch (display->upload_video_format)
|
||||||
{
|
{
|
||||||
case GST_VIDEO_FORMAT_RGBx:
|
case GST_VIDEO_FORMAT_RGBx:
|
||||||
|
@ -1013,13 +962,64 @@ gst_gl_display_thread_init_upload (GstGLDisplay *display)
|
||||||
case GST_VIDEO_FORMAT_AYUV:
|
case GST_VIDEO_FORMAT_AYUV:
|
||||||
//color space conversion is needed
|
//color space conversion is needed
|
||||||
{
|
{
|
||||||
//check if fragment shader is available, then load them
|
//Frame buffer object is a requirement for every cases
|
||||||
|
if (GLEW_EXT_framebuffer_object)
|
||||||
|
{
|
||||||
|
//a texture must be attached to the FBO
|
||||||
|
GLuint fake_texture = 0;
|
||||||
|
|
||||||
|
g_print ("Context %d, EXT_framebuffer_object supported: yes\n", display->glutWinId);
|
||||||
|
|
||||||
|
//-- init intput frame buffer object (video -> GL)
|
||||||
|
|
||||||
|
//setup FBO
|
||||||
|
glGenFramebuffersEXT (1, &display->upload_fbo);
|
||||||
|
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, display->upload_fbo);
|
||||||
|
|
||||||
|
//setup the render buffer for depth
|
||||||
|
glGenRenderbuffersEXT(1, &display->upload_depth_buffer);
|
||||||
|
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, display->upload_depth_buffer);
|
||||||
|
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT,
|
||||||
|
display->upload_width, display->upload_height);
|
||||||
|
|
||||||
|
//a fake texture is attached to the upload FBO (cannot init without it)
|
||||||
|
glGenTextures (1, &fake_texture);
|
||||||
|
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, fake_texture);
|
||||||
|
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
||||||
|
display->upload_width, display->upload_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
||||||
|
|
||||||
|
//attach the texture to the FBO to renderer to
|
||||||
|
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
|
||||||
|
GL_TEXTURE_RECTANGLE_ARB, fake_texture, 0);
|
||||||
|
|
||||||
|
//attach the depth render buffer to the FBO
|
||||||
|
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
|
||||||
|
GL_RENDERBUFFER_EXT, display->upload_depth_buffer);
|
||||||
|
|
||||||
|
gst_gl_display_check_framebuffer_status();
|
||||||
|
|
||||||
|
g_assert (glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT) ==
|
||||||
|
GL_FRAMEBUFFER_COMPLETE_EXT);
|
||||||
|
|
||||||
|
//unbind the FBO
|
||||||
|
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
||||||
|
|
||||||
|
glDeleteTextures (1, &fake_texture);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//turn off the pipeline because Frame buffer object is a not present
|
||||||
|
g_print ("Context %d, EXT_framebuffer_object supported: no\n", display->glutWinId);
|
||||||
|
display->isAlive = FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
//check if fragment shader is available, then load them
|
||||||
/* shouldn't we require ARB_shading_language_100? --Filippo */
|
/* shouldn't we require ARB_shading_language_100? --Filippo */
|
||||||
if (GLEW_ARB_fragment_shader)
|
if (GLEW_ARB_fragment_shader)
|
||||||
{
|
{
|
||||||
g_print ("Context %d, ARB_fragment_shader supported: yes\n", display->glutWinId);
|
g_print ("Context %d, ARB_fragment_shader supported: yes\n", display->glutWinId);
|
||||||
|
|
||||||
display->colorspace_conversion = GST_GL_DISPLAY_CONVERSION_GLSL;
|
display->upload_colorspace_conversion = GST_GL_DISPLAY_CONVERSION_GLSL;
|
||||||
|
|
||||||
switch (display->upload_video_format)
|
switch (display->upload_video_format)
|
||||||
{
|
{
|
||||||
|
@ -1085,6 +1085,9 @@ gst_gl_display_thread_init_upload (GstGLDisplay *display)
|
||||||
default:
|
default:
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//alloc texture (related to upload) memory only on time
|
||||||
|
gst_gl_display_thread_do_upload_make (display);
|
||||||
}
|
}
|
||||||
//check if YCBCR MESA is available
|
//check if YCBCR MESA is available
|
||||||
else if (GLEW_MESA_ycbcr_texture)
|
else if (GLEW_MESA_ycbcr_texture)
|
||||||
|
@ -1094,7 +1097,7 @@ gst_gl_display_thread_init_upload (GstGLDisplay *display)
|
||||||
g_print ("Context %d, GLEW_ARB_imaging supported: no\n", display->glutWinId);
|
g_print ("Context %d, GLEW_ARB_imaging supported: no\n", display->glutWinId);
|
||||||
g_print ("Context %d, GLEW_MESA_ycbcr_texture supported: yes\n", display->glutWinId);
|
g_print ("Context %d, GLEW_MESA_ycbcr_texture supported: yes\n", display->glutWinId);
|
||||||
|
|
||||||
display->colorspace_conversion = GST_GL_DISPLAY_CONVERSION_MESA;
|
display->upload_colorspace_conversion = GST_GL_DISPLAY_CONVERSION_MESA;
|
||||||
|
|
||||||
switch (display->upload_video_format)
|
switch (display->upload_video_format)
|
||||||
{
|
{
|
||||||
|
@ -1117,9 +1120,10 @@ gst_gl_display_thread_init_upload (GstGLDisplay *display)
|
||||||
{
|
{
|
||||||
//GLSL is not available on your drivers, switch to Color Matrix
|
//GLSL is not available on your drivers, switch to Color Matrix
|
||||||
g_print ("Context %d, ARB_fragment_shader supported: no\n", display->glutWinId);
|
g_print ("Context %d, ARB_fragment_shader supported: no\n", display->glutWinId);
|
||||||
|
g_print ("Context %d, GLEW_MESA_ycbcr_texture supported: no\n", display->glutWinId);
|
||||||
g_print ("Context %d, GLEW_ARB_imaging supported: yes\n", display->glutWinId);
|
g_print ("Context %d, GLEW_ARB_imaging supported: yes\n", display->glutWinId);
|
||||||
|
|
||||||
display->colorspace_conversion = GST_GL_DISPLAY_CONVERSION_MATRIX;
|
display->upload_colorspace_conversion = GST_GL_DISPLAY_CONVERSION_MATRIX;
|
||||||
|
|
||||||
//turn off the pipeline because we do not support it yet
|
//turn off the pipeline because we do not support it yet
|
||||||
display->isAlive = FALSE;
|
display->isAlive = FALSE;
|
||||||
|
@ -1139,9 +1143,6 @@ gst_gl_display_thread_init_upload (GstGLDisplay *display)
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
}
|
}
|
||||||
|
|
||||||
//alloc texture (related to upload) memory only on time
|
|
||||||
gst_gl_display_thread_do_upload_make (display);
|
|
||||||
|
|
||||||
g_cond_signal (display->cond_init_upload);
|
g_cond_signal (display->cond_init_upload);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1153,7 +1154,48 @@ gst_gl_display_thread_do_upload (GstGLDisplay *display)
|
||||||
glutSetWindow (display->glutWinId);
|
glutSetWindow (display->glutWinId);
|
||||||
|
|
||||||
gst_gl_display_thread_do_upload_fill (display);
|
gst_gl_display_thread_do_upload_fill (display);
|
||||||
gst_gl_display_thread_do_upload_draw (display);
|
|
||||||
|
switch (display->upload_video_format)
|
||||||
|
{
|
||||||
|
case GST_VIDEO_FORMAT_RGBx:
|
||||||
|
case GST_VIDEO_FORMAT_BGRx:
|
||||||
|
case GST_VIDEO_FORMAT_xRGB:
|
||||||
|
case GST_VIDEO_FORMAT_xBGR:
|
||||||
|
case GST_VIDEO_FORMAT_RGBA:
|
||||||
|
case GST_VIDEO_FORMAT_BGRA:
|
||||||
|
case GST_VIDEO_FORMAT_ARGB:
|
||||||
|
case GST_VIDEO_FORMAT_ABGR:
|
||||||
|
case GST_VIDEO_FORMAT_RGB:
|
||||||
|
case GST_VIDEO_FORMAT_BGR:
|
||||||
|
//color space conversion is not needed
|
||||||
|
break;
|
||||||
|
case GST_VIDEO_FORMAT_YUY2:
|
||||||
|
case GST_VIDEO_FORMAT_UYVY:
|
||||||
|
case GST_VIDEO_FORMAT_I420:
|
||||||
|
case GST_VIDEO_FORMAT_YV12:
|
||||||
|
case GST_VIDEO_FORMAT_AYUV:
|
||||||
|
{
|
||||||
|
switch (display->upload_colorspace_conversion)
|
||||||
|
{
|
||||||
|
case GST_GL_DISPLAY_CONVERSION_GLSL:
|
||||||
|
//color space conversion is needed
|
||||||
|
gst_gl_display_thread_do_upload_draw (display);
|
||||||
|
break;
|
||||||
|
case GST_GL_DISPLAY_CONVERSION_MATRIX:
|
||||||
|
//color space conversion is needed
|
||||||
|
//not yet supported
|
||||||
|
break;
|
||||||
|
case GST_GL_DISPLAY_CONVERSION_MESA:
|
||||||
|
//color space conversion is not needed
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
}
|
||||||
|
|
||||||
g_cond_signal (display->cond_do_upload);
|
g_cond_signal (display->cond_do_upload);
|
||||||
}
|
}
|
||||||
|
@ -1165,59 +1207,47 @@ gst_gl_display_thread_init_download (GstGLDisplay *display)
|
||||||
{
|
{
|
||||||
glutSetWindow (display->glutWinId);
|
glutSetWindow (display->glutWinId);
|
||||||
|
|
||||||
if (GLEW_EXT_framebuffer_object)
|
switch (display->download_video_format)
|
||||||
|
{
|
||||||
|
case GST_VIDEO_FORMAT_RGBx:
|
||||||
|
case GST_VIDEO_FORMAT_BGRx:
|
||||||
|
case GST_VIDEO_FORMAT_xRGB:
|
||||||
|
case GST_VIDEO_FORMAT_xBGR:
|
||||||
|
case GST_VIDEO_FORMAT_RGBA:
|
||||||
|
case GST_VIDEO_FORMAT_BGRA:
|
||||||
|
case GST_VIDEO_FORMAT_ARGB:
|
||||||
|
case GST_VIDEO_FORMAT_ABGR:
|
||||||
|
case GST_VIDEO_FORMAT_RGB:
|
||||||
|
case GST_VIDEO_FORMAT_BGR:
|
||||||
|
//color space conversion is not needed
|
||||||
|
break;
|
||||||
|
case GST_VIDEO_FORMAT_YUY2:
|
||||||
|
case GST_VIDEO_FORMAT_UYVY:
|
||||||
|
case GST_VIDEO_FORMAT_I420:
|
||||||
|
case GST_VIDEO_FORMAT_YV12:
|
||||||
|
case GST_VIDEO_FORMAT_AYUV:
|
||||||
|
//color space conversion is needed
|
||||||
{
|
{
|
||||||
GST_DEBUG ("Context %d, EXT_framebuffer_object supported: yes", display->glutWinId);
|
|
||||||
|
|
||||||
//-- init output frame buffer object (GL -> video)
|
if (GLEW_EXT_framebuffer_object)
|
||||||
|
|
||||||
//setup FBO
|
|
||||||
glGenFramebuffersEXT (1, &display->download_fbo);
|
|
||||||
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, display->download_fbo);
|
|
||||||
|
|
||||||
//setup the render buffer for depth
|
|
||||||
glGenRenderbuffersEXT(1, &display->download_depth_buffer);
|
|
||||||
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, display->download_depth_buffer);
|
|
||||||
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT,
|
|
||||||
display->download_width, display->download_height);
|
|
||||||
|
|
||||||
//setup a first texture to render to
|
|
||||||
glGenTextures (1, &display->download_texture);
|
|
||||||
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->download_texture);
|
|
||||||
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
|
||||||
display->download_width, display->download_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_MIN_FILTER, GL_LINEAR);
|
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, 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
|
|
||||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
|
|
||||||
GL_TEXTURE_RECTANGLE_ARB, display->download_texture, 0);
|
|
||||||
|
|
||||||
switch (display->download_video_format)
|
|
||||||
{
|
{
|
||||||
case GST_VIDEO_FORMAT_RGBx:
|
GST_DEBUG ("Context %d, EXT_framebuffer_object supported: yes", display->glutWinId);
|
||||||
case GST_VIDEO_FORMAT_BGRx:
|
|
||||||
case GST_VIDEO_FORMAT_xRGB:
|
|
||||||
case GST_VIDEO_FORMAT_xBGR:
|
|
||||||
case GST_VIDEO_FORMAT_RGBA:
|
|
||||||
case GST_VIDEO_FORMAT_BGRA:
|
|
||||||
case GST_VIDEO_FORMAT_ARGB:
|
|
||||||
case GST_VIDEO_FORMAT_ABGR:
|
|
||||||
case GST_VIDEO_FORMAT_RGB:
|
|
||||||
case GST_VIDEO_FORMAT_BGR:
|
|
||||||
case GST_VIDEO_FORMAT_YUY2:
|
|
||||||
case GST_VIDEO_FORMAT_UYVY:
|
|
||||||
case GST_VIDEO_FORMAT_AYUV:
|
|
||||||
//only one attached texture is needed
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_VIDEO_FORMAT_I420:
|
//-- init output frame buffer object (GL -> video)
|
||||||
case GST_VIDEO_FORMAT_YV12:
|
|
||||||
//setup a second texture to render to
|
//setup FBO
|
||||||
glGenTextures (1, &display->download_texture_u);
|
glGenFramebuffersEXT (1, &display->download_fbo);
|
||||||
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->download_texture_u);
|
glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, display->download_fbo);
|
||||||
|
|
||||||
|
//setup the render buffer for depth
|
||||||
|
glGenRenderbuffersEXT(1, &display->download_depth_buffer);
|
||||||
|
glBindRenderbufferEXT(GL_RENDERBUFFER_EXT, display->download_depth_buffer);
|
||||||
|
glRenderbufferStorageEXT(GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT,
|
||||||
|
display->download_width, display->download_height);
|
||||||
|
|
||||||
|
//setup a first texture to render to
|
||||||
|
glGenTextures (1, &display->download_texture);
|
||||||
|
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->download_texture);
|
||||||
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
||||||
display->download_width, display->download_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
display->download_width, display->download_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);
|
||||||
|
@ -1225,49 +1255,78 @@ gst_gl_display_thread_init_download (GstGLDisplay *display)
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
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 first texture to the FBO to renderer to
|
||||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT,
|
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
|
||||||
GL_TEXTURE_RECTANGLE_ARB, display->download_texture_u, 0);
|
GL_TEXTURE_RECTANGLE_ARB, display->download_texture, 0);
|
||||||
|
|
||||||
//setup a third texture to render to
|
switch (display->download_video_format)
|
||||||
glGenTextures (1, &display->download_texture_v);
|
{
|
||||||
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->download_texture_v);
|
case GST_VIDEO_FORMAT_YUY2:
|
||||||
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
case GST_VIDEO_FORMAT_UYVY:
|
||||||
display->download_width, display->download_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
case GST_VIDEO_FORMAT_AYUV:
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
|
//only one attached texture is needed
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
|
break;
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, 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
|
case GST_VIDEO_FORMAT_I420:
|
||||||
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT2_EXT,
|
case GST_VIDEO_FORMAT_YV12:
|
||||||
GL_TEXTURE_RECTANGLE_ARB, display->download_texture_v, 0);
|
//setup a second texture to render to
|
||||||
|
glGenTextures (1, &display->download_texture_u);
|
||||||
|
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->download_texture_u);
|
||||||
|
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
||||||
|
display->download_width, display->download_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_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
|
||||||
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
||||||
|
|
||||||
display->multipleRT[0] = GL_COLOR_ATTACHMENT0_EXT;
|
//attach the second texture to the FBO to renderer to
|
||||||
display->multipleRT[1] = GL_COLOR_ATTACHMENT1_EXT;
|
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT,
|
||||||
display->multipleRT[2] = GL_COLOR_ATTACHMENT2_EXT;
|
GL_TEXTURE_RECTANGLE_ARB, display->download_texture_u, 0);
|
||||||
break;
|
|
||||||
default:
|
//setup a third texture to render to
|
||||||
g_assert_not_reached ();
|
glGenTextures (1, &display->download_texture_v);
|
||||||
|
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->download_texture_v);
|
||||||
|
glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
||||||
|
display->download_width, display->download_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_MIN_FILTER, GL_LINEAR);
|
||||||
|
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, 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
|
||||||
|
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT2_EXT,
|
||||||
|
GL_TEXTURE_RECTANGLE_ARB, display->download_texture_v, 0);
|
||||||
|
|
||||||
|
display->multipleRT[0] = GL_COLOR_ATTACHMENT0_EXT;
|
||||||
|
display->multipleRT[1] = GL_COLOR_ATTACHMENT1_EXT;
|
||||||
|
display->multipleRT[2] = GL_COLOR_ATTACHMENT2_EXT;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
}
|
||||||
|
|
||||||
|
//attach the depth render buffer to the FBO
|
||||||
|
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
|
||||||
|
GL_RENDERBUFFER_EXT, display->download_depth_buffer);
|
||||||
|
|
||||||
|
gst_gl_display_check_framebuffer_status();
|
||||||
|
|
||||||
|
g_assert (glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT) ==
|
||||||
|
GL_FRAMEBUFFER_COMPLETE_EXT);
|
||||||
|
|
||||||
|
//unbind the FBO
|
||||||
|
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//turn off the pipeline because Frame buffer object is a requirement
|
||||||
|
g_print ("Context %d, EXT_framebuffer_object supported: no\n", display->glutWinId);
|
||||||
|
display->isAlive = FALSE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
//attach the depth render buffer to the FBO
|
default:
|
||||||
glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
|
g_assert_not_reached ();
|
||||||
GL_RENDERBUFFER_EXT, display->download_depth_buffer);
|
|
||||||
|
|
||||||
gst_gl_display_check_framebuffer_status();
|
|
||||||
|
|
||||||
g_assert (glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT) ==
|
|
||||||
GL_FRAMEBUFFER_COMPLETE_EXT);
|
|
||||||
|
|
||||||
//unbind the FBO
|
|
||||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, 0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
//turn off the pipeline because Frame buffer object is a requirement
|
|
||||||
g_print ("Context %d, EXT_framebuffer_object supported: no\n", display->glutWinId);
|
|
||||||
display->isAlive = FALSE;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (display->download_video_format)
|
switch (display->download_video_format)
|
||||||
|
@ -1373,7 +1432,33 @@ static void
|
||||||
gst_gl_display_thread_do_download (GstGLDisplay * display)
|
gst_gl_display_thread_do_download (GstGLDisplay * display)
|
||||||
{
|
{
|
||||||
glutSetWindow (display->glutWinId);
|
glutSetWindow (display->glutWinId);
|
||||||
gst_gl_display_thread_do_download_draw (display);
|
|
||||||
|
switch (display->download_video_format)
|
||||||
|
{
|
||||||
|
case GST_VIDEO_FORMAT_RGBx:
|
||||||
|
case GST_VIDEO_FORMAT_BGRx:
|
||||||
|
case GST_VIDEO_FORMAT_xRGB:
|
||||||
|
case GST_VIDEO_FORMAT_xBGR:
|
||||||
|
case GST_VIDEO_FORMAT_RGBA:
|
||||||
|
case GST_VIDEO_FORMAT_BGRA:
|
||||||
|
case GST_VIDEO_FORMAT_ARGB:
|
||||||
|
case GST_VIDEO_FORMAT_ABGR:
|
||||||
|
case GST_VIDEO_FORMAT_RGB:
|
||||||
|
case GST_VIDEO_FORMAT_BGR:
|
||||||
|
//color space conversion is not needed
|
||||||
|
gst_gl_display_thread_do_download_draw_rgb (display);
|
||||||
|
break;
|
||||||
|
case GST_VIDEO_FORMAT_YUY2:
|
||||||
|
case GST_VIDEO_FORMAT_UYVY:
|
||||||
|
case GST_VIDEO_FORMAT_I420:
|
||||||
|
case GST_VIDEO_FORMAT_YV12:
|
||||||
|
case GST_VIDEO_FORMAT_AYUV:
|
||||||
|
//color space conversion is needed
|
||||||
|
gst_gl_display_thread_do_download_draw_yuv (display);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
}
|
||||||
g_cond_signal (display->cond_do_download);
|
g_cond_signal (display->cond_do_download);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1435,8 +1520,6 @@ gst_gl_display_thread_use_fbo (GstGLDisplay *display)
|
||||||
|
|
||||||
//setup a texture to render to
|
//setup a texture to render to
|
||||||
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->use_fbo_texture);
|
glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->use_fbo_texture);
|
||||||
/*glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
|
||||||
display->use_fbo_width, display->use_fbo_height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);*/
|
|
||||||
|
|
||||||
//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,
|
||||||
|
@ -1656,7 +1739,7 @@ void gst_gl_display_on_draw(void)
|
||||||
//opengl scene
|
//opengl scene
|
||||||
|
|
||||||
//make sure that the environnement is clean
|
//make sure that the environnement is clean
|
||||||
if (display->colorspace_conversion == GST_GL_DISPLAY_CONVERSION_GLSL)
|
if (display->upload_colorspace_conversion == GST_GL_DISPLAY_CONVERSION_GLSL)
|
||||||
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);
|
||||||
|
@ -2243,75 +2326,25 @@ void gst_gl_display_thread_do_upload_make (GstGLDisplay *display)
|
||||||
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->upload_intex);
|
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->upload_intex);
|
||||||
switch (display->upload_video_format)
|
switch (display->upload_video_format)
|
||||||
{
|
{
|
||||||
case GST_VIDEO_FORMAT_RGBx:
|
|
||||||
case GST_VIDEO_FORMAT_BGRx:
|
|
||||||
case GST_VIDEO_FORMAT_xRGB:
|
|
||||||
case GST_VIDEO_FORMAT_xBGR:
|
|
||||||
case GST_VIDEO_FORMAT_RGBA:
|
|
||||||
case GST_VIDEO_FORMAT_BGRA:
|
|
||||||
case GST_VIDEO_FORMAT_ARGB:
|
|
||||||
case GST_VIDEO_FORMAT_ABGR:
|
|
||||||
case GST_VIDEO_FORMAT_AYUV:
|
|
||||||
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA,
|
|
||||||
width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_VIDEO_FORMAT_RGB:
|
|
||||||
case GST_VIDEO_FORMAT_BGR:
|
|
||||||
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB,
|
|
||||||
width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_VIDEO_FORMAT_YUY2:
|
case GST_VIDEO_FORMAT_YUY2:
|
||||||
switch (display->colorspace_conversion)
|
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE_ALPHA,
|
||||||
{
|
|
||||||
case GST_GL_DISPLAY_CONVERSION_GLSL:
|
|
||||||
case GST_GL_DISPLAY_CONVERSION_MATRIX:
|
|
||||||
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE_ALPHA,
|
|
||||||
width, height,
|
width, height,
|
||||||
0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, NULL);
|
0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, NULL);
|
||||||
|
|
||||||
if (display->upload_intex_u == 0) {
|
|
||||||
glGenTextures (1, &display->upload_intex_u);
|
glGenTextures (1, &display->upload_intex_u);
|
||||||
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->upload_intex_u);
|
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->upload_intex_u);
|
||||||
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
||||||
width, height,
|
width, height,
|
||||||
0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
|
0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
|
||||||
}
|
|
||||||
break;
|
|
||||||
case GST_GL_DISPLAY_CONVERSION_MESA:
|
|
||||||
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_YCBCR_MESA,
|
|
||||||
width, height,
|
|
||||||
0, GL_YCBCR_MESA, GL_UNSIGNED_SHORT_8_8_MESA, NULL);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_assert_not_reached ();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
case GST_VIDEO_FORMAT_UYVY:
|
case GST_VIDEO_FORMAT_UYVY:
|
||||||
switch (display->colorspace_conversion)
|
|
||||||
{
|
|
||||||
case GST_GL_DISPLAY_CONVERSION_GLSL:
|
|
||||||
case GST_GL_DISPLAY_CONVERSION_MATRIX:
|
|
||||||
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE_ALPHA,
|
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE_ALPHA,
|
||||||
width, height,
|
width, height,
|
||||||
0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, NULL);
|
0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, NULL);
|
||||||
if (display->upload_intex_u == 0) {
|
|
||||||
glGenTextures (1, &display->upload_intex_u);
|
glGenTextures (1, &display->upload_intex_u);
|
||||||
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->upload_intex_u);
|
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->upload_intex_u);
|
||||||
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
|
||||||
width, height,
|
width, height,
|
||||||
0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
|
0, GL_BGRA, GL_UNSIGNED_INT_8_8_8_8_REV, NULL);
|
||||||
break;
|
|
||||||
}
|
|
||||||
case GST_GL_DISPLAY_CONVERSION_MESA:
|
|
||||||
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_YCBCR_MESA,
|
|
||||||
width, height,
|
|
||||||
0, GL_YCBCR_MESA, GL_UNSIGNED_SHORT_8_8_MESA, NULL);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
g_assert_not_reached ();
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case GST_VIDEO_FORMAT_I420:
|
case GST_VIDEO_FORMAT_I420:
|
||||||
|
@ -2320,23 +2353,19 @@ g_assert_not_reached ();
|
||||||
width, height,
|
width, height,
|
||||||
0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
|
0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
|
||||||
|
|
||||||
if (display->upload_intex_u == 0) {
|
|
||||||
glGenTextures (1, &display->upload_intex_u);
|
glGenTextures (1, &display->upload_intex_u);
|
||||||
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->upload_intex_u);
|
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->upload_intex_u);
|
||||||
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE,
|
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE,
|
||||||
GST_ROUND_UP_2 (width) / 2,
|
GST_ROUND_UP_2 (width) / 2,
|
||||||
GST_ROUND_UP_2 (height) / 2,
|
GST_ROUND_UP_2 (height) / 2,
|
||||||
0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
|
0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
|
||||||
}
|
|
||||||
|
|
||||||
if (display->upload_intex_v == 0) {
|
|
||||||
glGenTextures (1, &display->upload_intex_v);
|
glGenTextures (1, &display->upload_intex_v);
|
||||||
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->upload_intex_v);
|
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->upload_intex_v);
|
||||||
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE,
|
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE,
|
||||||
GST_ROUND_UP_2 (width) / 2,
|
GST_ROUND_UP_2 (width) / 2,
|
||||||
GST_ROUND_UP_2 (height) / 2,
|
GST_ROUND_UP_2 (height) / 2,
|
||||||
0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
|
0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -2353,9 +2382,42 @@ gst_gl_display_thread_do_upload_fill (GstGLDisplay *display)
|
||||||
gint height = display->upload_data_height;
|
gint height = display->upload_data_height;
|
||||||
gpointer data = display->upload_data;
|
gpointer data = display->upload_data;
|
||||||
|
|
||||||
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->upload_intex);
|
switch (display->upload_video_format)
|
||||||
|
{
|
||||||
|
case GST_VIDEO_FORMAT_RGB:
|
||||||
|
case GST_VIDEO_FORMAT_BGR:
|
||||||
|
case GST_VIDEO_FORMAT_RGBx:
|
||||||
|
case GST_VIDEO_FORMAT_BGRx:
|
||||||
|
case GST_VIDEO_FORMAT_xRGB:
|
||||||
|
case GST_VIDEO_FORMAT_xBGR:
|
||||||
|
case GST_VIDEO_FORMAT_RGBA:
|
||||||
|
case GST_VIDEO_FORMAT_BGRA:
|
||||||
|
case GST_VIDEO_FORMAT_ARGB:
|
||||||
|
case GST_VIDEO_FORMAT_ABGR:
|
||||||
|
//color space conversion is not needed
|
||||||
|
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->upload_outtex);
|
||||||
|
break;
|
||||||
|
case GST_VIDEO_FORMAT_YUY2:
|
||||||
|
case GST_VIDEO_FORMAT_UYVY:
|
||||||
|
case GST_VIDEO_FORMAT_I420:
|
||||||
|
case GST_VIDEO_FORMAT_YV12:
|
||||||
|
case GST_VIDEO_FORMAT_AYUV:
|
||||||
|
//color space conversion is needed
|
||||||
|
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->upload_intex);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
}
|
||||||
|
|
||||||
switch (display->upload_video_format) {
|
switch (display->upload_video_format) {
|
||||||
|
case GST_VIDEO_FORMAT_RGB:
|
||||||
|
glTexSubImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, width, height,
|
||||||
|
GL_RGB, GL_UNSIGNED_BYTE, data);
|
||||||
|
break;
|
||||||
|
case GST_VIDEO_FORMAT_BGR:
|
||||||
|
glTexSubImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, width, height,
|
||||||
|
GL_BGR, GL_UNSIGNED_BYTE, data);
|
||||||
|
break;
|
||||||
case GST_VIDEO_FORMAT_RGBx:
|
case GST_VIDEO_FORMAT_RGBx:
|
||||||
glTexSubImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, width, height,
|
glTexSubImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, width, height,
|
||||||
GL_RGBA, GL_UNSIGNED_BYTE, data);
|
GL_RGBA, GL_UNSIGNED_BYTE, data);
|
||||||
|
@ -2374,7 +2436,7 @@ gst_gl_display_thread_do_upload_fill (GstGLDisplay *display)
|
||||||
GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, data);
|
GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, data);
|
||||||
break;
|
break;
|
||||||
case GST_VIDEO_FORMAT_YUY2:
|
case GST_VIDEO_FORMAT_YUY2:
|
||||||
switch (display->colorspace_conversion)
|
switch (display->upload_colorspace_conversion)
|
||||||
{
|
{
|
||||||
case GST_GL_DISPLAY_CONVERSION_GLSL:
|
case GST_GL_DISPLAY_CONVERSION_GLSL:
|
||||||
case GST_GL_DISPLAY_CONVERSION_MATRIX:
|
case GST_GL_DISPLAY_CONVERSION_MATRIX:
|
||||||
|
@ -2389,14 +2451,13 @@ gst_gl_display_thread_do_upload_fill (GstGLDisplay *display)
|
||||||
case GST_GL_DISPLAY_CONVERSION_MESA:
|
case GST_GL_DISPLAY_CONVERSION_MESA:
|
||||||
glTexSubImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, width, height,
|
glTexSubImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, width, height,
|
||||||
GL_YCBCR_MESA, GL_UNSIGNED_SHORT_8_8_REV_MESA, data);
|
GL_YCBCR_MESA, GL_UNSIGNED_SHORT_8_8_REV_MESA, data);
|
||||||
display->upload_video_format = GST_VIDEO_FORMAT_RGBx;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case GST_VIDEO_FORMAT_UYVY:
|
case GST_VIDEO_FORMAT_UYVY:
|
||||||
switch (display->colorspace_conversion)
|
switch (display->upload_colorspace_conversion)
|
||||||
{
|
{
|
||||||
case GST_GL_DISPLAY_CONVERSION_GLSL:
|
case GST_GL_DISPLAY_CONVERSION_GLSL:
|
||||||
case GST_GL_DISPLAY_CONVERSION_MATRIX:
|
case GST_GL_DISPLAY_CONVERSION_MATRIX:
|
||||||
|
@ -2411,7 +2472,6 @@ gst_gl_display_thread_do_upload_fill (GstGLDisplay *display)
|
||||||
case GST_GL_DISPLAY_CONVERSION_MESA:
|
case GST_GL_DISPLAY_CONVERSION_MESA:
|
||||||
glTexSubImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, width, height,
|
glTexSubImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, width, height,
|
||||||
GL_YCBCR_MESA, GL_UNSIGNED_SHORT_8_8_MESA, data);
|
GL_YCBCR_MESA, GL_UNSIGNED_SHORT_8_8_MESA, data);
|
||||||
display->upload_video_format = GST_VIDEO_FORMAT_RGBx;
|
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
g_assert_not_reached ();
|
g_assert_not_reached ();
|
||||||
|
@ -2480,15 +2540,6 @@ gst_gl_display_thread_do_upload_draw (GstGLDisplay *display)
|
||||||
{
|
{
|
||||||
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, display->upload_fbo);
|
glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, display->upload_fbo);
|
||||||
|
|
||||||
/* no more needed? upload_outtex should already be in the pool */
|
|
||||||
/* glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->upload_outtex); */
|
|
||||||
/* glTexImage2D(GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8, */
|
|
||||||
/* display->upload_width, display->upload_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_MIN_FILTER, GL_LINEAR); */
|
|
||||||
/* glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_S, 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->upload_outtex, 0);
|
GL_TEXTURE_RECTANGLE_ARB, display->upload_outtex, 0);
|
||||||
|
@ -2515,24 +2566,6 @@ gst_gl_display_thread_do_upload_draw (GstGLDisplay *display)
|
||||||
|
|
||||||
switch (display->upload_video_format)
|
switch (display->upload_video_format)
|
||||||
{
|
{
|
||||||
case GST_VIDEO_FORMAT_RGBx:
|
|
||||||
case GST_VIDEO_FORMAT_BGRx:
|
|
||||||
case GST_VIDEO_FORMAT_xRGB:
|
|
||||||
case GST_VIDEO_FORMAT_xBGR:
|
|
||||||
{
|
|
||||||
glMatrixMode (GL_PROJECTION);
|
|
||||||
glLoadIdentity ();
|
|
||||||
|
|
||||||
glEnable(GL_TEXTURE_RECTANGLE_ARB);
|
|
||||||
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->upload_intex);
|
|
||||||
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_WRAP_S, GL_CLAMP_TO_EDGE);
|
|
||||||
glTexParameteri (GL_TEXTURE_RECTANGLE_ARB, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
|
|
||||||
glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_VIDEO_FORMAT_YUY2:
|
case GST_VIDEO_FORMAT_YUY2:
|
||||||
case GST_VIDEO_FORMAT_UYVY:
|
case GST_VIDEO_FORMAT_UYVY:
|
||||||
{
|
{
|
||||||
|
@ -2643,7 +2676,7 @@ gst_gl_display_thread_do_upload_draw (GstGLDisplay *display)
|
||||||
glDrawBuffer(GL_NONE);
|
glDrawBuffer(GL_NONE);
|
||||||
|
|
||||||
//we are done with the shader
|
//we are done with the shader
|
||||||
if (display->colorspace_conversion == GST_GL_DISPLAY_CONVERSION_GLSL)
|
if (display->upload_colorspace_conversion == GST_GL_DISPLAY_CONVERSION_GLSL)
|
||||||
glUseProgramObjectARB (0);
|
glUseProgramObjectARB (0);
|
||||||
|
|
||||||
glDisable(GL_TEXTURE_RECTANGLE_ARB);
|
glDisable(GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
@ -2662,7 +2695,43 @@ gst_gl_display_thread_do_upload_draw (GstGLDisplay *display)
|
||||||
|
|
||||||
/* called by gst_gl_display_thread_do_download (in the gl thread) */
|
/* called by gst_gl_display_thread_do_download (in the gl thread) */
|
||||||
void
|
void
|
||||||
gst_gl_display_thread_do_download_draw (GstGLDisplay *display)
|
gst_gl_display_thread_do_download_draw_rgb (GstGLDisplay *display)
|
||||||
|
{
|
||||||
|
gint width = display->download_width;
|
||||||
|
gint height = display->download_height;
|
||||||
|
GstVideoFormat video_format = display->download_video_format;
|
||||||
|
gpointer data = display->download_data;
|
||||||
|
|
||||||
|
glEnable (GL_TEXTURE_RECTANGLE_ARB);
|
||||||
|
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->ouput_texture);
|
||||||
|
|
||||||
|
switch (video_format)
|
||||||
|
{
|
||||||
|
case GST_VIDEO_FORMAT_RGBx:
|
||||||
|
case GST_VIDEO_FORMAT_BGRx:
|
||||||
|
case GST_VIDEO_FORMAT_RGBA:
|
||||||
|
case GST_VIDEO_FORMAT_BGRA:
|
||||||
|
case GST_VIDEO_FORMAT_xBGR:
|
||||||
|
case GST_VIDEO_FORMAT_xRGB:
|
||||||
|
case GST_VIDEO_FORMAT_ARGB:
|
||||||
|
case GST_VIDEO_FORMAT_ABGR:
|
||||||
|
glGetTexImage (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA,
|
||||||
|
GL_UNSIGNED_BYTE, data);
|
||||||
|
break;
|
||||||
|
case GST_VIDEO_FORMAT_RGB:
|
||||||
|
case GST_VIDEO_FORMAT_BGR:
|
||||||
|
glGetTexImage (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB,
|
||||||
|
GL_UNSIGNED_BYTE, data);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
g_assert_not_reached ();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* called by gst_gl_display_thread_do_download (in the gl thread) */
|
||||||
|
void
|
||||||
|
gst_gl_display_thread_do_download_draw_yuv (GstGLDisplay *display)
|
||||||
{
|
{
|
||||||
gint width = display->download_width;
|
gint width = display->download_width;
|
||||||
gint height = display->download_height;
|
gint height = display->download_height;
|
||||||
|
@ -2686,24 +2755,6 @@ gst_gl_display_thread_do_download_draw (GstGLDisplay *display)
|
||||||
|
|
||||||
switch (video_format)
|
switch (video_format)
|
||||||
{
|
{
|
||||||
case GST_VIDEO_FORMAT_RGBx:
|
|
||||||
case GST_VIDEO_FORMAT_BGRx:
|
|
||||||
case GST_VIDEO_FORMAT_xRGB:
|
|
||||||
case GST_VIDEO_FORMAT_xBGR:
|
|
||||||
{
|
|
||||||
glDrawBuffer(GL_COLOR_ATTACHMENT0_EXT);
|
|
||||||
|
|
||||||
glClearColor(0.0, 0.0, 0.0, 0.0);
|
|
||||||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
|
|
||||||
|
|
||||||
glMatrixMode (GL_PROJECTION);
|
|
||||||
glLoadIdentity ();
|
|
||||||
|
|
||||||
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->ouput_texture);
|
|
||||||
glEnable(GL_TEXTURE_RECTANGLE_ARB);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case GST_VIDEO_FORMAT_YUY2:
|
case GST_VIDEO_FORMAT_YUY2:
|
||||||
case GST_VIDEO_FORMAT_UYVY:
|
case GST_VIDEO_FORMAT_UYVY:
|
||||||
{
|
{
|
||||||
|
@ -2818,18 +2869,6 @@ gst_gl_display_thread_do_download_draw (GstGLDisplay *display)
|
||||||
|
|
||||||
switch (video_format)
|
switch (video_format)
|
||||||
{
|
{
|
||||||
case GST_VIDEO_FORMAT_RGBx:
|
|
||||||
glReadPixels (0, 0, width, height, GL_RGBA,
|
|
||||||
GL_UNSIGNED_BYTE, data);
|
|
||||||
break;
|
|
||||||
case GST_VIDEO_FORMAT_BGRx:
|
|
||||||
glReadPixels (0, 0, width, height, GL_BGRA,
|
|
||||||
GL_UNSIGNED_BYTE, data);
|
|
||||||
break;
|
|
||||||
case GST_VIDEO_FORMAT_xBGR:
|
|
||||||
glReadPixels (0, 0, width, height, GL_RGBA,
|
|
||||||
GL_UNSIGNED_INT_8_8_8_8, data);
|
|
||||||
break;
|
|
||||||
case GST_VIDEO_FORMAT_AYUV:
|
case GST_VIDEO_FORMAT_AYUV:
|
||||||
case GST_VIDEO_FORMAT_xRGB:
|
case GST_VIDEO_FORMAT_xRGB:
|
||||||
glReadPixels (0, 0, width, height, GL_BGRA,
|
glReadPixels (0, 0, width, height, GL_BGRA,
|
||||||
|
|
|
@ -174,7 +174,7 @@ struct _GstGLDisplay {
|
||||||
GLuint upload_width;
|
GLuint upload_width;
|
||||||
GLuint upload_height;
|
GLuint upload_height;
|
||||||
GstVideoFormat upload_video_format;
|
GstVideoFormat upload_video_format;
|
||||||
GstGLDisplayConversion colorspace_conversion;
|
GstGLDisplayConversion upload_colorspace_conversion;
|
||||||
gint upload_data_width;
|
gint upload_data_width;
|
||||||
gint upload_data_height;
|
gint upload_data_height;
|
||||||
gpointer upload_data;
|
gpointer upload_data;
|
||||||
|
|
Loading…
Reference in a new issue