/* * GStreamer * Copyright (C) 2015 Julien Isorce * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Library General Public * License as published by the Free Software Foundation; either * version 2 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Library General Public License for more details. * * You should have received a copy of the GNU Library General Public * License along with this library; if not, write to the * Free Software Foundation, Inc., 51 Franklin St, Fifth Floor, * Boston, MA 02110-1301, USA. */ #ifdef HAVE_CONFIG_H #include "config.h" #endif #include "gstglcontext_gpu_process.h" #include "gstglwindow_gpu_process.h" #define GST_GL_CONTEXT_GPU_PROCESS_GET_PRIVATE(o) \ (G_TYPE_INSTANCE_GET_PRIVATE((o), GST_GL_TYPE_CONTEXT_GPU_PROCESS, GstGLContextGPUProcessPrivate)) #define GST_CAT_DEFAULT gst_gl_context_debug #define gst_gl_context_gpu_process_parent_class parent_class G_DEFINE_TYPE (GstGLContextGPUProcess, gst_gl_context_gpu_process, GST_GL_TYPE_CONTEXT); struct _GstGLContextGPUProcessPrivate { GstGLAPI gl_api; }; static guintptr gst_gl_context_gpu_process_get_gl_context (GstGLContext * context) { return 0; } static GstGLAPI gst_gl_context_gpu_process_get_gl_api (GstGLContext * context) { return GST_GL_CONTEXT_GPU_PROCESS (context)->priv->gl_api; } static GstGLPlatform gst_gl_context_gpu_process_get_gl_platform (GstGLContext * context) { return GST_GL_PLATFORM_GPU_PROCESS; } static gboolean gst_gl_context_gpu_process_activate (GstGLContext * context, gboolean activate) { return TRUE; } static void gst_gl_context_gpu_process_finalize (GObject * object) { GstGLContext *context = GST_GL_CONTEXT (object); GST_GL_WINDOW_GET_CLASS (context->window)->close (context->window); G_OBJECT_CLASS (parent_class)->finalize (object); } static void gst_gl_context_gpu_process_class_init (GstGLContextGPUProcessClass * klass) { GObjectClass *obj_class = G_OBJECT_CLASS (klass); GstGLContextClass *context_class = (GstGLContextClass *) klass; g_type_class_add_private (klass, sizeof (GstGLContextGPUProcessPrivate)); obj_class->finalize = gst_gl_context_gpu_process_finalize; context_class->get_gl_context = GST_DEBUG_FUNCPTR (gst_gl_context_gpu_process_get_gl_context); context_class->get_gl_api = GST_DEBUG_FUNCPTR (gst_gl_context_gpu_process_get_gl_api); context_class->get_gl_platform = GST_DEBUG_FUNCPTR (gst_gl_context_gpu_process_get_gl_platform); context_class->activate = GST_DEBUG_FUNCPTR (gst_gl_context_gpu_process_activate); } static void gst_gl_context_gpu_process_init (GstGLContextGPUProcess * context) { context->priv = GST_GL_CONTEXT_GPU_PROCESS_GET_PRIVATE (context); } GstGLContext * gst_gl_context_gpu_process_new (GstGLDisplay * display, GstGLAPI gl_api, GstGLProcAddrFunc proc_addr) { GstGLContext *context = NULL; GstGLContextGPUProcess *gpu_context = NULL; GstGLContextClass *context_class = NULL; GstGLWindow *window = NULL; GError *error = NULL; g_return_val_if_fail ((gst_gl_display_get_gl_api (display) & gl_api) != GST_GL_API_NONE, NULL); gpu_context = g_object_new (GST_GL_TYPE_CONTEXT_GPU_PROCESS, NULL); gpu_context->priv->gl_api = gl_api; context = GST_GL_CONTEXT (gpu_context); gst_gl_context_set_display (context, display); gst_gl_display_add_context (display, context); context_class = GST_GL_CONTEXT_GET_CLASS (context); context_class->get_current_context = NULL; context_class->get_proc_address = GST_DEBUG_FUNCPTR (proc_addr); gst_gl_context_activate (context, TRUE); gst_gl_context_fill_info (context, &error); if (error) { GST_ERROR_OBJECT (context, "Failed to create gpu process context: %s", error->message); g_error_free (error); gst_object_unref (context); return NULL; } window = GST_GL_WINDOW (gst_gl_window_gpu_process_new (display)); gst_gl_context_set_window (context, window); GST_GL_WINDOW_GET_CLASS (window)->open (window, NULL); gst_object_unref (window); return context; }