{"id":158,"date":"2014-04-13T10:28:50","date_gmt":"2014-04-13T08:28:50","guid":{"rendered":"https:\/\/coaxion.net\/blog\/?p=158"},"modified":"2014-05-17T00:26:32","modified_gmt":"2014-05-16T22:26:32","slug":"opengl-support-in-gstreamer","status":"publish","type":"post","link":"https:\/\/coaxion.net\/blog\/2014\/04\/opengl-support-in-gstreamer\/","title":{"rendered":"OpenGL support in GStreamer"},"content":{"rendered":"<p>Over the last few months Matthew Waters, Julien Isorce and to some lesser degree myself worked on integrating proper <a href=\"https:\/\/www.khronos.org\/opengl\/\" title=\"OpenGL\" target=\"_blank\">OpenGL<\/a> support into <a href=\"http:\/\/gstreamer.freedesktop.org\" title=\"GStreamer\" target=\"_blank\">GStreamer<\/a>.<\/p>\n<p>Previously there were a few sinks based on OpenGL (osxvideosink for Mac OS X and <a href=\"http:\/\/cgit.freedesktop.org\/gstreamer\/gst-plugins-bad\/tree\/ext\/eglgles\" title=\"eglglessink\" target=\"_blank\">eglglessink<\/a> for Android and iOS), but they all only allowed rendering to a window. They did not allow rendering of a video into a custom texture that is then composited inside the application into an OpenGL scene. And then there was <a href=\"http:\/\/cgit.freedesktop.org\/gstreamer\/gst-plugins-gl\/\" title=\"gst-plugins-gl\" target=\"_blank\">gst-plugins-gl<\/a>, which allowed more flexible handling of OpenGL inside GStreamer pipelines, including uploading and downloading of video frames to the GPU, provided various filters and base classes to easily implement shader-based filters, provided infrastructure for sharing OpenGL contexts between different elements (even if they run in different threads) and also provided a video sink. The latter was now improved a lot, ported to all the new features for <a href=\"https:\/\/coaxion.net\/blog\/2013\/10\/the-never-ending-story-gstreamer-and-hardware-integration\/\" title=\"hardware integration\" target=\"_blank\">hardware integration<\/a> and finally merged into <a href=\"http:\/\/cgit.freedesktop.org\/gstreamer\/gst-plugins-bad\/tree\/gst-libs\/gst\/gl\" title=\"gst-libs\/gst\/gl\" target=\"_blank\">gst-plugins-bad<\/a>. Starting with GStreamer 1.4 in a few weeks, OpenGL will be a first-class citizen in GStreamer pipelines.<\/p>\n<p>After <a href=\"http:\/\/cgit.freedesktop.org\/gstreamer\/gst-plugins-bad\/commit\/?id=ae81268565e79c7088a9fda6a10b8650b44e3643\" title=\"EAGL support\" target=\"_blank\">yesterday&#8217;s addition of EAGL support for iOS<\/a> (<a href=\"https:\/\/developer.apple.com\/library\/ios\/documentation\/3DDrawing\/Conceptual\/OpenGLES_ProgrammingGuide\/Introduction\/Introduction.html\" title=\"EAGL\" target=\"_blank\">EAGL<\/a> is Apple&#8217;s iOS API for handling GLES contexts), there is nothing missing to use this new set of library and plugins on all platforms supported by GStreamer. And <a href=\"https:\/\/bugzilla.gnome.org\/show_bug.cgi?id=703343\" target=\"_blank\">finally we can get rid of eglglessink<\/a>, which was only meant as an intermediate solution until we have all the infrastructure for real OpenGL support.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Over the last few months Matthew Waters, Julien Isorce and to some lesser degree myself worked on integrating proper OpenGL support into GStreamer. Previously there were a few sinks based on OpenGL (osxvideosink for Mac OS X and eglglessink for Android and iOS), but they all only allowed rendering to a window. They did not &hellip; <a href=\"https:\/\/coaxion.net\/blog\/2014\/04\/opengl-support-in-gstreamer\/\" class=\"more-link\">Continue reading <span class=\"screen-reader-text\">OpenGL support in GStreamer<\/span><\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[3,5],"tags":[21,18,16,17,10,23,15,22,20,19],"class_list":["post-158","post","type-post","status-publish","format-standard","hentry","category-free-software","category-gstreamer","tag-android","tag-cross-platform","tag-egl","tag-gles","tag-gstreamer-2","tag-ios","tag-opengl","tag-osx","tag-rpi","tag-video"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/coaxion.net\/blog\/wp-json\/wp\/v2\/posts\/158","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/coaxion.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/coaxion.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/coaxion.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/coaxion.net\/blog\/wp-json\/wp\/v2\/comments?post=158"}],"version-history":[{"count":1,"href":"https:\/\/coaxion.net\/blog\/wp-json\/wp\/v2\/posts\/158\/revisions"}],"predecessor-version":[{"id":159,"href":"https:\/\/coaxion.net\/blog\/wp-json\/wp\/v2\/posts\/158\/revisions\/159"}],"wp:attachment":[{"href":"https:\/\/coaxion.net\/blog\/wp-json\/wp\/v2\/media?parent=158"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/coaxion.net\/blog\/wp-json\/wp\/v2\/categories?post=158"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/coaxion.net\/blog\/wp-json\/wp\/v2\/tags?post=158"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}