[meta-freescale] [meta-fsl-arm][PATCH 5/9] gstreamer1.0-plugins-bad: Support fb backend for gl plugins

Yuqing Zhu b54851 at freescale.com
Wed Jan 27 01:41:56 PST 2016


1. Add fb support in glimagesink
2. Override set_render_rectangle() to support resize

Signed-off-by: Yuqing Zhu <b54851 at freescale.com>
---
 ...lplugin-Support-fb-backend-for-gl-plugins.patch | 758 +++++++++++++++++++++
 .../gstreamer/gstreamer1.0-plugins-bad_%.bbappend  |   1 +
 2 files changed, 759 insertions(+)
 create mode 100755 recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0006-glplugin-Support-fb-backend-for-gl-plugins.patch

diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0006-glplugin-Support-fb-backend-for-gl-plugins.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0006-glplugin-Support-fb-backend-for-gl-plugins.patch
new file mode 100755
index 0000000..1d194d7
--- /dev/null
+++ b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0006-glplugin-Support-fb-backend-for-gl-plugins.patch
@@ -0,0 +1,758 @@
+From ac8e5de36847dc0c367fe5527f2eb851f95af408 Mon Sep 17 00:00:00 2001
+From: Haihua Hu <b55597 at freescale.com>
+Date: Mon, 16 Nov 2015 17:41:57 +0800
+Subject: [PATCH 1/3] [glplugin] Support fb backend for gl plugins
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+1.Add fb support in glimagesink
+2.override set_render_rectangle() to support resize
+
+Upstream-Status: Inappropriate [i.MX specific]
+
+Signed-off-by: Haihua Hu <b55597 at freescale.com>
+---
+ configure.ac                            |   23 ++-
+ gst-libs/gst/gl/Makefile.am             |    5 +
+ gst-libs/gst/gl/fb/Makefile.am          |   25 +++
+ gst-libs/gst/gl/fb/gstgldisplay_fb.c    |  109 +++++++++++++
+ gst-libs/gst/gl/fb/gstgldisplay_fb.h    |   67 ++++++++
+ gst-libs/gst/gl/fb/gstglwindow_fb_egl.c |  267 +++++++++++++++++++++++++++++++
+ gst-libs/gst/gl/fb/gstglwindow_fb_egl.h |   65 ++++++++
+ gst-libs/gst/gl/gstgldisplay.c          |    8 +
+ gst-libs/gst/gl/gstgldisplay.h          |    1 +
+ gst-libs/gst/gl/gstglwindow.c           |    5 +
+ 10 files changed, 574 insertions(+), 1 deletion(-)
+ create mode 100644 gst-libs/gst/gl/fb/Makefile.am
+ create mode 100644 gst-libs/gst/gl/fb/gstgldisplay_fb.c
+ create mode 100644 gst-libs/gst/gl/fb/gstgldisplay_fb.h
+ create mode 100644 gst-libs/gst/gl/fb/gstglwindow_fb_egl.c
+ create mode 100644 gst-libs/gst/gl/fb/gstglwindow_fb_egl.h
+
+diff --git a/configure.ac b/configure.ac
+index d5467f7..f71a39c 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -654,6 +654,7 @@ save_LIBS="$LIBS"
+ HAVE_GL=no
+ HAVE_GLES2=no
+ HAVE_WAYLAND_EGL=no
++HAV_FB_EGL=no
+ 
+ HAVE_EGL_RPI=no
+ 
+@@ -743,6 +744,7 @@ case $host in
+     CFLAGS=$old_CFLAGS
+ 
+     PKG_CHECK_MODULES(WAYLAND_EGL, wayland-client >= 1.0 wayland-cursor >= 1.0 wayland-egl >= 1.0, HAVE_WAYLAND_EGL=yes, HAVE_WAYLAND_EGL=no)
++    AC_CHECK_LIB(EGL, fbGetDisplay, HAVE_FB_EGL=yes, HAVE_FB_EGL=no)
+   ;;
+ esac
+ 
+@@ -945,6 +947,16 @@ case $host in
+       fi
+     fi
+ 
++    if test "x$HAVE_FB_EGL" = "xyes"; then
++      if test "x$NEED_EGL" = "xno" -o "x$HAVE_EGL" = "xno"; then
++        AC_MSG_WARN([EGL is required by the fb backend for OpenGL support])
++      else
++        HAVE_WINDOW_FB=yes
++        GL_LIBS="$GL_LIBS"
++        GL_CFLAGS="$GL_CFLAGS"
++      fi
++    fi
++
+     if test "x$HAVE_EGL_RPI" = "xyes"; then
+       if test "x$NEED_DISPMANX" != "xno"; then
+         HAVE_WINDOW_DISPMANX=yes
+@@ -959,7 +971,7 @@ case $host in
+       fi
+     else
+       if test "x$NEED_EGL" != "xno"; then
+-        if test "x$HAVE_WINDOW_WAYLAND" = "xyes" -o "x$HAVE_WINDOW_X11" = "xyes" -o "x$HAVE_WINDOW_DISPMANX" = "xyes"; then
++        if test "x$HAVE_WINDOW_WAYLAND" = "xyes" -o "x$HAVE_WINDOW_X11" = "xyes" -o "x$HAVE_WINDOW_DISPMANX" = "xyes" -o "x$HAVE_WINDOW_FB" = "xyes"; then
+           GL_LIBS="$GL_LIBS -lEGL $EGL_LIBS"
+           GL_CFLAGS="$GL_CFLAGS $EGL_CFLAGS"
+           USE_EGL=yes
+@@ -1108,6 +1120,7 @@ GST_GL_HAVE_WINDOW_WAYLAND=0
+ GST_GL_HAVE_WINDOW_ANDROID=0
+ GST_GL_HAVE_WINDOW_DISPMANX=0
+ GST_GL_HAVE_WINDOW_EAGL=0
++GST_GL_HAVE_WINDOW_FB=0
+ 
+ if test "x$HAVE_WINDOW_X11" = "xyes"; then
+   GL_WINDOWS="x11 $GL_WINDOWS"
+@@ -1137,6 +1150,10 @@ if test "x$HAVE_WINDOW_EAGL" = "xyes"; then
+   GL_WINDOWS="eagl $GL_WINDOWS"
+   GST_GL_HAVE_WINDOW_EAGL=1
+ fi
++if test "x$HAVE_WINDOW_FB" = "xyes"; then
++  GL_WINDOWS="fb $GL_WINDOWS"
++  GST_GL_HAVE_WINDOW_FB=1
++fi
+ 
+ GL_CONFIG_DEFINES="$GL_CONFIG_DEFINES
+ #define GST_GL_HAVE_WINDOW_X11 $GST_GL_HAVE_WINDOW_X11
+@@ -1146,6 +1163,7 @@ GL_CONFIG_DEFINES="$GL_CONFIG_DEFINES
+ #define GST_GL_HAVE_WINDOW_ANDROID $GST_GL_HAVE_WINDOW_ANDROID
+ #define GST_GL_HAVE_WINDOW_DISPMANX $GST_GL_HAVE_WINDOW_DISPMANX
+ #define GST_GL_HAVE_WINDOW_EAGL $GST_GL_HAVE_WINDOW_EAGL
++#define GST_GL_HAVE_WINDOW_FB $GST_GL_HAVE_WINDOW_FB
+ "
+ 
+ dnl PLATFORM's
+@@ -1217,6 +1235,7 @@ if test "x$GL_APIS" = "x" -o "x$GL_PLATFORMS" = "x" -o "x$GL_WINDOWS" = "x"; the
+   HAVE_WINDOW_ANDROID=no
+   HAVE_WINDOW_COCOA=no
+   HAVE_WINDOW_EAGL=no
++  HAVE_WINDOW_FB=no
+ fi
+ 
+ AC_SUBST(GL_LIBS)
+@@ -1232,6 +1251,7 @@ AM_CONDITIONAL(HAVE_WINDOW_DISPMANX, test "x$HAVE_WINDOW_DISPMANX" = "xyes")
+ AM_CONDITIONAL(HAVE_WINDOW_WAYLAND, test "x$HAVE_WINDOW_WAYLAND" = "xyes")
+ AM_CONDITIONAL(HAVE_WINDOW_ANDROID, test "x$HAVE_WINDOW_ANDROID" = "xyes")
+ AM_CONDITIONAL(HAVE_WINDOW_EAGL, test "x$HAVE_WINDOW_EAGL" = "xyes")
++AM_CONDITIONAL(HAVE_WINDOW_FB, test "x$HAVE_WINDOW_FB" = "xyes")
+ 
+ AM_CONDITIONAL(USE_OPENGL, test "x$USE_OPENGL" = "xyes")
+ AM_CONDITIONAL(USE_GLES2, test "x$USE_GLES2" = "xyes")
+@@ -3319,6 +3339,7 @@ gst-libs/gst/gl/egl/Makefile
+ gst-libs/gst/gl/wayland/Makefile
+ gst-libs/gst/gl/win32/Makefile
+ gst-libs/gst/gl/x11/Makefile
++gst-libs/gst/gl/fb/Makefile
+ gst-libs/gst/insertbin/Makefile
+ gst-libs/gst/interfaces/Makefile
+ gst-libs/gst/codecparsers/Makefile
+diff --git a/gst-libs/gst/gl/Makefile.am b/gst-libs/gst/gl/Makefile.am
+index 6744d6e..71a4e69 100644
+--- a/gst-libs/gst/gl/Makefile.am
++++ b/gst-libs/gst/gl/Makefile.am
+@@ -107,6 +107,11 @@ SUBDIRS += eagl
+ libgstgl_ at GST_API_VERSION@_la_LIBADD += eagl/libgstgl-eagl.la
+ endif
+ 
++if HAVE_WINDOW_FB
++SUBDIRS += fb
++libgstgl_ at GST_API_VERSION@_la_LIBADD += fb/libgstgl-fb.la
++endif
++
+ if USE_EGL
+ SUBDIRS += egl
+ libgstgl_ at GST_API_VERSION@_la_LIBADD += egl/libgstgl-egl.la
+diff --git a/gst-libs/gst/gl/fb/Makefile.am b/gst-libs/gst/gl/fb/Makefile.am
+new file mode 100644
+index 0000000..8e4656c
+--- /dev/null
++++ b/gst-libs/gst/gl/fb/Makefile.am
+@@ -0,0 +1,25 @@
++## Process this file with automake to produce Makefile.in
++
++noinst_LTLIBRARIES = libgstgl-fb.la
++
++libgstgl_fb_la_SOURCES = \
++	gstgldisplay_fb.c \
++	gstglwindow_fb_egl.c 
++
++noinst_HEADERS = \
++	gstgldisplay_fb.h \
++	gstglwindow_fb_egl.h
++
++libgstgl_fbincludedir = $(includedir)/gstreamer- at GST_API_VERSION@/gst/gl/fb
++
++libgstgl_fb_la_CFLAGS = \
++	-I$(top_srcdir)/gst-libs \
++	-I$(top_builddir)/gst-libs \
++	$(GL_CFLAGS) \
++	$(GST_PLUGINS_BASE_CFLAGS) \
++	$(GST_BASE_CFLAGS) \
++	$(GST_CFLAGS)
++
++libgstgl_fb_la_LDFLAGS = \
++	$(GST_LIB_LDFLAGS) \
++	$(GST_ALL_LDFLAGS)
+diff --git a/gst-libs/gst/gl/fb/gstgldisplay_fb.c b/gst-libs/gst/gl/fb/gstgldisplay_fb.c
+new file mode 100644
+index 0000000..3be9756
+--- /dev/null
++++ b/gst-libs/gst/gl/fb/gstgldisplay_fb.c
+@@ -0,0 +1,109 @@
++/*
++ * GStreamer
++ * Copyright (C) 2014 Matthew Waters <ystreet00 at gmail.com>
++ *
++ * 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 <gst/gl/fb/gstgldisplay_fb.h>
++
++GST_DEBUG_CATEGORY_STATIC (gst_gl_display_debug);
++#define GST_CAT_DEFAULT gst_gl_display_debug
++
++G_DEFINE_TYPE (GstGLDisplayFB, gst_gl_display_fb, GST_TYPE_GL_DISPLAY);
++
++static void gst_gl_display_fb_finalize (GObject * object);
++static guintptr gst_gl_display_fb_get_handle (GstGLDisplay * display);
++
++static void
++gst_gl_display_fb_class_init (GstGLDisplayFBClass * klass)
++{
++  GST_GL_DISPLAY_CLASS (klass)->get_handle =
++      GST_DEBUG_FUNCPTR (gst_gl_display_fb_get_handle);
++
++  G_OBJECT_CLASS (klass)->finalize = gst_gl_display_fb_finalize;
++}
++
++static void
++gst_gl_display_fb_init (GstGLDisplayFB * display_fb)
++{
++  GstGLDisplay *display = (GstGLDisplay *) display_fb;
++
++  display->type = GST_GL_DISPLAY_TYPE_FB;
++  display_fb->name = NULL;
++  display_fb->disp_idx = 0;
++  display_fb->display = NULL;
++}
++
++static void
++gst_gl_display_fb_finalize (GObject * object)
++{
++  GstGLDisplayFB *display_fb = GST_GL_DISPLAY_FB (object);
++
++  if (display_fb->name)
++    g_free (display_fb->name);
++
++  if (display_fb->display)
++    fbDestroyDisplay (display_fb->display);
++
++  G_OBJECT_CLASS (gst_gl_display_fb_parent_class)->finalize (object);
++}
++
++/**
++ * gst_gl_display_fb_new:
++ * @name: (allow-none): a display name
++ *
++ * Create a new #GstGLDisplayFB from the x11 display name.  See XOpenDisplay()
++ * for details on what is a valid name.
++ *
++ * Returns: (transfer full): a new #GstGLDisplayFB or %NULL
++ */
++GstGLDisplayFB *
++gst_gl_display_fb_new (gchar *name)
++{
++  GstGLDisplayFB *display;
++  const gchar *fb_name = NULL;
++
++  GST_DEBUG_CATEGORY_GET (gst_gl_display_debug, "gldisplay");
++  GST_DEBUG ("creating Fb EGL display");
++
++  fb_name = name;
++  if (!fb_name) fb_name = "fb0";
++
++  display = g_object_new (GST_TYPE_GL_DISPLAY_FB, NULL);
++  display->name = g_strdup (fb_name);
++  sscanf (display->name, "fb%d", &display->disp_idx);
++  display->display = fbGetDisplayByIndex (display->disp_idx);
++  if (!display->display) {
++    GST_ERROR ("Failed to open FB display, \'%s\'", fb_name);
++    return NULL;
++  }
++
++  GST_DEBUG ("Created fb EGL display %d", display->display);
++
++  return display;
++}
++
++static guintptr
++gst_gl_display_fb_get_handle (GstGLDisplay * display)
++{
++  GST_DEBUG ("Get fb EGL display %d", GST_GL_DISPLAY_FB (display)->display);
++  return (guintptr) GST_GL_DISPLAY_FB (display)->display;
++}
+diff --git a/gst-libs/gst/gl/fb/gstgldisplay_fb.h b/gst-libs/gst/gl/fb/gstgldisplay_fb.h
+new file mode 100644
+index 0000000..62987c1
+--- /dev/null
++++ b/gst-libs/gst/gl/fb/gstgldisplay_fb.h
+@@ -0,0 +1,67 @@
++/*
++ * GStreamer
++ * Copyright (C) 2014 Matthew Waters <ystreet00 at gmail.com>
++ *
++ * 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.
++ */
++
++#ifndef __GST_GL_DISPLAY_FB_H__
++#define __GST_GL_DISPLAY_FB_H__
++
++#include <EGL/egl.h>
++#include <gst/gst.h>
++#include <gst/gl/gstgldisplay.h>
++
++G_BEGIN_DECLS
++
++GType gst_gl_display_fb_get_type (void);
++
++#define GST_TYPE_GL_DISPLAY_FB             (gst_gl_display_fb_get_type())
++#define GST_GL_DISPLAY_FB(obj)             (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GL_DISPLAY_FB,GstGLDisplayFB))
++#define GST_GL_DISPLAY_FB_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_GL_DISPLAY_FB,GstGLDisplayFBClass))
++#define GST_IS_GL_DISPLAY_FB(obj)          (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GL_DISPLAY_FB))
++#define GST_IS_GL_DISPLAY_FB_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_GL_DISPLAY_FB))
++#define GST_GL_DISPLAY_FB_CAST(obj)        ((GstGLDisplayFB*)(obj))
++
++typedef struct _GstGLDisplayFB GstGLDisplayFB;
++typedef struct _GstGLDisplayFBClass GstGLDisplayFBClass;
++
++/**
++ * GstGLDisplayFB:
++ *
++ * the contents of a #GstGLDisplayFB are private and should only be accessed
++ * through the provided API
++ */
++struct _GstGLDisplayFB
++{
++  GstGLDisplay          parent;
++
++  /* <private> */
++  gchar *name;
++  gint disp_idx;
++  EGLNativeDisplayType display;
++};
++
++struct _GstGLDisplayFBClass
++{
++  GstGLDisplayClass object_class;
++};
++
++GstGLDisplayFB *gst_gl_display_fb_new (gchar *name);
++
++G_END_DECLS
++
++#endif /* __GST_GL_DISPLAY_FB_H__ */
+diff --git a/gst-libs/gst/gl/fb/gstglwindow_fb_egl.c b/gst-libs/gst/gl/fb/gstglwindow_fb_egl.c
+new file mode 100644
+index 0000000..1e4c762
+--- /dev/null
++++ b/gst-libs/gst/gl/fb/gstglwindow_fb_egl.c
+@@ -0,0 +1,267 @@
++/*
++ * GStreamer
++ * Copyright (C) 2008 Julien Isorce <julien.isorce at gmail.com>
++ * Copyright (C) 2012 Matthew Waters <ystreet00 at gmail.com>
++ *
++ * 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.
++ */
++
++#include "../gstgl_fwd.h"
++#include <gst/gl/gstglcontext.h>
++
++#include "gstglwindow_fb_egl.h"
++
++#define GST_CAT_DEFAULT gst_gl_window_debug
++
++#define gst_gl_window_fb_egl_parent_class parent_class
++G_DEFINE_TYPE (GstGLWindowFbEGL, gst_gl_window_fb_egl,
++    GST_GL_TYPE_WINDOW);
++
++static guintptr gst_gl_window_fb_egl_get_window_handle (GstGLWindow *
++    window);
++static void gst_gl_window_fb_egl_set_window_handle (GstGLWindow * window,
++    guintptr handle);
++static void gst_gl_window_fb_egl_draw (GstGLWindow * window);
++static void gst_gl_window_fb_egl_close (GstGLWindow * window);
++static gboolean gst_gl_window_fb_egl_open (GstGLWindow * window,
++    GError ** error);
++static gboolean
++gst_gl_window_fb_egl_set_render_rectangle(GstGLWindow * window,
++    guint x, guint y, guint width, guint height);
++
++static void
++gst_gl_window_fb_egl_class_init (GstGLWindowFbEGLClass * klass)
++{
++  GstGLWindowClass *window_class = (GstGLWindowClass *) klass;
++
++  window_class->get_window_handle =
++      GST_DEBUG_FUNCPTR (gst_gl_window_fb_egl_get_window_handle);
++  window_class->set_window_handle =
++      GST_DEBUG_FUNCPTR (gst_gl_window_fb_egl_set_window_handle);
++  window_class->draw_unlocked =
++      GST_DEBUG_FUNCPTR (gst_gl_window_fb_egl_draw);
++  window_class->draw = GST_DEBUG_FUNCPTR (gst_gl_window_fb_egl_draw);
++  window_class->close = GST_DEBUG_FUNCPTR (gst_gl_window_fb_egl_close);
++  window_class->open = GST_DEBUG_FUNCPTR (gst_gl_window_fb_egl_open);
++  window_class->set_render_rectangle =
++      GST_DEBUG_FUNCPTR (gst_gl_window_fb_egl_set_render_rectangle);
++}
++
++static void
++gst_gl_window_fb_egl_init (GstGLWindowFbEGL * window)
++{
++  GstGLWindowFbEGL *window_egl;
++
++  window_egl = GST_GL_WINDOW_FB_EGL (window);
++
++  window_egl->width = 0;
++  window_egl->height = 0;
++  window_egl->default_fullscreen = TRUE;
++  window_egl->display = 0;
++}
++
++/* Must be called in the gl thread */
++GstGLWindowFbEGL *
++gst_gl_window_fb_egl_new (GstGLDisplay * display)
++{
++  GstGLWindowFbEGL *window;
++  const gchar *fb_name = NULL;
++
++  if (!display)
++    return NULL;
++
++  window = g_object_new (GST_GL_TYPE_WINDOW_FB_EGL, NULL);
++  window->display = gst_gl_display_get_handle (display);
++  if (!window->display) {
++    GST_ERROR ("failed to get display for egl window");
++    return NULL;
++  }
++
++  return window;
++}
++
++static void
++gst_gl_window_fb_egl_close (GstGLWindow * window)
++{
++  GstGLWindowFbEGL *window_egl;
++
++  window_egl = GST_GL_WINDOW_FB_EGL (window);
++
++  if (window_egl->win_id) {
++    fbDestroyWindow (window_egl->win_id);
++  }
++
++  GST_GL_WINDOW_CLASS (parent_class)->close (window);
++}
++
++static gboolean
++gst_gl_window_fb_egl_open (GstGLWindow * window, GError ** error)
++{
++  GstGLWindowFbEGL *window_egl;
++
++  window_egl = GST_GL_WINDOW_FB_EGL (window);
++
++  if (!window_egl->display) {
++    GST_ERROR ("No display for window_egl.");
++    return FALSE;
++  }
++
++  window_egl->win_id = fbCreateWindow (window_egl->display, -1, -1, 0, 0);
++  if (!window_egl->win_id) {
++    GST_ERROR ("Failed to create window_egl");
++    return FALSE;
++  }
++
++  fbGetDisplayGeometry (window_egl->display, &window_egl->width, &window_egl->height);
++  window_egl->req_width = window_egl->width;
++  window_egl->req_height = window_egl->height;
++  GST_DEBUG ("Open FB display succesfully, resolution is (%dx%d),display %d, window %d.", 
++       window_egl->width, window_egl->height, window_egl->display, window_egl->win_id);
++  
++  if (!GST_GL_WINDOW_CLASS (parent_class)->open (window, error))
++    return FALSE;
++
++  return TRUE;
++}
++static guintptr
++gst_gl_window_fb_egl_get_window_handle (GstGLWindow * window)
++{
++  GST_DEBUG ("fb egl get window: %d", GST_GL_WINDOW_FB_EGL (window)->win_id);
++  return (guintptr) GST_GL_WINDOW_FB_EGL (window)->win_id;
++}
++
++static void
++gst_gl_window_fb_egl_set_window_handle (GstGLWindow * window,
++    guintptr handle)
++{
++}
++
++static void
++draw_cb (gpointer data)
++{
++  GstGLWindowFbEGL *window_egl = (GstGLWindowFbEGL *)data;
++  GstGLWindow *window = GST_GL_WINDOW (window_egl);
++  GstGLContext *context = gst_gl_window_get_context (window);
++  GstGLContextClass *context_class = GST_GL_CONTEXT_GET_CLASS (context);
++
++  /* default full screen */
++  if (window_egl->default_fullscreen && window->resize) {
++    window->resize (window->resize_data, window_egl->width, window_egl->height);
++    window_egl->default_fullscreen = FALSE;
++  }
++
++  if (window->draw)
++    window->draw (window->draw_data);
++
++  GST_DEBUG ("####### draw data");
++  context_class->swap_buffers (context);
++
++  gst_object_unref (context);
++}
++
++static void
++gst_gl_window_fb_egl_draw (GstGLWindow * window)
++{
++  gst_gl_window_send_message (window, (GstGLWindowCB) draw_cb, window);
++}
++
++static gboolean
++_calculate_viewport_coordinates(GstVideoRectangle *req, GstVideoRectangle *result,
++    guint display_width, guint display_height)
++{
++  if(!req || !result || req->w < 1 || req->h < 1)
++    return FALSE;
++
++  result->x = req->x;
++  result->y = display_height - (req->y + req->h);
++  result->w = req->w;
++  result->h = req->h;
++
++  return TRUE;
++}
++
++struct SetRenderRectangle
++{
++  GstGLWindowFbEGL *window_egl;
++  GstVideoRectangle rect;
++};
++
++static void
++_free_set_render_rectangle (struct SetRenderRectangle *render)
++{
++  if (render) {
++    if (render->window_egl)
++      gst_object_unref (render->window_egl);
++    g_free (render);
++  }
++}
++
++static void
++_set_render_rectangle (gpointer data)
++{
++  const GstGLFuncs *gl;
++  GstGLContext *context;
++  GstVideoRectangle result, video_rect, tmp_res;
++  struct SetRenderRectangle *render = data;
++  GstGLWindow *window = GST_GL_WINDOW (render->window_egl);
++
++  context = gst_gl_window_get_context(window);
++  gl = context->gl_vtable;
++
++  GST_LOG_OBJECT (render->window_egl, "setting render rectangle %i,%i+%ix%i",
++      render->rect.x, render->rect.y, render->rect.w, render->rect.h);
++
++  video_rect.x = render->rect.x;
++  video_rect.y = render->rect.y;
++  video_rect.w = GST_VIDEO_SINK_WIDTH(window->resize_data);
++  video_rect.h = GST_VIDEO_SINK_HEIGHT(window->resize_data);
++
++  gst_video_sink_center_rect(video_rect, render->rect, &tmp_res, TRUE);
++
++  GST_LOG_OBJECT (render->window_egl, "set center render rectangle %i,%i+%ix%i",
++      tmp_res.x, tmp_res.y, tmp_res.w, tmp_res.h);
++
++  /* need to transform screen coordinate to viewport coordinate */
++  if( _calculate_viewport_coordinates(&tmp_res, &result,
++        render->window_egl->width, render->window_egl->height)){
++    GST_LOG_OBJECT (render->window_egl, "viewport render rectangle %i,%i+%ix%i",
++        result.x, result.y, result.w, result.h);
++    gl->Viewport(result.x, result.y, result.w, result.h);
++  }
++
++  if(context)
++    gst_object_unref(context);
++}
++
++static gboolean
++gst_gl_window_fb_egl_set_render_rectangle(GstGLWindow * window,
++    guint x, guint y, guint width, guint height)
++{
++  GstGLWindowFbEGL *window_egl = GST_GL_WINDOW_FB_EGL (window);
++  struct SetRenderRectangle *render;
++
++  render = g_new0 (struct SetRenderRectangle, 1);
++  render->window_egl = gst_object_ref (window_egl);
++  render->rect.x = x;
++  render->rect.y = y;
++  render->rect.w = width;
++  render->rect.h = height;
++
++  gst_gl_window_send_message_async (window,
++      (GstGLWindowCB) _set_render_rectangle, render,
++      (GDestroyNotify) _free_set_render_rectangle);
++  return TRUE;
++}
+diff --git a/gst-libs/gst/gl/fb/gstglwindow_fb_egl.h b/gst-libs/gst/gl/fb/gstglwindow_fb_egl.h
+new file mode 100644
+index 0000000..153ef5a
+--- /dev/null
++++ b/gst-libs/gst/gl/fb/gstglwindow_fb_egl.h
+@@ -0,0 +1,65 @@
++/*
++ * GStreamer
++ * Copyright (C) 2012 Matthew Waters <ystreet00 at gmail.com>
++ *
++ * 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.
++ */
++
++#ifndef __GST_GL_WINDOW_FB_EGL_H__
++#define __GST_GL_WINDOW_FB_EGL_H__
++
++#include <gst/gl/gl.h>
++#include "EGL/eglvivante.h"
++
++G_BEGIN_DECLS
++
++#define GST_GL_TYPE_WINDOW_FB_EGL         (gst_gl_window_fb_egl_get_type())
++#define GST_GL_WINDOW_FB_EGL(o)           (G_TYPE_CHECK_INSTANCE_CAST((o), GST_GL_TYPE_WINDOW_FB_EGL, GstGLWindowFbEGL))
++#define GST_GL_WINDOW_FB_EGL_CLASS(k)     (G_TYPE_CHECK_CLASS((k), GST_GL_TYPE_WINDOW_FB_EGL, GstGLWindowFbEGLClass))
++#define GST_GL_IS_WINDOW_FB_EGL(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_WINDOW_FB_EGL))
++#define GST_GL_IS_WINDOW_FB_EGL_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_WINDOW_FB_EGL))
++#define GST_GL_WINDOW_FB_EGL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_GL_TYPE_WINDOW_FB_EGL, GstGLWindowFbEGL_Class))
++
++typedef struct _GstGLWindowFbEGL        GstGLWindowFbEGL;
++typedef struct _GstGLWindowFbEGLClass   GstGLWindowFbEGLClass;
++
++struct _GstGLWindowFbEGL {
++  /*< private >*/
++  GstGLWindow parent;
++
++  /* <private> */
++  gint width, req_width;
++  gint height, req_height;
++  gboolean default_fullscreen;
++  EGLNativeDisplayType display;
++  EGLNativeWindowType win_id;
++};
++
++struct _GstGLWindowFbEGLClass {
++  /*< private >*/
++  GstGLWindowClass parent_class;
++
++  /*< private >*/
++  gpointer _reserved[GST_PADDING];
++};
++
++GType gst_gl_window_fb_egl_get_type     (void);
++
++GstGLWindowFbEGL * gst_gl_window_fb_egl_new  (GstGLDisplay * display);
++
++G_END_DECLS
++
++#endif /* __GST_GL_WINDOW_FB_EGL_H__ */
+diff --git a/gst-libs/gst/gl/gstgldisplay.c b/gst-libs/gst/gl/gstgldisplay.c
+index 51c1df5..e71f36d 100644
+--- a/gst-libs/gst/gl/gstgldisplay.c
++++ b/gst-libs/gst/gl/gstgldisplay.c
+@@ -205,6 +205,14 @@ gst_gl_display_new (void)
+   if (!display && (!user_choice || g_strstr_len (user_choice, 7, "wayland")))
+     display = GST_GL_DISPLAY (gst_gl_display_wayland_new (NULL));
+ #endif
++#if GST_GL_HAVE_WINDOW_FB
++  if (!display && (!user_choice || g_strstr_len (user_choice, 2, "fb"))) {
++    const gchar *fb_name = NULL;
++    fb_name = g_getenv ("GST_GL_FB");
++    if (!fb_name) fb_name = "fb0";
++    display = GST_GL_DISPLAY (gst_gl_display_fb_new (fb_name));
++  }
++#endif
+ #if GST_GL_HAVE_PLATFORM_EGL
+   if (!display && (!platform_choice
+           || g_strstr_len (platform_choice, 3, "egl")))
+diff --git a/gst-libs/gst/gl/gstgldisplay.h b/gst-libs/gst/gl/gstgldisplay.h
+index 9341884..1b8f415 100644
+--- a/gst-libs/gst/gl/gstgldisplay.h
++++ b/gst-libs/gst/gl/gstgldisplay.h
+@@ -49,6 +49,7 @@ typedef enum
+   GST_GL_DISPLAY_TYPE_WIN32 = (1 << 3),
+   GST_GL_DISPLAY_TYPE_DISPMANX = (1 << 4),
+   GST_GL_DISPLAY_TYPE_EGL = (1 << 5),
++  GST_GL_DISPLAY_TYPE_FB = (1 << 6),
+ 
+   GST_GL_DISPLAY_TYPE_ANY = G_MAXUINT32
+ } GstGLDisplayType;
+diff --git a/gst-libs/gst/gl/gstglwindow.c b/gst-libs/gst/gl/gstglwindow.c
+index 4f27cd0..44b74ca 100644
+--- a/gst-libs/gst/gl/gstglwindow.c
++++ b/gst-libs/gst/gl/gstglwindow.c
+@@ -301,6 +301,11 @@ gst_gl_window_new (GstGLDisplay * display)
+   if (!window && (!user_choice || g_strstr_len (user_choice, 4, "eagl")))
+     window = GST_GL_WINDOW (gst_gl_window_eagl_new (display));
+ #endif
++#if GST_GL_HAVE_WINDOW_FB
++  if (!window && (!user_choice || g_strstr_len (user_choice, 2, "fb")))
++    window = GST_GL_WINDOW (gst_gl_window_fb_egl_new (display));
++#endif
++
+   if (!window) {
+     /* subclass returned a NULL window */
+     GST_WARNING ("Could not create window. user specified %s, creating dummy"
+-- 
+1.7.9.5
+
diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_%.bbappend b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_%.bbappend
index ba7269b..b290423 100644
--- a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_%.bbappend
+++ b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_%.bbappend
@@ -15,6 +15,7 @@ IMX_PATCHES = " file://0001-PATCH-install-gstaggregator-and-gstvideoaggregator-h
                 file://0003-Fix-for-gl-plugin-not-built-in-wayland-backend.patch \
                 file://0004-glplugin-Add-directviv-to-glimagesink-to-improve-playback-performance.patch \
                 file://0005-glplugin-support-video-crop-for-glimagesink.patch \
+                file://0006-glplugin-Support-fb-backend-for-gl-plugins.patch \
 "
 
 SRC_URI_append_mx6 = "${IMX_PATCHES}"
-- 
1.9.1



More information about the meta-freescale mailing list