From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by yocto-www.yoctoproject.org (Postfix, from userid 118) id 79DE0E00C23; Wed, 27 Jan 2016 01:59:48 -0800 (PST) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on yocto-www.yoctoproject.org X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS autolearn=ham version=3.3.1 X-Spam-HAM-Report: * -0.0 RCVD_IN_DNSWL_NONE RBL: Sender listed at http://www.dnswl.org/, no * trust * [65.55.169.137 listed in list.dnswl.org] * -0.0 SPF_HELO_PASS SPF: HELO matches SPF record * -1.9 BAYES_00 BODY: Bayes spam probability is 0 to 1% * [score: 0.0000] X-Greylist: delayed 872 seconds by postgrey-1.32 at yocto-www; Wed, 27 Jan 2016 01:59:32 PST Received: from na01-bl2-obe.outbound.protection.outlook.com (mail-bl2on0137.outbound.protection.outlook.com [65.55.169.137]) by yocto-www.yoctoproject.org (Postfix) with ESMTP id 17694E00C12 for ; Wed, 27 Jan 2016 01:59:32 -0800 (PST) Received: from CH1PR03CA012.namprd03.prod.outlook.com (10.255.156.157) by DM2PR0301MB1182.namprd03.prod.outlook.com (10.160.217.144) with Microsoft SMTP Server (TLS) id 15.1.390.13; Wed, 27 Jan 2016 09:44:59 +0000 Received: from BN1AFFO11FD048.protection.gbl (10.255.156.132) by CH1PR03CA012.outlook.office365.com (10.255.156.157) with Microsoft SMTP Server (TLS) id 15.1.390.13 via Frontend Transport; Wed, 27 Jan 2016 09:44:51 +0000 Authentication-Results: spf=permerror (sender IP is 192.88.158.2) smtp.mailfrom=freescale.com; freescale.mail.onmicrosoft.com; dkim=none (message not signed) header.d=none; freescale.mail.onmicrosoft.com; dmarc=none action=none header.from=freescale.com; Received-SPF: PermError (protection.outlook.com: domain of freescale.com used an invalid SPF mechanism) Received: from az84smr01.freescale.net (192.88.158.2) by BN1AFFO11FD048.mail.protection.outlook.com (10.58.53.63) with Microsoft SMTP Server (TLS) id 15.1.355.15 via Frontend Transport; Wed, 27 Jan 2016 09:44:52 +0000 Received: from carol-OptiPlex-3020.ap.freescale.net (carol-OptiPlex-3020.ap.freescale.net [10.192.241.17]) by az84smr01.freescale.net (8.14.3/8.14.0) with ESMTP id u0R9idNq003913; Wed, 27 Jan 2016 02:44:49 -0700 From: Yuqing Zhu To: Date: Wed, 27 Jan 2016 17:41:56 +0800 Message-ID: <1453887720-16863-6-git-send-email-b54851@freescale.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1453887720-16863-1-git-send-email-b54851@freescale.com> References: <1453887720-16863-1-git-send-email-b54851@freescale.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-Microsoft-Exchange-Diagnostics: 1; BN1AFFO11FD048; 1:GcZm9iS44HDSUXkNEzZ8HVrjJQKV4W0C2rFGdSDQei8Dn2iFh4SQkX96HpTNw+2dFghVYWX2C17STAkeXa+soM5ECXdmesuW8VHYRLDB3AzunTLt7T09tXxpV8vzC8AlquJZStP54Ah8sXlN+fNxtlz518pe8uLtdDCZn1rUQxgkY6ybHmRTAzIZEHoodf0uP411MSTPKf3/E35OS/Mc4EpBZQdaSEohH5xEfbywHK4vUpWBl4lW/NT9uwpTGVLf0X+blEo/BRhtXCv0EiwXoYBArxUNtyZ9puj73kWAGti35s7YFl+Km1YDZMf6g0PNZ6hIyvavQ0i4D48XapRKppYrqPReu3mkhe03p4cw+3EQEgsE7Ky4IKUk6nlXlVs+XY31licCeM7eHJ+Dlbh7P6eUrym3GFC5gZZeSteFpV4jc+dgSS9aEsh4K7+T59jM X-Forefront-Antispam-Report: CIP:192.88.158.2; CTRY:US; IPV:NLI; EFV:NLI; SFV:NSPM; SFS:(10019020)(6009001)(2980300002)(448002)(189002)(199003)(50466002)(5001960100002)(106466001)(4001430100002)(1220700001)(2950100001)(104016004)(97736004)(2351001)(6806005)(107886002)(110136002)(36756003)(189998001)(50986999)(1096002)(3470700001)(77096005)(229853001)(5008740100001)(586003)(76176999)(81156007)(2870700001)(19580395003)(47776003)(2906002)(19580405001)(87936001)(4326007)(85326001)(230783001)(575784001)(23676002)(50226001)(5820100001)(450100001)(92566002)(69596002)(86362001)(33646002)(2004002); DIR:OUT; SFP:1102; SCL:1; SRVR:DM2PR0301MB1182; H:az84smr01.freescale.net; FPR:; SPF:PermError; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-MS-Office365-Filtering-Correlation-Id: 748ac455-cf09-4b49-d38e-08d326fe8157 X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB1182; 2:lW1KAeMKa/cQYEpc6tG9QN1H6FLmTsCrZENgKDhLLUMgH4PNlkWPQc//AH9je8dCy/ibPpDHaNnfx4y4DW8YtBCgc3CYpkRx6YxXK0mRoekEr4MpFbVkm3eoq2FK0WdjWbq7MqdeqQ2j/E4rEAFrdEXB9JdlNg1eOWgBwNawrJlJaMd6+aJS6FUu3qVwnIOn; 3:ze8psoJ9E5jqjdrxIglHqY4MblTdrzHzghAvjRiNqD8Axl/2yq3G6QrtdtraUO73BcAJ0BdNvftTQxChSyeTYjIRObFAZ8Z+eLes6qBl9b8j0XvYb4fhj7dH19ykjejF75ifDXLdkcHjpXfnp3ppX1rBReWB3NKgwLxKhSYQwMw6F4t6FolkQBNcigjdqKjipT5I99Hw/4x+YxPmE2auZw2EFbgHzlFq8j/barnf2LQ=; 25:af3U9VdLvoPvI86i64A7Leoo9kZnZqxTiPIB/TGpqXTCE4w84/eXPz02fuu09hMSdWcKO7/1Xj2YTvZh4yTC8UUZDlJhRIUN0yZ+KTVHVk13jhMs0dOgliyNs3YaVtaszJNFaFsj6vSgBcYczyceQADoxDnu6HAhwzvmw6BvSvHD6wYhYgcKe1iUoZpyZoZsYfi3cSziHHneUEbSjEdqfCXeDq0dvWl23Vot727cS7slN90RG5tU8QVb3qtFNKzU X-Exchange-Antispam-Report-Test: UriScan:; BCL:0; PCL:0; RULEID:; SRVR:DM2PR0301MB1182; UriScan:(101931422205132); X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB1182; 20:+FYUP/RYD4DjEjwQ0Z9r93ThId0q1VLsHcmw0sJPSkslgGXipMdkjiIKelOPWR02rx8Fmj3hp7ekPfBxChaAaYl1kfpEixEz59UwkjlxFoLl085v0VJvIFK/kxpNvKF/6GrGIrUdTa0oEJqwjeIzbKPafnc2Y2OEs+nSQLlQPe4cNWgrZatrkN8gd/JozOXZ20fhhx0aQ1dzxjJbiyw2kRL0qAkKzyzbfGFZUphNg9qYv2tMY16kF+JU1RRefHmef+QDhdcFORpFEMWsTMxS/T/AkOahwm2YcwUvTt05so9OvXWLkGzVFgQP9krCapCa5yuFvV8Up2nJ9mtYzLYhWh5gM32HR1aHO5OUI+K0jxI7te28Vu0vnSp9ZvU91iuih0k0a+8BmItH8VMALVNPgrJ+t/tAo68dR1yJpM71+Wm5WK5cs7ZrW5MfhMGTLIQD; 4:7gDn4I1bfgMs00UPfCp5rpe5kWxmIvLljTluab+IMzyXse9n1PGwrRNoVukUZ8XmjjKDguMtYrvh/8TaeHcocc134XC2daPjmObuPfXMeROugvuxD7qN8YcRo4Y3qWeWEOZwLIZSDNQJEPNfNqS5JHffFpyy1thpdz1p+q3ZMrwdkqtmtcW5H9ZU4KyDE3r2jo8p7Vn9TQVlFh11lAE2TNoRy4IumBH+sXtWtsryih8y8C7MDtIch9mJYfNYkOgEJJZSrN0usnFB33ZX6KCz24/ArdJ9OLw8om7m1RwTX1X6lCoRKH9fbPTXyrTZpUE+mva3Bfkp4ki0nxJC/d2WoBPr33IDEUir4pn/1RGvgHaj9C6RhA1MpEbrQX/Z1pZ/VJCKeLKRkyjFx0kBOrCUDAxoji6jEWy66TWzN4nZsJUxgaq/TGw4F5AF3mXuw2bYjPJk9wp3j9Ql09cZhE4Kup6UDLCnJZO7coddW0MZ+JN+YuuwdFPia2TZqY2W8+Pt X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(601004)(2401047)(13015025)(5005006)(13024025)(13023025)(8121501046)(13018025)(13017025)(3002001)(10201501046); SRVR:DM2PR0301MB1182; BCL:0; PCL:0; RULEID:; SRVR:DM2PR0301MB1182; X-Forefront-PRVS: 0834BAF534 X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtETTJQUjAzMDFNQjExODI7MjM6UlpDSVZLSGZkVTliL1N1V1JSRGZuK3A5?= =?utf-8?B?bHIyaWZUTndzOTc2dWdXb1YxY2I2Nk5EcW9IeVBzTkI5L2VXT2x4ZFNpdmtz?= =?utf-8?B?NU92WCtXSWhYZm9aWnFKdXI5aUVjR0hya2t1RTY4cWRwL1dHVlVnUEpOaE9V?= =?utf-8?B?cWhQMk80NjllWWV3ekxGNUhCdkVmQlhwV2NGUEp2QnFWVEc5R0M0SkRySHVL?= =?utf-8?B?NFoxNHZrVndJYkIrdnkxQjJZaFNBOGpMZ3E2NWFIYUlWNGwvZXRSWERZcUlK?= =?utf-8?B?U25FaVBHR1RwQVpidWNHSXJwMzZ6UGpwYlBHY2FubVJkcDBjRERxSVppUHhT?= =?utf-8?B?cElaamlXaUN2NjREUGFla09kSDRrSTdmRTVVKzhENVlRckY1Sm5BTjh2NFlV?= =?utf-8?B?Nk83aHRyczVFTXZ3NzF6KzQ0YlhXc1FHME5kYitzMjZDZ1lYcXJsbWlrU1RS?= =?utf-8?B?em9KNkRXekdEYjVaUnh4VENGRlZBeXJBZmhtRXo2YklXejhYbC9LMGpDQ3Ft?= =?utf-8?B?ZWZ6SFhrVmZBbnp0YytEbTJCek11TmgxWk9valAvV1QvNWtjb09pajdLV1JT?= =?utf-8?B?T3Y0VmpkUXdjY3Z5OUVEd2lZS08zRzlEOVMxZld1WmNpdjJTZGgyMG16WEV2?= =?utf-8?B?SWFWMVcwY2VUWWlVS244Vm5UeFdVOGM0R2FlQnRLWXdQK2hyMVgxR0VvT1F2?= =?utf-8?B?djlSSVM0VXV5bVdWbTNXb0kyL3F3Ukh2V24xQ3dOVjFhemh1dC9CNDhqSFVs?= =?utf-8?B?M2NJYzNLaU12ZXNmYWpRUGZqdjJoWkVLelQ2R1ZNanoyYS91TCtYNlcrdzc1?= =?utf-8?B?Z0h3a2xIRjUySUR2NEMwTzlacGFTWFdQMzZlVllDR0phMzg3SVRORjB5Zk44?= =?utf-8?B?OHBXN1hSVGFkSXROTkR4Ump2MUFZMkJ6bGZSYVdWOWgzb3RTN1Fmdy9MZy9p?= =?utf-8?B?dVpFbHM3RFhZT3RIczdKc1dvTnBOZWdraE5UY3hZQ09PaTBEQ1o5NjdyVkd1?= =?utf-8?B?UUpjcVVpdnZWSzh2WEV5U0VNOXA2WGUrMHJvUXZIM0VIY1FLekxWcXFxWjBB?= =?utf-8?B?Sm1pYWxlYVMybHcwWTlxUkt1TU55VFBOZW1pVzAwZ1dxZExCUDlpNFFBRUlI?= =?utf-8?B?TEtZbG12eFJBMnliN3RTcXVnWVdycjQrMlR0NWhiNjJFd3E5ZVRZZ2dYcUUr?= =?utf-8?B?Mmk5dnJVK1NBRGYveGNUQ2pqNXhaUkpmYTJacDN0a0VOSjlmNXBBQ3A4amtt?= =?utf-8?B?MDM3MzFYL001cS82MkpzWThoc2tVQnA3ek1tNTU2WGpwVU5rbXpjcDlCZDRi?= =?utf-8?B?NFhLc3NqdzM3U1o2UElyeUV2RHNKdEpnVE5XSlNxK3pYb0VpczV6c2s2VVFQ?= =?utf-8?B?NSsrdE0rTExZNU04SG4wRU44SGtsV2JVOFY1TEJ4NExLdmFzekJvWWRGN1Uz?= =?utf-8?B?alp5N1VOd0FzUGdoYnZTdVpiL0grWHg1VGdESGFodDROQSt2QmdHQktDQWVu?= =?utf-8?B?eGRJYkF6MUpPdFNwQ3llZEFxZnhmMS9IbVV5Tml0cWhtZjBoeWN4bWNGNnBB?= =?utf-8?B?OWJmNktIbHh4ME9reURPWkE5WE1TQWczY1lxdlh1ZEl5UHVCMWFpaXhxbWN0?= =?utf-8?Q?TNkvzhYAmvuAjpyFefPqsg?= X-Microsoft-Exchange-Diagnostics: 1; DM2PR0301MB1182; 5:IXUuOvrXmhK0SPinuRS57Db3zdbeAbRw0BmqhpYc9JDtGijVl23mgVFgLhJ6nhgrK4dkzF/4JhcdpNm3rAPzKAzb8AkWvXAt6DCP9veb1/m6NS/T2lTBchzLC7Vmk/lDW7VZnAPe2zA+dhbpH+12AA==; 24:sD1WmTxqEfoNLBY6i+S7hEvlCf5wAm6GlRcYXAzQJUf4eWL0RYfFOZGQX0HmHxZCf5YbmtzVz5aR6nePmC+KvFigDns8dB4FCNPuQP7RIHY= X-OriginatorOrg: freescale.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Jan 2016 09:44:52.0597 (UTC) X-MS-Exchange-CrossTenant-Id: 710a03f5-10f6-4d38-9ff4-a80b81da590d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=710a03f5-10f6-4d38-9ff4-a80b81da590d; Ip=[192.88.158.2]; Helo=[az84smr01.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: DM2PR0301MB1182 Subject: [meta-fsl-arm][PATCH 5/9] gstreamer1.0-plugins-bad: Support fb backend for gl plugins X-BeenThere: meta-freescale@yoctoproject.org X-Mailman-Version: 2.1.13 Precedence: list List-Id: Usage and development list for the meta-fsl-* layers List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 27 Jan 2016 09:59:48 -0000 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 Signed-off-by: Yuqing Zhu --- ...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 +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 +--- + 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_@GST_API_VERSION@_la_LIBADD += eagl/libgstgl-eagl.la + endif + ++if HAVE_WINDOW_FB ++SUBDIRS += fb ++libgstgl_@GST_API_VERSION@_la_LIBADD += fb/libgstgl-fb.la ++endif ++ + if USE_EGL + SUBDIRS += egl + libgstgl_@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-@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 ++ * ++ * 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_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 ++ * ++ * 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 ++#include ++#include ++ ++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; ++ ++ /* */ ++ 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 ++ * Copyright (C) 2012 Matthew Waters ++ * ++ * 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 ++ ++#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 ++ * ++ * 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 ++#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; ++ ++ /* */ ++ 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