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_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 -----------------
display->upload_width = 0;
display->upload_height = 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_height = 0;
display->upload_data = NULL;
}
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);
gint opengl_version_major = 0;
gint opengl_version_minor = 0;
if ((opengl_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) )
{
//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;
}
}
glutDestroyWindow (display->glutWinId);
//colorspace_conversion specific
- switch (display->colorspace_conversion)
+ switch (display->upload_colorspace_conversion)
{
case GST_GL_DISPLAY_CONVERSION_MESA:
case GST_GL_DISPLAY_CONVERSION_MATRIX:
{
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)
{
case GST_VIDEO_FORMAT_RGBx:
case GST_VIDEO_FORMAT_AYUV:
//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 */
if (GLEW_ARB_fragment_shader)
{
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)
{
default:
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
else if (GLEW_MESA_ycbcr_texture)
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);
- display->colorspace_conversion = GST_GL_DISPLAY_CONVERSION_MESA;
+ display->upload_colorspace_conversion = GST_GL_DISPLAY_CONVERSION_MESA;
switch (display->upload_video_format)
{
{
//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, GLEW_MESA_ycbcr_texture supported: no\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
display->isAlive = FALSE;
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);
}
glutSetWindow (display->glutWinId);
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);
}
{
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)
-
- //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);
+ if (GLEW_EXT_framebuffer_object)
+ {
+ GST_DEBUG ("Context %d, EXT_framebuffer_object supported: yes", display->glutWinId);
- //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);
+ //-- init output frame buffer object (GL -> video)
- //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);
+ //setup FBO
+ glGenFramebuffersEXT (1, &display->download_fbo);
+ glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, display->download_fbo);
- 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:
- case GST_VIDEO_FORMAT_YUY2:
- case GST_VIDEO_FORMAT_UYVY:
- case GST_VIDEO_FORMAT_AYUV:
- //only one attached texture is needed
- break;
+ //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);
- case GST_VIDEO_FORMAT_I420:
- case GST_VIDEO_FORMAT_YV12:
- //setup a second texture to render to
- glGenTextures (1, &display->download_texture_u);
- glBindTexture(GL_TEXTURE_RECTANGLE_ARB, display->download_texture_u);
+ //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_WRAP_S, 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
- glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT,
- GL_TEXTURE_RECTANGLE_ARB, display->download_texture_u, 0);
+ //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);
- //setup a third texture to render to
- 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);
+ switch (display->download_video_format)
+ {
+ 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:
+ case GST_VIDEO_FORMAT_YV12:
+ //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);
- //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);
+ //attach the second texture to the FBO to renderer to
+ glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT1_EXT,
+ GL_TEXTURE_RECTANGLE_ARB, display->download_texture_u, 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 ();
- }
+ //setup a third texture to render to
+ 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 depth render buffer to the FBO
- glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
- GL_RENDERBUFFER_EXT, display->download_depth_buffer);
+ //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);
- gst_gl_display_check_framebuffer_status();
+ 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 ();
+ }
- g_assert (glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT) ==
- GL_FRAMEBUFFER_COMPLETE_EXT);
+ //attach the depth render buffer to the FBO
+ glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT,
+ GL_RENDERBUFFER_EXT, display->download_depth_buffer);
- //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;
+ 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;
+ default:
+ g_assert_not_reached ();
}
switch (display->download_video_format)
gst_gl_display_thread_do_download (GstGLDisplay * display)
{
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);
}
//setup a texture to render to
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
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
//opengl scene
//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);
glDisable (GL_TEXTURE_RECTANGLE_ARB);
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, 0);
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->upload_intex);
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:
- 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,
0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, NULL);
-
-if (display->upload_intex_u == 0) {
glGenTextures (1, &display->upload_intex_u);
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->upload_intex_u);
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
width, height,
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;
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,
width, height,
0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, NULL);
-if (display->upload_intex_u == 0) {
glGenTextures (1, &display->upload_intex_u);
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->upload_intex_u);
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA8,
width, height,
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;
case GST_VIDEO_FORMAT_I420:
width, height,
0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
- if (display->upload_intex_u == 0) {
glGenTextures (1, &display->upload_intex_u);
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->upload_intex_u);
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE,
GST_ROUND_UP_2 (width) / 2,
GST_ROUND_UP_2 (height) / 2,
0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
- }
- if (display->upload_intex_v == 0) {
glGenTextures (1, &display->upload_intex_v);
glBindTexture (GL_TEXTURE_RECTANGLE_ARB, display->upload_intex_v);
glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE,
GST_ROUND_UP_2 (width) / 2,
GST_ROUND_UP_2 (height) / 2,
0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
- }
break;
default:
gint height = display->upload_data_height;
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) {
+ 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:
glTexSubImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, width, height,
GL_RGBA, GL_UNSIGNED_BYTE, data);
GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, data);
break;
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_MATRIX:
case GST_GL_DISPLAY_CONVERSION_MESA:
glTexSubImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, width, height,
GL_YCBCR_MESA, GL_UNSIGNED_SHORT_8_8_REV_MESA, data);
- display->upload_video_format = GST_VIDEO_FORMAT_RGBx;
break;
default:
g_assert_not_reached ();
}
break;
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_MATRIX:
case GST_GL_DISPLAY_CONVERSION_MESA:
glTexSubImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, width, height,
GL_YCBCR_MESA, GL_UNSIGNED_SHORT_8_8_MESA, data);
- display->upload_video_format = GST_VIDEO_FORMAT_RGBx;
break;
default:
g_assert_not_reached ();
{
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
glFramebufferTexture2DEXT(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT,
GL_TEXTURE_RECTANGLE_ARB, display->upload_outtex, 0);
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_UYVY:
{
glDrawBuffer(GL_NONE);
//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);
glDisable(GL_TEXTURE_RECTANGLE_ARB);
/* called by gst_gl_display_thread_do_download (in the gl thread) */
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 height = display->download_height;
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_UYVY:
{
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_xRGB:
glReadPixels (0, 0, width, height, GL_BGRA,