From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by yocto-www.yoctoproject.org (Postfix, from userid 118) id 1BD20E00CB6; Mon, 31 Oct 2016 23:10:04 -0700 (PDT) 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 * [104.47.33.66 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] Received: from NAM01-BN3-obe.outbound.protection.outlook.com (mail-bn3nam01on0066.outbound.protection.outlook.com [104.47.33.66]) by yocto-www.yoctoproject.org (Postfix) with ESMTP id F3146E00C60 for ; Mon, 31 Oct 2016 23:09:59 -0700 (PDT) Received: from CY1PR03CA0038.namprd03.prod.outlook.com (10.174.128.48) by CY1PR0301MB1628.namprd03.prod.outlook.com (10.162.166.30) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.693.12; Tue, 1 Nov 2016 06:09:57 +0000 Received: from BY2FFO11OLC015.protection.gbl (2a01:111:f400:7c0c::120) by CY1PR03CA0038.outlook.office365.com (2603:10b6:600::48) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384_P384) id 15.1.693.12 via Frontend Transport; Tue, 1 Nov 2016 06:09:57 +0000 Authentication-Results: spf=fail (sender IP is 192.88.168.50) smtp.mailfrom=nxp.com; nxp.com; dkim=none (message not signed) header.d=none; nxp.com; dmarc=fail action=none header.from=nxp.com; nxp.com; dkim=none (message not signed) header.d=none; Received-SPF: Fail (protection.outlook.com: domain of nxp.com does not designate 192.88.168.50 as permitted sender) receiver=protection.outlook.com; client-ip=192.88.168.50; helo=tx30smr01.am.freescale.net; Received: from tx30smr01.am.freescale.net (192.88.168.50) by BY2FFO11OLC015.mail.protection.outlook.com (10.1.15.59) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.693.6 via Frontend Transport; Tue, 1 Nov 2016 06:09:57 +0000 Received: from carol-OptiPlex-3020.ap.freescale.net (carol-OptiPlex-3020.ap.freescale.net [10.192.241.17]) by tx30smr01.am.freescale.net (8.14.3/8.14.0) with ESMTP id uA169q4E003382; Mon, 31 Oct 2016 23:09:55 -0700 From: Yuqing Zhu To: Date: Tue, 1 Nov 2016 14:09:34 +0800 Message-ID: <1477980575-10601-2-git-send-email-carol.zhu@nxp.com> X-Mailer: git-send-email 1.9.1 In-Reply-To: <1477980575-10601-1-git-send-email-carol.zhu@nxp.com> References: <1477980575-10601-1-git-send-email-carol.zhu@nxp.com> MIME-Version: 1.0 X-EOPAttributedMessage: 0 X-Matching-Connectors: 131224541974931960; (91ab9b29-cfa4-454e-5278-08d120cd25b8); () X-Forefront-Antispam-Report: CIP:192.88.168.50; IPV:NLI; CTRY:US; EFV:NLI; SFV:NSPM; SFS:(10009020)(6009001)(7916002)(2980300002)(1109001)(1110001)(339900001)(189002)(199003)(105606002)(77096005)(50986999)(11100500001)(36756003)(8936002)(23676002)(97736004)(586003)(5660300001)(92566002)(76176999)(626004)(189998001)(19580395003)(2906002)(47776003)(19580405001)(6666003)(68736007)(229853001)(85426001)(6916009)(305945005)(2351001)(356003)(50466002)(7846002)(87936001)(104016004)(81166006)(8666005)(8676002)(2950100002)(50226002)(33646002)(106466001)(81156014)(86362001)(110136003)(4326007)(5820100001)(2870700001)(230783001)(7059030)(2004002); DIR:OUT; SFP:1101; SCL:1; SRVR:CY1PR0301MB1628; H:tx30smr01.am.freescale.net; FPR:; SPF:Fail; PTR:InfoDomainNonexistent; MX:1; A:1; LANG:en; X-Microsoft-Exchange-Diagnostics: 1; BY2FFO11OLC015; 1:Vl29OXJj+0gthiI2M6/ILmhKAsDYd15hXnhYv4MLy+gOGb85IoxPnvLDhIb1DWWeaUK6IyvsAT173e7hh2jCHPzIeCjd93sxDsDpSwYvdlHEtuuSAPcbdrziQOMcTfh9ADFbWGu16wT1daY4VPbHj+PMx+CnhX5vCyRtjLpo1B+v0l1qW0umtSV+XvDic1Ngn2+C95zh46yDnDuqdSCGWx4beOl2vj8Qn9XktAMn4q6EcwIuMXtfD54NvfJ/JjOejDKck+AntL6b+GU/QykQQXpJ80fgN/DNjFYioSOnFSnT3EolhpEY+loVvRCtP0zEK4++HiP9oPBvaZIoWq8uE4iO9tQ3/GoeLlekUXJLkd4MnzuhsjHhXFObR9KQ5TbGyzDAT+ZG3ah65hjWeY0omPsbLzOpnvM+U3Fy7QIaIuSqYsqpfoqOLYtmdyQJwi98uyM2pi1RfUk2+ChEJqh1EYJLYBOJOFxR0V1UewHakQPEw4CCSEPYjAyjFIgCwZhvZBewo/0VtgYaMmKqlf4NXDWuhhKs0wDxWCpWN1PbuAbNDm7vRWWEOowDf3E1yJ6czcF0+wQaElGwYcRGykbF5eX9W6AxLslcXxkSK586MaCaERKVQsbUyGAA/E9JjezWk8VOFf/b0gIrfXAtHkM0TcHtD6k+3Ey0xU8FtMZnCPKvgRKOfuV7i1aKfA09mD8/DAGKv4DgMRD/5kLfKfHFfrNicRBlXL+j7OmHhNhNA0g= X-MS-Office365-Filtering-Correlation-Id: 0a0585c2-71aa-47e1-9f10-08d4021db49e X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1628; 2:PbkdAArM2B5D+04iLVbb7cwApAd6UuNmJBrI5QpXTJuTBvR/bYXhNQLLHcTdjEDhT7I97Llg05HXu803R/NE327nEmTpXZCK42wx5m7axhbKLCmI0EPsreDtFudr8tPCNMN1gagdEsT2JtZsmbNuQ+z0426Vam8v9DRhHszxpzT7nXecnj1X/WwBc1PDbSebk/QQKLlGj+CLshUAJLUtTw==; 3:7cPEYkOLc8jlOU3SzMajJezcrcjuqSe6hOFL8KRfH8Qg+M5egup0Q2ay23bfjioTB0fkUIRi6MqIXWCPYW37FVfhtK/QTUy8uA2KOK1yhVGFyRLsQt0WtHTsSQX+imzx3XoUcfLaTG1k61UhejCgQCoWNxbmoAxd8P6hGmHK7XdxcvZ9lhhKJP8VfXo8QkpGsLVFqxqZCCpgp+gg62DvVnoXnpnq7Gat4SEYF2NN89vBc6DeYFEeJji1rFFsTkZe X-Microsoft-Antispam: UriScan:;BCL:0;PCL:0;RULEID:;SRVR:CY1PR0301MB1628; X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1628; 25:AILfUSJCxv9Bq4xbGxByKAPerCLT82/sm9NQSjWOAWoAylkgVAEU5OwTS4UiMqrxTmrauOnflfP1bQQkw7u5d2cXYMrwBP8RHNRUjEY/rPCgKzl+4qkLXfcjRHEpNQQmGQ5fKuBWhNdC0Mr7k9ujmUZu/DA/6uspK6zeiiHUzQxhlv+9mQhMWZyXefgOQj6E5XYNn4tt0NNS0FmQA2n36tj/3tUHYaeA5AIK5zR1wAMCYA/fRcuLngS6rbuA5oyfggdv7SRguEk4BkDqkqD7Zt0H8abrfc/bcObudKzI6VS0skZDyTFkHBr71fEQHn19Ouu9CbzKBqpcPG8me9RtxoYSc6fk3xbcomnkx2nGYNr0D3KrxvH8O1vyVo328EpVjzijW45Q9NEbSIGe8Fi7/I4ye1Zee4za0Ybgeeku1+uyqQJB2P8u8S9ybdpUAc4PlLtXRxHqD1J8WvhtHC+OJDJgji6VpXr9dooJioIC/XZwzjvrfk3nlG7JCzykgsuZPsvCVJAgvOkDDRoVc3LfoNZVPy+1WfFZ33DOQXcsSESDBaC+8S09oaGnPDNG3q8gtAldR5od6bkN6cT3qI1wBlsvFGeW1EWx92kX7NkenUjC9odTbVduY9htAHTJ+S14kEkR+sFvg78TN5HhhYJk8awBm++XBrDSNtiNWy/gdUM8zKfSWGaF+VHxvhj183jNhOctHRJVRPZcnMBHuAldZmmOLLso0beWDRo9SUzl4eyKF66nfxKA3o3HnkZaULzOvW05MoWCZVAtJCLkzcP0dhYB8uhiXueRnRfXjVYNo/i1rFwI0CrYZfjI7K/TRhXa X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1628; 31:q8UXaPri43+xKwmh6GtwcWT2CXHeG6xb0Wzw4fPQwe/7WDGEI/Mo6vFMiYcuMqMVyg1FQ0QDaf79GT5WX7JAbQO45fMJ63PQyRBM9OtkD5KsJ+tVo0iVRB1jqmN8AbZq9avIBrDPen68J2PzsfTDRzm/6falhKvUocQ5KT2a1JiCJZe8DlrAqooudhWebxrfyefETNYFQkkdA47NHkf11GtPsfzc+6JCcvlsbD+undHIZjRwTA4TvWkZkZT5IRfMbtfQ6PzuX38mnWV21GkQpw==; 4:Lf1+BXbzMnpFowY1IUlQB/NR6Lz2WyOp8MFJRHkdUvsxzYyp5r9x5+rTP/zKw8CENxDpwH9fiV4DOazErITxHvEcIWMtMA7OglVXvUDgKFwnaZyPLbLvPTRD7Bz5Zai3mUYBDIapP/ShwDRPstQ7tAQ31Mujah9uTNZua99Klm16Jb6zJKi1sjRzdV34zM316iFZOAMR3r4l1jjJzhFFlNKEWG1ZgpFGpTzW16t8Ajiv0IeAnfByU3O1UbEN+ijbfFJinYLl4ksg3VihXQEUCQK5Wbv3HBI+byVGLyoxp+6+yKMrm096mhY49eLVAQptyavhcYpEuHjKFqT0iQfnQbQJCW4uK/mTSjNkF+vlEjeHJGIQ92exDwRtRwxfqsMkmRvHWCwyqBTkUcY8sQIyF6hRqrg92+c0HXJ8+izShnLcNiTnlHpxWvCY32htOv4uv9c0WbhXzJks2aNS6ug+SDEE9XLO/qiLQM1rmI4lx41ZC6/LbVc7BAi/q42w3uDrpY05v8Teo+rPaksitkTlp/aUze+ic4+1BTZtiV9QTT4Dd9MpOPgqTPR1BRjKoAEGy05fl9mdacCqJV5ssHOcRQ== X-Microsoft-Antispam-PRVS: X-Exchange-Antispam-Report-Test: UriScan:(185117386973197)(101931422205132); X-Exchange-Antispam-Report-CFA-Test: BCL:0; PCL:0; RULEID:(6040176)(601004)(2401047)(13018025)(5005006)(13015025)(13017025)(8121501046)(13023025)(13024025)(10201501046)(3002001)(6055026); SRVR:CY1PR0301MB1628; BCL:0; PCL:0; RULEID:(400006); SRVR:CY1PR0301MB1628; X-Forefront-PRVS: 01136D2D90 X-Microsoft-Exchange-Diagnostics: =?utf-8?B?MTtDWTFQUjAzMDFNQjE2Mjg7MjM6c2ZzbjdkUHI3d0Z5LzU3M2Y0bXFPcUhy?= =?utf-8?B?bk9FSnpQWEdpTVNZVy80b0ExM3Rqa1ZpeXZ6dDViM2JYMEwrdFJwY1J6azhT?= =?utf-8?B?RDNJL0tiVVNJQlgzR29RU0JLTW9OdnhWNWJtWmZKOGdVZ1BiTjhVUVBzS1Iv?= =?utf-8?B?UEtLWmNFdlJDVm91Z2htbHBobkVmMzlYM21oNHcyV3RLMmZjTDFSSFJWbTBr?= =?utf-8?B?T1VwVkh3aURVR2NOQlVNWHZXM1REbFlyVDEyQ2Q2RDBQZmdROVhzZGVZbTFX?= =?utf-8?B?NDlYVEJVTVhCVlBwMjg0U0gyWnljY0ord0N1Tis4ZXdhYkowREVoZzcvaUVH?= =?utf-8?B?ZjFBU09MRnNrbVV2RWd6ekx1aFd1d0xXT0c0SFJnazdEejBNbjZnN3lxQk8r?= =?utf-8?B?VVRvWm5DcDRleWdMYng4ajhUNE8yRUVpUUpHN3VKa2k0QTA1UTlKKzlCWjFp?= =?utf-8?B?QXU4RWhicnFlazIzYTJYNUxaSHViaDRmWENpL0psNUZUZTRkYmoyWFZQUXpL?= =?utf-8?B?RVNXVUNIN05EVzgyUW82Vkp4SElCVy9lSC9uVVFVWkVQTnVpeWxIYlZkVVRY?= =?utf-8?B?bnIvN250b09QZ3NhSVprcmhEa0RlYWI4V0gwNTlwK0VwRjd1b3N5L2FWZDJ5?= =?utf-8?B?ak5uTVFLZ2F3QjJyblRvcVN1My9uRXlrVHBWRzIzbU5qY3NPWW5wYUVlcmNN?= =?utf-8?B?SlpPajZkTlZnd0RaOWcwZGtyM1RVT0lPUVRHRjNpTHNLSDQ0SHJScmJSQnh3?= =?utf-8?B?cThFR3p6YlNoaWd2aHZWVUtBMlhKM2xGd1pQaERRVGRjVWtRQWh4Y21GRGF0?= =?utf-8?B?OURCdzdmbi8rQmE0dU8vdk5IVUMwZ0w3UmFIbFN0YUZaTjZtTG1yaTlSeFBV?= =?utf-8?B?SHRjYUpHR2hPcjRuYmlCTEREVVAzcHl5YnpmbWdXV3k1dVZjYnFFbzZ3V091?= =?utf-8?B?QmFmT2VUbGdlUW54cy96dlBCTWJURmpiZ2RZMmNCbWRNU0M0NVhkNjg1MHJz?= =?utf-8?B?UW5wME9wVXRyMmsrNVdlQldralZEK3BWci83OWhnRVFvcFRNNnZRNU42YUZH?= =?utf-8?B?czcrcXJHek1rZ1RDRUQ0Q25EdmpIcDhWVExxakdDc0kvZ2NXNjdLbzJCa1My?= =?utf-8?B?MDVOOVozS3pvNHcxbEtnN3dqVndIcmFpUDl2UEl5cDVadWNITEF3TGN0R1lB?= =?utf-8?B?Tk1OUlpFRVBualA4K1lNL3J1V1A1aTZBeWwxL251cHRRM3d6UEpjN05yZjRs?= =?utf-8?B?VCt4VVpMNHJLRFZlQXk2dGRnNzhKMzJNSkhyQUQ2c2w4N1RPWjBUZE9CNGxx?= =?utf-8?B?dGUzTVNma2xjNlZJczhYMTdBVnlGQjFlaVczUHRTYVMvNk5VN2lXNTU1eVdk?= =?utf-8?B?VmpiTXorTGdGQVJYRjFiUFdxOVc4ZmtnaU1iN0h0NXJhRGp4NWQ3cUZHOFhP?= =?utf-8?B?TjBYVW5mVnA0ZkhWYXZEcjU4VTU0NnJHV0VoNVdlTm9GOUszSFBZWlNaRjh6?= =?utf-8?B?Z0txOEFOdExmOXg4bnVuVlRKdWtDdy9SQStDK2dIdlBIbTI0aTlXeFJhUFNI?= =?utf-8?B?UVJZOXJ5K094Q2NjL0t2VFE5K1hsTzVvU1EzeFU4cXdHUkt1UHhBUmJDMEF4?= =?utf-8?B?MmhGb1VVR0V3V2huRyszSCtkNVZBZ0UvSDRzb0JicW5jTDdRTG95ZEQwTWhl?= =?utf-8?Q?nV+yzfk/t2ws8mvuPUucqi4cplbcHcrtE8NEIvgPM?= X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1628; 6:QwjTCeRGF39kxoCtO+BVsukZltgTSi1yMOXMZ21Sc+WgucBsDG7EdpcIPSWn8av5/8zFNbr3q3z8k6JGSECkabWhqW7BRAhE7qwcuaO5ZEQ/nuO7VrA01tDml6Iw2vrz/Oz/efyvN1SQTlD9gD6dCnaikcpoud5rSdu//sFLA3QlgzH8WcD/a2kMTLRLQZGba304RyVDFnaPGrnkVZnVK/6vuLmI+QD+ZeCzKyx7IFprjX8vlOvC6QacZ+lxJsh6wNSbcbmIcx9Fn0V/rY27Nre6h7v7bSGlhhpFaNxwXVry0Pm9oRUQd028imrjnXEq; 5:qq6tJiKvTSzRoOTAB9jc0HF4cfHINWazDdxX8S95KHNWFifIIEYPzv/ecSOuMzhEqOECZiNcV/buHUnVKvsFb8HeXe5xq2TjHlawhoXKAi7ZXDXeA1ms0kR0SAYhtvn1fMip4g0+qJ+zVkxxolzvIWuhNVilmDugglkMtk+aKjJ+MtCqLNWtFQiQ7p3BaEQ6; 24:Ad2wPm7hXJMfeGZBjIoOzXfypRRUmTugpl+61H3u1kAxheUPriFnET2Jjdv1rmM42uivwFYCm9ucGbMeARntKL5WHrbpcuJ/MNytk1msLMI= SpamDiagnosticOutput: 1:99 SpamDiagnosticMetadata: NSPM X-Microsoft-Exchange-Diagnostics: 1; CY1PR0301MB1628; 7:DZ+OYk7GkOdq6P6HdXCQvvqleytI4zh1E73ljbEGM3SV16pBSiaisI4iT0APJd3CORccqyCk1pcUFAREMeJnweKEN0fW0qFoqHHl4y+xPGPfTOp0/75qszqb3GfbxI/OsBFUpTI/AzFJ0Jvl5nlmMGFqgLrp5G38dprhbdMFcCY2WmaHpRLVjWkfdSD6F9FlK95C8hCNMhdQdgMCyhmZ/epl7x0CuByP7zvCjr/zSHJmY1U0s1Ggk7vHD+46xBmIpU7jI7GlxDOXvHgUJ9cXEZSeFt7R/0MMf6FPEZQFWTYvl4g7qAnzoU+ycvCggrys6fp8IaeUL2oeIPkdwfm777TbxrObOIPSeP3ATx5pIoY= X-MS-Exchange-CrossTenant-OriginalArrivalTime: 01 Nov 2016 06:09:57.1812 (UTC) X-MS-Exchange-CrossTenant-Id: 5afe0b00-7697-4969-b663-5eab37d5f47e X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=5afe0b00-7697-4969-b663-5eab37d5f47e; Ip=[192.88.168.50]; Helo=[tx30smr01.am.freescale.net] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: CY1PR0301MB1628 Cc: Yuqing Zhu Subject: [PATCH v2 1/2] 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: Tue, 01 Nov 2016 06:10:04 -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 --- .../0002-Support-fb-backend-for-gl-plugins.patch | 758 +++++++++++++++++++++ ...v-to-glimagesink-to-improve-playback-per.patch} | 0 ...glplugin-Accelerate-gldownload-with-dire.patch} | 0 ...Fix-dependence-issue-between-gst-plugin-.patch} | 0 ...convert-convert-YUV-to-RGB-use-directviv.patch} | 0 ...k-around-for-no-frame-when-imxplayer-use.patch} | 0 ...olorconvert-fix-MRT-cannot-work-in-GLES3.patch} | 0 .../gstreamer/gstreamer1.0-plugins-bad_%.bbappend | 13 +- 8 files changed, 765 insertions(+), 6 deletions(-) create mode 100755 recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-Support-fb-backend-for-gl-plugins.patch rename recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/{0002-Add-directviv-to-glimagesink-to-improve-playback-per.patch => 0003-Add-directviv-to-glimagesink-to-improve-playback-per.patch} (100%) rename recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/{0003-MMFMWK-6930-glplugin-Accelerate-gldownload-with-dire.patch => 0004-MMFMWK-6930-glplugin-Accelerate-gldownload-with-dire.patch} (100%) rename recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/{0004-Fix-dependence-issue-between-gst-plugin-.patch => 0005-Fix-dependence-issue-between-gst-plugin-.patch} (100%) rename recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/{0005-glcolorconvert-convert-YUV-to-RGB-use-directviv.patch => 0006-glcolorconvert-convert-YUV-to-RGB-use-directviv.patch} (100%) rename recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/{0006-glwindow-work-around-for-no-frame-when-imxplayer-use.patch => 0007-glwindow-work-around-for-no-frame-when-imxplayer-use.patch} (100%) rename recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/{0007-glplugin-glcolorconvert-fix-MRT-cannot-work-in-GLES3.patch => 0008-glplugin-glcolorconvert-fix-MRT-cannot-work-in-GLES3.patch} (100%) diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-Support-fb-backend-for-gl-plugins.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-Support-fb-backend-for-gl-plugins.patch new file mode 100755 index 0000000..b5b8d64 --- /dev/null +++ b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-Support-fb-backend-for-gl-plugins.patch @@ -0,0 +1,758 @@ +From 230873df6cfd43ce70d9dc763d6f47415f846059 Mon Sep 17 00:00:00 2001 +From: Haihua Hu +Date: Mon, 16 Nov 2015 17:41:57 +0800 +Subject: [PATCH] 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 | 25 ++- + 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 | 265 ++++++++++++++++++++++++++++++++ + 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 8d82850..537ee33 100644 +--- a/configure.ac ++++ b/configure.ac +@@ -682,6 +682,7 @@ save_LIBS="$LIBS" + HAVE_GL=no + HAVE_GLES2=no + HAVE_WAYLAND_EGL=no ++HAV_FB_EGL=no + + HAVE_EGL_RPI=no + +@@ -718,6 +719,9 @@ case $host in + old_LIBS=$LIBS + old_CFLAGS=$CFLAGS + ++ dnl check for imx fbbackend support ++ AC_CHECK_LIB(EGL, fbGetDisplay, HAVE_FB_EGL=yes, HAVE_FB_EGL=no) ++ + dnl FIXME: Mali EGL depends on GLESv1 or GLESv2 + AC_CHECK_HEADER([EGL/fbdev_window.h], + [ +@@ -1003,6 +1007,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 +@@ -1017,7 +1031,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 +@@ -1166,6 +1180,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" +@@ -1195,6 +1210,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 +@@ -1204,6 +1223,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 +@@ -1279,6 +1299,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) +@@ -1294,6 +1315,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") +@@ -3580,6 +3602,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 f1cb9e1..4bd6511 100644 +--- a/gst-libs/gst/gl/Makefile.am ++++ b/gst-libs/gst/gl/Makefile.am +@@ -117,6 +117,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..a068e30 +--- /dev/null ++++ b/gst-libs/gst/gl/fb/gstglwindow_fb_egl.c +@@ -0,0 +1,265 @@ ++/* ++ * 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 = 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..216e421 +--- /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/eglplatform.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 5cae2f4..0213d60 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 7f49a44..c5bc985 100644 +--- a/gst-libs/gst/gl/gstgldisplay.h ++++ b/gst-libs/gst/gl/gstgldisplay.h +@@ -60,6 +60,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 695f4c4..7b20ff4 100644 +--- a/gst-libs/gst/gl/gstglwindow.c ++++ b/gst-libs/gst/gl/gstglwindow.c +@@ -302,6 +302,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.9.1 + diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-Add-directviv-to-glimagesink-to-improve-playback-per.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-Add-directviv-to-glimagesink-to-improve-playback-per.patch similarity index 100% rename from recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0002-Add-directviv-to-glimagesink-to-improve-playback-per.patch rename to recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-Add-directviv-to-glimagesink-to-improve-playback-per.patch diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-MMFMWK-6930-glplugin-Accelerate-gldownload-with-dire.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-MMFMWK-6930-glplugin-Accelerate-gldownload-with-dire.patch similarity index 100% rename from recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0003-MMFMWK-6930-glplugin-Accelerate-gldownload-with-dire.patch rename to recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-MMFMWK-6930-glplugin-Accelerate-gldownload-with-dire.patch diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-Fix-dependence-issue-between-gst-plugin-.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-Fix-dependence-issue-between-gst-plugin-.patch similarity index 100% rename from recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0004-Fix-dependence-issue-between-gst-plugin-.patch rename to recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-Fix-dependence-issue-between-gst-plugin-.patch diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-glcolorconvert-convert-YUV-to-RGB-use-directviv.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0006-glcolorconvert-convert-YUV-to-RGB-use-directviv.patch similarity index 100% rename from recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0005-glcolorconvert-convert-YUV-to-RGB-use-directviv.patch rename to recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0006-glcolorconvert-convert-YUV-to-RGB-use-directviv.patch diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0006-glwindow-work-around-for-no-frame-when-imxplayer-use.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0007-glwindow-work-around-for-no-frame-when-imxplayer-use.patch similarity index 100% rename from recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0006-glwindow-work-around-for-no-frame-when-imxplayer-use.patch rename to recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0007-glwindow-work-around-for-no-frame-when-imxplayer-use.patch diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0007-glplugin-glcolorconvert-fix-MRT-cannot-work-in-GLES3.patch b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0008-glplugin-glcolorconvert-fix-MRT-cannot-work-in-GLES3.patch similarity index 100% rename from recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0007-glplugin-glcolorconvert-fix-MRT-cannot-work-in-GLES3.patch rename to recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0008-glplugin-glcolorconvert-fix-MRT-cannot-work-in-GLES3.patch diff --git a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_%.bbappend b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_%.bbappend index c663d94..9ee82a8 100644 --- a/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_%.bbappend +++ b/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_%.bbappend @@ -12,12 +12,13 @@ PACKAGECONFIG_GL_imxgpu3d = "${@bb.utils.contains('DISTRO_FEATURES', 'opengl', ' SRC_URI_append_imxgpu3d = " \ file://0001-glplugin-Change-wayland-default-res-to-1024x768.patch \ - file://0002-Add-directviv-to-glimagesink-to-improve-playback-per.patch \ - file://0003-MMFMWK-6930-glplugin-Accelerate-gldownload-with-dire.patch \ - file://0004-Fix-dependence-issue-between-gst-plugin-.patch \ - file://0005-glcolorconvert-convert-YUV-to-RGB-use-directviv.patch \ - file://0006-glwindow-work-around-for-no-frame-when-imxplayer-use.patch \ - file://0007-glplugin-glcolorconvert-fix-MRT-cannot-work-in-GLES3.patch \ + file://0002-Support-fb-backend-for-gl-plugins.patch \ + file://0003-Add-directviv-to-glimagesink-to-improve-playback-per.patch \ + file://0004-MMFMWK-6930-glplugin-Accelerate-gldownload-with-dire.patch \ + file://0005-Fix-dependence-issue-between-gst-plugin-.patch \ + file://0006-glcolorconvert-convert-YUV-to-RGB-use-directviv.patch \ + file://0007-glwindow-work-around-for-no-frame-when-imxplayer-use.patch \ + file://0008-glplugin-glcolorconvert-fix-MRT-cannot-work-in-GLES3.patch \ " -- 1.9.1