summaryrefslogtreecommitdiff
path: root/gst-libs/gst/gl/gstglbuffer.c
diff options
context:
space:
mode:
Diffstat (limited to 'gst-libs/gst/gl/gstglbuffer.c')
-rw-r--r--gst-libs/gst/gl/gstglbuffer.c454
1 files changed, 0 insertions, 454 deletions
diff --git a/gst-libs/gst/gl/gstglbuffer.c b/gst-libs/gst/gl/gstglbuffer.c
deleted file mode 100644
index b046823..0000000
--- a/gst-libs/gst/gl/gstglbuffer.c
+++ /dev/null
@@ -1,454 +0,0 @@
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <gstglbuffer.h>
-#include <gstgldisplay.h>
-#include <GL/glext.h>
-#include <unistd.h>
-#include "glextensions.h"
-
-#include <string.h>
-
-static GObjectClass *gst_gl_buffer_parent_class;
-
-static void
-gst_gl_buffer_finalize (GstGLBuffer * buffer)
-{
- gst_gl_display_lock (buffer->display);
-
- glDeleteTextures (1, &buffer->texture);
- if (buffer->texture_u) {
- glDeleteTextures (1, &buffer->texture_u);
- }
- if (buffer->texture_v) {
- glDeleteTextures (1, &buffer->texture_v);
- }
-
- gst_gl_display_unlock (buffer->display);
- g_object_unref (buffer->display);
-
- GST_MINI_OBJECT_CLASS (gst_gl_buffer_parent_class)->
- finalize (GST_MINI_OBJECT (buffer));
-}
-
-static void
-gst_gl_buffer_init (GstGLBuffer * buffer, gpointer g_class)
-{
-
-}
-
-static void
-gst_gl_buffer_class_init (gpointer g_class, gpointer class_data)
-{
- GstMiniObjectClass *mini_object_class = GST_MINI_OBJECT_CLASS (g_class);
-
- gst_gl_buffer_parent_class = g_type_class_peek_parent (g_class);
-
- mini_object_class->finalize = (GstMiniObjectFinalizeFunction)
- gst_gl_buffer_finalize;
-}
-
-
-GType
-gst_gl_buffer_get_type (void)
-{
- static GType _gst_gl_buffer_type;
-
- if (G_UNLIKELY (_gst_gl_buffer_type == 0)) {
- static const GTypeInfo info = {
- sizeof (GstBufferClass),
- NULL,
- NULL,
- gst_gl_buffer_class_init,
- NULL,
- NULL,
- sizeof (GstGLBuffer),
- 0,
- (GInstanceInitFunc) gst_gl_buffer_init,
- NULL
- };
- _gst_gl_buffer_type = g_type_register_static (GST_TYPE_BUFFER,
- "GstGLBuffer", &info, 0);
- }
- return _gst_gl_buffer_type;
-}
-
-
-GstGLBuffer *
-gst_gl_buffer_new (GstGLDisplay * display, int width, int height)
-{
- g_return_val_if_fail (display != NULL, NULL);
- g_return_val_if_fail (width > 0, NULL);
- g_return_val_if_fail (height > 0, NULL);
-
- return gst_gl_buffer_new_with_format (display, GST_GL_BUFFER_FORMAT_RGBA,
- width, height);
-}
-
-GstGLBuffer *
-gst_gl_buffer_new_with_format (GstGLDisplay * display,
- GstGLBufferFormat format, int width, int height)
-{
- GstGLBuffer *buffer;
-
- g_return_val_if_fail (format != GST_GL_BUFFER_FORMAT_UNKNOWN, NULL);
- g_return_val_if_fail (display != NULL, NULL);
- g_return_val_if_fail (width > 0, NULL);
- g_return_val_if_fail (height > 0, NULL);
-
- buffer = (GstGLBuffer *) gst_mini_object_new (GST_TYPE_GL_BUFFER);
-
- buffer->display = g_object_ref (display);
- buffer->width = width;
- buffer->height = height;
- buffer->format = format;
- GST_BUFFER_SIZE (buffer) = gst_gl_buffer_format_get_size (format, width,
- height);
-
- gst_gl_display_lock (buffer->display);
- glGenTextures (1, &buffer->texture);
- glBindTexture (GL_TEXTURE_RECTANGLE_ARB, buffer->texture);
- switch (format) {
- case GST_GL_BUFFER_FORMAT_RGBA:
- glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGBA,
- buffer->width, buffer->height, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
- break;
- case GST_GL_BUFFER_FORMAT_RGB:
- glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_RGB,
- buffer->width, buffer->height, 0, GL_RGB, GL_UNSIGNED_BYTE, NULL);
- break;
- case GST_GL_BUFFER_FORMAT_YUYV:
- glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_YCBCR_MESA,
- buffer->width, buffer->height,
- 0, GL_YCBCR_MESA, GL_UNSIGNED_SHORT_8_8_REV_MESA, NULL);
- break;
- case GST_GL_BUFFER_FORMAT_PLANAR444:
- glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE,
- buffer->width, buffer->height,
- 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
-
- glGenTextures (1, &buffer->texture_u);
- glBindTexture (GL_TEXTURE_RECTANGLE_ARB, buffer->texture_u);
- glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE,
- buffer->width, buffer->height,
- 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
-
- glGenTextures (1, &buffer->texture_v);
- glBindTexture (GL_TEXTURE_RECTANGLE_ARB, buffer->texture_v);
- glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE,
- buffer->width, buffer->height,
- 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
- break;
- case GST_GL_BUFFER_FORMAT_PLANAR422:
- glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE,
- buffer->width, buffer->height,
- 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
-
- glGenTextures (1, &buffer->texture_u);
- glBindTexture (GL_TEXTURE_RECTANGLE_ARB, buffer->texture_u);
- glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE,
- GST_ROUND_UP_2 (buffer->width) / 2, buffer->height,
- 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
-
- glGenTextures (1, &buffer->texture_v);
- glBindTexture (GL_TEXTURE_RECTANGLE_ARB, buffer->texture_v);
- glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE,
- GST_ROUND_UP_2 (buffer->width) / 2, buffer->height,
- 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
- break;
- case GST_GL_BUFFER_FORMAT_PLANAR420:
- glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE,
- buffer->width, buffer->height,
- 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
-
- glGenTextures (1, &buffer->texture_u);
- glBindTexture (GL_TEXTURE_RECTANGLE_ARB, buffer->texture_u);
- glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE,
- GST_ROUND_UP_2 (buffer->width) / 2,
- GST_ROUND_UP_2 (buffer->height) / 2,
- 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
-
- glGenTextures (1, &buffer->texture_v);
- glBindTexture (GL_TEXTURE_RECTANGLE_ARB, buffer->texture_v);
- glTexImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, GL_LUMINANCE,
- GST_ROUND_UP_2 (buffer->width) / 2,
- GST_ROUND_UP_2 (buffer->height) / 2,
- 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, NULL);
- break;
- default:
- g_warning ("GL buffer format not handled");
- }
-
- gst_gl_display_unlock (buffer->display);
-
- return buffer;
-}
-
-GstGLBuffer *
-gst_gl_buffer_new_from_video_format (GstGLDisplay * display,
- GstVideoFormat video_format, int width, int height)
-{
- GstGLBuffer *buffer;
-
- g_return_val_if_fail (width > 0, NULL);
- g_return_val_if_fail (height > 0, NULL);
-
- buffer = gst_gl_buffer_new_with_format (display,
- gst_gl_buffer_format_from_video_format (video_format), width, height);
-
- switch (video_format) {
- case GST_VIDEO_FORMAT_RGBx:
- case GST_VIDEO_FORMAT_BGRx:
- case GST_VIDEO_FORMAT_xRGB:
- case GST_VIDEO_FORMAT_xBGR:
- buffer->is_yuv = FALSE;
- break;
- case GST_VIDEO_FORMAT_YUY2:
- case GST_VIDEO_FORMAT_UYVY:
- /* counterintuitive: when you use a GL_YCBCR_MESA texture, the
- * colorspace is automatically converted, so it's referred to
- * as RGB */
- buffer->is_yuv = FALSE;
- break;
- case GST_VIDEO_FORMAT_AYUV:
- case GST_VIDEO_FORMAT_I420:
- case GST_VIDEO_FORMAT_YV12:
- buffer->is_yuv = TRUE;
- break;
- default:
- g_assert_not_reached ();
- }
-
- return buffer;
-}
-
-void
-gst_gl_buffer_upload (GstGLBuffer * buffer, GstVideoFormat video_format,
- void *data)
-{
- int width = buffer->width;
- int height = buffer->height;
-
- GST_DEBUG ("uploading %p %dx%d", data, width, height);
-
- g_return_if_fail (buffer->format ==
- gst_gl_buffer_format_from_video_format (video_format));
-
- gst_gl_display_lock (buffer->display);
- glBindTexture (GL_TEXTURE_RECTANGLE_ARB, buffer->texture);
-
- switch (video_format) {
- case GST_VIDEO_FORMAT_RGBx:
- glTexSubImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, width, height,
- GL_RGBA, GL_UNSIGNED_BYTE, data);
- break;
- case GST_VIDEO_FORMAT_BGRx:
- glTexSubImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, width, height,
- GL_BGRA, GL_UNSIGNED_BYTE, data);
- break;
- case GST_VIDEO_FORMAT_AYUV:
- case GST_VIDEO_FORMAT_xRGB:
- glTexSubImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, width, height,
- GL_BGRA, GL_UNSIGNED_INT_8_8_8_8, data);
- break;
- case GST_VIDEO_FORMAT_xBGR:
- glTexSubImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, width, height,
- GL_RGBA, GL_UNSIGNED_INT_8_8_8_8, data);
- break;
- case GST_VIDEO_FORMAT_YUY2:
- glTexSubImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, width, height,
- GL_YCBCR_MESA, GL_UNSIGNED_SHORT_8_8_REV_MESA, data);
- break;
- case GST_VIDEO_FORMAT_UYVY:
- glTexSubImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, width, height,
- GL_YCBCR_MESA, GL_UNSIGNED_SHORT_8_8_MESA, data);
- break;
- case GST_VIDEO_FORMAT_I420:
- case GST_VIDEO_FORMAT_YV12:
- glTexSubImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0, width, height,
- GL_LUMINANCE, GL_UNSIGNED_BYTE, data);
-
- glBindTexture (GL_TEXTURE_RECTANGLE_ARB, buffer->texture_u);
- glTexSubImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0,
- GST_ROUND_UP_2 (buffer->width) / 2,
- GST_ROUND_UP_2 (buffer->height) / 2,
- GL_LUMINANCE, GL_UNSIGNED_BYTE,
- (guint8 *) data +
- gst_video_format_get_component_offset (video_format, 1, width,
- height));
-
- glBindTexture (GL_TEXTURE_RECTANGLE_ARB, buffer->texture_v);
- glTexSubImage2D (GL_TEXTURE_RECTANGLE_ARB, 0, 0, 0,
- GST_ROUND_UP_2 (buffer->width) / 2,
- GST_ROUND_UP_2 (buffer->height) / 2,
- GL_LUMINANCE, GL_UNSIGNED_BYTE,
- (guint8 *) data +
- gst_video_format_get_component_offset (video_format, 2, width,
- height));
- break;
- default:
- g_assert_not_reached ();
- }
-
- gst_gl_display_unlock (buffer->display);
-}
-
-
-void
-gst_gl_buffer_download (GstGLBuffer * buffer, GstVideoFormat video_format,
- void *data)
-{
- GLuint fbo;
-
- g_return_if_fail (buffer->format ==
- gst_gl_buffer_format_from_video_format (video_format));
-
- GST_DEBUG ("downloading");
-
- gst_gl_display_lock (buffer->display);
-
- /* we need a reset function */
- glMatrixMode (GL_COLOR);
- glLoadIdentity ();
- glPixelTransferf (GL_POST_COLOR_MATRIX_RED_BIAS, 0);
- glPixelTransferf (GL_POST_COLOR_MATRIX_GREEN_BIAS, 0);
- glPixelTransferf (GL_POST_COLOR_MATRIX_BLUE_BIAS, 0);
-
- glGenFramebuffersEXT (1, &fbo);
- glBindFramebufferEXT (GL_FRAMEBUFFER_EXT, fbo);
-
- glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT,
- GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_RECTANGLE_ARB, buffer->texture, 0);
-
- glDrawBuffer (GL_COLOR_ATTACHMENT1_EXT);
- glReadBuffer (GL_COLOR_ATTACHMENT1_EXT);
-
- g_assert (glCheckFramebufferStatusEXT (GL_FRAMEBUFFER_EXT) ==
- GL_FRAMEBUFFER_COMPLETE_EXT);
-
- switch (video_format) {
- case GST_VIDEO_FORMAT_RGBx:
- glReadPixels (0, 0, buffer->width, buffer->height, GL_RGBA,
- GL_UNSIGNED_BYTE, data);
- break;
- case GST_VIDEO_FORMAT_BGRx:
- glReadPixels (0, 0, buffer->width, buffer->height, GL_BGRA,
- GL_UNSIGNED_BYTE, data);
- break;
- case GST_VIDEO_FORMAT_xBGR:
- glReadPixels (0, 0, buffer->width, buffer->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, buffer->width, buffer->height, GL_BGRA,
- GL_UNSIGNED_INT_8_8_8_8, data);
- break;
- case GST_VIDEO_FORMAT_YUY2:
- case GST_VIDEO_FORMAT_UYVY:
- g_warning ("video format not supported for download from GL texture");
- break;
- case GST_VIDEO_FORMAT_I420:
- case GST_VIDEO_FORMAT_YV12:
- glReadPixels (0, 0, buffer->width, buffer->height,
- GL_LUMINANCE, GL_UNSIGNED_BYTE, data);
-
- glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT,
- GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_RECTANGLE_ARB,
- buffer->texture_u, 0);
- glReadPixels (0, 0,
- GST_ROUND_UP_2 (buffer->width) / 2,
- GST_ROUND_UP_2 (buffer->height) / 2,
- GL_LUMINANCE, GL_UNSIGNED_BYTE,
- (guint8 *) data +
- gst_video_format_get_component_offset (video_format, 1, buffer->width,
- buffer->height));
-
- glFramebufferTexture2DEXT (GL_FRAMEBUFFER_EXT,
- GL_COLOR_ATTACHMENT1_EXT, GL_TEXTURE_RECTANGLE_ARB,
- buffer->texture_v, 0);
- glReadPixels (0, 0,
- GST_ROUND_UP_2 (buffer->width) / 2,
- GST_ROUND_UP_2 (buffer->height) / 2,
- GL_LUMINANCE, GL_UNSIGNED_BYTE,
- (guint8 *) data +
- gst_video_format_get_component_offset (video_format, 2, buffer->width,
- buffer->height));
- break;
- default:
- g_assert_not_reached ();
- }
-
- glDeleteFramebuffersEXT (1, &fbo);
-
- gst_gl_display_unlock (buffer->display);
-}
-
-
-
-/* buffer format */
-
-GstGLBufferFormat
-gst_gl_buffer_format_from_video_format (GstVideoFormat format)
-{
- switch (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:
- return GST_GL_BUFFER_FORMAT_RGBA;
- case GST_VIDEO_FORMAT_RGB:
- case GST_VIDEO_FORMAT_BGR:
- return GST_GL_BUFFER_FORMAT_RGB;
- case GST_VIDEO_FORMAT_YUY2:
- case GST_VIDEO_FORMAT_UYVY:
- return GST_GL_BUFFER_FORMAT_YUYV;
- case GST_VIDEO_FORMAT_I420:
- case GST_VIDEO_FORMAT_YV12:
- return GST_GL_BUFFER_FORMAT_PLANAR420;
- default:
- GST_WARNING ("GstVideoFormat %d not implemented", format);
- /* fall through */
- case GST_VIDEO_FORMAT_UNKNOWN:
- return GST_GL_BUFFER_FORMAT_UNKNOWN;
- }
-
- g_return_val_if_reached (GST_GL_BUFFER_FORMAT_UNKNOWN);
-}
-
-int
-gst_gl_buffer_format_get_size (GstGLBufferFormat format, int width, int height)
-{
- /* this is not strictly true, but it's used for compatibility with
- * queue and BaseTransform */
- return width * height * 4;
-}
-
-gboolean
-gst_gl_buffer_format_parse_caps (GstCaps * caps, GstGLBufferFormat * format,
- int *width, int *height)
-{
- GstStructure *structure;
- int format_as_int;
- gboolean ret;
-
- structure = gst_caps_get_structure (caps, 0);
-
- if (!gst_structure_has_name (structure, "video/x-raw-gl")) {
- return FALSE;
- }
-
- ret = gst_structure_get_int (structure, "format", &format_as_int);
- *format = format_as_int;
- ret &= gst_structure_get_int (structure, "width", width);
- ret &= gst_structure_get_int (structure, "height", height);
-
- return ret;
-}