summaryrefslogtreecommitdiffstats
path: root/sys/glsink/gstglxwindow.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/glsink/gstglxwindow.c')
-rw-r--r--sys/glsink/gstglxwindow.c241
1 files changed, 0 insertions, 241 deletions
diff --git a/sys/glsink/gstglxwindow.c b/sys/glsink/gstglxwindow.c
deleted file mode 100644
index f442cf06..00000000
--- a/sys/glsink/gstglxwindow.c
+++ /dev/null
@@ -1,241 +0,0 @@
-/* This stores the common OpenGL initialization stuff for all instances */
-
-/* gcc -ansi -pedantic on GNU/Linux causes warnings and errors
- * unless this is defined:
- * warning: #warning "Files using this header must be compiled with _SVID_SOURCE or _XOPEN_SOURCE"
- */
-#ifndef _XOPEN_SOURCE
-# define _XOPEN_SOURCE 1
-#endif
-
-#include <X11/Xlib.h>
-#include <GL/glx.h>
-#include <GL/gl.h>
-#include <GL/glu.h>
-#include "gstglsink.h"
-#include <string.h> /* strncmp */
-
-/* attributes for a single buffered visual in RGBA format with at least
- * 4 bits per color and a 16 bit depth buffer */
-static int attrListSgl[] =
-{
- GLX_RGBA, GLX_RED_SIZE, 4,
- GLX_GREEN_SIZE, 4,
- GLX_BLUE_SIZE, 4,
- GLX_DEPTH_SIZE, 16,
- None
-};
-
-/* attributes for a double buffered visual in RGBA format with at least
- * 4 bits per color and a 16 bit depth buffer */
-static int attrListDbl[] =
- {
- GLX_RGBA, GLX_DOUBLEBUFFER,
- GLX_RED_SIZE, 4,
- GLX_GREEN_SIZE, 4,
- GLX_BLUE_SIZE, 4,
- GLX_DEPTH_SIZE, 16,
- None
- };
-
-
-GLfloat LightAmbient[] = { 0.1, 0.1, 0.1, 1.0 }; /* reddish ambient light */
-GLfloat LightDiffuse[] = { 0.6, 0.6, 0.6, 1.0 }; /* bluish diffuse light. */
-GLfloat LightPosition[] = { 1.5, 1.5, 1.5, 0.0 }; /* position */
-
-
-static void
-gst_glxwindow_free (GstImageInfo *info)
-{
- GstGLImageInfo *window = (GstGLImageInfo *) info;
-
- g_signal_handler_disconnect (window->sink, window->handler_id);
-
- if (window->ctx)
- {
- if (!glXMakeCurrent(window->dpy, None, NULL))
- {
- printf("Could not release drawing context.\n");
- }
- glXDestroyContext(window->dpy, window->ctx);
- window->ctx = NULL;
- }
-#if 0
- /* switch back to original desktop resolution if we were in fs */
- if (GLWin.fs)
- {
- XF86VidModeSwitchToMode(GLWin.dpy, GLWin.screen, &GLWin.deskMode);
- XF86VidModeSetViewPort(GLWin.dpy, GLWin.screen, 0, 0);
- }
-#endif
- XCloseDisplay (window->dpy);
- g_free (window);
-}
-
-static void
-gst_glxwindow_callback(GObject *object, GParamSpec *pspec, GstGLImageInfo *data)
-{
- XWindowAttributes attr;
- XGetWindowAttributes(data->dpy, data->win, &attr);
-
- if (strncmp (pspec->name, "width", 5) == 0 || strncmp (pspec->name, "height", 6) == 0)
- {
- gint w = 0;
- gint h = 0;
- g_object_get (object, "width", &w, NULL);
- g_object_get (object, "height", &h, NULL);
- if (w != attr.width || h != attr.height)
- {
- attr.width = w;
- attr.height = h;
- XResizeWindow (data->dpy, data->win, attr.width, attr.height);
- XMapRaised (data->dpy, data->win);
-
- // resize OpenGL
- //g_warning("resizing in OpenGL");
- glViewport(0, 0, (GLint) w, (GLint) h);
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
-
- GLfloat aspect = (GLfloat) h / (GLfloat) w;
- glFrustum(-1.0, 1.0, -aspect, aspect, 5.0, 500.0);
- }
- }
- if (attr.width != data->width || attr.height != data->height)
- {
- data->width = attr.width;
- data->height = attr.height;
- }
-
-}
-
-void
-gst_glxwindow_new (GstElement *sink)
-{
- XGCValues values;
- GstGLImageInfo *new;
- int glxMajorVersion, glxMinorVersion;
- XSetWindowAttributes attrib;
- XVisualInfo *vi;
- Atom wmDelete;
- Window winDummy;
- unsigned int borderDummy;
- Colormap cmap;
- char* title = "GLSink (experimental)";
-
- new = g_new0 (GstGLImageInfo, 1);
-
- if (sink == NULL)
- {
- sink = gst_element_factory_make ("glsink", "glsink");
- g_assert (sink != NULL);
- }
-
- /* fill in the ImageInfo */
- new->info.id = GST_MAKE_FOURCC ('X', 'l', 'i', 'b');
- new->info.free_info = gst_glxwindow_free;
-
- new->dpy = XOpenDisplay (NULL);
- if (!new->dpy) {
- g_warning ("open display failed!\n");
- g_free (new);
- return;
- }
- new->screen = DefaultScreen(new->dpy);
- /* get an appropriate visual */
- vi = glXChooseVisual(new->dpy, new->screen, attrListDbl);
- if (vi == NULL)
- {
- vi = glXChooseVisual(new->dpy, new->screen, attrListSgl);
- GST_DEBUG(0,"Only Singlebuffered Visual!\n");
- }
- else
- {
- GST_DEBUG(0,"Got Doublebuffered Visual!\n");
- }
- glXQueryVersion(new->dpy, &glxMajorVersion, &glxMinorVersion);
- GST_DEBUG(0,"glX-Version %d.%d\n", glxMajorVersion, glxMinorVersion);
-
- /* create a GLX context */
- new->ctx = glXCreateContext(new->dpy, vi, 0, GL_TRUE);
- /* create a color map */
- cmap = XCreateColormap(new->dpy, RootWindow(new->dpy, vi->screen),
- vi->visual, AllocNone);
- new->attr.colormap = cmap;
- new->attr.border_pixel = 0;
-
- /* set sizes */
- new->x = 0;
- new->y = 0;
- new->width = 10;
- new->height = 10;
-
- new->rotX = 0;
- new->rotY = 0;
- new->zoom = 1;
- new->zoomdir = 0.01;
-
- {
- /* create a window in window mode*/
- new->attr.event_mask = ExposureMask | KeyPressMask | ButtonPressMask |
- StructureNotifyMask;
- new->win = XCreateWindow(new->dpy, RootWindow(new->dpy, vi->screen),
- new->x, new->y, new->width, new->height, 0, vi->depth, InputOutput, vi->visual,
- CWBorderPixel | CWColormap | CWEventMask, &new->attr);
- if (!new->win)
- {
- g_warning ("create window failed\n");
- g_free (new);
- return;
- }
- /* only set window title and handle wm_delete_events if in windowed mode */
- wmDelete = XInternAtom(new->dpy, "WM_DELETE_WINDOW", True);
- XSetWMProtocols(new->dpy, new->win, &wmDelete, 1);
- XSetStandardProperties(new->dpy, new->win, title,
- title, None, NULL, 0, NULL);
- XMapRaised(new->dpy, new->win);
- }
- /* connect the glx-context to the window */
- glXMakeCurrent(new->dpy, new->win, new->ctx);
- XGetGeometry(new->dpy, new->win, &winDummy, &new->x, &new->y,
- &new->width, &new->height, &borderDummy, &new->depth);
- printf("Depth %d\n", new->depth);
- if (glXIsDirect(new->dpy, new->ctx))
- GST_DEBUG (GST_CAT_PLUGIN_INFO, "Congrats, you have Direct Rendering!\n");
- else
- GST_DEBUG (GST_CAT_PLUGIN_INFO, "Sorry, no Direct Rendering possible!\n");
-
- GST_DEBUG(GST_CAT_PLUGIN_INFO, "Initializing OpenGL parameters\n");
- /* initialize OpenGL drawing */
- glEnable(GL_DEPTH_TEST);
- //glShadeModel(GL_SMOOTH);
-
- glEnable(GL_TEXTURE_2D);
- glDisable(GL_CULL_FACE);
- glClearDepth(1.0f);
- glClearColor(0, 0, 0, 0);
-
- glLightfv(GL_LIGHT0, GL_AMBIENT, LightAmbient); /* add lighting. (ambient) */
- glLightfv(GL_LIGHT0, GL_DIFFUSE, LightDiffuse); /* add lighting. (diffuse). */
- glLightfv(GL_LIGHT0, GL_POSITION,LightPosition); /* set light position. */
-
- //glEnable(GL_LIGHT0); // Quick And Dirty Lighting (Assumes Light0 Is Set Up)
- //glEnable(GL_LIGHTING); // Enable Lighting
- glDisable(GL_COLOR_MATERIAL); // Enable Material Coloring
- glEnable(GL_AUTO_NORMAL); // let OpenGL generate the Normals
-
- glDisable(GL_BLEND);
-
- glPolygonMode(GL_FRONT, GL_FILL);
- glPolygonMode(GL_BACK, GL_FILL);
-
- glShadeModel(GL_SMOOTH);
- glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);
-
- XSelectInput (new->dpy, new->win, ExposureMask | StructureNotifyMask);
-
- g_object_set (sink, "hook", new, NULL);
- new->sink = sink;
- new->handler_id = g_signal_connect (sink, "notify", G_CALLBACK (gst_glxwindow_callback), new);
-}
-