Merge tag 'upstream/1.7.1' into debian-experimental

Upstream version 1.7.1
diff --git a/ChangeLog b/ChangeLog
index bb61acf..1120811 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,32 +1,1401 @@
-=== release 1.6.2 ===
+=== release 1.7.1 ===
 
-2015-12-14  Sebastian Dröge <slomo@coaxion.net>
+2015-12-24  Sebastian Dröge <slomo@coaxion.net>
 
 	* configure.ac:
-	  releasing 1.6.2
+	  releasing 1.7.1
 
-2015-12-14 19:16:12 +0100  Sebastian Dröge <sebastian@centricular.com>
+2015-12-24 12:23:00 +0100  Sebastian Dröge <sebastian@centricular.com>
 
+	* po/cs.po:
 	* po/da.po:
+	* po/de.po:
 	* po/hu.po:
 	* po/ky.po:
+	* po/nb.po:
+	* po/nl.po:
+	* po/pl.po:
+	* po/ru.po:
+	* po/sr.po:
 	* po/sv.po:
+	* po/uk.po:
+	* po/vi.po:
+	* po/zh_CN.po:
 	  po: Update translations
 
-2015-12-12 10:07:46 +1100  Matthew Waters <matthew@centricular.com>
+2015-12-23 23:13:21 +0000  Tim-Philipp Müller <tim@centricular.com>
 
+	* tests/check/elements/curlftpsink.c:
+	* tests/check/elements/curlhttpsink.c:
+	* tests/check/elements/curlsmtpsink.c:
+	* tests/check/elements/pcapparse.c:
+	* tests/check/elements/rtponviftimestamp.c:
+	  tests: fix indentation
+
+2015-12-23 23:10:50 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* tests/check/elements/pcapparse.c:
+	  tests: pcapparse: add check for 0-sized packets
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756573
+
+2015-12-23 20:24:46 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* gst/pcapparse/gstpcapparse.c:
+	  pcapparse: don't crash on 0-sized packets
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756573
+
+2015-12-23 13:06:45 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* common:
+	  Update common
+
+2015-12-23 13:04:23 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* configure.ac:
+	* pkgconfig/Makefile.am:
+	* pkgconfig/gstreamer-player-uninstalled.pc.in:
+	* pkgconfig/gstreamer-player.pc.in:
+	  player: Add pkg-config files
+
+2015-12-23 12:16:54 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* autogen.sh:
+	  autogen.sh: Enable player tests by default
+	  This will be automatically be updated together with the next common update
+	  again.
+
+2015-12-23 09:55:26 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* configure.ac:
+	* tests/check/Makefile.am:
+	* tests/check/libs/player.c:
+	  player: Add unit test that is disabled by default
+	  The unit test is downloading a few small media files from the Internet,
+	  which are then used during the test. "make clean" removes the files again.
+
+2015-12-22 14:44:28 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* docs/libs/Makefile.am:
+	* docs/libs/gst-plugins-bad-libs-docs.sgml:
+	* docs/libs/gst-plugins-bad-libs-sections.txt:
+	* docs/libs/gst-plugins-bad-libs.types:
+	  player: Integrate into the documentation build system
+
+2015-12-22 14:24:00 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* configure.ac:
+	* gst-libs/gst/Makefile.am:
+	* gst-libs/gst/player/Makefile.am:
+	* gst-libs/gst/player/gstplayer-g-main-context-signal-dispatcher.c:
+	* gst-libs/gst/player/gstplayer-g-main-context-signal-dispatcher.h:
+	* gst-libs/gst/player/gstplayer-media-info-private.h:
+	* gst-libs/gst/player/gstplayer-media-info.c:
+	* gst-libs/gst/player/gstplayer-media-info.h:
+	* gst-libs/gst/player/gstplayer-signal-dispatcher-private.h:
+	* gst-libs/gst/player/gstplayer-signal-dispatcher.c:
+	* gst-libs/gst/player/gstplayer-signal-dispatcher.h:
+	* gst-libs/gst/player/gstplayer-types.h:
+	* gst-libs/gst/player/gstplayer-video-overlay-video-renderer.c:
+	* gst-libs/gst/player/gstplayer-video-overlay-video-renderer.h:
+	* gst-libs/gst/player/gstplayer-video-renderer-private.h:
+	* gst-libs/gst/player/gstplayer-video-renderer.c:
+	* gst-libs/gst/player/gstplayer-video-renderer.h:
+	* gst-libs/gst/player/gstplayer-visualization.c:
+	* gst-libs/gst/player/gstplayer-visualization.h:
+	* gst-libs/gst/player/gstplayer.c:
+	* gst-libs/gst/player/gstplayer.h:
+	* gst-libs/gst/player/player.h:
+	* win32/common/libgstplayer.def:
+	  player: Import GstPlayer playback convenience API
+	  Based on https://github.com/sdroege/gst-player
+	  commit 9ce6ae0dbb8eeeefaf794cfae80e279a03cc598d
+
+2015-12-23 09:50:13 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst-libs/gst/gl/gstglmemorypbo.c:
+	  glmemorypbo: Comment out unused functions to fix compilation with clang
+	  It's not clear if these are intentionally unused or the code should be
+	  changed, but this fixes compilation for the time being at least.
+	  See https://bugzilla.gnome.org/show_bug.cgi?id=759679
+
+2015-11-10 16:25:53 +0000  Alex Ashley <bugzilla@ashley-family.net>
+
+	* tests/check/elements/hlsdemux_m3u8.c:
+	  hlsdemux: tests: check URL joining if media URL contains a '/' character
+	  If the query parameter (for example
+	  http://example.net/1054559_1500k.mp4/master.m3u8?acl=/*1054559_1500k.mp4),
+	  check that m3u8.c correctly converts the relative URLs of the media
+	  playlists in to absolute URLs. It must not use the last '/' it finds in
+	  the URL, as according to RFC3986 the '/' character is allowed in
+	  the query part of the URL.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758384
+
+2015-11-10 16:23:59 +0000  Alex Ashley <bugzilla@ashley-family.net>
+
+	* ext/hls/m3u8.c:
+	* tests/check/elements/hlsdemux_m3u8.c:
+	  hlsdemux: unquote all the quoted-string attributes
+	  The URI attribute from the EXT-X-KEY tag and the URI attribute from the
+	  EXT-X-I-FRAMES-ONLY tag are both quoted-string attibutes that have their
+	  quotation marks removed during parsing. The CODECS attribute of the
+	  EXT-X-STREAM-INF is also a quoted-string attribute, but this attribute
+	  was not being un-quoted.
+	  This commit changes the parser to always unquote all quoted-string
+	  attributes and adjusts the unit tests to this new bevahiour for the
+	  CODECS attribute.
+	  An additional test is added to check that parsing of all of the fields
+	  in the EXT-X-STREAM tag is correct, including those that contain comma
+	  characters.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758384
+
+2015-11-10 16:41:02 +0000  Alex Ashley <bugzilla@ashley-family.net>
+
+	* tests/check/Makefile.am:
+	* tests/check/elements/.gitignore:
+	* tests/check/elements/hls_demux.c:
+	  hlsdemux: tests: add unit tests for hlsdemux
+	  Using the new GstAdaptiveDemux test framework, add tests that
+	  exercise hlsdemux. The following tests are added:
+	  simpleTest
+	  A simple playlist that contains some media URLs
+	  testMediaPlaylist
+	  A master playlist with a variant playlist that contains media URLs
+	  testMediaPlaylistNotFound
+	  A master playlist that points to a missing variant playlist
+	  testFragmentNotFound
+	  A master playlist with a variant playlist that contains media URLs
+	  There is a missing media file referenced from the variant playlist.
+	  testFragmentDownloadError
+	  A master playlist with a variant playlist that contains media URLs
+	  During the download of one media file, the test simulates the network
+	  connection being dropped.
+	  testSeek
+	  A simple test of trying to perform a seek on an HLS stream.
+
+2015-11-10 13:13:35 +0000  Alex Ashley <bugzilla@ashley-family.net>
+
+	* tests/check/Makefile.am:
+	* tests/check/elements/adaptive_demux_common.c:
+	* tests/check/elements/adaptive_demux_common.h:
+	* tests/check/elements/adaptive_demux_engine.c:
+	* tests/check/elements/adaptive_demux_engine.h:
+	* tests/check/elements/dash_demux.c:
+	* tests/check/elements/fake_http_src.c:
+	* tests/check/elements/fake_http_src.h:
+	* tests/check/elements/test_http_src.c:
+	* tests/check/elements/test_http_src.h:
+	  dashdemux: tests: Refactor into adaptive_engine components
+	  To allow code from dash_demux.c to be used by other elements
+	  that are based upon GstAdaptiveDemux, the code has been
+	  refactored into four new files:
+	  adaptive_demux_engine.[ch]
+	  adaptive_demux_common.[ch]
+	  The code in adaptive_demux_engine.c provides a generic
+	  test engine for elements based upon GstAdaptiveDemux.
+	  The code in adaptive_demux_common.c provides a set
+	  of utility functions that are common between the tests
+	  for hlsdemux and dashdemux.
+	  As part of the refactoring, variables in structures were
+	  renamed from using camelCase to underscore_case to match other
+	  GStreamer source code.
+	  The fake_http_src was renamed test_http_src and changed to use
+	  callbacks to provide input data and error conditions. Rather than
+	  using an array of input data that tries to encode all the
+	  possible use cases for the GstTestHTTPSrc element, use a struct of
+	  callbacks.
+	  Users of this element are obliged to implement at least the src_start
+	  callback, which provides a way to link from a URI to the settings
+	  for that URI.
+
+2015-12-22 11:10:31 +0200  Matthew Marsh <matt@stonethree.com>
+
+	* sys/nvenc/gstnvbaseenc.c:
+	  nvenc: fix high CPU use on initialization of multiple encoders at the same time
+	  We need a static lock to protect various NVENC methods in _set_format(). Without
+	  this the CPU use increases dramatically on initialisation of the element when
+	  there are multiple elements being initialised at the same time.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759742
+
+2015-12-22 10:15:39 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* ext/hls/gsthlsdemux.c:
+	  hlsdemux: make sure every bad update_playlist return sets an error
+	  Otherwise it segfaults when reporting the error in the bus
+
+2015-12-21 13:57:04 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/teletextdec/gstteletextdec.c:
+	  teletextdec: Use NULL instead of g_strdup('\0')
+	  Which is equivalent to g_strdup(NULL).
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759728
+
+2015-12-21 12:33:25 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* common:
+	* configure.ac:
+	  configure: Use -Bsymbolic-functions if available
+	  While this is more useful for libraries, some of our plugins with multiple
+	  files and some internal API can also benefit from this.
+
+2015-12-21 12:19:11 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* tests/check/libs/gstglcolorconvert.c:
+	  glcolorconvert: Fix name of testsuite
+
+2015-12-21 12:13:15 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst-libs/gst/gl/gstglcontext.c:
+	  glcontext: Signal context creation from inside the context loop and use g_thread_join() instead of a custom condition variable
+	  Also protect against spurious condition variable wakeups during context
+	  creation.
+
+2015-12-21 11:27:09 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst-libs/gst/gl/gstglwindow.c:
+	* gst-libs/gst/gl/gstglwindow.h:
+	* gst-libs/gst/gl/x11/gstglwindow_x11.c:
+	  glwindow: Hide navigation specific internal API and add API to asynchronously send navigation events
+	  Exposing the navigation thread's main context, GSourceFuncs and structs called
+	  key_event and mouse_event is exposing a bit too much of the internals. Let's
+	  just go with two functions to asynchronously send navigation events on the
+	  window with the same API as the synchronous ones.
+
+2015-12-21 10:46:52 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst-libs/gst/gl/gstglwindow.c:
+	* gst-libs/gst/gl/gstglwindow.h:
+	  glwindow: Use g_thread_join() instead of a custom condition variable for waiting for the navigation thread to finish
+	  Also hide some internal functions and fields while we're at it and fix
+	  a race condition with the startup condition variable.
+
+2015-11-30 09:36:09 +0800  Haihua Hu <b55597@freescale.com>
+
+	* gst-libs/gst/gl/gstglwindow.c:
+	  glwindow: Fix memory leak of navigation thread
+	  When stopping the navigation thread, call g_thread_join() to release
+	  the resources hold by it.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758820
+
+2015-12-19 21:25:49 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/assrender/gstassrender.c:
+	* gst/dvbsuboverlay/gstdvbsuboverlay.c:
+	  assrender, dvbsuboverlay: fix example pipelines in docs
+
+2015-12-19 21:10:56 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/gsthlsdemux.c:
+	  hlsdemux: reflow update_playlist a bit
+	  Reduce indentation by erroring out directly on failure.
+
+2015-12-19 20:59:12 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/gsthlsdemux.c:
+	  hlsdemux: fix potential error leak
+	  Clear error as soon as we determine that the download failed,
+	  otherwise there are code paths where we might return without
+	  clearing it ever, which would leak the GError then. Also, we
+	  can pass a NULL GError pointer to _fetch_uri(), so just do that
+	  instead of passing one that we're going to just free again
+	  right away anyway.
+
+2015-12-19 12:05:59 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gstpyramidsegment.cpp:
+	  opencv: remove unneeded sink_event function in pyramidsegment
+
+2015-12-19 12:04:01 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gsttextoverlay.cpp:
+	  opencv: remove unneeded sink_event function in textoverlay
+
+2015-12-18 18:51:49 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* ext/opencv/gsttemplatematch.cpp:
+	  templatematch: remove useless function
+
+2015-12-18 11:56:17 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* ext/hls/gsthlsdemux.c:
+	  hlsdemux: always set timestamp on reverse playback
+	  Downstream needs to be able to restore the timestamps after a discont
+	  to do reverse playback
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759592
+
+2015-12-18 15:36:40 -0500  Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	  glconvert: Fix compilation of GRAY16_LE/BE shader
+
+2015-11-13 17:24:30 +0100  Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+	* gst-libs/gst/gl/gstglupload.c:
+	  glupload: Add dmabuf upload method.
+	  This upload method detect and optimize uploads of DMABuf memory. This is
+	  done by creating and caching EGLImages wrapper around DMABuf. The
+	  EGLImages are then binded to a texture which get converter using
+	  standard shader.
+	  Example pipeline:
+	  GST_GL_PLATFORM=egl \
+	  gst-launch-1.0 v4l2src device=/dev/video1 io-mode=4 ! \
+	  video/x-raw,format=NV12 ! glimagesink
+	  https://bugzilla.gnome.org/show_bug.cgi?id=743345
+
+2015-12-18 15:52:46 -0500  Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+	* gst-libs/gst/gl/egl/gsteglimagememory.c:
+	  eglimagememory: Also import BGR16, ABGR, xBGR, AYUV, GRAY16_LE/BE and Y444
+	  https://bugzilla.gnome.org/show_bug.cgi?id=743345
+
+2015-12-18 11:08:29 -0500  Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+	* gst-libs/gst/gl/egl/gsteglimagememory.c:
+	  eglimagememory: Add RGB/BGR DMABuf importation support
+	  https://bugzilla.gnome.org/show_bug.cgi?id=743345
+
+2015-11-13 17:40:08 +0100  Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk>
+
+	* gst-libs/gst/gl/egl/gsteglimagememory.c:
+	* gst-libs/gst/gl/egl/gsteglimagememory.h:
+	  eglimagememory: Methods to create GstGLMemory from dmabufs
+	  Maps GstVideoFormats to suitable DRM fourccs which work with
+	  glcolorconvert, using gst_gl_memory_alloc(). We require mostly
+	  only 4 formats to be supported by the driver. We require DRM
+	  equivalent to RGB16, RGBA, R8 and RG88. This way it's compatible with
+	  DesktopGL, since GL_TEXTURE_2D is used and limit driver requirements.
+	  With this we can virtually support all formats the glcolorconvert
+	  supports.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=743345
+
+2015-10-02 13:31:39 +0200  Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk>
+
+	* configure.ac:
+	* gst-libs/gst/gl/Makefile.am:
+	  build: Add dmabuf build condition.
+	  configure.ac: Build dmabuf when EGL and drm_fourcc.h is available.
+	  gl: Link gst-allocators.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=743345
+
+2015-11-13 17:09:13 +0100  Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk>
+
+	* ext/gl/gstglimagesink.c:
+	  glimagesink: Show error when video frame is not mapped.
+	  Adds more meaningful error than
+	  "Failed to convert multiview video buffer", which is always used
+	  when prepare_next_buffer() fails in gst_glimage_sink_prepare().
+	  https://bugzilla.gnome.org/show_bug.cgi?id=743345
+
+2015-11-13 17:05:11 +0100  Lubosz Sarnecki <lubosz.sarnecki@collabora.co.uk>
+
+	* gst-libs/gst/gl/egl/gstglcontext_egl.c:
+	* gst-libs/gst/gl/egl/gstglcontext_egl.h:
+	  gstglcontext_egl: Expose gst_gl_context_egl_get_error_string.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=743345
+
+2015-12-18 16:56:04 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gsttextoverlay.cpp:
+	* ext/opencv/gsttextoverlay.h:
+	  opencv: update opencvtextoverlay to GstOpencvVideoFilter
+	  Update opencvtextoverlay to inherit from GstOpencvVideoFilter instead of
+	  from GstElement. This means less code and more uniformity with other OpenCV
+	  elements. The chain/transform function is now a third of the size than
+	  before.
+
+2015-12-18 16:18:52 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gsttemplatematch.cpp:
+	* ext/opencv/gsttemplatematch.h:
+	  opencv: update templatematch to GstOpencvVideoFilter
+	  Update pyramidsegment to inherit from GstOpencvVideoFilter instead of from
+	  GstElement. This means less code and more uniformity with other OpenCV
+	  elements.
+
+2015-12-18 15:48:16 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gstpyramidsegment.cpp:
+	* ext/opencv/gstpyramidsegment.h:
+	  opencv: update pyramidsegment to GstOpencvVideoFilter
+	  Update pyramidsegment to inherit from GstOpencvVideoFilter instead of from
+	  GstElement. This means less code and more uniformity with other OpenCV
+	  elements.
+
+2015-12-17 17:26:29 +0200  Vivia Nikolaidou <vivia@ahiru.eu>
+
+	* sys/decklink/gstdecklink.cpp:
+	* sys/decklink/gstdecklink.h:
+	* sys/decklink/gstdecklinkaudiosrc.cpp:
+	* sys/decklink/gstdecklinkvideosink.cpp:
+	  decklinkvideosink: Made "auto" mode work according to caps
+	  When the mode of decklinkvideosink is set to "auto", the sink claims to
+	  support the full set of caps that it can support for all modes. Then, every
+	  time new caps are set, the sink will automatically find the correct mode for
+	  these caps and set it.
+	  Caveat: We have no way to know whether a specific mode will actually work for
+	  your hardware. Therefore, if you try sending 4K video to a 1080 screen, it
+	  will silently fail, we have no way to know that in advance. Manually setting
+	  that mode at least gave the user a way to double-check what they are doing.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759600
+
+2015-12-18 12:28:23 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gstmotioncells.cpp:
+	* ext/opencv/gstmotioncells.h:
+	  opencv: update motioncells to GstOpencvVideoFilter
+	  Update motioncells to inherit from GstOpencvVideoFilter instead of from
+	  GstElement. This means less code and more uniformity with other OpenCV
+	  elements.
+
+2015-12-18 12:26:16 +0100  Thomas Roos <thomas.roos@industronic.de>
+
+	* sys/directsound/gstdirectsoundsrc.c:
+	* sys/directsound/gstdirectsoundsrc.h:
+	  directsoundsrc: add device property as it is done in directsoundsink
+	  This allows selection of the device by GUID instead of the name. The name is
+	  user-given and multiple devices can have the same name.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759484
+
+2015-12-18 12:36:26 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* sys/directsound/gstdirectsoundsrc.h:
+	  directsoundsrc: Convert header from (some) DOS line endings to UNIX
+	  A mix between different line endings in the same file is not a good idea,
+	  and the .c files are both with UNIX line endings so let's use that.
+
+2015-12-18 10:30:25 +0000  Julien Isorce <j.isorce@samsung.com>
+
+	* sys/applemedia/Makefile.am:
+	  applemedia: set -mmacosx-version-min to 10.8
+	  Otherwise qtkitvideosrc fails to build on OSX 10.10.4
+	  because QTKit has been deprecated since OS X 10.9.
+	  Also set -mmacosx-version-min=10.8 in front to allow
+	  the user or cerbero to override the version.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=745564
+
+2015-12-18 13:17:34 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* ext/gl/gstgloverlay.c:
+	* gst-libs/gst/gl/gstglbufferpool.c:
+	* gst-libs/gst/gl/gstglmemory.c:
+	* gst-libs/gst/gl/gstglmemory.h:
+	* gst-libs/gst/gl/gstgloverlaycompositor.c:
+	* gst-libs/gst/gl/gstglupload.c:
+	* gst-libs/gst/gl/gstglviewconvert.c:
+	* sys/applemedia/videotexturecache.m:
+	  glmemory: add gst_gl_memory_allocator_get_default
+	  Add gst_gl_memory_allocator_get_default to get the default allocator based on
+	  the opengl version. Allows us to stop hardcoding the PBO allocator which isn't
+	  supported on gles2.
+	  Fixes GL upload on iOS9 among other things.
+
+2015-12-18 11:49:25 +1100  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/gstglimagesink.c:
+	  glimagesink: don't deadlock on resize
+	  Performing any GL function marshalling off the GL thread with glimagesink's
+	  render lock is prone to deadlocks between the GL thread and the non-GL thread.
+	  What can happen is this:
+	  1. non-GL thread attempts to function marshal to the GL thread.
+	  2. while 1 is happening, the winsys gives an event (say resize)
+	  3. This calls back into glimagesink which taks the render lock.
+	  4. As the GL function marshalling is attempting to run on the GL
+	  and already has glimagesink's render lock locked.  This deadlocks
+	  as the threads are waiting for each other.
+
+2015-12-17 18:16:44 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gstedgedetect.cpp:
+	* ext/opencv/gstedgedetect.h:
+	  opencv: update edgedetect to GstOpencvVideoFilter
+	  Update edgedetect to inherit from GstOpencvVideoFilter instead of from
+	  GstElement. This means less code and more uniformity with other OpenCV
+	  elements.
+
+2015-12-17 15:56:57 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/openjpeg/gstopenjpegdec.c:
+	  openjpegdec: Don't crash when decoding returns NULL data for any component
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758943
+
+2015-12-15 14:14:36 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglbasememory.c:
+	* gst-libs/gst/gl/gstglbasememory.h:
+	  glbasememory: don't unconditionally add the alignment bytes to the size
+	  e.g when wrapping a data pointer we don't want to map/unmap off the end of
+	  pointer with the alignment bytes.
+	  Instead track that information separately as maxsize is used for mapping by
+	  GstMemory and thus represents a size without any alignment padding bytes.
+
+2015-12-17 10:51:31 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gstcvsmooth.cpp:
+	* ext/opencv/gstcvsmooth.h:
+	  opencv: add blur and bilateral support in cvsmooth
+	  Adding the support for the two other OpenCV linear filters to smooth
+	  images. The new API does support spatial sigma in the bilateral filter,
+	  hence bringing that property back.
+	  Adding reference to new documentation.
+
+2015-12-17 08:51:48 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* gst/pnm/gstpnmenc.c:
+	  pnmenc: Fix wrong logic leading to memory mishandling
+	  While encoding the frame in ASCII mode, per component four bytes are needed
+	  and after every 20 bytes, a \n will be added. So the calculation should be
+	  size = size * (4 + 1 / 20). This should exclude the header being written.
+	  Since header is also being included in the calculations, memory mishandlings
+	  are happening.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759520
+
+2015-12-17 15:50:40 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglbuffer.c:
+	  glbuffer: add a name to the allocator
+
+2015-12-17 15:23:13 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglbasememory.c:
+	* gst-libs/gst/gl/gstglbasememory.h:
+	* gst-libs/gst/gl/gstglbuffer.c:
+	* gst-libs/gst/gl/gstglmemory.c:
+	* gst-libs/gst/gl/gstglmemory.h:
+	* gst-libs/gst/gl/gstglmemorypbo.c:
+	* gst-libs/gst/gl/gstgloverlaycompositor.c:
+	* gst-libs/gst/gl/gstglupload.c:
+	* sys/applemedia/iosurfacememory.c:
+	* sys/applemedia/videotexturecache.m:
+	* tests/check/libs/gstglcolorconvert.c:
+	  gl*memory*: reverse the parameter order of user_data and destroy notify
+	  The convention is to have the destroy notify last after any user data
+
+2015-12-17 15:07:33 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* sys/applemedia/videotexturecache.m:
+	  applemedia: fix build on iOS
+	  Fix build after 779dc3132c8f6dd560cb07cc2e2c3c72aeaa7845
+
+2015-12-17 14:49:13 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* sys/applemedia/avfvideosrc.m:
+	  applemedia: avfvideosrc: do fixate
+
+2015-12-16 18:41:06 +1100  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/gstgloverlay.c:
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	* gst-libs/gst/gl/gstglmemorypbo.c:
+	* gst-libs/gst/gl/gstglmemorypbo.h:
+	* gst-libs/gst/gl/gstgloverlaycompositor.c:
+	* gst-libs/gst/gl/gstglupload.c:
+	* gst-libs/gst/gl/gstglviewconvert.c:
+	* sys/applemedia/videotexturecache.m:
+	* tests/check/libs/gstglcolorconvert.c:
+	* tests/check/libs/gstglmemory.c:
+	* tests/check/libs/gstglupload.c:
+	  glmemorypbo: remove our own alloc()/wrapped()/etc functions
+	  replaced by equivalent functionality within gst_gl_base_memory_alloc()
+
+2015-12-16 18:39:32 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglmemory.c:
+	  glmemory: document gst_gl_memory_init
+
+2015-12-16 18:38:19 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglbuffer.c:
+	* gst-libs/gst/gl/gstglmemorypbo.c:
+	  glbuffer: remove unneeded gst_gl_buffer_alloc()
+	  Replaced by gst_gl_base_memory_alloc()
+
+2015-12-16 18:37:11 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglbasememory.c:
+	  glbasememory: document some functions
+
+2015-12-16 18:36:13 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglmemory.c:
+	  glmemory: add a default copy implementation
+	  Subclasses still need to override this to copy into the correct memory type.
+
+2015-12-16 18:32:40 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglbufferpool.c:
+	* gst-libs/gst/gl/gstglbufferpool.h:
+	  glbufferpool: use gst_gl_base_memory_alloc as a generic GL allocation framework
+	  Requires the usage of GstGLVideoAllocationParams however any user can set their
+	  own parameters along with an allocator which will be used to allocate the
+	  correct memory type.
+
+2015-12-16 18:30:59 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglmemorypbo.c:
+	* gst-libs/gst/gl/gstglmemorypbo.h:
+	  glmemorypbo: implement GstGLBaseMemory:alloc
+	  Uses the GstGLVideoAllocationParams parameters
+
+2015-12-16 18:23:31 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglbuffer.c:
+	* gst-libs/gst/gl/gstglbuffer.h:
+	  glbuffer: implements GstGLBaseMemory::alloc
+	  Create GstGLBufferAllocationParams which is subclass of GstGLAllocationParams
+
+2015-12-16 18:20:17 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglmemory.c:
+	* gst-libs/gst/gl/gstglmemory.h:
+	* sys/androidmedia/gstamcvideodec.c:
+	  glmemory: implement GstGLBaseMemory::alloc
+	  - Create GstGLVideoAllocationParams which is a GstGLAllocationParams subclass.
+	  - Make it possible to allocate glmemory objects directly if no frills are
+	  needed.
+
+2015-12-16 18:13:21 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglbasememory.c:
+	* gst-libs/gst/gl/gstglbasememory.h:
+	  glbasememory: add a generic interface for allocating GL memories
+	  This is made possible by a subclassable GstGLAllocationParams that holds
+	  the allocation parameters
+	  Every allocation would now go through gst_gl_base_memory_alloc with the
+	  allocation parameters now being specified in a single struct to allow
+	  extension by different allocators.
+
+2015-12-17 12:30:05 +1100  Matthew Waters <matthew@centricular.com>
+
+	* common:
+	  revert common submodule change
+	  8ae003326157438c12c45589e050c5f446723f61 contained a erroneous common change
+
+2015-12-17 11:06:34 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglbuffer.c:
+	  Revert "glbuffer: Don't pass allocation params"
+	  This reverts commit 052f41e5c293ec17c038467ed1e7b92b04d494b0.
+	  This is incorrect and will affect any other glbuffer user that needs/wants to
+	  perform data alignment.
+
+2015-12-16 19:21:24 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gstcvsmooth.cpp:
+	  opencv: add medianBlur support in cvsmooth
+	  With the deprecation of cvSmooth we have to handle the other smoothing
+	  functions manually.
+
+2015-12-16 18:37:37 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gstcvsmooth.cpp:
+	* ext/opencv/gstcvsmooth.h:
+	  opencv: switch deprecated cvSmooth for GaussianBlur
+	  The OpenCV cvSmooth function is deprecated [0] and the documentation
+	  recommends to use GaussianBlur (). This makes the spatial property go
+	  unused. Marking it as deprecated, making it non-functional and will remove
+	  in the next cycle.
+	  [0] http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html
+
+2015-12-16 11:56:08 -0500  Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+	* gst-libs/gst/gl/gstglbuffer.c:
+	  glbuffer: Don't pass allocation params
+	  The imported memory has already been allocated, passing allocation
+	  parameters with alignment confuses the memory which endup with a
+	  size different from maxsize and lead to overrun when the memory
+	  is being copied.
+
+2015-12-16 13:59:18 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/dash/gstmpdparser.c:
+	* tests/check/elements/dash_mpd.c:
+	  dashdemux: improve validation of UTCtiming element
+	  gst_mpdparser_parse_utctiming_node does not validate the parsed values completely. The following scenarios are incorrectly accepted:
+	  - elements with no schemeIdUri property should be rejected
+	  - elements with unrecognized UTCTiming scheme should be rejected
+	  - elements with empty values should be rejected
+	  The last one triggers a division by 0 in gst_dash_demux_poll_clock_drift:
+	  clock_drift->selected_url = clock_drift->selected_url % g_strv_length (urls);
+	  because it urls is a valid pointer to an empty array.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759547
+
+2015-12-16 10:41:47 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/dash/gstdashdemux.c:
+	  dashdemux: clock_cond is not used and should be removed
+	  There are no threads waiting on clock_cond. It is just initialised and
+	  signalled. It should be removed.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759537
+
+2015-12-16 10:23:23 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/dash/gstdashdemux.c:
+	  adaptivedemux: fixed clock compensation in get_fragment_waiting_time
+	  Clock compensation is calculated in usec but is added to a GstClockTime value.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759534
+
+2015-12-16 10:21:59 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* sys/applemedia/Makefile.am:
+	  applemedia: Link to IOSurface.framework for the IOSurface API
+
+2015-12-15 17:10:00 +0000  Dave Craig <davecraig@unbalancedaudio.com>
+
+	* gst/videoparsers/gstdiracparse.c:
+	* gst/videoparsers/gsth263parse.c:
+	* gst/videoparsers/gsth264parse.c:
+	* gst/videoparsers/gsth265parse.c:
+	* gst/videoparsers/gstmpeg4videoparse.c:
+	* gst/videoparsers/gstmpegvideoparse.c:
+	* gst/videoparsers/gstpngparse.c:
+	* gst/videoparsers/gstvc1parse.c:
+	  videoparsers: Check for NULL return value of gst_pad_get_current_caps()
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759503
+
+2015-12-16 14:32:20 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* gst/ivtc/gstivtc.c:
+	  ivtc: Fix value memory leak
+	  gvalue variable should be unset instead of reset.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759525
+
+2015-12-16 14:29:20 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* gst/ivtc/gstcombdetect.c:
+	  combdetect: Fix value memory leak
+	  gvalue variable should be unset instead of reset.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759523
+
+2015-12-16 13:08:22 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* gst/pnm/gstpnmdec.c:
+	  pnmdec: Fix scanner memory leak
+	  For corrupted files, scanner memory is being leaked.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759522
+
+2015-12-16 13:06:45 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* gst/pnm/gstpnmdec.c:
+	  pnmdec: Fix buffer memory leak
+	  In case of corrupted file, s->buf allocated is not being freed
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759522
+
+2015-12-16 09:05:42 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* gst/pnm/gstpnmenc.c:
+	  pnmenc: Fix string memory leak
+	  header being allocated is not freed resulting in leak
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759520
+
+2015-12-16 08:52:12 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* gst/gdp/gstgdppay.c:
+	  gdppay: Fix buffer memory leak
+	  outbuffer being allocated is not being pushed to queue for EOS event and hence
+	  should be freed.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759519
+
+2015-12-16 09:39:03 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* sys/applemedia/Makefile.am:
+	  applemedia: Link to IOKit.framework for IOSurface related functions
+
+2015-12-16 09:33:12 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* docs/plugins/gst-plugins-bad-plugins.args:
+	* docs/plugins/gst-plugins-bad-plugins.hierarchy:
+	* docs/plugins/gst-plugins-bad-plugins.signals:
+	* docs/plugins/inspect/plugin-curl.xml:
+	* docs/plugins/inspect/plugin-mpegtsdemux.xml:
+	* docs/plugins/inspect/plugin-mpegtsmux.xml:
+	* docs/plugins/inspect/plugin-opus.xml:
+	* docs/plugins/inspect/plugin-spandsp.xml:
+	  docs: update to git
+
+2015-12-16 08:25:19 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* gst/yadif/vf_yadif.c:
+	  yadif: Fix illegal memory access
+	  When applying the spatial prediction, there is an illegal access of -1 index of array.
+	  Hence adding a condition to avoid this.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759518
+
+2015-12-16 08:22:00 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* gst/yadif/gstyadif.c:
+	  yadif: Fix gvalue memory leak
+	  gvalue variable should be unset instead of reset.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759518
+
+2015-12-16 17:02:27 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* sys/applemedia/vtdec.c:
+	  applemedia: vtdec: fix texture-target on iOS
+
+2015-12-16 15:20:30 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* sys/applemedia/vtdec.c:
+	  applemedia: vtdec: remove obsolete FIXME
+
+2015-12-16 14:38:44 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* sys/applemedia/avfvideosrc.m:
+	  applemedia: avfvideosrc: rework GLMemory negotiation
+	  Only do GLMemory when a GstGLContext is available AND GLMemory is actually
+	  negotiated with downstream.
+
+2015-12-16 13:47:00 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* sys/applemedia/avfvideosrc.m:
+	  applemedia: avfvideosrc: update after IOSurface changes
+	  Prefer GLMemory over sysmem. Also now when pushing GLMemory we push the
+	  original formats (UYVY in OSX, BGRA in iOS) and leave it to downstream to
+	  convert.
+
+2015-12-14 16:10:01 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* sys/applemedia/videotexturecache.h:
+	* sys/applemedia/videotexturecache.m:
+	* sys/applemedia/vtdec.c:
+	  applemedia: vtdec: remove the internal GstGLColorConvert
+	  It was added back in the day to make texture sharing work by default with
+	  glimagesink inside playbin. These days glimagesink accepts (and converts) YUV
+	  internally so it's no longer needed.
+
+2015-12-14 14:23:20 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* sys/applemedia/vtdec.c:
+	  applemedia: vtdec: decouple outputting textures from outputting RGBA
+	  We're going to be able to output NV12 textures soon.
+
+2015-12-11 13:20:05 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* common:
+	* sys/applemedia/Makefile.am:
+	* sys/applemedia/iosurfacememory.c:
+	* sys/applemedia/iosurfacememory.h:
+	* sys/applemedia/videotexturecache.h:
+	* sys/applemedia/videotexturecache.m:
+	* sys/applemedia/vtdec.c:
+	  applemedia: vtdec: switch to IOSurface on Mac
+	  Switch to using IOSurface instead of CVOpenGLTextureCache on OSX. The latter can't be
+	  used anymore to do YUV => RGB with opengl3 on El Capitan as GL_YCBCR_422_APPLE
+	  has been removed from the opengl3 driver. Also switch to NV12 from UYVY, which
+	  was the only YUV format supported by CVOpenGLTextureCache.
+
+2015-12-10 16:22:08 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* sys/applemedia/Makefile.am:
+	* sys/applemedia/avfvideosrc.m:
+	* sys/applemedia/corevideotexturecache.h:
+	* sys/applemedia/corevideotexturecache.m:
+	* sys/applemedia/videotexturecache.h:
+	* sys/applemedia/videotexturecache.m:
+	* sys/applemedia/vtdec.c:
+	* sys/applemedia/vtdec.h:
+	  applemedia: rename GstCoreVideoTextureCache to GstVideoTextureCache
+	  First of a few commits to stop using CVOpenGLTextureCache on OSX and use
+	  IOSurfaces directly instead. CVOpenGLTextureCache hasn't been updated for OpenGL
+	  3 which is why texture sharing is currently disabled on OSX.
+
+2015-11-17 19:31:53 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* sys/applemedia/vtdec.c:
+	  Revert "vtdec: disable the texture cache on OSX"
+	  This reverts commit f02425c4afcd85260a1b387aeddf863774257917.
+
+2015-12-15 14:17:16 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* gst-libs/gst/gl/gstglupload.c:
+	  glupload: fix allocator name after GLMemory API changes
+
+2015-12-15 19:28:05 -0500  Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+	* ext/qt/Makefile.am:
+	  qtsink: Add configured GL cflags to the build
+	  We don't directly link to GL in the element, though we use GL headers.
+	  For this reason we need to include the proper GL headers path. This
+	  prevent this element from using a different GL header then libgstgl.
+
+2015-12-15 19:25:16 -0500  Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+	* configure.ac:
+	* gst-libs/gst/gl/gstglapi.h:
+	  gl: Allow using non-system mesa with both GL and GLES
+	  GCC automatically disable redundance warnings for system headers. As
+	  soon as we start using a non-system installed mesa, we would start
+	  having issues. The test for both wasn't setting any flags, so it would
+	  work but then fail at runtime.
+	  This is being fixed by disabling in the code (where needed only) that
+	  GCC warning. The test is also fixed to avoid the false positive we had.
+
+2015-12-15 15:59:30 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gstpyramidsegment.cpp:
+	  opencv: pyramidsegment: fix example launch line
+	  Use videotestsrc and autovideosink in the example gst-launch-1.0 line and
+	  not a useless fakesrc-fakesink example.
+
+2015-12-15 15:56:19 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gstcvdilate.cpp:
+	* ext/opencv/gstcvequalizehist.cpp:
+	* ext/opencv/gstcverode.cpp:
+	* ext/opencv/gstcvlaplace.cpp:
+	* ext/opencv/gstcvsmooth.cpp:
+	* ext/opencv/gstcvsobel.cpp:
+	  opencv: add headers with example launch lines
+	  Add description headers for all the OpenCV plugins missing them, so we can
+	  have gst-launch-1.0 example launch lines for all of them.
+
+2015-12-14 16:48:45 -0500  Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+	* configure.ac:
+	  opengl: Use pkg-config if available
+	  libMesa ships .pc files now for gl/egl/glesv2. This patch makes use
+	  of it while keeping support for system without.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=751068
+
+2015-12-15 11:59:00 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* gst/geometrictransform/gstbulge.c:
+	* gst/geometrictransform/gstcircle.c:
+	* gst/geometrictransform/gstdiffuse.c:
+	* gst/geometrictransform/gstfisheye.c:
+	* gst/geometrictransform/gstkaleidoscope.c:
+	* gst/geometrictransform/gstmarble.c:
+	* gst/geometrictransform/gstmirror.c:
+	* gst/geometrictransform/gstperspective.c:
+	* gst/geometrictransform/gstpinch.c:
+	* gst/geometrictransform/gstrotate.c:
+	* gst/geometrictransform/gstsphere.c:
+	* gst/geometrictransform/gstsquare.c:
+	* gst/geometrictransform/gststretch.c:
+	* gst/geometrictransform/gsttunnel.c:
+	* gst/geometrictransform/gsttwirl.c:
+	* gst/geometrictransform/gstwaterripple.c:
+	  geometrictransform: add headers with example launch lines
+	  Add description headers for all geometrictransform elements so we can have
+	  gst-launch-1.0 example launch lines for all of them.
+
+2015-12-14 11:09:46 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* README:
+	* ext/assrender/gstassrender.c:
+	* ext/chromaprint/gstchromaprint.c:
+	* ext/curl/gstcurlbasesink.c:
+	* ext/curl/gstcurlfilesink.c:
+	* ext/curl/gstcurlftpsink.c:
+	* ext/curl/gstcurlhttpsink.c:
+	* ext/curl/gstcurlsftpsink.c:
+	* ext/curl/gstcurlsmtpsink.c:
+	* ext/daala/gstdaaladec.c:
+	* ext/daala/gstdaalaenc.c:
+	* ext/directfb/dfbvideosink.c:
+	* ext/dts/gstdtsdec.c:
+	* ext/faac/gstfaac.c:
+	* ext/faad/gstfaad.c:
+	* ext/gl/gstglbumper.c:
+	* ext/gl/gstgldeinterlace.c:
+	* ext/gl/gstgldifferencematte.c:
+	* ext/gl/gstgleffects.c:
+	* ext/gl/gstglfilterreflectedscreen.c:
+	* ext/gl/gstglfiltershader.c:
+	* ext/gl/gstglstereosplit.c:
+	* ext/gl/gstgltestsrc.c:
+	* ext/gl/gstgltransformation.c:
+	* ext/kate/gstkatedec.c:
+	* ext/kate/gstkateenc.c:
+	* ext/kate/gstkateparse.c:
+	* ext/kate/gstkatetag.c:
+	* ext/kate/gstkatetiger.c:
+	* ext/ladspa/gstladspa.c:
+	* ext/libvisual/visual-gl.c:
+	* ext/mpg123/gstmpg123audiodec.c:
+	* ext/mplex/gstmplex.cc:
+	* ext/openal/gstopenalsink.c:
+	* ext/openal/gstopenalsrc.c:
+	* ext/opus/gstopusdec.c:
+	* ext/opus/gstopusenc.c:
+	* ext/opus/gstopusparse.c:
+	* ext/resindvd/resin-play:
+	* ext/resindvd/resin-play2:
+	* ext/rsvg/gstrsvgdec.c:
+	* ext/rsvg/gstrsvgoverlay.c:
+	* ext/rtmp/gstrtmpsink.c:
+	* ext/rtmp/gstrtmpsrc.c:
+	* ext/sndio/sndiosink.c:
+	* ext/sndio/sndiosrc.c:
+	* ext/teletextdec/gstteletextdec.c:
+	* ext/wayland/gstwaylandsink.c:
+	* ext/zbar/gstzbar.c:
+	* gst/aiff/aiffparse.c:
+	* gst/asfmux/gstasfmux.c:
+	* gst/audiofxbad/gstaudiochannelmix.c:
+	* gst/audiomixer/gstaudiomixer.c:
+	* gst/audiovisualizers/gstspacescope.c:
+	* gst/audiovisualizers/gstspectrascope.c:
+	* gst/audiovisualizers/gstsynaescope.c:
+	* gst/audiovisualizers/gstwavescope.c:
+	* gst/autoconvert/gstautovideoconvert.c:
+	* gst/camerabin2/gstcamerabin2.c:
+	* gst/camerabin2/gstviewfinderbin.c:
+	* gst/coloreffects/gstchromahold.c:
+	* gst/coloreffects/gstcoloreffects.c:
+	* gst/dataurisrc/gstdataurisrc.c:
+	* gst/debugutils/fpsdisplaysink.c:
+	* gst/debugutils/gstchopmydata.c:
+	* gst/debugutils/gstdebugspy.c:
+	* gst/debugutils/gstwatchdog.c:
+	* gst/dvbsuboverlay/gstdvbsuboverlay.c:
+	* gst/dvdspu/gstdvdspu.c:
+	* gst/festival/gstfestival.c:
+	* gst/fieldanalysis/gstfieldanalysis.c:
+	* gst/freeverb/gstfreeverb.c:
+	* gst/gaudieffects/gstburn.c:
+	* gst/gaudieffects/gstchromium.c:
+	* gst/gaudieffects/gstdilate.c:
+	* gst/gaudieffects/gstdodge.c:
+	* gst/gaudieffects/gstexclusion.c:
+	* gst/gaudieffects/gstgaussblur.c:
+	* gst/gaudieffects/gstsolarize.c:
+	* gst/gdp/README:
+	* gst/gdp/gstgdpdepay.c:
+	* gst/gdp/gstgdppay.c:
+	* gst/id3tag/gstid3mux.c:
+	* gst/inter/gstinteraudiosink.c:
+	* gst/inter/gstinteraudiosrc.c:
+	* gst/inter/gstintersubsink.c:
+	* gst/inter/gstintersubsrc.c:
+	* gst/inter/gstintervideosink.c:
+	* gst/inter/gstintervideosrc.c:
+	* gst/interlace/gstinterlace.c:
+	* gst/ivtc/gstcombdetect.c:
+	* gst/ivtc/gstivtc.c:
+	* gst/jp2kdecimator/gstjp2kdecimator.c:
+	* gst/jpegformat/gstjifmux.c:
+	* gst/jpegformat/gstjpegparse.c:
+	* gst/mxf/mxfdemux.c:
+	* gst/mxf/mxfmux.c:
+	* gst/nuvdemux/gstnuvdemux.c:
+	* gst/pnm/gstpnmdec.c:
+	* gst/pnm/gstpnmenc.c:
+	* gst/rawparse/README:
+	* gst/removesilence/gstremovesilence.c:
+	* gst/sdp/gstsdpdemux.c:
+	* gst/speed/gstspeed.c:
+	* gst/stereo/gststereo.c:
+	* gst/videofilters/gstscenechange.c:
+	* gst/videofilters/gstvideodiff.c:
+	* gst/videofilters/gstzebrastripe.c:
+	* gst/videoparsers/gstdiracparse.c:
+	* gst/videosignal/gstsimplevideomark.c:
+	* gst/videosignal/gstsimplevideomarkdetect.c:
+	* gst/videosignal/gstvideoanalyse.c:
+	* gst/y4m/gsty4mdec.c:
+	* gst/yadif/gstyadif.c:
+	* sys/applemedia/atdec.c:
+	* sys/applemedia/avfassetsrc.m:
+	* sys/applemedia/iosassetsrc.m:
+	* sys/applemedia/vtdec.c:
+	* sys/directsound/gstdirectsoundsrc.c:
+	* sys/dvb/README:
+	* sys/dvb/gstdvbsrc.c:
+	* sys/opensles/openslessink.c:
+	* sys/opensles/openslessrc.c:
+	* sys/shm/gstshmsink.c:
+	* sys/shm/gstshmsrc.c:
+	* sys/vdpau/gstvdpvideopostprocess.c:
+	* sys/vdpau/mpeg/gstvdpmpegdec.c:
+	* sys/vdpau/mpeg4/gstvdpmpeg4dec.c:
+	* sys/winks/gstksvideosrc.c:
+	* sys/winscreencap/gstdx9screencapsrc.c:
+	* sys/winscreencap/gstgdiscreencapsrc.c:
+	* tools/gst-element-maker:
+	  plugins-bad: Fix example pipelines
+	  rename gst-launch --> gst-launch-1.0
+	  replace old elements with new elements(ffmpegcolorspace -> videoconvert, ffenc_** -> avenc_**)
+	  fix caps in examples
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759432
+
+2015-12-14 15:01:09 -0500  Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+	* .gitignore:
+	  ignore: videoframe-audiolevel test
+
+2015-12-14 14:44:31 -0500  Xavier Claessens <xavier.claessens@collabora.com>
+
+	* gst-libs/gst/gl/gstgl_fwd.h:
+	* gst-libs/gst/gl/gstglframebuffer.h:
+	* gst-libs/gst/insertbin/gstinsertbin.h:
+	  bad: Add g_autoptr() support to all types
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754464
+
+2015-12-14 12:31:52 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* gst-libs/gst/gl/gstglviewconvert.c:
+	  glviewconvert: check pointer before dereferencing
+	  priv->primary_out could be NULL, check before dereferencing it in
+	  GST_BUFFER_FLAG_SET ()
+	  CID 1308945
+
+2015-12-14 13:43:10 +0200  Vivia Nikolaidou <vivia@ahiru.eu>
+
+	* gst/videoframe_audiolevel/gstvideoframe-audiolevel.c:
+	  videoframe-audiolevel: Fix possible division by zero
+	  In update_rms_from_buffer(), division by "frames" wasn't checking whether
+	  "frames" is zero.
+	  CID 1341519.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759443
+
+2015-12-14 09:38:41 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* tests/examples/gl/clutter/cluttershare.c:
+	  clutter: Fix compilation error in GL examples
+	  Include gst/gl.h instead of specific headers to prevent such problems also in
+	  the future.
+	  In file included from ../../../../gst-libs/gst/gl/gl.h:47:0,
+	  from ../../../../gst-libs/gst/gl/gstglbasememory.h:137,
+	  from ../../../../gst-libs/gst/gl/gstglmemory.h:29,
+	  from cluttershare.c:39:
+	  ../../../../gst-libs/gst/gl/gstglmemorypbo.h:51:20: error: field ‘mem’ has incomplete type
+	  GstGLMemory      mem;
+	  ^
+	  ../../../../gst-libs/gst/gl/gstglmemorypbo.h:124:24: error: field ‘parent’ has incomplete type
+	  GstGLMemoryAllocator parent;
+	  ^
+	  ../../../../gst-libs/gst/gl/gstglmemorypbo.h:134:29: error: field ‘parent_class’ has incomplete type
+	  GstGLMemoryAllocatorClass parent_class;
+	  ^
+
+2015-12-14 19:18:14 +1100  Matthew Waters <matthew@centricular.com>
+
+	* sys/applemedia/corevideotexturecache.m:
+	  applemedia: update for GLMemory API changes
+
+2015-12-14 19:15:14 +1100  Matthew Waters <matthew@centricular.com>
+
+	* sys/androidmedia/gstamcvideodec.c:
+	  amcvideodec: update for GLMemory API changes
+
+2015-12-14 18:41:30 +1100  Matthew Waters <matthew@centricular.com>
+
+	* tests/check/libs/gstglcolorconvert.c:
+	* tests/check/libs/gstglupload.c:
+	  tests: update for glmemory api changes
+
+2015-12-14 18:20:23 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglbuffer.c:
+	  glbuffer: bind/unbind on map/unmap for GL mappings
+	  Bind the handle to the GL target on map/unmap to save the caller from
+	  handling this themselves.
+
+2015-12-14 18:19:37 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglbuffer.c:
+	* gst-libs/gst/gl/gstglbuffer.h:
+	  glbuffer: remove buffer specific transfer flags
+	  Instead rely on GstGLBaseMemory's transfer handling
+
+2015-12-14 18:18:20 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglmemorypbo.c:
+	  glmemorypbo: map/unmap pbo memory correctly for state tracking
+	  Otherwise some downloads will fail to occur from the PBO.
+
+2015-12-14 18:15:42 +1100  Matthew Waters <matthew@centricular.com>
+
+	* tests/check/libs/gstglmemory.c:
+	  tests/glmemory: include the generic gl header
+	  Including gstglmemory.h directly results in the compiler complaining
+	  about incomplete types.
+
+2015-12-14 17:05:31 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglformat.c:
+	  glformat: add compatibility definitions for OES/rectangle textures
+
+2015-12-14 13:49:18 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/Makefile.am:
+	* gst-libs/gst/gl/gl.h:
+	* gst-libs/gst/gl/gstgl_fwd.h:
+	* gst-libs/gst/gl/gstglbasebuffer.c:
+	* gst-libs/gst/gl/gstglbasebuffer.h:
+	* gst-libs/gst/gl/gstgldisplay.c:
+	  glbasebuffer: remove unsed memory subclass
+	  The functionality has been split into GstGLBaseMemory and GstGLBuffer.
+
+2015-12-14 13:43:59 +1100  Matthew Waters <matthew@centricular.com>
+
+	* docs/libs/gst-plugins-bad-libs.types:
+	* ext/gl/gstgldownloadelement.c:
+	* ext/gl/gstgloverlay.c:
+	* ext/qt/gstqsgtexture.cc:
+	* gst-libs/gst/gl/Makefile.am:
+	* gst-libs/gst/gl/gl.h:
+	* gst-libs/gst/gl/gstgl_fwd.h:
+	* gst-libs/gst/gl/gstglbufferpool.c:
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	* gst-libs/gst/gl/gstgldisplay.c:
+	* gst-libs/gst/gl/gstglformat.c:
+	* gst-libs/gst/gl/gstglformat.h:
+	* gst-libs/gst/gl/gstglmemory.c:
+	* gst-libs/gst/gl/gstglmemory.h:
+	* gst-libs/gst/gl/gstglmemorypbo.c:
+	* gst-libs/gst/gl/gstglmemorypbo.h:
+	* gst-libs/gst/gl/gstgloverlaycompositor.c:
+	* gst-libs/gst/gl/gstglupload.c:
+	* gst-libs/gst/gl/gstglviewconvert.c:
+	* tests/check/libs/gstglmemory.c:
+	  glmemory: base classify and add the pbo memory on top
+	  The base class is useful for having multiple backing memory types other
+	  than the default.  e.g. IOSurface, EGLImage, dmabuf?
+	  The PBO transfer logic is now inside GstGLMemoryPBO which uses GstGLBuffer
+	  to manage the PBO memory.
+	  This also moves the format utility functions into their own file.
+
+2015-12-14 13:08:10 +1100  Matthew Waters <matthew@centricular.com>
+
+	* docs/libs/gst-plugins-bad-libs.types:
+	* gst-libs/gst/gl/Makefile.am:
+	* gst-libs/gst/gl/gl.h:
+	* gst-libs/gst/gl/gstgl_fwd.h:
+	* gst-libs/gst/gl/gstglbuffer.c:
+	* gst-libs/gst/gl/gstglbuffer.h:
+	* gst-libs/gst/gl/gstgldisplay.c:
+	  gl: add a GL buffer based GstMemory
+	  Heavily based on GstGLBaseBuffer that is a subclass of GstGLBaseMemory.
+	  Provides GPU and CPU accessible GL buffer objects by GL handle or by
+	  sysmem data pointer.
+
+2015-12-14 12:59:02 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/Makefile.am:
+	* gst-libs/gst/gl/gl.h:
+	* gst-libs/gst/gl/gstgl_fwd.h:
+	* gst-libs/gst/gl/gstglbasememory.c:
+	* gst-libs/gst/gl/gstglbasememory.h:
+	  gl: add a base memory object
+	  It handles the following
+	  - GstAllocationParams -> gst_memory_init transformation
+	  - Makes sure that map/unmap/create/destroy happen on the GL thread with
+	  a GL context current.
+	  - Holds a possible sysmem accessible data pointer with alignment.
+	  - Holds the need upload/download transfer state
+
+2015-12-14 12:26:01 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglutils.c:
+	* gst-libs/gst/gl/gstglutils.h:
+	  gl: add convenience function for the start of a video frame
+	  Get's the start of the video frame based on a GstVideoInfo and
+	  GstVideoAlignment.
+
+2015-12-11 16:07:36 +1100  Matthew Waters <matthew@centricular.com>
+
+	* docs/libs/gst-plugins-bad-libs-docs.sgml:
+	* docs/libs/gst-plugins-bad-libs-sections.txt:
+	* docs/libs/gst-plugins-bad-libs.types:
+	* gst-libs/gst/gl/Makefile.am:
+	* gst-libs/gst/gl/gl.h:
+	* gst-libs/gst/gl/gstgl_fwd.h:
+	* gst-libs/gst/gl/gstglbufferpool.c:
+	* gst-libs/gst/gl/gstglbufferpool.h:
+	* gst-libs/gst/gl/gstgluploadmeta.c:
+	* gst-libs/gst/gl/gstgluploadmeta.h:
+	* tests/check/libs/gstglupload.c:
+	  gluploadmeta; remove convenience helper API
+	  It was not really useful as if one knows about libgstgl, one can just use
+	  GLMemory objects directly.
+
+2015-12-11 15:39:57 +1100  Matthew Waters <matthew@centricular.com>
+
+	* docs/libs/gst-plugins-bad-libs-docs.sgml:
+	* docs/libs/gst-plugins-bad-libs-sections.txt:
+	* docs/libs/gst-plugins-bad-libs.types:
+	* ext/gl/gstglstereomix.h:
+	* gst-libs/gst/gl/Makefile.am:
+	* gst-libs/gst/gl/gl.h:
+	* gst-libs/gst/gl/gstgl_fwd.h:
+	* gst-libs/gst/gl/gstgldownload.c:
+	* gst-libs/gst/gl/gstgldownload.h:
+	  gldownload: remove helper api from the library
+	  It was never used by anyone and is not needed anymore with the element
+	  and GstGLMemory's transparent support for downloading textures.
+
+2015-12-12 20:07:32 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gstcvdilate.cpp:
+	* ext/opencv/gstcvdilateerode.cpp:
+	* ext/opencv/gstcvdilateerode.h:
+	* ext/opencv/gstcvequalizehist.cpp:
+	* ext/opencv/gstcvequalizehist.h:
+	* ext/opencv/gstcverode.cpp:
+	* ext/opencv/gstcvlaplace.cpp:
+	* ext/opencv/gstcvlaplace.h:
+	* ext/opencv/gstcvsmooth.cpp:
+	* ext/opencv/gstcvsmooth.h:
+	* ext/opencv/gstcvsobel.cpp:
+	* ext/opencv/gstcvsobel.h:
+	* ext/opencv/gstdisparity.cpp:
+	* ext/opencv/gstdisparity.h:
+	* ext/opencv/gstedgedetect.cpp:
+	* ext/opencv/gstedgedetect.h:
+	* ext/opencv/gstfaceblur.cpp:
+	* ext/opencv/gstfaceblur.h:
+	* ext/opencv/gstfacedetect.cpp:
+	* ext/opencv/gstgrabcut.cpp:
+	* ext/opencv/gsthanddetect.cpp:
+	* ext/opencv/gsthanddetect.h:
+	* ext/opencv/gstmotioncells.cpp:
+	* ext/opencv/gstmotioncells.h:
+	* ext/opencv/gstopencvvideofilter.cpp:
+	* ext/opencv/gstpyramidsegment.cpp:
+	* ext/opencv/gstpyramidsegment.h:
+	* ext/opencv/gstretinex.cpp:
+	* ext/opencv/gstretinex.h:
+	* ext/opencv/gstsegmentation.cpp:
+	* ext/opencv/gstskindetect.cpp:
+	* ext/opencv/gstskindetect.h:
+	* ext/opencv/gsttemplatematch.cpp:
+	* ext/opencv/gsttemplatematch.h:
+	* ext/opencv/gsttextoverlay.cpp:
+	* ext/opencv/gsttextoverlay.h:
+	  opencv: clean includes
+	  The opencv element includes were full of duplicates and uneeded headers.
+	  For example a few elements that stopped using gstcvopencvutils still
+	  included that header file.
+
+2015-12-12 19:31:55 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gstopencvutils.cpp:
+	* ext/opencv/gstopencvutils.h:
+	  opencv: remove unused functions in gstopencvutils
+	  Since commit 45ca8876b2f5267f7edb842b6d56d7a6c271ccb3 nobody is using
+	  gst_opencv_get_ipl_depth_and_channels() or
+	  gst_opencv_parse_iplimage_params_from_structure(). Remove this dead
+	  code.
+
+2015-12-12 19:13:42 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/MotionCells.cpp:
+	* ext/opencv/MotionCells.h:
+	  motioncells: Remove unused includes
+
+2015-12-12 10:06:55 +1100  Matthew Waters <matthew@centricular.com>
+
+	* common:
+	  revert common submodule change
+
+2015-12-12 09:33:38 +1100  Matthew Waters <matthew@centricular.com>
+
+	* common:
 	* ext/gl/gstgltransformation.c:
 	  gltransformation: clear to transparent
 	  Otherwise composition will result in a black frame outside the transformed
 	  video.
 
-2015-12-08 16:35:45 +1100  Matthew Waters <matthew@centricular.com>
-
-	* gst-libs/gst/gl/glprototypes/sync.h:
-	  glproto: include function definitions for GL_APPLE_sync
-	  Provides a performance improvement on iOS where we were falling back to glFinish
-	  on settting sync points.
-
 2015-12-11 11:39:08 +0100  Thomas Roos <thomas.roos@industronic.de>
 
 	* sys/directsound/gstdirectsoundsrc.c:
@@ -35,17 +1404,502 @@
 	  Also take the element's mutex in unprepare().
 	  https://bugzilla.gnome.org/show_bug.cgi?id=738292
 
+2015-12-10 12:47:17 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfdemux.c:
+	  mxfdemux: Only pre-set position for exactly the same essence track
+	  The edit rate is only supposed to be the same in a source package, but there
+	  might be multiple source packages with the same essence container. As such
+	  just comparing the body/index SID is not sufficient.
+
+2015-12-10 12:25:54 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfdemux.c:
+	  mxfdemux: Only pre-set the track position if it's for the same body/index SID
+
+2015-12-10 14:41:44 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m:
+	  libgstgl: gstglcontext_cocoa: kCGLPFAStereo has been deprecated in 10.11
+	  Also since the version scheme has changed (to include the micro number) since
+	  10.10, use the MAC_OS_X_VERSION_* macro to avoid confusion.
+
+2015-12-10 12:41:00 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* gst-libs/gst/gl/gstglbufferpool.c:
+	  glbufferpool: relax check for multiple texture targets
+	  Only complain about multiple texture targets when _different_ texture targets
+	  are configured.
+
+2015-12-10 12:33:52 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* gst-libs/gst/gl/gstglmemory.c:
+	  glmemory: take subsampling into account for rectangle textures
+	  Rectangle textures don't use normalized coordinates so subsampling needs to be
+	  factored in explicitly.
+	  Fixes YUV => RGB conversion for rectangle textures.
+
+2015-12-09 16:55:00 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfdemux.c:
+	  mxfdemux: Only access the index table if it has enough elements
+
+2015-12-09 16:28:53 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfdemux.c:
+	  mxfdemux: Use keyframe information from index table segments if available
+	  We don't implement keyframe detection for all codecs and this will allow us to
+	  implement better seeking.
+
+2015-12-09 16:31:19 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfdemux.c:
+	  mxfdemux: Collect all index table segments after finding the random index pack
+	  That way we always have the index table information available, especially the
+	  keyframe-ness of all buffers.
+
+2015-12-08 18:15:55 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfdemux.c:
+	* gst/mxf/mxfdemux.h:
+	* gst/mxf/mxftypes.h:
+	  mxfdemux: Fix handling of IndexTableSegments
+	  This was completely broken before and could only work on a very constrained
+	  set of files. After these changes it should work except for situations where
+	  PTS != DTS, which is not handled at all in mxfdemux currently.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759118
+
+2015-12-08 14:06:21 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+	  adaptivedemux: avoid pushing events with manifest lock
+	  It can be an easy source of deadlocks. Reproducible with very
+	  fast connections (local server).
+
+2015-12-08 20:24:45 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxftypes.c:
+	  mxftypes: Fix parsing of index table segments
+
+2015-12-08 18:23:02 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfmux.c:
+	  mxfmux: Handle aggregation with NULL buffers without crashing
+
+2015-12-08 16:45:33 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfmux.c:
+	  mxfmux: Add FIXME about enforcing that all tracks in a source package have the same edit rate
+	  The standard requires this and also the index table segments are not going to
+	  work otherwise.
+
+2015-12-07 20:27:23 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfmux.c:
+	* gst/mxf/mxfmux.h:
+	  mxfmux: Write index table segments
+	  But only for the first essence track, and once for every keyframe every 2
+	  seconds.
+
+2015-12-07 20:26:17 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfmetadata.c:
+	  mxfmetadata: Fix static local tag for index sid
+
+2015-12-07 19:34:25 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxftypes.c:
+	* gst/mxf/mxftypes.h:
+	  mxftypes: Add function to serialize an index table segment to a buffer
+
+2015-12-07 18:59:36 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfdemux.c:
+	* gst/mxf/mxftypes.c:
+	* gst/mxf/mxftypes.h:
+	  mxfmux: Index table segments must not use the primer pack
+	  According to S377-1-2009c 9.2 the local tags must not be resolved from the
+	  primer pack, which as a result means that there can't be any other tags than
+	  statically assigned ones.
+
+2015-12-07 14:10:30 +1000  Duncan Palmer <dpalmer@digisoft.tv>
+
+	* ext/hls/gsthlsdemux.c:
+	  hlsdemux: add support for seeking to fragment boundaries
+	  Setting the seek flags to GST_SEEK_FLAG_SNAP_* will change the seek
+	  target time to a segment boundary.
+	  Based on original work by Ben Willers <bwillers@digisoft.tv>.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=759108
+
+2015-12-08 09:53:11 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* tests/check/elements/dash_mpd.c:
+	  dash: Fix unit test after moving of framerates to RepresentationBaseType
+
+2015-12-08 09:33:39 +0900  suhwang.kim <suhwang.kim@lge.com>
+
+	* ext/dash/gstdashdemux.c:
+	* ext/dash/gstmpdparser.c:
+	* ext/dash/gstmpdparser.h:
+	  dashdemux: Suggestion for setting the framerate information.
+	  Dashdemux has set the width and height information from MPD manifest.
+	  Some embedded devices which are not insufficient H/W resources need more information such as framerate
+	  to assign H/W resources. So I suggested that dashdemux also needs to set the framerate information from MDP manifest.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758515
+
+2015-12-08 09:23:22 +0900  suhwang.kim <suhwang.kim@lge.com>
+
+	* ext/dash/gstmpdparser.c:
+	* ext/dash/gstmpdparser.h:
+	  dashdemux: maxFrameRate & minFrameRate should be in RepresentationBase.
+	  According to the spec, they can be in AdaptationSet, Representation and SubRepresentation.
+	  So They should be in RepresentationBase.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758515
+
+2015-12-08 16:35:45 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/glprototypes/sync.h:
+	  glproto: include function definitions for GL_APPLE_sync
+	  Provides a performance improvement on iOS where we were falling back to glFinish
+	  on settting sync points.
+
 2015-12-07 20:34:10 +0200  Sebastian Dröge <sebastian@centricular.com>
 
 	* ext/openjpeg/gstopenjpegenc.c:
 	  openjpegenc: All frames in JPEG2000 are keyframes, mark them as such
 
+2015-12-07 09:08:15 -0500  Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+	* autogen.sh:
+	* common:
+	  Automatic update of common submodule
+	  From b319909 to 86e4663
+
+2015-12-07 13:48:12 +0100  Edward Hervey <edward@centricular.com>
+
+	* gst/mxf/mxfmux.c:
+	  mxfmux: Remove more dead code
+	  Coverity CID #1328818
+
+2015-12-07 13:36:29 +0100  Edward Hervey <edward@centricular.com>
+
+	* ext/teletextdec/gstteletextdec.c:
+	  teletextdec: Fix leak and NULL pointer usage
+	  Coverity CID #1341744
+
+2015-12-07 11:56:09 +0100  Edward Hervey <edward@centricular.com>
+
+	* ext/teletextdec/gstteletextdec.c:
+	  teletextdec: Remove dead code
+	  ++i in a for() loop results in the loop never being executed more than once
+	  Coverity CID #1341748
+	  Coverity CID #1341743
+
+2015-03-12 11:29:00 +0000  Frédéric Wang <fred.wang@free.fr>
+
+	* configure.ac:
+	* sys/acmenc/acmenc.c:
+	* sys/acmmp3dec/acmmp3dec.c:
+	  acm: Port ACM MP3 decoder and encoders to GStreamer 1.x
+	  https://bugzilla.gnome.org/show_bug.cgi?id=744047
+
+2015-09-24 17:40:02 +0200  Daniel Kamil Kozar <dkk089@gmail.com>
+
+	* configure.ac:
+	* ext/teletextdec/Makefile.am:
+	* ext/teletextdec/gstteletextdec.c:
+	* ext/teletextdec/gstteletextdec.h:
+	* ext/teletextdec/teletext.c:
+	  port teletextdec to 1.0
+	  https://bugzilla.gnome.org/show_bug.cgi?id=733819
+
+2015-12-02 18:28:15 -0500  Nicolas Dufresne <nicolas.dufresne@collabora.co.uk>
+
+	* gst/videoparsers/gsth264parse.c:
+	* gst/videoparsers/gsth265parse.c:
+	  h26xparse: Resend PPS/SPS after seek
+	  This is to support byte-stream decoder that does not remember the
+	  PPS/SPS after a flush. This is not needed by all decoders, but is
+	  harmless for those that do remember.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758405
+
+2015-12-01 18:09:25 -0500  Nicolas Dufresne <nicolas.dufresne@collabora.com>
+
+	* gst-libs/gst/gl/gstglupload.c:
+	  glupload: Only offer custom allocator with caps features
+	  To use GLMemory and EGLImage allocators, one need to know the
+	  libgstgl API. This is only expected if the associated caps features
+	  have been negotiated. Generic element that otherwise receive those
+	  allocators may fail, resulting in broken pieline. We don't want to
+	  force all generic element to check if the allocator is a custom
+	  allocator or a normal allocator (which implement the _alloc method).
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758877
+
+2015-12-04 18:05:58 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfmux.c:
+	  mxfmux: Don't copy input buffers, just append them to the header
+
+2015-12-03 11:46:10 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/hls/m3u8.c:
+	  hlsdemux: Resync live playlists to the 3rd newest fragment if we fall off the playlist
+	  As HLS does not provide any way of knowing the server's clock, and we do
+	  buffering of "live" streams, at some point we will fall behind the server in
+	  many cases and would have to advance to a fragment that is not in the playlist
+	  anymore.
+	  Previously we would've just resynced to the next oldest fragment that is still
+	  there, but this causes problems as from this point onwards we would always
+	  fall off the playlist again all the time.
+	  Instead we now resync and move to the 3rd newest fragment like we would do
+	  when starting playback of a live stream.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758987
+
+2015-12-03 18:21:50 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/m3u8.c:
+	  hls: m3u8: remove superfluous gst_m3u8_copy() implementation
+	  No need to implement _copy() when we just copy a list that
+	  we're freeing three lines later anyway. Instead just steal
+	  the new main list.
+
+2015-12-03 10:08:05 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+	  adaptivedemux: Log PTS of buffers that are pushed downstream
+
+2015-10-20 09:49:16 +0200  Edward Hervey <edward@centricular.com>
+
+	* gst/mpegtsdemux/tsdemux.c:
+	  tsdemux: Expose DVB Subpicture as subpictures
+	  For some reason we were considering them as private data.
+
+2015-10-20 17:22:23 +0200  Edward Hervey <edward@centricular.com>
+
+	* gst/mpegtsdemux/tsdemux.c:
+	  tsdemux: Push GAP events *after* deactivating old programs
+	  The order in which program switch must happen is:
+	  1) drain all data on old pads (but don't push EOS)
+	  2) add new pads (but don't push any data on them)
+	  3) Push EOS and remove old pads
+	  4) Start pushing data on new pads
+	  There was one caveat in this implementation, which is that when
+	  we activate a sparse pad (step 2) we would push a GAP event. The problem
+	  is that, while being an event, it is actually *data*.
+	  We therefore need to make sure pushing those GAP event is done at the step
+	  we start pushing data.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=750402
+
+2015-09-15 18:20:38 +0200  Edward Hervey <edward@centricular.com>
+
+	* gst/mpegtsdemux/tsdemux.c:
+	  tsdemux: Make sure old streams are drained before switching
+	  Before we add any streams, make sure we drain all streams. This ensures
+	  there's consistency that only "new" data will be pushed on buffers once
+	  the new pads are added
+	  https://bugzilla.gnome.org/show_bug.cgi?id=750402
+
+2015-09-10 14:55:05 +0200  Edward Hervey <bilboed@bilboed.com>
+
+	* gst/mpegtsdemux/mpegtsbase.c:
+	* gst/mpegtsdemux/mpegtsbase.h:
+	* gst/mpegtsdemux/tsdemux.c:
+	* gst/mpegtsdemux/tsdemux.h:
+	  mpegtsdemux: Allow deactivation of programs to be delayed
+	  When changing programs, the order of events needs to be the following:
+	  * add pads from new program
+	  * send EOS on old pads
+	  * remove old pads
+	  * emit 'no-more-pads'
+	  Previously tsdemux was not doing that, and was first deactivating and
+	  removing old pads before adding new ones.
+	  We fix this by allowing subclasses of mpegtsbase to be able to handle
+	  themselves the deactivation of programs. In this case tsdemux will
+	  properly deactivate it once it has activated the new program.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=750402
+
+2015-12-02 11:01:53 +0100  Maroš Ondrášek <mx3ldev@gmail.com>
+
+	* ext/hls/gsthlsdemux.c:
+	  hlsdemux: update current variant if connection speed is set
+	  If connection speed is set, playlist according
+	  to connection speed is selected as current playlist.
+	  Problem is that the current variant of main playlist still
+	  points to previously set variant.
+	  If previously set variant doesn't correspond to current
+	  playlist, then it causes unnecessary change of playlist
+	  to the same playlist after first fragment is downloaded,
+	  because of not updated current variant.
+	  To fix this, we need to make sure that current variant
+	  of main playlist corresponds to the current playlist
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758946
+
+2015-12-02 14:35:22 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/videoframe_audiolevel/gstvideoframe-audiolevel.c:
+	  videoframe-audiolevel: Fix compilation of static plugin and some compiler warnings
+	  Use G_GSIZE_FORMAT for gsize instead of %ld and make sure that the plugin name
+	  is a valid C identifier, i.e. contains no spaces or dashes.
+
+2015-12-02 22:42:39 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	  glcolorconvert: improve the YUY2/UYVY->RGBA conversion shader
+	  Don't offset the y-axis.  We only need to offset on the x-axis.
+	  Removes a sawtooth pattern on horizontal and vertical edges.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755486
+
+2015-12-02 22:40:06 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	  glcolorconvert: improve RGBA->YUY2/UYVY conversion shader
+	  We should only average the chroma samples not the luma sample.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758904
+
+2015-11-11 03:55:27 +1100  Jan Schmidt <jan@centricular.com>
+
+	* ext/hls/gsthlsdemux.c:
+	  hlsdemux: Tell the base class the fragment duration
+	  adaptivedemux uses the fragment duration as a delay
+	  in some cases, so make sure to set it.
+
+2015-11-11 03:54:51 +1100  Jan Schmidt <jan@centricular.com>
+
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.h:
+	  adaptivedemux: Send the bitrate of the stream as a tag
+	  If we know or can measure the nominal bitrate of a stream,
+	  send that info as a tag downstream
+
+2015-11-08 01:34:30 +1100  Jan Schmidt <jan@centricular.com>
+
+	* ext/hls/gsthlsdemux.c:
+	  hlsdemux: When switching bitrate variants, don't jump back
+	  Don't jump backward to 3 files from the end of the playlist
+	  when switching variants - it just means we downloaded
+	  fragments fast and caught up to the end of the playlist.
+	  Disable that by treating a variant switch as a playlist
+	  update, not a restart due to a seek or so.
+
+2015-04-21 21:09:19 +0300  Vivia Nikolaidou <vivia@toolsonair.com>
+
+	* configure.ac:
+	* gst/videoframe_audiolevel/Makefile.am:
+	* gst/videoframe_audiolevel/gstvideoframe-audiolevel.c:
+	* gst/videoframe_audiolevel/gstvideoframe-audiolevel.h:
+	* tests/check/Makefile.am:
+	* tests/check/elements/videoframe-audiolevel.c:
+	  alevel: New audio/video level element
+	  The videoframe-audiolevel element acts like a synchronized audio/video "level"
+	  element. For each video frame, it posts a level-style message containing the
+	  RMS value of the corresponding audio frames. This element needs both video and
+	  audio to pass through it. Furthermore, it needs a queue after its video
+	  source.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=748259
+
+2015-12-01 23:20:45 -0800  Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+	* gst-libs/gst/gl/Makefile.am:
+	* gst-libs/gst/insertbin/Makefile.am:
+	  Drop usage of deprecated g-ir-scanner --strip-prefix flag
+
+2015-11-10 16:19:34 +0000  Alex Ashley <bugzilla@ashley-family.net>
+
+	* ext/hls/m3u8.c:
+	* tests/check/elements/hlsdemux_m3u8.c:
+	  hlsdemux: correct the calculation of seek range of non-live streams
+	  The seek range calculation for on-demand streams was incorrectly
+	  excluding the last three segments of the stream. This three segment
+	  rule should only be applied to live streams [1].
+	  [1] https://tools.ietf.org/html/draft-pantos-http-live-streaming-17#section-6.3.3
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758386
+
 2015-12-01 17:52:03 +0000  Paolo Pettinato <ppettina@cisco.com>
 
 	* gst/pcapparse/gstpcapparse.c:
 	  pcapparse: Forward FLUSH_STOP events downstream too
 	  https://bugzilla.gnome.org/show_bug.cgi?id=758913
 
+2015-11-29 01:02:15 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/gsthlsdemux.c:
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+	  hlsdemux: fix crash when decryption key can't be downloaded
+	  Happened with
+	  http://sslhls.m6tv.cdn.sfr.net/hls-live/livepkgr/_definst_/m6_hls_aes/m6_hls_aes_856.m3u8
+	  if glib-networking was not installed (since key has https uri).
+
+2015-11-30 11:05:38 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/gsthlsdemux.c:
+	* ext/hls/m3u8.c:
+	* ext/hls/m3u8.h:
+	  hls: m3u8: remove pointless client_has_main() function
+	  We always have a main list.
+
+2015-11-28 00:12:04 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/m3u8.c:
+	* ext/hls/m3u8.h:
+	  hls: m3u8: remove unused _get_current_fragment_duration() function
+
+2015-11-27 19:21:22 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/m3u8.c:
+	* ext/hls/m3u8.h:
+	  hls: m3u8: remove unused m3u8 client update_failed_count field
+
+2015-11-15 17:31:05 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/m3u8.c:
+	* ext/hls/m3u8.h:
+	  hls: m3u8: remove helper var that's only used during parsing from structure
+	  Just keep that local to the parsing function.
+
+2015-11-01 13:21:45 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* Makefile.am:
+	* docs/plugins/inspect/plugin-fragmented.xml:
+	* docs/plugins/inspect/plugin-hls.xml:
+	* ext/hls/Makefile.am:
+	* ext/hls/gstfragmented.h:
+	* ext/hls/gstfragmentedplugin.c:
+	* ext/hls/gsthls.h:
+	* ext/hls/gsthlsdemux.h:
+	* ext/hls/gsthlsplugin.c:
+	* ext/hls/gstm3u8playlist.c:
+	* ext/hls/m3u8.c:
+	* gst-plugins-bad.spec.in:
+	* tests/check/elements/hlsdemux_m3u8.c:
+	  hls: rename plugin from fragmented to hls
+
+2015-12-01 19:44:36 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/hls/gsthlsdemux.c:
+	  hlsdemux: Always give timestamps if we're discont and don't mark stream discont if a playlist change was not successful
+	  If the stream is discont, we must provide a timestamp in any case. Elements
+	  like tsdemux are not going to output anything if we give a NONE timestamp
+	  after a discont.
+	  Also marking a stream as discont if a playlist change was not successful would
+	  lead to the above situation, but in that case we are not required at all to
+	  mark the stream discont as we're still at the old playlist.
+
+2015-12-01 17:06:33 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* gst/mpegtsmux/tsmux/tsmuxstream.c:
+	  tsmux: fix wrong log message level
+	  ERROR level is debugging left-over.
+
+2015-11-09 16:08:30 +0900  Hyunjun Ko <zzoon.ko@samsung.com>
+
+	* tests/check/libs/aggregator.c:
+	  tests:aggregator: fix tc failure and correct check value
+	  Failure by this commit 2dfa548f3645844082c3db65d96d87255701b3ad, which is
+	  to append hooks instead of prepend.
+	  Because of this change, aggretated_cb is not called and leads to failure.
+	  And correct to check flush stop value instead of flush start value
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757801
+
 2015-11-30 19:53:28 +0200  Sebastian Dröge <sebastian@centricular.com>
 
 	* sys/d3dvideosink/d3dhelpers.c:
@@ -54,6 +1908,147 @@
 	  visible again before checking if the swapchain really has to be recreated.
 	  https://bugzilla.gnome.org/show_bug.cgi?id=741608
 
+2015-11-27 18:46:56 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opus/gstopusparse.c:
+	  opusparse: remove unneeded statement
+	  commit da5c41930c4083979b1745f4d8848d97fe03d8eb removed the two uses of the
+	  new value of data:
+	  channels = opus_packet_get_nb_channels (data);
+	  bandwidth = opus_packet_get_bandwidth (data);
+	  Since then, data isn't being used between incrementing it by packet_offset
+	  and going out of scope. Removing this uneeded statement.
+
+2015-11-27 12:44:57 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* tests/check/elements/id3mux.c:
+	  tests: id3mux: add unit test for GST_TAG_PRIVATE_DATA writing
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758728
+
+2015-11-27 11:33:07 +0530  Ravi Kiran K N <ravi.kiran@samsung.com>
+
+	* gst/id3tag/id3tag.c:
+	  id3mux: write private data tag
+	  Handle "PRIV" tag in id3mux. Write owner
+	  identifier and private data and add to the
+	  id3v2 frame.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758728
+
+2015-11-26 10:15:36 +0100  Mathias Hasselmann <mathias.hasselmann@kdab.com>
+
+	* sys/androidmedia/gstamcvideodec.c:
+	  androidmedia: Don't add metadata to locked buffer
+	  The video decoders tried calling gst_buffer_add_*meta() on non-writable
+	  buffer resulting in warnings of this kind:
+	  gstamcvideodec.c:921 (_gl_sync_render_unlocked): WARNING: amcvideodec
+	  Failed to create the transformation meta for the gl_sync 0xabc03848
+	  buffer 0xabb01b40 (0)
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758694
+
+2015-11-09 18:07:30 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* tests/check/elements/dash_demux.c:
+	  adaptivedemux: tests: disabled testFragmentDownloadError test
+	  Until we will have support to control the generating thread from
+	  fakeHTTPsrc element, the test testFragmentDownloadError is disabled.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757776
+
+2015-11-09 14:14:34 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* tests/check/elements/dash_demux.c:
+	  adaptivedemux: tests: corrected access to fakeHTTPsrc element
+	  The src element for adaptivedemux is now a bin. Updated the tests to
+	  correctly reach into the bin and get the fakeHTTPsrc element
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757776
+
+2015-11-09 14:13:04 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* tests/check/elements/fake_http_src.c:
+	  adaptivedemux: tests: made fakeHTTPsrc element MT safe
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757776
+
+2015-11-23 11:32:13 +0900  Vineeth T M <vineeth.tm@samsung.com>
+
+	* gst/dvdspu/gstspu-pgs.c:
+	  spu-pgs: Fix array memory leak
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758517
+
+2015-11-24 00:20:36 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* gst/audiomixer/gstaudioaggregator.c:
+	  audiomixer: register function name for debugging just once
+	  Not every time aggregate is called...
+
+2015-11-24 12:42:45 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/dash/gstmpdparser.c:
+	* ext/dash/gstmpdparser.h:
+	* tests/check/elements/dash_mpd.c:
+	  mpdparser: remove gst_mpd_client_check_time_position
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758593
+
+2015-11-24 11:50:51 +0100  Maroš Ondrášek <mx3ldev@gmail.com>
+
+	* ext/smoothstreaming/gstmssmanifest.c:
+	  mssdemux: add depth field to audio caps if available
+	  depth field can be retrieved from "BitsPerSample" or
+	  from "WaveFormatEx" structure, if provided in Manifest
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758586
+
+2015-11-20 16:35:43 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* tests/check/elements/dash_mpd.c:
+	  mpdparser: tests: added test for fraction of seconds in availabilityStartTime
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758410
+
+2015-11-20 16:36:00 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/dash/gstmpdparser.c:
+	  mpdparser: added support for parsing fraction of seconds in dateTime fields
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758410
+
+2015-11-22 13:11:48 +0100  George Kiagiadakis <george.kiagiadakis@collabora.com>
+
+	* tests/examples/waylandsink/Makefile.am:
+	  tests: put the waylandsink example window.ui file in EXTRA_DIST
+
+2015-11-22 13:08:35 +0100  George Kiagiadakis <george.kiagiadakis@collabora.com>
+
+	* tests/examples/waylandsink/Makefile.am:
+	  tests: fix linking waylandsink example with the gstwayland library
+	  First, use top_builddir, otherwise it fails in out-of-source builds.
+	  Second, link to the libtool archive directly to let make understand
+	  the dependency.
+
+2015-11-20 20:59:16 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* ext/dash/gstmpdparser.c:
+	  dashdemux: always set presentationTimeOffset
+	  Set it for all types of segment lists (templates / lists / base)
+	  and not only for templates.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=751529
+
+2015-11-20 17:50:30 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfmux.c:
+	  mxfmux: Error out if we get a timeout during live mixing
+	  We can't handle that but need complete streams without gaps.
+
+2015-11-20 17:46:53 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfmpeg.c:
+	  mxfmpeg: Use the correct sound essence compression UL for MP3
+	  There's one for MPEG 1 Layer 1 and one for Layer 2 and 3. We previously
+	  had the second for Layer 1 and 2 and nothing for Layer 3, which was wrong.
+
+2015-11-20 17:34:22 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfmpeg.c:
+	  mxfmpeg: Set the essence container UL byte 13 to 0x10 for h264
+	  0x04 signifies a MPEG elementary stream but according to RP2008, 0x10 should
+	  be used for a h264 byte-stream. This also fixes compatibility of our files
+	  with ffmpeg.
+
 2015-11-20 11:18:43 +1100  Roman Nowicki <rnowicki@sims.pl>
 
 	* ext/qt/qtitem.cc:
@@ -77,12 +2072,459 @@
 	  notification.  Initialize ourself in this case.
 	  https://bugzilla.gnome.org/show_bug.cgi?id=758337
 
+2015-07-29 22:31:30 +0900  Jimmy Ohn <yongjin.ohn@lge.com>
+
+	* ext/dash/gstdashdemux.c:
+	  dashdemux: Add binary search for stream_sidx_seek
+	  Add binary search to optimize in stream_sidx_seek.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=749653
+
+2015-11-19 15:59:56 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/dash/gstmpdparser.c:
+	* ext/dash/gstmpdparser.h:
+	* tests/check/elements/dash_mpd.c:
+	  mpdparser: remove unused functions gst_mpdparser_get_chunk_by_index and gst_mpdparser_find_segment_by_index
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758233
+
+2015-11-19 17:24:53 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/mpeg2enc/gstmpeg2enc.cc:
+	* ext/opencv/gstedgedetect.cpp:
+	* ext/opencv/gstmotioncells.cpp:
+	* ext/opencv/gsttemplatematch.cpp:
+	* gst/dataurisrc/gstdataurisrc.c:
+	* gst/mve/gstmvemux.c:
+	* gst/pcapparse/gstirtspparse.c:
+	* gst/pcapparse/gstpcapparse.c:
+	* tests/check/elements/dataurisrc.c:
+	  docs: update gst-launch-0.10 lines
+	  Update references to gst-launch-0.10 to gst-launch-1.0
+
+2015-11-19 10:32:03 +1100  Matthew Waters <matthew@centricular.com>
+
+	* sys/androidmedia/gstamcvideodec.c:
+	* sys/androidmedia/gstamcvideodec.h:
+	  amcvideodec: move release_output_buffer into the sync meta
+	  Some devices only ever keep one buffer available in the GL queue resulting in
+	  multiple calls to release_output_buffer only causing one frame to be rendered.
+	  If there is a queue after amcvideodec (even playsink's small one), then
+	  multiple buffers are pushed but only a small fraction of them are actually
+	  rendered on time.  The rest will either render some number of frames ahead of
+	  where they are meant to be or timeout waiting for a frame that's already been
+	  rendered.
+	  Solved by moving the release_output_buffer into the sync_meta the is pushed
+	  downstream.  When downstream renders, the custom sync implementation attempts
+	  to release the current buffer (if not already released) and render. Once the
+	  frame has been rendered to the screen, the next frame is released and is
+	  hopefully available by the time the next frame is to be rendered.
+	  This fixes a perceived frame jitter in the output.
+
+2015-11-17 15:23:17 -0800  Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+	* ext/audiofile/gstafsink.c:
+	* ext/audiofile/gstafsrc.c:
+	* ext/dash/gstmpdparser.c:
+	* ext/gl/gstglbumper.c:
+	* ext/gl/gstgldifferencematte.c:
+	* ext/gl/gstglfiltershader.c:
+	* ext/gl/gstgloverlay.c:
+	* ext/hls/gsthlsdemux.c:
+	* ext/kate/gstkateenc.c:
+	* ext/kate/gstkatespu.c:
+	* ext/kate/gstkateutil.c:
+	* ext/libmms/gstmms.c:
+	* ext/neon/gstneonhttpsrc.c:
+	* ext/opus/gstopusenc.c:
+	* ext/sndfile/gstsfsink.c:
+	* ext/sndfile/gstsfsrc.c:
+	* ext/spc/tag.c:
+	* ext/timidity/gsttimidity.c:
+	* ext/wayland/gstwaylandsink.c:
+	* gst-libs/gst/gl/gstglfeature.c:
+	* gst-libs/gst/gl/gstglslstage.c:
+	* gst-libs/gst/gl/gstglutils.c:
+	* gst-libs/gst/gl/x11/gstgldisplay_x11.c:
+	* gst/audiovisualizers/gstwavescope.c:
+	* gst/dvbsuboverlay/dvb-sub.c:
+	* gst/librfb/rfbdecoder.c:
+	* gst/mpegtsdemux/mpegtspacketizer.c:
+	* gst/mpegtsdemux/tsdemux.c:
+	* gst/mpegtsmux/tsmux/tsmux.c:
+	* sys/acmenc/acmenc.c:
+	* sys/acmmp3dec/acmmp3dec.c:
+	* sys/applemedia/avfassetsrc.m:
+	* sys/bluez/gsta2dpsink.c:
+	* sys/bluez/gstavdtpsink.c:
+	* sys/bluez/gstavdtputil.c:
+	* sys/dshowdecwrapper/gstdshowaudiodec.cpp:
+	* sys/dshowdecwrapper/gstdshowvideodec.cpp:
+	* sys/dshowsrcwrapper/gstdshow.cpp:
+	* sys/dshowsrcwrapper/gstdshowvideosrc.cpp:
+	* sys/dshowvideosink/dshowvideosink.cpp:
+	* sys/dvb/camswclient.c:
+	* sys/dvb/dvbbasebin.c:
+	* sys/dvb/parsechannels.c:
+	* sys/pvr2d/gstpvrvideosink.c:
+	* sys/uvch264/gstuvch264_mjpgdemux.c:
+	* sys/vdpau/gstvdpvideomemory.c:
+	* tests/examples/gtk/glliveshader.c:
+	* tests/icles/metadata_editor.c:
+	  Remove unnecessary NULL checks before g_free()
+	  g_free() is NULL-safe
+
+2015-11-11 16:11:14 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/dash/gstmpdparser.c:
+	* tests/check/elements/dash_mpd.c:
+	  mpdparser: Also allow '/' in RepresentationID
+	  Used by http://www.bok.net/dash/tears_of_steel/cleartext/stream.mpd
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757903
+
+2015-10-26 16:24:40 +0100  George Kiagiadakis <george.kiagiadakis@collabora.com>
+
+	* .gitignore:
+	* configure.ac:
+	* tests/examples/Makefile.am:
+	* tests/examples/waylandsink/Makefile.am:
+	* tests/examples/waylandsink/main.c:
+	* tests/examples/waylandsink/window.ui:
+	  tests/examples: add a waylandsink example
+	  https://bugzilla.gnome.org/show_bug.cgi?id=748322
+
+2015-11-18 12:56:06 +0100  George Kiagiadakis <george.kiagiadakis@collabora.com>
+
+	* ext/wayland/wlwindow.c:
+	  waylandsink: call gst_video_sink_center_rect with a destination rectangle that starts from (0,0)
+	  The intention of this code is to find the center rectangle relative
+	  to (0,0), since subsurface coordinates are relative to the parent
+	  surface.
+	  The old code used to work but was wrong and broken by
+	  http://cgit.freedesktop.org/gstreamer/gst-plugins-base/commit/gst-libs/gst/video/gstvideosink.c?id=ff57f6913456ec1991e55517cf1f239e80eeddef
+
+2015-11-16 17:25:34 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/dash/gstmpdparser.c:
+	  dashdemux: fixed illegal memory access in gst_mpd_client_get_last_fragment_timestamp_end
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758188
+
+2015-11-16 17:25:21 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* tests/check/elements/dash_mpd.c:
+	  mpdparser: tests: added test for gst_mpd_client_get_last_fragment_timestamp_end
+	  The timestamp for last fragment is incorrectly retrieved if segment templates
+	  are used.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758188
+
+2015-11-17 16:21:44 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* sys/androidmedia/gstamcvideodec.c:
+	  amcvideodec: Don't require a non-zero buffer size when doing decoding to a surface
+	  At least on some devices/Android versions the buffer size will always be zero
+	  in these cases.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758228
+
+2015-11-17 17:17:50 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/gl/gstglimagesink.c:
+	  glimagesink: Remove unused variable
+	  gstglimagesink.c: In function 'gst_glimage_sink_on_draw':
+	  gstglimagesink.c:1959:18: error: unused variable 'sync_meta' [-Werror=unused-variable]
+	  GstGLSyncMeta *sync_meta = NULL;
+	  ^
+
+2015-11-17 17:09:51 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst-libs/gst/gl/gstglviewconvert.c:
+	  glviewconvert: String literals are const
+	  gstglviewconvert.c: In function '_mangle_extensions':
+	  gstglviewconvert.c:1511:13: error: assignment discards 'const' qualifier from pointer target type [-Werror=discarded-qualifiers]
+	  ext_str = "#extension GL_OES_EGL_image_external : require\n";
+	  ^
+
+2015-11-17 17:08:14 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst-libs/gst/gl/gstglsyncmeta.c:
+	  glsyncmeta: Actually return the newly created meta from gst_buffer_add_gl_sync_meta()
+	  gstglsyncmeta.c  -fPIC -DPIC -o .libs/libgstgl_1.0_la-gstglsyncmeta.o
+	  gstglsyncmeta.c: In function 'gst_buffer_add_gl_sync_meta':
+	  gstglsyncmeta.c:131:1: error: control reaches end of non-void function [-Werror=return-type]
+	  }
+	  ^
+
+2015-11-17 16:21:10 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* sys/androidmedia/gstamcvideodec.c:
+	  amcvideodec: Fix indentation
+
+2015-11-17 16:08:17 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* sys/applemedia/vtdec.c:
+	  applemedia: vtdec: fix negotiation more
+	  Year 12: I still don't understand how negotiation works.
+	  Apparently gst_pad_query_caps doesn't do what I thought it did. To get the
+	  actual caps that can flow through vtdec:src we must call gst_pad_peer_query_caps
+	  with the template caps as filter.
+	  Fixes negotiation with stuff that doesn't understand GLMemory (hello videoscale).
+
+2015-11-17 16:14:11 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* sys/applemedia/vtdec.c:
+	  applemedia: vtdec: minor texture cache fixes
+	  Small fix on how the texture cache is cleaned up / setup in case of renegotiation
+
+2015-11-17 16:13:00 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* sys/applemedia/corevideotexturecache.m:
+	  applemedia: corevideotexturecache: stop configuring cache->convert over and over
+
+2015-11-16 15:46:41 +1100  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/gstglimagesink.c:
+	* ext/gl/gstglimagesink.h:
+	* sys/androidmedia/gstamcvideodec.c:
+	  glimagesink: wait on the correct sync meta when rendering
+
+2015-11-03 13:19:41 +1100  Matthew Waters <matthew@centricular.com>
+
+	* sys/androidmedia/Makefile.am:
+	* sys/androidmedia/gstamc2dtexturerenderer.c:
+	* sys/androidmedia/gstamc2dtexturerenderer.h:
+	* sys/androidmedia/gstamcvideodec.c:
+	* sys/androidmedia/gstamcvideodec.h:
+	  amcviddec: output external-oes textures
+	  This provides a performance and power usage improvement by removing
+	  the texture copy from an OES texture to 2D texture.
+	  The flow is as follows
+	  1. Generate the output buffer with the required sync meta with the incrementing
+	  push counter and OES GL memory
+	  1.1 release_output_buffer (buf, render=true) and push downstream
+	  2. Downstream waits for on the sync meta (timed wait) or drops the frame (no wait)
+	  2.1 Timed wait for the frame number to reach the number of frame callbacks fired
+	  2.2 Unconditionally update the image when the wait completes (success or fail).
+	  Sets the affine transformation matrix meta on the buffer.
+	  3. Downstream renders as usual.
+	  At *some* point through this the on_frame_callback may or may not fire.  If it
+	  does fire, we can finish waiting early and render. Otherwise we have to
+	  wait for a timeout to occur which may cause more buffers to be pused into the
+	  internal GL queue which siginificantly decreases the chances of the
+	  on_frame_callback to fire again.  This is because the frame callback only occurs
+	  when the internal GL queue changes state from empty to non-empty.
+	  Because there is no way to reliably correlate between the number of buffers
+	  pushed and the number of frame callbacks received, there are a number of
+	  workarounds in place.
+	  1. We self-increment the ready counter when it falls behind the push counter
+	  2. Time based waits as the frame callback may not be fired for a certain frame.
+	  3. It is assumed that the device can render at speed or performs some QoS of
+	  the interal GL queue (which may not match the GStreamer QoS).
+	  It holds that we call SurfaceTexture::updateTexImage for each buffer pushed
+	  downstream however there's no guarentee that updateTexImage will result in
+	  the exact next frame (it could skip or duplicate) so synchronization is not
+	  guaranteed to be accurate although it seems to be close enough to be unable
+	  to discern visually.  This has not changed from before this patch.  The current
+	  requirement for synchronization is that updateTexImage is called at the point in
+	  time when the buffers is to be rendered.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757285
+
+2015-11-02 17:57:29 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglsyncmeta.c:
+	* gst-libs/gst/gl/gstglsyncmeta.h:
+	  glsyncmeta: add vfuncs for all operations
+	  there could be other ways/requirements for synchronising two GPU command
+	  streams (whether GL or platform specific).
+	  e.g. glfencesync/eglwaitnative/cond/etc
+
+2015-11-10 15:37:05 +1100  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/gstglimagesink.c:
+	* ext/gl/gstglimagesink.h:
+	  glimagesink: add support for rendering external-oes textures
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757285
+
+2015-11-10 14:54:02 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglviewconvert.c:
+	* gst-libs/gst/gl/gstglviewconvert.h:
+	  glviewconvert: add support rectangle/external-oes textures
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757285
+
+2015-11-17 15:18:28 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* sys/applemedia/vtdec.c:
+	  applemedia: vtdec: fix setting internal SKIP / DROP flags
+
 2015-11-17 09:08:52 +0900  Vineeth TM <vineeth.tm@samsung.com>
 
 	* ext/gl/gstglimagesink.c:
 	  glimagesink: Fix structure memory leak
 	  https://bugzilla.gnome.org/show_bug.cgi?id=758205
 
+2015-11-16 21:52:07 -0500  Olivier Crête <olivier.crete@collabora.com>
+
+	* gst/autoconvert/gstautoconvert.c:
+	  autoconvert: Add support for bufferlists
+
+2015-11-17 11:21:27 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* sys/applemedia/vtdec.c:
+	* sys/applemedia/vtdec.h:
+	  applemedia: vtdec: improve negotiation
+	  Rework negotiation implementing GstVideoDecoder::negotiate. Make it possible to
+	  switch texture sharing on and off at runtime. Useful to (eventually) turn
+	  texture sharing on in pipelines where glimagesink is linked only after
+	  decoding has already started (for example OWR).
+
+2015-11-17 11:19:57 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* sys/applemedia/vtdec.c:
+	  applemedia: vtdec: improve handing of decode errors/frame drops
+	  Improve decode error handling by avoiding calling into GstVideoDecoder from the
+	  VT decode callback. This removes contention on the GST_VIDEO_DECODER_STREAM_LOCK
+	  which used to make the decode callback slow enough for VT to start dropping lots
+	  of frames once the first frame was dropped.
+
+2015-11-17 11:22:15 +1100  Alessandro Decina <alessandro.d@gmail.com>
+
+	* sys/applemedia/vtdec.c:
+	  applemedia: vtdec: fix uninitialized variable warning
+
+2015-11-14 20:21:17 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.h:
+	* tests/check/elements/dash_demux.c:
+	  adaptivedemux: remove now-defunct "num-lookback-fragments" property
+	  This no longer does anything, and it was marked as CONSTRUCT_ONLY
+	  which means someone would really have to go out of their way to
+	  be able to set this, which would only be done in very custom
+	  scenarios, if ever, and those will likely target a specific
+	  version of GStreamer then, so probably not much point keeping
+	  it deprecated for a while before removing it.
+
+2015-11-13 17:14:14 -0500  Olivier Crête <olivier.crete@collabora.com>
+
+	* gst/autoconvert/gstautoconvert.c:
+	  autoconvert: Always give a valid reply to internal caps queries
+	  Caps queries can always have a valid reply, either the filter or ANY.
+	  If the caps are ANY, then accept-caps always returns TRUE.
+
+2015-11-12 16:35:12 +0100  Nicolas Huet <nicolas.huet@parrot.com>
+
+	* gst/mpegtsdemux/mpegtspacketizer.c:
+	  mpegtsdemux: fix section_data leak
+	  If packet->payload_unit_start_indicator is true and pointer 0, there is no
+	  discontinuity check. Therefore there could be a previous section not complete
+	  that need to be cleared.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758010
+
+2015-11-13 10:41:58 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* gst-libs/gst/gl/gstglsl.c:
+	  glsl: fix possible string overrun in gst_glsl_version_profile_from_string
+	  given a NULL-terminated string, s.
+	  s[i] = '\0';
+	  i++;
+	  does not guarentee that s[i] is NULL terminated and thus string operations
+	  could read off the end of the array.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758039
+
+2015-11-13 16:50:22 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglshader.c:
+	  glshader: don't read invalid list pointers (use after free)
+	  gst_gl_shader_detach_unlocked already removes the list entry so attempting to
+	  use the element to iterate to the next stage could read invalid data.
+	  Based on patch by Vineeth TM <vineeth.tm@samsung.com>
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758039
+
+2015-11-13 10:44:26 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* tests/check/libs/gstglsl.c:
+	  tests:glsl: version_profile_s string leak
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758039
+
+2015-11-13 10:56:10 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* gst-libs/gst/gl/gstglsl.c:
+	  glsl: free str while returning error
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758039
+
+2015-11-13 11:04:34 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* tests/check/libs/gstglupload.c:
+	  tests:glupload: fix caps memory leak
+	  https://bugzilla.gnome.org/show_bug.cgi?id=758039
+
+2015-11-12 12:21:54 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opus/gstopusenc.c:
+	  opusenc: avoid potential overflow expression
+	  The result of the two expressions will be promoted to guint64 anyway,
+	  perform all the arithmetic in 64 bits to avoid potential overflows.
+	  CID 1338690, CID 1338691
+
+2015-11-12 12:00:07 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* gst/mpegtsdemux/tsdemux.c:
+	  tsdemux: remove memory leak
+	  The values of channel_mapping are copied by gst_codec_utils_opus_create_caps ()
+	  but it doesn't free or take ownership of the g_new0 allocated memory. This
+	  needs to be freed before going out of scope.
+	  CID 1338692
+
+2015-11-12 11:42:36 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* gst/mpegtsmux/mpegtsmux.c:
+	  mpegtsmux: remove unnecessary buffer check
+	  buf surely isn't NULL inside the block conditional to a buffer size bigger
+	  than (G_MAXUINT16 - 3). Plus gst_buffer_unref() checks if the buffer is
+	  NULL and does nothing if it is.
+	  CID 1338693
+
+2015-11-12 11:23:31 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opus/gstopusparse.c:
+	  opusparse: initialize sample rate to a default
+	  sample_rate might be used uninitialized if !sink_caps is TRUE. Initialize
+	  it to the default used in gst_codec_utils_opus_parse_caps () when there is
+	  no rate defined in the caps.
+	  CID 1338695
+
+2015-11-12 16:36:03 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* gst-libs/gst/gl/gstglslstage.c:
+	  glslstage: Fix vertex_sources memory leak
+	  vertex_sources is being allocated but not freed resulting in leak
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757974
+
+2015-11-12 16:26:00 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	  glcolorconvert: remove unnecessary free
+	  version_str is already being freed. So no need to call again
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757974
+
+2015-11-12 16:18:35 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	  glcolorconvert: Fix string leak
+	  String got using gst_glsl_version_profile_to_string, is allocated
+	  memory and should be freed
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757974
+
+2015-11-12 16:02:45 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	  glcolorconvert: Fix frag_prog and frag_body memory leak
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757974
+
+2015-11-11 16:51:23 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+	  adaptivedemux: fixed handling errors emitted by uri handler
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757947
+
 2015-11-10 16:32:37 +0100  Nicolas Huet <nicolas.huet@parrot.com>
 
 	* gst/mpegtsdemux/tsdemux.c:
@@ -98,6 +2540,16 @@
 	  pad will not be unreffed and will be leaked.
 	  https://bugzilla.gnome.org/show_bug.cgi?id=757873
 
+2015-11-09 17:45:29 +0200  Sreerenj Balachandran <sreerenj.balachandran@intel.com>
+
+	* gst/ivfparse/gstivfparse.c:
+	  ivfparse: Fix the wrong width & height parsing of vp9 bitstream
+	  The current implementation for detecting the resolution changes
+	  on key frames is based on vp8 bitstream alignment. Avoid this
+	  width and height parsing for vp9 bitstream, which requires proper
+	  frame header parsing inorder to detect the resolution change (Fixme).
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757825
+
 2015-11-11 11:40:52 +0100  Heinrich Fink <hfink@toolsonair.com>
 
 	* sys/applemedia/vtenc.c:
@@ -107,6 +2559,14 @@
 	  vtenc instance is stopped and then restarted.
 	  https://bugzilla.gnome.org/show_bug.cgi?id=757935
 
+2015-11-11 23:39:35 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	  glcolorconvert: mangle gl_FragColor for GL3
+	  Some drivers don't provide the compatibility definition and we need to provide
+	  our own 'out vec4' variable to put the results of the fragment shader into.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757938
+
 2015-11-11 16:06:25 +0900  Vineeth TM <vineeth.tm@samsung.com>
 
 	* tests/check/libs/gstglcolorconvert.c:
@@ -114,6 +2574,136 @@
 	  Output caps being got from video info is not getting freed
 	  https://bugzilla.gnome.org/show_bug.cgi?id=757929
 
+2015-11-10 17:58:58 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst/mpegtsdemux/tsdemux.c:
+	  tsdemux: provide our own definition of log2()
+	  The log2 function/macro doesn't exist when targetting android API < 18 (or MSVC
+	  < 2013) whereas our current baseline is API 9.
+
+2015-11-10 13:52:30 +1100  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/gstglimagesink.c:
+	* ext/gl/gstglimagesink.h:
+	* ext/gl/gstglstereomix.c:
+	* gst-libs/gst/gl/gstglviewconvert.c:
+	* gst-libs/gst/gl/gstglviewconvert.h:
+	  glviewconvert: remove set_format
+	  We need the caps to be able to
+	  1. check the caps features
+	  2. get the requested texture-target on input/output
+
+2015-11-11 10:31:07 +1100  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/gstglimagesink.c:
+	  glimagesink: fix a memory leak if the view conversion fails
+
+2015-11-11 13:37:59 +1100  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/gstglimagesink.c:
+	  glimagesink: balance the creation/destruction of the overlay compositor
+	  Fixes some leaks/possible segfault on when failing to create the compositor.
+
+2015-11-11 12:23:30 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglshader.c:
+	* gst-libs/gst/gl/gstglutils.c:
+	  glshader: properly unref the stages on failure
+	  When failing in the varargs functions, all the stage objects not handled need to
+	  be unreffed to prevent a leak.
+
+2015-11-11 11:29:35 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglslstage.c:
+	  glslstage: properly return an error when we could not create the shader stage
+	  While it was erroring out correctly later, there were GLib warnings about
+	  setting a GError over the top of another GError.
+
+2015-11-11 01:05:20 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglshaderstrings.c:
+	  glshaderstrings: fixup the external-oes fragment shader
+	  The wrong sampler type was used
+	  s/sampler2DExternalOES/samplerExternalOES/
+
+2015-11-10 23:41:24 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	  glcolorconvert: try to keep the same texture-target if possible
+	  Fixes issues attempting to passthrough external-oes textures
+
+2015-11-10 22:41:57 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	  glcolorconvert: fix rendering rectangular textures with GL3
+	  Rectangular textures are unavailable in unextended
+	  GLES2 #version 100 shaders.
+	  Fixes
+	  texture-target=rectangle ! glcolorconvert ! texture-target=2D
+	  There's a couple of differences between GL3 and GLES2/GL
+	  - varying -> in or out depending on the stage (vertex/fragment)
+	  - attribute -> in
+	  - filtered texture access is a single function, texture()
+
+2015-11-10 20:20:29 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	  glcolorconvert: properly use the other texture-target on fixation
+
+2015-11-10 20:15:56 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglslstage.c:
+	  glslstage: add debug as to why _set_strings() failed
+
+2015-11-10 20:13:53 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglsl.c:
+	  glsl: fix check for glsl version against GL context inversion
+	  Any GLSL version that was less than the provided GL version would fail
+
+2015-11-10 10:02:38 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+	  adaptivedemux: Fix pad memory leak.
+	  The static pads got from queue and uri_handler are not being freed
+	  resulting in memory leaks.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757859
+
+2015-11-10 13:13:50 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/Makefile.am:
+	* gst-libs/gst/gl/gl.h:
+	* gst-libs/gst/gl/gstgl_enums.h:
+	* gst-libs/gst/gl/gstglmemory.h:
+	  gl: forward declare some enums
+	  Specifically the GstGLTextureTarget enum
+
+2015-11-10 13:11:37 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/Makefile.am:
+	* gst-libs/gst/gl/gl.h:
+	* gst-libs/gst/gl/gstglshaderstrings.c:
+	* gst-libs/gst/gl/gstglshaderstrings.h:
+	* gst-libs/gst/gl/gstglslstage.c:
+	  glslstage: expose the default shader strings as public
+	  Add some other simple strings for external-oes textures or transforming
+	  the texture coordinates with a transformation matrix
+
+2015-11-06 03:05:31 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	  glcolorconvert: wait on the sync meta for input buffers
+
+2015-11-05 00:13:01 +1100  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/gstglimagesink.c:
+	  glimagesink: wait on the provided sync meta provided to glimagesink
+
+2015-11-08 22:14:01 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.h:
+	  glcolorconvert: use the correct oes target string in the template caps
+
 2015-11-10 12:32:39 +1100  Matthew Waters <matthew@centricular.com>
 
 	* ext/gtk/gstgtkglsink.c:
@@ -123,13 +2713,26 @@
 	  will return EMPTY and therefore fail negotiation.
 	  https://bugzilla.gnome.org/show_bug.cgi?id=757854
 
-2015-11-06 16:16:32 +0100  Edward Hervey <edward@centricular.com>
+2015-11-10 14:21:33 +1100  Alessandro Decina <alessandro.d@gmail.com>
 
-	* gst/dvbsuboverlay/gstdvbsuboverlay.c:
-	  dvbsuboverlay: Don't send flush events
-	  It is up to the element handling the seek to send flush events
-	  downstream, otherwise we end up with a situation where upstream
-	  would get unexpected GST_FLOW_FLUSHING
+	* sys/applemedia/corevideotexturecache.m:
+	  applemedia: fix vtdec texture sharing on ios 9.1
+	  Use gst_gl_sized_gl_format_from_gl_format_type to get the format passed to
+	  CVOpenGLESTextureCacheCreateTextureFromImage. Before this change extracting the
+	  second texture from the pixel buffer was failing on ios 9.1.
+
+2015-11-06 17:24:52 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* tests/check/elements/templatematch.c:
+	  templatematch: add a framerate to test caps
+	  The pad template requires a framerate, so use it to prevent
+	  caps negotiation failures.
+	  Fixes the unit test
+
+2015-11-06 20:38:56 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* tests/check/elements/.gitignore:
+	  tests: update .gitignore for new test binaries
 
 2015-11-06 19:26:21 +0000  Tim-Philipp Müller <tim@centricular.com>
 
@@ -143,6 +2746,455 @@
 	  of GST_FLOW_FLUSHING when trying to forward sticky
 	  events at just the wrong moment.
 
+2015-11-06 16:16:32 +0100  Edward Hervey <edward@centricular.com>
+
+	* gst/dvbsuboverlay/gstdvbsuboverlay.c:
+	  dvbsuboverlay: Don't send flush events
+	  It is up to the element handling the seek to send flush events
+	  downstream, otherwise we end up with a situation where upstream
+	  would get unexpected GST_FLOW_FLUSHING
+
+2015-11-06 19:23:09 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/assrender/gstassrender.c:
+	* ext/curl/gstcurlftpsink.c:
+	* ext/dtls/gstdtlsdec.c:
+	* ext/smoothstreaming/gstmssmanifest.c:
+	* gst/geometrictransform/gstmirror.c:
+	* gst/onvif/gstrtponviftimestamp.c:
+	  Fix code indentation
+
+2015-10-22 13:40:36 +0200  Branko Subasic <branko@axis.com>
+
+	* gst/onvif/gstrtponviftimestamp.c:
+	* tests/check/elements/rtponviftimestamp.c:
+	  rtponviftimestamp: use stream time for timestamp
+	  The Onvif Streaming Specification specifies that the NTP timestamps
+	  in the Onvif extension header indicaes the absolute UTC time associated
+	  with the access unit. But by using running time we can not achieve that,
+	  since a frame's running time depends on the played interval, whether a
+	  non-flushing is done, etc. Instead we have to use the stream time.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757688
+
+2015-11-06 09:44:57 +0100  Linus Svensson <linussn@axis.com>
+
+	* gst/onvif/gstrtponviftimestamp.c:
+	* gst/onvif/gstrtponviftimestamp.h:
+	* tests/check/elements/rtponviftimestamp.c:
+	  rtponviftimestamp: Update ntp-offset and d/e-bits with a GstEvent
+	  It is now possible to update the currently used ntp-offset with a
+	  custom serialized downstream event. The element will read the ntp-offset
+	  property when doing the state transition from READY to PAUSED and
+	  use that offset until it receives a "GstNtpOffset" event, which also
+	  has a "ntp-offset" attribute in that it's structure. In case the
+	  property is not set and no event has been received, the element will
+	  guess the npt-offset with help of the clock. If no clock can be
+	  retrieved, the element will error out and stop the data flow.
+	  The same event is also used for updating the D/E-bits in the RTP
+	  extension header. The discont flag in a buffer can be set whenver a
+	  live/network source looses a frame, but that is not the type of
+	  discontinuity that the onvif extension header should reflect. The
+	  header is mainly used for playback of a track concept, in which
+	  gaps can be present, and it's those kind of gaps that should be
+	  highlighted with the D- and E-bits.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757688
+
+2015-11-06 09:44:16 +0100  Linus Svensson <linussn@axis.com>
+
+	* gst/onvif/gstrtponviftimestamp.c:
+	* gst/onvif/gstrtponviftimestamp.h:
+	* tests/check/elements/rtponviftimestamp.c:
+	  rtponviftimestamp: Do not rearange order of data
+	  If a buffer or a buffer list is cached, no events serialized with the
+	  data stream should get through. The cached buffers and events should
+	  be purged when we stop flushing.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757688
+
+2015-10-13 14:21:47 +0200  Branko Subasic <branko@axis.com>
+
+	* tests/check/Makefile.am:
+	* tests/check/elements/rtponvif.c:
+	* tests/check/elements/rtponvifparse.c:
+	* tests/check/elements/rtponviftimestamp.c:
+	  rtponvif: split unit tests in several files
+	  Split the unit tests for rtponviftimestamp and rtponvifparse
+	  elements in separate files.
+	  Setup and cleanup the element and pads in fixures. Make the tests work
+	  with CK_FORK=no as well, by cleaning up the 'buffers' list when needed.
+	  Make unit tests work when run in valgrind by unreffing all buffers,
+	  and by not allocating any payload in RTP buffers. Since we're not
+	  doing anything with the payload part, but we're memcmp-aring the
+	  complete buffer memory, valgrind complained about non-initialized
+	  memory being used.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757688
+
+2015-09-04 09:59:06 +0200  Philippe Normand <philn@igalia.com>
+
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.h:
+	  adaptivedemux: improved bitrate estimations
+	  Bitrate estimation is now handled through a queue2 element added after
+	  the source element used to download fragments.
+	  Original hlsdemux patch by Duncan Palmer <dpalmer@digisoft.tv>
+	  https://bugzilla.gnome.org/show_bug.cgi?id=733959
+
+2015-11-06 12:59:51 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* sys/dshowsrcwrapper/gstdshow.cpp:
+	  dshow: fix GList leak
+	  _remove_link() would not free the actual list nodes.
+
+2015-11-06 12:31:09 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* gst-libs/gst/gl/gstglshader.c:
+	* gst/mpegtsdemux/mpegtsparse.c:
+	  glshader, tsdemux: simplify code
+	  Jus use _delete_link() instead of _remove_link() + _free1()
+
+2015-11-06 12:30:12 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/gl/gstglmixerbin.c:
+	  glmixerbin: fix minor leak
+	  Don't leak removed list node.
+
+2015-11-06 10:22:42 +0100  Thibault Saunier <tsaunier@gnome.org>
+
+	* ext/faac/gstfaac.c:
+	  faac: Initialize debug category soon enough
+	  Avoiding assertions
+
+2015-11-05 10:12:41 +0000  Julian Bouzas <julian.bouzas@vcatechnology.com>
+
+	* configure.ac:
+	  configure.ac: Added --with-hls-crypto=auto|nettle|libgcrypt|openssl option to build the source using the desired cryptographic library for HLS
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755319
+
+2015-11-06 00:48:42 +0000  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/m3u8.c:
+	  hls: m3u8: don't leak GList nodes when matching up variant lists after master list update
+
+2015-11-05 12:36:48 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* gst-libs/gst/base/gstaggregator.c:
+	  aggregator: use GST_STIME_FORMAT for GstClockTimeDiff
+	  No need to manually handle negative value of deadline, GST_STIME_FORMAT does
+	  exactly this.
+
+2015-11-05 12:17:00 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/resindvd/resindvdsrc.c:
+	  resindvd: use GST_STIME_FORMAT for GstClockTimeDiff
+	  No need to use G_GINT64_FORMAT for potentially negative values of
+	  GstClockTimeDiff. Since 1.6 these can be handled with GST_STIME_FORMAT.
+	  Plus it creates more readable values in the logs.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757480
+
+2015-11-05 12:11:19 +0100  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/opus/gstopusdec.c:
+	  opusdec: Update sink pad templates
+	  We always require the channel-mapping-field. If it's 0 we require nothing
+	  else, otherwise we need channels, stream-count and coupled count to be
+	  available.
+
+2015-11-03 19:09:33 -0800  Stefan Sauer <ensonic@users.sf.net>
+
+	* gst-libs/gst/base/gstaggregator.c:
+	  aggregator: don't compare templ instance pointers
+	  One can pass the PadTemplate from the element_class or the one from the factory.
+	  While they have the same content, the addresses are different.
+
+2015-11-04 00:12:52 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* tests/check/elements/opus.c:
+	  opus: Remove invalid unit test
+	  Opus headers should never be in-band, so don't test for correct
+	  handling of that.
+
+2015-11-04 00:12:22 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/opus/gstopusenc.c:
+	  opusenc: Create an empty taglist if there is none
+	  There always have to be 2 buffers in the streamheaders, even if
+	  the comment buffer is basically empty.
+
+2015-11-03 14:41:57 -0500  Olivier Crête <olivier.crete@collabora.com>
+
+	* gst-libs/gst/base/gstaggregator.c:
+	  aggregator: Set to running in a single place
+	  Only set to running when the thread is actually started.
+
+2015-11-03 14:37:26 -0500  Olivier Crête <olivier.crete@collabora.com>
+
+	* gst-libs/gst/base/gstaggregator.c:
+	  aggregator: Document more locking
+
+2015-11-03 19:53:00 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mpegtsdemux/tsdemux.c:
+	  tsdemux: Don't create an incomplete OpusHead but set all the other caps fields instead
+	  OpusHead is optional, the other fields are not.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757152
+
+2015-11-03 19:51:03 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mpegtsdemux/tsdemux.c:
+	* gst/mpegtsmux/Makefile.am:
+	* gst/mpegtsmux/mpegtsmux.c:
+	  tsmux: Simplify Opus caps parsing by using codecutils helpers
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757152
+
+2015-11-03 14:50:53 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/opus/Makefile.am:
+	* ext/opus/gstopusdec.c:
+	* ext/opus/gstopusdec.h:
+	* ext/opus/gstopusenc.c:
+	* ext/opus/gstopusheader.c:
+	* ext/opus/gstopusheader.h:
+	* ext/opus/gstopusparse.c:
+	* ext/opus/gstopusparse.h:
+	* ext/opus/gstrtpopusdepay.c:
+	* ext/opus/gstrtpopuspay.c:
+	  opus: Add proper support for multichannel audio
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757152
+
+2015-11-03 11:41:07 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/opus/gstopusparse.c:
+	* ext/opus/gstopusparse.h:
+	  opusparse: Fix up pre-skip in OpusHead if upstream using GstAudioClippingMeta
+	  Makes transmuxing from e.g. MPEG-TS to Ogg sample accurate.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757153
+
+2015-11-02 18:02:55 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mpegtsdemux/Makefile.am:
+	* gst/mpegtsdemux/tsdemux.c:
+	* gst/mpegtsmux/Makefile.am:
+	* gst/mpegtsmux/mpegtsmux_opus.c:
+	  tsdemux/mux: Add support for GstAudioClippingMeta for Opus
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757153
+
+2015-11-02 17:33:53 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/opus/gstopusdec.c:
+	  opusdec: Handle GstAudioClippingMeta instead of the pre-skip field in the OpusHead
+	  oggdemux is outputting the meta now, and only outputs if it should really
+	  apply to the current buffer. Previously we would skip N samples also if we
+	  started the decoder in the middle of the stream.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757153
+
+2015-11-02 16:52:28 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/opus/gstopusenc.c:
+	  opusenc: Add GstAudioClippingMeta to buffers that need to be clipped
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757153
+
+2015-11-02 10:30:52 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/opus/gstopusenc.c:
+	  opusenc: Disable granule position calculations by the base class
+	  It is doing the wrong thing because of the Opus pre-skip: while the timestamps
+	  are shifted by the pre-skip, the granule positions are not shifted.
+	  oggmux is doing the right thing here already.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757153
+
+2015-10-31 15:02:50 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/opus/gstopusenc.c:
+	  opusenc: Add some FIXME comments about calculating padding with LPC
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757153
+
+2015-10-30 20:57:37 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/opus/gstopusenc.c:
+	* ext/opus/gstopusenc.h:
+	  opusenc: Encode exactly the amount of samples we got as input and put correct timestamps on it
+	  The first frame has lookahead less samples, the last frame might have some
+	  padding or we might have to encode another frame of silence to get all our
+	  input into the encoded data.
+	  This is because of a) the lookahead at the beginning of the encoding, which
+	  shifts all data by that amount of samples and b) the padding needed to fill
+	  the very last frame completely.
+	  Ideally we would use LPC to calculate something better than silence for the
+	  padding to make the encoding as smooth as possible.
+	  With this we get exactly the same amount of samples again in an
+	  opusenc ! opusdec pipeline.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757153
+
+2015-10-30 20:47:20 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/opus/gstopusenc.c:
+	* ext/opus/gstopusheader.c:
+	* ext/opus/gstopusheader.h:
+	* ext/opus/gstopusparse.c:
+	  opusenc: Put lookahead/pre-skip into the OpusHead header
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757153
+
+2015-10-25 17:27:39 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mpegtsmux/Makefile.am:
+	* gst/mpegtsmux/mpegtsmux.c:
+	* gst/mpegtsmux/mpegtsmux_opus.c:
+	* gst/mpegtsmux/mpegtsmux_opus.h:
+	* gst/mpegtsmux/tsmux/tsmuxstream.c:
+	* gst/mpegtsmux/tsmux/tsmuxstream.h:
+	  tsmux: Add support for Opus
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757049
+
+2015-10-24 14:27:43 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mpegtsdemux/Makefile.am:
+	* gst/mpegtsdemux/gstmpegdesc.h:
+	* gst/mpegtsdemux/tsdemux.c:
+	  tsdemux: Add support for Opus
+	  Code partially based on
+	  https://git.videolan.org/?p=ffmpeg.git;a=commit;h=74141f693ded2fbf75af56fff309d2db35183635
+	  and based on the spec draft at
+	  https://wiki.xiph.org/OpusTS
+	  Makes it possible to demux
+	  http://www.obe.tv/Downloads/opus.ts
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757049
+
+2015-10-25 19:31:51 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mpegtsmux/mpegtsmux.c:
+	  tsmux: Don't leak buffer in error cases
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757049
+
+2015-10-25 19:29:53 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mpegtsmux/mpegtsmux.c:
+	  tsmux: Call prepare function for each collected buffer
+	  Not when clipping buffers, as that doesn't happen for every buffer.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757049
+
+2015-10-25 18:09:24 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst-libs/gst/mpegts/gstmpegtsdescriptor.c:
+	* gst-libs/gst/mpegts/gstmpegtsdescriptor.h:
+	  mpegtsdescriptor: Add API for creating extended descriptors and fix writing them
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757049
+
+2015-11-02 21:16:15 -0800  Stefan Sauer <ensonic@users.sf.net>
+
+	* ext/opencv/gsthanddetect.cpp:
+	  opencv: cast paramspec flags to fix the build for c++
+	  All the other elements in this plugin do this already.
+
+2015-11-03 15:05:20 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* sys/dvb/gstdvbsrc.c:
+	  dvbsrc: use GST_STIME_ARGS for GstClockTimeDiff
+	  No need to use G_GINT64_FORMAT for potentially negative values of
+	  GstClockTimeDiff. Since 1.6 these can be handled with GST_STIME_ARGS.
+	  Plus it creates more readable values in the logs.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757480
+
+2015-11-03 15:00:01 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* sys/androidmedia/gstamcvideodec.c:
+	  amcvideodec: use GST_STIME_ARGS for GstClockTimeDiff
+	  No need to manually handle negative value of deadline, GST_STIME_ARGS does
+	  exactly this.
+
+2015-11-03 10:42:40 +0000  Hyunil Park <hyunil46.park@samsung.com>
+
+	* ext/wayland/gstwaylandsink.c:
+	  waylandsink: Add exception code for setting wl_surface
+	  Waylandsink needs exception code in gst_wayland_sink_set_window_handle().
+	  After making sink->window, User can call
+	  gst_wayland_sink_set_window_handle(). It is the user's fault, but
+	  Waylandsink needs to handle the exception, if not then sink->window is
+	  changed and rendering fails.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=747482
+
+2015-04-09 13:17:01 +0900  Hyunil Park <hyunil46.park@samsung.com>
+
+	* ext/wayland/gstwaylandsink.c:
+	  waylandsink: Add exception code for setting wl_display
+	  Waylandsink needs exception code in gst_wayland_sink_set_context(). After
+	  calling gst_wayland_sink_set_context(), below code is set.
+	  GST_ELEMENT_CLASS (parent_class)->set_context (element, context); but, If
+	  user can call onemore. It is user's fault. but waylandsink need to
+	  exception.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=747482
+
+2015-11-02 20:10:35 -0500  Olivier Crête <olivier.crete@collabora.com>
+
+	* gst-libs/gst/base/gstaggregator.c:
+	  aggregator: Hold object lock while manipulating the segment
+	  Make sure the object lock is held when aggregator->segment is
+	  modified.
+
+2015-11-02 19:40:28 -0500  Olivier Crête <olivier.crete@collabora.com>
+
+	* gst/audiomixer/gstaudioaggregator.c:
+	  audioaggregator: Improve log messages
+	  Make the level of log messages saner and improve some.
+
+2015-11-02 19:05:01 -0500  Olivier Crête <olivier.crete@collabora.com>
+
+	* gst-libs/gst/base/gstaggregator.c:
+	  aggregator: Remove dead code
+	  This code will never be called as max>=min in all cases. If the upstream
+	  latency query returned min>max, the function already returned and all
+	  values that are added to those have max>= min.
+
+2015-11-02 17:02:47 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* gst/mpegtsmux/mpegtsmux.c:
+	  mpegtsmux: use GST_STIME_ARGS for GstClockTimeDiff
+	  No need to manually handle negative values of best->dts in
+	  GST_DEBUG_OBJECT. Use GST_STIME_ARGS for this.
+
+2015-11-02 16:58:57 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* gst-libs/gst/video/gstvideoaggregator.c:
+	  videoaggregator: use GST_STIME_ARGS for GstClockTimeDiff
+	  No need to manually handle negative values of diff, GST_STIME_ARGS does
+	  exactly this.
+
+2015-11-02 11:17:29 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/dash/gstmpdparser.c:
+	  dashdemux: remove unreachable code
+	  The stream->cur_seg_template is set to the lowest available segment
+	  template (representation or adaptation or period, in this order).
+	  Because the template elements are inherited, the lowest template will
+	  have all the elements the parents had, so there is no need to check the
+	  parent for an element that is not found in the child (eg initialisation
+	  or index).
+	  https://bugzilla.gnome.org/show_bug.cgi?id=752714
+
+2015-11-02 10:48:11 +0000  Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+	* tests/check/elements/dash_mpd.c:
+	  tests: add a test for MPD file duration parsing
+	  https://bugzilla.gnome.org/show_bug.cgi?id=752336
+
+2015-11-02 10:25:38 +0000  Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+	* ext/dash/gstmpdparser.c:
+	  mpdparser: add some checks to duration parsing
+	  https://bugzilla.gnome.org/show_bug.cgi?id=752336
+
+2015-09-29 09:32:02 +0100  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/dash/gstmpdparser.c:
+	  dashdemux: added duration format validation
+	  https://bugzilla.gnome.org/show_bug.cgi?id=752336
+
+2015-11-02 11:21:14 +0000  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/dash/gstmpdparser.c:
+	  dashdemux: fix memory leak
+	  Free new_mpd, allocated with g_slice_new(), before going out of scope in
+	  goto error.
+	  CID 1338050
+
 2015-11-02 20:14:11 +1100  Alessandro Decina <alessandro.d@gmail.com>
 
 	* sys/applemedia/vtenc.c:
@@ -151,151 +3203,350 @@
 	  GstVideoEncoder assumes that the input buffer is available until _finish_frame.
 	  https://bugzilla.gnome.org/show_bug.cgi?id=756951
 
+2015-11-01 23:34:32 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/opus/gstopusdec.c:
+	  opusdec: Assume 48kHz if no sample rate is given in the header
+
 2015-10-30 20:59:41 +0200  Sebastian Dröge <sebastian@centricular.com>
 
 	* ext/opus/gstopusenc.c:
 	  opusenc: Place 48kHz first in the caps
 	  For all the other sample rates the encoder will have to resample internally.
 
-2015-11-01 23:34:32 +0200  Sebastian Dröge <sebastian@centricular.com>
+2015-11-02 12:10:44 +1100  Alessandro Decina <alessandro.d@gmail.com>
 
-	* ext/opus/gstopusdec.c:
-	  opusdec: Assume 48kHz if no sample rate is given in the header
+	* gst-libs/gst/gl/gstglutils.c:
+	  gstglutils: fix shader compilation on Mountain Lion
+	  Make gst_gl_context_gen_shader/_compile_shader assume GST_GLSL_PROFILE_ES |
+	  GST_GLSL_PROFILE_COMPATIBILITY as the profile. Without this, the shader compiler
+	  doesn't inject the #version tag resulting in a compilation error on Mountain
+	  Lion.
+	  This is a workaround for old code using gst_gl_context_gen_shader. New code
+	  should use the gst_glsl_stage_* API directly which allows the caller to
+	  explicitly specify version/profile.
 
-=== release 1.6.1 ===
+2015-10-31 18:47:39 +0100  Philippe Renon <philippe_renon@yahoo.fr>
 
-2015-10-30 16:44:45 +0200  Sebastian Dröge <sebastian@centricular.com>
+	* sys/winks/gstksvideosrc.c:
+	  ksvideosrc: don't try to align current timestamp on previous timestamp
+	  this causes frames to be dropped.
+	  Based on a patch by Sebastian Dröge
+	  https://bugzilla.gnome.org/show_bug.cgi?id=748337
 
-	* ChangeLog:
-	* NEWS:
-	* RELEASE:
-	* configure.ac:
-	* docs/plugins/gst-plugins-bad-plugins.hierarchy:
-	* docs/plugins/inspect/plugin-accurip.xml:
-	* docs/plugins/inspect/plugin-adpcmdec.xml:
-	* docs/plugins/inspect/plugin-adpcmenc.xml:
-	* docs/plugins/inspect/plugin-aiff.xml:
-	* docs/plugins/inspect/plugin-asfmux.xml:
-	* docs/plugins/inspect/plugin-assrender.xml:
-	* docs/plugins/inspect/plugin-audiomixer.xml:
-	* docs/plugins/inspect/plugin-audiovisualizers.xml:
-	* docs/plugins/inspect/plugin-autoconvert.xml:
-	* docs/plugins/inspect/plugin-bayer.xml:
-	* docs/plugins/inspect/plugin-bz2.xml:
-	* docs/plugins/inspect/plugin-camerabin.xml:
-	* docs/plugins/inspect/plugin-chromaprint.xml:
-	* docs/plugins/inspect/plugin-coloreffects.xml:
-	* docs/plugins/inspect/plugin-curl.xml:
-	* docs/plugins/inspect/plugin-dataurisrc.xml:
-	* docs/plugins/inspect/plugin-debugutilsbad.xml:
-	* docs/plugins/inspect/plugin-dtsdec.xml:
-	* docs/plugins/inspect/plugin-dvb.xml:
-	* docs/plugins/inspect/plugin-dvbsuboverlay.xml:
-	* docs/plugins/inspect/plugin-dvdspu.xml:
-	* docs/plugins/inspect/plugin-faad.xml:
-	* docs/plugins/inspect/plugin-festival.xml:
-	* docs/plugins/inspect/plugin-fieldanalysis.xml:
-	* docs/plugins/inspect/plugin-flite.xml:
-	* docs/plugins/inspect/plugin-fragmented.xml:
-	* docs/plugins/inspect/plugin-frei0r.xml:
-	* docs/plugins/inspect/plugin-gaudieffects.xml:
-	* docs/plugins/inspect/plugin-gdp.xml:
-	* docs/plugins/inspect/plugin-geometrictransform.xml:
-	* docs/plugins/inspect/plugin-gmedec.xml:
-	* docs/plugins/inspect/plugin-gsm.xml:
-	* docs/plugins/inspect/plugin-gstsiren.xml:
-	* docs/plugins/inspect/plugin-id3tag.xml:
-	* docs/plugins/inspect/plugin-inter.xml:
-	* docs/plugins/inspect/plugin-interlace.xml:
-	* docs/plugins/inspect/plugin-jpegformat.xml:
-	* docs/plugins/inspect/plugin-liveadder.xml:
-	* docs/plugins/inspect/plugin-mimic.xml:
-	* docs/plugins/inspect/plugin-mms.xml:
-	* docs/plugins/inspect/plugin-modplug.xml:
-	* docs/plugins/inspect/plugin-mpeg2enc.xml:
-	* docs/plugins/inspect/plugin-mpegpsdemux.xml:
-	* docs/plugins/inspect/plugin-mpegpsmux.xml:
-	* docs/plugins/inspect/plugin-mpegtsdemux.xml:
-	* docs/plugins/inspect/plugin-mpegtsmux.xml:
-	* docs/plugins/inspect/plugin-mpg123.xml:
-	* docs/plugins/inspect/plugin-mplex.xml:
-	* docs/plugins/inspect/plugin-ofa.xml:
-	* docs/plugins/inspect/plugin-openal.xml:
-	* docs/plugins/inspect/plugin-opencv.xml:
-	* docs/plugins/inspect/plugin-opus.xml:
-	* docs/plugins/inspect/plugin-pcapparse.xml:
-	* docs/plugins/inspect/plugin-pnm.xml:
-	* docs/plugins/inspect/plugin-rawparse.xml:
-	* docs/plugins/inspect/plugin-removesilence.xml:
-	* docs/plugins/inspect/plugin-resindvd.xml:
-	* docs/plugins/inspect/plugin-rfbsrc.xml:
-	* docs/plugins/inspect/plugin-rtmp.xml:
-	* docs/plugins/inspect/plugin-schro.xml:
-	* docs/plugins/inspect/plugin-sdp.xml:
-	* docs/plugins/inspect/plugin-segmentclip.xml:
-	* docs/plugins/inspect/plugin-shm.xml:
-	* docs/plugins/inspect/plugin-smooth.xml:
-	* docs/plugins/inspect/plugin-soundtouch.xml:
-	* docs/plugins/inspect/plugin-spandsp.xml:
-	* docs/plugins/inspect/plugin-speed.xml:
-	* docs/plugins/inspect/plugin-subenc.xml:
-	* docs/plugins/inspect/plugin-videoparsersbad.xml:
-	* docs/plugins/inspect/plugin-voaacenc.xml:
-	* docs/plugins/inspect/plugin-voamrwbenc.xml:
-	* docs/plugins/inspect/plugin-waylandsink.xml:
-	* docs/plugins/inspect/plugin-y4mdec.xml:
-	* docs/plugins/inspect/plugin-zbar.xml:
-	* gst-plugins-bad.doap:
-	* win32/common/config.h:
-	  Release 1.6.1
+2015-10-31 23:28:20 +1100  Matthew Waters <matthew@centricular.com>
 
-2015-10-30 16:29:57 +0200  Sebastian Dröge <sebastian@centricular.com>
+	* gst-libs/gst/gl/gstglbufferpool.c:
+	  glbufferpool: explicitly initialize a possibly uninitialized variable
+	  The ret variable may be uninitialized and so its contents were undefined and
+	  the results were erratic (failing with glvideomixer, succeeding in other cases)
+	  P.S. No idea why gcc/clang et al never picked up on this like they normally do
+	  (probably due to some optimisation pass figuring out it's only set once...)
 
-	* po/af.po:
-	* po/az.po:
-	* po/bg.po:
-	* po/ca.po:
-	* po/da.po:
-	* po/el.po:
-	* po/en_GB.po:
-	* po/eo.po:
-	* po/es.po:
-	* po/eu.po:
-	* po/fi.po:
-	* po/fr.po:
-	* po/gl.po:
-	* po/hr.po:
-	* po/hu.po:
-	* po/id.po:
-	* po/it.po:
-	* po/ja.po:
-	* po/ky.po:
-	* po/lt.po:
-	* po/lv.po:
-	* po/mt.po:
-	* po/nb.po:
-	* po/or.po:
-	* po/pt_BR.po:
-	* po/ro.po:
-	* po/sk.po:
-	* po/sl.po:
-	* po/sq.po:
-	* po/sr.po:
-	* po/sv.po:
-	* po/tr.po:
-	  Update .po files
+2015-10-29 11:38:35 +0000  Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
 
-2015-10-30 14:30:17 +0200  Sebastian Dröge <sebastian@centricular.com>
+	* ext/dash/gstmpdparser.c:
+	* ext/dash/gstmpdparser.h:
+	* tests/check/elements/dash_mpd.c:
+	  mpdparser: make durations unsigned where appropriate
+	  The standard does not seem to make any particular explicit not
+	  implicit reference to the signedness of durations, and the code
+	  does not rely on such, nor on the negativity of the -1 value
+	  that's used as a placeholder when a duration property is not
+	  present in the XML.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=750847
 
-	* po/cs.po:
-	* po/de.po:
-	* po/nl.po:
-	* po/pl.po:
-	* po/ru.po:
-	* po/uk.po:
-	* po/vi.po:
-	* po/zh_CN.po:
-	  po: Update translations
+2015-10-30 15:55:19 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/dash/gstmpdparser.c:
+	* tests/check/elements/dash_mpd.c:
+	  dashdemux: inherit bitstreamSwitching from Period to AdaptationSet
+	  https://bugzilla.gnome.org/show_bug.cgi?id=752340
+
+2015-08-20 18:14:36 +0100  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/dash/gstdashdemux.c:
+	  dashdemux: marked PROP_BANDWIDTH_USAGE property as deprecated
+	  https://bugzilla.gnome.org/show_bug.cgi?id=753890
+
+2015-10-30 15:02:35 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* tests/check/elements/dash_mpd.c:
+	  dashdemux: unit testing reproducing inherited segment duration overflow
+	  unit test reproducing https://bugzilla.gnome.org/show_bug.cgi?id=751832
+
+2015-10-30 14:31:21 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/dash/gstmpdparser.c:
+	* tests/check/elements/dash_mpd.c:
+	  dashdemux: inherited segment URLs are ignored if they are defined again in a lower SegmentList
+	  According to the standard:
+	  "SegmentBase, SegmentTemplate and SegmentList shall inherit
+	  attributes and elements from the same element on a higher level.
+	  If the same attribute or element is present on both levels,
+	  the one on the lower level shall take precedence over the one
+	  on the higher level."
+	  gst_mpdparser_parse_segment_list_node will now discard any inherited
+	  segment URLs if the parsed element defines some too.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=751832
+
+2015-10-20 17:21:00 +0100  Florin Apostol <florin.apostol@oregan.net>
+
+	* tests/check/elements/dash_demux.c:
+	* tests/check/elements/fake_http_src.c:
+	* tests/check/elements/fake_http_src.h:
+	  adaptivedemux: tests: added test for fragment download error
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757361
+
+2015-10-20 15:46:36 +0100  Florin Apostol <florin.apostol@oregan.net>
+
+	* tests/check/elements/dash_demux.c:
+	  adaptivedemux: tests: made adaptive demux test thread safe
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757361
+
+2015-10-16 16:20:34 +0100  Florin Apostol <florin.apostol@oregan.net>
+
+	* tests/check/elements/dash_demux.c:
+	  adaptivedemux: tests: added query test
+	  Testing if adaptive demux responds to queries.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757361
+
+2015-10-28 11:21:14 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* tests/check/elements/dash_mpd.c:
+	  dashdemux: tests: added test for multiple BaseURL entries
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757245
+
+2015-09-16 10:40:33 +0100  Florin Apostol <florin.apostol@oregan.net>
+
+	* tests/check/elements/dash_mpd.c:
+	  dashdemux: tests: added unit test for 6d1eda9391d3143b5fc633edfd94b89dbba209ab
+	  Commit 6d1eda9391d3143b5fc633edfd94b89dbba209ab fixed the period start
+	  time scaling. This patch updates the unit tests to cover that scenario.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755105
+
+2015-10-16 17:10:11 +0100  Florin Apostol <florin.apostol@oregan.net>
+
+	* tests/check/elements/dash_demux.c:
+	  adaptivedemux: tests: added download error test
+	  Tests adaptive demux behaviour when the uri is wrong and download does
+	  not happen.
+
+2015-10-30 12:49:20 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+	  adaptivedemux: stop task on multiple download errors
+	  On multiple download errors, we stop the download task and change the src
+	  element state to NULL.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756240
+
+2015-10-30 12:24:22 +0000  Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+	  adaptivedemux: fix a missing lock in write to stream->last_ret
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757359
+
+2015-10-07 23:20:51 +0100  Florin Apostol <florin.apostol@oregan.net>
+
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+	  adaptivedemux: return error if src element cannot start
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756209
+
+2015-10-08 11:45:25 +0100  Florin Apostol <florin.apostol@oregan.net>
+
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+	  adaptivedemux: fixed waiting for fragment updates
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756237
+
+2015-10-08 12:35:44 +0100  Florin Apostol <florin.apostol@oregan.net>
+
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+	  adaptivedemux: fix header redownload in case of errors
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756239
+
+2015-10-30 00:04:12 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+	  adaptivedemux: release manifest lock before sending flush stop event
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757337
+
+2015-10-29 23:41:46 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+	  adaptivedemux: reset download_finished before starting the src element
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757336
+
+2015-10-29 23:23:05 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+	  adaptivedemux: release manifest lock before changing element state
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757335
+
+2015-10-30 16:38:17 +1100  Matthew Waters <matthew@centricular.com>
+
+	* sys/applemedia/corevideotexturecache.m:
+	  vtdec: fix compilation error
+	  Undefined symbols for architecture x86_64:
+	  "__gl_target_to_gst", referenced from:
+	  __do_get_gl_buffer in libgstapplemedia_la-corevideotexturecache.o
+
+2015-10-30 15:00:23 +1100  Matthew Waters <matthew@centricular.com>
+
+	* tests/check/libs/gstglcolorconvert.c:
+	* tests/check/libs/gstglmemory.c:
+	* tests/check/libs/gstglupload.c:
+	  gl/tests: update for glmemory api changes
+
+2015-10-30 14:43:23 +1100  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/gstglcolorconvertelement.c:
+	  glcolorconvert: remove unused ret variable
+
+2015-10-30 14:40:35 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglslstage.h:
+	  glslstage: remove typedefs from the header
+	  They are already defined in the forward decleration header and defining them
+	  more than once will give an error with OSX's clang about typedef redefinition
+	  being a C11 feature.
+
+2015-10-30 14:38:05 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	  glcolorconvert: follow the correct texture target names
+
+2015-10-30 01:42:42 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglupload.c:
+	  glupload: explicitly configure the texture target on the gl buffer pool
+	  If we don't, then the pool could end up allocating 2D textures when the
+	  caps explictly state they should be rectangle textures.
+
+2015-10-30 01:27:36 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglbufferpool.c:
+	* gst-libs/gst/gl/gstglmemory.c:
+	* gst-libs/gst/gl/gstglmemory.h:
+	  glbufferpool: add bufferpool options for the various texture targets
+	  This was chosen over relying solely on the caps as glupload needs to propose an
+	  allocation and set the texture target based on the output caps.  Setting the
+	  caps in the config is currently pointless as they are overwritten in a lot of
+	  element's decide_allocation functions.
+	  This provides a mechanism for the buffer pool to be configured for a certain
+	  texture target when none has been configured.
+
+2015-10-29 13:04:31 +1100  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/gstglcolorconvertelement.c:
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	* gst-libs/gst/gl/gstglcolorconvert.h:
+	* sys/applemedia/corevideotexturecache.h:
+	* sys/applemedia/corevideotexturecache.m:
+	* sys/applemedia/vtdec.c:
+	  glcolorconvert: add support for converting texture targets
+	  Solved with a simple shader templating mechanism and string replacements
+	  of the necessary sampler types/texture accesses and texture coordinate
+	  mangling for rectangular and external-oes textures.
+
+2015-10-29 00:44:26 +1100  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/caopengllayersink.m:
+	* ext/gl/gstglcolorconvertelement.c:
+	* ext/gl/gstglimagesink.c:
+	* ext/gl/gstgloverlay.c:
+	* ext/gl/gstglstereomix.c:
+	* ext/gl/gstgltestsrc.c:
+	* gst-libs/gst/gl/gstglbufferpool.c:
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	* gst-libs/gst/gl/gstglcolorconvert.h:
+	* gst-libs/gst/gl/gstglfilter.c:
+	* gst-libs/gst/gl/gstglmemory.c:
+	* gst-libs/gst/gl/gstglmemory.h:
+	* gst-libs/gst/gl/gstgloverlaycompositor.c:
+	* gst-libs/gst/gl/gstglupload.c:
+	* gst-libs/gst/gl/gstgluploadmeta.c:
+	* gst-libs/gst/gl/gstglviewconvert.c:
+	* sys/applemedia/corevideotexturecache.m:
+	* tests/check/libs/gstglmemory.c:
+	  glmemory: add support for rectangle textures
+	  Add the various tokens/strings for the differnet texture types (2D, rect, oes)
+	  Changes the GLmemory api to include the GstGLTextureTarget in all relevant
+	  functions.
+	  Update the relevant caps/templates for 2D only textures.
+
+2015-10-30 01:45:13 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.h:
+	  glcolorconvert: order the caps template so that RGBA is first
+	  glcolorconvert ! glcolorconvert would sometimes negotiated RGB
+	  (the first list entry) otherwise.
+
+2015-10-30 01:16:02 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstgl_fwd.h:
+	* gst-libs/gst/gl/gstglbufferpool.h:
+	  glbufferpool: move typedef's into the forward decleration file
+	  Otherwise, for example, clang will warn about typedef redefinitions
+	  being a C11 feature.
+
+2015-10-16 18:36:20 +0100  Florin Apostol <florin.apostol@oregan.net>
+
+	* tests/check/elements/fake_http_src.c:
+	  tests: fixed fake soup http src plugin
+	  The soup http src changed the way it interprets the seek segment stop value.
+	  Previously it was inclusive, now it is not (see commit
+	  21c6da6764c0cd015e9f3c5eecba36e297187deb,
+	  bug https://bugzilla.gnome.org/show_bug.cgi?id=748316)
+	  Updated fake soup http src to also consider segment stop not inclusive.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756322
+
+2015-10-09 14:10:52 +0100  Florin Apostol <florin.apostol@oregan.net>
+
+	* tests/check/Makefile.am:
+	* tests/check/elements/dash_demux.c:
+	  adaptivedemux: tests: added unit test for adaptivedemux
+	  Created a unit test for dashdemux. It relies on a fake SOUP HTTP src plugin
+	  that will feed data to dashdemux. The test controls the data to be
+	  generated and checks the correct data was received for each expected
+	  stream.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756322
+
+2015-10-09 21:23:20 +0100  Alex Ashley <bugzilla@ashley-family.net>
+
+	* tests/check/elements/fake_http_src.c:
+	* tests/check/elements/fake_http_src.h:
+	  tests: added fake http src plugin
+	  Added a fake http src plugin capable of generating data buffers for a
+	  request of a http url. Can be used in tests to simulate http accesses.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756322
+
+2015-07-07 15:38:08 +0100  Alex Ashley <bugzilla@ashley-family.net>
+
+	* ext/dash/gstdashdemux.c:
+	* ext/dash/gstdashdemux.h:
+	* ext/dash/gstmpdparser.c:
+	* ext/dash/gstmpdparser.h:
+	* tests/check/elements/dash_mpd.c:
+	  dashdemux: provide a default suggestedPresentationDelay
+	  If MPD@suggestedPresentationDelay is not present in the manifest,
+	  dashdemux selects the fragment closest to the most recently generated
+	  fragment. This causes a playback issue because this choice does not allow
+	  the DASH client to build up any buffer of downloaded fragments without
+	  pausing playback. This is because by definition new fragments appear on
+	  the server in real-time (e.g. if segment duration is 4 seconds, a new
+	  fragment will appear on the server every 4 seconds). If the starting
+	  playback position was n*segmentDuration seconds behind "now", the DASH
+	  client could download up to 'n' fragments faster than realtime before it
+	  reached the point where it needed to wait for fragments to appear on the
+	  server.
+	  The MPD@suggestedPresentationDelay attribute allows a content publisher
+	  to provide a suggested starting position that is behind the current
+	  "live" position.
+	  If the MPD@suggestedPresentationDelay attribute is not present, provide
+	  a suitable default value as a property of the dashdemux element. To
+	  allow the default presentation delay to be specified either using
+	  fragments or seconds, the property is a string that contains a number
+	  and a unit (e.g. "10 seconds", "4 fragments", "2500ms").
 
 2015-10-29 15:02:38 +0200  Sreerenj Balachandran <sreerenj.balachandran@intel.com>
 
@@ -305,6 +3556,196 @@
 	  Differentiate the vp8/vp9 bitstream based on fourcc.
 	  https://bugzilla.gnome.org/show_bug.cgi?id=757251
 
+2015-09-09 14:09:43 +0100  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/dash/gstdashdemux.c:
+	  dashdemux: improve detection of stream language
+	  Improved the detection of stream's language if the AdaptationSet
+	  contains more than 1 ContentComponent
+	  https://bugzilla.gnome.org/show_bug.cgi?id=752367
+
+2015-10-29 12:04:31 +0000  Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+	* ext/dash/gstmpdparser.c:
+	* tests/check/elements/dash_mpd.c:
+	  dash_mpd: restrict segment template format strings to %0[0-9]*d as per spec
+	  https://bugzilla.gnome.org/show_bug.cgi?id=751735
+
+2015-09-09 12:36:10 +0100  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/dash/gstmpdparser.c:
+	* tests/check/elements/dash_mpd.c:
+	  dashdemux: segment template parsing: added support for %d
+	  Added support for %d in template identifier.
+	  Added testcases for %d, %3d, %0-4d identifier formats.
+
+2015-10-29 11:54:34 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/dash/gstmpdparser.c:
+	* tests/check/elements/dash_mpd.c:
+	  dashdemux: corrected parsing of segment templates
+	  Corrected the parsing of a segment template string.
+	  Added unit tests to test the segment template parsing.
+	  All reported problems are now correctly handled.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=751735
+
+2015-10-29 11:17:48 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+	  dahsdemux: task is signaled to stop without stop condition being set
+	  The gst_adaptive_demux_stream_free function is trying to stop the stream's
+	  download task. For this, it signals the task. But it fails to also set the
+	  stream->download_finished = TRUE, so the task will go back to sleep and
+	  only exit when the download is finished.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755121
+
+2015-10-28 17:02:51 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/dash/gstmpdparser.c:
+	* tests/check/elements/dash_mpd.c:
+	  dashdemux: fixed crash when segment timeline list is greater than segment url list
+	  When building the media segment list using a SegmentList node, the
+	  gst_mpd_client_setup_representation function will iterate through the
+	  list of S nodes and will expect to find a matching SegmentUrl node. If
+	  one does not exist, the code made an illegal memory access.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=752496
+
+2015-09-11 10:59:15 +0100  Florin Apostol <florin.apostol@oregan.net>
+
+	* tests/check/elements/dash_mpd.c:
+	  dashdemux: unit test for missing profiles
+
+2015-09-11 10:57:26 +0100  Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+	* ext/dash/gstmpdparser.c:
+	  mpdparser: do not dereference profiles is absent
+	  These are used to apply restrictions on what the MPD file may
+	  use, so no profile means no restrictions.
+	  Besides, nothing actually uses the profiles (yet) anyway.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=750869
+
+2015-09-16 16:46:29 +0100  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/hls/gsthlsdemux.c:
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.h:
+	  adaptivedemux: fixed multithread support
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755169
+
+2015-10-28 16:31:39 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/dash/gstmpdparser.c:
+	* tests/check/elements/dash_mpd.c:
+	  dashdemux: parser rejects negative values for mediaPresentationDuration
+	  https://bugzilla.gnome.org/show_bug.cgi?id=752326
+
+2015-10-28 16:24:01 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/dash/gstmpdparser.c:
+	* tests/check/elements/dash_mpd.c:
+	  dashdemux: corrected parsing of negative values into unsigned data
+	  https://bugzilla.gnome.org/show_bug.cgi?id=752429
+
+2015-09-17 20:18:52 +0200  Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+
+	* gst-libs/gst/codecparsers/gsth264parser.c:
+	  codecparser: h264: initialize parsing structures
+	  Initialize to 0 these parse structures before filling them: GstH264SEIMessage,
+	  GstH264NalUnit, GstH264PPS, GstH264SPS and GstH264SliceHdr.
+	  When calling the functions which fill those structures, they may fail, leaving
+	  unitialized those structures. This situation may lead to future problems, such
+	  as a segmentation fault when freeing, for example.
+	  This patch initializes to zero these structures, before filling them.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755161
+
+2015-09-18 10:09:26 +0200  Víctor Manuel Jáquez Leal <vjaquez@igalia.com>
+
+	* gst-libs/gst/codecparsers/gsth265parser.c:
+	  codecparser: h265: initialize parsing structures
+	  Initialize to 0 these parse structures before filling them: GstH265SEIMessage,
+	  GstH265NalUnit, GstH265VPS, GstH265PPS, GstH265SPS and GstH265SliceHdr.
+	  When calling the functions which fill those structures, they may fail, leaving
+	  unitialized those structures. This situation may lead to future problems, such
+	  as a segmentation fault when freeing, for example.
+	  This patch initializes to zero these structures, before filling them.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755161
+
+2015-10-26 19:58:04 -0400  Olivier Crête <olivier.crete@collabora.com>
+
+	* gst/audiomixer/gstaudiomixer.c:
+	  liveadder: Make latency property be a uint in millisecs
+	  This restores roughly the same behaviour as the old liveadder element.
+	  Except that the latency now also includes the output-buffer-duration.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757050
+
+2015-09-08 14:00:54 +0100  Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+	* ext/dash/gstmpdparser.c:
+	  mpdparser: forbid negative values for duration
+	  https://bugzilla.gnome.org/show_bug.cgi?id=752492
+
+2015-10-28 15:39:07 +0000  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/dash/gstmpdparser.c:
+	* tests/check/elements/dash_mpd.c:
+	  dashdemux: parser rejects XMLs with negative period duration
+	  https://bugzilla.gnome.org/show_bug.cgi?id=752329
+
+2015-10-28 15:34:29 +0000  Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+	* ext/dash/gstmpdparser.c:
+	* tests/check/elements/dash_mpd.c:
+	  mpdparser: check segment lists have either duration or timeline
+	  And add error checking along the way.
+	  Add duration where appropriate so unit tests still pass.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=751650
+
+2015-09-29 16:17:03 +0100  Vincent Penquerc'h <vincent.penquerch@collabora.co.uk>
+
+	* ext/dash/gstmpdparser.c:
+	* tests/check/elements/dash_mpd.c:
+	  mpdparser: validate representation set identifier
+	  It must have no whitespace, and must comply with RFC 1738 when
+	  used to build a URL.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=750852
+
+2015-10-28 14:41:54 +0000  Julien Isorce <j.isorce@samsung.com>
+
+	* gst-libs/gst/gl/gstglslstage.c:
+	  glslstage: initialize output params to 0 before calling gl functions
+	  The client side API of the Chromium's GPU Process has asserts
+	  in debug mode that check that output params are initialized to 0.
+
+2015-10-27 16:32:48 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfmux.c:
+	  mxfmux: Remove some dead code that could never be called
+	  Coverity CIDs #1328818, #1328819, #1328820.
+
+2015-10-27 00:36:41 +1100  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/Makefile.am:
+	* ext/gl/gstopengl.c:
+	  opengl: build/provide glstereomix/split on gles only systems
+
+2015-10-26 16:51:06 +0100  George Kiagiadakis <george.kiagiadakis@collabora.com>
+
+	* gst/geometrictransform/geometricmath.c:
+	* gst/geometrictransform/geometricmath.h:
+	* gst/geometrictransform/gstbulge.c:
+	* gst/geometrictransform/gstcircle.c:
+	* gst/geometrictransform/gstgeometrictransform.c:
+	* gst/geometrictransform/gstkaleidoscope.c:
+	* gst/geometrictransform/gstmarble.c:
+	* gst/geometrictransform/gstmarble.h:
+	* gst/geometrictransform/gstsquare.c:
+	* gst/geometrictransform/gststretch.c:
+	  geometrictransform: rename gemetric math functions to have their symbols namespaced
+	  Otherwise those symbols can conflict with external libraries when
+	  linking everything statically for mobile targets.
+	  Use the gst_gm_ prefix, short for gst geometric math.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756882
+
 2015-10-26 15:30:08 +0100  George Kiagiadakis <george.kiagiadakis@collabora.com>
 
 	* ext/wayland/gstwaylandsink.c:
@@ -321,6 +3762,28 @@
 	  It's probably better to avoid chasing hidden refcounts.
 	  https://bugzilla.gnome.org/show_bug.cgi?id=756567
 
+2015-10-26 18:26:18 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	  glcolorconvert: allow outputting multiple textures for gles3 contexts
+	  the USING_GLES2 includes all GLES3 contexts as well which does support
+	  drawing to multiple buffers.  Instead make or decision solely based on
+	  whether glDrawBuffers is available or not.
+
+2015-10-26 17:36:21 +1100  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/gstopengl.c:
+	* gst-libs/gst/gl/gstglviewconvert.c:
+	  glviewconvert: expose the element on gles2 platforms
+	  We can do everything with gles3 however gles2 restricts us not allowing
+	  separated or frame-by-frame multiview modes due to multiple draw buffers.
+
+2015-10-25 01:19:33 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* tests/check/elements/hlsdemux_m3u8.c:
+	  tests: hlsdemux_m3u: add test for master playlist with missing variant list uri
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756861
+
 2015-10-20 09:13:04 +0100  André Draszik <git@andred.net>
 
 	* ext/hls/m3u8.c:
@@ -337,46 +3800,331 @@
 	  as needed.
 	  https://bugzilla.gnome.org/show_bug.cgi?id=756861
 
+2015-09-04 11:29:08 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/gsthlsdemux.c:
+	  hlsdemux: change dispose function to finalize
+
+2015-08-30 21:35:02 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/gsthlsdemux.c:
+	  hlsdemux: remove helper function only used once
+
+2015-08-30 17:41:23 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/gsthlsdemux.c:
+	  hlsdemux: remove deprecated 'fragments-cache' property
+	  It's been non-functional for two cycles now, let's
+	  get rid of it.
+
+2015-09-02 16:40:17 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/m3u8.c:
+	  hlsdemux: m3u8: move file lookup by sequence directly into code
+	  Nicer to read, two lines of code less, and also the callback
+	  function should've been a GCompareFunc that returns a gint
+	  and not a boolean (it did work correctly, was just confusing).
+
+2015-09-01 12:48:38 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/m3u8.c:
+	* ext/hls/m3u8.h:
+	  hlsdemux: m3u8: clean-up: remove unused argument in function call
+
+2015-08-30 17:22:19 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/m3u8.h:
+	  hlsdemux: m3u8: clean-up: reindent header for better readability
+	  And remove duplicate define.
+
+2015-10-23 18:58:41 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfmux.c:
+	  mxfmux: Remove empty set/get_property()
+	  We can add them again if we ever add properties.
+
+2015-10-23 18:38:33 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/Makefile.am:
+	* gst/mxf/mxfmux.c:
+	* gst/mxf/mxfmux.h:
+	  mxfmux: Port to GstAggregator
+
+2015-10-22 19:20:24 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfmux.c:
+	  mxfmux: Set GC essence element UL version to 0x01
+	  ffmpeg otherwise rejects it and the spec is not 100% clear about that.
+
 2015-10-20 17:09:22 +0200  Santiago Carot-Nemesio <sancane@gmail.com>
 
 	* ext/srtp/gstsrtp.c:
 	  srtp: Fix critical warning trying to retrieve SSRC from a non fb message
 	  https://bugzilla.gnome.org/show_bug.cgi?id=756876
 
-2015-10-16 00:23:56 +0200  Miguel París Díaz <mparisdiaz@gmail.com>
+2015-10-22 19:24:34 +0300  Sebastian Dröge <sebastian@centricular.com>
 
-	* ext/srtp/gstsrtpdec.c:
-	  srtpdec: skip padding when mapping RTP packets
-	  https://bugzilla.gnome.org/show_bug.cgi?id=756653
+	* gst/mxf/Makefile.am:
+	  mxf: Reorder CFLAGS and LIBS
 
-2015-10-14 10:31:23 +0300  Sebastian Dröge <sebastian@centricular.com>
+2015-10-23 15:42:24 +0300  Sebastian Dröge <sebastian@centricular.com>
 
-	* ext/dash/gstmpdparser.c:
-	  mpdparser: Set default last_byte_pos to -1
-	  The value is optional in the range, and if it is absent it means we should
-	  download until the end of stream. Not until position 0.
-	  https://bugzilla.gnome.org/show_bug.cgi?id=748316
+	* gst-libs/gst/base/gstaggregator.c:
+	* gst-libs/gst/base/gstaggregator.h:
+	  aggregator: Add create_new_pad() vfunc to allow subclasses to override the default behaviour
+	  Not all aggregator subclasses will have a single pad template called sink_%u
+	  and might do something special depending on what the application requests.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=757018
 
-2015-10-14 19:32:07 +0300  Sebastian Dröge <sebastian@centricular.com>
+2015-10-21 19:00:41 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfmux.c:
+	  mxfmux: Set KAG size to 1
+	  We're not aligning our output in any way, and 0 is invalid.
+
+2015-10-21 18:58:06 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfmux.c:
+	  mxfmux: Don't let the header partition's prev_partition point forward to the footer
+
+2015-10-21 18:32:09 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxftypes.c:
+	  mxftypes: Fix generation of operational pattern UL
+
+2015-10-21 18:31:43 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* tests/examples/mxf/mxfdemux-structure.c:
+	  mxfdemux-structure: Sync fakesink state with the bin to make the application work at all
+
+2015-10-21 18:20:16 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfmpeg.c:
+	  mxfmpeg: h264 is always byte-stream inside MXF
+
+2015-10-21 18:06:11 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* tests/check/elements/mxfmux.c:
+	* tests/check/pipelines/mxf.c:
+	  mxf: Add unit tests for H264/PCM
+
+2015-10-21 17:47:00 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfmux.c:
+	  mxfmux: Don't leak SEEK events when dropping them
+
+2015-10-21 17:21:09 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfvc3.c:
+	  mxfvc3: The wrapping is the 15th byte of the essence container UL, not the 16th
+	  In other mappings it is the 16th though.
+
+2015-10-21 17:11:03 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfdemux.c:
+	  mxfdemux: If seeking to the remaining parts of the file fails on EOS, consider the stream done
+	  Without this we would run this while loop forever, always seeking again for
+	  the same stream.
+
+2015-10-21 15:07:23 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* tests/check/elements/mxfmux.c:
+	* tests/check/pipelines/mxf.c:
+	  mxf: Properly enable unit tests again
+
+2015-10-21 01:22:11 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxf.c:
+	  mxf: Re-enable mxfmux element
+
+2015-10-21 01:21:37 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfjpeg2000.c:
+	  mxfjpeg2000: Fix caps
+	  There is no fields field anymore.
+
+2015-10-21 01:17:04 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfmux.c:
+	  mxfmux: Don't fail SEGMENT events
+
+2015-10-21 01:02:46 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfmux.c:
+	  mxfmux: Push stream-start and caps event before segment event
+	  And don't push the caps event during instance initialization already.
+
+2015-10-21 00:45:19 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/mxf/mxfaes-bwf.c:
+	  mxfaes-bwf: Format is unsigned if it's 1 byte per channel
+	  ... not 1 byte per block.
+
+2015-10-21 16:51:10 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gsthanddetect.cpp:
+	  opencv: handdetect: no need to get a writable buffer
+	  No need to get a writable buffer inside cv_trans_func of opencv video
+	  filter. GstBaseTransform takes care of this.
+
+2015-10-21 14:35:11 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* common:
+	  Automatic update of common submodule
+	  From b99800a to b319909
+
+2015-10-20 17:29:42 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* configure.ac:
+	  Use new GST_ENABLE_EXTRA_CHECKS #define
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756870
+
+2015-10-21 14:26:01 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* README:
+	* common:
+	  Automatic update of common submodule
+	  From 9aed1d7 to b99800a
+
+2015-10-21 05:34:18 +1100  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/gstglfiltershader.c:
+	  glshaderelement: free the vertex and fragment strings on finalize
+	  Fixes a memory leak when using the vertex/fragment properties.
+
+2015-10-21 05:33:13 +1100  Matthew Waters <matthew@centricular.com>
 
 	* sys/androidmedia/gstamcvideodec.c:
-	  amcvideodec: Properly forward the return value of gst_video_decoder_negotiate()
-	  https://bugzilla.gnome.org/show_bug.cgi?id=756578
+	  androidmedia: fix build errors
+	  printf %lld instead of G_GINT64_FORMAT.
+	  Double ret variable declaration.
 
-2015-10-14 19:24:22 +0300  Sebastian Dröge <sebastian@centricular.com>
+2015-10-21 05:00:11 +1100  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/gstglfiltershader.c:
+	  glshaderelement: remove unneeded reference to <gst/gl/gstglshadervariables.h>
+
+2015-10-21 04:44:50 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/egl/gsteglimagememory.c:
+	* gst-libs/gst/gl/egl/gstglcontext_egl.c:
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	* gst-libs/gst/gl/gstglcontext.c:
+	  gl: fix usage of string.h and stdio.h functions without including the headers
+	  e.g:
+	  gstglcontext_egl.c:613:7: error: implicit declaration of function 'strcmp'
+	  [-Werror=implicit-function-declaration]
+	  if (strcmp (G_MODULE_SUFFIX, "so") == 0)
+
+2015-10-16 07:03:06 +1100  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/gstglimagesink.c:
+	  glimagesink: create a context in NULL_READY
+	  So that it's possible for decoders et al. to request the OpenGL context
+	  in their READY_PAUSED transition with decodebin/playbin.
+
+2015-10-16 00:34:22 +1100  Matthew Waters <matthew@centricular.com>
+
+	* sys/androidmedia/gstamcvideodec.c:
+	* sys/androidmedia/gstamcvideodec.h:
+	  amcviddec: use gstcontext to retreive the OpenGL context
+
+2015-04-20 13:46:58 +0200  Matthieu Bouron <matthieu.bouron@collabora.com>
 
 	* sys/androidmedia/gstamc.c:
+	* sys/androidmedia/gstamc.h:
 	* sys/androidmedia/gstamcvideodec.c:
-	  amcvideodec: Implement support for COLOR_QCOM_FormatYVU420SemiPlanar32mMultiView for decoding
-	  https://bugzilla.gnome.org/show_bug.cgi?id=756578
+	  androidmedia: Only allow GL output if the decoder has unknown color formats
+	  If GST_AMC_IGNORE_UNKNOWN_COLOR_FORMATS is set to yes, non-GL output
+	  is still allowed.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=731204
 
-2015-10-14 18:35:00 +0200  plamot <pierre.lamot@openwide.fr>
+2014-06-05 10:33:56 +0200  Matthieu Bouron <matthieu.bouron@collabora.com>
 
-	* sys/dshowvideosink/dshowvideosink.cpp:
-	  dshowvideosink: Fix 64bit compatibility issue
-	  SetWindowLong works only for 32 bit systems, thus windows events (move/resize)
-	  where not interpreted on 64 bit systems
-	  https://bugzilla.gnome.org/show_bug.cgi?id=756617
+	* sys/androidmedia/Makefile.am:
+	* sys/androidmedia/gstamc.c:
+	* sys/androidmedia/gstamc.h:
+	* sys/androidmedia/gstamc2dtexturerenderer.c:
+	* sys/androidmedia/gstamc2dtexturerenderer.h:
+	* sys/androidmedia/gstamcaudiodec.c:
+	* sys/androidmedia/gstamcsurface.c:
+	* sys/androidmedia/gstamcsurface.h:
+	* sys/androidmedia/gstamcsurfacetexture.c:
+	* sys/androidmedia/gstamcsurfacetexture.h:
+	* sys/androidmedia/gstamcvideodec.c:
+	* sys/androidmedia/gstamcvideodec.h:
+	* sys/androidmedia/gstamcvideoenc.c:
+	* sys/androidmedia/gstjniutils.c:
+	* sys/androidmedia/gstjniutils.h:
+	* sys/androidmedia/org/freedesktop/gstreamer/androidmedia/GstAmcOnFrameAvailableListener.java:
+	  androidmedia: Add support for GL output in amcvideodec
+	  https://bugzilla.gnome.org/show_bug.cgi?id=731204
+
+2015-04-30 12:33:58 +0200  Matthieu Bouron <matthieu.bouron@collabora.com>
+
+	* sys/androidmedia/gstamcvideodec.c:
+	  androidmedia: Do not flush codec if it is not started
+
+2015-04-13 13:10:10 +0200  Matthieu Bouron <matthieu.bouron@gmail.com>
+
+	* sys/androidmedia/gstjniutils.c:
+	  androidmedia: Allow object to be NULL in gst_amc_jni_*unref functions
+
+2015-03-13 16:13:08 +0100  Edward Hervey <bilboed@bilboed.com>
+
+	* sys/androidmedia/gstamc.c:
+	* sys/androidmedia/gstamcvideoenc.c:
+	  androidmedia: Fix debug statement (%d for a gsize argument)
+
+2015-04-02 16:28:14 +0200  Matthieu Bouron <matthieu.bouron@gmail.com>
+
+	* sys/androidmedia/gstamcvideodec.c:
+	  androidmedia: Improve color format debug messages
+
+2015-03-31 16:24:40 +0200  Matthieu Bouron <matthieu.bouron@gmail.com>
+
+	* sys/androidmedia/gstamc.c:
+	  androidmedia: Improve debug messages
+
+2015-03-31 17:48:59 +0200  Matthieu Bouron <matthieu.bouron@gmail.com>
+
+	* sys/androidmedia/gstamc.c:
+	  androidmedia: Do not warn we do not support COLOR_FormatSurface
+
+2015-10-21 03:59:33 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/Makefile.am:
+	* gst-libs/gst/gl/gl.h:
+	* gst-libs/gst/gl/gstglshadervariables.c:
+	* gst-libs/gst/gl/gstglshadervariables.h:
+	  gl: remove unneeded shader variable parsing code
+
+2015-10-21 03:23:30 +1100  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/gstglfiltershader.c:
+	* ext/gl/gstglfiltershader.h:
+	  glshaderelement: implement setting arbitrary uniforms
+	  Currently float and int are supported by default. vec2, vec3, vec4
+	  and mat4 are supported if graphene is used.  Of course if one wants
+	  to set custom uniforms they can also be set using the create-shader
+	  signal.
+
+2015-10-20 12:24:11 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gsthanddetect.cpp:
+	  opencv: handdetect: free best_r with delete
+	  best_r is a cv::Rect, so it should be freed with delete and not with
+	  g_free()
+
+2015-10-20 12:08:59 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gstmotioncells.cpp:
+	  opencv: motioncells: remove unnecessary check
+	  We know that the gchar arrays contain at least one string. Furthermore,
+	  g_strfreev() checks if the array is NULL and simply returns if it is.
+	  Hence, there is no need to check if the array is empty before using
+	  g_strfreev().
+	  CID 1327412-1327415
 
 2015-07-08 17:17:12 +0200  Edward Hervey <edward@centricular.com>
 
@@ -389,6 +4137,54 @@
 	  was previously outputted.
 	  https://bugzilla.gnome.org/show_bug.cgi?id=752132
 
+2015-10-14 18:35:00 +0200  plamot <pierre.lamot@openwide.fr>
+
+	* sys/dshowvideosink/dshowvideosink.cpp:
+	  dshowvideosink: Fix 64bit compatibility issue
+	  SetWindowLong works only for 32 bit systems, thus windows events (move/resize)
+	  where not interpreted on 64 bit systems
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756617
+
+2015-10-19 15:15:30 +1100  Matthew Waters <matthew@centricular.com>
+
+	* docs/libs/gst-plugins-bad-libs-sections.txt:
+	* ext/gl/gstglimagesink.c:
+	* ext/gtk/gtkgstglwidget.c:
+	* ext/qt/qtitem.cc:
+	* gst-libs/gst/gl/android/gstglwindow_android_egl.h:
+	* gst-libs/gst/gl/cocoa/gstglcontext_cocoa.h:
+	* gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h:
+	* gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h:
+	* gst-libs/gst/gl/eagl/gstglcontext_eagl.h:
+	* gst-libs/gst/gl/eagl/gstglwindow_eagl.h:
+	* gst-libs/gst/gl/egl/gstglcontext_egl.c:
+	* gst-libs/gst/gl/egl/gstglcontext_egl.h:
+	* gst-libs/gst/gl/gstglcontext.c:
+	* gst-libs/gst/gl/gstglcontext.h:
+	* gst-libs/gst/gl/gstgldisplay.c:
+	* gst-libs/gst/gl/gstglshader.c:
+	* gst-libs/gst/gl/gstglshader.h:
+	* gst-libs/gst/gl/gstglsl.c:
+	* gst-libs/gst/gl/gstglslstage.c:
+	* gst-libs/gst/gl/gstglsyncmeta.c:
+	* gst-libs/gst/gl/gstglviewconvert.c:
+	* gst-libs/gst/gl/gstglwindow.c:
+	* gst-libs/gst/gl/gstglwindow.h:
+	* gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h:
+	* gst-libs/gst/gl/win32/gstglcontext_wgl.h:
+	* gst-libs/gst/gl/win32/gstglwindow_win32.h:
+	* gst-libs/gst/gl/win32/gstglwindow_win32_egl.h:
+	* gst-libs/gst/gl/x11/gstglcontext_glx.h:
+	* gst-libs/gst/gl/x11/gstglwindow_x11.h:
+	  gl: be consistent in gobject boilerpate
+	  GST_GL_IS_* vs GST_IS_GL_*
+	  git grep -l 'GST_GL_IS_' | xargs sed -i 's/GST_GL_IS_/GST_IS_GL_/g'
+
+2015-10-19 15:02:10 +1100  Matthew Waters <matthew@centricular.com>
+
+	* .gitignore:
+	  add glliveshader program to .gitignore
+
 2015-10-17 12:48:11 -0700  Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
 
 	* gst/pnm/gstpnmdec.c:
@@ -416,6 +4212,23 @@
 	  for the next frame, avoiding failures like:
 	  https://bugzilla.gnome.org/show_bug.cgi?id=756563
 
+2015-10-17 15:26:46 +1100  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/gstglfiltershader.c:
+	* ext/gl/gstglfiltershader.h:
+	* tests/examples/gtk/glliveshader.c:
+	  glshaderelement: implement on-demand create-shader signalling
+	  One may not have an GstGLContext available or current in the thread where one
+	  would need to update the shader.  Support this by signalling create-shader
+	  whenever the one-shot 'update-shader' is set to TRUE.
+
+2015-10-17 02:42:47 +1100  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/caopengllayersink.m:
+	  gl/calayer: don't leak a gl shader object
+	  We will always overwrite the ca_sink->redisplay_shader without freeing the
+	  object.
+
 2015-10-17 02:40:50 +1100  Matthew Waters <matthew@centricular.com>
 
 	* ext/gtk/gstgtkbasesink.c:
@@ -424,12 +4237,164 @@
 	  callback.
 	  https://bugzilla.gnome.org/show_bug.cgi?id=755969
 
+2015-10-17 01:08:29 +1100  Matthew Waters <matthew@centricular.com>
+
+	* tests/examples/gtk/Makefile.am:
+	* tests/examples/gtk/glliveshader.c:
+	  gl/examples: add a live shader demo using the new GstGLSLStage
+	  Implemented with videotestsrc ! glshader ! glupload ! gtkglsink
+	  Errors on an invalid shader compilation are ignored however any error
+	  provided by the glsl compiler is printed to stdout.
+
+2015-10-16 00:23:56 +0200  Miguel París Díaz <mparisdiaz@gmail.com>
+
+	* ext/srtp/gstsrtpdec.c:
+	  srtpdec: skip padding when mapping RTP packets
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756653
+
+2015-10-14 19:32:07 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* sys/androidmedia/gstamcvideodec.c:
+	  amcvideodec: Properly forward the return value of gst_video_decoder_negotiate()
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756578
+
+2015-10-14 19:24:22 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* sys/androidmedia/gstamc.c:
+	* sys/androidmedia/gstamcvideodec.c:
+	  amcvideodec: Implement support for COLOR_QCOM_FormatYVU420SemiPlanar32mMultiView for decoding
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756578
+
+2015-10-16 02:57:19 +1100  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglslstage.c:
+	  glslstage: add brackets around pointer dereference referencing an array
+	  While technically, i is always 0 and *vertex_sources[i++] is equivalant
+	  to (*vertex_sources)[i++].  Be future-proof in the case of code
+	  moves/changes/etc.
+	  CID 1327406
+
+2015-10-15 23:47:11 +1100  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/caopengllayersink.m:
+	  gl/caopengllayersink: port to new GstGLShader API
+	  fixes build error:
+	  "undefined symbols for architecture:
+	  gst_gl_shader_compile_with_default_vf_and_check"
+
+2015-10-15 22:42:26 +1100  Matthew Waters <matthew@centricular.com>
+
+	* tests/check/libs/gstglcontext.c:
+	  gl/tests: port glcontext test to opengl
+	  Now uses vao's and vbo's when possible like the rest of the gstgl library.
+
+2015-09-04 16:16:51 +1000  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/gstglfiltershader.c:
+	* ext/gl/gstglfiltershader.h:
+	  glshader: port element to GstGLSLStage
+	  - Provide a shader property to set the full shader pipeline
+	  - Provide vertex and fragment properties for just providing simple
+	  shader sources.
+
+2015-09-04 16:02:32 +1000  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/effects/gstgleffectidentity.c:
+	* ext/gl/gstglcolorscale.c:
+	* ext/gl/gstgldifferencematte.c:
+	* ext/gl/gstgleffects.c:
+	* ext/gl/gstglimagesink.c:
+	* ext/gtk/gtkgstglwidget.c:
+	* gst-libs/gst/gl/gstgloverlaycompositor.c:
+	* gst-libs/gst/gl/gstglshader.c:
+	* gst-libs/gst/gl/gstglshader.h:
+	* gst-libs/gst/gl/gstglutils.c:
+	* tests/check/libs/gstglcontext.c:
+	* tests/check/libs/gstglupload.c:
+	  glshader: port to using GstGLSLStage objects for string management
+	  A GstGLShader is now simply a collection of stages that are
+	  compiled and linked together into a program.  The uniform/attribute
+	  interface has remained the same.
+
+2015-09-04 14:36:47 +1000  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/Makefile.am:
+	* gst-libs/gst/gl/gl.h:
+	* gst-libs/gst/gl/gstgl_fwd.h:
+	* gst-libs/gst/gl/gstglslstage.c:
+	* gst-libs/gst/gl/gstglslstage.h:
+	  glsl: add a shader stage object GstGLSLStage
+	  Represents a stage (vertex, geometry, fragment, etc) in the shader
+	  pipeline.
+
+2015-09-04 00:09:09 +1000  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglshadervariables.h:
+	  gl/shader/variables: include generic gl.h header
+	  Otherwise we may miss some forward declarations
+	  Fixes build error: undefined reference to GstGLSLStage
+
+2015-08-20 15:11:06 +1000  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/Makefile.am:
+	* gst-libs/gst/gl/gstglsl.c:
+	* gst-libs/gst/gl/gstglsl.h:
+	* gst-libs/gst/gl/gstglsl_private.h:
+	* tests/check/Makefile.am:
+	* tests/check/libs/.gitignore:
+	* tests/check/libs/gstglsl.c:
+	  gl: add some GLSL utility functions
+	  Specifically parsing/setting GLSL versions and the shader related
+	  function table.
+
 2015-10-14 22:51:29 +0200  Paul Arzelier <paul.arzelier@free.fr>
 
 	* ext/dtls/gstdtlscertificate.c:
 	  dtls: Fix name conflict with openssl on win32
 	  https://bugzilla.gnome.org/show_bug.cgi?id=756592
 
+2015-09-04 18:40:18 -0300  Thiago Santos <thiagoss@osg.samsung.com>
+
+	* ext/hls/m3u8.c:
+	  hls: if media sequence is not specified, use 0
+	  Allows playlists that are missing the mediasequence information to
+	  be correctly parsed. If the playlist was updated without reseting
+	  the mediasequence it would constantly increase over subsequent updates,
+	  leading to issues during playback.
+
+2015-08-30 14:56:57 +0200  George Kiagiadakis <george.kiagiadakis@collabora.com>
+
+	* ext/wayland/gstwaylandsink.c:
+	  waylandsink: fix fallback buffer allocation
+	  Copy-paste mistake; the wl_buffer was attached on the wrong buffer...
+
+2015-08-30 14:55:11 +0200  George Kiagiadakis <george.kiagiadakis@collabora.com>
+
+	* ext/wayland/gstwaylandsink.c:
+	* ext/wayland/wldisplay.c:
+	* ext/wayland/wldisplay.h:
+	  waylandsink: rename GstWlDisplay::formats array to shm_formats
+	  These formats are specific to the wl_shm interface. We are going
+	  to add dmabuf formats later as well.
+
+2015-08-29 22:29:17 +0200  George Kiagiadakis <george.kiagiadakis@collabora.com>
+
+	* ext/wayland/Makefile.am:
+	* ext/wayland/wlshmallocator.c:
+	* ext/wayland/wlshmallocator.h:
+	  waylandsink: replace the custom GstWlShmMemory with GstFdMemory
+
+2015-10-14 19:53:34 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* po/POTFILES.in:
+	  po: Update POTFILES.in for OpenCV C++ file rename
+
+2015-10-14 17:41:05 +0200  Edward Hervey <edward@centricular.com>
+
+	* ext/hls/m3u8.c:
+	  hls: Allow debugging of the playlist
+	  Helps debugging issues
+
 2015-10-14 17:38:39 +0200  Edward Hervey <edward@centricular.com>
 
 	* ext/hls/gsthlsdemux.c:
@@ -445,6 +4410,189 @@
 	  * either the first sequence number of the playlist (fallback)
 	  * or 3 fragments from the last one (standard behaviour)
 
+2015-10-14 15:30:05 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/Makefile.am:
+	* ext/opencv/gstopencvutils.c:
+	* ext/opencv/gstopencvutils.cpp:
+	* ext/opencv/gstopencvvideofilter.c:
+	* ext/opencv/gstopencvvideofilter.cpp:
+	* ext/opencv/gsttemplatematch.c:
+	* ext/opencv/gsttemplatematch.cpp:
+	  opencv: switch remaining to C++
+	  Switch remaining C files to C++ for consistency with other OpeCV elements,
+	  and support of the new 2.4.11 API.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754148
+
+2015-10-14 10:31:23 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/dash/gstmpdparser.c:
+	  mpdparser: Set default last_byte_pos to -1
+	  The value is optional in the range, and if it is absent it means we should
+	  download until the end of stream. Not until position 0.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=748316
+
+2015-10-14 10:34:58 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+	  adaptivedemux: HTTP ranges are inclusive, GStreamer segment.stop is exclusive
+	  Translate the values accordingly.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=748316
+
+2015-10-14 14:34:32 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/Makefile.am:
+	* ext/opencv/gstmotioncells.c:
+	* ext/opencv/gstmotioncells.cpp:
+	* ext/opencv/gstmotioncells.h:
+	* ext/opencv/motioncells_wrapper.cpp:
+	* ext/opencv/motioncells_wrapper.h:
+	  opencv: motioncells: Switch to C++
+	  Switch gstmotioncells to C++ for consistency with other OpenCV elements,
+	  and support of the new 2.4.11 API.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754148
+
+2015-10-14 22:35:26 +1100  Matthew Waters <matthew@centricular.com>
+
+	* Makefile.am:
+	  build: add liveadder directory to the cruft list
+	  So that we can remove it and avoid duplicate GstLiveAdder GType registrations.
+
+2015-10-13 12:40:04 +0200  Guillaume Desmottes <guillaume.desmottes@collabora.co.uk>
+
+	* gst-libs/gst/gl/gstgldebug.c:
+	  gl: fix leak in gst_gl_insert_debug_marker()
+	  The string allocated by g_vasprintf() was leaked.
+	  Reproduced using the
+	  validate.file.compositor.simple.play_15s.synchronized validate scenario.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756492
+
+2015-10-12 11:07:32 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* docs/plugins/gst-plugins-bad-plugins.args:
+	* docs/plugins/gst-plugins-bad-plugins.hierarchy:
+	* docs/plugins/gst-plugins-bad-plugins.interfaces:
+	* docs/plugins/inspect/plugin-accurip.xml:
+	* docs/plugins/inspect/plugin-adpcmdec.xml:
+	* docs/plugins/inspect/plugin-adpcmenc.xml:
+	* docs/plugins/inspect/plugin-aiff.xml:
+	* docs/plugins/inspect/plugin-asfmux.xml:
+	* docs/plugins/inspect/plugin-assrender.xml:
+	* docs/plugins/inspect/plugin-audiomixer.xml:
+	* docs/plugins/inspect/plugin-audiovisualizers.xml:
+	* docs/plugins/inspect/plugin-autoconvert.xml:
+	* docs/plugins/inspect/plugin-bayer.xml:
+	* docs/plugins/inspect/plugin-bz2.xml:
+	* docs/plugins/inspect/plugin-camerabin.xml:
+	* docs/plugins/inspect/plugin-chromaprint.xml:
+	* docs/plugins/inspect/plugin-coloreffects.xml:
+	* docs/plugins/inspect/plugin-curl.xml:
+	* docs/plugins/inspect/plugin-dataurisrc.xml:
+	* docs/plugins/inspect/plugin-debugutilsbad.xml:
+	* docs/plugins/inspect/plugin-dtsdec.xml:
+	* docs/plugins/inspect/plugin-dvb.xml:
+	* docs/plugins/inspect/plugin-dvbsuboverlay.xml:
+	* docs/plugins/inspect/plugin-dvdspu.xml:
+	* docs/plugins/inspect/plugin-faac.xml:
+	* docs/plugins/inspect/plugin-faad.xml:
+	* docs/plugins/inspect/plugin-festival.xml:
+	* docs/plugins/inspect/plugin-fieldanalysis.xml:
+	* docs/plugins/inspect/plugin-flite.xml:
+	* docs/plugins/inspect/plugin-fragmented.xml:
+	* docs/plugins/inspect/plugin-frei0r.xml:
+	* docs/plugins/inspect/plugin-gaudieffects.xml:
+	* docs/plugins/inspect/plugin-gdp.xml:
+	* docs/plugins/inspect/plugin-geometrictransform.xml:
+	* docs/plugins/inspect/plugin-gmedec.xml:
+	* docs/plugins/inspect/plugin-gsm.xml:
+	* docs/plugins/inspect/plugin-gstsiren.xml:
+	* docs/plugins/inspect/plugin-id3tag.xml:
+	* docs/plugins/inspect/plugin-inter.xml:
+	* docs/plugins/inspect/plugin-interlace.xml:
+	* docs/plugins/inspect/plugin-jpegformat.xml:
+	* docs/plugins/inspect/plugin-mimic.xml:
+	* docs/plugins/inspect/plugin-mms.xml:
+	* docs/plugins/inspect/plugin-modplug.xml:
+	* docs/plugins/inspect/plugin-mpeg2enc.xml:
+	* docs/plugins/inspect/plugin-mpegpsdemux.xml:
+	* docs/plugins/inspect/plugin-mpegpsmux.xml:
+	* docs/plugins/inspect/plugin-mpegtsdemux.xml:
+	* docs/plugins/inspect/plugin-mpegtsmux.xml:
+	* docs/plugins/inspect/plugin-mpg123.xml:
+	* docs/plugins/inspect/plugin-mplex.xml:
+	* docs/plugins/inspect/plugin-neon.xml:
+	* docs/plugins/inspect/plugin-ofa.xml:
+	* docs/plugins/inspect/plugin-openal.xml:
+	* docs/plugins/inspect/plugin-opencv.xml:
+	* docs/plugins/inspect/plugin-opus.xml:
+	* docs/plugins/inspect/plugin-pcapparse.xml:
+	* docs/plugins/inspect/plugin-pnm.xml:
+	* docs/plugins/inspect/plugin-rawparse.xml:
+	* docs/plugins/inspect/plugin-removesilence.xml:
+	* docs/plugins/inspect/plugin-resindvd.xml:
+	* docs/plugins/inspect/plugin-rfbsrc.xml:
+	* docs/plugins/inspect/plugin-rtmp.xml:
+	* docs/plugins/inspect/plugin-schro.xml:
+	* docs/plugins/inspect/plugin-sdp.xml:
+	* docs/plugins/inspect/plugin-segmentclip.xml:
+	* docs/plugins/inspect/plugin-shm.xml:
+	* docs/plugins/inspect/plugin-smooth.xml:
+	* docs/plugins/inspect/plugin-soundtouch.xml:
+	* docs/plugins/inspect/plugin-speed.xml:
+	* docs/plugins/inspect/plugin-subenc.xml:
+	* docs/plugins/inspect/plugin-videoparsersbad.xml:
+	* docs/plugins/inspect/plugin-voaacenc.xml:
+	* docs/plugins/inspect/plugin-voamrwbenc.xml:
+	* docs/plugins/inspect/plugin-waylandsink.xml:
+	* docs/plugins/inspect/plugin-y4mdec.xml:
+	* docs/plugins/inspect/plugin-zbar.xml:
+	  docs: update to git
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756424
+
+2015-10-12 09:36:29 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* gst/audiomixer/gstaudiomixer.c:
+	  liveadder: latency property is an uint64 in audiomixer
+
+2015-10-11 23:44:25 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/Makefile.am:
+	* ext/opencv/gsttextoverlay.c:
+	* ext/opencv/gsttextoverlay.cpp:
+	  textoverlay: Switch to C++
+	  Switch gsttextoverlay to C++ for consistency with other OpenCV elements,
+	  and support of the new 2.4.11 API.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754148
+
+2015-10-11 21:54:30 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/Makefile.am:
+	* ext/opencv/gstpyramidsegment.c:
+	* ext/opencv/gstpyramidsegment.cpp:
+	  opencv: pyramidsegment: Switch to C++
+	  Switch gstpyramidsegment to C++ for consistency with other OpenCV elements,
+	  and support of the new 2.4.11 API.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754148
+
+2015-10-05 00:55:36 +0100  Olivier Crête <olivier.crete@collabora.com>
+
+	* configure.ac:
+	* docs/plugins/Makefile.am:
+	* docs/plugins/gst-plugins-bad-plugins-docs.sgml:
+	* docs/plugins/gst-plugins-bad-plugins-sections.txt:
+	* docs/plugins/inspect/plugin-liveadder.xml:
+	* gst/audiomixer/gstaudiomixer.c:
+	* gst/liveadder/Makefile.am:
+	* gst/liveadder/liveadder.c:
+	* gst/liveadder/liveadder.h:
+	  liveadder: Remove plugin, replace by compat subclass of audiomixer
+	  New subclass with a similar behaviour as the old liveadder, but
+	  a slightly different API as the latency is in nanoseconds, not
+	  milliseconds. Also, the new liveadder has a effective latency that
+	  is latency + output-buffer-duration. In practice, just setting a non-zero
+	  latency with the new audiomixer gives you the right behavior in 99% of the
+	  cases.
+
 2015-10-11 10:00:43 +0100  Julien Isorce <j.isorce@samsung.com>
 
 	* configure.ac:
@@ -453,18 +4601,61 @@
 	  Found with gst-inspect-1.0 -b in gst-uninstalled env.
 	  https://bugzilla.gnome.org/show_bug.cgi?id=756383
 
-2015-10-05 11:21:07 +0900  Vineeth TM <vineeth.tm@samsung.com>
+2015-10-10 17:52:23 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
 
-	* gst/id3tag/id3tag.c:
-	  id3tag: fix sample memory leak
-	  When getting sample from taglist, the memory is not being freed resulting in memory leak.
-	  https://bugzilla.gnome.org/show_bug.cgi?id=756070
+	* ext/opencv/Makefile.am:
+	* ext/opencv/gstcvsobel.c:
+	* ext/opencv/gstcvsobel.cpp:
+	  cvsobel: Switch to C++
+	  Switch gstcvlsobel to C++ for consistency with other OpenCV elements, and
+	  support of the new 2.4.11 API.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754148
 
-2015-10-06 21:23:11 +0530  Nirbheek Chauhan <nirbheek@centricular.com>
+2015-10-10 17:00:55 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
 
-	* ext/gl/gstglvideomixer.c:
-	  glvideomixer: Proxy the ignore-eos videoaggregator property as well
-	  Identical to how the z-order property is proxied
+	* ext/opencv/Makefile.am:
+	* ext/opencv/gstcvlaplace.c:
+	* ext/opencv/gstcvlaplace.cpp:
+	  cvlaplace: Switch to C++
+	  Switch gstcvlaplace to C++ for consistency with other OpenCV elements, and
+	  support of the new 2.4.11 API.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754148
+
+2015-10-10 16:57:36 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/Makefile.am:
+	* ext/opencv/gstcvequalizehist.c:
+	* ext/opencv/gstcvequalizehist.cpp:
+	  cvequalizehist: Switch to C++
+	  Switch gstcvequalizehist to C++ for consistency with other OpenCV elements,
+	  and support of the new 2.4.11 API.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754148
+
+2015-10-10 14:10:32 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/Makefile.am:
+	* ext/opencv/gstcvdilateerode.c:
+	* ext/opencv/gstcvdilateerode.cpp:
+	* ext/opencv/gstcverode.c:
+	* ext/opencv/gstcverode.cpp:
+	  cverode: Switch to C++
+	  Switch gstcverode to C++ for consistency with other OpenCV elements, and
+	  support of the new 2.4.11 API.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754148
+
+2015-10-08 14:46:10 -0700  Reynaldo H. Verdejo Pinochet <reynaldo@osg.samsung.com>
+
+	* sys/dvb/parsechannels.c:
+	  dvb: simplify ZAP file format parser
+	  Simplify state handing, drop unneeded local vars, etc.
+
+2015-10-07 14:22:46 +0100  Florin Apostol <florin.apostol@oregan.net>
+
+	* ext/dash/gstmpdparser.c:
+	  dashdemux: fixed has_next_period
+	  gst_mpd_client_has_next_period now calls gst_mpd_client_setup_media_presentation
+	  to refresh the period information.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756186
 
 2015-10-07 08:48:15 +0900  Vineeth TM <vineeth.tm@samsung.com>
 
@@ -475,13 +4666,18 @@
 	  formatter is being used in logs. Changing all those to int64
 	  https://bugzilla.gnome.org/show_bug.cgi?id=756065
 
-2015-10-07 14:22:46 +0100  Florin Apostol <florin.apostol@oregan.net>
+2015-10-06 21:23:11 +0530  Nirbheek Chauhan <nirbheek@centricular.com>
 
-	* ext/dash/gstmpdparser.c:
-	  dashdemux: fixed has_next_period
-	  gst_mpd_client_has_next_period now calls gst_mpd_client_setup_media_presentation
-	  to refresh the period information.
-	  https://bugzilla.gnome.org/show_bug.cgi?id=756186
+	* ext/gl/gstglvideomixer.c:
+	  glvideomixer: Proxy the ignore-eos videoaggregator property as well
+	  Identical to how the z-order property is proxied
+
+2015-10-05 11:21:07 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* gst/id3tag/id3tag.c:
+	  id3tag: fix sample memory leak
+	  When getting sample from taglist, the memory is not being freed resulting in memory leak.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=756070
 
 2015-10-01 11:18:52 +0200  Havard Graff <havard.graff@gmail.com>
 
@@ -489,11 +4685,191 @@
 	  rtmpsrc: plug memory-leaks
 	  https://bugzilla.gnome.org/show_bug.cgi?id=756001
 
+2015-10-02 22:57:27 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* ext/resindvd/resindvdbin.c:
+	* ext/resindvd/resindvdbin.h:
+	* ext/resindvd/resindvdsrc.c:
+	* ext/resindvd/resindvdsrc.h:
+	  resindvd: Port to new GLib mutex/cond API
+
+2015-10-02 22:24:19 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* configure.ac:
+	* ext/hls/m3u8.c:
+	* ext/libde265/libde265-dec.c:
+	* gst-libs/gst/glib-compat-private.h:
+	* gst/videomeasure/gstvideomeasure_ssim.c:
+	  Update GLib dependency to 2.40.0
+
+2015-10-02 19:02:26 +0100  Vanessa Chipirrás Navalón <vchipirras6@gmail.com>
+
+	* ext/opencv/Makefile.am:
+	* ext/opencv/gstcvdilate.c:
+	* ext/opencv/gstcvdilate.cpp:
+	  cvdilate: Change gstcvdilate to C++
+	  Change the gstcvdilate.c file extension to cpp and add it into Makefile for
+	  consistency with other elements of opencv and because Opencv not support C
+	  language in new API 2.4.11.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754148
+
+2015-10-02 18:50:45 +0100  Vanessa Chipirrás Navalón <vchipirras6@gmail.com>
+
+	* ext/opencv/Makefile.am:
+	* ext/opencv/gstskindetect.c:
+	* ext/opencv/gstskindetect.cpp:
+	  skindetect: Change gstskindetect to C++
+	  Change the file extension to cpp and add it into Makefile for consistency
+	  with other elements of opencv and because Opencv not support C language in
+	  new API 2.4.11.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754148
+
+2015-08-31 17:43:26 +0200  Vanessa Chipirrás Navalón <vchipirras6@gmail.com>
+
+	* ext/opencv/gstopencvutils.h:
+	  opencvutils: add extern C, for the opencv elements work.
+	  Adding G_BEGIN_DECLS and G_END_DECLS to gstopencvutils.h
+	  to allow C-style linking.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754148
+
+2015-10-02 18:40:43 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gstretinex.cpp:
+	  retinex: use OpenCV namespace
+	  As part of the switch to C++, use the new OpenCV functions.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754148
+
+2015-10-02 18:10:32 +0100  Vanessa Chipirrás Navalón <vchipirras6@gmail.com>
+
+	* ext/opencv/Makefile.am:
+	* ext/opencv/gstcvsmooth.c:
+	* ext/opencv/gstcvsmooth.cpp:
+	  cvsmooth: port to C++
+	  Change the file extension to cpp and add it into Makefile for consistency
+	  with other elements of opencv and because Opencv not support C language in
+	  new API 2.4.11.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754148
+
+2015-10-02 17:48:47 +0100  Vanessa Chipirrás Navalón <vchipirras6@gmail.com>
+
+	* ext/opencv/Makefile.am:
+	* ext/opencv/gstretinex.c:
+	* ext/opencv/gstretinex.cpp:
+	  retinex: Change retinex to C++
+	  Change the gstretinex.c file to cpp and add it into Makefile.
+	  It is necessary to migrate the retinex element to C++,
+	  because new Opencv API leaves obsolete functions like cvSmooth.
+	  This element uses this function.
+	  You can see in this link:
+	  http://docs.opencv.org/modules/imgproc/doc/filtering.html?
+	  highlight=cvsmooth#void cvSmooth(const CvArr* src, CvArr* dst,
+	  int smoothtype, int size1, int size2, double sigma1, double sigma2)
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754148
+
+2015-10-02 17:18:33 +0100  Vanessa Chipirrás Navalón <vchipirras6@gmail.com>
+
+	* ext/opencv/gsthanddetect.cpp:
+	* ext/opencv/gsthanddetect.h:
+	  handdetect: remove another unused variable
+	  Memory is reserved for this variable and then released without making any
+	  use of it.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=752528
+
+2015-10-02 17:02:42 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gsthanddetect.cpp:
+	* ext/opencv/gsthanddetect.h:
+	  handdetect: CvPoint values changed from uint to int
+	  The x and y values of CvPoint changed from unsigned to signed integers
+	  in OpenCV 2.4.11.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=752528
+
+2015-10-02 16:22:36 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gsthanddetect.cpp:
+	* ext/opencv/gsthanddetect.h:
+	  handdetect: need to migrate to C++
+	  The cascade classifier changes its structure on new version of OpenCV 2.4.11.
+	  It is need to migrate to C++ to utilize the new load method of OpenCV which
+	  allows to load the old and new classifiers.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=752528
+
+2015-10-02 16:01:29 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/Makefile.am:
+	* ext/opencv/gsthanddetect.c:
+	* ext/opencv/gsthanddetect.cpp:
+	  handdetect: Change gsthanddetect to C++
+	  Change the gsthanddetect.c file to cpp and add it into Makefile.
+	  It is necessary to migrate the handdetect plugin to C++,
+	  in order to load new and old classifiers, to make handdetect work
+	  with newer versions of Opencv.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=752528
+
 2015-10-02 17:05:11 +0200  Polochon_street <polochonstreet@gmx.fr>
 
 	* ext/dtls/gstdtlsdec.c:
 	  dtls: fix printf format on win32
 
+2015-08-20 16:03:29 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* gst/inter/gstintertest.c:
+	* tests/examples/camerabin2/gst-camerabin2-test.c:
+	* tests/examples/codecparsers/parse-jpeg.c:
+	* tests/examples/gl/gtk/fxtest/fxtest.c:
+	* tests/examples/gl/gtk/fxtest/pixbufdrop.c:
+	* tests/examples/opencv/gstfacedetect_test.c:
+	* tests/examples/playout.c:
+	* tools/gst-app-maker:
+	  gstreamer: bad: Fix memory leaks when context parse fails
+	  When g_option_context_parse fails, context and error variables are not getting free'd
+	  which results in memory leaks. Free'ing the same.
+	  And replacing g_error_free with g_clear_error, which checks if the error being passed
+	  is not NULL and sets the variable to NULL on free'ing.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=753854
+
+2015-06-25 19:17:36 +0200  Arnaud Vrac <avrac@freebox.fr>
+
+	* ext/assrender/gstassrender.c:
+	  assrender: optimize blending
+	  Skip empty source pixels when blending an image. There can be hundreds
+	  of images to blend at each frame, so this brings a nice performance
+	  boost.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=753821
+
+2015-08-19 17:18:31 +0200  Arnaud Vrac <avrac@freebox.fr>
+
+	* ext/assrender/gstassrender.c:
+	* ext/assrender/gstassrender.h:
+	  assrender: Use the window size from downstream
+	  This allows rendering the overlay at a resolution matching the video
+	  resolution.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=753824
+
+2014-09-04 18:16:00 +0200  Arnaud Vrac <avrac@freebox.fr>
+
+	* ext/assrender/gstassrender.c:
+	* ext/assrender/gstassrender.h:
+	  assrender: Improve negotiation
+	  This is mostly a copy/paste of the negotiation function in
+	  basetextoverlay, which was improved recently to handle many more cases.
+	  This will allow us to negotiate a window size with downstream.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=753824
+
+2015-08-19 13:44:35 +0200  Arnaud Vrac <avrac@freebox.fr>
+
+	* configure.ac:
+	* ext/assrender/gstassrender.c:
+	  assrender: render the subtitles with the proper aspect
+	  This bumps the libass version requirement to 0.10.2.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=753824
+
+2015-09-07 16:20:42 +0100  Florin Apostol <florin.apostol@oregan.net>
+
+	* tests/check/elements/dash_mpd.c:
+	  dashdemux: test: added unit test for presentation time offset
+	  https://bugzilla.gnome.org/show_bug.cgi?id=752409
+
 2015-09-30 10:27:06 -0700  Aleix Conchillo Flaqué <aleix@oblong.com>
 
 	* configure.ac:
@@ -512,13 +4888,38 @@
 	  dashdemux: Correctly assign earliest pts instead of overriding it with first offset
 	  https://bugzilla.gnome.org/show_bug.cgi?id=755824
 
-2015-09-30 19:01:21 +0200  Sebastian Dröge <sebastian@centricular.com>
+2015-09-15 03:14:37 +1000  Matthew Waters <matthew@centricular.com>
 
-	* gst/audiomixer/gstaudioaggregator.c:
-	  audioaggregator: Select the initial offset based on the start segment position
-	  instead of always using 0. Otherwise we might output a lot of silence in the
-	  beginning instead of outputting from the relevant position.
-	  https://bugzilla.gnome.org/show_bug.cgi?id=755623
+	* configure.ac:
+	* ext/qt/gstplugin.cc:
+	* ext/qt/gstqsgtexture.h:
+	* ext/qt/gstqtsink.cc:
+	* ext/qt/qtitem.cc:
+	* ext/qt/qtitem.h:
+	  qt: add support for building on osx/ios
+	  Including:
+	  - Necessary configure checks
+	  - Necessary compile time platform checks
+	  - Necessary runtime qt iOS/OSX platform detection
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755100
+
+2015-09-28 11:29:29 +0100  John Slade <john@jtes.net>
+
+	* ext/rtmp/gstrtmpsrc.c:
+	  rtmpsrc: Fix indentation with gst-indent
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755732
+
+2015-10-02 11:31:50 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/audiovisualizers/Makefile.am:
+	  audiovisualizers: Fix nodist_HEADERS
+
+2015-10-02 14:56:41 +1000  Jan Schmidt <jan@centricular.com>
+
+	* tests/check/Makefile.am:
+	* tests/check/elements/baseaudiovisualizer.c:
+	  Remove baseaudiovisualizer test.
+	  The base class has moved into gst-plugins-base
 
 2015-09-30 19:05:35 +0200  Sebastian Dröge <sebastian@centricular.com>
 
@@ -533,6 +4934,632 @@
 	  before anyway because of a mistake.
 	  https://bugzilla.gnome.org/show_bug.cgi?id=755623
 
+2015-09-30 19:01:21 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/audiomixer/gstaudioaggregator.c:
+	  audioaggregator: Select the initial offset based on the start segment position
+	  instead of always using 0. Otherwise we might output a lot of silence in the
+	  beginning instead of outputting from the relevant position.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755623
+
+2015-10-01 15:35:37 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* docs/plugins/Makefile.am:
+	* gst/audiovisualizers/Makefile.am:
+	* gst/audiovisualizers/gstaudiovisualizer.c:
+	* gst/audiovisualizers/gstaudiovisualizer.h:
+	* gst/audiovisualizers/gstspacescope.h:
+	* gst/audiovisualizers/gstspectrascope.h:
+	* gst/audiovisualizers/gstsynaescope.h:
+	* gst/audiovisualizers/gstwavescope.h:
+	  audiovisualizers: merge audiovisualizer base classes
+	  These plugins now use the audiovisualizer base class in pbutils
+	  https://bugzilla.gnome.org/show_bug.cgi?id=742875
+
+2015-10-02 01:01:42 +1000  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/Makefile.am:
+	* gst-libs/gst/gl/gl.h:
+	* gst-libs/gst/gl/gstglcontext.c:
+	* gst-libs/gst/gl/gstgldebug.c:
+	* gst-libs/gst/gl/gstgldebug.h:
+	* gst-libs/gst/gl/gstglutils.c:
+	* gst-libs/gst/gl/gstglutils.h:
+	  gl: move debugging related functions to their own file
+
+2015-10-01 23:20:19 +1000  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/gstglcolorscale.c:
+	  glcolorscale: use glbasefilter vfuncs
+	  Uses less code \o/
+	  Fixes legacy opengl rendering \o/
+
+2015-09-16 12:50:46 +0200  Philippe Normand <philn@igalia.com>
+
+	* ext/smoothstreaming/gstmssdemux.c:
+	  mssdemux: activate streams before configuring bitrate
+	  Doing the contrary has no effect and the consequence is that playback
+	  will start with the lowest bitrate even if we can already handle
+	  higher bitrate.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755108
+
+2015-06-08 15:33:22 +0200  Philippe Normand <philn@igalia.com>
+
+	* ext/smoothstreaming/gstmssdemux.c:
+	* ext/smoothstreaming/gstmssdemux.h:
+	* ext/smoothstreaming/gstmssmanifest.c:
+	* ext/smoothstreaming/gstmssmanifest.h:
+	  mssdemux: PlayReady WRM parsing support
+	  If the manifest has a ProtectionHeader node then parse it and emit
+	  protection events according to the specified protection SystemID.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=753613
+
+2015-09-03 15:11:00 +0200  Philippe Normand <philn@igalia.com>
+
+	* ext/smoothstreaming/gstmssmanifest.c:
+	  mssdemux: always use timescale for gst timestamp calculation
+	  Not doing this can lead the demuxer to attempt downloading fragments
+	  for an invalid start time. The server would then send a HTTP
+	  Precondition failed error, the demuxer would try some more times to
+	  download the invalid fragment and eventually error out.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754523
+
+2015-09-30 08:36:15 +0200  Antoine Jacoutot <ajacoutot@gnome.org>
+
+	* gst-libs/gst/gl/Makefile.am:
+	  gl: Pass GL_CFLAGS to g-ir-scanner
+	  This unbreaks building when some headers are under a non-standard path.
+	  e.g. /usr/X11R6/include as on OpenBSD.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755850
+
+2015-09-30 00:44:16 -0700  Aleix Conchillo Flaqué <aleix@oblong.com>
+
+	* sys/applemedia/Makefile.am:
+	  applemedia: dist missing header files
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755852
+
+2015-09-30 13:13:19 +0900  Vineeth TM <vineeth.tm@samsung.com>
+
+	* tests/check/elements/audiointerleave.c:
+	  audiointerleave: typecast bit-mask to guint64 to fix segmentation fault
+	  While creating caps in audiointerleave tests, bitmask is being set as 0x9
+	  This is resulting in segmentation fault. Fix the same by typecasting to guint64
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755840
+
+2015-09-30 15:17:38 +1000  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglcontext.c:
+	  glcontext: fixup strstr lengths so we don't overrun
+
+2015-09-30 13:31:50 +1000  Matthew Waters <matthew@centricular.com>
+
+	* docs/libs/gst-plugins-bad-libs-sections.txt:
+	* ext/gl/gstgluploadelement.c:
+	* gst-libs/gst/gl/gstglupload.c:
+	* gst-libs/gst/gl/gstglupload.h:
+	* tests/check/libs/gstglupload.c:
+	  glupload: remove useless release_buffer
+	  It's a leftover from when we weren't outputting GstBuffer's and
+	  returning raw texture id's.
+
+2015-09-30 01:53:53 +1000  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglutils.c:
+	  glutils: use gst_element_set_context for setting display/other_context
+	  1. So we get tracking inside GstElement properly when e.g. adding to a bin
+	  2. Removes redundant code.  Now only one place where
+	  GstContext->GstGLDisplay/GstGLContext transformation occurs
+	  3. Fixes a memory leak in the process
+	  4. Make the retrieval of debug categories thread safe
+
+2015-09-29 22:57:52 +1000  Matthew Waters <matthew@centricular.com>
+
+	* ext/gtk/gtkgstglwidget.c:
+	  gtk: add some GL debug statements to show up in GL traces
+
+2015-08-30 17:11:31 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/gstm3u8playlist.c:
+	* ext/hls/gstm3u8playlist.h:
+	  hls: m3u8playlist: more clean-ups
+	  Remove unused functions; move GstM3U8 struct into .c file,
+	  and indent the header so it's nice to read.
+
+2015-08-30 17:01:13 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/gstm3u8playlist.c:
+	  hls: m3u8playlist: fix silly queue iteration code
+
+2015-08-30 16:40:02 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/gstm3u8playlist.c:
+	  hls: m3u8playlist: more minor playlist_render() clean-ups
+	  Move the TAG defines directly into the code, not sure what
+	  their purposes is, these are printf format strings so having
+	  them directly as literals in the code where they're used
+	  makes the code easier to follow.
+
+2015-08-30 16:34:26 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/gstm3u8playlist.c:
+	  hls: m3u8playlist: move entry rendering into render_playlist()
+	  Makes the code easier to follow and avoids unnecessary temporary
+	  strings, since we can just append to the playlist GString directly.
+
+2015-08-30 16:24:41 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/gstm3u8playlist.c:
+	* ext/hls/gstm3u8playlist.h:
+	  hls: m3u8playlist: simplify gst_m3u8_playlist_render()
+	  Remove playlist_str GString variable from GstM3U8Playlist struct,
+	  since it's only used temporarily in playlist_render(). Might just
+	  as well keep it local then.
+
+2015-08-30 15:55:51 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* ext/hls/Makefile.am:
+	* ext/hls/gstfragmented.h:
+	* ext/hls/gsthlssink.c:
+	* ext/hls/gstm3u8playlist.h:
+	  hls: remove unused macro and direct gio usage
+
+2015-09-30 00:36:14 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* gst/mpegtsmux/mpegtsmux.c:
+	  mpegtsmux: fix downstream key unit events handling with hlssink
+	  The buffer timestamps in the collect function will already be
+	  running time, don't try to convert them again to running time,
+	  this would yield CLOCK_TIME_NONE now that the segment is shifted
+	  to account for negative dts.
+	  This fixes x264enc ! mpegtsmux ! hlssink, which was broken
+	  because mpegtsmux would send a downstream key unit event with
+	  running time NONE and then hlssink would immediately send
+	  another one upstream and it would just be a flood of force
+	  keyframe events in both directions after the first one. This
+	  would then break hlssink because it uses multifilesink in
+	  next-file=key-unit-event mode, and starting a new file after
+	  every few kB does not work well for HLS.
+
+2015-08-20 17:35:04 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gstcverode.c:
+	  opencv: erode: remove non-ip transform func
+	  Transform is set to be done in place in gstcvdilateerode.c, so the in-place
+	  transform function is always used and the other is redundant. Removing it.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=753885
+
+2015-08-20 17:23:40 +0100  Luis de Bethencourt <luis@debethencourt.com>
+
+	* ext/opencv/gstcvdilate.c:
+	  opencv: dilate: remove non-ip transform func
+	  Transform is set to be done in place in gstcvdilateerode.c, so the in-place
+	  transform function is always used and the other is redundant. Removing it.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=753885
+
+2015-09-29 20:00:02 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gstcvdilateerode.c:
+	* ext/opencv/gstcvequalizehist.c:
+	* ext/opencv/gstcvlaplace.c:
+	* ext/opencv/gstcvsmooth.c:
+	* ext/opencv/gstcvsobel.c:
+	* ext/opencv/gstretinex.c:
+	* ext/opencv/gstretinex.h:
+	* ext/opencv/gstskindetect.c:
+	  opencv: use gst_opencv_video_filter_set_in_place()
+	  Using the gst_base_transform function directly won't work. Need to use
+	  gst_opencv_video_filter_set_in_place().
+
+2015-09-29 17:00:22 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gsthanddetect.c:
+	  handdetect: check for haar cascade files path
+	  When running GStreamer from uninstalled sources, the location of the haar
+	  cascade files will be local. Check if running in uninstalled and set the
+	  file paths accordingly.
+
+2015-09-26 17:02:09 +0800  John Chang <r97922153@gmail.com>
+
+	* gst-libs/gst/adaptivedemux/gstadaptivedemux.c:
+	  adaptivedemux: remove unused variable
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755656
+
+2015-09-29 13:31:18 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* gst-libs/gst/video/gstvideoaggregator.c:
+	  videoaggregator: fix compilation with older glib version
+	  Remove weird use of private gtype defines and fix compilation
+	  with older glib versions such as 2.36.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755754
+
+2015-09-29 13:52:47 +0100  Luis de Bethencourt <luisbg@osg.samsung.com>
+
+	* ext/opencv/gstcvlaplace.c:
+	* ext/opencv/gstcvlaplace.h:
+	  opencv: cvlaplace: add scale and shift properties
+	  Add scale and shift properties so these can be used to tweak the values
+	  used in cvConvertScale() instead of using only defaults.
+
+2015-08-28 16:24:24 +0100  Luis de Bethencourt <luis@debethencourt.com>
+
+	* ext/qt/gstqtsink.cc:
+	  qtsink: explicitely fallthrough switch statement
+	  In case ret is False, fallthrough to default case.
+	  CID #1320705
+
+2015-08-28 16:13:16 +0100  Luis de Bethencourt <luis@debethencourt.com>
+
+	* gst/videoparsers/gstvc1parse.c:
+	  vc1parse: add break to switch case
+	  Even though all cases inside VC1_STREAM_FORMAT_ASF are goto or
+	  g_assert_not_reached(), add a break at the end to appease Coverity.
+	  CID #1320706
+
+2015-09-28 20:56:56 +0200  Arnaud Vrac <avrac@freebox.fr>
+
+	* ext/assrender/gstassrender.c:
+	  assrender: fix leak of tag samples in the tag list
+	  Move handling of a GstSample in a separate function, and unref the
+	  sample after calling it. libass copies the font data so we don't need to
+	  keep it around.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755759
+
+2015-09-28 20:30:17 +0200  Arnaud Vrac <avrac@freebox.fr>
+
+	* ext/assrender/gstassrender.c:
+	  assrender: fix gap event leak and invalid return value
+	  We don't want the gap event to be forwarded
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755759
+
+2015-09-29 16:17:22 +1000  Matthew Waters <matthew@centricular.com>
+
+	* sys/nvenc/gstnvbaseenc.c:
+	  nvenc: call the parent class on GstElement::set_context
+
+2015-09-17 16:59:16 +1000  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/eagl/gstglcontext_eagl.m:
+	  gl/eagl: use the default GL context debug category
+
+2015-07-30 16:42:38 +1000  Matthew Waters <matthew@centricular.com>
+
+	* configure.ac:
+	* sys/Makefile.am:
+	* sys/nvenc/Makefile.am:
+	* sys/nvenc/README:
+	* sys/nvenc/TODO:
+	* sys/nvenc/gstnvbaseenc.c:
+	* sys/nvenc/gstnvbaseenc.h:
+	* sys/nvenc/gstnvenc.c:
+	* sys/nvenc/gstnvenc.h:
+	* sys/nvenc/gstnvh264enc.c:
+	* sys/nvenc/gstnvh264enc.h:
+	  Add Nvidia based hardware encoder element
+	  Currently only h264 is supported
+	  https://bugzilla.gnome.org/show_bug.cgi?id=753405
+
+2015-09-29 00:25:00 +1000  Matthew Waters <matthew@centricular.com>
+
+	* ext/gtk/gstgtkbasesink.c:
+	  gtk: fix assertion when the element has no peer
+	  When proxying keyboard/navigation/mouse events, only unref a successfully
+	  retreived peer pad.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755738
+
+2015-09-28 15:30:30 +0200  Stefan Sauer <ensonic@users.sf.net>
+
+	* configure.ac:
+	* gst/midi/Makefile.am:
+	* gst/midi/alsamidisrc.c:
+	* gst/midi/alsamidisrc.h:
+	* gst/midi/midi.c:
+	  Revert "midi: add an ALSA MIDI sequencer source"
+	  This reverts commit cd7f4e524718a2f75467852235e4e13d64d2ac82.
+
+2015-09-28 22:31:09 +1000  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglutils.c:
+	  gl: set the context on the element on a context query
+	  Otherwise it's possible to lose the context information if the
+	  context is only propagated through queries.
+
+2015-09-28 22:20:29 +1000  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/caopengllayersink.m:
+	* ext/gl/gstglbasemixer.c:
+	* ext/gl/gstglimagesink.c:
+	* ext/gl/gstglstereosplit.c:
+	* ext/gl/gstgltestsrc.c:
+	* gst-libs/gst/gl/gstglbasefilter.c:
+	  gl: chain up to the parent class for GstElement::set_context
+	  https://bugzilla.gnome.org/show_bug.cgi?id=705579
+
+2015-08-07 15:28:54 +0200  Antonio Ospite <ao2@ao2.it>
+
+	* configure.ac:
+	* gst/midi/Makefile.am:
+	* gst/midi/alsamidisrc.c:
+	* gst/midi/alsamidisrc.h:
+	* gst/midi/midi.c:
+	  midi: add an ALSA MIDI sequencer source
+	  The alsamidisrc element allows to get input event from ALSA MIDI
+	  sequencer devices, and possibly convert them to sound using some
+	  downstream element like fluiddec.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=738687
+
+2015-08-28 16:35:39 +0100  Luis de Bethencourt <luis@debethencourt.com>
+
+	* ext/qt/qtitem.cc:
+	  qml: remove overwritten value
+	  Value in tex is overwritten before being used. Removing it.
+	  CID 1320715
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754253
+
+2015-09-02 23:45:07 +1000  Matthew Waters <matthew@centricular.com>
+
+	* configure.ac:
+	* ext/qt/Makefile.am:
+	* ext/qt/gstqsgtexture.h:
+	* ext/qt/gstqtgl.h:
+	* ext/qt/qtitem.cc:
+	* ext/qt/qtitem.h:
+	  qt: add support for building/running on android
+	  Including:
+	  - Necessary configure checks
+	  - Necessary compile time platform checks
+	  - Necessary runtime qt android platform detection
+	  - Escaping GLsync definition with Qt's GLES2 implementation
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754466
+
+2015-09-02 23:40:31 +1000  Matthew Waters <matthew@centricular.com>
+
+	* ext/qt/Makefile.am:
+	  qt: don't use CPPFLAGS for tools that cannot use them
+	  For example moc will bail out when given arguments it does not
+	  know about.  The moc specific MOC_CPPFLAGS can still be used
+	  to pass flags to moc.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754466
+
+2015-09-02 23:39:54 +1000  Matthew Waters <matthew@centricular.com>
+
+	* ext/qt/Makefile.am:
+	  qt: rename library to include gst prefix
+	  libqtsink -> libgstqtsink
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754466
+
+2015-08-31 19:21:54 +1000  Matthew Waters <matthew@centricular.com>
+
+	* ext/gl/gstglimagesink.c:
+	* gst-libs/gst/gl/gstglbasefilter.c:
+	* gst-libs/gst/gl/gstglcolorconvert.c:
+	* gst-libs/gst/gl/gstglfilter.c:
+	  gl: sprinkle some debug markers to ease debugging
+
+2015-08-31 19:18:23 +1000  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/gstglutils.c:
+	* gst-libs/gst/gl/gstglutils.h:
+	  gl/utils: add a function to insert a debug marker
+	  These markers are visible in tools that record the GL function calls
+	  such as apitrace, et al.
+	  Makes it easier to match up GL draw commands with specific elements.
+
+2015-08-31 19:17:21 +1000  Matthew Waters <matthew@centricular.com>
+
+	* gst-libs/gst/gl/glprototypes/debug.h:
+	  gl: add some debugging prototypes
+
+2015-09-26 19:19:50 +1000  Matthew Waters <matthew@centricular.com>
+
+	* docs/libs/gst-plugins-bad-libs-sections.txt:
+	* gst-libs/gst/gl/android/gstglwindow_android_egl.c:
+	* gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m:
+	* gst-libs/gst/gl/eagl/gstglwindow_eagl.m:
+	* gst-libs/gst/gl/gstglwindow.c:
+	* gst-libs/gst/gl/gstglwindow.h:
+	* gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c:
+	* gst-libs/gst/gl/win32/gstglwindow_win32.c:
+	* gst-libs/gst/gl/x11/gstglwindow_x11.c:
+	  glwindow: remove unused draw_unlocked function
+	  The functionality is provided by draw anyway and is leftover from
+	  X11's specific threading requirements that no longer apply.
+
+2015-09-27 13:07:19 +1000  Jan Schmidt <jan@centricular.com>
+
+	* ext/resindvd/gstmpegdemux.c:
+	  resindvd: Send gap updates to the segment stop during stills
+	  Ignore the normal gap threshold for laggy streams and
+	  immediately catch all streams up to the end of the segment
+	  when processing gap updates for a segment during a
+	  still frame sequence.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755680
+
+2015-09-27 00:24:24 +1000  Jan Schmidt <jan@centricular.com>
+
+	* gst/dvdspu/Makefile.am:
+	* gst/dvdspu/gstdvdspu-render.c:
+	* gst/dvdspu/gstdvdspu.c:
+	* gst/dvdspu/gstdvdspu.h:
+	* gst/dvdspu/gstspu-common.h:
+	* gst/dvdspu/gstspu-pgs.c:
+	* gst/dvdspu/gstspu-pgs.h:
+	* gst/dvdspu/gstspu-vobsub-render.c:
+	* gst/dvdspu/gstspu-vobsub.c:
+	* gst/dvdspu/gstspu-vobsub.h:
+	  Revert "dvdspu: render to AYUV overlay"
+	  This reverts commit 5016a73190595505dc38b54f8f9a08c4f180f3a6.
+
+2015-09-27 00:24:23 +1000  Jan Schmidt <jan@centricular.com>
+
+	* gst/dvdspu/gstdvdspu.c:
+	* gst/dvdspu/gstspu-common.h:
+	* gst/dvdspu/gstspu-pgs.c:
+	* gst/dvdspu/gstspu-vobsub-render.c:
+	  Revert "dvdspu: render to ARGB overlay instead of AYUV"
+	  This reverts commit dd3e9deb2aa695a391b58f24d86a3c00bbc1258a.
+
+2015-09-27 00:24:17 +1000  Jan Schmidt <jan@centricular.com>
+
+	* gst/dvdspu/gstspu-vobsub.c:
+	* gst/dvdspu/gstspu-vobsub.h:
+	  Revert "dvdspu: handle frame size event from upstream"
+	  This reverts commit 46aaaa6c309b8a8f6e218142fd5944f5d24f095c.
+
+2015-09-27 00:24:17 +1000  Jan Schmidt <jan@centricular.com>
+
+	* gst/dvdspu/gstdvdspu.c:
+	* gst/dvdspu/gstdvdspu.h:
+	  Revert "dvdspu: cache overlay composition"
+	  This reverts commit aabb8a1a68372f750c63b9b6586e18e829745774.
+
+2015-09-27 00:24:15 +1000  Jan Schmidt <jan@centricular.com>
+
+	* gst/dvdspu/gstdvdspu.c:
+	* gst/dvdspu/gstdvdspu.h:
+	  Revert "dvdspu: improve negotiation of overlay composition"
+	  This reverts commit 1899e2a099932a7a734e7784c20b624517237e18.
+
+2015-09-18 19:07:47 +0200  Arnaud Vrac <avrac@freebox.fr>
+
+	* gst/dvdspu/gstspu-pgs.c:
+	  dvdspu: fix pgs palette colors
+	  U and V were inverted
+	  https://bugzilla.gnome.org/show_bug.cgi?id=755239
+
+2014-08-27 16:47:22 +0200  Arnaud Vrac <avrac@freebox.fr>
+
+	* gst/dvdspu/gstdvdspu.c:
+	* gst/dvdspu/gstdvdspu.h:
+	  dvdspu: improve negotiation of overlay composition
+	  Support negotiating GstVideoOverlayComposition downstream
+	  while not providing it upstream.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=663750
+
+2013-09-02 17:48:50 +0200  Arnaud Vrac <avrac@freebox.fr>
+
+	* gst/dvdspu/gstdvdspu.c:
+	* gst/dvdspu/gstdvdspu.h:
+	  dvdspu: cache overlay composition
+	  This avoids rendering the overlay buffer for each video frame.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=663750
+
+2013-08-30 22:08:01 +0200  Arnaud Vrac <avrac@freebox.fr>
+
+	* gst/dvdspu/gstspu-vobsub.c:
+	* gst/dvdspu/gstspu-vobsub.h:
+	  dvdspu: handle frame size event from upstream
+	  An IDX file or codec_data normally contains the original frame size of
+	  the video. Allow upstream to provide this information by sending a
+	  custom event, which will allow scaling the overlay correctly.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=663750
+
+2013-12-05 21:59:18 +0100  Arnaud Vrac <avrac@freebox.fr>
+
+	* gst/dvdspu/gstdvdspu.c:
+	  dvdspu: allow suffix in dvd event name to allow multiple sticky dvd events
+	  https://bugzilla.gnome.org/show_bug.cgi?id=663750
+
+2015-04-07 14:38:08 +0200  Arnaud Vrac <avrac@freebox.fr>
+
+	* gst/dvdspu/gstdvdspu.c:
+	* gst/dvdspu/gstspu-common.h:
+	* gst/dvdspu/gstspu-pgs.c:
+	* gst/dvdspu/gstspu-vobsub-render.c:
+	  dvdspu: render to ARGB overlay instead of AYUV
+	  https://bugzilla.gnome.org/show_bug.cgi?id=663750
+
+2013-01-23 17:59:01 +0100  Arnaud Vrac <avrac@freebox.fr>
+
+	* gst/dvdspu/Makefile.am:
+	* gst/dvdspu/gstdvdspu-render.c:
+	* gst/dvdspu/gstdvdspu.c:
+	* gst/dvdspu/gstdvdspu.h:
+	* gst/dvdspu/gstspu-common.h:
+	* gst/dvdspu/gstspu-pgs.c:
+	* gst/dvdspu/gstspu-pgs.h:
+	* gst/dvdspu/gstspu-vobsub-render.c:
+	* gst/dvdspu/gstspu-vobsub.c:
+	* gst/dvdspu/gstspu-vobsub.h:
+	  dvdspu: render to AYUV overlay
+	  Instead of only supporting writing SPU data directly to YUV frames,
+	  render the SPU data to an intermediate AYUV overlay buffer. The overlay
+	  data is then attached to the video frame if downstream supports overlay
+	  composition, otherwise the AYUV overlay is blended to the video frame.
+	  For the PGS format, the overlay buffer size is set to the size of the
+	  Composition Window, and its position in the overlay composition is set
+	  to the window position. The objects to render are now cropped when the
+	  cropping flag is set.
+	  For the Vobsub format, the overlay buffer size is set to the size of the
+	  Display Area.
+	  Once rendered, the overlay composition rectangle is now moved and scaled
+	  to fit the video output size, to avoid clipping.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=663750
+
+2013-09-02 17:07:49 +0200  Arnaud Vrac <avrac@freebox.fr>
+
+	* gst/dvdspu/gstdvdspu.c:
+	  dvdspu: pass dvdspu argument to set_caps functions
+	  https://bugzilla.gnome.org/show_bug.cgi?id=663750
+
+2015-09-18 19:15:45 +0200  Arnaud Vrac <avrac@freebox.fr>
+
+	* gst/dvdspu/gstspu-pgs.c:
+	  dvdspu: skip unneeded reading of RLE data
+	  The RLE data was being read for dumping the SPU image even when the
+	  DUMP_FULL_IMAGE macro was not set.
+	  https://bugzilla.gnome.org/show_bug.cgi?id=663750
+
+2015-08-29 19:16:38 +0530  Nirbheek Chauhan <nirbheek@centricular.com>
+
+	* tests/check/elements/compositor.c:
+	  check: Add test for videoaggregator sinkpads being sorted by zorder
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754285
+
+2015-09-26 10:21:41 +0100  Tim-Philipp Müller <tim@centricular.com>
+
+	* gst/audiomixer/gstaudioaggregator.c:
+	  audiomixer: fix deadlock when G_DISABLE_ASSERT is not defined
+	  This makes the audiomixer unit test time out in master.
+	  Broke with 587e7c4
+
+2015-09-26 10:49:31 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* tests/check/elements/dash_mpd.c:
+	  dash: Fix unit test after internal API change
+
+2015-08-25 17:39:30 +0900  Jimmy Ohn <yongjin.ohn@lge.com>
+
+	* ext/sndfile/gstsfdec.c:
+	  sfdec: Fix typo in goto variable name
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754057
+
+2015-08-18 14:16:11 +0100  Chris Bass <floobleflam@gmail.com>
+
+	* ext/dash/gstdashdemux.c:
+	* ext/dash/gstdashdemux.h:
+	* ext/dash/gstmpdparser.c:
+	* ext/dash/gstmpdparser.h:
+	  dashdemux: create src pads for subtitle streams.
+	  Create src pads for Representations that contain timed-text subtitles,
+	  both when the subtitles are encapsulated in ISO BMFF (i.e., the
+	  Representation has mimeType "application/mp4") and when they are
+	  unencapsulated (i.e., the Representation has mimeType
+	  "application/ttml+xml").
+	  https://bugzilla.gnome.org/show_bug.cgi?id=747774
+
+2015-09-26 00:17:55 +0200  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst/audiomixer/gstaudioaggregator.c:
+	  audioaggregator: Stop using deprecated gst_segment_to_position()
+
+2015-08-31 16:12:40 +0300  Sebastian Dröge <sebastian@centricular.com>
+
+	* gst-libs/gst/base/gstaggregator.c:
+	  aggregator: Don't forward QOS events to sinkpads that had no buffer yet
+	  Otherwise they will receive a QOS event that has earliest_time=0 (because we
+	  can't have negative timestamps), and consider their buffer as too late
+	  https://bugzilla.gnome.org/show_bug.cgi?id=754356
+
 2015-09-22 16:17:38 +0200  Sebastian Dröge <sebastian@centricular.com>
 
 	* ext/dash/gstdashdemux.c:
@@ -603,124 +5630,10 @@
 	  mpdparser: If no Initialization is present in the SegmentBase, assume it is before the indexRange
 	  https://bugzilla.gnome.org/show_bug.cgi?id=755132
 
-2015-09-16 12:50:46 +0200  Philippe Normand <philn@igalia.com>
+2015-09-25 23:51:20 +0200  Sebastian Dröge <sebastian@centricular.com>
 
-	* ext/smoothstreaming/gstmssdemux.c:
-	  mssdemux: activate streams before configuring bitrate
-	  Doing the contrary has no effect and the consequence is that playback
-	  will start with the lowest bitrate even if we can already handle
-	  higher bitrate.
-	  https://bugzilla.gnome.org/show_bug.cgi?id=755108
-
-2015-09-03 15:11:00 +0200  Philippe Normand <philn@igalia.com>
-
-	* ext/smoothstreaming/gstmssmanifest.c:
-	  mssdemux: always use timescale for gst timestamp calculation
-	  Not doing this can lead the demuxer to attempt downloading fragments
-	  for an invalid start time. The server would then send a HTTP
-	  Precondition failed error, the demuxer would try some more times to
-	  download the invalid fragment and eventually error out.
-	  https://bugzilla.gnome.org/show_bug.cgi?id=754523
-
-2015-09-30 08:36:15 +0200  Antoine Jacoutot <ajacoutot@gnome.org>
-
-	* gst-libs/gst/gl/Makefile.am:
-	  gl: Pass GL_CFLAGS to g-ir-scanner
-	  This unbreaks building when some headers are under a non-standard path.
-	  e.g. /usr/X11R6/include as on OpenBSD.
-	  https://bugzilla.gnome.org/show_bug.cgi?id=755850
-
-2015-09-30 00:44:16 -0700  Aleix Conchillo Flaqué <aleix@oblong.com>
-
-	* sys/applemedia/Makefile.am:
-	  applemedia: dist missing header files
-	  https://bugzilla.gnome.org/show_bug.cgi?id=755852
-
-2015-09-30 13:13:19 +0900  Vineeth TM <vineeth.tm@samsung.com>
-
-	* tests/check/elements/audiointerleave.c:
-	  audiointerleave: typecast bit-mask to guint64 to fix segmentation fault
-	  While creating caps in audiointerleave tests, bitmask is being set as 0x9
-	  This is resulting in segmentation fault. Fix the same by typecasting to guint64
-	  https://bugzilla.gnome.org/show_bug.cgi?id=755840
-
-2015-09-30 00:36:14 +0100  Tim-Philipp Müller <tim@centricular.com>
-
-	* gst/mpegtsmux/mpegtsmux.c:
-	  mpegtsmux: fix downstream key unit events handling with hlssink
-	  The buffer timestamps in the collect function will already be
-	  running time, don't try to convert them again to running time,
-	  this would yield CLOCK_TIME_NONE now that the segment is shifted
-	  to account for negative dts.
-	  This fixes x264enc ! mpegtsmux ! hlssink, which was broken
-	  because mpegtsmux would send a downstream key unit event with
-	  running time NONE and then hlssink would immediately send
-	  another one upstream and it would just be a flood of force
-	  keyframe events in both directions after the first one. This
-	  would then break hlssink because it uses multifilesink in
-	  next-file=key-unit-event mode, and starting a new file after
-	  every few kB does not work well for HLS.
-
-2015-09-29 13:31:18 +0100  Tim-Philipp Müller <tim@centricular.com>
-
-	* gst-libs/gst/video/gstvideoaggregator.c:
-	  videoaggregator: fix compilation with older glib version
-	  Remove weird use of private gtype defines and fix compilation
-	  with older glib versions such as 2.36.
-	  https://bugzilla.gnome.org/show_bug.cgi?id=755754
-
-2015-09-28 20:56:56 +0200  Arnaud Vrac <avrac@freebox.fr>
-
-	* ext/assrender/gstassrender.c:
-	  assrender: fix leak of tag samples in the tag list
-	  Move handling of a GstSample in a separate function, and unref the
-	  sample after calling it. libass copies the font data so we don't need to
-	  keep it around.
-	  https://bugzilla.gnome.org/show_bug.cgi?id=755759
-
-2015-09-28 20:30:17 +0200  Arnaud Vrac <avrac@freebox.fr>
-
-	* ext/assrender/gstassrender.c:
-	  assrender: fix gap event leak and invalid return value
-	  We don't want the gap event to be forwarded
-	  https://bugzilla.gnome.org/show_bug.cgi?id=755759
-
-2015-09-17 16:59:16 +1000  Matthew Waters <matthew@centricular.com>
-
-	* gst-libs/gst/gl/eagl/gstglcontext_eagl.m:
-	  gl/eagl: use the default GL context debug category
-
-2015-09-29 00:25:00 +1000  Matthew Waters <matthew@centricular.com>
-
-	* ext/gtk/gstgtkbasesink.c:
-	  gtk: fix assertion when the element has no peer
-	  When proxying keyboard/navigation/mouse events, only unref a successfully
-	  retreived peer pad.
-	  https://bugzilla.gnome.org/show_bug.cgi?id=755738
-
-2015-09-27 13:07:19 +1000  Jan Schmidt <jan@centricular.com>
-
-	* ext/resindvd/gstmpegdemux.c:
-	  resindvd: Send gap updates to the segment stop during stills
-	  Ignore the normal gap threshold for laggy streams and
-	  immediately catch all streams up to the end of the segment
-	  when processing gap updates for a segment during a
-	  still frame sequence.
-	  https://bugzilla.gnome.org/show_bug.cgi?id=755680
-
-2015-09-18 19:07:47 +0200  Arnaud Vrac <avrac@freebox.fr>
-
-	* gst/dvdspu/gstspu-pgs.c:
-	  dvdspu: fix pgs palette colors
-	  U and V were inverted
-	  https://bugzilla.gnome.org/show_bug.cgi?id=755239
-
-2015-09-26 10:21:41 +0100  Tim-Philipp Müller <tim@centricular.com>
-
-	* gst/audiomixer/gstaudioaggregator.c:
-	  audiomixer: fix deadlock when G_DISABLE_ASSERT is not defined
-	  This makes the audiomixer unit test time out in master.
-	  Broke with 587e7c4
+	* configure.ac:
+	  Back to development
 
 === release 1.6.0 ===
 
diff --git a/Makefile.am b/Makefile.am
index e93ec1f..6f7bcbf 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -53,6 +53,7 @@
 	$(top_builddir)/common/shave \
 	$(top_builddir)/common/shave-libtool \
 	$(top_builddir)/ext/alsaspdif/.libs/*.{so,dll,DLL,dylib} \
+	$(top_builddir)/ext/hls/.libs/libgstfragmented* \
 	$(top_builddir)/ext/ivorbis/.libs/*.{so,dll,DLL,dylib} \
 	$(top_builddir)/ext/jack/.libs/*.{so,dll,DLL,dylib} \
 	$(top_builddir)/gst/aacparse/.libs/*.{so,dll,DLL,dylib} \
@@ -96,6 +97,7 @@
 	$(top_srcdir)/gst/hls \
 	$(top_srcdir)/gst/imagefreeze \
 	$(top_srcdir)/gst/invtelecine \
+	$(top_srcdir)/gst/liveadder \
 	$(top_srcdir)/gst/mpeg4videoparse \
 	$(top_srcdir)/gst/qtmux \
 	$(top_srcdir)/gst/rtpmux \
diff --git a/Makefile.in b/Makefile.in
index 19b0b5a..f7d62bb 100644
--- a/Makefile.in
+++ b/Makefile.in
@@ -286,6 +286,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -323,6 +325,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -350,6 +354,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -368,6 +374,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -378,6 +386,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -403,6 +413,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -428,6 +440,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -559,6 +573,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -616,8 +632,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -687,6 +707,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -808,6 +829,7 @@
 	$(top_builddir)/common/shave \
 	$(top_builddir)/common/shave-libtool \
 	$(top_builddir)/ext/alsaspdif/.libs/*.{so,dll,DLL,dylib} \
+	$(top_builddir)/ext/hls/.libs/libgstfragmented* \
 	$(top_builddir)/ext/ivorbis/.libs/*.{so,dll,DLL,dylib} \
 	$(top_builddir)/ext/jack/.libs/*.{so,dll,DLL,dylib} \
 	$(top_builddir)/gst/aacparse/.libs/*.{so,dll,DLL,dylib} \
@@ -851,6 +873,7 @@
 	$(top_srcdir)/gst/hls \
 	$(top_srcdir)/gst/imagefreeze \
 	$(top_srcdir)/gst/invtelecine \
+	$(top_srcdir)/gst/liveadder \
 	$(top_srcdir)/gst/mpeg4videoparse \
 	$(top_srcdir)/gst/qtmux \
 	$(top_srcdir)/gst/rtpmux \
@@ -1446,6 +1469,9 @@
 	@if [ -d ../www/data/src ]; then \
 	  mv -v $(PACKAGE)-$(VERSION).tar.xz ../www/data/src/$(PACKAGE)/ ; \
 	  mv -v $(PACKAGE)-$(VERSION).tar.xz.sha256sum ../www/data/src/$(PACKAGE)/ ; \
+	elif [ -d ../../www/data/src ]; then \
+	  mv -v $(PACKAGE)-$(VERSION).tar.xz ../../www/data/src/$(PACKAGE)/ ; \
+	  mv -v $(PACKAGE)-$(VERSION).tar.xz.sha256sum ../../www/data/src/$(PACKAGE)/ ; \
 	fi
 	@echo "================================================================================================="
 
diff --git a/NEWS b/NEWS
index bfae3d8..a4bffc6 100644
--- a/NEWS
+++ b/NEWS
@@ -1,36 +1,2 @@
-This is GStreamer 1.6.2
-
-The GStreamer team is proud to announce the second bugfix release in the stable
-1.6 release series of your favourite cross-platform multimedia framework!
-
-This release only contains bugfixes and it is safe to update from 1.6.0 and
-1.6.1. For a full list of bugfixes see Bugzilla:
-  https://bugzilla.gnome.org/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&limit=0&list_id=83309&order=bug_id&product=GStreamer&resolution=FIXED&target_milestone=1.6.2
-
-See http://gstreamer.freedesktop.org/releases/1.6/ for the latest version of this document.
-
-Major bugfixes
-
-- Crashes in gst-libav with sinks that did not provide a buffer pool
-  but supported video metadata were fixed. This affected d3dvideosink
-  and some 3rd party sinks. Also related fixes for crashes when a downstream
-  buffer pool failed allocation.
-- Big GL performance improvement on iOS by a factor of 2 by using Apple's sync
-  extension.
-- Deadlocks in the DirectSound elements on Windows, and the behaviour of its
-  mute property were fixed.
-- The Direct3D video sink does not crash anymore when minimizing the window
-- The library soname generation on Android >= 6.0 was fixed, which previously
-  caused GStreamer to fail to load there.
-- File related elements have large-file (>2GB) support on Android now.
-- gst-libav was updated to ffmpeg 2.8.3.
-- Deserialization of custom events in the GDP depayloader was fixed.
-- Missing OpenGL context initialization in the Qt/QML video sink was fixed in
-  certain situations.
-- Interoperability with some broken RTSP servers using HTTP tunnel was
-  improved.
-- Various compilation fixes for Windows.
-- Various smaller memory leak and other fixes in different places.
-- and many, many more:
-  https://bugzilla.gnome.org/buglist.cgi?bug_status=RESOLVED&bug_status=VERIFIED&limit=0&list_id=83309&order=bug_id&product=GStreamer&resolution=FIXED&target_milestone=1.6.2
+This is GStreamer 1.7.1
 
diff --git a/README b/README
index f175b1b..de0e341 100644
--- a/README
+++ b/README
@@ -1,4 +1,4 @@
-GStreamer 1.5.x development series
+GStreamer 1.7.x development series
 
 WHAT IT IS
 ----------
@@ -179,8 +179,8 @@
   make install
 
 - try out a simple test:
-  gst-launch -v fakesrc num_buffers=5 ! fakesink
-  (If you didn't install GStreamer, prefix gst-launch with tools/)
+  gst-launch-1.0 -v fakesrc num_buffers=5 ! fakesink
+  (If you didn't install GStreamer, prefix gst-launch-1.0 with tools/)
 
   If it outputs a bunch of messages from fakesrc and fakesink, everything is
   ok.
diff --git a/RELEASE b/RELEASE
index 0db3dbc..790f691 100644
--- a/RELEASE
+++ b/RELEASE
@@ -1,19 +1,17 @@
 
-Release notes for GStreamer Bad Plugins 1.6.2
+Release notes for GStreamer Bad Plugins 1.7.1
 
 
-The GStreamer team is proud to announce the second bugfix release in the stable
-1.6 release series of your favourite cross-platform multimedia framework!
+The GStreamer team is pleased to announce the first release of the unstable
+1.7 release series. The 1.7 release series is adding new features on top of
+the 1.0, 1.2, 1.4 and 1.6 series and is part of the API and ABI-stable 1.x release
+series of the GStreamer multimedia framework. The unstable 1.7 release series
+will lead to the stable 1.8 release series in the next weeks. Any newly added
+API can still change until that point.
 
 
-
-This release only contains bugfixes and it is safe to update from 1.6.0 and 1.6.1. For a
-full list of bugfixes see Bugzilla.
-
-
-
-See http://gstreamer.freedesktop.org/releases/1.6/
-for the full release notes.
+Binaries for Android, iOS, Mac OS X and Windows will be provided separately
+during the unstable 1.7 release series.
 
 
 
@@ -65,20 +63,138 @@
 
 Bugs fixed in this release
      
-      * 757610 : compositor: negotation failure when mixing alpha and non alpha branches
-      * 738292 : directsoundsrc: hRes unckecked, which may cause a endless loop
-      * 741608 : d3dvideosink: Pipeline crash after assigned Window minimized
-      * 753823 : assrender: do not handle seek events
-      * 756951 : vtenc: Outputting frames without having input frames at EOS
-      * 757854 : gl: Recent texture target changes break negotiation in glcolorconvert and gtkglsink
-      * 757873 : tsdemux: fix unadded pad leak
-      * 757895 : tsdemux: pending buffers leak when flushing
-      * 757929 : tests:glcolorconvert: Fix caps memory leak
-      * 757935 : vtenc double-releases CFString 'profile_level' on restart
-      * 758205 : glimagesink: Fix structure memory leak
-      * 758286 : qtitem: GstQSGTexture leaks in updatePaintNode
-      * 758337 : qtglwidget qtitem: missing opengl context initialization
-      * 758913 : pcapparse: Does not forward FLUSH_STOP events
+      * 759679 : gl: unused function '_get_plane_width'
+      * 759729 : audiofxbad: Name collision with new GstAudioChannelMix API from libgstaudio
+      * 731204 : androidmedia: Implement zerocopy rendering
+      * 733467 : Cannot play JPEG2000 encoded QuickTime video
+      * 733819 : Port teletextdec to 1.0
+      * 733959 : hlsdemux: download bitrate algorithms don't reflect real download rate
+      * 743345 : glupload: Add support for dmabuf
+      * 744047 : Port acmmp3dec plugin to 1.x
+      * 745564 : qtkitvideosrc: fails to build on OSX > = 10.9 and not using cerbero (ex: MacPorts)
+      * 747482 : waylandsink: need exception code in gst_wayland_sink_set_window_handle() and gst_wayland_sink_set_context()
+      * 747774 : dashdemux: text streams support
+      * 748259 : New audio/video level element
+      * 748316 : hlsdemux: The end offset (range_end) of a segment is not calculated properly in the m3u8 parser
+      * 748337 : ksvideosrc: dropping frames
+      * 749653 : dashdemux: Implement binary search for stream_sidx_seek
+      * 750402 : tsdemux: pads are removed before new ones are added
+      * 750847 : dashdemux: variables containing time information should be guint64 not gint64
+      * 750852 : dashdemux: idRepresentationType should be StringNoWhitespaceType but accepts spaces
+      * 750869 : dashdemux: assertion raised if profiles information is not provided
+      * 751068 : gl: Use pkg-config if found to configure GL/EGL/GLES (as provided by mesa and libmali)
+      * 751529 : dashdemux: stream- > presentationTimeOffset is not always set
+      * 751650 : dashdemux: extra validations needed when parsing the representation element
+      * 751735 : dashdemux: incorrect parsing and handling of segment templates
+      * 751832 : dashdemux: segment list inherits segment URLs element from parent node
+      * 752326 : dashdemux: parser should reject MPD files with negative mediaPresentationDuration
+      * 752329 : dashdemux: parser should reject MPD files with negative Period duration
+      * 752336 : dashdemux: duration field could overflow
+      * 752340 : dashdemux: period bitstreamSwitching is not used
+      * 752367 : dashdemux: adaptation set language could be better detected
+      * 752409 : dashdemux: gst_mpd_parser_get_stream_presentation_offset returns a wrong value
+      * 752415 : dashdemux: provide a default suggestedPresentationDelay
+      * 752429 : dashdemux: negative numbers are successfully read into unsigned variables
+      * 752492 : dashdemux: suggestedPresentationDelay should be positive
+      * 752496 : dashdemux: illegal memory access when the list of S nodes is greater than the list of SegmentURL nodes
+      * 753405 : nvenc element
+      * 753613 : mssdemux: PlayReady WRM parsing support
+      * 753821 : assrender: improve overlay blending performance
+      * 753824 : assrender: render overlay using the video output window size
+      * 753854 : gstreamer: bad: Fix memory leaks when context parse fails.
+      * 753885 : opencv: use gst_opencv_video_filter_set_in_place()
+      * 753889 : opencv: cvlaplace: add scale and shift properties
+      * 753890 : dashdemux: PROP_BANDWIDTH_USAGE should be deprecated
+      * 753940 : opencv: handdetect: haar cascade files path is wrong in gst-uninstalled
+      * 754057 : sfdec: Fix a typo in goto variable name
+      * 754247 : vc1parse: add break to switch case
+      * 754251 : qtsink: explicitely fallthrough switch statement
+      * 754253 : qml: remove overwritten value
+      * 754285 : compositor: add unit test for ensuring that sinkpads are sorted by zorder
+      * 754466 : qml: add android support
+      * 754786 : vtdec: fails on OSX with GL3 context
+      * 755100 : qt: add build support for iOS/OSX
+      * 755105 : dashdemux: tests: add test for fix of the period start time scaling
+      * 755120 : dashdemux: stop_updates_task needs to be accessed with the lock taken
+      * 755121 : dahsdemux: task is signaled to stop without stop condition being set
+      * 755161 : h264parse, h265parse: initialize picture parameter set structure
+      * 755169 : dashdemux: can we have multiple seek events at the same time?
+      * 755226 : dashdemux: download_finish variable is not reset safely
+      * 755232 : dashdemux: demux- > cancelled is not properly protected
+      * 755319 : configure: add --with-hls-crypto=auto|nettle|libgcrypt|openssl option
+      * 755486 : glimagesink: doesn't support YUY2 properly
+      * 755656 : adaptivedemux: remove unused but set variable
+      * 756209 : adaptivedemux: adaptive demux hangs if src element cannot be started
+      * 756237 : adaptivedemux: waiting for playlist updates in case of fragment errors does not wait
+      * 756239 : adaptivedemux: header is not re-downloaded in case of errors
+      * 756240 : adaptivedemux: download thread should stop in case of multiple download errors
+      * 756322 : dashdemux: add unit test for dashdemux
+      * 756424 : docs: documentation not committed
+      * 756492 : gl: fix leak in gst_gl_insert_debug_marker
+      * 756556 : adaptivedemux: hang if application quits just after start
+      * 757018 : aggregator: Add create_new_pad() vfunc to allow subclasses to override the default behaviour
+      * 757049 : tsdemux: Add support for Opus
+      * 757050 : liveadder: type change of " latency " property might cause crashes
+      * 757152 : opus: Add proper multichannel support
+      * 757153 : opus: Handle start/end trimming
+      * 757245 : dashdemux: tests: add more tests for BaseURL
+      * 757285 : androidmedia: Zerocopy decoding potentially slower than before due to missing queueing
+      * 757335 : adaptivedemux: release manifest lock before changing internal pipeline state
+      * 757336 : adaptivedemux: reset download_finished before starting the src element
+      * 757337 : adaptivedemux: release manifest lock before sending flush stop event
+      * 757354 : adaptivedemux: tests: add download error test
+      * 757359 : adaptivedemux: fix a missing lock in write to stream- > last_ret
+      * 757361 : adaptivedemux: tests: add query and fragment download error test
+      * 757619 : hlsdemux: incorrect segment start value on bitrate switch
+      * 757688 : rtponviftimestamp: element does not work properly
+      * 757776 : dashdemux: Unit test fails reliably
+      * 757801 : tests:aggregator: tc failure
+      * 757825 : ivfparse: Fix the wrong width & height parsing of vp9 bitstream
+      * 757859 : adaptivedemux: memory leak in adaptive demux src bin
+      * 757903 : mpd verification broke http://www.bok.net/dash/tears_of_steel/cleartext/stream.mpd
+      * 757938 : glcolorconvert fails on OSX
+      * 757947 : adaptivedemux: http src errors are no longer detected
+      * 757974 : glcolorconvert: Fix memory leak while running glcolorconvert test
+      * 758010 : mpegtsdemux: stream- > section_data leak if there is a stream discontinuity
+      * 758188 : dashdemux: illegal memory access in gst_mpd_client_get_last_fragment_timestamp_end
+      * 758228 : amcvideodec: Don't require a non-zero buffer size when doing decoding to a surface
+      * 758233 : mpdparser: remove unused functions gst_mpdparser_get_chunk_by_index and gst_mpdparser_find_segment_by_index
+      * 758384 : dashdemux: tests: refactor into adaptive_engine components
+      * 758386 : hlsdemux: incorrect calculation of seek range of non-live streams
+      * 758405 : h264/h265parse: Should resend pps/sps after seeks in byte-stream mode
+      * 758410 : mpdparser: parsing of dateTime fields does not read the microseconds part
+      * 758515 : dashdemux:  Set framerate based on the Manifest on the caps
+      * 758517 : spu-pgs: Fix array memory leak
+      * 758586 : mssdemux: missing depth in audio caps
+      * 758593 : mpdparser: remove gst_mpd_client_check_time_position
+      * 758694 : android media fails to update affine transformation meta
+      * 758728 : id3mux: write private data tag
+      * 758820 : glwindow: Fix memory leak of navigation thread
+      * 758877 : glupload: Should not offer its allocator unless memory:GLMemory is negotiated
+      * 758904 : gl: YUY2 conversion broken
+      * 758946 : hlsdemux: change of playlist to the same playlist after first fragment, when connection speed is set
+      * 758987 : hlsdemux: Resync live playlists to the 3rd newest fragment if we fall off the playlist
+      * 759108 : hlsdemux: add support for snapping seek flags
+      * 759118 : mxfdemux: IndexTableSegment handling is wrong
+      * 759432 : bad plugins: Fix example pipelines
+      * 759443 : videoframe-audiolevel: Fix possible division by zero
+      * 759484 : directsoundsrc: add device property as it is done in directsoundsink
+      * 759518 : yadif: Fix memory leak and mishandling.
+      * 759519 : gdppay: Fix buffer memory leak
+      * 759520 : pnmenc: Fix memory leaks/mishandling
+      * 759522 : pnmdec: Fix memory leaks
+      * 759523 : combdetect: Fix value memory leak
+      * 759525 : ivtc: Fix value memory leak
+      * 759534 : dashdemux: clock compensation is not correctly used in get_fragment_waiting_time
+      * 759537 : dashdemux: clock compensation: clock_cond is not used and should be removed
+      * 759547 : dashdemux: insufficient validation of UTCtiming element
+      * 759592 : Seek with negative rates appears to be broken with hlsdemux
+      * 759600 : decklinkvideosink: Made " auto " mode work according to caps
+      * 759728 : teletextdec: build error with clang
+      * 759742 : nvenc: very high CPU load when multiple nvenc instances are initialised at the same time
+      * 752528 : OpenCV hand gesture detection does not work with OpenCV newer than 2.4.10
+      * 753994 : opencv/faceblur: does not work with OpenCV newer than 2.4.10
+      * 754148 : OpenCV port remaining elements to C++ and new API
 
 ==== Download ====
 
@@ -115,16 +231,71 @@
         
 Contributors to this release
     
+      * Aleix Conchillo Flaqué
       * Alessandro Decina
+      * Alex Ashley
+      * André Draszik
+      * Antoine Jacoutot
+      * Antonio Ospite
+      * Arnaud Vrac
+      * Branko Subasic
+      * Chris Bass
+      * Daniel Kamil Kozar
+      * Dave Craig
+      * Duncan Palmer
       * Edward Hervey
       * Etienne Peron
+      * Florin Apostol
+      * Frédéric Wang
+      * George Kiagiadakis
+      * Guillaume Desmottes
+      * Haihua Hu
+      * Havard Graff
       * Heinrich Fink
+      * Hyunil Park
+      * Hyunjun Ko
+      * Jan Schmidt
+      * Jimmy Ohn
+      * John Chang
+      * John Slade
+      * Julian Bouzas
+      * Julien Isorce
+      * Linus Svensson
+      * Lubosz Sarnecki
+      * Luis de Bethencourt
+      * Maroš Ondrášek
+      * Mathias Hasselmann
+      * Matthew Marsh
       * Matthew Waters
+      * Matthieu Bouron
+      * Miguel París Díaz
+      * Nicolas Dufresne
       * Nicolas Huet
+      * Nirbheek Chauhan
+      * Olivier Crête
       * Paolo Pettinato
+      * Paul Arzelier
+      * Philippe Normand
+      * Philippe Renon
+      * Polochon_street
+      * Ravi Kiran K N
+      * Reynaldo H. Verdejo Pinochet
       * Roman Nowicki
+      * Santiago Carot-Nemesio
       * Sebastian Dröge
+      * Sreerenj Balachandran
+      * Stefan Sauer
+      * Thiago Santos
+      * Thibault Saunier
       * Thomas Roos
       * Tim-Philipp Müller
+      * Vanessa Chipirrás Navalón
+      * Vincent Penquerc'h
+      * Vineeth T M
       * Vineeth TM
+      * Vivia Nikolaidou
+      * Víctor Manuel Jáquez Leal
+      * Xavier Claessens
+      * plamot
+      * suhwang.kim
  
\ No newline at end of file
diff --git a/autogen.sh b/autogen.sh
index 7912654..ee2ce92 100755
--- a/autogen.sh
+++ b/autogen.sh
@@ -37,7 +37,11 @@
 if test ! \( -x .git/hooks/pre-commit -a -L .git/hooks/pre-commit \);
 then
     rm -f .git/hooks/pre-commit
-    ln -s ../../common/hooks/pre-commit.hook .git/hooks/pre-commit
+    if ! ln -s ../../common/hooks/pre-commit.hook .git/hooks/pre-commit 2> /dev/null
+    then
+        echo "Failed to create commit hook symlink, copying instead ..."
+        cp common/hooks/pre-commit.hook .git/hooks/pre-commit
+    fi
 fi
 
 # GNU gettext automake support doesn't get along with git.
@@ -50,6 +54,8 @@
 
 if test "x$package" = "xgstreamer"; then
   CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --enable-docbook --enable-failing-tests --enable-poisoning"
+elif test "x$package" = "xgst-plugins-bad"; then
+  CONFIGURE_DEF_OPT="$CONFIGURE_DEF_OPT --with-player-tests"
 fi
 
 autogen_options $@
diff --git a/common/Makefile.in b/common/Makefile.in
index d71b3ba..a4277f5 100644
--- a/common/Makefile.in
+++ b/common/Makefile.in
@@ -248,6 +248,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -285,6 +287,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -312,6 +316,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -330,6 +336,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -340,6 +348,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -365,6 +375,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -390,6 +402,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -521,6 +535,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -578,8 +594,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -649,6 +669,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/common/check.mak b/common/check.mak
index 8a90b5d..25a16e6 100644
--- a/common/check.mak
+++ b/common/check.mak
@@ -57,7 +57,7 @@
 	--show-possibly-lost=no                                 \
 	--leak-resolution=high --num-callers=20			\
 	./$* 2>&1 | tee $$valgrind_log ;			\
-	if grep "==" $$valgrind_log > /dev/null 2>&1; then	\
+	if grep "^==" $$valgrind_log > /dev/null 2>&1; then	\
 	    rm $$valgrind_log;					\
 	    exit 1;						\
 	fi ;							\
diff --git a/common/gst.supp b/common/gst.supp
index 81f98a9..2740e9a 100644
--- a/common/gst.supp
+++ b/common/gst.supp
@@ -3976,7 +3976,6 @@
 {
    closures aren't valgrind friendly (bgo#739850)
    Memcheck:Leak
-   match-leak-kinds: possible
    fun:calloc
    ...
    fun:g_cclosure_new
@@ -3985,7 +3984,6 @@
 {
    closures aren't valgrind friendly (bgo#739850)
    Memcheck:Leak
-   match-leak-kinds: possible
    fun:malloc
    ...
    fun:g_closure_add_invalidate_notifier
@@ -3994,7 +3992,6 @@
 {
    closures aren't valgrind friendly (bgo#739850)
    Memcheck:Leak
-   match-leak-kinds: possible
    fun:calloc
    ...
    fun:g_closure_new_simple
@@ -4020,3 +4017,12 @@
    Memcheck:Addr8
    fun:do_lookup_x
 }
+
+{
+   <quark tables are leaked on purpose when they are expanded, observed with glib 2.46 and gst-rtsp-server tests>
+   Memcheck:Leak
+   fun:malloc
+   ...
+   fun:g_quark_init
+   fun:glib_init_ctor
+}
diff --git a/common/m4/Makefile.in b/common/m4/Makefile.in
index 441d6fc..1f3f788 100644
--- a/common/m4/Makefile.in
+++ b/common/m4/Makefile.in
@@ -188,6 +188,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -225,6 +227,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -252,6 +256,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -270,6 +276,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -280,6 +288,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -305,6 +315,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -330,6 +342,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -461,6 +475,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -518,8 +534,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -589,6 +609,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/common/m4/gst-args.m4 b/common/m4/gst-args.m4
index b478c82..0628123 100644
--- a/common/m4/gst-args.m4
+++ b/common/m4/gst-args.m4
@@ -358,3 +358,29 @@
       fi
     ])
 ])
+
+dnl Enable extra checks by default only for development versions
+AC_DEFUN([AG_GST_ARG_ENABLE_EXTRA_CHECKS],
+[
+  AC_ARG_ENABLE(extra-check,
+    AC_HELP_STRING([--enable-extra-checks],
+                   [Enable extra runtime checks]),
+    [
+      case "${enableval}" in
+        yes) EXTRA_CHECKS=yes ;;
+        no)  EXTRA_CHECKS=no ;;
+        *)   AC_MSG_ERROR(bad value ${enableval} for --enable-extra-checks) ;;
+      esac
+    ],
+    [
+      if test "x`expr $PACKAGE_VERSION_MINOR % 2`" = "x1" -a "x`expr $PACKAGE_VERSION_MICRO '<' 90`" = "x1"; then
+        EXTRA_CHECKS=yes
+      else
+        EXTRA_CHECKS=no
+      fi
+    ])
+
+    if test "x$EXTRA_CHECKS" = "xyes"; then
+        AC_DEFINE(GST_ENABLE_EXTRA_CHECKS, 1, [Define if extra runtime checks should be enabled])
+    fi
+])
diff --git a/common/m4/gst-error.m4 b/common/m4/gst-error.m4
index d6487cc..0067588 100644
--- a/common/m4/gst-error.m4
+++ b/common/m4/gst-error.m4
@@ -52,31 +52,6 @@
   if test "x$1" != "xno"
   then
     AS_COMPILER_FLAG(-Werror, ERROR_CFLAGS="$ERROR_CFLAGS -Werror")
-
-    dnl if -Werror isn't suported, try -errwarn=%all (Sun Forte case)
-    if test "x$ERROR_CFLAGS" = "x"
-    then
-      AS_COMPILER_FLAG([-errwarn=%all], [
-          ERROR_CFLAGS="-errwarn=%all"
-          dnl try -errwarn=%all,no%E_EMPTY_DECLARATION,
-          dnl no%E_STATEMENT_NOT_REACHED,no%E_ARGUEMENT_MISMATCH,
-          dnl no%E_MACRO_REDEFINED (Sun Forte case)
-          dnl For Forte we need disable "empty declaration" warning produced by un-needed semicolon
-          dnl "statement not reached" disabled because there is g_assert_not_reached () in some places
-          dnl "macro redefined" because of gst/gettext.h
-          dnl FIXME: is it really supposed to be 'ARGUEMENT' and not 'ARGUMENT'?
-          for f in 'no%E_EMPTY_DECLARATION' \
-                   'no%E_STATEMENT_NOT_REACHED' \
-                   'no%E_ARGUEMENT_MISMATCH' \
-                   'no%E_MACRO_REDEFINED' \
-                   'no%E_LOOP_NOT_ENTERED_AT_TOP'
-          do
-            AS_COMPILER_FLAG([-errwarn=%all,$f], [
-              ERROR_CFLAGS="$ERROR_CFLAGS,$f"
-            ])
-          done
-      ])
-    fi
   fi
 
   if test "x$2" != "x"
@@ -142,28 +117,6 @@
 	  AS_CXX_COMPILER_FLAG([-fno-strict-aliasing],
 	    ERROR_CXXFLAGS="$ERROR_CXXFLAGS -fno-strict-aliasing")
 	  ])
-    else
-      dnl if -Werror isn't suported, try -errwarn=%all
-      AS_CXX_COMPILER_FLAG([-errwarn=%all], ERROR_CXXFLAGS="$ERROR_CXXFLAGS -errwarn=%all")
-      if test "x$ERROR_CXXFLAGS" != "x"; then
-        dnl try -errwarn=%all,no%E_EMPTY_DECLARATION,
-        dnl no%E_STATEMENT_NOT_REACHED,no%E_ARGUEMENT_MISMATCH,
-        dnl no%E_MACRO_REDEFINED (Sun Forte case)
-        dnl For Forte we need disable "empty declaration" warning produced by un-needed semicolon
-        dnl "statement not reached" disabled because there is g_assert_not_reached () in some places
-        dnl "macro redefined" because of gst/gettext.h
-        dnl FIXME: is it really supposed to be 'ARGUEMENT' and not 'ARGUMENT'?
-        dnl FIXME: do any of these work with the c++ compiler? if not, why
-        dnl do we check at all?
-        for f in 'no%E_EMPTY_DECLARATION' \
-                 'no%E_STATEMENT_NOT_REACHED' \
-                 'no%E_ARGUEMENT_MISMATCH' \
-                 'no%E_MACRO_REDEFINED' \
-                 'no%E_LOOP_NOT_ENTERED_AT_TOP'
-        do
-          AS_CXX_COMPILER_FLAG([-errwarn=%all,$f], [ERROR_CXXFLAGS="$ERROR_CXXFLAGS,$f"])
-        done
-      fi
     fi
   fi
 
@@ -227,28 +180,6 @@
 	  AS_OBJC_COMPILER_FLAG([-fno-strict-aliasing],
 	    ERROR_OBJCFLAGS="$ERROR_OBJCFLAGS -fno-strict-aliasing")
 	  ])
-    else
-      dnl if -Werror isn't suported, try -errwarn=%all
-      AS_OBJC_COMPILER_FLAG([-errwarn=%all], ERROR_OBJCFLAGS="$ERROR_OBJCFLAGS -errwarn=%all")
-      if test "x$ERROR_OBJCFLAGS" != "x"; then
-        dnl try -errwarn=%all,no%E_EMPTY_DECLARATION,
-        dnl no%E_STATEMENT_NOT_REACHED,no%E_ARGUEMENT_MISMATCH,
-        dnl no%E_MACRO_REDEFINED (Sun Forte case)
-        dnl For Forte we need disable "empty declaration" warning produced by un-needed semicolon
-        dnl "statement not reached" disabled because there is g_assert_not_reached () in some places
-        dnl "macro redefined" because of gst/gettext.h
-        dnl FIXME: is it really supposed to be 'ARGUEMENT' and not 'ARGUMENT'?
-        dnl FIXME: do any of these work with the c++ compiler? if not, why
-        dnl do we check at all?
-        for f in 'no%E_EMPTY_DECLARATION' \
-                 'no%E_STATEMENT_NOT_REACHED' \
-                 'no%E_ARGUEMENT_MISMATCH' \
-                 'no%E_MACRO_REDEFINED' \
-                 'no%E_LOOP_NOT_ENTERED_AT_TOP'
-        do
-          AS_OBJC_COMPILER_FLAG([-errwarn=%all,$f], [ERROR_OBJCFLAGS="$ERROR_OBJCFLAGS,$f"])
-        done
-      fi
     fi
   fi
 
diff --git a/common/m4/gst-glib2.m4 b/common/m4/gst-glib2.m4
index 5b9cd8b..5b72507 100644
--- a/common/m4/gst-glib2.m4
+++ b/common/m4/gst-glib2.m4
@@ -51,18 +51,9 @@
   fi
 
   AC_ARG_ENABLE(glib-asserts,
-    AS_HELP_STRING([--enable-glib-asserts[=@<:@no/auto/yes@:>@]],
+    AS_HELP_STRING([--enable-glib-asserts[=@<:@no/yes@:>@]],
       [Enable GLib assertion]),[enable_glib_assertions=$enableval],
-    [enable_glib_assertions=auto])
-
-  if test "x$enable_glib_assertions" = "xauto"; then
-    dnl Enable assertions only for development versions
-    if test "x`expr $PACKAGE_VERSION_MINOR % 2`" = "x1" -a "x`expr $PACKAGE_VERSION_MICRO '<' 90`" = "x1"; then
-      enable_glib_assertions=yes
-    else
-      enable_glib_assertions=no
-    fi
-  fi
+    [enable_glib_assertions=yes])
 
   if test "x$enable_glib_assertions" = "xno"; then
     GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_ASSERT"
diff --git a/common/m4/gst-package-release-datetime.m4 b/common/m4/gst-package-release-datetime.m4
index bc885e3..4cf44e6 100644
--- a/common/m4/gst-package-release-datetime.m4
+++ b/common/m4/gst-package-release-datetime.m4
@@ -27,14 +27,16 @@
 AC_DEFUN([AG_GST_SET_PACKAGE_RELEASE_DATETIME],
 [
   dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME()
-  dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes]...)
+  dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([no]...)
   if test "x$1" = "xno" -o "x$1" = "x"; then
     GST_PACKAGE_RELEASE_DATETIME=`date -u "+%Y-%m-%dT%H:%MZ"`
   elif test "x$1" = "xyes"; then
-    dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([no], ["YYYY-MM-DD"])
-    dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([no], [DOAP-FILE], [RELEASE-VERSION])
-    if ( echo $1 | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
-      GST_PACKAGE_RELEASE_DATETIME=$1
+    dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes], [YYYY-MM-DD])
+    dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([yes], [DOAP-FILE], [RELEASE-VERSION])
+changequote(<<, >>)dnl
+    if ( echo $2 | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
+changequote([, ])dnl
+      GST_PACKAGE_RELEASE_DATETIME=$2
     else
       dnl we assume the .doap file contains the date as YYYY-MM-DD
       YYYY_MM_DD=`sh "${srcdir}/common/extract-release-date-from-doap-file" $3 $2`;
@@ -47,7 +49,9 @@
       fi
     fi
   dnl AG_GST_SET_PACKAGE_RELEASE_DATETIME([YYYY-MM-DD])
+changequote(<<, >>)dnl
   elif ( echo $1 | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
+changequote([, ])dnl
     GST_PACKAGE_RELEASE_DATETIME=$1
   else
     AC_MSG_WARN([SET_PACKAGE_RELEASE_DATETIME: invalid first argument])
diff --git a/common/release.mak b/common/release.mak
index 715657b..c84c2f1 100644
--- a/common/release.mak
+++ b/common/release.mak
@@ -14,6 +14,9 @@
 	@if [ -d ../www/data/src ]; then \
 	  mv -v $(PACKAGE)-$(VERSION).tar.xz ../www/data/src/$(PACKAGE)/ ; \
 	  mv -v $(PACKAGE)-$(VERSION).tar.xz.sha256sum ../www/data/src/$(PACKAGE)/ ; \
+	elif [ -d ../../www/data/src ]; then \
+	  mv -v $(PACKAGE)-$(VERSION).tar.xz ../../www/data/src/$(PACKAGE)/ ; \
+	  mv -v $(PACKAGE)-$(VERSION).tar.xz.sha256sum ../../www/data/src/$(PACKAGE)/ ; \
 	fi
 	@echo "================================================================================================="
 
diff --git a/config.h.in b/config.h.in
index e6f84cb..3ea2af3 100644
--- a/config.h.in
+++ b/config.h.in
@@ -52,12 +52,18 @@
 /* GStreamer API Version */
 #undef GST_API_VERSION
 
+/* Define if extra runtime checks should be enabled */
+#undef GST_ENABLE_EXTRA_CHECKS
+
 /* Extra platform specific plugin suffix */
 #undef GST_EXTRA_MODULE_SUFFIX
 
 /* Defined if gcov is enabled to force a rebuild due to config.h changing */
 #undef GST_GCOV_ENABLED
 
+/* DMABUF available for gl plugins */
+#undef GST_GL_HAVE_DMABUF
+
 /* EGL module name */
 #undef GST_GL_LIBEGL_MODULE_NAME
 
@@ -406,6 +412,12 @@
 /* Define if nettle is available */
 #undef HAVE_NETTLE
 
+/* Define to enable NVIDIA Encode API (used by nvenc). */
+#undef HAVE_NVENC
+
+/* NVENC GStreamer OpenGL support available */
+#undef HAVE_NVENC_GST_GL
+
 /* Define to enable ofa plugins (used by ofa). */
 #undef HAVE_OFA
 
@@ -498,6 +510,15 @@
 /* Define to enable Qt elements (used by qt). */
 #undef HAVE_QT
 
+/* Define if Qt Android integration is installed */
+#undef HAVE_QT_ANDROID
+
+/* Define if Qt iOS integration is installed */
+#undef HAVE_QT_IOS
+
+/* Define if Qt Mac integration is installed */
+#undef HAVE_QT_MAC
+
 /* Define if Qt Wayland integration is installed */
 #undef HAVE_QT_WAYLAND
 
diff --git a/configure b/configure
index de8aab2..985e6ff 100755
--- a/configure
+++ b/configure
@@ -1,6 +1,6 @@
 #! /bin/sh
 # Guess values for system-dependent variables and create Makefiles.
-# Generated by GNU Autoconf 2.69 for GStreamer Bad Plug-ins 1.6.2.
+# Generated by GNU Autoconf 2.69 for GStreamer Bad Plug-ins 1.7.1.
 #
 # Report bugs to <http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer>.
 #
@@ -591,8 +591,8 @@
 # Identity of this package.
 PACKAGE_NAME='GStreamer Bad Plug-ins'
 PACKAGE_TARNAME='gst-plugins-bad'
-PACKAGE_VERSION='1.6.2'
-PACKAGE_STRING='GStreamer Bad Plug-ins 1.6.2'
+PACKAGE_VERSION='1.7.1'
+PACKAGE_STRING='GStreamer Bad Plug-ins 1.7.1'
 PACKAGE_BUGREPORT='http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer'
 PACKAGE_URL=''
 
@@ -658,10 +658,10 @@
 X265_CFLAGS
 USE_HLS_FALSE
 USE_HLS_TRUE
-LIBGCRYPT_LIBS
-LIBGCRYPT_CFLAGS
 OPENSSL_LIBS
 OPENSSL_CFLAGS
+LIBGCRYPT_LIBS
+LIBGCRYPT_CFLAGS
 LIBGCRYPT_CONFIG
 NETTLE_LIBS
 NETTLE_CFLAGS
@@ -749,6 +749,12 @@
 LIBVISUAL_CFLAGS
 USE_QT_FALSE
 USE_QT_TRUE
+QT_MAC_LIBS
+QT_MAC_CFLAGS
+GNUSTL_LIBS
+GNUSTL_CFLAGS
+QT_ANDROID_LIBS
+QT_ANDROID_CFLAGS
 QT_WAYLAND_LIBS
 QT_WAYLAND_CFLAGS
 QT_X11_LIBS
@@ -982,6 +988,18 @@
 USE_ASSRENDER_TRUE
 ASSRENDER_LIBS
 ASSRENDER_CFLAGS
+USE_NVENC_GST_GL_FALSE
+USE_NVENC_GST_GL_TRUE
+USE_NVENC_FALSE
+USE_NVENC_TRUE
+NVENCODE_LIBS
+NVENCODE_CFLAGS
+CUDA_LIBS
+CUDA_CFLAGS
+GST_PBUTILS_LIBS
+GST_PBUTILS_CFLAGS
+GST_VIDEO_LIBS
+GST_VIDEO_CFLAGS
 LIBUDEV_LIBS
 LIBUDEV_CFLAGS
 USE_UVCH264_FALSE
@@ -1078,12 +1096,18 @@
 USE_GLES2
 USE_OPENGL
 GL_OBJCFLAGS
-GL_CFLAGS
-GL_LIBS
+GST_ALLOCATORS_LIBS
+GST_ALLOCATORS_CFLAGS
 WAYLAND_EGL_LIBS
 WAYLAND_EGL_CFLAGS
 HAVE_EGL
+EGL_LIBS
+EGL_CFLAGS
 HAVE_GLES2
+GLES2_LIBS
+GLES2_CFLAGS
+GL_LIBS
+GL_CFLAGS
 HAVE_GL
 X_LIBS
 X_CFLAGS
@@ -1157,8 +1181,6 @@
 USE_PLUGIN_MPEGDEMUX_TRUE
 USE_PLUGIN_MIDI_FALSE
 USE_PLUGIN_MIDI_TRUE
-USE_PLUGIN_LIVEADDER_FALSE
-USE_PLUGIN_LIVEADDER_TRUE
 USE_PLUGIN_LIBRFB_FALSE
 USE_PLUGIN_LIBRFB_TRUE
 USE_PLUGIN_JPEGFORMAT_FALSE
@@ -1223,6 +1245,8 @@
 USE_PLUGIN_AUDIOFXBAD_TRUE
 USE_PLUGIN_ASFMUX_FALSE
 USE_PLUGIN_ASFMUX_TRUE
+USE_PLUGIN_VIDEOFRAME_AUDIOLEVEL_FALSE
+USE_PLUGIN_VIDEOFRAME_AUDIOLEVEL_TRUE
 USE_PLUGIN_AIFF_FALSE
 USE_PLUGIN_AIFF_TRUE
 USE_PLUGIN_ADPCMENC_FALSE
@@ -1243,6 +1267,9 @@
 WARNING_CXXFLAGS
 ERROR_CFLAGS
 WARNING_CFLAGS
+WITH_GST_PLAYER_TESTS_FALSE
+WITH_GST_PLAYER_TESTS_TRUE
+WGET
 GST_PLUGIN_BUILD_STATIC_FALSE
 GST_PLUGIN_BUILD_STATIC_TRUE
 GST_PLUGIN_LIBTOOLFLAGS
@@ -1642,6 +1669,7 @@
 with_libiconv_prefix
 with_libintl_prefix
 enable_fatal_warnings
+enable_extra_check
 enable_debug
 enable_profiling
 enable_valgrind
@@ -1661,8 +1689,10 @@
 enable_gobject_cast_checks
 enable_glib_asserts
 with_gtk
+enable_Bsymbolic
 enable_orc
 enable_static_plugins
+with_player_tests
 with_default_audiosink
 with_default_audiosrc
 with_default_videosink
@@ -1672,6 +1702,7 @@
 enable_adpcmdec
 enable_adpcmenc
 enable_aiff
+enable_videoframe_audiolevel
 enable_asfmux
 enable_audiofxbad
 enable_audiomixer
@@ -1704,7 +1735,6 @@
 enable_jp2kdecimator
 enable_jpegformat
 enable_librfb
-enable_liveadder
 enable_midi
 enable_mpegdemux
 enable_mpegtsdemux
@@ -1762,6 +1792,8 @@
 enable_vcd
 enable_opensles
 enable_uvch264
+enable_nvenc
+with_cuda_prefix
 enable_assrender
 enable_voamrwbenc
 enable_voaacenc
@@ -1840,6 +1872,7 @@
 enable_gsettings
 enable_schemas_compile
 enable_sndio
+with_hls_crypto
 enable_hls
 with_libgcrypt_prefix
 enable_x265
@@ -1915,8 +1948,16 @@
 ORC_LIBS
 X_CFLAGS
 X_LIBS
+GL_CFLAGS
+GL_LIBS
+GLES2_CFLAGS
+GLES2_LIBS
+EGL_CFLAGS
+EGL_LIBS
 WAYLAND_EGL_CFLAGS
 WAYLAND_EGL_LIBS
+GST_ALLOCATORS_CFLAGS
+GST_ALLOCATORS_LIBS
 LIBPNG_CFLAGS
 LIBPNG_LIBS
 BLUEZ5_CFLAGS
@@ -1927,6 +1968,14 @@
 G_UDEV_LIBS
 LIBUSB_CFLAGS
 LIBUSB_LIBS
+GST_VIDEO_CFLAGS
+GST_VIDEO_LIBS
+GST_PBUTILS_CFLAGS
+GST_PBUTILS_LIBS
+CUDA_CFLAGS
+CUDA_LIBS
+NVENCODE_CFLAGS
+NVENCODE_LIBS
 ASSRENDER_CFLAGS
 ASSRENDER_LIBS
 VOAMRWBENC_CFLAGS
@@ -2023,6 +2072,12 @@
 QT_X11_LIBS
 QT_WAYLAND_CFLAGS
 QT_WAYLAND_LIBS
+QT_ANDROID_CFLAGS
+QT_ANDROID_LIBS
+GNUSTL_CFLAGS
+GNUSTL_LIBS
+QT_MAC_CFLAGS
+QT_MAC_LIBS
 LIBVISUAL_CFLAGS
 LIBVISUAL_LIBS
 TIMIDITY_CFLAGS
@@ -2603,7 +2658,7 @@
   # Omit some internal or obsolete options to make the list less imposing.
   # This message is too long to be a string in the A/UX 3.1 sh.
   cat <<_ACEOF
-\`configure' configures GStreamer Bad Plug-ins 1.6.2 to adapt to many kinds of systems.
+\`configure' configures GStreamer Bad Plug-ins 1.7.1 to adapt to many kinds of systems.
 
 Usage: $0 [OPTION]... [VAR=VALUE]...
 
@@ -2675,7 +2730,7 @@
 
 if test -n "$ac_init_help"; then
   case $ac_init_help in
-     short | recursive ) echo "Configuration of GStreamer Bad Plug-ins 1.6.2:";;
+     short | recursive ) echo "Configuration of GStreamer Bad Plug-ins 1.7.1:";;
    esac
   cat <<\_ACEOF
 
@@ -2701,6 +2756,7 @@
   --disable-rpath         do not hardcode runtime library paths
   --disable-fatal-warnings
                           Don't turn compiler warnings into fatal errors
+  --enable-extra-checks   Enable extra runtime checks
   --disable-debug         disable addition of -g debugging info
   --enable-profiling      adds -pg to compiler commandline, for profiling
   --disable-valgrind      disable run-time valgrind detection
@@ -2716,14 +2772,17 @@
   --enable-gtk-doc-pdf    build documentation in pdf format [[default=no]]
   --enable-gobject-cast-checks=[no/auto/yes]
                           Enable GObject cast checks
-  --enable-glib-asserts=[no/auto/yes]
+  --enable-glib-asserts=[no/yes]
                           Enable GLib assertion
+  --disable-Bsymbolic     avoid linking with -Bsymbolic
   --enable-orc            use Orc if installed
   --enable-static-plugins build static plugins [default=no]
   --disable-accurip       disable dependency-less accurip plugin
   --disable-adpcmdec      disable dependency-less adpcmdec plugin
   --disable-adpcmenc      disable dependency-less adpcmenc plugin
   --disable-aiff          disable dependency-less aiff plugin
+  --disable-videoframe_audiolevel
+                          disable dependency-less videoframe_audiolevel plugin
   --disable-asfmux        disable dependency-less asfmux plugin
   --disable-audiofxbad    disable dependency-less audiofxbad plugin
   --disable-audiomixer    disable dependency-less audiomixer plugin
@@ -2758,7 +2817,6 @@
   --disable-jp2kdecimator disable dependency-less jp2kdecimator plugin
   --disable-jpegformat    disable dependency-less jpegformat plugin
   --disable-librfb        disable dependency-less librfb plugin
-  --disable-liveadder     disable dependency-less liveadder plugin
   --disable-midi          disable dependency-less midi plugin
   --disable-mpegdemux     disable dependency-less mpegdemux plugin
   --disable-mpegtsdemux   disable dependency-less mpegtsdemux plugin
@@ -2812,6 +2870,7 @@
   --disable-vcd                disable Video CD: vcdsrc
   --disable-opensles           disable OpenSL ES: opensl
   --disable-uvch264            disable UVC H264: uvch264
+  --disable-nvenc              disable NVIDIA Encode API: nvenc
   --disable-assrender          disable ASS/SSA renderer: assrender
   --disable-voamrwbenc         disable vo-amrwbenc library: vo-amrwbenc
   --disable-voaacenc           disable vo-aacenc library: vo-aacenc
@@ -2920,6 +2979,8 @@
                           compile
   --with-html-dir=PATH    path to installed docs
   --with-gtk=3.0|2.0      which gtk+ version to compile against (default: 2.0)
+  --with-player-tests     Enable GstPlayer tests that need network access
+                          (default: no)
   --with-default-audiosink
                           specify default audio sink
   --with-default-audiosrc specify default audio source
@@ -2934,11 +2995,16 @@
                           library module name for GLES2 (default: libGLESv2)
   --with-egl-module-name  library module name for EGL (default: libEGL)
   --with-jpeg-mmx, path to MMX'ified JPEG library
+  --with-cuda-prefix      Use the provided prefix for detecting the cuda
+                          installation
   --with-pvr-external-headers
                           Use system installed PVR2D headers
   --with-sdl-prefix=PFX   prefix where SDL is installed (optional)
   --with-sdl-exec-prefix=PFX
                           exec prefix where SDL is installed (optional)
+  --with-hls-crypto=auto|nettle|libgcrypt|openssl
+                          which cryptographic library version to compile
+                          against for hls (default: auto)
   --with-libgcrypt-prefix=PFX
                           prefix where LIBGCRYPT is installed (optional)
 
@@ -3046,10 +3112,21 @@
   ORC_LIBS    linker flags for ORC, overriding pkg-config
   X_CFLAGS    C compiler flags for X, overriding pkg-config
   X_LIBS      linker flags for X, overriding pkg-config
+  GL_CFLAGS   C compiler flags for GL, overriding pkg-config
+  GL_LIBS     linker flags for GL, overriding pkg-config
+  GLES2_CFLAGS
+              C compiler flags for GLES2, overriding pkg-config
+  GLES2_LIBS  linker flags for GLES2, overriding pkg-config
+  EGL_CFLAGS  C compiler flags for EGL, overriding pkg-config
+  EGL_LIBS    linker flags for EGL, overriding pkg-config
   WAYLAND_EGL_CFLAGS
               C compiler flags for WAYLAND_EGL, overriding pkg-config
   WAYLAND_EGL_LIBS
               linker flags for WAYLAND_EGL, overriding pkg-config
+  GST_ALLOCATORS_CFLAGS
+              C compiler flags for GST_ALLOCATORS, overriding pkg-config
+  GST_ALLOCATORS_LIBS
+              linker flags for GST_ALLOCATORS, overriding pkg-config
   LIBPNG_CFLAGS
               C compiler flags for LIBPNG, overriding pkg-config
   LIBPNG_LIBS linker flags for LIBPNG, overriding pkg-config
@@ -3066,6 +3143,20 @@
   LIBUSB_CFLAGS
               C compiler flags for LIBUSB, overriding pkg-config
   LIBUSB_LIBS linker flags for LIBUSB, overriding pkg-config
+  GST_VIDEO_CFLAGS
+              C compiler flags for GST_VIDEO, overriding pkg-config
+  GST_VIDEO_LIBS
+              linker flags for GST_VIDEO, overriding pkg-config
+  GST_PBUTILS_CFLAGS
+              C compiler flags for GST_PBUTILS, overriding pkg-config
+  GST_PBUTILS_LIBS
+              linker flags for GST_PBUTILS, overriding pkg-config
+  CUDA_CFLAGS C compiler flags for CUDA, overriding pkg-config
+  CUDA_LIBS   linker flags for CUDA, overriding pkg-config
+  NVENCODE_CFLAGS
+              C compiler flags for NvEncodeAPI.h
+  NVENCODE_LIBS
+              linker flags for nvidia-encode
   ASSRENDER_CFLAGS
               C compiler flags for ASSRENDER, overriding pkg-config
   ASSRENDER_LIBS
@@ -3217,6 +3308,16 @@
               C compiler flags for QT_WAYLAND, overriding pkg-config
   QT_WAYLAND_LIBS
               linker flags for QT_WAYLAND, overriding pkg-config
+  QT_ANDROID_CFLAGS
+              C compiler flags for QT_ANDROID, overriding pkg-config
+  QT_ANDROID_LIBS
+              linker flags for QT_ANDROID, overriding pkg-config
+  GNUSTL_CFLAGS
+              C compiler flags for GNUSTL, overriding pkg-config
+  GNUSTL_LIBS linker flags for GNUSTL, overriding pkg-config
+  QT_MAC_CFLAGS
+              C compiler flags for QT_MAC, overriding pkg-config
+  QT_MAC_LIBS linker flags for QT_MAC, overriding pkg-config
   LIBVISUAL_CFLAGS
               C compiler flags for LIBVISUAL, overriding pkg-config
   LIBVISUAL_LIBS
@@ -3333,7 +3434,7 @@
 test -n "$ac_init_help" && exit $ac_status
 if $ac_init_version; then
   cat <<\_ACEOF
-GStreamer Bad Plug-ins configure 1.6.2
+GStreamer Bad Plug-ins configure 1.7.1
 generated by GNU Autoconf 2.69
 
 Copyright (C) 2012 Free Software Foundation, Inc.
@@ -4306,7 +4407,7 @@
 This file contains any messages produced by compilers while
 running configure, to aid debugging if configure makes a mistake.
 
-It was created by GStreamer Bad Plug-ins $as_me 1.6.2, which was
+It was created by GStreamer Bad Plug-ins $as_me 1.7.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   $ $0 $@
@@ -5288,7 +5389,7 @@
 
 # Define the identity of the package.
  PACKAGE='gst-plugins-bad'
- VERSION='1.6.2'
+ VERSION='1.7.1'
 
 
 cat >>confdefs.h <<_ACEOF
@@ -5499,9 +5600,9 @@
 
 
 
-  PACKAGE_VERSION_MAJOR=$(echo 1.6.2 | cut -d'.' -f1)
-  PACKAGE_VERSION_MINOR=$(echo 1.6.2 | cut -d'.' -f2)
-  PACKAGE_VERSION_MICRO=$(echo 1.6.2 | cut -d'.' -f3)
+  PACKAGE_VERSION_MAJOR=$(echo 1.7.1 | cut -d'.' -f1)
+  PACKAGE_VERSION_MINOR=$(echo 1.7.1 | cut -d'.' -f2)
+  PACKAGE_VERSION_MICRO=$(echo 1.7.1 | cut -d'.' -f3)
 
 
 
@@ -5512,7 +5613,7 @@
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking nano version" >&5
 $as_echo_n "checking nano version... " >&6; }
 
-  NANO=$(echo 1.6.2 | cut -d'.' -f4)
+  NANO=$(echo 1.7.1 | cut -d'.' -f4)
 
   if test x"$NANO" = x || test "x$NANO" = "x0" ; then
     { $as_echo "$as_me:${as_lineno-$LINENO}: result: 0 (release)" >&5
@@ -10171,10 +10272,10 @@
 done
 
 
-  GST_CURRENT=602
+  GST_CURRENT=701
   GST_REVISION=0
-  GST_AGE=602
-  GST_LIBVERSION=602:0:602
+  GST_AGE=701
+  GST_LIBVERSION=701:0:701
 
 
 
@@ -14499,8 +14600,8 @@
 
 
 
-GST_REQ=1.6.2
-GSTPB_REQ=1.6.2
+GST_REQ=1.7.1
+GSTPB_REQ=1.7.1
 
 
 
@@ -16552,6 +16653,33 @@
 
 
 
+  # Check whether --enable-extra-check was given.
+if test "${enable_extra_check+set}" = set; then :
+  enableval=$enable_extra_check;
+      case "${enableval}" in
+        yes) EXTRA_CHECKS=yes ;;
+        no)  EXTRA_CHECKS=no ;;
+        *)   as_fn_error $? "bad value ${enableval} for --enable-extra-checks" "$LINENO" 5 ;;
+      esac
+
+else
+
+      if test "x`expr $PACKAGE_VERSION_MINOR % 2`" = "x1" -a "x`expr $PACKAGE_VERSION_MICRO '<' 90`" = "x1"; then
+        EXTRA_CHECKS=yes
+      else
+        EXTRA_CHECKS=no
+      fi
+
+fi
+
+
+    if test "x$EXTRA_CHECKS" = "xyes"; then
+
+$as_echo "#define GST_ENABLE_EXTRA_CHECKS 1" >>confdefs.h
+
+    fi
+
+
 
     # Check whether --enable-debug was given.
 if test "${enable_debug+set}" = set; then :
@@ -25420,7 +25548,7 @@
 fi
 
 
-GLIB_REQ=2.32.0
+GLIB_REQ=2.40.0
 
 
 
@@ -25561,18 +25689,10 @@
 if test "${enable_glib_asserts+set}" = set; then :
   enableval=$enable_glib_asserts; enable_glib_assertions=$enableval
 else
-  enable_glib_assertions=auto
+  enable_glib_assertions=yes
 fi
 
 
-  if test "x$enable_glib_assertions" = "xauto"; then
-        if test "x`expr $PACKAGE_VERSION_MINOR % 2`" = "x1" -a "x`expr $PACKAGE_VERSION_MICRO '<' 90`" = "x1"; then
-      enable_glib_assertions=yes
-    else
-      enable_glib_assertions=no
-    fi
-  fi
-
   if test "x$enable_glib_assertions" = "xno"; then
     GLIB_EXTRA_CFLAGS="$GLIB_EXTRA_CFLAGS -DG_DISABLE_ASSERT"
   fi
@@ -26917,6 +27037,41 @@
 fi
 
 
+# Check whether --enable-Bsymbolic was given.
+if test "${enable_Bsymbolic+set}" = set; then :
+  enableval=$enable_Bsymbolic;
+else
+  SAVED_LDFLAGS="${LDFLAGS}" SAVED_LIBS="${LIBS}"
+               { $as_echo "$as_me:${as_lineno-$LINENO}: checking for -Bsymbolic-functions linker flag" >&5
+$as_echo_n "checking for -Bsymbolic-functions linker flag... " >&6; }
+               LDFLAGS=-Wl,-Bsymbolic-functions
+               LIBS=
+               cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+int
+main ()
+{
+return 0
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+                           enable_Bsymbolic=yes
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+                           enable_Bsymbolic=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+               LDFLAGS="${SAVED_LDFLAGS}" LIBS="${SAVED_LIBS}"
+fi
+
+
 
 HAVE_GTK3=NO
 if test "x$BUILD_EXAMPLES" = "xyes"; then
@@ -28106,8 +28261,8 @@
       if test "xyes" = "xno" -o "xyes" = "x"; then
     GST_PACKAGE_RELEASE_DATETIME=`date -u "+%Y-%m-%dT%H:%MZ"`
   elif test "xyes" = "xyes"; then
-            if ( echo yes | grep '^201-90-9-0-10-9-0-30-9' >/dev/null ) ; then
-      GST_PACKAGE_RELEASE_DATETIME=yes
+            if ( echo  "${srcdir}/gst-plugins-bad.doap"  | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
+      GST_PACKAGE_RELEASE_DATETIME= "${srcdir}/gst-plugins-bad.doap"
     else
             YYYY_MM_DD=`sh "${srcdir}/common/extract-release-date-from-doap-file"  $PACKAGE_VERSION_MAJOR.$PACKAGE_VERSION_MINOR.$PACKAGE_VERSION_MICRO   "${srcdir}/gst-plugins-bad.doap" `;
       if test "x$YYYY_MM_DD" != "x"; then
@@ -28118,7 +28273,7 @@
         GST_PACKAGE_RELEASE_DATETIME=""
       fi
     fi
-    elif ( echo yes | grep '^201-90-9-0-10-9-0-30-9' >/dev/null ) ; then
+    elif ( echo yes | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
     GST_PACKAGE_RELEASE_DATETIME=yes
   else
     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SET_PACKAGE_RELEASE_DATETIME: invalid first argument" >&5
@@ -28145,8 +28300,8 @@
       if test "xno" = "xno" -o "xno" = "x"; then
     GST_PACKAGE_RELEASE_DATETIME=`date -u "+%Y-%m-%dT%H:%MZ"`
   elif test "xno" = "xyes"; then
-            if ( echo no | grep '^201-90-9-0-10-9-0-30-9' >/dev/null ) ; then
-      GST_PACKAGE_RELEASE_DATETIME=no
+            if ( echo  | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
+      GST_PACKAGE_RELEASE_DATETIME=
     else
             YYYY_MM_DD=`sh "${srcdir}/common/extract-release-date-from-doap-file"  `;
       if test "x$YYYY_MM_DD" != "x"; then
@@ -28157,7 +28312,7 @@
         GST_PACKAGE_RELEASE_DATETIME=""
       fi
     fi
-    elif ( echo no | grep '^201-90-9-0-10-9-0-30-9' >/dev/null ) ; then
+    elif ( echo no | grep '^20[1-9][0-9]-[0-1][0-9]-[0-3][0-9]' >/dev/null ) ; then
     GST_PACKAGE_RELEASE_DATETIME=no
   else
     { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: SET_PACKAGE_RELEASE_DATETIME: invalid first argument" >&5
@@ -28218,6 +28373,69 @@
 fi
 
 
+
+# Check whether --with-player-tests was given.
+if test "${with_player_tests+set}" = set; then :
+  withval=$with_player_tests;
+fi
+
+if test x$with_player_tests = xyes; then
+  # Extract the first word of "wget", so it can be a program name with args.
+set dummy wget; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_WGET+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $WGET in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_WGET="$WGET" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_WGET="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  test -z "$ac_cv_path_WGET" && ac_cv_path_WGET="no"
+  ;;
+esac
+fi
+WGET=$ac_cv_path_WGET
+if test -n "$WGET"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $WGET" >&5
+$as_echo "$WGET" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+  if test x$WGET = xno; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: wget required for GstPlayer tests but not found - disabling" >&5
+$as_echo "$as_me: WARNING: wget required for GstPlayer tests but not found - disabling" >&2;}
+    with_player_tests=no
+  fi
+fi
+ if test "x$with_player_tests" = "xyes"; then
+  WITH_GST_PLAYER_TESTS_TRUE=
+  WITH_GST_PLAYER_TESTS_FALSE='#'
+else
+  WITH_GST_PLAYER_TESTS_TRUE='#'
+  WITH_GST_PLAYER_TESTS_FALSE=
+fi
+
+
 # set by AG_GST_PARSE_SUBSYSTEM_DISABLES above
 NO_WARNINGS=""
 
@@ -28461,93 +28679,6 @@
   { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
 $as_echo "$flag_ok" >&6; }
 
-
-        if test "x$ERROR_CFLAGS" = "x"
-    then
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -errwarn=%all" >&5
-$as_echo_n "checking to see if compiler understands -errwarn=%all... " >&6; }
-
-  save_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -errwarn=%all"
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  flag_ok=yes
-else
-  flag_ok=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  CFLAGS="$save_CFLAGS"
-
-  if test "X$flag_ok" = Xyes ; then
-
-          ERROR_CFLAGS="-errwarn=%all"
-                                                                                for f in 'no%E_EMPTY_DECLARATION' \
-                   'no%E_STATEMENT_NOT_REACHED' \
-                   'no%E_ARGUEMENT_MISMATCH' \
-                   'no%E_MACRO_REDEFINED' \
-                   'no%E_LOOP_NOT_ENTERED_AT_TOP'
-          do
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if compiler understands -errwarn=%all,$f" >&5
-$as_echo_n "checking to see if compiler understands -errwarn=%all,$f... " >&6; }
-
-  save_CFLAGS="$CFLAGS"
-  CFLAGS="$CFLAGS -errwarn=%all,$f"
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_c_try_compile "$LINENO"; then :
-  flag_ok=yes
-else
-  flag_ok=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  CFLAGS="$save_CFLAGS"
-
-  if test "X$flag_ok" = Xyes ; then
-
-              ERROR_CFLAGS="$ERROR_CFLAGS,$f"
-
-    true
-  else
-
-    true
-  fi
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
-$as_echo "$flag_ok" >&6; }
-
-          done
-
-    true
-  else
-
-    true
-  fi
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
-$as_echo "$flag_ok" >&6; }
-
-    fi
   fi
 
   if test "x
@@ -28903,122 +29034,6 @@
 
 
 fi
-    else
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands -errwarn=%all" >&5
-$as_echo_n "checking to see if c++ compiler understands -errwarn=%all... " >&6; }
-
-  save_CPPFLAGS="$CPPFLAGS"
-  CPPFLAGS="$CPPFLAGS -errwarn=%all"
-
-  ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  flag_ok=yes
-else
-  flag_ok=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  CPPFLAGS="$save_CPPFLAGS"
-
-  if test "X$flag_ok" = Xyes ; then
-    ERROR_CXXFLAGS="$ERROR_CXXFLAGS -errwarn=%all"
-    true
-  else
-
-    true
-  fi
-
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
-$as_echo "$flag_ok" >&6; }
-
-      if test "x$ERROR_CXXFLAGS" != "x"; then
-                                                                                for f in 'no%E_EMPTY_DECLARATION' \
-                 'no%E_STATEMENT_NOT_REACHED' \
-                 'no%E_ARGUEMENT_MISMATCH' \
-                 'no%E_MACRO_REDEFINED' \
-                 'no%E_LOOP_NOT_ENTERED_AT_TOP'
-        do
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if c++ compiler understands -errwarn=%all,$f" >&5
-$as_echo_n "checking to see if c++ compiler understands -errwarn=%all,$f... " >&6; }
-
-  save_CPPFLAGS="$CPPFLAGS"
-  CPPFLAGS="$CPPFLAGS -errwarn=%all,$f"
-
-  ac_ext=cpp
-ac_cpp='$CXXCPP $CPPFLAGS'
-ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_cxx_compiler_gnu
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_cxx_try_compile "$LINENO"; then :
-  flag_ok=yes
-else
-  flag_ok=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  CPPFLAGS="$save_CPPFLAGS"
-
-  if test "X$flag_ok" = Xyes ; then
-    ERROR_CXXFLAGS="$ERROR_CXXFLAGS,$f"
-    true
-  else
-
-    true
-  fi
-
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
-$as_echo "$flag_ok" >&6; }
-
-        done
-      fi
     fi
   fi
 
@@ -29337,122 +29352,6 @@
 
 
 fi
-    else
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if Objective C compiler understands -errwarn=%all" >&5
-$as_echo_n "checking to see if Objective C compiler understands -errwarn=%all... " >&6; }
-
-  save_CPPFLAGS="$CPPFLAGS"
-  CPPFLAGS="$CPPFLAGS -errwarn=%all"
-
-  ac_ext=m
-ac_cpp='$OBJCPP $CPPFLAGS'
-ac_compile='$OBJC -c $OBJCFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$OBJC -o conftest$ac_exeext $OBJCFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_objc_compiler_gnu
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_objc_try_compile "$LINENO"; then :
-  flag_ok=yes
-else
-  flag_ok=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  CPPFLAGS="$save_CPPFLAGS"
-
-  if test "X$flag_ok" = Xyes ; then
-    ERROR_OBJCFLAGS="$ERROR_OBJCFLAGS -errwarn=%all"
-    true
-  else
-
-    true
-  fi
-
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
-$as_echo "$flag_ok" >&6; }
-
-      if test "x$ERROR_OBJCFLAGS" != "x"; then
-                                                                                for f in 'no%E_EMPTY_DECLARATION' \
-                 'no%E_STATEMENT_NOT_REACHED' \
-                 'no%E_ARGUEMENT_MISMATCH' \
-                 'no%E_MACRO_REDEFINED' \
-                 'no%E_LOOP_NOT_ENTERED_AT_TOP'
-        do
-
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: checking to see if Objective C compiler understands -errwarn=%all,$f" >&5
-$as_echo_n "checking to see if Objective C compiler understands -errwarn=%all,$f... " >&6; }
-
-  save_CPPFLAGS="$CPPFLAGS"
-  CPPFLAGS="$CPPFLAGS -errwarn=%all,$f"
-
-  ac_ext=m
-ac_cpp='$OBJCPP $CPPFLAGS'
-ac_compile='$OBJC -c $OBJCFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$OBJC -o conftest$ac_exeext $OBJCFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_objc_compiler_gnu
-
-
-  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
-/* end confdefs.h.  */
-
-int
-main ()
-{
-
-  ;
-  return 0;
-}
-_ACEOF
-if ac_fn_objc_try_compile "$LINENO"; then :
-  flag_ok=yes
-else
-  flag_ok=no
-fi
-rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  CPPFLAGS="$save_CPPFLAGS"
-
-  if test "X$flag_ok" = Xyes ; then
-    ERROR_OBJCFLAGS="$ERROR_OBJCFLAGS,$f"
-    true
-  else
-
-    true
-  fi
-
-  ac_ext=c
-ac_cpp='$CPP $CPPFLAGS'
-ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'
-ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'
-ac_compiler_gnu=$ac_cv_c_compiler_gnu
-
-
-  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flag_ok" >&5
-$as_echo "$flag_ok" >&6; }
-
-        done
-      fi
     fi
   fi
 
@@ -29702,8 +29601,8 @@
  apexsink dc1394 \
  gsettings \
  musepack nas sdl timidity \
- acm wininet \
- xvid lv2 teletextdec sndio libvisual"
+ wininet \
+ xvid lv2 sndio libvisual"
 
 
 
@@ -29879,6 +29778,49 @@
 
 
 
+  GST_PLUGINS_ALL="$GST_PLUGINS_ALL videoframe_audiolevel"
+
+
+
+  # Check whether --enable-videoframe_audiolevel was given.
+if test "${enable_videoframe_audiolevel+set}" = set; then :
+  enableval=$enable_videoframe_audiolevel;
+      case "${enableval}" in
+        yes) gst_use_videoframe_audiolevel=yes ;;
+        no) gst_use_videoframe_audiolevel=no ;;
+        *) as_fn_error $? "bad value ${enableval} for --enable-videoframe_audiolevel" "$LINENO" 5 ;;
+       esac
+
+else
+  gst_use_videoframe_audiolevel=yes
+fi
+
+  if test x$gst_use_videoframe_audiolevel = xno; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin videoframe_audiolevel" >&5
+$as_echo "$as_me: disabling dependency-less plugin videoframe_audiolevel" >&6;}
+    WITHOUT_PLUGINS="$WITHOUT_PLUGINS videoframe_audiolevel"
+  fi
+
+
+    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " videoframe_audiolevel " > /dev/null; then
+    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED videoframe_audiolevel"
+  fi
+    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " videoframe_audiolevel " > /dev/null; then
+    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videoframe_audiolevel / /'`
+  fi
+    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " videoframe_audiolevel " > /dev/null; then
+    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ videoframe_audiolevel / /'`
+  fi
+   if echo " $GST_PLUGINS_SELECTED " | grep -i " videoframe_audiolevel " > /dev/null; then
+  USE_PLUGIN_VIDEOFRAME_AUDIOLEVEL_TRUE=
+  USE_PLUGIN_VIDEOFRAME_AUDIOLEVEL_FALSE='#'
+else
+  USE_PLUGIN_VIDEOFRAME_AUDIOLEVEL_TRUE='#'
+  USE_PLUGIN_VIDEOFRAME_AUDIOLEVEL_FALSE=
+fi
+
+
+
   GST_PLUGINS_ALL="$GST_PLUGINS_ALL asfmux"
 
 
@@ -31255,49 +31197,6 @@
 
 
 
-  GST_PLUGINS_ALL="$GST_PLUGINS_ALL liveadder"
-
-
-
-  # Check whether --enable-liveadder was given.
-if test "${enable_liveadder+set}" = set; then :
-  enableval=$enable_liveadder;
-      case "${enableval}" in
-        yes) gst_use_liveadder=yes ;;
-        no) gst_use_liveadder=no ;;
-        *) as_fn_error $? "bad value ${enableval} for --enable-liveadder" "$LINENO" 5 ;;
-       esac
-
-else
-  gst_use_liveadder=yes
-fi
-
-  if test x$gst_use_liveadder = xno; then
-    { $as_echo "$as_me:${as_lineno-$LINENO}: disabling dependency-less plugin liveadder" >&5
-$as_echo "$as_me: disabling dependency-less plugin liveadder" >&6;}
-    WITHOUT_PLUGINS="$WITHOUT_PLUGINS liveadder"
-  fi
-
-
-    if [ -z "$WITH_PLUGINS" ] || echo " $WITH_PLUGINS " | tr , ' ' | grep -i " liveadder " > /dev/null; then
-    GST_PLUGINS_SELECTED="$GST_PLUGINS_SELECTED liveadder"
-  fi
-    if echo " $WITHOUT_PLUGINS " | tr , ' ' | grep -i " liveadder " > /dev/null; then
-    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ liveadder / /'`
-  fi
-    if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " liveadder " > /dev/null; then
-    GST_PLUGINS_SELECTED=`echo " $GST_PLUGINS_SELECTED " | $SED -e 's/ liveadder / /'`
-  fi
-   if echo " $GST_PLUGINS_SELECTED " | grep -i " liveadder " > /dev/null; then
-  USE_PLUGIN_LIVEADDER_TRUE=
-  USE_PLUGIN_LIVEADDER_FALSE='#'
-else
-  USE_PLUGIN_LIVEADDER_TRUE='#'
-  USE_PLUGIN_LIVEADDER_FALSE=
-fi
-
-
-
   GST_PLUGINS_ALL="$GST_PLUGINS_ALL midi"
 
 
@@ -33107,6 +33006,102 @@
   *)
     if test "x$NEED_GL" != "xno"; then
 
+  which="gl"
+    required="no"
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GL" >&5
+$as_echo_n "checking for GL... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GL_CFLAGS"; then
+        pkg_cv_GL_CFLAGS="$GL_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GL_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GL_LIBS"; then
+        pkg_cv_GL_LIBS="$GL_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GL_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
+        else
+	        GL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GL_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+      HAVE_GL="no"
+      if test "x$required" = "xyes"; then
+        as_fn_error $? "$GL_PKG_ERRORS" "$LINENO" 5
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: $GL_PKG_ERRORS" >&5
+$as_echo "$as_me: $GL_PKG_ERRORS" >&6;}
+      fi
+
+elif test $pkg_failed = untried; then
+
+      HAVE_GL="no"
+      if test "x$required" = "xyes"; then
+        as_fn_error $? "$GL_PKG_ERRORS" "$LINENO" 5
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: $GL_PKG_ERRORS" >&5
+$as_echo "$as_me: $GL_PKG_ERRORS" >&6;}
+      fi
+
+else
+	GL_CFLAGS=$pkg_cv_GL_CFLAGS
+	GL_LIBS=$pkg_cv_GL_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+      HAVE_GL="yes"
+
+fi
+
+
+      if test "x$HAVE_GL" != "xyes"; then
+
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glTexImage2D in -lGL" >&5
 $as_echo_n "checking for glTexImage2D in -lGL... " >&6; }
 if ${ac_cv_lib_GL_glTexImage2D+:} false; then :
@@ -33169,9 +33164,106 @@
 
 
 
+      fi
     fi
     if test "x$NEED_GLES2" != "xno"; then
 
+  which="glesv2"
+    required="no"
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GLES2" >&5
+$as_echo_n "checking for GLES2... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GLES2_CFLAGS"; then
+        pkg_cv_GLES2_CFLAGS="$GLES2_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GLES2_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GLES2_LIBS"; then
+        pkg_cv_GLES2_LIBS="$GLES2_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GLES2_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GLES2_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
+        else
+	        GLES2_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GLES2_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+      HAVE_GLES2="no"
+      if test "x$required" = "xyes"; then
+        as_fn_error $? "$GLES2_PKG_ERRORS" "$LINENO" 5
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: $GLES2_PKG_ERRORS" >&5
+$as_echo "$as_me: $GLES2_PKG_ERRORS" >&6;}
+      fi
+
+elif test $pkg_failed = untried; then
+
+      HAVE_GLES2="no"
+      if test "x$required" = "xyes"; then
+        as_fn_error $? "$GLES2_PKG_ERRORS" "$LINENO" 5
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: $GLES2_PKG_ERRORS" >&5
+$as_echo "$as_me: $GLES2_PKG_ERRORS" >&6;}
+      fi
+
+else
+	GLES2_CFLAGS=$pkg_cv_GLES2_CFLAGS
+	GLES2_LIBS=$pkg_cv_GLES2_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+      HAVE_GLES2="yes"
+
+fi
+
+
+      if test "x$HAVE_GLES2" != "xyes"; then
+
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for glTexImage2D in -lGLESv2" >&5
 $as_echo_n "checking for glTexImage2D in -lGLESv2... " >&6; }
 if ${ac_cv_lib_GLESv2_glTexImage2D+:} false; then :
@@ -33234,9 +33326,106 @@
 
 
 
+      fi
     fi
     if test "x$NEED_EGL" != "xno"; then
 
+  which="egl"
+    required="no"
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for EGL" >&5
+$as_echo_n "checking for EGL... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$EGL_CFLAGS"; then
+        pkg_cv_EGL_CFLAGS="$EGL_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_EGL_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$EGL_LIBS"; then
+        pkg_cv_EGL_LIBS="$EGL_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_EGL_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        EGL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
+        else
+	        EGL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$EGL_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+      HAVE_EGL="no"
+      if test "x$required" = "xyes"; then
+        as_fn_error $? "$EGL_PKG_ERRORS" "$LINENO" 5
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: $EGL_PKG_ERRORS" >&5
+$as_echo "$as_me: $EGL_PKG_ERRORS" >&6;}
+      fi
+
+elif test $pkg_failed = untried; then
+
+      HAVE_EGL="no"
+      if test "x$required" = "xyes"; then
+        as_fn_error $? "$EGL_PKG_ERRORS" "$LINENO" 5
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: $EGL_PKG_ERRORS" >&5
+$as_echo "$as_me: $EGL_PKG_ERRORS" >&6;}
+      fi
+
+else
+	EGL_CFLAGS=$pkg_cv_EGL_CFLAGS
+	EGL_LIBS=$pkg_cv_EGL_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+      HAVE_EGL="yes"
+
+fi
+
+
+      if test "x$HAVE_EGL" != "xyes"; then
+
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking for eglGetError in -lEGL" >&5
 $as_echo_n "checking for eglGetError in -lEGL... " >&6; }
 if ${ac_cv_lib_EGL_eglGetError+:} false; then :
@@ -33299,6 +33488,7 @@
 
 
 
+      fi
     fi
 
     old_LIBS=$LIBS
@@ -33745,8 +33935,120 @@
   fi
 fi
 
+HAVE_DRM_FOURCC_HEADER=no
+ac_fn_c_check_header_mongrel "$LINENO" "libdrm/drm_fourcc.h" "ac_cv_header_libdrm_drm_fourcc_h" "$ac_includes_default"
+if test "x$ac_cv_header_libdrm_drm_fourcc_h" = xyes; then :
+  HAVE_DRM_FOURCC_HEADER=yes
+fi
+
+
+
+HAVE_GST_ALLOCATORS=no
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_ALLOCATORS" >&5
+$as_echo_n "checking for GST_ALLOCATORS... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GST_ALLOCATORS_CFLAGS"; then
+        pkg_cv_GST_ALLOCATORS_CFLAGS="$GST_ALLOCATORS_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gstreamer-allocators-1.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gstreamer-allocators-1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GST_ALLOCATORS_CFLAGS=`$PKG_CONFIG --cflags "gstreamer-allocators-1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GST_ALLOCATORS_LIBS"; then
+        pkg_cv_GST_ALLOCATORS_LIBS="$GST_ALLOCATORS_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gstreamer-allocators-1.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gstreamer-allocators-1.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GST_ALLOCATORS_LIBS=`$PKG_CONFIG --libs "gstreamer-allocators-1.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GST_ALLOCATORS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gstreamer-allocators-1.0"`
+        else
+	        GST_ALLOCATORS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gstreamer-allocators-1.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GST_ALLOCATORS_PKG_ERRORS" >&5
+
+	as_fn_error $? "Package requirements (gstreamer-allocators-1.0) were not met:
+
+$GST_ALLOCATORS_PKG_ERRORS
+
+Consider adjusting the PKG_CONFIG_PATH environment variable if you
+installed software in a non-standard prefix.
+
+Alternatively, you may set the environment variables GST_ALLOCATORS_CFLAGS
+and GST_ALLOCATORS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+" "$LINENO" 5
+elif test $pkg_failed = untried; then
+	{ { $as_echo "$as_me:${as_lineno-$LINENO}: error: in \`$ac_pwd':" >&5
+$as_echo "$as_me: error: in \`$ac_pwd':" >&2;}
+as_fn_error $? "The pkg-config script could not be found or is too old.  Make sure it
+is in your PATH or set the PKG_CONFIG environment variable to the full
+path to pkg-config.
+
+Alternatively, you may set the environment variables GST_ALLOCATORS_CFLAGS
+and GST_ALLOCATORS_LIBS to avoid the need to call pkg-config.
+See the pkg-config man page for more details.
+
+To get pkg-config, see <http://pkg-config.freedesktop.org/>.
+See \`config.log' for more details" "$LINENO" 5; }
+else
+	GST_ALLOCATORS_CFLAGS=$pkg_cv_GST_ALLOCATORS_CFLAGS
+	GST_ALLOCATORS_LIBS=$pkg_cv_GST_ALLOCATORS_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	HAVE_GST_ALLOCATORS=yes
+fi
+
+if test "x$HAVE_DRM_FOURCC_HEADER" = "xyes" -a \
+        "x$HAVE_GST_ALLOCATORS" = "xyes" -a \
+        "x$HAVE_EGL" = "xyes"; then
+
+$as_echo "#define GST_GL_HAVE_DMABUF 1 " >>confdefs.h
+
+fi
+
 if test "x$HAVE_GL" = "xyes" -a "x$HAVE_GLES2" = "xyes"; then
   GL_INCLUDES="
+#ifdef __GNUC__
+#  pragma GCC diagnostic push
+#  pragma GCC diagnostic ignored \"-Wredundant-decls\"
+#endif
 #ifndef GL_GLEXT_PROTOTYPES
 #define GL_GLEXT_PROTOTYPES 1
 #endif
@@ -33770,25 +34072,15 @@
 #   include <GL/glext.h>
 #  endif
 # endif
+int main (int argc, char **argv) { return 0; }
 "
   { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether it is possible to include both GL and GLES2 headers" >&5
 $as_echo_n "checking whether it is possible to include both GL and GLES2 headers... " >&6; }
-  save_CPPFLAGS="$CPPFLAGS"
-  CPPFLAGS="$CPPFLAGS $ERROR_CFLAGS"
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS $GL_CFLAGS $GLES2_CFLAGS $WARNING_CFLAGS $ERROR_CFLAGS"
   cat confdefs.h - <<_ACEOF >conftest.$ac_ext
 /* end confdefs.h.  */
 $GL_INCLUDES
-int
-main ()
-{
-
-    #if !defined(GL_FALSE)
-    #error Failed to include GL headers
-    #endif
-
-  ;
-  return 0;
-}
 _ACEOF
 if ac_fn_c_try_compile "$LINENO"; then :
    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
@@ -33813,7 +34105,7 @@
 
 fi
 rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext
-  CPPFLAGS="$save_CPPFLAGS"
+  CFLAGS="$save_CFLAGS"
 fi
 
 #dnl Check for OpenGL
@@ -36601,6 +36893,1056 @@
 
 
 
+echo
+{ $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: NVIDIA Encode API ***" >&5
+$as_echo "$as_me: *** checking feature: NVIDIA Encode API ***" >&6;}
+if test "xnvenc" != "x"
+then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: *** for plug-ins: nvenc ***" >&5
+$as_echo "$as_me: *** for plug-ins: nvenc ***" >&6;}
+fi
+NOUSE=
+if test "x$USE_NVENC" = "xno"; then
+  NOUSE="yes"
+fi
+# Check whether --enable-nvenc was given.
+if test "${enable_nvenc+set}" = set; then :
+  enableval=$enable_nvenc;  case "${enableval}" in
+      yes) USE_NVENC=yes;;
+      no) USE_NVENC=no;;
+      *) as_fn_error $? "bad value ${enableval} for --enable-nvenc" "$LINENO" 5 ;;
+    esac
+else
+   USE_NVENC=yes
+fi
+
+if test "x$NOUSE" = "xyes"; then
+  USE_NVENC="no"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** nvenc pre-configured not to be built" >&5
+$as_echo "$as_me: WARNING: *** nvenc pre-configured not to be built" >&2;}
+fi
+NOUSE=
+
+if echo " $GST_PLUGINS_NONPORTED " | tr , ' ' | grep -i " NVENC " > /dev/null; then
+  USE_NVENC="no"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: *** nvenc not ported" >&5
+$as_echo "$as_me: WARNING: *** nvenc not ported" >&2;}
+fi
+
+
+if test x$USE_NVENC = xyes; then
+
+  gst_check_save_LIBS=$LIBS
+  gst_check_save_LDFLAGS=$LDFLAGS
+  gst_check_save_CFLAGS=$CFLAGS
+  gst_check_save_CPPFLAGS=$CPPFLAGS
+  gst_check_save_CXXFLAGS=$CXXFLAGS
+
+  HAVE_NVENC=no
+
+
+  which="gstreamer-video-1.0"
+    required="no"
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_VIDEO" >&5
+$as_echo_n "checking for GST_VIDEO... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GST_VIDEO_CFLAGS"; then
+        pkg_cv_GST_VIDEO_CFLAGS="$GST_VIDEO_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GST_VIDEO_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GST_VIDEO_LIBS"; then
+        pkg_cv_GST_VIDEO_LIBS="$GST_VIDEO_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GST_VIDEO_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GST_VIDEO_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
+        else
+	        GST_VIDEO_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GST_VIDEO_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+      HAVE_GST_VIDEO="no"
+      if test "x$required" = "xyes"; then
+        as_fn_error $? "$GST_VIDEO_PKG_ERRORS" "$LINENO" 5
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_VIDEO_PKG_ERRORS" >&5
+$as_echo "$as_me: $GST_VIDEO_PKG_ERRORS" >&6;}
+      fi
+
+elif test $pkg_failed = untried; then
+
+      HAVE_GST_VIDEO="no"
+      if test "x$required" = "xyes"; then
+        as_fn_error $? "$GST_VIDEO_PKG_ERRORS" "$LINENO" 5
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_VIDEO_PKG_ERRORS" >&5
+$as_echo "$as_me: $GST_VIDEO_PKG_ERRORS" >&6;}
+      fi
+
+else
+	GST_VIDEO_CFLAGS=$pkg_cv_GST_VIDEO_CFLAGS
+	GST_VIDEO_LIBS=$pkg_cv_GST_VIDEO_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+      HAVE_GST_VIDEO="yes"
+
+fi
+
+
+
+  which="gstreamer-pbutils-1.0"
+    required="no"
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GST_PBUTILS" >&5
+$as_echo_n "checking for GST_PBUTILS... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GST_PBUTILS_CFLAGS"; then
+        pkg_cv_GST_PBUTILS_CFLAGS="$GST_PBUTILS_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GST_PBUTILS_CFLAGS=`$PKG_CONFIG --cflags "$which" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GST_PBUTILS_LIBS"; then
+        pkg_cv_GST_PBUTILS_LIBS="$GST_PBUTILS_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"\$which\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "$which") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GST_PBUTILS_LIBS=`$PKG_CONFIG --libs "$which" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GST_PBUTILS_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "$which"`
+        else
+	        GST_PBUTILS_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "$which"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GST_PBUTILS_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+      HAVE_GST_PBUTILS="no"
+      if test "x$required" = "xyes"; then
+        as_fn_error $? "$GST_PBUTILS_PKG_ERRORS" "$LINENO" 5
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PBUTILS_PKG_ERRORS" >&5
+$as_echo "$as_me: $GST_PBUTILS_PKG_ERRORS" >&6;}
+      fi
+
+elif test $pkg_failed = untried; then
+
+      HAVE_GST_PBUTILS="no"
+      if test "x$required" = "xyes"; then
+        as_fn_error $? "$GST_PBUTILS_PKG_ERRORS" "$LINENO" 5
+      else
+        { $as_echo "$as_me:${as_lineno-$LINENO}: $GST_PBUTILS_PKG_ERRORS" >&5
+$as_echo "$as_me: $GST_PBUTILS_PKG_ERRORS" >&6;}
+      fi
+
+else
+	GST_PBUTILS_CFLAGS=$pkg_cv_GST_PBUTILS_CFLAGS
+	GST_PBUTILS_LIBS=$pkg_cv_GST_PBUTILS_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+      HAVE_GST_PBUTILS="yes"
+
+fi
+
+
+
+# Check whether --with-cuda-prefix was given.
+if test "${with_cuda_prefix+set}" = set; then :
+  withval=$with_cuda_prefix; if test "x$with_cuda_prefix" != "x"; then :
+  CUDA_PREFIX="$with_cuda_prefix"
+fi
+else
+  CUDA_PREFIX=""
+fi
+
+
+  HAVE_CUDA="yes"
+  if test "x$CUDA_PREFIX" != "x"; then
+        if test "x$CUDA_CFLAGS" = "x" -a "x$CUDA_LIBS" = "x"; then
+            CUDA_CFLAGS="-I$CUDA_PREFIX/include"
+      CUDA_LIBS="-L$CUDA_PREFIX/lib -L$CUDA_PREFIX/lib64 -L$CUDA_PREFIX/lib/stubs -L$CUDA_PREFIX/lib64/stubs -lcuda -lcudart"
+    fi
+  else
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CUDA" >&5
+$as_echo_n "checking for CUDA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$CUDA_CFLAGS"; then
+        pkg_cv_CUDA_CFLAGS="$CUDA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-7.5 cudart-7.5\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cuda-7.5 cudart-7.5") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CUDA_CFLAGS=`$PKG_CONFIG --cflags "cuda-7.5 cudart-7.5" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$CUDA_LIBS"; then
+        pkg_cv_CUDA_LIBS="$CUDA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-7.5 cudart-7.5\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cuda-7.5 cudart-7.5") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CUDA_LIBS=`$PKG_CONFIG --libs "cuda-7.5 cudart-7.5" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        CUDA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "cuda-7.5 cudart-7.5"`
+        else
+	        CUDA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "cuda-7.5 cudart-7.5"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$CUDA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CUDA" >&5
+$as_echo_n "checking for CUDA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$CUDA_CFLAGS"; then
+        pkg_cv_CUDA_CFLAGS="$CUDA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-7.0 cudart-7.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cuda-7.0 cudart-7.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CUDA_CFLAGS=`$PKG_CONFIG --cflags "cuda-7.0 cudart-7.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$CUDA_LIBS"; then
+        pkg_cv_CUDA_LIBS="$CUDA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-7.0 cudart-7.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cuda-7.0 cudart-7.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CUDA_LIBS=`$PKG_CONFIG --libs "cuda-7.0 cudart-7.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        CUDA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "cuda-7.0 cudart-7.0"`
+        else
+	        CUDA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "cuda-7.0 cudart-7.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$CUDA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CUDA" >&5
+$as_echo_n "checking for CUDA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$CUDA_CFLAGS"; then
+        pkg_cv_CUDA_CFLAGS="$CUDA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-6.5 cudart-6.5\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cuda-6.5 cudart-6.5") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CUDA_CFLAGS=`$PKG_CONFIG --cflags "cuda-6.5 cudart-6.5" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$CUDA_LIBS"; then
+        pkg_cv_CUDA_LIBS="$CUDA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-6.5 cudart-6.5\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cuda-6.5 cudart-6.5") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CUDA_LIBS=`$PKG_CONFIG --libs "cuda-6.5 cudart-6.5" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        CUDA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "cuda-6.5 cudart-6.5"`
+        else
+	        CUDA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "cuda-6.5 cudart-6.5"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$CUDA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda headers/libraries" >&5
+$as_echo "$as_me: WARNING: Could not find cuda headers/libraries" >&2;}
+elif test $pkg_failed = untried; then
+
+          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda headers/libraries" >&5
+$as_echo "$as_me: WARNING: Could not find cuda headers/libraries" >&2;}
+else
+	CUDA_CFLAGS=$pkg_cv_CUDA_CFLAGS
+	CUDA_LIBS=$pkg_cv_CUDA_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	:
+fi
+elif test $pkg_failed = untried; then
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CUDA" >&5
+$as_echo_n "checking for CUDA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$CUDA_CFLAGS"; then
+        pkg_cv_CUDA_CFLAGS="$CUDA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-6.5 cudart-6.5\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cuda-6.5 cudart-6.5") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CUDA_CFLAGS=`$PKG_CONFIG --cflags "cuda-6.5 cudart-6.5" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$CUDA_LIBS"; then
+        pkg_cv_CUDA_LIBS="$CUDA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-6.5 cudart-6.5\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cuda-6.5 cudart-6.5") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CUDA_LIBS=`$PKG_CONFIG --libs "cuda-6.5 cudart-6.5" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        CUDA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "cuda-6.5 cudart-6.5"`
+        else
+	        CUDA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "cuda-6.5 cudart-6.5"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$CUDA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda headers/libraries" >&5
+$as_echo "$as_me: WARNING: Could not find cuda headers/libraries" >&2;}
+elif test $pkg_failed = untried; then
+
+          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda headers/libraries" >&5
+$as_echo "$as_me: WARNING: Could not find cuda headers/libraries" >&2;}
+else
+	CUDA_CFLAGS=$pkg_cv_CUDA_CFLAGS
+	CUDA_LIBS=$pkg_cv_CUDA_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	:
+fi
+else
+	CUDA_CFLAGS=$pkg_cv_CUDA_CFLAGS
+	CUDA_LIBS=$pkg_cv_CUDA_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	:
+fi
+elif test $pkg_failed = untried; then
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CUDA" >&5
+$as_echo_n "checking for CUDA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$CUDA_CFLAGS"; then
+        pkg_cv_CUDA_CFLAGS="$CUDA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-7.0 cudart-7.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cuda-7.0 cudart-7.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CUDA_CFLAGS=`$PKG_CONFIG --cflags "cuda-7.0 cudart-7.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$CUDA_LIBS"; then
+        pkg_cv_CUDA_LIBS="$CUDA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-7.0 cudart-7.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cuda-7.0 cudart-7.0") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CUDA_LIBS=`$PKG_CONFIG --libs "cuda-7.0 cudart-7.0" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        CUDA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "cuda-7.0 cudart-7.0"`
+        else
+	        CUDA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "cuda-7.0 cudart-7.0"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$CUDA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CUDA" >&5
+$as_echo_n "checking for CUDA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$CUDA_CFLAGS"; then
+        pkg_cv_CUDA_CFLAGS="$CUDA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-6.5 cudart-6.5\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cuda-6.5 cudart-6.5") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CUDA_CFLAGS=`$PKG_CONFIG --cflags "cuda-6.5 cudart-6.5" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$CUDA_LIBS"; then
+        pkg_cv_CUDA_LIBS="$CUDA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-6.5 cudart-6.5\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cuda-6.5 cudart-6.5") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CUDA_LIBS=`$PKG_CONFIG --libs "cuda-6.5 cudart-6.5" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        CUDA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "cuda-6.5 cudart-6.5"`
+        else
+	        CUDA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "cuda-6.5 cudart-6.5"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$CUDA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda headers/libraries" >&5
+$as_echo "$as_me: WARNING: Could not find cuda headers/libraries" >&2;}
+elif test $pkg_failed = untried; then
+
+          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda headers/libraries" >&5
+$as_echo "$as_me: WARNING: Could not find cuda headers/libraries" >&2;}
+else
+	CUDA_CFLAGS=$pkg_cv_CUDA_CFLAGS
+	CUDA_LIBS=$pkg_cv_CUDA_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	:
+fi
+elif test $pkg_failed = untried; then
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for CUDA" >&5
+$as_echo_n "checking for CUDA... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$CUDA_CFLAGS"; then
+        pkg_cv_CUDA_CFLAGS="$CUDA_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-6.5 cudart-6.5\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cuda-6.5 cudart-6.5") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CUDA_CFLAGS=`$PKG_CONFIG --cflags "cuda-6.5 cudart-6.5" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$CUDA_LIBS"; then
+        pkg_cv_CUDA_LIBS="$CUDA_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"cuda-6.5 cudart-6.5\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "cuda-6.5 cudart-6.5") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_CUDA_LIBS=`$PKG_CONFIG --libs "cuda-6.5 cudart-6.5" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        CUDA_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "cuda-6.5 cudart-6.5"`
+        else
+	        CUDA_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "cuda-6.5 cudart-6.5"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$CUDA_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda headers/libraries" >&5
+$as_echo "$as_me: WARNING: Could not find cuda headers/libraries" >&2;}
+elif test $pkg_failed = untried; then
+
+          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda headers/libraries" >&5
+$as_echo "$as_me: WARNING: Could not find cuda headers/libraries" >&2;}
+else
+	CUDA_CFLAGS=$pkg_cv_CUDA_CFLAGS
+	CUDA_LIBS=$pkg_cv_CUDA_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	:
+fi
+else
+	CUDA_CFLAGS=$pkg_cv_CUDA_CFLAGS
+	CUDA_LIBS=$pkg_cv_CUDA_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	:
+fi
+else
+	CUDA_CFLAGS=$pkg_cv_CUDA_CFLAGS
+	CUDA_LIBS=$pkg_cv_CUDA_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+	:
+fi
+  fi
+
+  HAVE_CUDA_H=no
+  HAVE_CUDART_H=no
+  save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CUDA_CFLAGS $save_CPPFLAGS "
+  ac_fn_c_check_header_mongrel "$LINENO" "cuda.h" "ac_cv_header_cuda_h" "$ac_includes_default"
+if test "x$ac_cv_header_cuda_h" = xyes; then :
+  HAVE_CUDA_H=yes
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda.h" >&5
+$as_echo "$as_me: WARNING: Could not find cuda.h" >&2;}
+fi
+
+
+  ac_fn_c_check_header_mongrel "$LINENO" "cuda_runtime_api.h" "ac_cv_header_cuda_runtime_api_h" "$ac_includes_default"
+if test "x$ac_cv_header_cuda_runtime_api_h" = xyes; then :
+  HAVE_CUDART_H=yes
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda_runtime_api.h" >&5
+$as_echo "$as_me: WARNING: Could not find cuda_runtime_api.h" >&2;}
+fi
+
+
+  CPPFLAGS=$save_CPPFLAGS
+
+    save_LIBS="$LIBS"
+  LIBS="$CUDA_LIBS $save_LIBS"
+  HAVE_CUDART_LIB="no"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cudaGetErrorString in -lcudart" >&5
+$as_echo_n "checking for cudaGetErrorString in -lcudart... " >&6; }
+if ${ac_cv_lib_cudart_cudaGetErrorString+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcudart  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char cudaGetErrorString ();
+int
+main ()
+{
+return cudaGetErrorString ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_cudart_cudaGetErrorString=yes
+else
+  ac_cv_lib_cudart_cudaGetErrorString=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cudart_cudaGetErrorString" >&5
+$as_echo "$ac_cv_lib_cudart_cudaGetErrorString" >&6; }
+if test "x$ac_cv_lib_cudart_cudaGetErrorString" = xyes; then :
+  HAVE_CUDART_LIB="yes"
+else
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cudart library" >&5
+$as_echo "$as_me: WARNING: Could not find cudart library" >&2;}
+fi
+
+  HAVE_CUDA_LIB="no"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for cuInit in -lcuda" >&5
+$as_echo_n "checking for cuInit in -lcuda... " >&6; }
+if ${ac_cv_lib_cuda_cuInit+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lcuda  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char cuInit ();
+int
+main ()
+{
+return cuInit ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_cuda_cuInit=yes
+else
+  ac_cv_lib_cuda_cuInit=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_cuda_cuInit" >&5
+$as_echo "$ac_cv_lib_cuda_cuInit" >&6; }
+if test "x$ac_cv_lib_cuda_cuInit" = xyes; then :
+  HAVE_CUDA_LIB="yes"
+else
+
+      { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find cuda library" >&5
+$as_echo "$as_me: WARNING: Could not find cuda library" >&2;}
+fi
+
+  LIBS="$save_LIBS"
+
+    HAVE_NVENCODEAPI_H=no
+
+  save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$NVENCODE_CFLAGS $save_CPPFLAGS"
+  ac_fn_c_check_header_mongrel "$LINENO" "nvEncodeAPI.h" "ac_cv_header_nvEncodeAPI_h" "$ac_includes_default"
+if test "x$ac_cv_header_nvEncodeAPI_h" = xyes; then :
+
+      cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+#include <nvEncodeAPI.h>
+          #if NVENCAPI_MAJOR_VERSION < 5
+          #error "Need nvEncodeAPI.h >= 5.0"
+          #endif
+
+_ACEOF
+if ac_fn_c_try_cpp "$LINENO"; then :
+
+          HAVE_NVENCODEAPI_H=yes
+
+else
+
+          { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: nvEncodeAPI.h must be >= 5.0" >&5
+$as_echo "$as_me: WARNING: nvEncodeAPI.h must be >= 5.0" >&2;}
+
+fi
+rm -f conftest.err conftest.i conftest.$ac_ext
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find nvEncodeAPI.h" >&5
+$as_echo "$as_me: WARNING: Could not find nvEncodeAPI.h" >&2;}
+fi
+
+
+
+  CPPFLAGS="$save_CPPFLAGS"
+
+    HAVE_NVENCODE_LIB=no
+
+  saved_LIBS="$LIBS"
+  LIBS="$NVENCODE_LIBS $saved_LIBS"
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NvEncodeAPICreateInstance in -lnvidia-encode" >&5
+$as_echo_n "checking for NvEncodeAPICreateInstance in -lnvidia-encode... " >&6; }
+if ${ac_cv_lib_nvidia_encode_NvEncodeAPICreateInstance+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  ac_check_lib_save_LIBS=$LIBS
+LIBS="-lnvidia-encode  $LIBS"
+cat confdefs.h - <<_ACEOF >conftest.$ac_ext
+/* end confdefs.h.  */
+
+/* Override any GCC internal prototype to avoid an error.
+   Use char because int might match the return type of a GCC
+   builtin and then its argument prototype would still apply.  */
+#ifdef __cplusplus
+extern "C"
+#endif
+char NvEncodeAPICreateInstance ();
+int
+main ()
+{
+return NvEncodeAPICreateInstance ();
+  ;
+  return 0;
+}
+_ACEOF
+if ac_fn_c_try_link "$LINENO"; then :
+  ac_cv_lib_nvidia_encode_NvEncodeAPICreateInstance=yes
+else
+  ac_cv_lib_nvidia_encode_NvEncodeAPICreateInstance=no
+fi
+rm -f core conftest.err conftest.$ac_objext \
+    conftest$ac_exeext conftest.$ac_ext
+LIBS=$ac_check_lib_save_LIBS
+fi
+{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_nvidia_encode_NvEncodeAPICreateInstance" >&5
+$as_echo "$ac_cv_lib_nvidia_encode_NvEncodeAPICreateInstance" >&6; }
+if test "x$ac_cv_lib_nvidia_encode_NvEncodeAPICreateInstance" = xyes; then :
+  HAVE_NVENCODE_LIB="yes"
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find library nvidia-encode" >&5
+$as_echo "$as_me: WARNING: Could not find library nvidia-encode" >&2;}
+fi
+
+  NVENCODE_LIBS="$NVENCODE_LIBS -lnvidia-encode"
+
+  LIBS="$saved_LIBS"
+
+  USE_NVENC_GST_GL=no
+  if test "x$HAVE_CUDA_H" = "xyes" \
+      -a "x$HAVE_CUDART_H" = "xyes" \
+      -a "x$HAVE_CUDA_LIB" = "xyes" \
+      -a "x$HAVE_CUDART_LIB" = "xyes" \
+      -a "x$HAVE_NVENCODEAPI_H" = "xyes" \
+      -a "x$HAVE_NVENCODE_LIB" = "xyes"; then
+    HAVE_NVENC="yes"
+    if test x"$USE_OPENGL" = x"yes"; then
+            save_CPPFLAGS="$CPPFLAGS"
+      CPPFLAGS="$save_CPPFLAGS $CUDA_CFLAGS"
+      ac_fn_c_check_header_mongrel "$LINENO" "cuda_gl_interop.h" "ac_cv_header_cuda_gl_interop_h" "$ac_includes_default"
+if test "x$ac_cv_header_cuda_gl_interop_h" = xyes; then :
+
+        USE_NVENC_GST_GL="yes"
+
+$as_echo "#define HAVE_NVENC_GST_GL 1 " >>confdefs.h
+
+
+fi
+
+
+      CPPFLAGS="$save_CPPFLAGS"
+    fi
+  else
+    HAVE_NVENC="no"
+  fi
+
+
+  LIBS=$gst_check_save_LIBS
+  LDFLAGS=$gst_check_save_LDFLAGS
+  CFLAGS=$gst_check_save_CFLAGS
+  CPPFLAGS=$gst_check_save_CPPFLAGS
+  CXXFLAGS=$gst_check_save_CXXFLAGS
+
+    if test x$HAVE_NVENC = xno; then
+    USE_NVENC=no
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will be built: nvenc" >&5
+$as_echo "$as_me: *** These plugins will be built: nvenc" >&6;}
+  fi
+fi
+if test x$USE_NVENC = xyes; then
+  :
+  if test "xnvenc" != "x"; then
+    GST_PLUGINS_YES="\tnvenc\n$GST_PLUGINS_YES"
+  fi
+
+$as_echo "#define HAVE_NVENC /**/" >>confdefs.h
+
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: *** These plugins will not be built: nvenc" >&5
+$as_echo "$as_me: *** These plugins will not be built: nvenc" >&6;}
+  if test "xnvenc" != "x"; then
+    GST_PLUGINS_NO="\tnvenc\n$GST_PLUGINS_NO"
+  fi
+  :
+fi
+ if test x$USE_NVENC = xyes; then
+  USE_NVENC_TRUE=
+  USE_NVENC_FALSE='#'
+else
+  USE_NVENC_TRUE='#'
+  USE_NVENC_FALSE=
+fi
+
+
+ if test "x$USE_NVENC_GST_GL" = "xyes"; then
+  USE_NVENC_GST_GL_TRUE=
+  USE_NVENC_GST_GL_FALSE='#'
+else
+  USE_NVENC_GST_GL_TRUE='#'
+  USE_NVENC_GST_GL_FALSE=
+fi
+
 
 
 if test "x$BUILD_EXTERNAL" = "xyes"; then
@@ -36662,12 +38004,12 @@
         pkg_cv_ASSRENDER_CFLAGS="$ASSRENDER_CFLAGS"
     else
         if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libass >= 0.9.4\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "libass >= 0.9.4") 2>&5
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libass >= 0.10.2\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "libass >= 0.10.2") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_ASSRENDER_CFLAGS=`$PKG_CONFIG --cflags "libass >= 0.9.4" 2>/dev/null`
+  pkg_cv_ASSRENDER_CFLAGS=`$PKG_CONFIG --cflags "libass >= 0.10.2" 2>/dev/null`
 else
   pkg_failed=yes
 fi
@@ -36680,12 +38022,12 @@
         pkg_cv_ASSRENDER_LIBS="$ASSRENDER_LIBS"
     else
         if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libass >= 0.9.4\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "libass >= 0.9.4") 2>&5
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"libass >= 0.10.2\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "libass >= 0.10.2") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_ASSRENDER_LIBS=`$PKG_CONFIG --libs "libass >= 0.9.4" 2>/dev/null`
+  pkg_cv_ASSRENDER_LIBS=`$PKG_CONFIG --libs "libass >= 0.10.2" 2>/dev/null`
 else
   pkg_failed=yes
 fi
@@ -36704,9 +38046,9 @@
         _pkg_short_errors_supported=no
 fi
         if test $_pkg_short_errors_supported = yes; then
-	        ASSRENDER_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libass >= 0.9.4"`
+	        ASSRENDER_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "libass >= 0.10.2"`
         else
-	        ASSRENDER_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libass >= 0.9.4"`
+	        ASSRENDER_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "libass >= 0.10.2"`
         fi
 	# Put the nasty error message in config.log where it belongs
 	echo "$ASSRENDER_PKG_ERRORS" >&5
@@ -46923,12 +48265,12 @@
         pkg_cv_QT_CFLAGS="$QT_CFLAGS"
     else
         if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core Qt5Gui Qt5Quick >= 5.4.0\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "Qt5Core Qt5Gui Qt5Quick >= 5.4.0") 2>&5
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core Qt5Gui Qt5Qml Qt5Quick >= 5.4.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "Qt5Core Qt5Gui Qt5Qml Qt5Quick >= 5.4.0") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_QT_CFLAGS=`$PKG_CONFIG --cflags "Qt5Core Qt5Gui Qt5Quick >= 5.4.0" 2>/dev/null`
+  pkg_cv_QT_CFLAGS=`$PKG_CONFIG --cflags "Qt5Core Qt5Gui Qt5Qml Qt5Quick >= 5.4.0" 2>/dev/null`
 else
   pkg_failed=yes
 fi
@@ -46941,12 +48283,12 @@
         pkg_cv_QT_LIBS="$QT_LIBS"
     else
         if test -n "$PKG_CONFIG" && \
-    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core Qt5Gui Qt5Quick >= 5.4.0\""; } >&5
-  ($PKG_CONFIG --exists --print-errors "Qt5Core Qt5Gui Qt5Quick >= 5.4.0") 2>&5
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5Core Qt5Gui Qt5Qml Qt5Quick >= 5.4.0\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "Qt5Core Qt5Gui Qt5Qml Qt5Quick >= 5.4.0") 2>&5
   ac_status=$?
   $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
   test $ac_status = 0; }; then
-  pkg_cv_QT_LIBS=`$PKG_CONFIG --libs "Qt5Core Qt5Gui Qt5Quick >= 5.4.0" 2>/dev/null`
+  pkg_cv_QT_LIBS=`$PKG_CONFIG --libs "Qt5Core Qt5Gui Qt5Qml Qt5Quick >= 5.4.0" 2>/dev/null`
 else
   pkg_failed=yes
 fi
@@ -46965,9 +48307,9 @@
         _pkg_short_errors_supported=no
 fi
         if test $_pkg_short_errors_supported = yes; then
-	        QT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "Qt5Core Qt5Gui Qt5Quick >= 5.4.0"`
+	        QT_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "Qt5Core Qt5Gui Qt5Qml Qt5Quick >= 5.4.0"`
         else
-	        QT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "Qt5Core Qt5Gui Qt5Quick >= 5.4.0"`
+	        QT_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "Qt5Core Qt5Gui Qt5Qml Qt5Quick >= 5.4.0"`
         fi
 	# Put the nasty error message in config.log where it belongs
 	echo "$QT_PKG_ERRORS" >&5
@@ -47298,6 +48640,264 @@
 
 fi
         fi
+        if test "x$GST_GL_HAVE_WINDOW_ANDROID" = "x1" -a "x$GST_GL_HAVE_PLATFORM_EGL" = "x1"; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for QT_ANDROID" >&5
+$as_echo_n "checking for QT_ANDROID... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$QT_ANDROID_CFLAGS"; then
+        pkg_cv_QT_ANDROID_CFLAGS="$QT_ANDROID_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5AndroidExtras\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "Qt5AndroidExtras") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_QT_ANDROID_CFLAGS=`$PKG_CONFIG --cflags "Qt5AndroidExtras" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$QT_ANDROID_LIBS"; then
+        pkg_cv_QT_ANDROID_LIBS="$QT_ANDROID_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5AndroidExtras\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "Qt5AndroidExtras") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_QT_ANDROID_LIBS=`$PKG_CONFIG --libs "Qt5AndroidExtras" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        QT_ANDROID_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "Qt5AndroidExtras"`
+        else
+	        QT_ANDROID_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "Qt5AndroidExtras"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$QT_ANDROID_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+                { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find Qt Android integration" >&5
+$as_echo "$as_me: Could not find Qt Android integration" >&6;}
+elif test $pkg_failed = untried; then
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: Could not find Qt Android integration" >&5
+$as_echo "$as_me: Could not find Qt Android integration" >&6;}
+else
+	QT_ANDROID_CFLAGS=$pkg_cv_QT_ANDROID_CFLAGS
+	QT_ANDROID_LIBS=$pkg_cv_QT_ANDROID_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+            # c++ on android requires a standard library and there are multiple
+            # choices.  cerbero provides a pkg-config file the describes a choice
+            # so try to use that.  Outside cerbero one has to pass these flags
+            # manually for the library one is using
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for GNUSTL" >&5
+$as_echo_n "checking for GNUSTL... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GNUSTL_CFLAGS"; then
+        pkg_cv_GNUSTL_CFLAGS="$GNUSTL_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnustl\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gnustl") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GNUSTL_CFLAGS=`$PKG_CONFIG --cflags "gnustl" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$GNUSTL_LIBS"; then
+        pkg_cv_GNUSTL_LIBS="$GNUSTL_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"gnustl\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "gnustl") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_GNUSTL_LIBS=`$PKG_CONFIG --libs "gnustl" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        GNUSTL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "gnustl"`
+        else
+	        GNUSTL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "gnustl"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$GNUSTL_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+
+              { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find Standard C++ library" >&5
+$as_echo "$as_me: Could not find Standard C++ library" >&6;}
+elif test $pkg_failed = untried; then
+
+              { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find Standard C++ library" >&5
+$as_echo "$as_me: Could not find Standard C++ library" >&6;}
+else
+	GNUSTL_CFLAGS=$pkg_cv_GNUSTL_CFLAGS
+	GNUSTL_LIBS=$pkg_cv_GNUSTL_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+              QT_CFLAGS="$QT_CFLAGS $GNUSTL_CFLAGS"
+              QT_LIBS="$QT_CFLAGS $GNUSTL_LIBS"
+
+fi
+
+
+$as_echo "#define HAVE_QT_ANDROID /**/" >>confdefs.h
+
+            QT_CFLAGS="$QT_CFLAGS $QT_ANDROID_CFLAGS"
+            QT_LIBS="$QT_LIBS $QT_ANDROID_LIBS"
+            HAVE_QT_WINDOWING="yes"
+
+fi
+        fi
+        if test "x$GST_GL_HAVE_WINDOW_COCOA" = "x1" -a "x$GST_GL_HAVE_PLATFORM_CGL" = "x1"; then
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for QT_MAC" >&5
+$as_echo_n "checking for QT_MAC... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$QT_MAC_CFLAGS"; then
+        pkg_cv_QT_MAC_CFLAGS="$QT_MAC_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5MacExtras\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "Qt5MacExtras") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_QT_MAC_CFLAGS=`$PKG_CONFIG --cflags "Qt5MacExtras" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$QT_MAC_LIBS"; then
+        pkg_cv_QT_MAC_LIBS="$QT_MAC_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"Qt5MacExtras\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "Qt5MacExtras") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_QT_MAC_LIBS=`$PKG_CONFIG --libs "Qt5MacExtras" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        QT_MAC_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "Qt5MacExtras"`
+        else
+	        QT_MAC_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "Qt5MacExtras"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$QT_MAC_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+                { $as_echo "$as_me:${as_lineno-$LINENO}: Could not find Qt Mac integration" >&5
+$as_echo "$as_me: Could not find Qt Mac integration" >&6;}
+elif test $pkg_failed = untried; then
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: Could not find Qt Mac integration" >&5
+$as_echo "$as_me: Could not find Qt Mac integration" >&6;}
+else
+	QT_MAC_CFLAGS=$pkg_cv_QT_MAC_CFLAGS
+	QT_MAC_LIBS=$pkg_cv_QT_MAC_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+
+$as_echo "#define HAVE_QT_MAC /**/" >>confdefs.h
+
+            QT_LIBDIR=`$PKG_CONFIG --variable=libdir Qt5Core`
+            QT_CFLAGS="$QT_CFLAGS $QT_MAC_CFLAGS -F$QT_LIBDIR -framework QtCore -framework QtGui -framework QtQuick -framework QtQml -framework QtMacExtras"
+            QT_LIBS="$QT_LIBS $QT_MAC_LIBS"
+            HAVE_QT_WINDOWING="yes"
+
+fi
+        fi
+        if test "x$GST_GL_HAVE_WINDOW_EAGL" = "x1" -a "x$GST_GL_HAVE_PLATFORM_EAGL" = "x1"; then
+          if test "x$HAVE_IOS" = "xyes"; then
+            # iOS doesn't have its own extras package so if we have the core
+            # modules we are good to go
+
+$as_echo "#define HAVE_QT_IOS /**/" >>confdefs.h
+
+            HAVE_QT_WINDOWING="yes"
+          fi
+        fi
         if test "x$HAVE_QT_WINDOWING" = "xno"; then
           { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Could not find any Qt Windowing integration" >&5
 $as_echo "$as_me: WARNING: Could not find any Qt Windowing integration" >&2;}
@@ -53826,6 +55426,26 @@
 
 
 
+
+# Check whether --with-hls-crypto was given.
+if test "${with_hls_crypto+set}" = set; then :
+  withval=$with_hls_crypto;
+    case $with_hls_crypto in #(
+  nettle) :
+     ;; #(
+  libgcrypt) :
+     ;; #(
+  openssl) :
+     ;; #(
+  *) :
+    with_hls_crypto=auto
+     ;;
+esac
+
+
+fi
+
+
 echo
 { $as_echo "$as_me:${as_lineno-$LINENO}: *** checking feature: http live streaming plugin ***" >&5
 $as_echo "$as_me: *** checking feature: http live streaming plugin ***" >&6;}
@@ -53873,6 +55493,389 @@
 
   HAVE_HLS=no
 
+  case $with_hls_crypto in #(
+  nettle) :
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for NETTLE" >&5
+$as_echo_n "checking for NETTLE... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$NETTLE_CFLAGS"; then
+        pkg_cv_NETTLE_CFLAGS="$NETTLE_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"nettle\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "nettle") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_NETTLE_CFLAGS=`$PKG_CONFIG --cflags "nettle" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$NETTLE_LIBS"; then
+        pkg_cv_NETTLE_LIBS="$NETTLE_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"nettle\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "nettle") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_NETTLE_LIBS=`$PKG_CONFIG --libs "nettle" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        NETTLE_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "nettle"`
+        else
+	        NETTLE_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "nettle"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$NETTLE_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+                as_fn_error $? "Could not find nettle library" "$LINENO" 5
+elif test $pkg_failed = untried; then
+	as_fn_error $? "Could not find nettle library" "$LINENO" 5
+else
+	NETTLE_CFLAGS=$pkg_cv_NETTLE_CFLAGS
+	NETTLE_LIBS=$pkg_cv_NETTLE_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+
+$as_echo "#define HAVE_NETTLE 1" >>confdefs.h
+
+        HAVE_HLS="yes"
+
+fi
+     ;; #(
+  libgcrypt) :
+
+
+
+# Check whether --with-libgcrypt-prefix was given.
+if test "${with_libgcrypt_prefix+set}" = set; then :
+  withval=$with_libgcrypt_prefix; libgcrypt_config_prefix="$withval"
+else
+  libgcrypt_config_prefix=""
+fi
+
+  if test x$libgcrypt_config_prefix != x ; then
+     if test x${LIBGCRYPT_CONFIG+set} != xset ; then
+        LIBGCRYPT_CONFIG=$libgcrypt_config_prefix/bin/libgcrypt-config
+     fi
+  fi
+
+  if test -n "$ac_tool_prefix"; then
+  # Extract the first word of "${ac_tool_prefix}libgcrypt-config", so it can be a program name with args.
+set dummy ${ac_tool_prefix}libgcrypt-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_LIBGCRYPT_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $LIBGCRYPT_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_LIBGCRYPT_CONFIG="$LIBGCRYPT_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_LIBGCRYPT_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+LIBGCRYPT_CONFIG=$ac_cv_path_LIBGCRYPT_CONFIG
+if test -n "$LIBGCRYPT_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $LIBGCRYPT_CONFIG" >&5
+$as_echo "$LIBGCRYPT_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+
+fi
+if test -z "$ac_cv_path_LIBGCRYPT_CONFIG"; then
+  ac_pt_LIBGCRYPT_CONFIG=$LIBGCRYPT_CONFIG
+  # Extract the first word of "libgcrypt-config", so it can be a program name with args.
+set dummy libgcrypt-config; ac_word=$2
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5
+$as_echo_n "checking for $ac_word... " >&6; }
+if ${ac_cv_path_ac_pt_LIBGCRYPT_CONFIG+:} false; then :
+  $as_echo_n "(cached) " >&6
+else
+  case $ac_pt_LIBGCRYPT_CONFIG in
+  [\\/]* | ?:[\\/]*)
+  ac_cv_path_ac_pt_LIBGCRYPT_CONFIG="$ac_pt_LIBGCRYPT_CONFIG" # Let the user override the test with a path.
+  ;;
+  *)
+  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR
+for as_dir in $PATH
+do
+  IFS=$as_save_IFS
+  test -z "$as_dir" && as_dir=.
+    for ac_exec_ext in '' $ac_executable_extensions; do
+  if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then
+    ac_cv_path_ac_pt_LIBGCRYPT_CONFIG="$as_dir/$ac_word$ac_exec_ext"
+    $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5
+    break 2
+  fi
+done
+  done
+IFS=$as_save_IFS
+
+  ;;
+esac
+fi
+ac_pt_LIBGCRYPT_CONFIG=$ac_cv_path_ac_pt_LIBGCRYPT_CONFIG
+if test -n "$ac_pt_LIBGCRYPT_CONFIG"; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_pt_LIBGCRYPT_CONFIG" >&5
+$as_echo "$ac_pt_LIBGCRYPT_CONFIG" >&6; }
+else
+  { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+fi
+
+  if test "x$ac_pt_LIBGCRYPT_CONFIG" = x; then
+    LIBGCRYPT_CONFIG="no"
+  else
+    case $cross_compiling:$ac_tool_warned in
+yes:)
+{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5
+$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;}
+ac_tool_warned=yes ;;
+esac
+    LIBGCRYPT_CONFIG=$ac_pt_LIBGCRYPT_CONFIG
+  fi
+else
+  LIBGCRYPT_CONFIG="$ac_cv_path_LIBGCRYPT_CONFIG"
+fi
+
+  tmp=1.2.0
+  if echo "$tmp" | grep ':' >/dev/null 2>/dev/null ; then
+     req_libgcrypt_api=`echo "$tmp"     | sed 's/\(.*\):\(.*\)/\1/'`
+     min_libgcrypt_version=`echo "$tmp" | sed 's/\(.*\):\(.*\)/\2/'`
+  else
+     req_libgcrypt_api=0
+     min_libgcrypt_version="$tmp"
+  fi
+
+  { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LIBGCRYPT - version >= $min_libgcrypt_version" >&5
+$as_echo_n "checking for LIBGCRYPT - version >= $min_libgcrypt_version... " >&6; }
+  ok=no
+  if test "$LIBGCRYPT_CONFIG" != "no" ; then
+    req_major=`echo $min_libgcrypt_version | \
+               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\1/'`
+    req_minor=`echo $min_libgcrypt_version | \
+               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\2/'`
+    req_micro=`echo $min_libgcrypt_version | \
+               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\)/\3/'`
+    libgcrypt_config_version=`$LIBGCRYPT_CONFIG --version`
+    major=`echo $libgcrypt_config_version | \
+               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\1/'`
+    minor=`echo $libgcrypt_config_version | \
+               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\2/'`
+    micro=`echo $libgcrypt_config_version | \
+               sed 's/\([0-9]*\)\.\([0-9]*\)\.\([0-9]*\).*/\3/'`
+    if test "$major" -gt "$req_major"; then
+        ok=yes
+    else
+        if test "$major" -eq "$req_major"; then
+            if test "$minor" -gt "$req_minor"; then
+               ok=yes
+            else
+               if test "$minor" -eq "$req_minor"; then
+                   if test "$micro" -ge "$req_micro"; then
+                     ok=yes
+                   fi
+               fi
+            fi
+        fi
+    fi
+  fi
+  if test $ok = yes; then
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes ($libgcrypt_config_version)" >&5
+$as_echo "yes ($libgcrypt_config_version)" >&6; }
+  else
+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+  fi
+  if test $ok = yes; then
+     # If we have a recent libgcrypt, we should also check that the
+     # API is compatible
+     if test "$req_libgcrypt_api" -gt 0 ; then
+        tmp=`$LIBGCRYPT_CONFIG --api-version 2>/dev/null || echo 0`
+        if test "$tmp" -gt 0 ; then
+           { $as_echo "$as_me:${as_lineno-$LINENO}: checking LIBGCRYPT API version" >&5
+$as_echo_n "checking LIBGCRYPT API version... " >&6; }
+           if test "$req_libgcrypt_api" -eq "$tmp" ; then
+             { $as_echo "$as_me:${as_lineno-$LINENO}: result: okay" >&5
+$as_echo "okay" >&6; }
+           else
+             ok=no
+             { $as_echo "$as_me:${as_lineno-$LINENO}: result: does not match. want=$req_libgcrypt_api got=$tmp" >&5
+$as_echo "does not match. want=$req_libgcrypt_api got=$tmp" >&6; }
+           fi
+        fi
+     fi
+  fi
+  if test $ok = yes; then
+    LIBGCRYPT_CFLAGS=`$LIBGCRYPT_CONFIG --cflags`
+    LIBGCRYPT_LIBS=`$LIBGCRYPT_CONFIG --libs`
+
+
+$as_echo "#define HAVE_LIBGCRYPT 1" >>confdefs.h
+
+        HAVE_HLS="yes"
+
+    libgcrypt_config_host=`$LIBGCRYPT_CONFIG --host 2>/dev/null || echo none`
+    if test x"$libgcrypt_config_host" != xnone ; then
+      if test x"$libgcrypt_config_host" != x"$host" ; then
+  { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING:
+***
+*** The config script $LIBGCRYPT_CONFIG was
+*** built for $libgcrypt_config_host and thus may not match the
+*** used host $host.
+*** You may want to use the configure option --with-libgcrypt-prefix
+*** to specify a matching config script.
+***" >&5
+$as_echo "$as_me: WARNING:
+***
+*** The config script $LIBGCRYPT_CONFIG was
+*** built for $libgcrypt_config_host and thus may not match the
+*** used host $host.
+*** You may want to use the configure option --with-libgcrypt-prefix
+*** to specify a matching config script.
+***" >&2;}
+      fi
+    fi
+  else
+    LIBGCRYPT_CFLAGS=""
+    LIBGCRYPT_LIBS=""
+    as_fn_error $? "Could not find libgcrypt library" "$LINENO" 5
+  fi
+
+
+
+     ;; #(
+  openssl) :
+
+
+pkg_failed=no
+{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for OPENSSL" >&5
+$as_echo_n "checking for OPENSSL... " >&6; }
+
+if test -n "$PKG_CONFIG"; then
+    if test -n "$OPENSSL_CFLAGS"; then
+        pkg_cv_OPENSSL_CFLAGS="$OPENSSL_CFLAGS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openssl\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "openssl") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_OPENSSL_CFLAGS=`$PKG_CONFIG --cflags "openssl" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+if test -n "$PKG_CONFIG"; then
+    if test -n "$OPENSSL_LIBS"; then
+        pkg_cv_OPENSSL_LIBS="$OPENSSL_LIBS"
+    else
+        if test -n "$PKG_CONFIG" && \
+    { { $as_echo "$as_me:${as_lineno-$LINENO}: \$PKG_CONFIG --exists --print-errors \"openssl\""; } >&5
+  ($PKG_CONFIG --exists --print-errors "openssl") 2>&5
+  ac_status=$?
+  $as_echo "$as_me:${as_lineno-$LINENO}: \$? = $ac_status" >&5
+  test $ac_status = 0; }; then
+  pkg_cv_OPENSSL_LIBS=`$PKG_CONFIG --libs "openssl" 2>/dev/null`
+else
+  pkg_failed=yes
+fi
+    fi
+else
+	pkg_failed=untried
+fi
+
+
+
+if test $pkg_failed = yes; then
+
+if $PKG_CONFIG --atleast-pkgconfig-version 0.20; then
+        _pkg_short_errors_supported=yes
+else
+        _pkg_short_errors_supported=no
+fi
+        if test $_pkg_short_errors_supported = yes; then
+	        OPENSSL_PKG_ERRORS=`$PKG_CONFIG --short-errors --errors-to-stdout --print-errors "openssl"`
+        else
+	        OPENSSL_PKG_ERRORS=`$PKG_CONFIG --errors-to-stdout --print-errors "openssl"`
+        fi
+	# Put the nasty error message in config.log where it belongs
+	echo "$OPENSSL_PKG_ERRORS" >&5
+
+	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
+$as_echo "no" >&6; }
+                as_fn_error $? "Could not find openssl library" "$LINENO" 5
+elif test $pkg_failed = untried; then
+	as_fn_error $? "Could not find openssl library" "$LINENO" 5
+else
+	OPENSSL_CFLAGS=$pkg_cv_OPENSSL_CFLAGS
+	OPENSSL_LIBS=$pkg_cv_OPENSSL_LIBS
+        { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5
+$as_echo "yes" >&6; }
+
+
+$as_echo "#define HAVE_OPENSSL 1" >>confdefs.h
+
+        HAVE_HLS="yes"
+
+fi
+     ;; #(
+  *) :
+
 
 pkg_failed=no
 { $as_echo "$as_me:${as_lineno-$LINENO}: checking for NETTLE" >&5
@@ -54123,7 +56126,7 @@
 
 $as_echo "#define HAVE_LIBGCRYPT 1" >>confdefs.h
 
-      HAVE_HLS="yes"
+          HAVE_HLS="yes"
 
     libgcrypt_config_host=`$LIBGCRYPT_CONFIG --host 2>/dev/null || echo none`
     if test x"$libgcrypt_config_host" != xnone ; then
@@ -54212,11 +56215,11 @@
 	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 
-        HAVE_HLS="no"
+            HAVE_HLS="no"
 
 elif test $pkg_failed = untried; then
 
-        HAVE_HLS="no"
+            HAVE_HLS="no"
 
 else
 	OPENSSL_CFLAGS=$pkg_cv_OPENSSL_CFLAGS
@@ -54227,7 +56230,7 @@
 
 $as_echo "#define HAVE_OPENSSL 1" >>confdefs.h
 
-        HAVE_HLS="yes"
+            HAVE_HLS="yes"
 
 fi
 
@@ -54426,7 +56429,7 @@
 
 $as_echo "#define HAVE_LIBGCRYPT 1" >>confdefs.h
 
-      HAVE_HLS="yes"
+          HAVE_HLS="yes"
 
     libgcrypt_config_host=`$LIBGCRYPT_CONFIG --host 2>/dev/null || echo none`
     if test x"$libgcrypt_config_host" != xnone ; then
@@ -54515,11 +56518,11 @@
 	{ $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5
 $as_echo "no" >&6; }
 
-        HAVE_HLS="no"
+            HAVE_HLS="no"
 
 elif test $pkg_failed = untried; then
 
-        HAVE_HLS="no"
+            HAVE_HLS="no"
 
 else
 	OPENSSL_CFLAGS=$pkg_cv_OPENSSL_CFLAGS
@@ -54530,7 +56533,7 @@
 
 $as_echo "#define HAVE_OPENSSL 1" >>confdefs.h
 
-        HAVE_HLS="yes"
+            HAVE_HLS="yes"
 
 fi
 
@@ -54548,10 +56551,13 @@
 
 $as_echo "#define HAVE_NETTLE 1" >>confdefs.h
 
-    HAVE_HLS="yes"
+        HAVE_HLS="yes"
 
 fi
 
+   ;;
+esac
+
 
   LIBS=$gst_check_save_LIBS
   LDFLAGS=$gst_check_save_LDFLAGS
@@ -55473,6 +57479,9 @@
 
 
 GST_ALL_LDFLAGS="-no-undefined"
+if test "x${enable_Bsymbolic}" = "xyes"; then
+  GST_ALL_LDFLAGS="$GST_ALL_LDFLAGS -Wl,-Bsymbolic-functions"
+fi
 
 
 GST_LIB_LDFLAGS="-export-symbols-regex ^_?\(gst_\|Gst\|GST_\).*"
@@ -55485,7 +57494,7 @@
 $MKDIR_P tests/check/orc
 
 
-ac_config_files="$ac_config_files Makefile common/Makefile common/m4/Makefile gst-plugins-bad.spec gst/Makefile gst/accurip/Makefile gst/adpcmdec/Makefile gst/adpcmenc/Makefile gst/aiff/Makefile gst/asfmux/Makefile gst/audiofxbad/Makefile gst/audiomixer/Makefile gst/audiovisualizers/Makefile gst/autoconvert/Makefile gst/bayer/Makefile gst/camerabin2/Makefile gst/cdxaparse/Makefile gst/coloreffects/Makefile gst/dataurisrc/Makefile gst/dccp/Makefile gst/debugutils/Makefile gst/dvbsuboverlay/Makefile gst/dvdspu/Makefile gst/faceoverlay/Makefile gst/festival/Makefile gst/fieldanalysis/Makefile gst/freeverb/Makefile gst/frei0r/Makefile gst/gaudieffects/Makefile gst/geometrictransform/Makefile gst/gdp/Makefile gst/hdvparse/Makefile gst/id3tag/Makefile gst/inter/Makefile gst/interlace/Makefile gst/ivfparse/Makefile gst/ivtc/Makefile gst/jp2kdecimator/Makefile gst/jpegformat/Makefile gst/librfb/Makefile gst/liveadder/Makefile gst/midi/Makefile gst/mpegdemux/Makefile gst/mpegtsdemux/Makefile gst/mpegtsmux/Makefile gst/mpegtsmux/tsmux/Makefile gst/mpegpsmux/Makefile gst/mve/Makefile gst/mxf/Makefile gst/nuvdemux/Makefile gst/onvif/Makefile gst/patchdetect/Makefile gst/pcapparse/Makefile gst/pnm/Makefile gst/rawparse/Makefile gst/removesilence/Makefile gst/rtp/Makefile gst/sdi/Makefile gst/sdp/Makefile gst/segmentclip/Makefile gst/siren/Makefile gst/smooth/Makefile gst/speed/Makefile gst/subenc/Makefile gst/stereo/Makefile gst/tta/Makefile gst/videofilters/Makefile gst/videomeasure/Makefile gst/videoparsers/Makefile gst/videosignal/Makefile gst/vmnc/Makefile gst/y4m/Makefile gst/yadif/Makefile gst/compositor/Makefile gst-libs/Makefile gst-libs/gst/Makefile gst-libs/gst/adaptivedemux/Makefile gst-libs/gst/basecamerabinsrc/Makefile gst-libs/gst/gl/Makefile gst-libs/gst/gl/android/Makefile gst-libs/gst/gl/cocoa/Makefile gst-libs/gst/gl/dispmanx/Makefile gst-libs/gst/gl/glprototypes/Makefile gst-libs/gst/gl/eagl/Makefile 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/insertbin/Makefile gst-libs/gst/interfaces/Makefile gst-libs/gst/codecparsers/Makefile gst-libs/gst/mpegts/Makefile gst-libs/gst/uridownloader/Makefile gst-libs/gst/wayland/Makefile gst-libs/gst/base/Makefile gst-libs/gst/video/Makefile sys/Makefile sys/dshowdecwrapper/Makefile sys/acmenc/Makefile sys/acmmp3dec/Makefile sys/androidmedia/Makefile sys/applemedia/Makefile sys/applemedia-nonpublic/Makefile sys/avc/Makefile sys/bluez/Makefile sys/d3dvideosink/Makefile sys/decklink/Makefile sys/directsound/Makefile sys/dshowsrcwrapper/Makefile sys/dshowvideosink/Makefile sys/dvb/Makefile sys/fbdev/Makefile sys/linsys/Makefile sys/opensles/Makefile sys/shm/Makefile sys/uvch264/Makefile sys/vcd/Makefile sys/vdpau/Makefile sys/pvr2d/Makefile sys/wasapi/Makefile sys/wininet/Makefile sys/winks/Makefile sys/winscreencap/Makefile tests/Makefile tests/check/Makefile tests/files/Makefile tests/examples/Makefile tests/examples/avsamplesink/Makefile tests/examples/camerabin2/Makefile tests/examples/codecparsers/Makefile tests/examples/directfb/Makefile tests/examples/gl/Makefile tests/examples/gl/cocoa/Makefile tests/examples/gl/clutter/Makefile tests/examples/gl/generic/Makefile tests/examples/gl/generic/cube/Makefile tests/examples/gl/generic/cubeyuv/Makefile tests/examples/gl/generic/doublecube/Makefile tests/examples/gl/generic/recordgraphic/Makefile tests/examples/gl/gtk/Makefile tests/examples/gl/gtk/gtkvideooverlay/Makefile tests/examples/gl/gtk/3dvideo/Makefile tests/examples/gl/gtk/filternovideooverlay/Makefile tests/examples/gl/gtk/filtervideooverlay/Makefile tests/examples/gl/gtk/fxtest/Makefile tests/examples/gl/gtk/switchvideooverlay/Makefile tests/examples/gl/qt/Makefile tests/examples/gl/sdl/Makefile tests/examples/gtk/Makefile tests/examples/mpegts/Makefile tests/examples/mxf/Makefile tests/examples/opencv/Makefile tests/examples/uvch264/Makefile tests/icles/Makefile ext/voamrwbenc/Makefile ext/voaacenc/Makefile ext/assrender/Makefile ext/apexsink/Makefile ext/bs2b/Makefile ext/bz2/Makefile ext/chromaprint/Makefile ext/curl/Makefile ext/dash/Makefile ext/dc1394/Makefile ext/directfb/Makefile ext/wayland/Makefile ext/daala/Makefile ext/dts/Makefile ext/gl/Makefile ext/gtk/Makefile ext/faac/Makefile ext/faad/Makefile ext/flite/Makefile ext/fluidsynth/Makefile ext/gsm/Makefile ext/hls/Makefile ext/kate/Makefile ext/ladspa/Makefile ext/lv2/Makefile ext/libde265/Makefile ext/libmms/Makefile ext/libvisual/Makefile ext/Makefile ext/modplug/Makefile ext/mpeg2enc/Makefile ext/mpg123/Makefile ext/mimic/Makefile ext/mplex/Makefile ext/musepack/Makefile ext/nas/Makefile ext/neon/Makefile ext/ofa/Makefile ext/openal/Makefile ext/opencv/Makefile ext/openexr/Makefile ext/openh264/Makefile ext/openjpeg/Makefile ext/openni2/Makefile ext/opus/Makefile ext/qt/Makefile ext/rsvg/Makefile ext/resindvd/Makefile ext/rtmp/Makefile ext/sbc/Makefile ext/schroedinger/Makefile ext/sdl/Makefile ext/smoothstreaming/Makefile ext/sndfile/Makefile ext/soundtouch/Makefile ext/spandsp/Makefile ext/sndio/Makefile ext/srtp/Makefile ext/teletextdec/Makefile ext/gme/Makefile ext/gsettings/Makefile ext/gsettings/org.freedesktop.gstreamer.default-elements.gschema.xml ext/spc/Makefile ext/timidity/Makefile ext/webp/Makefile ext/x265/Makefile ext/xvid/Makefile ext/zbar/Makefile ext/dtls/Makefile po/Makefile.in docs/Makefile docs/plugins/Makefile docs/libs/Makefile docs/version.entities pkgconfig/Makefile pkgconfig/gstreamer-plugins-bad.pc pkgconfig/gstreamer-plugins-bad-uninstalled.pc pkgconfig/gstreamer-codecparsers.pc pkgconfig/gstreamer-codecparsers-uninstalled.pc pkgconfig/gstreamer-insertbin.pc pkgconfig/gstreamer-insertbin-uninstalled.pc pkgconfig/gstreamer-gl.pc pkgconfig/gstreamer-gl-uninstalled.pc pkgconfig/gstreamer-mpegts.pc pkgconfig/gstreamer-mpegts-uninstalled.pc pkgconfig/gstreamer-wayland.pc pkgconfig/gstreamer-wayland-uninstalled.pc pkgconfig/gstreamer-bad-base.pc pkgconfig/gstreamer-bad-base-uninstalled.pc pkgconfig/gstreamer-bad-video.pc pkgconfig/gstreamer-bad-video-uninstalled.pc tools/Makefile m4/Makefile"
+ac_config_files="$ac_config_files Makefile common/Makefile common/m4/Makefile gst-plugins-bad.spec gst/Makefile gst/accurip/Makefile gst/adpcmdec/Makefile gst/adpcmenc/Makefile gst/aiff/Makefile gst/videoframe_audiolevel/Makefile gst/asfmux/Makefile gst/audiofxbad/Makefile gst/audiomixer/Makefile gst/audiovisualizers/Makefile gst/autoconvert/Makefile gst/bayer/Makefile gst/camerabin2/Makefile gst/cdxaparse/Makefile gst/coloreffects/Makefile gst/dataurisrc/Makefile gst/dccp/Makefile gst/debugutils/Makefile gst/dvbsuboverlay/Makefile gst/dvdspu/Makefile gst/faceoverlay/Makefile gst/festival/Makefile gst/fieldanalysis/Makefile gst/freeverb/Makefile gst/frei0r/Makefile gst/gaudieffects/Makefile gst/geometrictransform/Makefile gst/gdp/Makefile gst/hdvparse/Makefile gst/id3tag/Makefile gst/inter/Makefile gst/interlace/Makefile gst/ivfparse/Makefile gst/ivtc/Makefile gst/jp2kdecimator/Makefile gst/jpegformat/Makefile gst/librfb/Makefile gst/midi/Makefile gst/mpegdemux/Makefile gst/mpegtsdemux/Makefile gst/mpegtsmux/Makefile gst/mpegtsmux/tsmux/Makefile gst/mpegpsmux/Makefile gst/mve/Makefile gst/mxf/Makefile gst/nuvdemux/Makefile gst/onvif/Makefile gst/patchdetect/Makefile gst/pcapparse/Makefile gst/pnm/Makefile gst/rawparse/Makefile gst/removesilence/Makefile gst/rtp/Makefile gst/sdi/Makefile gst/sdp/Makefile gst/segmentclip/Makefile gst/siren/Makefile gst/smooth/Makefile gst/speed/Makefile gst/subenc/Makefile gst/stereo/Makefile gst/tta/Makefile gst/videofilters/Makefile gst/videomeasure/Makefile gst/videoparsers/Makefile gst/videosignal/Makefile gst/vmnc/Makefile gst/y4m/Makefile gst/yadif/Makefile gst/compositor/Makefile gst-libs/Makefile gst-libs/gst/Makefile gst-libs/gst/adaptivedemux/Makefile gst-libs/gst/basecamerabinsrc/Makefile gst-libs/gst/gl/Makefile gst-libs/gst/gl/android/Makefile gst-libs/gst/gl/cocoa/Makefile gst-libs/gst/gl/dispmanx/Makefile gst-libs/gst/gl/glprototypes/Makefile gst-libs/gst/gl/eagl/Makefile 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/insertbin/Makefile gst-libs/gst/interfaces/Makefile gst-libs/gst/codecparsers/Makefile gst-libs/gst/mpegts/Makefile gst-libs/gst/uridownloader/Makefile gst-libs/gst/wayland/Makefile gst-libs/gst/base/Makefile gst-libs/gst/player/Makefile gst-libs/gst/video/Makefile sys/Makefile sys/dshowdecwrapper/Makefile sys/acmenc/Makefile sys/acmmp3dec/Makefile sys/androidmedia/Makefile sys/applemedia/Makefile sys/applemedia-nonpublic/Makefile sys/avc/Makefile sys/bluez/Makefile sys/d3dvideosink/Makefile sys/decklink/Makefile sys/directsound/Makefile sys/dshowsrcwrapper/Makefile sys/dshowvideosink/Makefile sys/dvb/Makefile sys/fbdev/Makefile sys/linsys/Makefile sys/nvenc/Makefile sys/opensles/Makefile sys/shm/Makefile sys/uvch264/Makefile sys/vcd/Makefile sys/vdpau/Makefile sys/pvr2d/Makefile sys/wasapi/Makefile sys/wininet/Makefile sys/winks/Makefile sys/winscreencap/Makefile tests/Makefile tests/check/Makefile tests/files/Makefile tests/examples/Makefile tests/examples/avsamplesink/Makefile tests/examples/camerabin2/Makefile tests/examples/codecparsers/Makefile tests/examples/directfb/Makefile tests/examples/gl/Makefile tests/examples/gl/cocoa/Makefile tests/examples/gl/clutter/Makefile tests/examples/gl/generic/Makefile tests/examples/gl/generic/cube/Makefile tests/examples/gl/generic/cubeyuv/Makefile tests/examples/gl/generic/doublecube/Makefile tests/examples/gl/generic/recordgraphic/Makefile tests/examples/gl/gtk/Makefile tests/examples/gl/gtk/gtkvideooverlay/Makefile tests/examples/gl/gtk/3dvideo/Makefile tests/examples/gl/gtk/filternovideooverlay/Makefile tests/examples/gl/gtk/filtervideooverlay/Makefile tests/examples/gl/gtk/fxtest/Makefile tests/examples/gl/gtk/switchvideooverlay/Makefile tests/examples/gl/qt/Makefile tests/examples/gl/sdl/Makefile tests/examples/gtk/Makefile tests/examples/mpegts/Makefile tests/examples/mxf/Makefile tests/examples/opencv/Makefile tests/examples/uvch264/Makefile tests/examples/waylandsink/Makefile tests/icles/Makefile ext/voamrwbenc/Makefile ext/voaacenc/Makefile ext/assrender/Makefile ext/apexsink/Makefile ext/bs2b/Makefile ext/bz2/Makefile ext/chromaprint/Makefile ext/curl/Makefile ext/dash/Makefile ext/dc1394/Makefile ext/directfb/Makefile ext/wayland/Makefile ext/daala/Makefile ext/dts/Makefile ext/gl/Makefile ext/gtk/Makefile ext/faac/Makefile ext/faad/Makefile ext/flite/Makefile ext/fluidsynth/Makefile ext/gsm/Makefile ext/hls/Makefile ext/kate/Makefile ext/ladspa/Makefile ext/lv2/Makefile ext/libde265/Makefile ext/libmms/Makefile ext/libvisual/Makefile ext/Makefile ext/modplug/Makefile ext/mpeg2enc/Makefile ext/mpg123/Makefile ext/mimic/Makefile ext/mplex/Makefile ext/musepack/Makefile ext/nas/Makefile ext/neon/Makefile ext/ofa/Makefile ext/openal/Makefile ext/opencv/Makefile ext/openexr/Makefile ext/openh264/Makefile ext/openjpeg/Makefile ext/openni2/Makefile ext/opus/Makefile ext/qt/Makefile ext/rsvg/Makefile ext/resindvd/Makefile ext/rtmp/Makefile ext/sbc/Makefile ext/schroedinger/Makefile ext/sdl/Makefile ext/smoothstreaming/Makefile ext/sndfile/Makefile ext/soundtouch/Makefile ext/spandsp/Makefile ext/sndio/Makefile ext/srtp/Makefile ext/teletextdec/Makefile ext/gme/Makefile ext/gsettings/Makefile ext/gsettings/org.freedesktop.gstreamer.default-elements.gschema.xml ext/spc/Makefile ext/timidity/Makefile ext/webp/Makefile ext/x265/Makefile ext/xvid/Makefile ext/zbar/Makefile ext/dtls/Makefile po/Makefile.in docs/Makefile docs/plugins/Makefile docs/libs/Makefile docs/version.entities pkgconfig/Makefile pkgconfig/gstreamer-plugins-bad.pc pkgconfig/gstreamer-plugins-bad-uninstalled.pc pkgconfig/gstreamer-codecparsers.pc pkgconfig/gstreamer-codecparsers-uninstalled.pc pkgconfig/gstreamer-insertbin.pc pkgconfig/gstreamer-insertbin-uninstalled.pc pkgconfig/gstreamer-gl.pc pkgconfig/gstreamer-gl-uninstalled.pc pkgconfig/gstreamer-mpegts.pc pkgconfig/gstreamer-mpegts-uninstalled.pc pkgconfig/gstreamer-player.pc pkgconfig/gstreamer-player-uninstalled.pc pkgconfig/gstreamer-wayland.pc pkgconfig/gstreamer-wayland-uninstalled.pc pkgconfig/gstreamer-bad-base.pc pkgconfig/gstreamer-bad-base-uninstalled.pc pkgconfig/gstreamer-bad-video.pc pkgconfig/gstreamer-bad-video-uninstalled.pc tools/Makefile m4/Makefile"
 
 
 sed \
@@ -55852,6 +57861,10 @@
   as_fn_error $? "conditional \"GST_PLUGIN_BUILD_STATIC\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${WITH_GST_PLAYER_TESTS_TRUE}" && test -z "${WITH_GST_PLAYER_TESTS_FALSE}"; then
+  as_fn_error $? "conditional \"WITH_GST_PLAYER_TESTS\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${USE_PLUGIN_ACCURIP_TRUE}" && test -z "${USE_PLUGIN_ACCURIP_FALSE}"; then
   as_fn_error $? "conditional \"USE_PLUGIN_ACCURIP\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -55868,6 +57881,10 @@
   as_fn_error $? "conditional \"USE_PLUGIN_AIFF\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${USE_PLUGIN_VIDEOFRAME_AUDIOLEVEL_TRUE}" && test -z "${USE_PLUGIN_VIDEOFRAME_AUDIOLEVEL_FALSE}"; then
+  as_fn_error $? "conditional \"USE_PLUGIN_VIDEOFRAME_AUDIOLEVEL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${USE_PLUGIN_ASFMUX_TRUE}" && test -z "${USE_PLUGIN_ASFMUX_FALSE}"; then
   as_fn_error $? "conditional \"USE_PLUGIN_ASFMUX\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -55996,10 +58013,6 @@
   as_fn_error $? "conditional \"USE_PLUGIN_LIBRFB\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
-if test -z "${USE_PLUGIN_LIVEADDER_TRUE}" && test -z "${USE_PLUGIN_LIVEADDER_FALSE}"; then
-  as_fn_error $? "conditional \"USE_PLUGIN_LIVEADDER\" was never defined.
-Usually this means the macro was only invoked conditionally." "$LINENO" 5
-fi
 if test -z "${USE_PLUGIN_MIDI_TRUE}" && test -z "${USE_PLUGIN_MIDI_FALSE}"; then
   as_fn_error $? "conditional \"USE_PLUGIN_MIDI\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -56268,6 +58281,14 @@
   as_fn_error $? "conditional \"USE_UVCH264\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
 fi
+if test -z "${USE_NVENC_TRUE}" && test -z "${USE_NVENC_FALSE}"; then
+  as_fn_error $? "conditional \"USE_NVENC\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
+if test -z "${USE_NVENC_GST_GL_TRUE}" && test -z "${USE_NVENC_GST_GL_FALSE}"; then
+  as_fn_error $? "conditional \"USE_NVENC_GST_GL\" was never defined.
+Usually this means the macro was only invoked conditionally." "$LINENO" 5
+fi
 if test -z "${USE_ASSRENDER_TRUE}" && test -z "${USE_ASSRENDER_FALSE}"; then
   as_fn_error $? "conditional \"USE_ASSRENDER\" was never defined.
 Usually this means the macro was only invoked conditionally." "$LINENO" 5
@@ -57325,7 +59346,7 @@
 # report actual input values of CONFIG_FILES etc. instead of their
 # values after options handling.
 ac_log="
-This file was extended by GStreamer Bad Plug-ins $as_me 1.6.2, which was
+This file was extended by GStreamer Bad Plug-ins $as_me 1.7.1, which was
 generated by GNU Autoconf 2.69.  Invocation command line was
 
   CONFIG_FILES    = $CONFIG_FILES
@@ -57391,7 +59412,7 @@
 cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
 ac_cs_version="\\
-GStreamer Bad Plug-ins config.status 1.6.2
+GStreamer Bad Plug-ins config.status 1.7.1
 configured by $0, generated by GNU Autoconf 2.69,
   with options \\"\$ac_cs_config\\"
 
@@ -57940,6 +59961,7 @@
     "gst/adpcmdec/Makefile") CONFIG_FILES="$CONFIG_FILES gst/adpcmdec/Makefile" ;;
     "gst/adpcmenc/Makefile") CONFIG_FILES="$CONFIG_FILES gst/adpcmenc/Makefile" ;;
     "gst/aiff/Makefile") CONFIG_FILES="$CONFIG_FILES gst/aiff/Makefile" ;;
+    "gst/videoframe_audiolevel/Makefile") CONFIG_FILES="$CONFIG_FILES gst/videoframe_audiolevel/Makefile" ;;
     "gst/asfmux/Makefile") CONFIG_FILES="$CONFIG_FILES gst/asfmux/Makefile" ;;
     "gst/audiofxbad/Makefile") CONFIG_FILES="$CONFIG_FILES gst/audiofxbad/Makefile" ;;
     "gst/audiomixer/Makefile") CONFIG_FILES="$CONFIG_FILES gst/audiomixer/Makefile" ;;
@@ -57971,7 +59993,6 @@
     "gst/jp2kdecimator/Makefile") CONFIG_FILES="$CONFIG_FILES gst/jp2kdecimator/Makefile" ;;
     "gst/jpegformat/Makefile") CONFIG_FILES="$CONFIG_FILES gst/jpegformat/Makefile" ;;
     "gst/librfb/Makefile") CONFIG_FILES="$CONFIG_FILES gst/librfb/Makefile" ;;
-    "gst/liveadder/Makefile") CONFIG_FILES="$CONFIG_FILES gst/liveadder/Makefile" ;;
     "gst/midi/Makefile") CONFIG_FILES="$CONFIG_FILES gst/midi/Makefile" ;;
     "gst/mpegdemux/Makefile") CONFIG_FILES="$CONFIG_FILES gst/mpegdemux/Makefile" ;;
     "gst/mpegtsdemux/Makefile") CONFIG_FILES="$CONFIG_FILES gst/mpegtsdemux/Makefile" ;;
@@ -58026,6 +60047,7 @@
     "gst-libs/gst/uridownloader/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/uridownloader/Makefile" ;;
     "gst-libs/gst/wayland/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/wayland/Makefile" ;;
     "gst-libs/gst/base/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/base/Makefile" ;;
+    "gst-libs/gst/player/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/player/Makefile" ;;
     "gst-libs/gst/video/Makefile") CONFIG_FILES="$CONFIG_FILES gst-libs/gst/video/Makefile" ;;
     "sys/Makefile") CONFIG_FILES="$CONFIG_FILES sys/Makefile" ;;
     "sys/dshowdecwrapper/Makefile") CONFIG_FILES="$CONFIG_FILES sys/dshowdecwrapper/Makefile" ;;
@@ -58044,6 +60066,7 @@
     "sys/dvb/Makefile") CONFIG_FILES="$CONFIG_FILES sys/dvb/Makefile" ;;
     "sys/fbdev/Makefile") CONFIG_FILES="$CONFIG_FILES sys/fbdev/Makefile" ;;
     "sys/linsys/Makefile") CONFIG_FILES="$CONFIG_FILES sys/linsys/Makefile" ;;
+    "sys/nvenc/Makefile") CONFIG_FILES="$CONFIG_FILES sys/nvenc/Makefile" ;;
     "sys/opensles/Makefile") CONFIG_FILES="$CONFIG_FILES sys/opensles/Makefile" ;;
     "sys/shm/Makefile") CONFIG_FILES="$CONFIG_FILES sys/shm/Makefile" ;;
     "sys/uvch264/Makefile") CONFIG_FILES="$CONFIG_FILES sys/uvch264/Makefile" ;;
@@ -58084,6 +60107,7 @@
     "tests/examples/mxf/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/mxf/Makefile" ;;
     "tests/examples/opencv/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/opencv/Makefile" ;;
     "tests/examples/uvch264/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/uvch264/Makefile" ;;
+    "tests/examples/waylandsink/Makefile") CONFIG_FILES="$CONFIG_FILES tests/examples/waylandsink/Makefile" ;;
     "tests/icles/Makefile") CONFIG_FILES="$CONFIG_FILES tests/icles/Makefile" ;;
     "ext/voamrwbenc/Makefile") CONFIG_FILES="$CONFIG_FILES ext/voamrwbenc/Makefile" ;;
     "ext/voaacenc/Makefile") CONFIG_FILES="$CONFIG_FILES ext/voaacenc/Makefile" ;;
@@ -58170,6 +60194,8 @@
     "pkgconfig/gstreamer-gl-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-gl-uninstalled.pc" ;;
     "pkgconfig/gstreamer-mpegts.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-mpegts.pc" ;;
     "pkgconfig/gstreamer-mpegts-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-mpegts-uninstalled.pc" ;;
+    "pkgconfig/gstreamer-player.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-player.pc" ;;
+    "pkgconfig/gstreamer-player-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-player-uninstalled.pc" ;;
     "pkgconfig/gstreamer-wayland.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-wayland.pc" ;;
     "pkgconfig/gstreamer-wayland-uninstalled.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-wayland-uninstalled.pc" ;;
     "pkgconfig/gstreamer-bad-base.pc") CONFIG_FILES="$CONFIG_FILES pkgconfig/gstreamer-bad-base.pc" ;;
diff --git a/configure.ac b/configure.ac
index c092874..5aa65e6 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3,7 +3,7 @@
 dnl initialize autoconf
 dnl when going to/from release please set the nano (fourth number) right !
 dnl releases only do Wall, git and prerelease does Werror too
-AC_INIT([GStreamer Bad Plug-ins],[1.6.2],[http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer],[gst-plugins-bad])
+AC_INIT([GStreamer Bad Plug-ins],[1.7.1],[http://bugzilla.gnome.org/enter_bug.cgi?product=GStreamer],[gst-plugins-bad])
 
 AG_GST_INIT
 
@@ -51,11 +51,11 @@
 dnl - interfaces added -> increment AGE
 dnl - interfaces removed -> AGE = 0
 dnl sets GST_LT_LDFLAGS
-AS_LIBTOOL(GST, 602, 0, 602)
+AS_LIBTOOL(GST, 701, 0, 701)
 
 dnl *** required versions of GStreamer stuff ***
-GST_REQ=1.6.2
-GSTPB_REQ=1.6.2
+GST_REQ=1.7.1
+GSTPB_REQ=1.7.1
 
 dnl *** autotools stuff ****
 
@@ -74,6 +74,7 @@
 dnl *** check for arguments to configure ***
 
 AG_GST_ARG_DISABLE_FATAL_WARNINGS
+AG_GST_ARG_ENABLE_EXTRA_CHECKS
 
 AG_GST_ARG_DEBUG
 AG_GST_ARG_PROFILING
@@ -190,7 +191,7 @@
 AC_CHECK_FUNC(gethostbyname,,[AC_CHECK_LIB(nsl,gethostbyname)])
 
 dnl GLib is required
-GLIB_REQ=2.32.0
+GLIB_REQ=2.40.0
 AG_GST_GLIB_CHECK([$GLIB_REQ])
 
 dnl checks for gstreamer
@@ -241,6 +242,22 @@
 fi
 AM_CONDITIONAL(HAVE_GTK, test "x$HAVE_GTK" = "xyes")
 
+dnl Check for -Bsymbolic-functions linker flag used to avoid
+dnl intra-library PLT jumps, if available.
+AC_ARG_ENABLE(Bsymbolic,
+              [AS_HELP_STRING([--disable-Bsymbolic],[avoid linking with -Bsymbolic])],,
+              [SAVED_LDFLAGS="${LDFLAGS}" SAVED_LIBS="${LIBS}"
+               AC_MSG_CHECKING([for -Bsymbolic-functions linker flag])
+               LDFLAGS=-Wl,-Bsymbolic-functions
+               LIBS=
+               AC_TRY_LINK([], [return 0],
+                           AC_MSG_RESULT(yes)
+                           enable_Bsymbolic=yes,
+                           AC_MSG_RESULT(no)
+                           enable_Bsymbolic=no)
+               LDFLAGS="${SAVED_LDFLAGS}" LIBS="${SAVED_LIBS}"])
+
+dnl *** set variables based on configure arguments ***
 
 dnl GTK is optional and used in examples
 HAVE_GTK3=NO
@@ -379,6 +396,17 @@
 AC_SUBST(GST_PLUGIN_LIBTOOLFLAGS)
 AM_CONDITIONAL(GST_PLUGIN_BUILD_STATIC, test "x$enable_static_plugins" = "xyes")
 
+AC_ARG_WITH([player-tests],
+  AS_HELP_STRING([--with-player-tests],[Enable GstPlayer tests that need network access (default: no)]))
+if test x$with_player_tests = xyes; then
+  AC_PATH_PROG([WGET], [wget], no)
+  if test x$WGET = xno; then
+    AC_MSG_WARN([wget required for GstPlayer tests but not found - disabling])
+    with_player_tests=no
+  fi
+fi
+AM_CONDITIONAL(WITH_GST_PLAYER_TESTS, test "x$with_player_tests" = "xyes")
+
 # set by AG_GST_PARSE_SUBSYSTEM_DISABLES above
 dnl make sure it doesn't complain about unused variables if debugging is disabled
 NO_WARNINGS=""
@@ -425,8 +453,8 @@
  apexsink dc1394 \
  gsettings \
  musepack nas sdl timidity \
- acm wininet \
- xvid lv2 teletextdec sndio libvisual"
+ wininet \
+ xvid lv2 sndio libvisual"
 AC_SUBST(GST_PLUGINS_NONPORTED)
 
 dnl these are all the gst plug-ins, compilable without additional libs
@@ -434,6 +462,7 @@
 AG_GST_CHECK_PLUGIN(adpcmdec)
 AG_GST_CHECK_PLUGIN(adpcmenc)
 AG_GST_CHECK_PLUGIN(aiff)
+AG_GST_CHECK_PLUGIN(videoframe_audiolevel)
 AG_GST_CHECK_PLUGIN(asfmux)
 AG_GST_CHECK_PLUGIN(audiofxbad)
 AG_GST_CHECK_PLUGIN(audiomixer)
@@ -466,7 +495,6 @@
 AG_GST_CHECK_PLUGIN(jp2kdecimator)
 AG_GST_CHECK_PLUGIN(jpegformat)
 AG_GST_CHECK_PLUGIN(librfb)
-AG_GST_CHECK_PLUGIN(liveadder)
 AG_GST_CHECK_PLUGIN(midi)
 AG_GST_CHECK_PLUGIN(mpegdemux)
 AG_GST_CHECK_PLUGIN(mpegtsdemux)
@@ -670,13 +698,22 @@
   ;;
   *)
     if test "x$NEED_GL" != "xno"; then
-      AG_GST_CHECK_LIBHEADER(GL, GL, glTexImage2D,, GL/gl.h)
+      AG_GST_PKG_CHECK_MODULES(GL, gl)
+      if test "x$HAVE_GL" != "xyes"; then
+        AG_GST_CHECK_LIBHEADER(GL, GL, glTexImage2D,, GL/gl.h)
+      fi
     fi
     if test "x$NEED_GLES2" != "xno"; then
-      AG_GST_CHECK_LIBHEADER(GLES2, GLESv2, glTexImage2D,, GLES2/gl2.h)
+      AG_GST_PKG_CHECK_MODULES(GLES2, glesv2)
+      if test "x$HAVE_GLES2" != "xyes"; then
+        AG_GST_CHECK_LIBHEADER(GLES2, GLESv2, glTexImage2D,, GLES2/gl2.h)
+      fi
     fi
     if test "x$NEED_EGL" != "xno"; then
-      AG_GST_CHECK_LIBHEADER(EGL, EGL, eglGetError,, EGL/egl.h)
+      AG_GST_PKG_CHECK_MODULES(EGL, egl)
+      if test "x$HAVE_EGL" != "xyes"; then
+        AG_GST_CHECK_LIBHEADER(EGL, EGL, eglGetError,, EGL/egl.h)
+      fi
     fi
 
     old_LIBS=$LIBS
@@ -803,9 +840,28 @@
   fi
 fi
 
+dnl check for DMABUF support
+HAVE_DRM_FOURCC_HEADER=no
+AC_CHECK_HEADER(libdrm/drm_fourcc.h,
+  HAVE_DRM_FOURCC_HEADER=yes, )
+
+HAVE_GST_ALLOCATORS=no
+PKG_CHECK_MODULES(GST_ALLOCATORS, gstreamer-allocators-1.0,
+  HAVE_GST_ALLOCATORS=yes, )
+
+if test "x$HAVE_DRM_FOURCC_HEADER" = "xyes" -a \
+        "x$HAVE_GST_ALLOCATORS" = "xyes" -a \
+        "x$HAVE_EGL" = "xyes"; then
+          AC_DEFINE(GST_GL_HAVE_DMABUF, [1] , [DMABUF available for gl plugins])
+fi
+
 dnl check if we can include both GL and GLES2 at the same time
 if test "x$HAVE_GL" = "xyes" -a "x$HAVE_GLES2" = "xyes"; then
   GL_INCLUDES="
+#ifdef __GNUC__
+#  pragma GCC diagnostic push
+#  pragma GCC diagnostic ignored \"-Wredundant-decls\"
+#endif
 #ifndef GL_GLEXT_PROTOTYPES
 #define GL_GLEXT_PROTOTYPES 1
 #endif
@@ -829,11 +885,12 @@
 #   include <GL/glext.h>
 #  endif
 # endif
+int main (int argc, char **argv) { return 0; }
 "
   AC_MSG_CHECKING([whether it is possible to include both GL and GLES2 headers])
-  save_CPPFLAGS="$CPPFLAGS"
-  CPPFLAGS="$CPPFLAGS $ERROR_CFLAGS"
-  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[$GL_INCLUDES]], [[
+  save_CFLAGS="$CFLAGS"
+  CFLAGS="$CFLAGS $GL_CFLAGS $GLES2_CFLAGS $WARNING_CFLAGS $ERROR_CFLAGS"
+  AC_COMPILE_IFELSE([AC_LANG_SOURCE([[$GL_INCLUDES]], [[
     #if !defined(GL_FALSE)
     #error Failed to include GL headers
     #endif
@@ -851,7 +908,7 @@
       HAVE_GLES2=no
     fi
   ])
-  CPPFLAGS="$save_CPPFLAGS"
+  CFLAGS="$save_CFLAGS"
 fi
 
 #dnl Check for OpenGL
@@ -1727,6 +1784,108 @@
 AC_SUBST(LIBUSB_CFLAGS)
 AC_SUBST(LIBUSB_LIBS)
 
+dnl *** NVENC ***
+translit(dnm, m, l) AM_CONDITIONAL(USE_NVENC, true)
+AG_GST_CHECK_FEATURE(NVENC, [NVIDIA Encode API], nvenc, [
+  AG_GST_PKG_CHECK_MODULES(GST_VIDEO, gstreamer-video-1.0)
+  AG_GST_PKG_CHECK_MODULES(GST_PBUTILS, gstreamer-pbutils-1.0)
+  AC_ARG_WITH([cuda-prefix],
+          AS_HELP_STRING([--with-cuda-prefix],
+          [Use the provided prefix for detecting the cuda installation]),
+          [AS_IF([test "x$with_cuda_prefix" != "x"],
+                 [CUDA_PREFIX="$with_cuda_prefix"])],
+          [CUDA_PREFIX=""])
+
+  HAVE_CUDA="yes"
+  if test "x$CUDA_PREFIX" != "x"; then
+    dnl only override if not already set
+    if test "x$CUDA_CFLAGS" = "x" -a "x$CUDA_LIBS" = "x"; then
+      dnl this is an educated guess, user can always override these
+      CUDA_CFLAGS="-I$CUDA_PREFIX/include"
+      CUDA_LIBS="-L$CUDA_PREFIX/lib -L$CUDA_PREFIX/lib64 -L$CUDA_PREFIX/lib/stubs -L$CUDA_PREFIX/lib64/stubs -lcuda -lcudart"
+    fi
+  else
+    PKG_CHECK_MODULES([CUDA], [cuda-7.5 cudart-7.5],, [
+      PKG_CHECK_MODULES([CUDA], [cuda-7.0 cudart-7.0],, [
+        PKG_CHECK_MODULES([CUDA], [cuda-6.5 cudart-6.5],, [
+          AC_MSG_WARN([Could not find cuda headers/libraries])])])])
+  fi
+
+  HAVE_CUDA_H=no
+  HAVE_CUDART_H=no
+  save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$CUDA_CFLAGS $save_CPPFLAGS "
+  AC_CHECK_HEADER([cuda.h], [HAVE_CUDA_H=yes],
+      AC_MSG_WARN([Could not find cuda.h]))
+  AC_CHECK_HEADER([cuda_runtime_api.h], [HAVE_CUDART_H=yes],
+      AC_MSG_WARN([Could not find cuda_runtime_api.h]))
+  CPPFLAGS=$save_CPPFLAGS
+
+  dnl libcuda and libcudart libraries
+  save_LIBS="$LIBS"
+  LIBS="$CUDA_LIBS $save_LIBS"
+  HAVE_CUDART_LIB="no"
+  AC_CHECK_LIB(cudart,cudaGetErrorString,[HAVE_CUDART_LIB="yes"], [
+      AC_MSG_WARN([Could not find cudart library])])
+  HAVE_CUDA_LIB="no"
+  AC_CHECK_LIB(cuda,cuInit,[HAVE_CUDA_LIB="yes"], [
+      AC_MSG_WARN([Could not find cuda library])])
+  LIBS="$save_LIBS"
+
+  dnl nvEncodeAPI.h header
+  HAVE_NVENCODEAPI_H=no
+  AC_ARG_VAR(NVENCODE_CFLAGS, [C compiler flags for NvEncodeAPI.h])
+  save_CPPFLAGS="$CPPFLAGS"
+  CPPFLAGS="$NVENCODE_CFLAGS $save_CPPFLAGS"
+  AC_CHECK_HEADER([nvEncodeAPI.h], [
+      AC_PREPROC_IFELSE([AC_LANG_SOURCE([[#include <nvEncodeAPI.h>
+          #if NVENCAPI_MAJOR_VERSION < 5
+          #error "Need nvEncodeAPI.h >= 5.0"
+          #endif
+          ]])], [
+          HAVE_NVENCODEAPI_H=yes
+          ], [
+          AC_MSG_WARN([nvEncodeAPI.h must be >= 5.0])
+          ])
+      ],
+      AC_MSG_WARN([Could not find nvEncodeAPI.h]))
+  AC_SUBST(NVENCODE_CFLAGS)
+  CPPFLAGS="$save_CPPFLAGS"
+
+  dnl libnvnidia-encode library
+  HAVE_NVENCODE_LIB=no
+  AC_ARG_VAR(NVENCODE_LIBS, [linker flags for nvidia-encode])
+  saved_LIBS="$LIBS"
+  LIBS="$NVENCODE_LIBS $saved_LIBS"
+  AC_CHECK_LIB(nvidia-encode, NvEncodeAPICreateInstance, [HAVE_NVENCODE_LIB="yes"],
+      AC_MSG_WARN([Could not find library nvidia-encode]))
+  NVENCODE_LIBS="$NVENCODE_LIBS -lnvidia-encode"
+  AC_SUBST(NVENCODE_LIBS)
+  LIBS="$saved_LIBS"
+
+  USE_NVENC_GST_GL=no
+  if test "x$HAVE_CUDA_H" = "xyes" \
+      -a "x$HAVE_CUDART_H" = "xyes" \
+      -a "x$HAVE_CUDA_LIB" = "xyes" \
+      -a "x$HAVE_CUDART_LIB" = "xyes" \
+      -a "x$HAVE_NVENCODEAPI_H" = "xyes" \
+      -a "x$HAVE_NVENCODE_LIB" = "xyes"; then
+    HAVE_NVENC="yes"
+    if test x"$USE_OPENGL" = x"yes"; then
+      dnl cuda-gl interop header
+      save_CPPFLAGS="$CPPFLAGS"
+      CPPFLAGS="$save_CPPFLAGS $CUDA_CFLAGS"
+      AC_CHECK_HEADER([cuda_gl_interop.h], [
+        USE_NVENC_GST_GL="yes"
+        AC_DEFINE(HAVE_NVENC_GST_GL, [1] , [NVENC GStreamer OpenGL support available])
+        ])
+      CPPFLAGS="$save_CPPFLAGS"
+    fi
+  else
+    HAVE_NVENC="no"
+  fi
+])
+AM_CONDITIONAL(USE_NVENC_GST_GL, test "x$USE_NVENC_GST_GL" = "xyes")
 
 dnl *** ext plug-ins ***
 dnl keep this list sorted alphabetically !
@@ -1736,7 +1895,7 @@
 dnl *** assrender ***
 translit(dnm, m, l) AM_CONDITIONAL(USE_ASSRENDER, true)
 AG_GST_CHECK_FEATURE(ASSRENDER, [ASS/SSA renderer], assrender, [
-  PKG_CHECK_MODULES(ASSRENDER, libass >= 0.9.4, [
+  PKG_CHECK_MODULES(ASSRENDER, libass >= 0.10.2, [
     HAVE_ASSRENDER="yes" ], [
     HAVE_ASSRENDER="no"
   ])
@@ -2652,7 +2811,7 @@
 dnl *** Qt ***
 translit(dnm, m, l) AM_CONDITIONAL(USE_QT, true)
 AG_GST_CHECK_FEATURE(QT, [Qt elements], qt, [
-  PKG_CHECK_MODULES(QT, Qt5Core Qt5Gui Qt5Quick >= 5.4.0, [
+  PKG_CHECK_MODULES(QT, Qt5Core Qt5Gui Qt5Qml Qt5Quick >= 5.4.0, [
       QT_PATH=`$PKG_CONFIG --variable=exec_prefix Qt5Core`
       QT_HOST_PATH=`$PKG_CONFIG --variable=host_bins Qt5Core`
       AC_PATH_PROGS(MOC, [moc-qt5 moc], moc, ["${QT_HOST_PATH}" "${QT_PATH}/bin"])
@@ -2681,6 +2840,44 @@
             HAVE_QT_WINDOWING="yes"
           ], [AC_MSG_NOTICE([Could not find Qt Wayland integration])])
         fi
+        if test "x$GST_GL_HAVE_WINDOW_ANDROID" = "x1" -a "x$GST_GL_HAVE_PLATFORM_EGL" = "x1"; then
+          PKG_CHECK_MODULES(QT_ANDROID, Qt5AndroidExtras, [
+            # c++ on android requires a standard library and there are multiple
+            # choices.  cerbero provides a pkg-config file the describes a choice
+            # so try to use that.  Outside cerbero one has to pass these flags
+            # manually for the library one is using
+            PKG_CHECK_MODULES(GNUSTL, gnustl, [
+              QT_CFLAGS="$QT_CFLAGS $GNUSTL_CFLAGS"
+              QT_LIBS="$QT_CFLAGS $GNUSTL_LIBS"
+              ], [
+              AC_MSG_NOTICE([Could not find Standard C++ library])])
+
+            AC_DEFINE([HAVE_QT_ANDROID], [],
+                [Define if Qt Android integration is installed])
+            QT_CFLAGS="$QT_CFLAGS $QT_ANDROID_CFLAGS"
+            QT_LIBS="$QT_LIBS $QT_ANDROID_LIBS"
+            HAVE_QT_WINDOWING="yes"
+          ], [AC_MSG_NOTICE([Could not find Qt Android integration])])
+        fi
+        if test "x$GST_GL_HAVE_WINDOW_COCOA" = "x1" -a "x$GST_GL_HAVE_PLATFORM_CGL" = "x1"; then
+          PKG_CHECK_MODULES(QT_MAC, Qt5MacExtras, [
+            AC_DEFINE([HAVE_QT_MAC], [],
+                [Define if Qt Mac integration is installed])
+            QT_LIBDIR=`$PKG_CONFIG --variable=libdir Qt5Core`
+            QT_CFLAGS="$QT_CFLAGS $QT_MAC_CFLAGS -F$QT_LIBDIR -framework QtCore -framework QtGui -framework QtQuick -framework QtQml -framework QtMacExtras"
+            QT_LIBS="$QT_LIBS $QT_MAC_LIBS"
+            HAVE_QT_WINDOWING="yes"
+          ], [AC_MSG_NOTICE([Could not find Qt Mac integration])])
+        fi
+        if test "x$GST_GL_HAVE_WINDOW_EAGL" = "x1" -a "x$GST_GL_HAVE_PLATFORM_EAGL" = "x1"; then
+          if test "x$HAVE_IOS" = "xyes"; then
+            # iOS doesn't have its own extras package so if we have the core
+            # modules we are good to go
+            AC_DEFINE([HAVE_QT_IOS], [],
+                [Define if Qt iOS integration is installed])
+            HAVE_QT_WINDOWING="yes"
+          fi
+        fi
         if test "x$HAVE_QT_WINDOWING" = "xno"; then
           AC_MSG_WARN([Could not find any Qt Windowing integration])
           HAVE_QT="no"
@@ -3036,28 +3233,62 @@
   fi
 ])
 
+dnl *** hls-crypto ***
+AC_ARG_WITH([hls-crypto],
+  AS_HELP_STRING([--with-hls-crypto=auto|nettle|libgcrypt|openssl], [
+    which cryptographic library version to compile against for hls (default: auto)
+  ]), [
+    AS_CASE([$with_hls_crypto],
+      [nettle],[],
+      [libgcrypt],[],
+      [openssl],[],
+      [with_hls_crypto=auto]
+    )
+  ]
+)
+
 dnl *** hls ***
 translit(dnm, m, l) AM_CONDITIONAL(USE_HLS, true)
 AG_GST_CHECK_FEATURE(HLS, [http live streaming plugin], hls, [
-  PKG_CHECK_MODULES(NETTLE, nettle,
-  [
-    AC_DEFINE(HAVE_NETTLE, 1, [Define if nettle is available])
-    HAVE_HLS="yes"
-  ], [
-    AM_PATH_LIBGCRYPT([1.2.0],
-    [
-      AC_DEFINE(HAVE_LIBGCRYPT, 1, [Define if libgcrypt is available])
-      HAVE_HLS="yes"
-    ], [
-      PKG_CHECK_MODULES(OPENSSL, openssl,
-      [
+  AS_CASE([$with_hls_crypto],
+    [nettle], [
+      PKG_CHECK_MODULES(NETTLE, nettle, [
+        AC_DEFINE(HAVE_NETTLE, 1, [Define if nettle is available])
+        HAVE_HLS="yes"
+      ],[AC_MSG_ERROR([Could not find nettle library])])
+    ],
+    [libgcrypt], [
+      AM_PATH_LIBGCRYPT([1.2.0], [
+        AC_DEFINE(HAVE_LIBGCRYPT, 1, [Define if libgcrypt is available])
+        HAVE_HLS="yes"
+      ],[AC_MSG_ERROR([Could not find libgcrypt library])])
+    ],
+    [openssl], [
+      PKG_CHECK_MODULES(OPENSSL, openssl, [
         AC_DEFINE(HAVE_OPENSSL, 1, [Define if openssl is available])
         HAVE_HLS="yes"
-      ], [
-        HAVE_HLS="no"
+      ],[AC_MSG_ERROR([Could not find openssl library])])
+    ],
+    [
+      dnl Try to find a valid crypto library
+      PKG_CHECK_MODULES(NETTLE, nettle, [
+        AC_DEFINE(HAVE_NETTLE, 1, [Define if nettle is available])
+        HAVE_HLS="yes"
+      ],[
+        AM_PATH_LIBGCRYPT([1.2.0], [
+          AC_DEFINE(HAVE_LIBGCRYPT, 1, [Define if libgcrypt is available])
+          HAVE_HLS="yes"
+        ],[
+          PKG_CHECK_MODULES(OPENSSL, openssl, [
+            AC_DEFINE(HAVE_OPENSSL, 1, [Define if openssl is available])
+            HAVE_HLS="yes"
+          ],[
+            HAVE_HLS="no"
+          ])
+        ])
       ])
-    ])
-  ])
+    ]
+  )
 ])
 
 dnl *** x265 (H.265/HEVC encoder) ***
@@ -3211,6 +3442,9 @@
 dnl LDFLAGS really should only contain flags, not libs - they get added before
 dnl whatevertarget_LIBS and -L flags here affect the rest of the linking
 GST_ALL_LDFLAGS="-no-undefined"
+if test "x${enable_Bsymbolic}" = "xyes"; then
+  GST_ALL_LDFLAGS="$GST_ALL_LDFLAGS -Wl,-Bsymbolic-functions"
+fi
 AC_SUBST(GST_ALL_LDFLAGS)
 
 dnl GST_LIB_LDFLAGS
@@ -3241,6 +3475,7 @@
 gst/adpcmdec/Makefile
 gst/adpcmenc/Makefile
 gst/aiff/Makefile
+gst/videoframe_audiolevel/Makefile
 gst/asfmux/Makefile
 gst/audiofxbad/Makefile
 gst/audiomixer/Makefile
@@ -3272,7 +3507,6 @@
 gst/jp2kdecimator/Makefile
 gst/jpegformat/Makefile
 gst/librfb/Makefile
-gst/liveadder/Makefile
 gst/midi/Makefile
 gst/mpegdemux/Makefile
 gst/mpegtsdemux/Makefile
@@ -3327,6 +3561,7 @@
 gst-libs/gst/uridownloader/Makefile
 gst-libs/gst/wayland/Makefile
 gst-libs/gst/base/Makefile
+gst-libs/gst/player/Makefile
 gst-libs/gst/video/Makefile
 sys/Makefile
 sys/dshowdecwrapper/Makefile
@@ -3345,6 +3580,7 @@
 sys/dvb/Makefile
 sys/fbdev/Makefile
 sys/linsys/Makefile
+sys/nvenc/Makefile
 sys/opensles/Makefile
 sys/shm/Makefile
 sys/uvch264/Makefile
@@ -3385,6 +3621,7 @@
 tests/examples/mxf/Makefile
 tests/examples/opencv/Makefile
 tests/examples/uvch264/Makefile
+tests/examples/waylandsink/Makefile
 tests/icles/Makefile
 ext/voamrwbenc/Makefile
 ext/voaacenc/Makefile
@@ -3471,6 +3708,8 @@
 pkgconfig/gstreamer-gl-uninstalled.pc
 pkgconfig/gstreamer-mpegts.pc
 pkgconfig/gstreamer-mpegts-uninstalled.pc
+pkgconfig/gstreamer-player.pc
+pkgconfig/gstreamer-player-uninstalled.pc
 pkgconfig/gstreamer-wayland.pc
 pkgconfig/gstreamer-wayland-uninstalled.pc
 pkgconfig/gstreamer-bad-base.pc
diff --git a/docs/Makefile.in b/docs/Makefile.in
index ad6b0f7..0c53151 100644
--- a/docs/Makefile.in
+++ b/docs/Makefile.in
@@ -247,6 +247,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -284,6 +286,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -311,6 +315,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -329,6 +335,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -339,6 +347,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -364,6 +374,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -389,6 +401,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -520,6 +534,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -577,8 +593,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -648,6 +668,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/docs/libs/Makefile.am b/docs/libs/Makefile.am
index f360db9..744e1c2 100644
--- a/docs/libs/Makefile.am
+++ b/docs/libs/Makefile.am
@@ -36,7 +36,11 @@
 CFILE_GLOB=$(top_srcdir)/gst-libs/gst/*/*.c
 
 # Header files to ignore when scanning.
-IGNORE_HFILES = $(top_srcdir)/gst-libs/gst/mpegts/gstmpegts-private.h
+IGNORE_HFILES = \
+	$(top_srcdir)/gst-libs/gst/mpegts/gstmpegts-private.h \
+	$(top_srcdir)/gst-libs/gst/player/gstplayer-signal-dispatcher-private.h \
+	$(top_srcdir)/gst-libs/gst/player/gstplayer-video-renderer-private.h \
+	$(top_srcdir)/gst-libs/gst/player/gstplayer-media-info-private.h
 
 # Images to copy into HTML directory.
 HTML_IMAGES =
@@ -55,6 +59,7 @@
 	$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
 	$(top_builddir)/gst-libs/gst/insertbin/libgstinsertbin-@GST_API_VERSION@.la \
 	$(top_builddir)/gst-libs/gst/mpegts/libgstmpegts-@GST_API_VERSION@.la \
+	$(top_builddir)/gst-libs/gst/player/libgstplayer-@GST_API_VERSION@.la \
   $(GST_BASE_LIBS)
 
 # If you need to override some of the declarations, place them in this file
diff --git a/docs/libs/Makefile.in b/docs/libs/Makefile.in
index d352115..ae32eb4 100644
--- a/docs/libs/Makefile.in
+++ b/docs/libs/Makefile.in
@@ -209,6 +209,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -246,6 +248,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -273,6 +277,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -291,6 +297,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -301,6 +309,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -326,6 +336,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -351,6 +363,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -482,6 +496,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -539,8 +555,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -610,6 +630,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -737,7 +758,12 @@
 CFILE_GLOB = $(top_srcdir)/gst-libs/gst/*/*.c
 
 # Header files to ignore when scanning.
-IGNORE_HFILES = $(top_srcdir)/gst-libs/gst/mpegts/gstmpegts-private.h
+IGNORE_HFILES = \
+	$(top_srcdir)/gst-libs/gst/mpegts/gstmpegts-private.h \
+	$(top_srcdir)/gst-libs/gst/player/gstplayer-signal-dispatcher-private.h \
+	$(top_srcdir)/gst-libs/gst/player/gstplayer-video-renderer-private.h \
+	$(top_srcdir)/gst-libs/gst/player/gstplayer-media-info-private.h
+
 
 # Images to copy into HTML directory.
 HTML_IMAGES = 
@@ -756,6 +782,7 @@
 	$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
 	$(top_builddir)/gst-libs/gst/insertbin/libgstinsertbin-@GST_API_VERSION@.la \
 	$(top_builddir)/gst-libs/gst/mpegts/libgstmpegts-@GST_API_VERSION@.la \
+	$(top_builddir)/gst-libs/gst/player/libgstplayer-@GST_API_VERSION@.la \
   $(GST_BASE_LIBS)
 
 
diff --git a/docs/libs/gst-plugins-bad-libs-docs.sgml b/docs/libs/gst-plugins-bad-libs-docs.sgml
index 76651b7..0159175 100644
--- a/docs/libs/gst-plugins-bad-libs-docs.sgml
+++ b/docs/libs/gst-plugins-bad-libs-docs.sgml
@@ -82,7 +82,6 @@
       <xi:include href="xml/gstglcontextglx.xml"/>
       <xi:include href="xml/gstglcontextwgl.xml"/>
       <xi:include href="xml/gstgldisplay.xml"/>
-      <xi:include href="xml/gstgldownload.xml"/>
       <xi:include href="xml/gsteglimagememory.xml"/>
       <xi:include href="xml/gstglbasefilter.xml"/>
       <xi:include href="xml/gstglfilter.xml"/>
@@ -91,7 +90,6 @@
       <xi:include href="xml/gstglshader.xml"/>
       <xi:include href="xml/gstglsyncmeta.xml"/>
       <xi:include href="xml/gstglupload.xml"/>
-      <xi:include href="xml/gstgluploadmeta.xml"/>
       <xi:include href="xml/gstglutils.xml"/>
       <xi:include href="xml/gstglwindow.xml"/>
       <xi:include href="xml/gstglwindowandroid.xml"/>
@@ -102,6 +100,15 @@
       <xi:include href="xml/gstglwindowx11.xml"/>
     </chapter>
 
+    <chapter id="player">
+      <title>Player Library</title>
+      <xi:include href="xml/gstplayer.xml"/>
+      <xi:include href="xml/gstplayer-mediainfo.xml"/>
+      <xi:include href="xml/gstplayer-gmaincontextsignaldispatcher.xml"/>
+      <xi:include href="xml/gstplayer-videooverlayvideorenderer.xml"/>
+      <xi:include href="xml/gstplayer-visualization.xml"/>
+    </chapter>
+
     <chapter>
       <title>Interfaces</title>
       <xi:include href="xml/gstphotography.xml" />
diff --git a/docs/libs/gst-plugins-bad-libs-sections.txt b/docs/libs/gst-plugins-bad-libs-sections.txt
index 3b7cc05..84c435e 100644
--- a/docs/libs/gst-plugins-bad-libs-sections.txt
+++ b/docs/libs/gst-plugins-bad-libs-sections.txt
@@ -854,11 +854,11 @@
 gst_gl_context_get_current
 <SUBSECTION Standard>
 GST_GL_CONTEXT
-GST_GL_IS_CONTEXT
+GST_IS_GL_CONTEXT
 GST_GL_TYPE_CONTEXT
 GST_GL_CONTEXT_CLASS
 GST_GL_CONTEXT_GET_CLASS
-GST_GL_IS_CONTEXT_CLASS
+GST_IS_GL_CONTEXT_CLASS
 GST_GL_CONTEXT_CAST
 GstGLContextPrivate
 gst_gl_context_get_type
@@ -873,11 +873,11 @@
 gst_gl_context_cocoa_get_pixel_format
 <SUBSECTION Standard>
 GST_GL_CONTEXT_COCOA
-GST_GL_IS_CONTEXT_COCOA
+GST_IS_GL_CONTEXT_COCOA
 GST_GL_TYPE_CONTEXT_COCOA
 GST_GL_CONTEXT_COCOA_CLASS
 GST_GL_CONTEXT_COCOA_GET_CLASS
-GST_GL_IS_CONTEXT_COCOA_CLASS
+GST_IS_GL_CONTEXT_COCOA_CLASS
 GST_GL_CONTEXT_COCOA_CAST
 GstGLContextCocoaPrivate
 gst_gl_context_cocoa_get_type
@@ -894,11 +894,11 @@
 gst_gl_context_egl_get_proc_address
 <SUBSECTION Standard>
 GST_GL_CONTEXT_EGL
-GST_GL_IS_CONTEXT_EGL
+GST_IS_GL_CONTEXT_EGL
 GST_GL_TYPE_CONTEXT_EGL
 GST_GL_CONTEXT_EGL_CLASS
 GST_GL_CONTEXT_EGL_GET_CLASS
-GST_GL_IS_CONTEXT_EGL_CLASS
+GST_IS_GL_CONTEXT_EGL_CLASS
 GST_GL_CONTEXT_EGL_CAST
 GstGLContextEGLPrivate
 gst_gl_context_egl_get_type
@@ -913,11 +913,11 @@
 gst_gl_context_glx_get_proc_address
 <SUBSECTION Standard>
 GST_GL_CONTEXT_GLX
-GST_GL_IS_CONTEXT_GLX
+GST_IS_GL_CONTEXT_GLX
 GST_GL_TYPE_CONTEXT_GLX
 GST_GL_CONTEXT_GLX_CLASS
 GST_GL_CONTEXT_GLX_GET_CLASS
-GST_GL_IS_CONTEXT_GLX_CLASS
+GST_IS_GL_CONTEXT_GLX_CLASS
 GST_GL_CONTEXT_GLX_CAST
 GstGLContextGLXPrivate
 gst_gl_context_glx_get_type
@@ -932,11 +932,11 @@
 gst_gl_context_wgl_get_proc_address
 <SUBSECTION Standard>
 GST_GL_CONTEXT_WGL
-GST_GL_IS_CONTEXT_WGL
+GST_IS_GL_CONTEXT_WGL
 GST_GL_TYPE_CONTEXT_WGL
 GST_GL_CONTEXT_WGL_CLASS
 GST_GL_CONTEXT_WGL_GET_CLASS
-GST_GL_IS_CONTEXT_WGL_CLASS
+GST_IS_GL_CONTEXT_WGL_CLASS
 GST_GL_CONTEXT_WGL_CAST
 GstGLContextWGLPrivate
 gst_gl_context_wgl_get_type
@@ -950,11 +950,11 @@
 gst_gl_context_eagl_get_current_context
 <SUBSECTION Standard>
 GST_GL_CONTEXT_EAGL
-GST_GL_IS_CONTEXT_EAGL
+GST_IS_GL_CONTEXT_EAGL
 GST_GL_TYPE_CONTEXT_EAGL
 GST_GL_CONTEXT_EAGL_CLASS
 GST_GL_CONTEXT_EAGL_GET_CLASS
-GST_GL_IS_CONTEXT_EAGL_CLASS
+GST_IS_GL_CONTEXT_EAGL_CLASS
 GST_GL_CONTEXT_EAGL_CAST
 GstGLContextEaglPrivate
 
@@ -992,26 +992,6 @@
 </SECTION>
 
 <SECTION>
-<FILE>gstgldownload</FILE>
-<TITLE>GstGLDownload</TITLE>
-GstGLDownload
-gst_gl_download_new
-gst_gl_download_set_format
-gst_gl_download_transform_caps
-gst_gl_download_perform_with_data
-<SUBSECTION Standard>
-GST_GL_DOWNLOAD
-GST_GL_DOWNLOAD_CAST
-GST_GL_DOWNLOAD_CLASS
-GST_GL_DOWNLOAD_GET_CLASS
-gst_gl_download_get_type
-GST_IS_GL_DOWNLOAD
-GST_IS_GL_DOWNLOAD_CLASS
-GST_TYPE_GL_DOWNLOAD
-GstGLDownloadPrivate
-</SECTION>
-
-<SECTION>
 <FILE>gstglbasefilter</FILE>
 <TITLE>GstGLBaseFilter</TITLE>
 GstGLBaseFilter
@@ -1165,11 +1145,11 @@
 <SUBSECTION Standard>
 GstGLShaderPrivate
 GST_GL_SHADER
-GST_GL_IS_SHADER
+GST_IS_GL_SHADER
 GST_GL_TYPE_SHADER
 gst_gl_shader_get_type
 GST_GL_SHADER_CLASS
-GST_GL_IS_SHADER_CLASS
+GST_IS_GL_SHADER_CLASS
 GST_GL_SHADER_GET_CLASS
 </SECTION>
 
@@ -1199,7 +1179,6 @@
 gst_gl_upload_propose_allocation
 gst_gl_upload_transform_caps
 gst_gl_upload_perform_with_buffer
-gst_gl_upload_release_buffer
 <SUBSECTION Standard>
 GST_GL_UPLOAD
 GST_GL_UPLOAD_CAST
@@ -1213,26 +1192,6 @@
 </SECTION>
 
 <SECTION>
-<FILE>gstgluploadmeta</FILE>
-<TITLE>GstGLUploadMeta</TITLE>
-GstGLUploadMeta
-gst_gl_upload_meta_new
-gst_gl_upload_meta_set_format
-gst_gl_upload_meta_get_format
-gst_gl_upload_meta_add_to_buffer
-<SUBSECTION Standard>
-GST_GL_UPLOAD_META
-GST_GL_UPLOAD_META_CAST
-GST_GL_UPLOAD_META_CLASS
-GST_GL_UPLOAD_META_GET_CLASS
-gst_gl_upload_meta_get_type
-GST_IS_GL_UPLOAD_META
-GST_IS_GL_UPLOAD_META_CLASS
-GST_TYPE_GL_UPLOAD_META
-GstGLUploadMetaPrivate
-</SECTION>
-
-<SECTION>
 <FILE>gstglutils</FILE>
 <TITLE>Utilities</TITLE>
 GLCB
@@ -1274,7 +1233,6 @@
 GstGLWindowClass
 gst_gl_window_new
 gst_gl_window_draw
-gst_gl_window_draw_unlocked
 gst_gl_window_is_running
 gst_gl_window_quit
 gst_gl_window_run
@@ -1292,8 +1250,8 @@
 gst_gl_window_get_surface_dimensions
 gst_gl_window_handle_events
 <SUBSECTION Standard>
-GST_GL_IS_WINDOW
-GST_GL_IS_WINDOW_CLASS
+GST_IS_GL_WINDOW
+GST_IS_GL_WINDOW_CLASS
 GST_GL_TYPE_WINDOW
 GST_GL_WINDOW
 GST_GL_WINDOW_CLASS
@@ -1314,8 +1272,8 @@
 GstGLWindowAndroidEGLClass
 gst_gl_window_android_egl_new
 <SUBSECTION Standard>
-GST_GL_IS_WINDOW_ANDROID_EGL
-GST_GL_IS_WINDOW_ANDROID_EGL_CLASS
+GST_IS_GL_WINDOW_ANDROID_EGL
+GST_IS_GL_WINDOW_ANDROID_EGL_CLASS
 GST_GL_TYPE_WINDOW_ANDROID_EGL
 GST_GL_WINDOW_ANDROID_EGL
 GST_GL_WINDOW_ANDROID_EGL_CLASS
@@ -1331,8 +1289,8 @@
 gst_gl_window_cocoa_new
 gst_gl_window_cocoa_create_window
 <SUBSECTION Standard>
-GST_GL_IS_WINDOW_COCOA
-GST_GL_IS_WINDOW_COCOA_CLASS
+GST_IS_GL_WINDOW_COCOA
+GST_IS_GL_WINDOW_COCOA_CLASS
 GST_GL_TYPE_WINDOW_COCOA
 GST_GL_WINDOW_COCOA
 GST_GL_WINDOW_COCOA_CLASS
@@ -1348,8 +1306,8 @@
 GstGLWindowDispmanxEGLClass
 gst_gl_window_dispmanx_egl_new
 <SUBSECTION Standard>
-GST_GL_IS_WINDOW_DISPMANX_EGL
-GST_GL_IS_WINDOW_DISPMANX_EGL_CLASS
+GST_IS_GL_WINDOW_DISPMANX_EGL
+GST_IS_GL_WINDOW_DISPMANX_EGL_CLASS
 GST_GL_TYPE_WINDOW_DISPMANX_EGL
 GST_GL_WINDOW_DISPMANX_EGL
 GST_GL_WINDOW_DISPMANX_EGL_CLASS
@@ -1364,8 +1322,8 @@
 GstGLWindowWaylandEGLClass
 gst_gl_window_wayland_egl_new
 <SUBSECTION Standard>
-GST_GL_IS_WINDOW_WAYLAND_EGL
-GST_GL_IS_WINDOW_WAYLAND_EGL_CLASS
+GST_IS_GL_WINDOW_WAYLAND_EGL
+GST_IS_GL_WINDOW_WAYLAND_EGL_CLASS
 GST_GL_TYPE_WINDOW_WAYLAND_EGL
 GST_GL_WINDOW_WAYLAND_EGL
 GST_GL_WINDOW_WAYLAND_EGL_CLASS
@@ -1382,8 +1340,8 @@
 gst_gl_window_win32_new
 gst_gl_window_win32_create_window
 <SUBSECTION Standard>
-GST_GL_IS_WINDOW_WIN32
-GST_GL_IS_WINDOW_WIN32_CLASS
+GST_IS_GL_WINDOW_WIN32
+GST_IS_GL_WINDOW_WIN32_CLASS
 GST_GL_TYPE_WINDOW_WIN32
 GST_GL_WINDOW_WIN32
 GST_GL_WINDOW_WIN32_CLASS
@@ -1402,8 +1360,8 @@
 gst_gl_window_x11_trap_x_errors
 gst_gl_window_x11_untrap_x_errors
 <SUBSECTION Standard>
-GST_GL_IS_WINDOW_X11
-GST_GL_IS_WINDOW_X11_CLASS
+GST_IS_GL_WINDOW_X11
+GST_IS_GL_WINDOW_X11_CLASS
 GST_GL_TYPE_WINDOW_X11
 GST_GL_WINDOW_X11
 GST_GL_WINDOW_X11_CLASS
@@ -1481,3 +1439,245 @@
 GST_VIDEO_AGGREGATOR_PAD_GET_CLASS
 gst_videoaggregator_pad_get_type
 </SECTION>
+
+<SECTION>
+<FILE>gstplayer</FILE>
+GstPlayer
+
+gst_player_new
+gst_player_new_full
+
+gst_player_play
+gst_player_pause
+gst_player_stop
+
+gst_player_seek
+
+gst_player_set_uri
+gst_player_get_uri
+
+gst_player_get_duration
+gst_player_get_position
+
+gst_player_set_volume
+gst_player_set_mute
+gst_player_get_volume
+gst_player_get_mute
+
+gst_player_get_pipeline
+
+gst_player_set_position_update_interval
+gst_player_get_position_update_interval
+
+GstPlayerState
+gst_player_state_get_name
+
+GST_PLAYER_ERROR
+GstPlayerError
+gst_player_error_get_name
+
+gst_player_get_media_info
+gst_player_get_audio_streams
+gst_player_get_video_streams
+gst_player_get_subtitle_streams
+
+gst_player_set_audio_track
+gst_player_set_video_track
+gst_player_set_subtitle_track
+
+gst_player_get_current_audio_track
+gst_player_get_current_video_track
+gst_player_get_current_subtitle_track
+
+gst_player_set_audio_track_enabled
+gst_player_set_video_track_enabled
+gst_player_set_subtitle_track_enabled
+
+gst_player_set_subtitle_uri
+gst_player_get_subtitle_uri
+
+gst_player_set_visualization
+gst_player_set_visualization_enabled
+gst_player_get_current_visualization
+
+GstPlayerColorBalanceType
+gst_player_color_balance_type_get_name
+
+gst_player_has_color_balance
+gst_player_set_color_balance
+gst_player_get_color_balance
+
+gst_player_get_rate
+gst_player_set_rate
+
+GstPlayerSignalDispatcher
+GstPlayerSignalDispatcherInterface
+
+GstPlayerVideoRenderer
+GstPlayerVideoRendererInterface
+
+<SUBSECTION Standard>
+GST_IS_PLAYER
+GST_IS_PLAYER_CLASS
+GST_PLAYER
+GST_PLAYER_CAST
+GST_PLAYER_CLASS
+GST_PLAYER_GET_CLASS
+GST_TYPE_PLAYER
+GstPlayerClass
+gst_player_get_type
+
+gst_player_visualization_get_type
+
+GST_TYPE_PLAYER_ERROR
+gst_player_error_quark
+gst_player_error_get_type
+
+GST_TYPE_PLAYER_STATE
+gst_player_state_get_type
+
+GST_TYPE_PLAYER_COLOR_BALANCE_TYPE
+gst_player_color_balance_type_get_type
+
+GST_TYPE_PLAYER_SIGNAL_DISPATCHER
+GST_PLAYER_SIGNAL_DISPATCHER
+GST_IS_PLAYER_SIGNAL_DISPATCHER
+GST_PLAYER_SIGNAL_DISPATCHER_GET_INTERFACE
+gst_player_signal_dispatcher_get_type
+
+GST_TYPE_PLAYER_VIDEO_RENDERER
+GST_IS_PLAYER_VIDEO_RENDERER
+GST_PLAYER_VIDEO_RENDERER
+GST_PLAYER_VIDEO_RENDERER_GET_INTERFACE
+gst_player_video_renderer_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstplayer-gmaincontextsignaldispatcher</FILE>
+gst_player_g_main_context_signal_dispatcher_new
+
+<SUBSECTION Standard>
+GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER
+GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_CAST
+GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_CLASS
+GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_GET_CLASS
+GST_IS_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER
+GST_IS_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_CLASS
+GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER
+
+gst_player_g_main_context_signal_dispatcher_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstplayer-videooverlayvideorenderer</FILE>
+GstPlayerVideoOverlayVideoRenderer
+
+gst_player_video_overlay_video_renderer_new
+gst_player_video_overlay_video_renderer_get_window_handle
+gst_player_video_overlay_video_renderer_set_window_handle
+
+<SUBSECTION Standard>
+GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER
+GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_CAST
+GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_CLASS
+GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_GET_CLASS
+GST_IS_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER
+GST_IS_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_CLASS
+GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER
+
+gst_player_video_overlay_video_renderer_get_type
+
+</SECTION>
+
+<SECTION>
+<FILE>gstplayer-visualization</FILE>
+GstPlayerVisualization
+gst_player_visualizations_get
+gst_player_visualizations_free
+gst_player_visualization_copy
+gst_player_visualization_free
+
+<SUBSECTION Standard>
+gst_player_visualization_get_type
+</SECTION>
+
+<SECTION>
+<FILE>gstplayer-mediainfo</FILE>
+GstPlayerMediaInfo
+
+GstPlayerStreamInfo
+GstPlayerAudioInfo
+GstPlayerVideoInfo
+GstPlayerSubtitleInfo
+
+gst_player_media_info_get_uri
+gst_player_media_info_get_duration
+gst_player_media_info_get_title
+gst_player_media_info_get_container_format
+gst_player_media_info_is_seekable
+gst_player_media_info_get_image_sample
+gst_player_media_info_get_tags
+gst_player_media_info_get_stream_list
+
+gst_player_stream_info_get_index
+gst_player_stream_info_get_caps
+gst_player_stream_info_get_tags
+gst_player_stream_info_get_codec
+gst_player_stream_info_get_stream_type
+
+gst_player_audio_info_get_bitrate
+gst_player_audio_info_get_channels
+gst_player_audio_info_get_language
+gst_player_audio_info_get_max_bitrate
+gst_player_audio_info_get_sample_rate
+
+gst_player_video_info_get_bitrate
+gst_player_video_info_get_height
+gst_player_video_info_get_width
+gst_player_video_info_get_framerate
+gst_player_video_info_get_max_bitrate
+gst_player_video_info_get_pixel_aspect_ratio
+
+gst_player_subtitle_info_get_language
+<SUBSECTION Standard>
+GST_PLAYER_MEDIA_INFO
+GST_IS_PLAYER_MEDIA_INFO
+GST_PLAYER_MEDIA_INFO_CLASS
+GST_IS_PLAYER_MEDIA_INFO_CLASS
+GST_TYPE_PLAYER_MEDIA_INFO
+GstPlayerMediaInfoClass
+gst_player_media_info_get_type
+
+GST_PLAYER_STREAM_INFO
+GST_IS_PLAYER_STREAM_INFO
+GST_PLAYER_STREAM_INFO_CLASS
+GST_IS_PLAYER_STREAM_INFO_CLASS
+GST_TYPE_PLAYER_STREAM_INFO
+GstPlayerStreamInfoClass
+gst_player_stream_info_get_type
+
+GST_PLAYER_AUDIO_INFO
+GST_IS_PLAYER_AUDIO_INFO
+GST_PLAYER_AUDIO_INFO_CLASS
+GST_IS_PLAYER_AUDIO_INFO_CLASS
+GST_TYPE_PLAYER_AUDIO_INFO
+GstPlayerAudioInfoClass
+gst_player_audio_info_get_type
+
+GST_PLAYER_VIDEO_INFO
+GST_IS_PLAYER_VIDEO_INFO
+GST_PLAYER_VIDEO_INFO_CLASS
+GST_IS_PLAYER_VIDEO_INFO_CLASS
+GST_TYPE_PLAYER_VIDEO_INFO
+GstPlayerVideoInfoClass
+gst_player_video_info_get_type
+
+GST_IS_PLAYER_SUBTITLE_INFO
+GST_PLAYER_SUBTITLE_INFO
+GST_PLAYER_SUBTITLE_INFO_CLASS
+GST_IS_PLAYER_SUBTITLE_INFO_CLASS
+GST_TYPE_PLAYER_SUBTITLE_INFO
+GstPlayerSubtitleInfoClass
+gst_player_subtitle_info_get_type
+</SECTION>
+
diff --git a/docs/libs/gst-plugins-bad-libs.types b/docs/libs/gst-plugins-bad-libs.types
index 2bf883e..d0de339 100644
--- a/docs/libs/gst-plugins-bad-libs.types
+++ b/docs/libs/gst-plugins-bad-libs.types
@@ -5,6 +5,7 @@
 #include <gst/insertbin/gstinsertbin.h>
 #include <gst/mpegts/mpegts.h>
 #include <gst/gl/gl.h>
+#include <gst/player/player.h>
 
 gst_mpegts_section_get_type
 gst_mpegts_section_type_get_type
@@ -26,17 +27,31 @@
 gst_insert_bin_get_type
 
 
-gst_gl_allocator_get_type
+gst_gl_buffer_allocator_get_type
+gst_gl_memory_allocator_get_type
 gst_gl_base_filter_get_type
 gst_gl_buffer_pool_get_type
 gst_gl_color_convert_get_type
 gst_gl_context_get_type
 gst_gl_display_get_type
-gst_gl_download_get_type
 gst_gl_filter_get_type
 gst_gl_framebuffer_get_type
 gst_gl_shader_get_type
 gst_gl_upload_get_type
-gst_gl_upload_meta_get_type
 gst_gl_window_get_type
 
+gst_player_audio_info_get_type
+gst_player_color_balance_type_get_type
+gst_player_error_get_type
+gst_player_g_main_context_signal_dispatcher_get_type
+gst_player_get_type
+gst_player_media_info_get_type
+gst_player_signal_dispatcher_get_type
+gst_player_state_get_type
+gst_player_stream_info_get_type
+gst_player_subtitle_info_get_type
+gst_player_video_info_get_type
+gst_player_video_overlay_video_renderer_get_type
+gst_player_video_renderer_get_type
+gst_player_visualization_get_type
+
diff --git a/docs/libs/html/GstGLBaseFilter.html b/docs/libs/html/GstGLBaseFilter.html
index 8cc430b..b383e00 100644
--- a/docs/libs/html/GstGLBaseFilter.html
+++ b/docs/libs/html/GstGLBaseFilter.html
@@ -94,7 +94,7 @@
 <p><a class="link" href="GstGLBaseFilter.html" title="GstGLBaseFilter"><span class="type">GstGLBaseFilter</span></a> is a base class that provides the logic of getting the
 GL context from the pipeline.</p>
 <div class="refsect3">
-<a name="id-1.2.9.14.8.2.5"></a><h4>Members</h4>
+<a name="id-1.2.9.13.8.2.5"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
@@ -119,7 +119,7 @@
 } GstGLBaseFilterClass;
 </pre>
 <div class="refsect3">
-<a name="id-1.2.9.14.8.3.4"></a><h4>Members</h4>
+<a name="id-1.2.9.13.8.3.4"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
diff --git a/docs/libs/html/GstGLBufferPool.html b/docs/libs/html/GstGLBufferPool.html
index 84a96f3..5a87703 100644
--- a/docs/libs/html/GstGLBufferPool.html
+++ b/docs/libs/html/GstGLBufferPool.html
@@ -58,12 +58,12 @@
 </colgroup>
 <tbody>
 <tr>
-<td class="datatype_keyword">struct</td>
-<td class="function_name"><a class="link" href="GstGLBufferPool.html#GstGLBufferPool-struct" title="struct GstGLBufferPool">GstGLBufferPool</a></td>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="GstGLBufferPool.html#GstGLBufferPool-struct" title="GstGLBufferPool">GstGLBufferPool</a></td>
 </tr>
 <tr>
-<td class="datatype_keyword">struct</td>
-<td class="function_name"><a class="link" href="GstGLBufferPool.html#GstGLBufferPoolClass" title="struct GstGLBufferPoolClass">GstGLBufferPoolClass</a></td>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="GstGLBufferPool.html#GstGLBufferPoolClass" title="GstGLBufferPoolClass">GstGLBufferPoolClass</a></td>
 </tr>
 </tbody>
 </table></div>
@@ -114,18 +114,18 @@
 <div class="refsect1">
 <a name="GstGLBufferPool.other_details"></a><h2>Types and Values</h2>
 <div class="refsect2">
-<a name="GstGLBufferPool-struct"></a><h3>struct GstGLBufferPool</h3>
-<pre class="programlisting">struct GstGLBufferPool;</pre>
+<a name="GstGLBufferPool-struct"></a><h3>GstGLBufferPool</h3>
+<pre class="programlisting">typedef struct _GstGLBufferPool GstGLBufferPool;</pre>
 <p>Opaque GstGLBufferPool struct</p>
 </div>
 <hr>
 <div class="refsect2">
-<a name="GstGLBufferPoolClass"></a><h3>struct GstGLBufferPoolClass</h3>
-<pre class="programlisting">struct GstGLBufferPoolClass {
+<a name="GstGLBufferPoolClass"></a><h3>GstGLBufferPoolClass</h3>
+<pre class="programlisting">typedef struct {
   GstBufferPoolClass parent_class;
-};
+} GstGLBufferPoolClass;
 </pre>
-<p>The <a class="link" href="GstGLBufferPool.html#GstGLBufferPoolClass" title="struct GstGLBufferPoolClass"><span class="type">GstGLBufferPoolClass</span></a> structure contains only private data</p>
+<p>The <a class="link" href="GstGLBufferPool.html#GstGLBufferPoolClass" title="GstGLBufferPoolClass"><span class="type">GstGLBufferPoolClass</span></a> structure contains only private data</p>
 </div>
 </div>
 <div class="refsect1">
diff --git a/docs/libs/html/GstGLColorConvert.html b/docs/libs/html/GstGLColorConvert.html
index 9fd6ad0..fbfc2c4 100644
--- a/docs/libs/html/GstGLColorConvert.html
+++ b/docs/libs/html/GstGLColorConvert.html
@@ -258,7 +258,7 @@
 </div>
 <div class="refsect1">
 <a name="GstGLColorConvert.see-also"></a><h2>See Also</h2>
-<p><a class="link" href="GstGLUpload.html" title="GstGLUpload"><span class="type">GstGLUpload</span></a>, <a class="link" href="GstGLDownload.html" title="GstGLDownload"><span class="type">GstGLDownload</span></a>, <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a></p>
+<p><a class="link" href="GstGLUpload.html" title="GstGLUpload"><span class="type">GstGLUpload</span></a>, <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-libs/html/GstGLDownload.html"><span class="type">GstGLDownload</span></a>, <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a></p>
 </div>
 </div>
 <div class="footer">
diff --git a/docs/libs/html/GstGLDisplay.html b/docs/libs/html/GstGLDisplay.html
index 3cc92f2..0339415 100644
--- a/docs/libs/html/GstGLDisplay.html
+++ b/docs/libs/html/GstGLDisplay.html
@@ -7,7 +7,7 @@
 <link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Library Reference Manual">
 <link rel="up" href="gl.html" title="OpenGL Helper Library">
 <link rel="prev" href="gst-plugins-bad-libs-GstGLContextWGL.html" title="GstGLContextWGL">
-<link rel="next" href="GstGLDownload.html" title="GstGLDownload">
+<link rel="next" href="gst-plugins-bad-libs-GstEGLImageMemory.html" title="GstEGLImageMemory">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -22,7 +22,7 @@
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="gl.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="gst-plugins-bad-libs-GstGLContextWGL.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="GstGLDownload.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-libs-GstEGLImageMemory.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <a name="GstGLDisplay"></a><div class="titlepage"></div>
diff --git a/docs/libs/html/GstGLDownload.html b/docs/libs/html/GstGLDownload.html
deleted file mode 100644
index 3ddf3c1..0000000
--- a/docs/libs/html/GstGLDownload.html
+++ /dev/null
@@ -1,238 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>GstGLDownload: GStreamer Bad Plugins 1.0 Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
-<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Library Reference Manual">
-<link rel="up" href="gl.html" title="OpenGL Helper Library">
-<link rel="prev" href="GstGLDisplay.html" title="GstGLDisplay">
-<link rel="next" href="gst-plugins-bad-libs-GstEGLImageMemory.html" title="GstEGLImageMemory">
-<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
-<link rel="stylesheet" href="style.css" type="text/css">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
-<td width="100%" align="left" class="shortcuts">
-<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
-                  <a href="#GstGLDownload.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
-                  <a href="#GstGLDownload.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
-</td>
-<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="gl.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="GstGLDisplay.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gst-plugins-bad-libs-GstEGLImageMemory.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
-</tr></table>
-<div class="refentry">
-<a name="GstGLDownload"></a><div class="titlepage"></div>
-<div class="refnamediv"><table width="100%"><tr>
-<td valign="top">
-<h2><span class="refentrytitle"><a name="GstGLDownload.top_of_page"></a>GstGLDownload</span></h2>
-<p>GstGLDownload — an object that downloads GL textures</p>
-</td>
-<td class="gallery_image" valign="top" align="right"></td>
-</tr></table></div>
-<div class="refsect1">
-<a name="GstGLDownload.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
-</colgroup>
-<tbody>
-<tr>
-<td class="function_type">
-<a class="link" href="GstGLDownload.html" title="GstGLDownload"><span class="returnvalue">GstGLDownload</span></a> *
-</td>
-<td class="function_name">
-<a class="link" href="GstGLDownload.html#gst-gl-download-new" title="gst_gl_download_new ()">gst_gl_download_new</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">void</span>
-</td>
-<td class="function_name">
-<a class="link" href="GstGLDownload.html#gst-gl-download-set-format" title="gst_gl_download_set_format ()">gst_gl_download_set_format</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstCaps.html"><span class="returnvalue">GstCaps</span></a> *
-</td>
-<td class="function_name">
-<a class="link" href="GstGLDownload.html#gst-gl-download-transform-caps" title="gst_gl_download_transform_caps ()">gst_gl_download_transform_caps</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-</td>
-<td class="function_name">
-<a class="link" href="GstGLDownload.html#gst-gl-download-perform-with-data" title="gst_gl_download_perform_with_data ()">gst_gl_download_perform_with_data</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<div class="refsect1">
-<a name="GstGLDownload.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="name">
-<col class="description">
-</colgroup>
-<tbody><tr>
-<td class="datatype_keyword"> </td>
-<td class="function_name"><a class="link" href="GstGLDownload.html#GstGLDownload-struct" title="GstGLDownload">GstGLDownload</a></td>
-</tr></tbody>
-</table></div>
-</div>
-<div class="refsect1">
-<a name="GstGLDownload.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen">    <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
-    <span class="lineart">╰──</span> <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
-        <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
-            <span class="lineart">╰──</span> GstGLDownload
-</pre>
-</div>
-<div class="refsect1">
-<a name="GstGLDownload.description"></a><h2>Description</h2>
-<p><a class="link" href="GstGLDownload.html" title="GstGLDownload"><span class="type">GstGLDownload</span></a> is an object that downloads GL textures into system memory.</p>
-<p>A <a class="link" href="GstGLDownload.html" title="GstGLDownload"><span class="type">GstGLDownload</span></a> can be created with <a class="link" href="GstGLDownload.html#gst-gl-download-new" title="gst_gl_download_new ()"><code class="function">gst_gl_download_new()</code></a></p>
-</div>
-<div class="refsect1">
-<a name="GstGLDownload.functions_details"></a><h2>Functions</h2>
-<div class="refsect2">
-<a name="gst-gl-download-new"></a><h3>gst_gl_download_new ()</h3>
-<pre class="programlisting"><a class="link" href="GstGLDownload.html" title="GstGLDownload"><span class="returnvalue">GstGLDownload</span></a> *
-gst_gl_download_new (<em class="parameter"><code><a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a> *context</code></em>);</pre>
-<div class="refsect3">
-<a name="id-1.2.9.12.7.2.4"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="parameters_name">
-<col class="parameters_description">
-<col width="200px" class="parameters_annotations">
-</colgroup>
-<tbody><tr>
-<td class="parameter_name"><p>context</p></td>
-<td class="parameter_description"><p>a <a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr></tbody>
-</table></div>
-</div>
-<div class="refsect3">
-<a name="id-1.2.9.12.7.2.5"></a><h4>Returns</h4>
-<p> a new <a class="link" href="GstGLDownload.html" title="GstGLDownload"><span class="type">GstGLDownload</span></a> object</p>
-</div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-download-set-format"></a><h3>gst_gl_download_set_format ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-gst_gl_download_set_format (<em class="parameter"><code><a class="link" href="GstGLDownload.html" title="GstGLDownload"><span class="type">GstGLDownload</span></a> *download</code></em>,
-                            <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> *out_info</code></em>);</pre>
-<p>Initializes <em class="parameter"><code>download</code></em>
- with the information required for download.</p>
-<div class="refsect3">
-<a name="id-1.2.9.12.7.3.5"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="parameters_name">
-<col class="parameters_description">
-<col width="200px" class="parameters_annotations">
-</colgroup>
-<tbody>
-<tr>
-<td class="parameter_name"><p>download</p></td>
-<td class="parameter_description"><p>a <a class="link" href="GstGLDownload.html" title="GstGLDownload"><span class="type">GstGLDownload</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>out_info</p></td>
-<td class="parameter_description"><p>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-</tbody>
-</table></div>
-</div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-download-transform-caps"></a><h3>gst_gl_download_transform_caps ()</h3>
-<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstCaps.html"><span class="returnvalue">GstCaps</span></a> *
-gst_gl_download_transform_caps (<em class="parameter"><code><a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a> *convert</code></em>,
-                                <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstPad.html#GstPadDirection"><span class="type">GstPadDirection</span></a> direction</code></em>,
-                                <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstCaps.html"><span class="type">GstCaps</span></a> *caps</code></em>,
-                                <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstCaps.html"><span class="type">GstCaps</span></a> *filter</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-download-perform-with-data"></a><h3>gst_gl_download_perform_with_data ()</h3>
-<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_gl_download_perform_with_data (<em class="parameter"><code><a class="link" href="GstGLDownload.html" title="GstGLDownload"><span class="type">GstGLDownload</span></a> *download</code></em>,
-                                   <em class="parameter"><code><span class="type">GLuint</span> texture_id</code></em>,
-                                   <em class="parameter"><code><span class="type">GLuint</span> texture_target</code></em>,
-                                   <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data[GST_VIDEO_MAX_PLANES]</code></em>);</pre>
-<p>Downloads <em class="parameter"><code>texture_id</code></em>
- into <em class="parameter"><code>data</code></em>
-. <em class="parameter"><code>data</code></em>
- size and format is specified by
-the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoFormat"><span class="type">GstVideoFormat</span></a> passed to <a class="link" href="GstGLDownload.html#gst-gl-download-set-format" title="gst_gl_download_set_format ()"><code class="function">gst_gl_download_set_format()</code></a></p>
-<p>This method can only be used for download a single view.</p>
-<div class="refsect3">
-<a name="id-1.2.9.12.7.5.6"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="parameters_name">
-<col class="parameters_description">
-<col width="200px" class="parameters_annotations">
-</colgroup>
-<tbody>
-<tr>
-<td class="parameter_name"><p>download</p></td>
-<td class="parameter_description"><p>a <a class="link" href="GstGLDownload.html" title="GstGLDownload"><span class="type">GstGLDownload</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>texture_id</p></td>
-<td class="parameter_description"><p>the texture id to download</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>texture_target</p></td>
-<td class="parameter_description"><p>the GL texture target</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>data</p></td>
-<td class="parameter_description"><p> where the downloaded data should go. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<div class="refsect3">
-<a name="id-1.2.9.12.7.5.7"></a><h4>Returns</h4>
-<p> whether the download was successful</p>
-</div>
-</div>
-</div>
-<div class="refsect1">
-<a name="GstGLDownload.other_details"></a><h2>Types and Values</h2>
-<div class="refsect2">
-<a name="GstGLDownload-struct"></a><h3>GstGLDownload</h3>
-<pre class="programlisting">typedef struct _GstGLDownload GstGLDownload;</pre>
-<p>Opaque <a class="link" href="GstGLDownload.html" title="GstGLDownload"><span class="type">GstGLDownload</span></a> object</p>
-</div>
-</div>
-<div class="refsect1">
-<a name="GstGLDownload.see-also"></a><h2>See Also</h2>
-<p><a class="link" href="GstGLUpload.html" title="GstGLUpload"><span class="type">GstGLUpload</span></a>, <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a></p>
-</div>
-</div>
-<div class="footer">
-<hr>Generated by GTK-Doc V1.24</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/docs/libs/html/GstGLFilter.html b/docs/libs/html/GstGLFilter.html
index 29f3018..f6ad33d 100644
--- a/docs/libs/html/GstGLFilter.html
+++ b/docs/libs/html/GstGLFilter.html
@@ -122,7 +122,7 @@
  and <em class="parameter"><code>height</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.2.9.15.7.2.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.14.7.2.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -174,7 +174,7 @@
  is the input texture of <em class="parameter"><code>filter</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.2.9.15.7.3.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.14.7.3.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -241,7 +241,7 @@
 .</p>
 <p>See also: <a class="link" href="GstGLFilter.html#gst-gl-filter-render-to-target" title="gst_gl_filter_render_to_target ()"><code class="function">gst_gl_filter_render_to_target()</code></a></p>
 <div class="refsect3">
-<a name="id-1.2.9.15.7.4.6"></a><h4>Parameters</h4>
+<a name="id-1.2.9.14.7.4.6"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -289,7 +289,7 @@
 <p>Perform automatic upload if needed, call filter_texture vfunc and then an
 automatic download if needed.</p>
 <div class="refsect3">
-<a name="id-1.2.9.15.7.5.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.14.7.5.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -316,7 +316,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.9.15.7.5.6"></a><h4>Returns</h4>
+<a name="id-1.2.9.14.7.5.6"></a><h4>Returns</h4>
 <p> whether the transformation succeeded</p>
 </div>
 </div>
@@ -330,7 +330,7 @@
 from downstream and automatic upload/download for non-<a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a>
 <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html"><span class="type">GstBuffer</span></a>s.</p>
 <div class="refsect3">
-<a name="id-1.2.9.15.8.2.5"></a><h4>Members</h4>
+<a name="id-1.2.9.14.8.2.5"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
@@ -361,7 +361,7 @@
 } GstGLFilterClass;
 </pre>
 <div class="refsect3">
-<a name="id-1.2.9.15.8.3.4"></a><h4>Members</h4>
+<a name="id-1.2.9.14.8.3.4"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
diff --git a/docs/libs/html/GstGLUpload.html b/docs/libs/html/GstGLUpload.html
index 4700a58..81e6363 100644
--- a/docs/libs/html/GstGLUpload.html
+++ b/docs/libs/html/GstGLUpload.html
@@ -7,7 +7,7 @@
 <link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Library Reference Manual">
 <link rel="up" href="gl.html" title="OpenGL Helper Library">
 <link rel="prev" href="gst-plugins-bad-libs-GstGLSyncMeta.html" title="GstGLSyncMeta">
-<link rel="next" href="GstGLUploadMeta.html" title="GstGLUploadMeta">
+<link rel="next" href="gst-plugins-bad-libs-Utilities.html" title="Utilities">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -21,7 +21,7 @@
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="gl.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="gst-plugins-bad-libs-GstGLSyncMeta.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="GstGLUploadMeta.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-libs-Utilities.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <a name="GstGLUpload"></a><div class="titlepage"></div>
@@ -88,14 +88,6 @@
 <a class="link" href="GstGLUpload.html#gst-gl-upload-perform-with-buffer" title="gst_gl_upload_perform_with_buffer ()">gst_gl_upload_perform_with_buffer</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">void</span>
-</td>
-<td class="function_name">
-<a class="link" href="GstGLUpload.html#gst-gl-upload-release-buffer" title="gst_gl_upload_release_buffer ()">gst_gl_upload_release_buffer</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
 </tbody>
 </table></div>
 </div>
@@ -132,7 +124,7 @@
 <pre class="programlisting"><a class="link" href="GstGLUpload.html" title="GstGLUpload"><span class="returnvalue">GstGLUpload</span></a> *
 gst_gl_upload_new (<em class="parameter"><code><a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a> *context</code></em>);</pre>
 <div class="refsect3">
-<a name="id-1.2.9.20.7.2.4"></a><h4>Parameters</h4>
+<a name="id-1.2.9.19.7.2.4"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -147,7 +139,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.9.20.7.2.5"></a><h4>Returns</h4>
+<a name="id-1.2.9.19.7.2.5"></a><h4>Returns</h4>
 <p> a new <a class="link" href="GstGLUpload.html" title="GstGLUpload"><span class="type">GstGLUpload</span></a> object</p>
 </div>
 </div>
@@ -159,7 +151,7 @@
                         <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstCaps.html"><span class="type">GstCaps</span></a> **in_caps</code></em>,
                         <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstCaps.html"><span class="type">GstCaps</span></a> **out_caps</code></em>);</pre>
 <div class="refsect3">
-<a name="id-1.2.9.20.7.3.4"></a><h4>Parameters</h4>
+<a name="id-1.2.9.19.7.3.4"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -186,7 +178,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.9.20.7.3.5"></a><h4>Returns</h4>
+<a name="id-1.2.9.19.7.3.5"></a><h4>Returns</h4>
 <p> The <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstCaps.html"><span class="type">GstCaps</span></a> set by <a class="link" href="GstGLUpload.html#gst-gl-upload-set-caps" title="gst_gl_upload_set_caps ()"><code class="function">gst_gl_upload_set_caps()</code></a>. </p>
 <p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
 </div>
@@ -201,7 +193,7 @@
 <p>Initializes <em class="parameter"><code>upload</code></em>
  with the information required for upload.</p>
 <div class="refsect3">
-<a name="id-1.2.9.20.7.4.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.19.7.4.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -228,7 +220,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.9.20.7.4.6"></a><h4>Returns</h4>
+<a name="id-1.2.9.19.7.4.6"></a><h4>Returns</h4>
 <p> whether <em class="parameter"><code>in_caps</code></em>
 and <em class="parameter"><code>out_caps</code></em>
 could be set on <em class="parameter"><code>upload</code></em>
@@ -244,7 +236,7 @@
                                   <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstQuery.html"><span class="type">GstQuery</span></a> *query</code></em>);</pre>
 <p>Adds the required allocation parameters to support uploading.</p>
 <div class="refsect3">
-<a name="id-1.2.9.20.7.5.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.19.7.5.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -288,12 +280,10 @@
                                    <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html"><span class="type">GstBuffer</span></a> *buffer</code></em>,
                                    <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html"><span class="type">GstBuffer</span></a> **outbuf</code></em>);</pre>
 <p>Uploads <em class="parameter"><code>buffer</code></em>
- to the texture given by <em class="parameter"><code>tex_id</code></em>
-.  <em class="parameter"><code>tex_id</code></em>
- is valid
-until <a class="link" href="GstGLUpload.html#gst-gl-upload-release-buffer" title="gst_gl_upload_release_buffer ()"><code class="function">gst_gl_upload_release_buffer()</code></a> is called.</p>
+ using the transformation specified by
+<a class="link" href="GstGLUpload.html#gst-gl-upload-set-caps" title="gst_gl_upload_set_caps ()"><code class="function">gst_gl_upload_set_caps()</code></a>.</p>
 <div class="refsect3">
-<a name="id-1.2.9.20.7.7.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.19.7.7.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -313,40 +303,17 @@
 </tr>
 <tr>
 <td class="parameter_name"><p>outbuf_ptr</p></td>
-<td class="parameter_description"><p> resulting buffer. </p></td>
-<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+<td class="parameter_description"><p>esulting buffer</p></td>
+<td class="parameter_annotations"> </td>
 </tr>
 </tbody>
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.9.20.7.7.6"></a><h4>Returns</h4>
+<a name="id-1.2.9.19.7.7.6"></a><h4>Returns</h4>
 <p> whether the upload was successful</p>
 </div>
 </div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-upload-release-buffer"></a><h3>gst_gl_upload_release_buffer ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-gst_gl_upload_release_buffer (<em class="parameter"><code><a class="link" href="GstGLUpload.html" title="GstGLUpload"><span class="type">GstGLUpload</span></a> *upload</code></em>);</pre>
-<p>Releases any buffers currently referenced by <em class="parameter"><code>upload</code></em>
-</p>
-<div class="refsect3">
-<a name="id-1.2.9.20.7.8.5"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="parameters_name">
-<col class="parameters_description">
-<col width="200px" class="parameters_annotations">
-</colgroup>
-<tbody><tr>
-<td class="parameter_name"><p>upload</p></td>
-<td class="parameter_description"><p>a <a class="link" href="GstGLUpload.html" title="GstGLUpload"><span class="type">GstGLUpload</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr></tbody>
-</table></div>
-</div>
-</div>
 </div>
 <div class="refsect1">
 <a name="GstGLUpload.other_details"></a><h2>Types and Values</h2>
@@ -358,7 +325,7 @@
 </div>
 <div class="refsect1">
 <a name="GstGLUpload.see-also"></a><h2>See Also</h2>
-<p><a class="link" href="GstGLDownload.html" title="GstGLDownload"><span class="type">GstGLDownload</span></a>, <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a></p>
+<p><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-libs/html/GstGLDownload.html"><span class="type">GstGLDownload</span></a>, <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a></p>
 </div>
 </div>
 <div class="footer">
diff --git a/docs/libs/html/GstGLUploadMeta.html b/docs/libs/html/GstGLUploadMeta.html
deleted file mode 100644
index b412b10..0000000
--- a/docs/libs/html/GstGLUploadMeta.html
+++ /dev/null
@@ -1,241 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>GstGLUploadMeta: GStreamer Bad Plugins 1.0 Library Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
-<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Library Reference Manual">
-<link rel="up" href="gl.html" title="OpenGL Helper Library">
-<link rel="prev" href="GstGLUpload.html" title="GstGLUpload">
-<link rel="next" href="gst-plugins-bad-libs-Utilities.html" title="Utilities">
-<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
-<link rel="stylesheet" href="style.css" type="text/css">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
-<td width="100%" align="left" class="shortcuts">
-<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
-                  <a href="#GstGLUploadMeta.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
-                  <a href="#GstGLUploadMeta.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
-</td>
-<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="gl.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="GstGLUpload.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gst-plugins-bad-libs-Utilities.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
-</tr></table>
-<div class="refentry">
-<a name="GstGLUploadMeta"></a><div class="titlepage"></div>
-<div class="refnamediv"><table width="100%"><tr>
-<td valign="top">
-<h2><span class="refentrytitle"><a name="GstGLUploadMeta.top_of_page"></a>GstGLUploadMeta</span></h2>
-<p>GstGLUploadMeta — an object that provides <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideometa.html#GstVideoGLTextureUploadMeta"><span class="type">GstVideoGLTextureUploadMeta</span></a></p>
-</td>
-<td class="gallery_image" valign="top" align="right"></td>
-</tr></table></div>
-<div class="refsect1">
-<a name="GstGLUploadMeta.functions"></a><h2>Functions</h2>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="functions_return">
-<col class="functions_name">
-</colgroup>
-<tbody>
-<tr>
-<td class="function_type">
-<a class="link" href="GstGLUploadMeta.html" title="GstGLUploadMeta"><span class="returnvalue">GstGLUploadMeta</span></a> *
-</td>
-<td class="function_name">
-<a class="link" href="GstGLUploadMeta.html#gst-gl-upload-meta-new" title="gst_gl_upload_meta_new ()">gst_gl_upload_meta_new</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">void</span>
-</td>
-<td class="function_name">
-<a class="link" href="GstGLUploadMeta.html#gst-gl-upload-meta-set-format" title="gst_gl_upload_meta_set_format ()">gst_gl_upload_meta_set_format</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="returnvalue">GstVideoInfo</span></a> *
-</td>
-<td class="function_name">
-<a class="link" href="GstGLUploadMeta.html#gst-gl-upload-meta-get-format" title="gst_gl_upload_meta_get_format ()">gst_gl_upload_meta_get_format</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-</td>
-<td class="function_name">
-<a class="link" href="GstGLUploadMeta.html#gst-gl-upload-meta-add-to-buffer" title="gst_gl_upload_meta_add_to_buffer ()">gst_gl_upload_meta_add_to_buffer</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<div class="refsect1">
-<a name="GstGLUploadMeta.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="name">
-<col class="description">
-</colgroup>
-<tbody><tr>
-<td class="datatype_keyword"> </td>
-<td class="function_name"><a class="link" href="GstGLUploadMeta.html#GstGLUploadMeta-struct" title="GstGLUploadMeta">GstGLUploadMeta</a></td>
-</tr></tbody>
-</table></div>
-</div>
-<div class="refsect1">
-<a name="GstGLUploadMeta.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen">    <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
-    <span class="lineart">╰──</span> <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
-        <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
-            <span class="lineart">╰──</span> GstGLUploadMeta
-</pre>
-</div>
-<div class="refsect1">
-<a name="GstGLUploadMeta.description"></a><h2>Description</h2>
-<p><a class="link" href="GstGLUploadMeta.html" title="GstGLUploadMeta"><span class="type">GstGLUploadMeta</span></a> is an object that uploads data from system memory into GL textures.</p>
-<p>A <a class="link" href="GstGLUpload.html" title="GstGLUpload"><span class="type">GstGLUpload</span></a> can be created with <a class="link" href="GstGLUpload.html#gst-gl-upload-new" title="gst_gl_upload_new ()"><code class="function">gst_gl_upload_new()</code></a></p>
-</div>
-<div class="refsect1">
-<a name="GstGLUploadMeta.functions_details"></a><h2>Functions</h2>
-<div class="refsect2">
-<a name="gst-gl-upload-meta-new"></a><h3>gst_gl_upload_meta_new ()</h3>
-<pre class="programlisting"><a class="link" href="GstGLUploadMeta.html" title="GstGLUploadMeta"><span class="returnvalue">GstGLUploadMeta</span></a> *
-gst_gl_upload_meta_new (<em class="parameter"><code><a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a> *context</code></em>);</pre>
-<div class="refsect3">
-<a name="id-1.2.9.21.7.2.4"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="parameters_name">
-<col class="parameters_description">
-<col width="200px" class="parameters_annotations">
-</colgroup>
-<tbody><tr>
-<td class="parameter_name"><p>context</p></td>
-<td class="parameter_description"><p>a <a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr></tbody>
-</table></div>
-</div>
-<div class="refsect3">
-<a name="id-1.2.9.21.7.2.5"></a><h4>Returns</h4>
-<p> a new <a class="link" href="GstGLUploadMeta.html" title="GstGLUploadMeta"><span class="type">GstGLUploadMeta</span></a> object</p>
-</div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-upload-meta-set-format"></a><h3>gst_gl_upload_meta_set_format ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-gst_gl_upload_meta_set_format (<em class="parameter"><code><a class="link" href="GstGLUploadMeta.html" title="GstGLUploadMeta"><span class="type">GstGLUploadMeta</span></a> *upload</code></em>,
-                               <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> *info</code></em>);</pre>
-<p>Initializes <em class="parameter"><code>upload</code></em>
- with the information required for upload.</p>
-<div class="refsect3">
-<a name="id-1.2.9.21.7.3.5"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="parameters_name">
-<col class="parameters_description">
-<col width="200px" class="parameters_annotations">
-</colgroup>
-<tbody>
-<tr>
-<td class="parameter_name"><p>upload</p></td>
-<td class="parameter_description"><p>a <a class="link" href="GstGLUpload.html" title="GstGLUpload"><span class="type">GstGLUpload</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>info</p></td>
-<td class="parameter_description"><p>input <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-</tbody>
-</table></div>
-</div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-upload-meta-get-format"></a><h3>gst_gl_upload_meta_get_format ()</h3>
-<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="returnvalue">GstVideoInfo</span></a> *
-gst_gl_upload_meta_get_format (<em class="parameter"><code><a class="link" href="GstGLUploadMeta.html" title="GstGLUploadMeta"><span class="type">GstGLUploadMeta</span></a> *upload</code></em>);</pre>
-<div class="refsect3">
-<a name="id-1.2.9.21.7.4.4"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="parameters_name">
-<col class="parameters_description">
-<col width="200px" class="parameters_annotations">
-</colgroup>
-<tbody><tr>
-<td class="parameter_name"><p>upload</p></td>
-<td class="parameter_description"><p>a <a class="link" href="GstGLUpload.html" title="GstGLUpload"><span class="type">GstGLUpload</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr></tbody>
-</table></div>
-</div>
-<div class="refsect3">
-<a name="id-1.2.9.21.7.4.5"></a><h4>Returns</h4>
-<p> The <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> set by
-<a class="link" href="GstGLUploadMeta.html#gst-gl-upload-meta-set-format" title="gst_gl_upload_meta_set_format ()"><code class="function">gst_gl_upload_meta_set_format()</code></a>. </p>
-<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
-</div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-upload-meta-add-to-buffer"></a><h3>gst_gl_upload_meta_add_to_buffer ()</h3>
-<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_gl_upload_meta_add_to_buffer (<em class="parameter"><code><a class="link" href="GstGLUploadMeta.html" title="GstGLUploadMeta"><span class="type">GstGLUploadMeta</span></a> *upload</code></em>,
-                                  <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
-<p>Adds a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideometa.html#GstVideoGLTextureUploadMeta"><span class="type">GstVideoGLTextureUploadMeta</span></a> on <em class="parameter"><code>buffer</code></em>
- using <em class="parameter"><code>upload</code></em>
-</p>
-<div class="refsect3">
-<a name="id-1.2.9.21.7.5.5"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="parameters_name">
-<col class="parameters_description">
-<col width="200px" class="parameters_annotations">
-</colgroup>
-<tbody>
-<tr>
-<td class="parameter_name"><p>upload</p></td>
-<td class="parameter_description"><p>a <a class="link" href="GstGLUploadMeta.html" title="GstGLUploadMeta"><span class="type">GstGLUploadMeta</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html"><span class="type">GstBuffer</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<div class="refsect3">
-<a name="id-1.2.9.21.7.5.6"></a><h4>Returns</h4>
-<p> whether it was successful</p>
-</div>
-</div>
-</div>
-<div class="refsect1">
-<a name="GstGLUploadMeta.other_details"></a><h2>Types and Values</h2>
-<div class="refsect2">
-<a name="GstGLUploadMeta-struct"></a><h3>GstGLUploadMeta</h3>
-<pre class="programlisting">typedef struct _GstGLUploadMeta GstGLUploadMeta;</pre>
-<p>Opaque <a class="link" href="GstGLUploadMeta.html" title="GstGLUploadMeta"><span class="type">GstGLUploadMeta</span></a> object</p>
-</div>
-</div>
-<div class="refsect1">
-<a name="GstGLUploadMeta.see-also"></a><h2>See Also</h2>
-<p><a class="link" href="GstGLUpload.html" title="GstGLUpload"><span class="type">GstGLUpload</span></a>, <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a></p>
-</div>
-</div>
-<div class="footer">
-<hr>Generated by GTK-Doc V1.24</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/docs/libs/html/GstGLWindow.html b/docs/libs/html/GstGLWindow.html
index 565211e..91cb01e 100644
--- a/docs/libs/html/GstGLWindow.html
+++ b/docs/libs/html/GstGLWindow.html
@@ -99,14 +99,6 @@
 </tr>
 <tr>
 <td class="function_type">
-<span class="returnvalue">void</span>
-</td>
-<td class="function_name">
-<a class="link" href="GstGLWindow.html#gst-gl-window-draw-unlocked" title="gst_gl_window_draw_unlocked ()">gst_gl_window_draw_unlocked</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
 <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
 </td>
 <td class="function_name">
@@ -339,7 +331,7 @@
 <pre class="programlisting"><a class="link" href="GstGLWindow.html" title="GstGLWindow"><span class="returnvalue">GstGLWindow</span></a> *
 gst_gl_window_new (<em class="parameter"><code><a class="link" href="GstGLDisplay.html" title="GstGLDisplay"><span class="type">GstGLDisplay</span></a> *display</code></em>);</pre>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.8.4"></a><h4>Parameters</h4>
+<a name="id-1.2.9.21.8.8.4"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -354,7 +346,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.8.5"></a><h4>Returns</h4>
+<a name="id-1.2.9.21.8.8.5"></a><h4>Returns</h4>
 <p> a new <a class="link" href="GstGLWindow.html" title="GstGLWindow"><span class="type">GstGLWindow</span></a> using <em class="parameter"><code>display</code></em>
 's connection. </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
@@ -368,30 +360,7 @@
 gst_gl_window_draw (<em class="parameter"><code><a class="link" href="GstGLWindow.html" title="GstGLWindow"><span class="type">GstGLWindow</span></a> *window</code></em>);</pre>
 <p>Redraw the window contents.  Implementations should invoke the draw callback.</p>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.9.5"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="parameters_name">
-<col class="parameters_description">
-<col width="200px" class="parameters_annotations">
-</colgroup>
-<tbody><tr>
-<td class="parameter_name"><p>window</p></td>
-<td class="parameter_description"><p>a <a class="link" href="GstGLWindow.html" title="GstGLWindow"><span class="type">GstGLWindow</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr></tbody>
-</table></div>
-</div>
-<p class="since">Since: 1.4</p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-window-draw-unlocked"></a><h3>gst_gl_window_draw_unlocked ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-gst_gl_window_draw_unlocked (<em class="parameter"><code><a class="link" href="GstGLWindow.html" title="GstGLWindow"><span class="type">GstGLWindow</span></a> *window</code></em>);</pre>
-<p>Redraw the window contents.  Implementations should invoke the draw callback.</p>
-<div class="refsect3">
-<a name="id-1.2.9.23.8.10.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.21.8.9.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -414,7 +383,7 @@
 gst_gl_window_is_running (<em class="parameter"><code><a class="link" href="GstGLWindow.html" title="GstGLWindow"><span class="type">GstGLWindow</span></a> *window</code></em>);</pre>
 <p>Whether the runloop is running</p>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.11.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.21.8.10.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -437,7 +406,7 @@
 gst_gl_window_quit (<em class="parameter"><code><a class="link" href="GstGLWindow.html" title="GstGLWindow"><span class="type">GstGLWindow</span></a> *window</code></em>);</pre>
 <p>Quit the runloop's execution.</p>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.12.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.21.8.11.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -460,7 +429,7 @@
 gst_gl_window_run (<em class="parameter"><code><a class="link" href="GstGLWindow.html" title="GstGLWindow"><span class="type">GstGLWindow</span></a> *window</code></em>);</pre>
 <p>Start the execution of the runloop.</p>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.13.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.21.8.12.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -482,7 +451,7 @@
 <pre class="programlisting"><a class="link" href="GstGLContext.html" title="GstGLContext"><span class="returnvalue">GstGLContext</span></a> *
 gst_gl_window_get_context (<em class="parameter"><code><a class="link" href="GstGLWindow.html" title="GstGLWindow"><span class="type">GstGLWindow</span></a> *window</code></em>);</pre>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.14.4"></a><h4>Parameters</h4>
+<a name="id-1.2.9.21.8.13.4"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -497,7 +466,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.14.5"></a><h4>Returns</h4>
+<a name="id-1.2.9.21.8.13.5"></a><h4>Returns</h4>
 <p> the <a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a> associated with this <em class="parameter"><code>window</code></em>
 . </p>
 <p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
@@ -510,7 +479,7 @@
 <pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guintptr"><span class="returnvalue">guintptr</span></a>
 gst_gl_window_get_display (<em class="parameter"><code><a class="link" href="GstGLWindow.html" title="GstGLWindow"><span class="type">GstGLWindow</span></a> *window</code></em>);</pre>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.15.4"></a><h4>Parameters</h4>
+<a name="id-1.2.9.21.8.14.4"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -525,7 +494,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.15.5"></a><h4>Returns</h4>
+<a name="id-1.2.9.21.8.14.5"></a><h4>Returns</h4>
 <p> the windowing system display handle for this <em class="parameter"><code>window</code></em>
 </p>
 </div>
@@ -543,7 +512,7 @@
  is guarenteed to
 have executed when this function returns.</p>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.16.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.21.8.15.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -585,7 +554,7 @@
  on the window thread.  The callback may not
 have been executed when this function returns.</p>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.17.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.21.8.16.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -630,7 +599,7 @@
                                   <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> destroy_notify</code></em>);</pre>
 <p>Sets the callback called when the window is about to close.</p>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.18.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.21.8.17.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -675,7 +644,7 @@
                                  <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> destroy_notify</code></em>);</pre>
 <p>Sets the draw callback called everytime <a class="link" href="GstGLWindow.html#gst-gl-window-draw" title="gst_gl_window_draw ()"><code class="function">gst_gl_window_draw()</code></a> is called</p>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.19.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.21.8.18.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -720,7 +689,7 @@
                                    <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> destroy_notify</code></em>);</pre>
 <p>Sets the resize callback called everytime a resize of the window occurs.</p>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.20.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.21.8.19.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -765,7 +734,7 @@
  should render into.  Some implementations
 require this to be called with a valid handle before drawing can commence.</p>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.21.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.21.8.20.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -794,7 +763,7 @@
 <pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guintptr"><span class="returnvalue">guintptr</span></a>
 gst_gl_window_get_window_handle (<em class="parameter"><code><a class="link" href="GstGLWindow.html" title="GstGLWindow"><span class="type">GstGLWindow</span></a> *window</code></em>);</pre>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.22.4"></a><h4>Parameters</h4>
+<a name="id-1.2.9.21.8.21.4"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -809,7 +778,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.22.5"></a><h4>Returns</h4>
+<a name="id-1.2.9.21.8.21.5"></a><h4>Returns</h4>
 <p> the window handle we are currently rendering into</p>
 </div>
 <p class="since">Since: 1.4</p>
@@ -824,7 +793,7 @@
 <p>Set the preferred width and height of the window.  Implementations are free
 to ignore this information.</p>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.23.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.21.8.22.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -859,7 +828,7 @@
 gst_gl_window_show (<em class="parameter"><code><a class="link" href="GstGLWindow.html" title="GstGLWindow"><span class="type">GstGLWindow</span></a> *window</code></em>);</pre>
 <p>Present the window to the screen.</p>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.24.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.21.8.23.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -883,7 +852,7 @@
                                       <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *width</code></em>,
                                       <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *height</code></em>);</pre>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.25.4"></a><h4>Parameters</h4>
+<a name="id-1.2.9.21.8.24.4"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -925,7 +894,7 @@
 from the <em class="parameter"><code>window</code></em>
 .</p>
 <div class="refsect3">
-<a name="id-1.2.9.23.8.26.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.21.8.25.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -953,7 +922,7 @@
 <div class="refsect2">
 <a name="GstGLWindowError"></a><h3>enum GstGLWindowError</h3>
 <div class="refsect3">
-<a name="id-1.2.9.23.9.2.3"></a><h4>Members</h4>
+<a name="id-1.2.9.21.9.2.3"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -996,7 +965,6 @@
   guintptr (*get_display)        (GstGLWindow *window);
   void     (*set_window_handle)  (GstGLWindow *window, guintptr id);
   guintptr (*get_window_handle)  (GstGLWindow *window);
-  void     (*draw_unlocked)      (GstGLWindow *window);
   void     (*draw)               (GstGLWindow *window);
   void     (*run)                (GstGLWindow *window);
   void     (*quit)               (GstGLWindow *window);
@@ -1013,7 +981,7 @@
 } GstGLWindowClass;
 </pre>
 <div class="refsect3">
-<a name="id-1.2.9.23.9.4.4"></a><h4>Members</h4>
+<a name="id-1.2.9.21.9.4.4"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
@@ -1043,11 +1011,6 @@
 <td class="struct_member_annotations"> </td>
 </tr>
 <tr>
-<td class="struct_member_name"><p><em class="structfield"><code><a name="GstGLWindowClass.draw-unlocked"></a>draw_unlocked</code></em> ()</p></td>
-<td class="struct_member_description"><p>redraw the window with the specified dimensions</p></td>
-<td class="struct_member_annotations"> </td>
-</tr>
-<tr>
 <td class="struct_member_name"><p><em class="structfield"><code><a name="GstGLWindowClass.draw"></a>draw</code></em> ()</p></td>
 <td class="struct_member_description"><p>redraw the window with the specified dimensions</p></td>
 <td class="struct_member_annotations"> </td>
@@ -1128,7 +1091,7 @@
                <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>     user_data)</pre>
 <p>Will be emitted when a key event is received by the GstGLwindow.</p>
 <div class="refsect3">
-<a name="id-1.2.9.23.10.2.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.21.10.2.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1174,7 +1137,7 @@
                <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>     user_data)</pre>
 <p>Will be emitted when a mouse event is received by the GstGLwindow.</p>
 <div class="refsect3">
-<a name="id-1.2.9.23.10.3.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.21.10.3.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
diff --git a/docs/libs/html/annotation-glossary.html b/docs/libs/html/annotation-glossary.html
index f49fb27..002195c 100644
--- a/docs/libs/html/annotation-glossary.html
+++ b/docs/libs/html/annotation-glossary.html
@@ -38,6 +38,8 @@
 <a name="glsA"></a><h3 class="title">A</h3>
 <dt><span class="glossterm"><a name="annotation-glossterm-allow-none"></a>allow-none</span></dt>
 <dd class="glossdef"><p>NULL is OK, both for passing and for returning.</p></dd>
+<dt><span class="glossterm"><a name="annotation-glossterm-array"></a>array</span></dt>
+<dd class="glossdef"><p>Parameter points to an array of items.</p></dd>
 <a name="glsC"></a><h3 class="title">C</h3>
 <dt><span class="glossterm"><a name="annotation-glossterm-closure"></a>closure</span></dt>
 <dd class="glossdef"><p>This parameter is a 'user_data', for callbacks; many bindings can pass NULL here.</p></dd>
diff --git a/docs/libs/html/api-index-full.html b/docs/libs/html/api-index-full.html
index e7c13b4..064c13f 100644
--- a/docs/libs/html/api-index-full.html
+++ b/docs/libs/html/api-index-full.html
@@ -271,14 +271,6 @@
 <dd></dd>
 <a name="idxG"></a><h3 class="title">G</h3>
 <dt>
-<a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLAllocator-struct" title="GstGLAllocator">GstGLAllocator</a>, struct in <a class="link" href="gst-plugins-bad-libs-gstglmemory.html" title="GstGLMemory">gstglmemory</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLAllocatorClass" title="GstGLAllocatorClass">GstGLAllocatorClass</a>, struct in <a class="link" href="gst-plugins-bad-libs-gstglmemory.html" title="GstGLMemory">gstglmemory</a>
-</dt>
-<dd></dd>
-<dt>
 <a class="link" href="gst-plugins-bad-libs-GstGLAPI.html#GstGLAPI" title="enum GstGLAPI">GstGLAPI</a>, enum in <a class="link" href="gst-plugins-bad-libs-GstGLAPI.html" title="GstGLAPI">GstGLAPI</a>
 </dt>
 <dd></dd>
@@ -295,11 +287,11 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="GstGLBufferPool.html#GstGLBufferPool-struct" title="struct GstGLBufferPool">GstGLBufferPool</a>, struct in <a class="link" href="GstGLBufferPool.html" title="GstGLBufferPool">GstGLBufferPool</a>
+<a class="link" href="GstGLBufferPool.html#GstGLBufferPool-struct" title="GstGLBufferPool">GstGLBufferPool</a>, struct in <a class="link" href="GstGLBufferPool.html" title="GstGLBufferPool">GstGLBufferPool</a>
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="GstGLBufferPool.html#GstGLBufferPoolClass" title="struct GstGLBufferPoolClass">GstGLBufferPoolClass</a>, struct in <a class="link" href="GstGLBufferPool.html" title="GstGLBufferPool">GstGLBufferPool</a>
+<a class="link" href="GstGLBufferPool.html#GstGLBufferPoolClass" title="GstGLBufferPoolClass">GstGLBufferPoolClass</a>, struct in <a class="link" href="GstGLBufferPool.html" title="GstGLBufferPool">GstGLBufferPool</a>
 </dt>
 <dd></dd>
 <dt>
@@ -367,10 +359,6 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="GstGLDownload.html#GstGLDownload-struct" title="GstGLDownload">GstGLDownload</a>, struct in <a class="link" href="GstGLDownload.html" title="GstGLDownload">GstGLDownload</a>
-</dt>
-<dd></dd>
-<dt>
 <a class="link" href="GstGLFilter.html#GstGLFilter-struct" title="GstGLFilter">GstGLFilter</a>, struct in <a class="link" href="GstGLFilter.html" title="GstGLFilter">GstGLFilter</a>
 </dt>
 <dd></dd>
@@ -399,27 +387,7 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader--active" title="The “active” property">GstGLShader:active</a>, object property in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader--compiled" title="The “compiled” property">GstGLShader:compiled</a>, object property in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader--fragment-src" title="The “fragment-src” property">GstGLShader:fragment-src</a>, object property in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader--vertex-src" title="The “vertex-src” property">GstGLShader:vertex-src</a>, object property in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShaderError" title="enum GstGLShaderError">GstGLShaderError</a>, enum in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">gstglshader</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShaderSourceType" title="enum GstGLShaderSourceType">GstGLShaderSourceType</a>, enum in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">gstglshader</a>
+<a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader--linked" title="The “linked” property">GstGLShader:linked</a>, object property in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
 </dt>
 <dd></dd>
 <dt>
@@ -431,10 +399,6 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="GstGLUploadMeta.html#GstGLUploadMeta-struct" title="GstGLUploadMeta">GstGLUploadMeta</a>, struct in <a class="link" href="GstGLUploadMeta.html" title="GstGLUploadMeta">GstGLUploadMeta</a>
-</dt>
-<dd></dd>
-<dt>
 <a class="link" href="GstGLWindow.html#GstGLWindow-struct" title="GstGLWindow">GstGLWindow</a>, struct in <a class="link" href="GstGLWindow.html" title="GstGLWindow">GstGLWindow</a>
 </dt>
 <dd></dd>
@@ -803,22 +767,6 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="GstGLDownload.html#gst-gl-download-new" title="gst_gl_download_new ()">gst_gl_download_new</a>, function in <a class="link" href="GstGLDownload.html" title="GstGLDownload">GstGLDownload</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="GstGLDownload.html#gst-gl-download-perform-with-data" title="gst_gl_download_perform_with_data ()">gst_gl_download_perform_with_data</a>, function in <a class="link" href="GstGLDownload.html" title="GstGLDownload">GstGLDownload</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="GstGLDownload.html#gst-gl-download-set-format" title="gst_gl_download_set_format ()">gst_gl_download_set_format</a>, function in <a class="link" href="GstGLDownload.html" title="GstGLDownload">GstGLDownload</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="GstGLDownload.html#gst-gl-download-transform-caps" title="gst_gl_download_transform_caps ()">gst_gl_download_transform_caps</a>, function in <a class="link" href="GstGLDownload.html" title="GstGLDownload">GstGLDownload</a>
-</dt>
-<dd></dd>
-<dt>
 <a class="link" href="gst-plugins-bad-libs-Utilities.html#gst-gl-ensure-element-data" title="gst_gl_ensure_element_data ()">gst_gl_ensure_element_data</a>, function in <a class="link" href="gst-plugins-bad-libs-Utilities.html" title="Utilities">Utilities</a>
 </dt>
 <dd></dd>
@@ -871,15 +819,7 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-alloc" title="gst_gl_memory_alloc ()">gst_gl_memory_alloc</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglmemory.html" title="GstGLMemory">GstGLMemory</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GST-GL-MEMORY-ALLOCATOR:CAPS" title="GST_GL_MEMORY_ALLOCATOR">GST_GL_MEMORY_ALLOCATOR</a>, macro in <a class="link" href="gst-plugins-bad-libs-gstglmemory.html" title="GstGLMemory">gstglmemory</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-copy-into-texture" title="gst_gl_memory_copy_into_texture ()">gst_gl_memory_copy_into_texture</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglmemory.html" title="GstGLMemory">GstGLMemory</a>
+<a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GST-GL-MEMORY-ALLOCATOR:CAPS" title="GST_GL_MEMORY_ALLOCATOR()">GST_GL_MEMORY_ALLOCATOR</a>, macro in <a class="link" href="gst-plugins-bad-libs-gstglmemory.html" title="GstGLMemory">gstglmemory</a>
 </dt>
 <dd></dd>
 <dt>
@@ -891,18 +831,6 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-setup-wrapped" title="gst_gl_memory_setup_wrapped ()">gst_gl_memory_setup_wrapped</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglmemory.html" title="GstGLMemory">GstGLMemory</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-wrapped" title="gst_gl_memory_wrapped ()">gst_gl_memory_wrapped</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglmemory.html" title="GstGLMemory">GstGLMemory</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-wrapped-texture" title="gst_gl_memory_wrapped_texture ()">gst_gl_memory_wrapped_texture</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglmemory.html" title="GstGLMemory">GstGLMemory</a>
-</dt>
-<dd></dd>
-<dt>
 <a class="link" href="gst-plugins-bad-libs-GstGLAPI.html#gst-gl-platform-from-string" title="gst_gl_platform_from_string ()">gst_gl_platform_from_string</a>, function in <a class="link" href="gst-plugins-bad-libs-GstGLAPI.html" title="GstGLAPI">GstGLAPI</a>
 </dt>
 <dd></dd>
@@ -915,74 +843,18 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shadervariables-parse" title="gst_gl_shadervariables_parse ()">gst_gl_shadervariables_parse</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">gstglshader</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shadervariable-desc" title="struct gst_gl_shadervariable_desc">gst_gl_shadervariable_desc</a>, struct in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">gstglshader</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shadervariable-set" title="gst_gl_shadervariable_set ()">gst_gl_shadervariable_set</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">gstglshader</a>
-</dt>
-<dd></dd>
-<dt>
 <a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-bind-attribute-location" title="gst_gl_shader_bind_attribute_location ()">gst_gl_shader_bind_attribute_location</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile" title="gst_gl_shader_compile ()">gst_gl_shader_compile</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile-all-with-attribs-and-check" title="gst_gl_shader_compile_all_with_attribs_and_check ()">gst_gl_shader_compile_all_with_attribs_and_check</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile-and-check" title="gst_gl_shader_compile_and_check ()">gst_gl_shader_compile_and_check</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile-with-default-f-and-check" title="gst_gl_shader_compile_with_default_f_and_check ()">gst_gl_shader_compile_with_default_f_and_check</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile-with-default-vf-and-check" title="gst_gl_shader_compile_with_default_vf_and_check ()">gst_gl_shader_compile_with_default_vf_and_check</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile-with-default-v-and-check" title="gst_gl_shader_compile_with_default_v_and_check ()">gst_gl_shader_compile_with_default_v_and_check</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#GST-GL-SHADER-ERROR:CAPS" title="GST_GL_SHADER_ERROR">GST_GL_SHADER_ERROR</a>, macro in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">gstglshader</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-error-quark" title="gst_gl_shader_error_quark ()">gst_gl_shader_error_quark</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">gstglshader</a>
-</dt>
-<dd></dd>
-<dt>
 <a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-get-attribute-location" title="gst_gl_shader_get_attribute_location ()">gst_gl_shader_get_attribute_location</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-get-fragment-source" title="gst_gl_shader_get_fragment_source ()">gst_gl_shader_get_fragment_source</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
-</dt>
-<dd></dd>
-<dt>
 <a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-get-program-handle" title="gst_gl_shader_get_program_handle ()">gst_gl_shader_get_program_handle</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-get-vertex-source" title="gst_gl_shader_get_vertex_source ()">gst_gl_shader_get_vertex_source</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-is-compiled" title="gst_gl_shader_is_compiled ()">gst_gl_shader_is_compiled</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
-</dt>
-<dd></dd>
-<dt>
 <a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-new" title="gst_gl_shader_new ()">gst_gl_shader_new</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
 </dt>
 <dd></dd>
@@ -991,14 +863,6 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-set-active" title="gst_gl_shader_set_active ()">gst_gl_shader_set_active</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-set-fragment-source" title="gst_gl_shader_set_fragment_source ()">gst_gl_shader_set_fragment_source</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
-</dt>
-<dd></dd>
-<dt>
 <a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-set-uniform-1f" title="gst_gl_shader_set_uniform_1f ()">gst_gl_shader_set_uniform_1f</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
 </dt>
 <dd></dd>
@@ -1099,10 +963,6 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-set-vertex-source" title="gst_gl_shader_set_vertex_source ()">gst_gl_shader_set_vertex_source</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
-</dt>
-<dd></dd>
-<dt>
 <a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-use" title="gst_gl_shader_use ()">gst_gl_shader_use</a>, function in <a class="link" href="gst-plugins-bad-libs-gstglshader.html" title="GstGLShader">GstGLShader</a>
 </dt>
 <dd></dd>
@@ -1131,22 +991,6 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="GstGLUploadMeta.html#gst-gl-upload-meta-add-to-buffer" title="gst_gl_upload_meta_add_to_buffer ()">gst_gl_upload_meta_add_to_buffer</a>, function in <a class="link" href="GstGLUploadMeta.html" title="GstGLUploadMeta">GstGLUploadMeta</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="GstGLUploadMeta.html#gst-gl-upload-meta-get-format" title="gst_gl_upload_meta_get_format ()">gst_gl_upload_meta_get_format</a>, function in <a class="link" href="GstGLUploadMeta.html" title="GstGLUploadMeta">GstGLUploadMeta</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="GstGLUploadMeta.html#gst-gl-upload-meta-new" title="gst_gl_upload_meta_new ()">gst_gl_upload_meta_new</a>, function in <a class="link" href="GstGLUploadMeta.html" title="GstGLUploadMeta">GstGLUploadMeta</a>
-</dt>
-<dd></dd>
-<dt>
-<a class="link" href="GstGLUploadMeta.html#gst-gl-upload-meta-set-format" title="gst_gl_upload_meta_set_format ()">gst_gl_upload_meta_set_format</a>, function in <a class="link" href="GstGLUploadMeta.html" title="GstGLUploadMeta">GstGLUploadMeta</a>
-</dt>
-<dd></dd>
-<dt>
 <a class="link" href="GstGLUpload.html#gst-gl-upload-new" title="gst_gl_upload_new ()">gst_gl_upload_new</a>, function in <a class="link" href="GstGLUpload.html" title="GstGLUpload">GstGLUpload</a>
 </dt>
 <dd></dd>
@@ -1159,10 +1003,6 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="GstGLUpload.html#gst-gl-upload-release-buffer" title="gst_gl_upload_release_buffer ()">gst_gl_upload_release_buffer</a>, function in <a class="link" href="GstGLUpload.html" title="GstGLUpload">GstGLUpload</a>
-</dt>
-<dd></dd>
-<dt>
 <a class="link" href="GstGLUpload.html#gst-gl-upload-set-caps" title="gst_gl_upload_set_caps ()">gst_gl_upload_set_caps</a>, function in <a class="link" href="GstGLUpload.html" title="GstGLUpload">GstGLUpload</a>
 </dt>
 <dd></dd>
@@ -1195,10 +1035,6 @@
 </dt>
 <dd></dd>
 <dt>
-<a class="link" href="GstGLWindow.html#gst-gl-window-draw-unlocked" title="gst_gl_window_draw_unlocked ()">gst_gl_window_draw_unlocked</a>, function in <a class="link" href="GstGLWindow.html" title="GstGLWindow">GstGLWindow</a>
-</dt>
-<dd></dd>
-<dt>
 <a class="link" href="GstGLWindow.html#GST-GL-WINDOW-ERROR:CAPS" title="GST_GL_WINDOW_ERROR">GST_GL_WINDOW_ERROR</a>, macro in <a class="link" href="GstGLWindow.html" title="GstGLWindow">GstGLWindow</a>
 </dt>
 <dd></dd>
@@ -2771,6 +2607,478 @@
 <a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GST-PHOTOGRAPHY-SHAKE-RISK:CAPS" title="GST_PHOTOGRAPHY_SHAKE_RISK">GST_PHOTOGRAPHY_SHAKE_RISK</a>, macro in <a class="link" href="gst-plugins-bad-libs-GstPhotography.html" title="GstPhotography">GstPhotography</a>
 </dt>
 <dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-struct" title="GstPlayer">GstPlayer</a>, struct in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-buffering" title="The “buffering” signal">GstPlayer::buffering</a>, object signal in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-duration-changed" title="The “duration-changed” signal">GstPlayer::duration-changed</a>, object signal in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-end-of-stream" title="The “end-of-stream” signal">GstPlayer::end-of-stream</a>, object signal in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-error" title="The “error” signal">GstPlayer::error</a>, object signal in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-media-info-updated" title="The “media-info-updated” signal">GstPlayer::media-info-updated</a>, object signal in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-mute-changed" title="The “mute-changed” signal">GstPlayer::mute-changed</a>, object signal in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-position-updated" title="The “position-updated” signal">GstPlayer::position-updated</a>, object signal in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-seek-done" title="The “seek-done” signal">GstPlayer::seek-done</a>, object signal in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-state-changed" title="The “state-changed” signal">GstPlayer::state-changed</a>, object signal in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-video-dimensions-changed" title="The “video-dimensions-changed” signal">GstPlayer::video-dimensions-changed</a>, object signal in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-volume-changed" title="The “volume-changed” signal">GstPlayer::volume-changed</a>, object signal in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-warning" title="The “warning” signal">GstPlayer::warning</a>, object signal in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--current-audio-track" title="The “current-audio-track” property">GstPlayer:current-audio-track</a>, object property in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--current-subtitle-track" title="The “current-subtitle-track” property">GstPlayer:current-subtitle-track</a>, object property in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--current-video-track" title="The “current-video-track” property">GstPlayer:current-video-track</a>, object property in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--duration" title="The “duration” property">GstPlayer:duration</a>, object property in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--media-info" title="The “media-info” property">GstPlayer:media-info</a>, object property in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--mute" title="The “mute” property">GstPlayer:mute</a>, object property in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--pipeline" title="The “pipeline” property">GstPlayer:pipeline</a>, object property in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--position" title="The “position” property">GstPlayer:position</a>, object property in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--position-update-interval" title="The “position-update-interval” property">GstPlayer:position-update-interval</a>, object property in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--rate" title="The “rate” property">GstPlayer:rate</a>, object property in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--signal-dispatcher" title="The “signal-dispatcher” property">GstPlayer:signal-dispatcher</a>, object property in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--suburi" title="The “suburi” property">GstPlayer:suburi</a>, object property in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--uri" title="The “uri” property">GstPlayer:uri</a>, object property in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--video-renderer" title="The “video-renderer” property">GstPlayer:video-renderer</a>, object property in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--volume" title="The “volume” property">GstPlayer:volume</a>, object property in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo-struct" title="GstPlayerAudioInfo">GstPlayerAudioInfo</a>, struct in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerColorBalanceType" title="enum GstPlayerColorBalanceType">GstPlayerColorBalanceType</a>, enum in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerError" title="enum GstPlayerError">GstPlayerError</a>, enum in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo-struct" title="GstPlayerMediaInfo">GstPlayerMediaInfo</a>, struct in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerSignalDispatcher-struct" title="GstPlayerSignalDispatcher">GstPlayerSignalDispatcher</a>, struct in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerSignalDispatcherInterface" title="struct GstPlayerSignalDispatcherInterface">GstPlayerSignalDispatcherInterface</a>, struct in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerState" title="enum GstPlayerState">GstPlayerState</a>, enum in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo-struct" title="GstPlayerStreamInfo">GstPlayerStreamInfo</a>, struct in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerSubtitleInfo-struct" title="GstPlayerSubtitleInfo">GstPlayerSubtitleInfo</a>, struct in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo-struct" title="GstPlayerVideoInfo">GstPlayerVideoInfo</a>, struct in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerVideoRenderer-struct" title="GstPlayerVideoRenderer">GstPlayerVideoRenderer</a>, struct in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerVideoRendererInterface" title="struct GstPlayerVideoRendererInterface">GstPlayerVideoRendererInterface</a>, struct in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#GstPlayerVisualization-struct" title="struct GstPlayerVisualization">GstPlayerVisualization</a>, struct in <a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html" title="gstplayer-visualization">gstplayer-visualization</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-audio-info-get-bitrate" title="gst_player_audio_info_get_bitrate ()">gst_player_audio_info_get_bitrate</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-audio-info-get-channels" title="gst_player_audio_info_get_channels ()">gst_player_audio_info_get_channels</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-audio-info-get-language" title="gst_player_audio_info_get_language ()">gst_player_audio_info_get_language</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-audio-info-get-max-bitrate" title="gst_player_audio_info_get_max_bitrate ()">gst_player_audio_info_get_max_bitrate</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-audio-info-get-sample-rate" title="gst_player_audio_info_get_sample_rate ()">gst_player_audio_info_get_sample_rate</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-color-balance-type-get-name" title="gst_player_color_balance_type_get_name ()">gst_player_color_balance_type_get_name</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-ERROR:CAPS" title="GST_PLAYER_ERROR">GST_PLAYER_ERROR</a>, macro in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-error-get-name" title="gst_player_error_get_name ()">gst_player_error_get_name</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-audio-streams" title="gst_player_get_audio_streams ()">gst_player_get_audio_streams</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-color-balance" title="gst_player_get_color_balance ()">gst_player_get_color_balance</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-current-audio-track" title="gst_player_get_current_audio_track ()">gst_player_get_current_audio_track</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-current-subtitle-track" title="gst_player_get_current_subtitle_track ()">gst_player_get_current_subtitle_track</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-current-video-track" title="gst_player_get_current_video_track ()">gst_player_get_current_video_track</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-current-visualization" title="gst_player_get_current_visualization ()">gst_player_get_current_visualization</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-duration" title="gst_player_get_duration ()">gst_player_get_duration</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-media-info" title="gst_player_get_media_info ()">gst_player_get_media_info</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-mute" title="gst_player_get_mute ()">gst_player_get_mute</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-pipeline" title="gst_player_get_pipeline ()">gst_player_get_pipeline</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-position" title="gst_player_get_position ()">gst_player_get_position</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-position-update-interval" title="gst_player_get_position_update_interval ()">gst_player_get_position_update_interval</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-rate" title="gst_player_get_rate ()">gst_player_get_rate</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-subtitle-streams" title="gst_player_get_subtitle_streams ()">gst_player_get_subtitle_streams</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-subtitle-uri" title="gst_player_get_subtitle_uri ()">gst_player_get_subtitle_uri</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-uri" title="gst_player_get_uri ()">gst_player_get_uri</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-video-streams" title="gst_player_get_video_streams ()">gst_player_get_video_streams</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-volume" title="gst_player_get_volume ()">gst_player_get_volume</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html#gst-player-g-main-context-signal-dispatcher-new" title="gst_player_g_main_context_signal_dispatcher_new ()">gst_player_g_main_context_signal_dispatcher_new</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html" title="gstplayer-gmaincontextsignaldispatcher">gstplayer-gmaincontextsignaldispatcher</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-has-color-balance" title="gst_player_has_color_balance ()">gst_player_has_color_balance</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-container-format" title="gst_player_media_info_get_container_format ()">gst_player_media_info_get_container_format</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-duration" title="gst_player_media_info_get_duration ()">gst_player_media_info_get_duration</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-image-sample" title="gst_player_media_info_get_image_sample ()">gst_player_media_info_get_image_sample</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-stream-list" title="gst_player_media_info_get_stream_list ()">gst_player_media_info_get_stream_list</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-tags" title="gst_player_media_info_get_tags ()">gst_player_media_info_get_tags</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-title" title="gst_player_media_info_get_title ()">gst_player_media_info_get_title</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-uri" title="gst_player_media_info_get_uri ()">gst_player_media_info_get_uri</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-is-seekable" title="gst_player_media_info_is_seekable ()">gst_player_media_info_is_seekable</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-new" title="gst_player_new ()">gst_player_new</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-new-full" title="gst_player_new_full ()">gst_player_new_full</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-pause" title="gst_player_pause ()">gst_player_pause</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-play" title="gst_player_play ()">gst_player_play</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-seek" title="gst_player_seek ()">gst_player_seek</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-audio-track" title="gst_player_set_audio_track ()">gst_player_set_audio_track</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-audio-track-enabled" title="gst_player_set_audio_track_enabled ()">gst_player_set_audio_track_enabled</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-color-balance" title="gst_player_set_color_balance ()">gst_player_set_color_balance</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-mute" title="gst_player_set_mute ()">gst_player_set_mute</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-position-update-interval" title="gst_player_set_position_update_interval ()">gst_player_set_position_update_interval</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-rate" title="gst_player_set_rate ()">gst_player_set_rate</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-subtitle-track" title="gst_player_set_subtitle_track ()">gst_player_set_subtitle_track</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-subtitle-track-enabled" title="gst_player_set_subtitle_track_enabled ()">gst_player_set_subtitle_track_enabled</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-subtitle-uri" title="gst_player_set_subtitle_uri ()">gst_player_set_subtitle_uri</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-uri" title="gst_player_set_uri ()">gst_player_set_uri</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-video-track" title="gst_player_set_video_track ()">gst_player_set_video_track</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-video-track-enabled" title="gst_player_set_video_track_enabled ()">gst_player_set_video_track_enabled</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-visualization" title="gst_player_set_visualization ()">gst_player_set_visualization</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-visualization-enabled" title="gst_player_set_visualization_enabled ()">gst_player_set_visualization_enabled</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-volume" title="gst_player_set_volume ()">gst_player_set_volume</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-state-get-name" title="gst_player_state_get_name ()">gst_player_state_get_name</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-stop" title="gst_player_stop ()">gst_player_stop</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">gstplayer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-stream-info-get-caps" title="gst_player_stream_info_get_caps ()">gst_player_stream_info_get_caps</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-stream-info-get-codec" title="gst_player_stream_info_get_codec ()">gst_player_stream_info_get_codec</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-stream-info-get-index" title="gst_player_stream_info_get_index ()">gst_player_stream_info_get_index</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-stream-info-get-stream-type" title="gst_player_stream_info_get_stream_type ()">gst_player_stream_info_get_stream_type</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-stream-info-get-tags" title="gst_player_stream_info_get_tags ()">gst_player_stream_info_get_tags</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-subtitle-info-get-language" title="gst_player_subtitle_info_get_language ()">gst_player_subtitle_info_get_language</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-bitrate" title="gst_player_video_info_get_bitrate ()">gst_player_video_info_get_bitrate</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-framerate" title="gst_player_video_info_get_framerate ()">gst_player_video_info_get_framerate</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-height" title="gst_player_video_info_get_height ()">gst_player_video_info_get_height</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-max-bitrate" title="gst_player_video_info_get_max_bitrate ()">gst_player_video_info_get_max_bitrate</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-pixel-aspect-ratio" title="gst_player_video_info_get_pixel_aspect_ratio ()">gst_player_video_info_get_pixel_aspect_ratio</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-width" title="gst_player_video_info_get_width ()">gst_player_video_info_get_width</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">gstplayer-mediainfo</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html#gst-player-video-overlay-video-renderer-get-window-handle" title="gst_player_video_overlay_video_renderer_get_window_handle ()">gst_player_video_overlay_video_renderer_get_window_handle</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html" title="gstplayer-videooverlayvideorenderer">gstplayer-videooverlayvideorenderer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html#gst-player-video-overlay-video-renderer-new" title="gst_player_video_overlay_video_renderer_new ()">gst_player_video_overlay_video_renderer_new</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html" title="gstplayer-videooverlayvideorenderer">gstplayer-videooverlayvideorenderer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html#gst-player-video-overlay-video-renderer-set-window-handle" title="gst_player_video_overlay_video_renderer_set_window_handle ()">gst_player_video_overlay_video_renderer_set_window_handle</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html" title="gstplayer-videooverlayvideorenderer">gstplayer-videooverlayvideorenderer</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#gst-player-visualizations-free" title="gst_player_visualizations_free ()">gst_player_visualizations_free</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html" title="gstplayer-visualization">gstplayer-visualization</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#gst-player-visualizations-get" title="gst_player_visualizations_get ()">gst_player_visualizations_get</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html" title="gstplayer-visualization">gstplayer-visualization</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#gst-player-visualization-copy" title="gst_player_visualization_copy ()">gst_player_visualization_copy</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html" title="gstplayer-visualization">gstplayer-visualization</a>
+</dt>
+<dd></dd>
+<dt>
+<a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#gst-player-visualization-free" title="gst_player_visualization_free ()">gst_player_visualization_free</a>, function in <a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html" title="gstplayer-visualization">gstplayer-visualization</a>
+</dt>
+<dd></dd>
 <a name="idxT"></a><h3 class="title">T</h3>
 <dt>
 GST_TYPE_CAMERABIN_MODE, macro in gstcamerabin-enum
diff --git a/docs/libs/html/ch07.html b/docs/libs/html/ch08.html
similarity index 84%
rename from docs/libs/html/ch07.html
rename to docs/libs/html/ch08.html
index b6170a0..7698ec2 100644
--- a/docs/libs/html/ch07.html
+++ b/docs/libs/html/ch08.html
@@ -6,7 +6,7 @@
 <meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
 <link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Library Reference Manual">
 <link rel="up" href="gstreamer-plugins-bad.html" title="Part I. GStreamer Bad Plugins Libraries">
-<link rel="prev" href="gst-plugins-bad-libs-GstGLWindowX11.html" title="GstGLWindowX11">
+<link rel="prev" href="gst-plugins-bad-libs-gstplayer-visualization.html" title="gstplayer-visualization">
 <link rel="next" href="gst-plugins-bad-libs-GstPhotography.html" title="GstPhotography">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
@@ -16,12 +16,12 @@
 <td width="100%" align="left" class="shortcuts"></td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="gstreamer-plugins-bad.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gst-plugins-bad-libs-GstGLWindowX11.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-libs-gstplayer-visualization.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="gst-plugins-bad-libs-GstPhotography.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="chapter">
 <div class="titlepage"><div><div><h2 class="title">
-<a name="id-1.2.10"></a>Interfaces</h2></div></div></div>
+<a name="id-1.2.11"></a>Interfaces</h2></div></div></div>
 <div class="toc"><dl class="toc"><dt>
 <span class="refentrytitle"><a href="gst-plugins-bad-libs-GstPhotography.html">GstPhotography</a></span><span class="refpurpose"> — Interface for digital image capture elements</span>
 </dt></dl></div>
diff --git a/docs/libs/html/gl.html b/docs/libs/html/gl.html
index 039616a..d0e1b06 100644
--- a/docs/libs/html/gl.html
+++ b/docs/libs/html/gl.html
@@ -54,9 +54,6 @@
 <span class="refentrytitle"><a href="GstGLDisplay.html">GstGLDisplay</a></span><span class="refpurpose"> — window system display connection abstraction</span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="GstGLDownload.html">GstGLDownload</a></span><span class="refpurpose"> — an object that downloads GL textures</span>
-</dt>
-<dt>
 <span class="refentrytitle"><a href="gst-plugins-bad-libs-GstEGLImageMemory.html">GstEGLImageMemory</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
@@ -81,9 +78,6 @@
 <span class="refentrytitle"><a href="GstGLUpload.html">GstGLUpload</a></span><span class="refpurpose"> — an object that uploads to GL textures</span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="GstGLUploadMeta.html">GstGLUploadMeta</a></span><span class="refpurpose"> — an object that provides <span class="type">GstVideoGLTextureUploadMeta</span></span>
-</dt>
-<dt>
 <span class="refentrytitle"><a href="gst-plugins-bad-libs-Utilities.html">Utilities</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
diff --git a/docs/libs/html/gst-plugins-bad-libs-1.0.devhelp2 b/docs/libs/html/gst-plugins-bad-libs-1.0.devhelp2
index 8cb0c8b..5377a28 100644
--- a/docs/libs/html/gst-plugins-bad-libs-1.0.devhelp2
+++ b/docs/libs/html/gst-plugins-bad-libs-1.0.devhelp2
@@ -43,7 +43,6 @@
         <sub name="GstGLContextGLX" link="gst-plugins-bad-libs-GstGLContextGLX.html"/>
         <sub name="GstGLContextWGL" link="gst-plugins-bad-libs-GstGLContextWGL.html"/>
         <sub name="GstGLDisplay" link="GstGLDisplay.html"/>
-        <sub name="GstGLDownload" link="GstGLDownload.html"/>
         <sub name="GstEGLImageMemory" link="gst-plugins-bad-libs-GstEGLImageMemory.html"/>
         <sub name="GstGLBaseFilter" link="GstGLBaseFilter.html"/>
         <sub name="GstGLFilter" link="GstGLFilter.html"/>
@@ -52,7 +51,6 @@
         <sub name="GstGLShader" link="gst-plugins-bad-libs-gstglshader.html"/>
         <sub name="GstGLSyncMeta" link="gst-plugins-bad-libs-GstGLSyncMeta.html"/>
         <sub name="GstGLUpload" link="GstGLUpload.html"/>
-        <sub name="GstGLUploadMeta" link="GstGLUploadMeta.html"/>
         <sub name="Utilities" link="gst-plugins-bad-libs-Utilities.html"/>
         <sub name="GstGLWindow" link="GstGLWindow.html"/>
         <sub name="GstGLWindowAndroid" link="gst-plugins-bad-libs-GstGLWindowAndroid.html"/>
@@ -62,7 +60,14 @@
         <sub name="GstGLWindowWin32" link="gst-plugins-bad-libs-GstGLWindowWin32.html"/>
         <sub name="GstGLWindowX11" link="gst-plugins-bad-libs-GstGLWindowX11.html"/>
       </sub>
-      <sub name="Interfaces" link="ch07.html">
+      <sub name="Player Library" link="player.html">
+        <sub name="gstplayer" link="gst-plugins-bad-libs-gstplayer.html"/>
+        <sub name="gstplayer-mediainfo" link="gst-plugins-bad-libs-gstplayer-mediainfo.html"/>
+        <sub name="gstplayer-gmaincontextsignaldispatcher" link="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html"/>
+        <sub name="gstplayer-videooverlayvideorenderer" link="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html"/>
+        <sub name="gstplayer-visualization" link="gst-plugins-bad-libs-gstplayer-visualization.html"/>
+      </sub>
+      <sub name="Interfaces" link="ch08.html">
         <sub name="GstPhotography" link="gst-plugins-bad-libs-GstPhotography.html"/>
       </sub>
     </sub>
@@ -441,8 +446,8 @@
     <keyword type="macro" name="GST_GL_API_OPENGL3_NAME" link="gst-plugins-bad-libs-GstGLAPI.html#GST-GL-API-OPENGL3-NAME:CAPS"/>
     <keyword type="macro" name="GST_GL_API_OPENGL_NAME" link="gst-plugins-bad-libs-GstGLAPI.html#GST-GL-API-OPENGL-NAME:CAPS"/>
     <keyword type="function" name="gst_gl_buffer_pool_new ()" link="GstGLBufferPool.html#gst-gl-buffer-pool-new"/>
-    <keyword type="struct" name="struct GstGLBufferPool" link="GstGLBufferPool.html#GstGLBufferPool-struct"/>
-    <keyword type="struct" name="struct GstGLBufferPoolClass" link="GstGLBufferPool.html#GstGLBufferPoolClass"/>
+    <keyword type="struct" name="GstGLBufferPool" link="GstGLBufferPool.html#GstGLBufferPool-struct"/>
+    <keyword type="struct" name="GstGLBufferPoolClass" link="GstGLBufferPool.html#GstGLBufferPoolClass"/>
     <keyword type="function" name="gst_gl_color_convert_new ()" link="GstGLColorConvert.html#gst-gl-color-convert-new"/>
     <keyword type="function" name="gst_gl_color_convert_set_caps ()" link="GstGLColorConvert.html#gst-gl-color-convert-set-caps"/>
     <keyword type="function" name="gst_gl_color_convert_transform_caps ()" link="GstGLColorConvert.html#gst-gl-color-convert-transform-caps"/>
@@ -511,11 +516,6 @@
     <keyword type="enum" name="enum GstGLDisplayType" link="GstGLDisplay.html#GstGLDisplayType"/>
     <keyword type="struct" name="GstGLDisplay" link="GstGLDisplay.html#GstGLDisplay-struct"/>
     <keyword type="signal" name="The “create-context” signal" link="GstGLDisplay.html#GstGLDisplay-create-context"/>
-    <keyword type="function" name="gst_gl_download_new ()" link="GstGLDownload.html#gst-gl-download-new"/>
-    <keyword type="function" name="gst_gl_download_set_format ()" link="GstGLDownload.html#gst-gl-download-set-format"/>
-    <keyword type="function" name="gst_gl_download_transform_caps ()" link="GstGLDownload.html#gst-gl-download-transform-caps"/>
-    <keyword type="function" name="gst_gl_download_perform_with_data ()" link="GstGLDownload.html#gst-gl-download-perform-with-data"/>
-    <keyword type="struct" name="GstGLDownload" link="GstGLDownload.html#GstGLDownload-struct"/>
     <keyword type="function" name="gst_egl_image_memory_init ()" link="gst-plugins-bad-libs-GstEGLImageMemory.html#gst-egl-image-memory-init"/>
     <keyword type="function" name="gst_egl_image_memory_get_display ()" link="gst-plugins-bad-libs-GstEGLImageMemory.html#gst-egl-image-memory-get-display"/>
     <keyword type="function" name="gst_egl_image_memory_get_image ()" link="gst-plugins-bad-libs-GstEGLImageMemory.html#gst-egl-image-memory-get-image"/>
@@ -540,37 +540,14 @@
     <keyword type="function" name="gst_gl_framebuffer_use_v2 ()" link="GstGLFramebuffer.html#gst-gl-framebuffer-use-v2"/>
     <keyword type="struct" name="struct GstGLFramebuffer" link="GstGLFramebuffer.html#GstGLFramebuffer-struct"/>
     <keyword type="struct" name="struct GstGLFramebufferClass" link="GstGLFramebuffer.html#GstGLFramebufferClass"/>
+    <keyword type="macro" name="GST_GL_MEMORY_ALLOCATOR()" link="gst-plugins-bad-libs-gstglmemory.html#GST-GL-MEMORY-ALLOCATOR:CAPS"/>
     <keyword type="function" name="gst_gl_memory_init ()" link="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-init"/>
-    <keyword type="function" name="gst_gl_memory_alloc ()" link="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-alloc"/>
-    <keyword type="function" name="gst_gl_memory_wrapped ()" link="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-wrapped"/>
-    <keyword type="function" name="gst_gl_memory_wrapped_texture ()" link="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-wrapped-texture"/>
-    <keyword type="function" name="gst_gl_memory_copy_into_texture ()" link="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-copy-into-texture"/>
     <keyword type="function" name="gst_gl_memory_setup_buffer ()" link="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-setup-buffer"/>
-    <keyword type="function" name="gst_gl_memory_setup_wrapped ()" link="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-setup-wrapped"/>
     <keyword type="function" name="gst_gl_texture_type_from_format ()" link="gst-plugins-bad-libs-gstglmemory.html#gst-gl-texture-type-from-format"/>
     <keyword type="function" name="gst_is_gl_memory ()" link="gst-plugins-bad-libs-gstglmemory.html#gst-is-gl-memory"/>
-    <keyword type="struct" name="GstGLAllocator" link="gst-plugins-bad-libs-gstglmemory.html#GstGLAllocator-struct"/>
-    <keyword type="struct" name="GstGLAllocatorClass" link="gst-plugins-bad-libs-gstglmemory.html#GstGLAllocatorClass"/>
-    <keyword type="macro" name="GST_GL_MEMORY_ALLOCATOR" link="gst-plugins-bad-libs-gstglmemory.html#GST-GL-MEMORY-ALLOCATOR:CAPS"/>
     <keyword type="struct" name="GstGLMemory" link="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory"/>
-    <keyword type="function" name="gst_gl_shader_error_quark ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-error-quark"/>
-    <keyword type="macro" name="GST_GL_SHADER_ERROR" link="gst-plugins-bad-libs-gstglshader.html#GST-GL-SHADER-ERROR:CAPS"/>
-    <keyword type="function" name="gst_gl_shadervariable_set ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shadervariable-set"/>
-    <keyword type="function" name="gst_gl_shadervariables_parse ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shadervariables-parse"/>
     <keyword type="function" name="gst_gl_shader_new ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-new"/>
-    <keyword type="function" name="gst_gl_shader_set_vertex_source ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-set-vertex-source"/>
-    <keyword type="function" name="gst_gl_shader_set_fragment_source ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-set-fragment-source"/>
-    <keyword type="function" name="gst_gl_shader_get_vertex_source ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-get-vertex-source"/>
-    <keyword type="function" name="gst_gl_shader_get_fragment_source ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-get-fragment-source"/>
     <keyword type="function" name="gst_gl_shader_get_program_handle ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-get-program-handle"/>
-    <keyword type="function" name="gst_gl_shader_set_active ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-set-active"/>
-    <keyword type="function" name="gst_gl_shader_is_compiled ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-is-compiled"/>
-    <keyword type="function" name="gst_gl_shader_compile ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile"/>
-    <keyword type="function" name="gst_gl_shader_compile_and_check ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile-and-check"/>
-    <keyword type="function" name="gst_gl_shader_compile_all_with_attribs_and_check ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile-all-with-attribs-and-check"/>
-    <keyword type="function" name="gst_gl_shader_compile_with_default_f_and_check ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile-with-default-f-and-check"/>
-    <keyword type="function" name="gst_gl_shader_compile_with_default_v_and_check ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile-with-default-v-and-check"/>
-    <keyword type="function" name="gst_gl_shader_compile_with_default_vf_and_check ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile-with-default-vf-and-check"/>
     <keyword type="function" name="gst_gl_shader_release ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-release"/>
     <keyword type="function" name="gst_gl_shader_use ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-use"/>
     <keyword type="function" name="gst_gl_shader_set_uniform_1i ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-set-uniform-1i"/>
@@ -600,14 +577,8 @@
     <keyword type="function" name="gst_gl_shader_set_uniform_matrix_4x3fv ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-set-uniform-matrix-4x3fv"/>
     <keyword type="function" name="gst_gl_shader_get_attribute_location ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-get-attribute-location"/>
     <keyword type="function" name="gst_gl_shader_bind_attribute_location ()" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-bind-attribute-location"/>
-    <keyword type="enum" name="enum GstGLShaderError" link="gst-plugins-bad-libs-gstglshader.html#GstGLShaderError"/>
-    <keyword type="enum" name="enum GstGLShaderSourceType" link="gst-plugins-bad-libs-gstglshader.html#GstGLShaderSourceType"/>
-    <keyword type="struct" name="struct gst_gl_shadervariable_desc" link="gst-plugins-bad-libs-gstglshader.html#gst-gl-shadervariable-desc"/>
     <keyword type="struct" name="GstGLShader" link="gst-plugins-bad-libs-gstglshader.html#GstGLShader-struct"/>
-    <keyword type="property" name="The “active” property" link="gst-plugins-bad-libs-gstglshader.html#GstGLShader--active"/>
-    <keyword type="property" name="The “compiled” property" link="gst-plugins-bad-libs-gstglshader.html#GstGLShader--compiled"/>
-    <keyword type="property" name="The “fragment-src” property" link="gst-plugins-bad-libs-gstglshader.html#GstGLShader--fragment-src"/>
-    <keyword type="property" name="The “vertex-src” property" link="gst-plugins-bad-libs-gstglshader.html#GstGLShader--vertex-src"/>
+    <keyword type="property" name="The “linked” property" link="gst-plugins-bad-libs-gstglshader.html#GstGLShader--linked"/>
     <keyword type="function" name="gst_buffer_add_gl_sync_meta ()" link="gst-plugins-bad-libs-GstGLSyncMeta.html#gst-buffer-add-gl-sync-meta"/>
     <keyword type="macro" name="gst_buffer_get_gl_sync_meta()" link="gst-plugins-bad-libs-GstGLSyncMeta.html#gst-buffer-get-gl-sync-meta"/>
     <keyword type="function" name="gst_gl_sync_meta_api_get_type ()" link="gst-plugins-bad-libs-GstGLSyncMeta.html#gst-gl-sync-meta-api-get-type"/>
@@ -622,13 +593,7 @@
     <keyword type="function" name="gst_gl_upload_propose_allocation ()" link="GstGLUpload.html#gst-gl-upload-propose-allocation"/>
     <keyword type="function" name="gst_gl_upload_transform_caps ()" link="GstGLUpload.html#gst-gl-upload-transform-caps"/>
     <keyword type="function" name="gst_gl_upload_perform_with_buffer ()" link="GstGLUpload.html#gst-gl-upload-perform-with-buffer"/>
-    <keyword type="function" name="gst_gl_upload_release_buffer ()" link="GstGLUpload.html#gst-gl-upload-release-buffer"/>
     <keyword type="struct" name="GstGLUpload" link="GstGLUpload.html#GstGLUpload-struct"/>
-    <keyword type="function" name="gst_gl_upload_meta_new ()" link="GstGLUploadMeta.html#gst-gl-upload-meta-new"/>
-    <keyword type="function" name="gst_gl_upload_meta_set_format ()" link="GstGLUploadMeta.html#gst-gl-upload-meta-set-format"/>
-    <keyword type="function" name="gst_gl_upload_meta_get_format ()" link="GstGLUploadMeta.html#gst-gl-upload-meta-get-format"/>
-    <keyword type="function" name="gst_gl_upload_meta_add_to_buffer ()" link="GstGLUploadMeta.html#gst-gl-upload-meta-add-to-buffer"/>
-    <keyword type="struct" name="GstGLUploadMeta" link="GstGLUploadMeta.html#GstGLUploadMeta-struct"/>
     <keyword type="function" name="GLCB ()" link="gst-plugins-bad-libs-Utilities.html#GLCB:CAPS"/>
     <keyword type="function" name="GLCB_V2 ()" link="gst-plugins-bad-libs-Utilities.html#GLCB-V2:CAPS"/>
     <keyword type="function" name="CDCB ()" link="gst-plugins-bad-libs-Utilities.html#CDCB:CAPS"/>
@@ -659,7 +624,6 @@
     <keyword type="macro" name="GST_GL_WINDOW_CB()" link="GstGLWindow.html#GST-GL-WINDOW-CB:CAPS"/>
     <keyword type="function" name="gst_gl_window_new ()" link="GstGLWindow.html#gst-gl-window-new" since="1.4"/>
     <keyword type="function" name="gst_gl_window_draw ()" link="GstGLWindow.html#gst-gl-window-draw" since="1.4"/>
-    <keyword type="function" name="gst_gl_window_draw_unlocked ()" link="GstGLWindow.html#gst-gl-window-draw-unlocked" since="1.4"/>
     <keyword type="function" name="gst_gl_window_is_running ()" link="GstGLWindow.html#gst-gl-window-is-running" since="1.4"/>
     <keyword type="function" name="gst_gl_window_quit ()" link="GstGLWindow.html#gst-gl-window-quit" since="1.4"/>
     <keyword type="function" name="gst_gl_window_run ()" link="GstGLWindow.html#gst-gl-window-run" since="1.4"/>
@@ -704,6 +668,124 @@
     <keyword type="function" name="gst_gl_window_x11_untrap_x_errors ()" link="gst-plugins-bad-libs-GstGLWindowX11.html#gst-gl-window-x11-untrap-x-errors"/>
     <keyword type="struct" name="struct GstGLWindowX11" link="gst-plugins-bad-libs-GstGLWindowX11.html#GstGLWindowX11"/>
     <keyword type="struct" name="struct GstGLWindowX11Class" link="gst-plugins-bad-libs-GstGLWindowX11.html#GstGLWindowX11Class"/>
+    <keyword type="function" name="gst_player_new ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-new"/>
+    <keyword type="function" name="gst_player_new_full ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-new-full"/>
+    <keyword type="function" name="gst_player_play ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-play"/>
+    <keyword type="function" name="gst_player_pause ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-pause"/>
+    <keyword type="function" name="gst_player_stop ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-stop"/>
+    <keyword type="function" name="gst_player_seek ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-seek"/>
+    <keyword type="function" name="gst_player_set_uri ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-set-uri"/>
+    <keyword type="function" name="gst_player_get_uri ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-uri"/>
+    <keyword type="function" name="gst_player_get_duration ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-duration"/>
+    <keyword type="function" name="gst_player_get_position ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-position"/>
+    <keyword type="function" name="gst_player_set_volume ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-set-volume"/>
+    <keyword type="function" name="gst_player_set_mute ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-set-mute"/>
+    <keyword type="function" name="gst_player_get_volume ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-volume"/>
+    <keyword type="function" name="gst_player_get_mute ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-mute"/>
+    <keyword type="function" name="gst_player_get_pipeline ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-pipeline"/>
+    <keyword type="function" name="gst_player_set_position_update_interval ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-set-position-update-interval"/>
+    <keyword type="function" name="gst_player_get_position_update_interval ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-position-update-interval"/>
+    <keyword type="function" name="gst_player_state_get_name ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-state-get-name"/>
+    <keyword type="macro" name="GST_PLAYER_ERROR" link="gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-ERROR:CAPS"/>
+    <keyword type="function" name="gst_player_error_get_name ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-error-get-name"/>
+    <keyword type="function" name="gst_player_get_media_info ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-media-info"/>
+    <keyword type="function" name="gst_player_get_audio_streams ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-audio-streams"/>
+    <keyword type="function" name="gst_player_get_video_streams ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-video-streams"/>
+    <keyword type="function" name="gst_player_get_subtitle_streams ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-subtitle-streams"/>
+    <keyword type="function" name="gst_player_set_audio_track ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-set-audio-track"/>
+    <keyword type="function" name="gst_player_set_video_track ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-set-video-track"/>
+    <keyword type="function" name="gst_player_set_subtitle_track ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-set-subtitle-track"/>
+    <keyword type="function" name="gst_player_get_current_audio_track ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-current-audio-track"/>
+    <keyword type="function" name="gst_player_get_current_video_track ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-current-video-track"/>
+    <keyword type="function" name="gst_player_get_current_subtitle_track ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-current-subtitle-track"/>
+    <keyword type="function" name="gst_player_set_audio_track_enabled ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-set-audio-track-enabled"/>
+    <keyword type="function" name="gst_player_set_video_track_enabled ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-set-video-track-enabled"/>
+    <keyword type="function" name="gst_player_set_subtitle_track_enabled ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-set-subtitle-track-enabled"/>
+    <keyword type="function" name="gst_player_set_subtitle_uri ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-set-subtitle-uri"/>
+    <keyword type="function" name="gst_player_get_subtitle_uri ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-subtitle-uri"/>
+    <keyword type="function" name="gst_player_set_visualization ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-set-visualization"/>
+    <keyword type="function" name="gst_player_set_visualization_enabled ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-set-visualization-enabled"/>
+    <keyword type="function" name="gst_player_get_current_visualization ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-current-visualization"/>
+    <keyword type="function" name="gst_player_color_balance_type_get_name ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-color-balance-type-get-name"/>
+    <keyword type="function" name="gst_player_has_color_balance ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-has-color-balance"/>
+    <keyword type="function" name="gst_player_set_color_balance ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-set-color-balance"/>
+    <keyword type="function" name="gst_player_get_color_balance ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-color-balance"/>
+    <keyword type="function" name="gst_player_get_rate ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-get-rate"/>
+    <keyword type="function" name="gst_player_set_rate ()" link="gst-plugins-bad-libs-gstplayer.html#gst-player-set-rate"/>
+    <keyword type="struct" name="GstPlayer" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer-struct"/>
+    <keyword type="enum" name="enum GstPlayerState" link="gst-plugins-bad-libs-gstplayer.html#GstPlayerState"/>
+    <keyword type="enum" name="enum GstPlayerError" link="gst-plugins-bad-libs-gstplayer.html#GstPlayerError"/>
+    <keyword type="enum" name="enum GstPlayerColorBalanceType" link="gst-plugins-bad-libs-gstplayer.html#GstPlayerColorBalanceType"/>
+    <keyword type="struct" name="GstPlayerSignalDispatcher" link="gst-plugins-bad-libs-gstplayer.html#GstPlayerSignalDispatcher-struct"/>
+    <keyword type="struct" name="struct GstPlayerSignalDispatcherInterface" link="gst-plugins-bad-libs-gstplayer.html#GstPlayerSignalDispatcherInterface"/>
+    <keyword type="struct" name="GstPlayerVideoRenderer" link="gst-plugins-bad-libs-gstplayer.html#GstPlayerVideoRenderer-struct"/>
+    <keyword type="struct" name="struct GstPlayerVideoRendererInterface" link="gst-plugins-bad-libs-gstplayer.html#GstPlayerVideoRendererInterface"/>
+    <keyword type="property" name="The “current-audio-track” property" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer--current-audio-track"/>
+    <keyword type="property" name="The “current-subtitle-track” property" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer--current-subtitle-track"/>
+    <keyword type="property" name="The “current-video-track” property" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer--current-video-track"/>
+    <keyword type="property" name="The “duration” property" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer--duration"/>
+    <keyword type="property" name="The “media-info” property" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer--media-info"/>
+    <keyword type="property" name="The “mute” property" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer--mute"/>
+    <keyword type="property" name="The “pipeline” property" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer--pipeline"/>
+    <keyword type="property" name="The “position” property" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer--position"/>
+    <keyword type="property" name="The “position-update-interval” property" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer--position-update-interval"/>
+    <keyword type="property" name="The “rate” property" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer--rate"/>
+    <keyword type="property" name="The “signal-dispatcher” property" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer--signal-dispatcher"/>
+    <keyword type="property" name="The “suburi” property" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer--suburi"/>
+    <keyword type="property" name="The “uri” property" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer--uri"/>
+    <keyword type="property" name="The “video-renderer” property" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer--video-renderer"/>
+    <keyword type="property" name="The “volume” property" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer--volume"/>
+    <keyword type="signal" name="The “buffering” signal" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer-buffering"/>
+    <keyword type="signal" name="The “duration-changed” signal" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer-duration-changed"/>
+    <keyword type="signal" name="The “end-of-stream” signal" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer-end-of-stream"/>
+    <keyword type="signal" name="The “error” signal" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer-error"/>
+    <keyword type="signal" name="The “media-info-updated” signal" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer-media-info-updated"/>
+    <keyword type="signal" name="The “mute-changed” signal" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer-mute-changed"/>
+    <keyword type="signal" name="The “position-updated” signal" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer-position-updated"/>
+    <keyword type="signal" name="The “seek-done” signal" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer-seek-done"/>
+    <keyword type="signal" name="The “state-changed” signal" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer-state-changed"/>
+    <keyword type="signal" name="The “video-dimensions-changed” signal" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer-video-dimensions-changed"/>
+    <keyword type="signal" name="The “volume-changed” signal" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer-volume-changed"/>
+    <keyword type="signal" name="The “warning” signal" link="gst-plugins-bad-libs-gstplayer.html#GstPlayer-warning"/>
+    <keyword type="function" name="gst_player_media_info_get_uri ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-uri"/>
+    <keyword type="function" name="gst_player_media_info_get_duration ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-duration"/>
+    <keyword type="function" name="gst_player_media_info_get_title ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-title"/>
+    <keyword type="function" name="gst_player_media_info_get_container_format ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-container-format"/>
+    <keyword type="function" name="gst_player_media_info_is_seekable ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-is-seekable"/>
+    <keyword type="function" name="gst_player_media_info_get_image_sample ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-image-sample"/>
+    <keyword type="function" name="gst_player_media_info_get_tags ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-tags"/>
+    <keyword type="function" name="gst_player_media_info_get_stream_list ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-stream-list"/>
+    <keyword type="function" name="gst_player_stream_info_get_index ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-stream-info-get-index"/>
+    <keyword type="function" name="gst_player_stream_info_get_caps ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-stream-info-get-caps"/>
+    <keyword type="function" name="gst_player_stream_info_get_tags ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-stream-info-get-tags"/>
+    <keyword type="function" name="gst_player_stream_info_get_codec ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-stream-info-get-codec"/>
+    <keyword type="function" name="gst_player_stream_info_get_stream_type ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-stream-info-get-stream-type"/>
+    <keyword type="function" name="gst_player_audio_info_get_bitrate ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-audio-info-get-bitrate"/>
+    <keyword type="function" name="gst_player_audio_info_get_channels ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-audio-info-get-channels"/>
+    <keyword type="function" name="gst_player_audio_info_get_language ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-audio-info-get-language"/>
+    <keyword type="function" name="gst_player_audio_info_get_max_bitrate ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-audio-info-get-max-bitrate"/>
+    <keyword type="function" name="gst_player_audio_info_get_sample_rate ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-audio-info-get-sample-rate"/>
+    <keyword type="function" name="gst_player_video_info_get_bitrate ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-bitrate"/>
+    <keyword type="function" name="gst_player_video_info_get_height ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-height"/>
+    <keyword type="function" name="gst_player_video_info_get_width ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-width"/>
+    <keyword type="function" name="gst_player_video_info_get_framerate ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-framerate"/>
+    <keyword type="function" name="gst_player_video_info_get_max_bitrate ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-max-bitrate"/>
+    <keyword type="function" name="gst_player_video_info_get_pixel_aspect_ratio ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-pixel-aspect-ratio"/>
+    <keyword type="function" name="gst_player_subtitle_info_get_language ()" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-subtitle-info-get-language"/>
+    <keyword type="struct" name="GstPlayerMediaInfo" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo-struct"/>
+    <keyword type="struct" name="GstPlayerStreamInfo" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo-struct"/>
+    <keyword type="struct" name="GstPlayerAudioInfo" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo-struct"/>
+    <keyword type="struct" name="GstPlayerVideoInfo" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo-struct"/>
+    <keyword type="struct" name="GstPlayerSubtitleInfo" link="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerSubtitleInfo-struct"/>
+    <keyword type="function" name="gst_player_g_main_context_signal_dispatcher_new ()" link="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html#gst-player-g-main-context-signal-dispatcher-new"/>
+    <keyword type="function" name="gst_player_video_overlay_video_renderer_new ()" link="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html#gst-player-video-overlay-video-renderer-new"/>
+    <keyword type="function" name="gst_player_video_overlay_video_renderer_get_window_handle ()" link="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html#gst-player-video-overlay-video-renderer-get-window-handle"/>
+    <keyword type="function" name="gst_player_video_overlay_video_renderer_set_window_handle ()" link="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html#gst-player-video-overlay-video-renderer-set-window-handle"/>
+    <keyword type="function" name="gst_player_visualizations_get ()" link="gst-plugins-bad-libs-gstplayer-visualization.html#gst-player-visualizations-get"/>
+    <keyword type="function" name="gst_player_visualizations_free ()" link="gst-plugins-bad-libs-gstplayer-visualization.html#gst-player-visualizations-free"/>
+    <keyword type="function" name="gst_player_visualization_copy ()" link="gst-plugins-bad-libs-gstplayer-visualization.html#gst-player-visualization-copy"/>
+    <keyword type="function" name="gst_player_visualization_free ()" link="gst-plugins-bad-libs-gstplayer-visualization.html#gst-player-visualization-free"/>
+    <keyword type="struct" name="struct GstPlayerVisualization" link="gst-plugins-bad-libs-gstplayer-visualization.html#GstPlayerVisualization-struct"/>
     <keyword type="function" name="GstPhotographyCapturePrepared ()" link="gst-plugins-bad-libs-GstPhotography.html#GstPhotographyCapturePrepared"/>
     <keyword type="function" name="gst_photography_get_ev_compensation ()" link="gst-plugins-bad-libs-GstPhotography.html#gst-photography-get-ev-compensation"/>
     <keyword type="function" name="gst_photography_get_iso_speed ()" link="gst-plugins-bad-libs-GstPhotography.html#gst-photography-get-iso-speed"/>
@@ -1463,16 +1545,20 @@
     <keyword type="constant" name="GST_GL_DISPLAY_TYPE_DISPMANX" link="GstGLDisplay.html#GST-GL-DISPLAY-TYPE-DISPMANX:CAPS"/>
     <keyword type="constant" name="GST_GL_DISPLAY_TYPE_EGL" link="GstGLDisplay.html#GST-GL-DISPLAY-TYPE-EGL:CAPS"/>
     <keyword type="constant" name="GST_GL_DISPLAY_TYPE_ANY" link="GstGLDisplay.html#GST-GL-DISPLAY-TYPE-ANY:CAPS"/>
-    <keyword type="constant" name="GST_GL_SHADER_ERROR_COMPILE" link="gst-plugins-bad-libs-gstglshader.html#GST-GL-SHADER-ERROR-COMPILE:CAPS"/>
-    <keyword type="constant" name="GST_GL_SHADER_ERROR_LINK" link="gst-plugins-bad-libs-gstglshader.html#GST-GL-SHADER-ERROR-LINK:CAPS"/>
-    <keyword type="constant" name="GST_GL_SHADER_ERROR_PROGRAM" link="gst-plugins-bad-libs-gstglshader.html#GST-GL-SHADER-ERROR-PROGRAM:CAPS"/>
-    <keyword type="constant" name="GST_GL_SHADER_FRAGMENT_SOURCE" link="gst-plugins-bad-libs-gstglshader.html#GST-GL-SHADER-FRAGMENT-SOURCE:CAPS"/>
-    <keyword type="constant" name="GST_GL_SHADER_VERTEX_SOURCE" link="gst-plugins-bad-libs-gstglshader.html#GST-GL-SHADER-VERTEX-SOURCE:CAPS"/>
     <keyword type="constant" name="GST_GL_DISPLAY_PROJECTION_ORTHO2D" link="gst-plugins-bad-libs-Utilities.html#GST-GL-DISPLAY-PROJECTION-ORTHO2D:CAPS"/>
     <keyword type="constant" name="GST_GL_DISPLAY_PROJECTION_PERSPECTIVE" link="gst-plugins-bad-libs-Utilities.html#GST-GL-DISPLAY-PROJECTION-PERSPECTIVE:CAPS"/>
     <keyword type="constant" name="GST_GL_WINDOW_ERROR_FAILED" link="GstGLWindow.html#GST-GL-WINDOW-ERROR-FAILED:CAPS"/>
     <keyword type="constant" name="GST_GL_WINDOW_ERROR_OLD_LIBS" link="GstGLWindow.html#GST-GL-WINDOW-ERROR-OLD-LIBS:CAPS"/>
     <keyword type="constant" name="GST_GL_WINDOW_ERROR_RESOURCE_UNAVAILABLE" link="GstGLWindow.html#GST-GL-WINDOW-ERROR-RESOURCE-UNAVAILABLE:CAPS"/>
+    <keyword type="constant" name="GST_PLAYER_STATE_STOPPED" link="gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-STATE-STOPPED:CAPS"/>
+    <keyword type="constant" name="GST_PLAYER_STATE_BUFFERING" link="gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-STATE-BUFFERING:CAPS"/>
+    <keyword type="constant" name="GST_PLAYER_STATE_PAUSED" link="gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-STATE-PAUSED:CAPS"/>
+    <keyword type="constant" name="GST_PLAYER_STATE_PLAYING" link="gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-STATE-PLAYING:CAPS"/>
+    <keyword type="constant" name="GST_PLAYER_ERROR_FAILED" link="gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-ERROR-FAILED:CAPS"/>
+    <keyword type="constant" name="GST_PLAYER_COLOR_BALANCE_BRIGHTNESS" link="gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-COLOR-BALANCE-BRIGHTNESS:CAPS"/>
+    <keyword type="constant" name="GST_PLAYER_COLOR_BALANCE_CONTRAST" link="gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-COLOR-BALANCE-CONTRAST:CAPS"/>
+    <keyword type="constant" name="GST_PLAYER_COLOR_BALANCE_SATURATION" link="gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-COLOR-BALANCE-SATURATION:CAPS"/>
+    <keyword type="constant" name="GST_PLAYER_COLOR_BALANCE_HUE" link="gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-COLOR-BALANCE-HUE:CAPS"/>
     <keyword type="constant" name="GST_PHOTOGRAPHY_NOISE_REDUCTION_BAYER" link="gst-plugins-bad-libs-GstPhotography.html#GST-PHOTOGRAPHY-NOISE-REDUCTION-BAYER:CAPS"/>
     <keyword type="constant" name="GST_PHOTOGRAPHY_NOISE_REDUCTION_YCC" link="gst-plugins-bad-libs-GstPhotography.html#GST-PHOTOGRAPHY-NOISE-REDUCTION-YCC:CAPS"/>
     <keyword type="constant" name="GST_PHOTOGRAPHY_NOISE_REDUCTION_TEMPORAL" link="gst-plugins-bad-libs-GstPhotography.html#GST-PHOTOGRAPHY-NOISE-REDUCTION-TEMPORAL:CAPS"/>
diff --git a/docs/libs/html/gst-plugins-bad-libs-GstAggregator.html b/docs/libs/html/gst-plugins-bad-libs-GstAggregator.html
index 8204033..8c13670 100644
--- a/docs/libs/html/gst-plugins-bad-libs-GstAggregator.html
+++ b/docs/libs/html/gst-plugins-bad-libs-GstAggregator.html
@@ -352,6 +352,11 @@
   gboolean          (*start)          (GstAggregator    *  aggregator);
 
   GstClockTime      (*get_next_time)  (GstAggregator    *  aggregator);
+
+  GstAggregatorPad * (*create_new_pad) (GstAggregator  * self,
+                                        GstPadTemplate * templ,
+                                        const gchar    * req_name,
+                                        const GstCaps  * caps);
 };
 </pre>
 <p>The aggregator base class will handle in a thread-safe way all manners of
@@ -470,6 +475,11 @@
 on all sink pads before aggregating.</p></td>
 <td class="struct_member_annotations"> </td>
 </tr>
+<tr>
+<td class="struct_member_name"><p><em class="structfield"><code><a name="GstAggregatorClass.create-new-pad"></a>create_new_pad</code></em> ()</p></td>
+<td> </td>
+<td> </td>
+</tr>
 </tbody>
 </table></div>
 </div>
diff --git a/docs/libs/html/gst-plugins-bad-libs-GstEGLImageMemory.html b/docs/libs/html/gst-plugins-bad-libs-GstEGLImageMemory.html
index 24f8f03..4e2e23b 100644
--- a/docs/libs/html/gst-plugins-bad-libs-GstEGLImageMemory.html
+++ b/docs/libs/html/gst-plugins-bad-libs-GstEGLImageMemory.html
@@ -6,7 +6,7 @@
 <meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
 <link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Library Reference Manual">
 <link rel="up" href="gl.html" title="OpenGL Helper Library">
-<link rel="prev" href="GstGLDownload.html" title="GstGLDownload">
+<link rel="prev" href="GstGLDisplay.html" title="GstGLDisplay">
 <link rel="next" href="GstGLBaseFilter.html" title="GstGLBaseFilter">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
@@ -19,7 +19,7 @@
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="gl.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="GstGLDownload.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="GstGLDisplay.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="GstGLBaseFilter.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
diff --git a/docs/libs/html/gst-plugins-bad-libs-GstGLSyncMeta.html b/docs/libs/html/gst-plugins-bad-libs-GstGLSyncMeta.html
index ebe4c7c..624b9d5 100644
--- a/docs/libs/html/gst-plugins-bad-libs-GstGLSyncMeta.html
+++ b/docs/libs/html/gst-plugins-bad-libs-GstGLSyncMeta.html
@@ -155,6 +155,19 @@
 <div class="refsect2">
 <a name="GstGLSyncMeta"></a><h3>struct GstGLSyncMeta</h3>
 <pre class="programlisting">struct GstGLSyncMeta {
+  GstMeta parent;
+
+  GstGLContext *context;
+
+  gpointer      data;
+
+  void (*set_sync) (GstGLSyncMeta * sync, GstGLContext * context);
+  void (*set_sync_gl) (GstGLSyncMeta * sync, GstGLContext * context);
+  void (*wait) (GstGLSyncMeta * sync, GstGLContext * context);
+  void (*wait_gl) (GstGLSyncMeta * sync, GstGLContext * context);
+  void (*copy) (GstGLSyncMeta * src, GstBuffer * sbuffer, GstGLSyncMeta * dest, GstBuffer * dbuffer);
+  void (*free) (GstGLSyncMeta * sync, GstGLContext * context);
+  void (*free_gl) (GstGLSyncMeta * sync, GstGLContext * context);
 };
 </pre>
 </div>
diff --git a/docs/libs/html/gst-plugins-bad-libs-GstGLWindowX11.html b/docs/libs/html/gst-plugins-bad-libs-GstGLWindowX11.html
index cc12f80..ed38254 100644
--- a/docs/libs/html/gst-plugins-bad-libs-GstGLWindowX11.html
+++ b/docs/libs/html/gst-plugins-bad-libs-GstGLWindowX11.html
@@ -7,7 +7,7 @@
 <link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Library Reference Manual">
 <link rel="up" href="gl.html" title="OpenGL Helper Library">
 <link rel="prev" href="gst-plugins-bad-libs-GstGLWindowWin32.html" title="GstGLWindowWin32">
-<link rel="next" href="ch07.html" title="Interfaces">
+<link rel="next" href="player.html" title="Player Library">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -20,7 +20,7 @@
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="gl.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="gst-plugins-bad-libs-GstGLWindowWin32.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="ch07.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="player.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <a name="gst-plugins-bad-libs-GstGLWindowX11"></a><div class="titlepage"></div>
@@ -123,7 +123,7 @@
 gst_gl_window_x11_untrap_x_errors (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
 <p>Removes the X error trap and returns the current status.</p>
 <div class="refsect3">
-<a name="id-1.2.9.29.6.5.5"></a><h4>Returns</h4>
+<a name="id-1.2.9.27.6.5.5"></a><h4>Returns</h4>
 <p> the trapped error code, or 0 for success</p>
 </div>
 </div>
diff --git a/docs/libs/html/gst-plugins-bad-libs-GstPhotography.html b/docs/libs/html/gst-plugins-bad-libs-GstPhotography.html
index 3cb2be4..e35ef86 100644
--- a/docs/libs/html/gst-plugins-bad-libs-GstPhotography.html
+++ b/docs/libs/html/gst-plugins-bad-libs-GstPhotography.html
@@ -5,8 +5,8 @@
 <title>GstPhotography: GStreamer Bad Plugins 1.0 Library Reference Manual</title>
 <meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
 <link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Library Reference Manual">
-<link rel="up" href="ch07.html" title="Interfaces">
-<link rel="prev" href="ch07.html" title="Interfaces">
+<link rel="up" href="ch08.html" title="Interfaces">
+<link rel="prev" href="ch08.html" title="Interfaces">
 <link rel="next" href="gstreamer-libs-hierarchy.html" title="Part II. Object Hierarchy">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
@@ -18,8 +18,8 @@
                   <a href="#gst-plugins-bad-libs-GstPhotography.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch07.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="ch07.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="u" href="ch08.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="ch08.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="gstreamer-libs-hierarchy.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
@@ -443,7 +443,7 @@
  format, so this callback allows the application
 to e.g. reconfigure capsfilters in pipeline if any.</p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.2.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.2.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -474,7 +474,7 @@
                                      <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> *ev_comp</code></em>);</pre>
 <p>Get the ev compensation value for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.3.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.3.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -496,7 +496,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.3.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.3.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if getting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -508,7 +508,7 @@
                                <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *iso_speed</code></em>);</pre>
 <p>Get the ISO value (light sensivity) for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.4.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.4.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -530,7 +530,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.4.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.4.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if getting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -542,7 +542,7 @@
                               <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *aperture</code></em>);</pre>
 <p>Get the aperture value for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.5.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.5.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -564,7 +564,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.5.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.5.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if getting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -576,7 +576,7 @@
                               <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint32"><span class="type">guint32</span></a> *exposure</code></em>);</pre>
 <p>Get the fixed exposure time (in us) for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.6.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.6.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -598,7 +598,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.6.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.6.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if getting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -611,7 +611,7 @@
                                 <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GstPhotographyWhiteBalanceMode" title="enum GstPhotographyWhiteBalanceMode"><span class="type">GstPhotographyWhiteBalanceMode</span></a> *wb_mode</code></em>);</pre>
 <p>Get the white balance mode for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.7.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.7.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -633,7 +633,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.7.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.7.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if getting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -645,7 +645,7 @@
                                      <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GstPhotographyColorToneMode" title="enum GstPhotographyColorToneMode"><span class="type">GstPhotographyColorToneMode</span></a> *tone_mode</code></em>);</pre>
 <p>Get the color tone mode for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.8.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.8.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -667,7 +667,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.8.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.8.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if getting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -679,7 +679,7 @@
                                 <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GstPhotographySceneMode" title="enum GstPhotographySceneMode"><span class="type">GstPhotographySceneMode</span></a> *scene_mode</code></em>);</pre>
 <p>Get the scene mode for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.9.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.9.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -701,7 +701,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.9.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.9.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if getting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -713,7 +713,7 @@
                                 <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GstPhotographyFlashMode" title="enum GstPhotographyFlashMode"><span class="type">GstPhotographyFlashMode</span></a> *flash_mode</code></em>);</pre>
 <p>Get the flash mode for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.10.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.10.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -735,7 +735,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.10.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.10.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if getting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -747,7 +747,7 @@
                                   <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GstPhotographyFlickerReductionMode" title="enum GstPhotographyFlickerReductionMode"><span class="type">GstPhotographyFlickerReductionMode</span></a> *mode</code></em>);</pre>
 <p>Get the flicker mode value for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.11.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.11.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -769,7 +769,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.11.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.11.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if getting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -781,7 +781,7 @@
                                 <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GstPhotographyFocusMode" title="enum GstPhotographyFocusMode"><span class="type">GstPhotographyFocusMode</span></a> *mode</code></em>);</pre>
 <p>Get the focus mode value for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.12.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.12.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -803,7 +803,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.12.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.12.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if getting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -815,7 +815,7 @@
                                      <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GstPhotographyNoiseReduction" title="enum GstPhotographyNoiseReduction"><span class="type">GstPhotographyNoiseReduction</span></a> *noise_reduction</code></em>);</pre>
 <p>Get the noise reduction mode for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.13.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.13.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -837,7 +837,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.13.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.13.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if getting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 <p class="since">Since: 0.10.21</p>
@@ -850,7 +850,7 @@
                           <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> *zoom</code></em>);</pre>
 <p>Get the zoom value for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.14.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.14.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -872,7 +872,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.14.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.14.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if getting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -884,7 +884,7 @@
                                      <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gfloat"><span class="type">gfloat</span></a> ev_comp</code></em>);</pre>
 <p>Set the ev compensation value for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.15.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.15.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -906,7 +906,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.15.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.15.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if setting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -918,7 +918,7 @@
                                <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> iso_speed</code></em>);</pre>
 <p>Set the ISO value (light sensivity) for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.16.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.16.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -940,7 +940,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.16.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.16.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if setting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -952,7 +952,7 @@
                               <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> aperture</code></em>);</pre>
 <p>Set the aperture value for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.17.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.17.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -974,7 +974,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.17.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.17.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if setting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -986,7 +986,7 @@
                               <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> exposure</code></em>);</pre>
 <p>Set the fixed exposure time (in us) for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.18.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.18.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1008,7 +1008,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.18.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.18.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if setting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -1021,7 +1021,7 @@
                                 <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GstPhotographyWhiteBalanceMode" title="enum GstPhotographyWhiteBalanceMode"><span class="type">GstPhotographyWhiteBalanceMode</span></a> wb_mode</code></em>);</pre>
 <p>Set the white balance mode for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.19.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.19.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1043,7 +1043,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.19.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.19.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if setting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -1055,7 +1055,7 @@
                                      <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GstPhotographyColorToneMode" title="enum GstPhotographyColorToneMode"><span class="type">GstPhotographyColorToneMode</span></a> tone_mode</code></em>);</pre>
 <p>Set the color tone mode for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.20.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.20.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1077,7 +1077,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.20.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.20.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if setting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -1089,7 +1089,7 @@
                                 <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GstPhotographySceneMode" title="enum GstPhotographySceneMode"><span class="type">GstPhotographySceneMode</span></a> scene_mode</code></em>);</pre>
 <p>Set the scene mode for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.21.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.21.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1111,7 +1111,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.21.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.21.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if setting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -1123,7 +1123,7 @@
                                 <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GstPhotographyFlashMode" title="enum GstPhotographyFlashMode"><span class="type">GstPhotographyFlashMode</span></a> flash_mode</code></em>);</pre>
 <p>Set the flash mode for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.22.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.22.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1145,7 +1145,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.22.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.22.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if setting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -1157,7 +1157,7 @@
                                   <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GstPhotographyFlickerReductionMode" title="enum GstPhotographyFlickerReductionMode"><span class="type">GstPhotographyFlickerReductionMode</span></a> mode</code></em>);</pre>
 <p>Set the flicker mode value for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>.</p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.23.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.23.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1179,7 +1179,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.23.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.23.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if setting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -1191,7 +1191,7 @@
                                 <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GstPhotographyFocusMode" title="enum GstPhotographyFocusMode"><span class="type">GstPhotographyFocusMode</span></a> mode</code></em>);</pre>
 <p>Set the focus mode value for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>.</p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.24.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.24.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1213,7 +1213,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.24.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.24.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if setting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -1225,7 +1225,7 @@
                                      <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GstPhotographyNoiseReduction" title="enum GstPhotographyNoiseReduction"><span class="type">GstPhotographyNoiseReduction</span></a> noise_reduction</code></em>);</pre>
 <p>Set the noise reduction mode for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a></p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.25.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.25.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1247,7 +1247,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.25.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.25.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if setting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 <p class="since">Since: 0.10.21</p>
@@ -1261,7 +1261,7 @@
 <p>Set the zoom value for the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a>.
 E.g. 1.0 to get original image and 3.0 for 3x zoom and so on.</p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.26.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.26.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1283,7 +1283,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.26.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.26.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if setting the value succeeded, <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a> otherwise</p>
 </div>
 </div>
@@ -1295,7 +1295,7 @@
 <p>Get <a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GstPhotographyCaps" title="enum GstPhotographyCaps"><span class="type">GstPhotographyCaps</span></a> bitmask value that indicates what photography
 interface features the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> supports</p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.27.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.27.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1310,7 +1310,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.27.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.27.6"></a><h4>Returns</h4>
 <p> <a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GstPhotographyCaps" title="enum GstPhotographyCaps"><span class="type">GstPhotographyCaps</span></a> value</p>
 </div>
 </div>
@@ -1327,7 +1327,7 @@
  callback is called after preparations are
 done. Image capture will begin after callback returns.</p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.28.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.28.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1360,7 +1360,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.28.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.28.6"></a><h4>Returns</h4>
 <p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if preparations were started (caps were OK), otherwise <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>.</p>
 </div>
 </div>
@@ -1373,7 +1373,7 @@
 <p>Start or stop autofocusing. <a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GST-PHOTOGRAPHY-AUTOFOCUS-DONE:CAPS" title="GST_PHOTOGRAPHY_AUTOFOCUS_DONE"><code class="literal">GST_PHOTOGRAPHY_AUTOFOCUS_DONE</code></a>
 message is posted to bus when autofocusing has finished.</p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.29.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.29.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1403,7 +1403,7 @@
                             <em class="parameter"><code><span class="type">GstPhotographySettings</span> *config</code></em>);</pre>
 <p>Set all configuration settings at once.</p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.30.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.30.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1425,7 +1425,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.30.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.30.6"></a><h4>Returns</h4>
 <p> TRUE if configuration was set successfully, otherwise FALSE.</p>
 </div>
 </div>
@@ -1437,7 +1437,7 @@
                             <em class="parameter"><code><span class="type">GstPhotographySettings</span> *config</code></em>);</pre>
 <p>Get all configuration settings at once.</p>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.31.5"></a><h4>Parameters</h4>
+<a name="id-1.2.11.2.7.31.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -1459,7 +1459,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.10.2.7.31.6"></a><h4>Returns</h4>
+<a name="id-1.2.11.2.7.31.6"></a><h4>Returns</h4>
 <p> TRUE if configuration was got successfully, otherwise FALSE.</p>
 </div>
 </div>
@@ -1476,7 +1476,7 @@
 <a name="GstPhotographyNoiseReduction"></a><h3>enum GstPhotographyNoiseReduction</h3>
 <p>Noise Reduction features of a photography capture or filter element.</p>
 <div class="refsect3">
-<a name="id-1.2.10.2.8.3.4"></a><h4>Members</h4>
+<a name="id-1.2.11.2.8.3.4"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -1536,7 +1536,7 @@
 <a name="GstPhotographyWhiteBalanceMode"></a><h3>enum GstPhotographyWhiteBalanceMode</h3>
 <p>Modes for white balance control.</p>
 <div class="refsect3">
-<a name="id-1.2.10.2.8.4.4"></a><h4>Members</h4>
+<a name="id-1.2.11.2.8.4.4"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -1617,7 +1617,7 @@
 <a name="GstPhotographyColorToneMode"></a><h3>enum GstPhotographyColorToneMode</h3>
 <p>Modes for special color effects.</p>
 <div class="refsect3">
-<a name="id-1.2.10.2.8.5.4"></a><h4>Members</h4>
+<a name="id-1.2.11.2.8.5.4"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -1747,7 +1747,7 @@
 <p>Each mode contains preset <a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GstPhotography" title="GstPhotography"><span class="type">GstPhotography</span></a> options in order to produce
 good capturing result in certain scene.</p>
 <div class="refsect3">
-<a name="id-1.2.10.2.8.6.4"></a><h4>Members</h4>
+<a name="id-1.2.11.2.8.6.4"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -1896,7 +1896,7 @@
 <a name="GstPhotographyFlashMode"></a><h3>enum GstPhotographyFlashMode</h3>
 <p>Modes for flash control.</p>
 <div class="refsect3">
-<a name="id-1.2.10.2.8.7.4"></a><h4>Members</h4>
+<a name="id-1.2.11.2.8.7.4"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -1950,7 +1950,7 @@
 <a name="GstPhotographyFlickerReductionMode"></a><h3>enum GstPhotographyFlickerReductionMode</h3>
 <p>Reduce flicker in video caused by light source fluctuation.</p>
 <div class="refsect3">
-<a name="id-1.2.10.2.8.8.4"></a><h4>Members</h4>
+<a name="id-1.2.11.2.8.8.4"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -1995,7 +1995,7 @@
 <a name="GstPhotographyFocusMode"></a><h3>enum GstPhotographyFocusMode</h3>
 <p>Choose mode for focusing algorithm.</p>
 <div class="refsect3">
-<a name="id-1.2.10.2.8.9.4"></a><h4>Members</h4>
+<a name="id-1.2.11.2.8.9.4"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -2080,7 +2080,7 @@
 <p>Status of the focusing operation, used in <a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GST-PHOTOGRAPHY-AUTOFOCUS-DONE:CAPS" title="GST_PHOTOGRAPHY_AUTOFOCUS_DONE"><span class="type">GST_PHOTOGRAPHY_AUTOFOCUS_DONE</span></a>
 message.</p>
 <div class="refsect3">
-<a name="id-1.2.10.2.8.10.4"></a><h4>Members</h4>
+<a name="id-1.2.11.2.8.10.4"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -2126,7 +2126,7 @@
 <p>Bitmask that indicates which <a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GstPhotography" title="GstPhotography"><span class="type">GstPhotography</span></a> interface features an instance
 supports.</p>
 <div class="refsect3">
-<a name="id-1.2.10.2.8.11.4"></a><h4>Members</h4>
+<a name="id-1.2.11.2.8.11.4"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
@@ -2224,7 +2224,7 @@
 <p>Risk level of captured image becoming "shaken" due to camera movement and
 too long exposure time. Used in <a class="link" href="gst-plugins-bad-libs-GstPhotography.html#GST-PHOTOGRAPHY-SHAKE-RISK:CAPS" title="GST_PHOTOGRAPHY_SHAKE_RISK"><span class="type">GST_PHOTOGRAPHY_SHAKE_RISK</span></a> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstMessage.html"><span class="type">GstMessage</span></a>.</p>
 <div class="refsect3">
-<a name="id-1.2.10.2.8.12.4"></a><h4>Members</h4>
+<a name="id-1.2.11.2.8.12.4"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
diff --git a/docs/libs/html/gst-plugins-bad-libs-Utilities.html b/docs/libs/html/gst-plugins-bad-libs-Utilities.html
index 54c7260..934c372 100644
--- a/docs/libs/html/gst-plugins-bad-libs-Utilities.html
+++ b/docs/libs/html/gst-plugins-bad-libs-Utilities.html
@@ -6,7 +6,7 @@
 <meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
 <link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Library Reference Manual">
 <link rel="up" href="gl.html" title="OpenGL Helper Library">
-<link rel="prev" href="GstGLUploadMeta.html" title="GstGLUploadMeta">
+<link rel="prev" href="GstGLUpload.html" title="GstGLUpload">
 <link rel="next" href="GstGLWindow.html" title="GstGLWindow">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
@@ -19,7 +19,7 @@
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="gl.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="GstGLUploadMeta.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="GstGLUpload.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="GstGLWindow.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
@@ -237,7 +237,7 @@
          <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> stuff</code></em>);</pre>
 <p>callback definition for operating on textures</p>
 <div class="refsect3">
-<a name="id-1.2.9.22.6.2.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.20.6.2.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -276,7 +276,7 @@
 <span class="c_punctuation">(</span>*GLCB_V2<span class="c_punctuation">)</span> (<em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> stuff</code></em>);</pre>
 <p>callback definition for operating through a Framebuffer object</p>
 <div class="refsect3">
-<a name="id-1.2.9.22.6.3.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.20.6.3.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -301,7 +301,7 @@
          <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>);</pre>
 <p>client draw callback</p>
 <div class="refsect3">
-<a name="id-1.2.9.22.6.4.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.20.6.4.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -441,6 +441,23 @@
 <a name="gst-gl-context-clear-shader"></a><h3>gst_gl_context_clear_shader ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gst_gl_context_clear_shader (<em class="parameter"><code><a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a> *context</code></em>);</pre>
+<p>Clear's the currently set shader from the GL state machine.</p>
+<p>Note: must be called in the GL thread.</p>
+<div class="refsect3">
+<a name="id-1.2.9.20.6.17.6"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>shader</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -491,7 +508,7 @@
 <div class="refsect2">
 <a name="GstGLDisplayProjection"></a><h3>enum GstGLDisplayProjection</h3>
 <div class="refsect3">
-<a name="id-1.2.9.22.7.2.3"></a><h4>Members</h4>
+<a name="id-1.2.9.20.7.2.3"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="enum_members_name">
diff --git a/docs/libs/html/gst-plugins-bad-libs-gstglmemory.html b/docs/libs/html/gst-plugins-bad-libs-gstglmemory.html
index da60855..de3d9e7 100644
--- a/docs/libs/html/gst-plugins-bad-libs-gstglmemory.html
+++ b/docs/libs/html/gst-plugins-bad-libs-gstglmemory.html
@@ -15,8 +15,7 @@
 <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
 <td width="100%" align="left" class="shortcuts">
 <a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
-                  <a href="#gst-plugins-bad-libs-gstglmemory.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
-                  <a href="#gst-plugins-bad-libs-gstglmemory.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+                  <a href="#gst-plugins-bad-libs-gstglmemory.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="gl.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
@@ -41,6 +40,12 @@
 </colgroup>
 <tbody>
 <tr>
+<td class="define_keyword">#define</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GST-GL-MEMORY-ALLOCATOR:CAPS" title="GST_GL_MEMORY_ALLOCATOR()">GST_GL_MEMORY_ALLOCATOR</a><span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
 <td class="function_type">
 <span class="returnvalue">void</span>
 </td>
@@ -50,38 +55,6 @@
 </tr>
 <tr>
 <td class="function_type">
-<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstMemory.html"><span class="returnvalue">GstMemory</span></a> *
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-alloc" title="gst_gl_memory_alloc ()">gst_gl_memory_alloc</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="returnvalue">GstGLMemory</span></a> *
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-wrapped" title="gst_gl_memory_wrapped ()">gst_gl_memory_wrapped</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="returnvalue">GstGLMemory</span></a> *
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-wrapped-texture" title="gst_gl_memory_wrapped_texture ()">gst_gl_memory_wrapped_texture</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-copy-into-texture" title="gst_gl_memory_copy_into_texture ()">gst_gl_memory_copy_into_texture</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
 <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
 </td>
 <td class="function_name">
@@ -90,14 +63,6 @@
 </tr>
 <tr>
 <td class="function_type">
-<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-setup-wrapped" title="gst_gl_memory_setup_wrapped ()">gst_gl_memory_setup_wrapped</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
 <span class="returnvalue">GstVideoGLTextureType</span>
 </td>
 <td class="function_name">
@@ -115,72 +80,53 @@
 </tbody>
 </table></div>
 </div>
-<a name="GstGLAllocator"></a><div class="refsect1">
+<div class="refsect1">
 <a name="gst-plugins-bad-libs-gstglmemory.other"></a><h2>Types and Values</h2>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="name">
 <col class="description">
 </colgroup>
-<tbody>
-<tr>
-<td class="datatype_keyword"> </td>
-<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLAllocator-struct" title="GstGLAllocator">GstGLAllocator</a></td>
-</tr>
-<tr>
-<td class="datatype_keyword"> </td>
-<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLAllocatorClass" title="GstGLAllocatorClass">GstGLAllocatorClass</a></td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GST-GL-MEMORY-ALLOCATOR:CAPS" title="GST_GL_MEMORY_ALLOCATOR">GST_GL_MEMORY_ALLOCATOR</a></td>
-</tr>
-<tr>
+<tbody><tr>
 <td class="datatype_keyword"> </td>
 <td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory">GstGLMemory</a></td>
-</tr>
-</tbody>
+</tr></tbody>
 </table></div>
 </div>
 <div class="refsect1">
-<a name="gst-plugins-bad-libs-gstglmemory.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen">    <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
-    <span class="lineart">╰──</span> <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
-        <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
-            <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html">GstAllocator</a>
-                <span class="lineart">╰──</span> GstGLBaseBufferAllocator
-                    <span class="lineart">╰──</span> GstGLAllocator
-</pre>
-</div>
-<div class="refsect1">
 <a name="gst-plugins-bad-libs-gstglmemory.description"></a><h2>Description</h2>
 <p>GstGLMemory is a <span class="type">GstGLBaseBuffer</span> subclass providing support for the mapping of
 GL textures.  </p>
-<p><a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a> is created through <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-alloc" title="gst_gl_memory_alloc ()"><code class="function">gst_gl_memory_alloc()</code></a> or system memory can
-be wrapped through <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-wrapped" title="gst_gl_memory_wrapped ()"><code class="function">gst_gl_memory_wrapped()</code></a>.</p>
+<p><a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a> is created through <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-libs/html/gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-alloc"><code class="function">gst_gl_memory_alloc()</code></a> or system memory can
+be wrapped through <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-libs/html/gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-wrapped"><code class="function">gst_gl_memory_wrapped()</code></a>.</p>
 <p>Data is uploaded or downloaded from the GPU as is necessary.</p>
 </div>
 <div class="refsect1">
 <a name="gst-plugins-bad-libs-gstglmemory.functions_details"></a><h2>Functions</h2>
 <div class="refsect2">
-<a name="gst-gl-memory-init"></a><h3>gst_gl_memory_init ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-gst_gl_memory_init (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-<p>Initializes the GL Memory allocator. It is safe to call this function
-multiple times.  This must be called before any other GstGLMemory operation.</p>
+<a name="GST-GL-MEMORY-ALLOCATOR:CAPS"></a><h3>GST_GL_MEMORY_ALLOCATOR()</h3>
+<pre class="programlisting">#define GST_GL_MEMORY_ALLOCATOR(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GL_MEMORY_ALLOCATOR, GstGLMemoryAllocator))
+</pre>
 </div>
 <hr>
 <div class="refsect2">
-<a name="gst-gl-memory-alloc"></a><h3>gst_gl_memory_alloc ()</h3>
-<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstMemory.html"><span class="returnvalue">GstMemory</span></a> *
-gst_gl_memory_alloc (<em class="parameter"><code><a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a> *context</code></em>,
-                     <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html#GstAllocationParams"><span class="type">GstAllocationParams</span></a> *params</code></em>,
-                     <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> *info</code></em>,
-                     <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> plane</code></em>,
-                     <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoAlignment"><span class="type">GstVideoAlignment</span></a> *valign</code></em>);</pre>
-<p>Allocated a new <span class="type">GstGlMemory</span>.</p>
+<a name="gst-gl-memory-init"></a><h3>gst_gl_memory_init ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_gl_memory_init (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a> *mem</code></em>,
+                    <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html"><span class="type">GstAllocator</span></a> *allocator</code></em>,
+                    <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstMemory.html"><span class="type">GstMemory</span></a> *parent</code></em>,
+                    <em class="parameter"><code><a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a> *context</code></em>,
+                    <em class="parameter"><code><span class="type">GstGLTextureTarget</span> target</code></em>,
+                    <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html#GstAllocationParams"><span class="type">GstAllocationParams</span></a> *params</code></em>,
+                    <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> *info</code></em>,
+                    <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> plane</code></em>,
+                    <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoAlignment"><span class="type">GstVideoAlignment</span></a> *valign</code></em>,
+                    <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
+                    <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> notify</code></em>);</pre>
+<p>Initializes <em class="parameter"><code>mem</code></em>
+ with the required parameters</p>
 <div class="refsect3">
-<a name="id-1.2.9.17.8.3.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.16.6.3.5"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -189,280 +135,60 @@
 </colgroup>
 <tbody>
 <tr>
+<td class="parameter_name"><p>mem</p></td>
+<td class="parameter_description"><p>the <span class="type">GstGLBaseMemory</span> to initialize</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>allocator</p></td>
+<td class="parameter_description"><p>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html"><span class="type">GstAllocator</span></a> to initialize with</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>parent</p></td>
+<td class="parameter_description"><p> the parent <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstMemory.html"><span class="type">GstMemory</span></a> to initialize with. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+<tr>
 <td class="parameter_name"><p>context</p></td>
-<td class="parameter_description"><p>a <a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a></p></td>
+<td class="parameter_description"><p>the <a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a> to initialize with</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>params</p></td>
-<td class="parameter_description"><p>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html#GstAllocationParams"><span class="type">GstAllocationParams</span></a></p></td>
-<td class="parameter_annotations"> </td>
+<td class="parameter_description"><p> the <em class="parameter"><code>GstAllocationParams</code></em>
+to initialize with. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
 </tr>
 <tr>
-<td class="parameter_name"><p>info</p></td>
-<td class="parameter_description"><p>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> of the memory</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>plane</p></td>
-<td class="parameter_description"><p>the plane this memory will represent</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>valign</p></td>
-<td class="parameter_description"><p>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoAlignment"><span class="type">GstVideoAlignment</span></a> applied to <em class="parameter"><code>info</code></em>
-</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<div class="refsect3">
-<a name="id-1.2.9.17.8.3.6"></a><h4>Returns</h4>
-<p> a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstMemory.html"><span class="type">GstMemory</span></a> object with a GL texture specified by <em class="parameter"><code>vinfo</code></em>
-from <em class="parameter"><code>context</code></em>
-</p>
-</div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-memory-wrapped"></a><h3>gst_gl_memory_wrapped ()</h3>
-<pre class="programlisting"><a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="returnvalue">GstGLMemory</span></a> *
-gst_gl_memory_wrapped (<em class="parameter"><code><a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a> *context</code></em>,
-                       <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> *info</code></em>,
-                       <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> plane</code></em>,
-                       <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoAlignment"><span class="type">GstVideoAlignment</span></a> *valign</code></em>,
-                       <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data</code></em>,
-                       <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
-                       <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> notify</code></em>);</pre>
-<p>Wrapped <em class="parameter"><code>data</code></em>
- into a <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a>. This version will account for padding
-added to the allocation and expressed through <em class="parameter"><code>valign</code></em>
-.</p>
-<div class="refsect3">
-<a name="id-1.2.9.17.8.4.5"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="parameters_name">
-<col class="parameters_description">
-<col width="200px" class="parameters_annotations">
-</colgroup>
-<tbody>
-<tr>
-<td class="parameter_name"><p>context</p></td>
-<td class="parameter_description"><p>a <a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>info</p></td>
-<td class="parameter_description"><p>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> of the memory and data</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>plane</p></td>
-<td class="parameter_description"><p>the plane this memory will represent</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>valign</p></td>
-<td class="parameter_description"><p>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoAlignment"><span class="type">GstVideoAlignment</span></a> applied to <em class="parameter"><code>info</code></em>
-</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>data</p></td>
-<td class="parameter_description"><p>the data to wrap</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>user_data</p></td>
-<td class="parameter_description"><p>data called with for <em class="parameter"><code>notify</code></em>
-</p></td>
+<td class="parameter_name"><p>size</p></td>
+<td class="parameter_description"><p>the number of bytes to be allocated</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>notify</p></td>
-<td class="parameter_description"><p>function called with <em class="parameter"><code>user_data</code></em>
-when <em class="parameter"><code>data</code></em>
-needs to be freed</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<div class="refsect3">
-<a name="id-1.2.9.17.8.4.6"></a><h4>Returns</h4>
-<p> a <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a> object with a GL texture specified by <em class="parameter"><code>v_info</code></em>
-from <em class="parameter"><code>context</code></em>
-and contents specified by <em class="parameter"><code>data</code></em>
-</p>
-</div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-memory-wrapped-texture"></a><h3>gst_gl_memory_wrapped_texture ()</h3>
-<pre class="programlisting"><a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="returnvalue">GstGLMemory</span></a> *
-gst_gl_memory_wrapped_texture (<em class="parameter"><code><a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a> *context</code></em>,
-                               <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> texture_id</code></em>,
-                               <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> texture_target</code></em>,
-                               <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> *info</code></em>,
-                               <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> plane</code></em>,
-                               <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoAlignment"><span class="type">GstVideoAlignment</span></a> *valign</code></em>,
-                               <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
-                               <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> notify</code></em>);</pre>
-<p>Wraps a texture handle into a <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a>.</p>
-<div class="refsect3">
-<a name="id-1.2.9.17.8.5.5"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="parameters_name">
-<col class="parameters_description">
-<col width="200px" class="parameters_annotations">
-</colgroup>
-<tbody>
-<tr>
-<td class="parameter_name"><p>context</p></td>
-<td class="parameter_description"><p>a <a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>texture_id</p></td>
-<td class="parameter_description"><p>the GL texture handle</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>texture_target</p></td>
-<td class="parameter_description"><p>the GL texture target</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>info</p></td>
-<td class="parameter_description"><p>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> of the memory</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>plane</p></td>
-<td class="parameter_description"><p>The plane this memory will represent</p></td>
-<td class="parameter_annotations"> </td>
+<td class="parameter_description"><p> a <a href="https://developer.gnome.org/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
 </tr>
 <tr>
 <td class="parameter_name"><p>user_data</p></td>
-<td class="parameter_description"><p>user data</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>notify</p></td>
-<td class="parameter_description"><p>Destroy callback for the user data</p></td>
-<td class="parameter_annotations"> </td>
+<td class="parameter_description"><p> user data to call <em class="parameter"><code>notify</code></em>
+with. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
 </tr>
 </tbody>
 </table></div>
 </div>
-<div class="refsect3">
-<a name="id-1.2.9.17.8.5.6"></a><h4>Returns</h4>
-<p> a newly allocated <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a></p>
-</div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-memory-copy-into-texture"></a><h3>gst_gl_memory_copy_into_texture ()</h3>
-<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_gl_memory_copy_into_texture (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a> *gl_mem</code></em>,
-                                 <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> tex_id</code></em>,
-                                 <em class="parameter"><code><span class="type">GstVideoGLTextureType</span> tex_type</code></em>,
-                                 <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> width</code></em>,
-                                 <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> height</code></em>,
-                                 <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> stride</code></em>,
-                                 <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> respecify</code></em>);</pre>
-<p>Copies <em class="parameter"><code>gl_mem</code></em>
- into the texture specfified by <em class="parameter"><code>tex_id</code></em>
-.  The format of <em class="parameter"><code>tex_id</code></em>
-
-is specified by <em class="parameter"><code>tex_type</code></em>
-, <em class="parameter"><code>width</code></em>
- and <em class="parameter"><code>height</code></em>
-.</p>
-<p>If <em class="parameter"><code>respecify</code></em>
- is <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a>, then the copy is performed in terms of the texture
-data.  This is useful for splitting RGBA textures into RG or R textures or
-vice versa. The requirement for this to succeed is that the backing texture
-data must be the same size, i.e. say a RGBA8 texture is converted into a RG8
-texture, then the RG texture must have twice as many pixels available for
-output as the RGBA texture.</p>
-<p>Otherwise, if <em class="parameter"><code>respecify</code></em>
- is <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>, then the copy is performed per texel
-using glCopyTexImage.  See the OpenGL specification for details on the
-mappings between texture formats.</p>
-<div class="refsect3">
-<a name="id-1.2.9.17.8.6.7"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="parameters_name">
-<col class="parameters_description">
-<col width="200px" class="parameters_annotations">
-</colgroup>
-<tbody>
-<tr>
-<td class="parameter_name"><p>gl_mem</p></td>
-<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>tex_id</p></td>
-<td class="parameter_description"><p>OpenGL texture id</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>tex_type</p></td>
-<td class="parameter_description"><p>a <span class="type">GstVideoGLTextureType</span></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>width</p></td>
-<td class="parameter_description"><p>width of <em class="parameter"><code>tex_id</code></em>
-</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>height</p></td>
-<td class="parameter_description"><p>height of <em class="parameter"><code>tex_id</code></em>
-</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>stride</p></td>
-<td class="parameter_description"><p>stride of the backing texture data</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>respecify</p></td>
-<td class="parameter_description"><p>whether to copy the data or copy per texel</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<div class="refsect3">
-<a name="id-1.2.9.17.8.6.8"></a><h4>Returns</h4>
-<p> Whether the copy suceeded</p>
-</div>
 </div>
 <hr>
 <div class="refsect2">
 <a name="gst-gl-memory-setup-buffer"></a><h3>gst_gl_memory_setup_buffer ()</h3>
 <pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_gl_memory_setup_buffer (<em class="parameter"><code><a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a> *context</code></em>,
-                            <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html#GstAllocationParams"><span class="type">GstAllocationParams</span></a> *params</code></em>,
-                            <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> *info</code></em>,
-                            <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoAlignment"><span class="type">GstVideoAlignment</span></a> *valign</code></em>,
-                            <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html"><span class="type">GstBuffer</span></a> *buffer</code></em>);</pre>
-<p>Adds the required <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a>s with the correct configuration to
-<em class="parameter"><code>buffer</code></em>
- based on <em class="parameter"><code>info</code></em>
-. This version handles padding through <em class="parameter"><code>valign</code></em>
-.</p>
+gst_gl_memory_setup_buffer (<em class="parameter"><code><span class="type">GstGLMemoryAllocator</span> *allocator</code></em>,
+                            <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html"><span class="type">GstBuffer</span></a> *buffer</code></em>,
+                            <em class="parameter"><code><span class="type">GstGLVideoAllocationParams</span> *params</code></em>);</pre>
 <div class="refsect3">
-<a name="id-1.2.9.17.8.7.5"></a><h4>Parameters</h4>
+<a name="id-1.2.9.16.6.4.4"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -471,108 +197,27 @@
 </colgroup>
 <tbody>
 <tr>
-<td class="parameter_name"><p>context</p></td>
-<td class="parameter_description"><p>a <a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>params</p></td>
-<td class="parameter_description"><p>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html#GstAllocationParams"><span class="type">GstAllocationParams</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>info</p></td>
-<td class="parameter_description"><p>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>valign</p></td>
-<td class="parameter_description"><p>the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoAlignment"><span class="type">GstVideoAlignment</span></a> applied to <em class="parameter"><code>info</code></em>
-</p></td>
+<td class="parameter_name"><p>allocator</p></td>
+<td class="parameter_description"><p>the <em class="parameter"><code>GstGLMemoryAllocator</code></em>
+to allocate from</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 <tr>
 <td class="parameter_name"><p>buffer</p></td>
-<td class="parameter_description"><p>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html"><span class="type">GstBuffer</span></a></p></td>
+<td class="parameter_description"><p>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBuffer.html"><span class="type">GstBuffer</span></a> to setup</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>params</p></td>
+<td class="parameter_description"><p>the <span class="type">GstGLVideoAllocationParams</span> to allocate with</p></td>
 <td class="parameter_annotations"> </td>
 </tr>
 </tbody>
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.9.17.8.7.6"></a><h4>Returns</h4>
-<p> whether the memory's were sucessfully added.</p>
-</div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-memory-setup-wrapped"></a><h3>gst_gl_memory_setup_wrapped ()</h3>
-<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_gl_memory_setup_wrapped (<em class="parameter"><code><a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a> *context</code></em>,
-                             <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a> *info</code></em>,
-                             <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoAlignment"><span class="type">GstVideoAlignment</span></a> *valign</code></em>,
-                             <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> data[GST_VIDEO_MAX_PLANES]</code></em>,
-                             <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a> *textures[GST_VIDEO_MAX_PLANES]</code></em>,
-                             <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> user_data</code></em>,
-                             <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Datasets.html#GDestroyNotify"><span class="type">GDestroyNotify</span></a> notify</code></em>);</pre>
-<p>Wraps per plane data pointer in <em class="parameter"><code>data</code></em>
- into the corresponding entry in
-<em class="parameter"><code>textures</code></em>
- based on <em class="parameter"><code>info</code></em>
- and padding from <em class="parameter"><code>valign</code></em>
-. Note that the <em class="parameter"><code>notify</code></em>
-
-will be called as many time as there is planes.</p>
-<div class="refsect3">
-<a name="id-1.2.9.17.8.8.5"></a><h4>Parameters</h4>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="parameters_name">
-<col class="parameters_description">
-<col width="200px" class="parameters_annotations">
-</colgroup>
-<tbody>
-<tr>
-<td class="parameter_name"><p>context</p></td>
-<td class="parameter_description"><p>a <a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>info</p></td>
-<td class="parameter_description"><p>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>valign</p></td>
-<td class="parameter_description"><p>a <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideo.html#GstVideoInfo"><span class="type">GstVideoInfo</span></a></p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>data</p></td>
-<td class="parameter_description"><p>a list of per plane data pointers</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>textures</p></td>
-<td class="parameter_description"><p> a list of <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a>. </p></td>
-<td class="parameter_annotations"><span class="annotation">[transfer out]</span></td>
-</tr>
-<tr>
-<td class="parameter_name"><p>user_data</p></td>
-<td class="parameter_description"><p>user data for the destroy function</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-<tr>
-<td class="parameter_name"><p>notify</p></td>
-<td class="parameter_description"><p>A function called each time a memory is freed</p></td>
-<td class="parameter_annotations"> </td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<div class="refsect3">
-<a name="id-1.2.9.17.8.8.6"></a><h4>Returns</h4>
-<p> whether the memory's were sucessfully created.</p>
+<a name="id-1.2.9.16.6.4.5"></a><h4>Returns</h4>
+<p> whether the buffer was correctly setup</p>
 </div>
 </div>
 <hr>
@@ -589,7 +234,7 @@
 <pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
 gst_is_gl_memory (<em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstMemory.html"><span class="type">GstMemory</span></a> *mem</code></em>);</pre>
 <div class="refsect3">
-<a name="id-1.2.9.17.8.10.4"></a><h4>Parameters</h4>
+<a name="id-1.2.9.16.6.6.4"></a><h4>Parameters</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="150px" class="parameters_name">
@@ -604,7 +249,7 @@
 </table></div>
 </div>
 <div class="refsect3">
-<a name="id-1.2.9.17.8.10.5"></a><h4>Returns</h4>
+<a name="id-1.2.9.16.6.6.5"></a><h4>Returns</h4>
 <p> whether the memory at <em class="parameter"><code>mem</code></em>
 is a <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLMemory" title="GstGLMemory"><span class="type">GstGLMemory</span></a></p>
 </div>
@@ -613,44 +258,22 @@
 <div class="refsect1">
 <a name="gst-plugins-bad-libs-gstglmemory.other_details"></a><h2>Types and Values</h2>
 <div class="refsect2">
-<a name="GstGLAllocator-struct"></a><h3>GstGLAllocator</h3>
-<pre class="programlisting">typedef struct _GstGLAllocator GstGLAllocator;</pre>
-<p>Opaque <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLAllocator"><span class="type">GstGLAllocator</span></a> struct</p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GstGLAllocatorClass"></a><h3>GstGLAllocatorClass</h3>
-<pre class="programlisting">typedef struct {
-  GstGLBaseBufferAllocatorClass parent_class;
-} GstGLAllocatorClass;
-</pre>
-<p>The <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLAllocatorClass" title="GstGLAllocatorClass"><span class="type">GstGLAllocatorClass</span></a> only contains private data</p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GST-GL-MEMORY-ALLOCATOR:CAPS"></a><h3>GST_GL_MEMORY_ALLOCATOR</h3>
-<pre class="programlisting">#define GST_GL_MEMORY_ALLOCATOR   "GLMemory"
-</pre>
-<p>The name of the GL memory allocator</p>
-</div>
-<hr>
-<div class="refsect2">
 <a name="GstGLMemory"></a><h3>GstGLMemory</h3>
 <pre class="programlisting">typedef struct {
-  GstGLBaseBuffer       mem;
+  GstGLBaseMemory           mem;
 
-  guint                 tex_id;
-  guint                 tex_target;
-  GstVideoGLTextureType tex_type;
-  GstVideoInfo          info;
-  GstVideoAlignment     valign;
-  guint                 plane;
-  gfloat                tex_scaling[2];
+  guint                     tex_id;
+  GstGLTextureTarget        tex_target;
+  GstVideoGLTextureType     tex_type;
+  GstVideoInfo              info;
+  GstVideoAlignment         valign;
+  guint                     plane;
+  gfloat                    tex_scaling[2];
 } GstGLMemory;
 </pre>
 <p>Represents information about a GL texture</p>
 <div class="refsect3">
-<a name="id-1.2.9.17.9.5.5"></a><h4>Members</h4>
+<a name="id-1.2.9.16.7.2.5"></a><h4>Members</h4>
 <div class="informaltable"><table width="100%" border="0">
 <colgroup>
 <col width="300px" class="struct_members_name">
@@ -659,7 +282,7 @@
 </colgroup>
 <tbody>
 <tr>
-<td class="struct_member_name"><p><span class="type">GstGLBaseBuffer</span> <em class="structfield"><code><a name="GstGLMemory.mem"></a>mem</code></em>;</p></td>
+<td class="struct_member_name"><p><span class="type">GstGLBaseMemory</span> <em class="structfield"><code><a name="GstGLMemory.mem"></a>mem</code></em>;</p></td>
 <td class="struct_member_description"><p>the parent object</p></td>
 <td class="struct_member_annotations"> </td>
 </tr>
@@ -669,7 +292,7 @@
 <td class="struct_member_annotations"> </td>
 </tr>
 <tr>
-<td class="struct_member_name"><p><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> <em class="structfield"><code><a name="GstGLMemory.tex-target"></a>tex_target</code></em>;</p></td>
+<td class="struct_member_name"><p><span class="type">GstGLTextureTarget</span> <em class="structfield"><code><a name="GstGLMemory.tex-target"></a>tex_target</code></em>;</p></td>
 <td class="struct_member_description"><p>the GL texture target for this memory</p></td>
 <td class="struct_member_annotations"> </td>
 </tr>
diff --git a/docs/libs/html/gst-plugins-bad-libs-gstglshader.html b/docs/libs/html/gst-plugins-bad-libs-gstglshader.html
index 04283ef..f579896 100644
--- a/docs/libs/html/gst-plugins-bad-libs-gstglshader.html
+++ b/docs/libs/html/gst-plugins-bad-libs-gstglshader.html
@@ -43,34 +43,6 @@
 <tbody>
 <tr>
 <td class="function_type">
-<a href="https://developer.gnome.org/glib/unstable/glib-Quarks.html#GQuark"><span class="returnvalue">GQuark</span></a>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-error-quark" title="gst_gl_shader_error_quark ()">gst_gl_shader_error_quark</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="define_keyword">#define</td>
-<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GST-GL-SHADER-ERROR:CAPS" title="GST_GL_SHADER_ERROR">GST_GL_SHADER_ERROR</a></td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">int</span>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shadervariable-set" title="gst_gl_shadervariable_set ()">gst_gl_shadervariable_set</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">int</span>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shadervariables-parse" title="gst_gl_shadervariables_parse ()">gst_gl_shadervariables_parse</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
 <a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="returnvalue">GstGLShader</span></a> *
 </td>
 <td class="function_name">
@@ -79,36 +51,6 @@
 </tr>
 <tr>
 <td class="function_type">
-<span class="returnvalue">void</span>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-set-vertex-source" title="gst_gl_shader_set_vertex_source ()">gst_gl_shader_set_vertex_source</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">void</span>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-set-fragment-source" title="gst_gl_shader_set_fragment_source ()">gst_gl_shader_set_fragment_source</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-get-vertex-source" title="gst_gl_shader_get_vertex_source ()">gst_gl_shader_get_vertex_source</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-get-fragment-source" title="gst_gl_shader_get_fragment_source ()">gst_gl_shader_get_fragment_source</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
 <span class="returnvalue">int</span>
 </td>
 <td class="function_name">
@@ -120,70 +62,6 @@
 <span class="returnvalue">void</span>
 </td>
 <td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-set-active" title="gst_gl_shader_set_active ()">gst_gl_shader_set_active</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-is-compiled" title="gst_gl_shader_is_compiled ()">gst_gl_shader_is_compiled</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile" title="gst_gl_shader_compile ()">gst_gl_shader_compile</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile-and-check" title="gst_gl_shader_compile_and_check ()">gst_gl_shader_compile_and_check</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile-all-with-attribs-and-check" title="gst_gl_shader_compile_all_with_attribs_and_check ()">gst_gl_shader_compile_all_with_attribs_and_check</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile-with-default-f-and-check" title="gst_gl_shader_compile_with_default_f_and_check ()">gst_gl_shader_compile_with_default_f_and_check</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile-with-default-v-and-check" title="gst_gl_shader_compile_with_default_v_and_check ()">gst_gl_shader_compile_with_default_v_and_check</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-</td>
-<td class="function_name">
-<a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile-with-default-vf-and-check" title="gst_gl_shader_compile_with_default_vf_and_check ()">gst_gl_shader_compile_with_default_vf_and_check</a> <span class="c_punctuation">()</span>
-</td>
-</tr>
-<tr>
-<td class="function_type">
-<span class="returnvalue">void</span>
-</td>
-<td class="function_name">
 <a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-release" title="gst_gl_shader_release ()">gst_gl_shader_release</a> <span class="c_punctuation">()</span>
 </td>
 </tr>
@@ -422,31 +300,11 @@
 <col width="300px" class="properties_name">
 <col width="200px" class="properties_flags">
 </colgroup>
-<tbody>
-<tr>
-<td class="property_type">
-<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
-<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader--active" title="The “active” property">active</a></td>
-<td class="property_flags">Read / Write</td>
-</tr>
-<tr>
+<tbody><tr>
 <td class="property_type"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
-<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader--compiled" title="The “compiled” property">compiled</a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader--linked" title="The “linked” property">linked</a></td>
 <td class="property_flags">Read</td>
-</tr>
-<tr>
-<td class="property_type">
-<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
-<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader--fragment-src" title="The “fragment-src” property">fragment-src</a></td>
-<td class="property_flags">Read / Write</td>
-</tr>
-<tr>
-<td class="property_type">
-<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
-<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader--vertex-src" title="The “vertex-src” property">vertex-src</a></td>
-<td class="property_flags">Read / Write</td>
-</tr>
-</tbody>
+</tr></tbody>
 </table></div>
 </div>
 <a name="GstGLShader"></a><div class="refsect1">
@@ -456,24 +314,10 @@
 <col width="150px" class="name">
 <col class="description">
 </colgroup>
-<tbody>
-<tr>
-<td class="datatype_keyword">enum</td>
-<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShaderError" title="enum GstGLShaderError">GstGLShaderError</a></td>
-</tr>
-<tr>
-<td class="datatype_keyword">enum</td>
-<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShaderSourceType" title="enum GstGLShaderSourceType">GstGLShaderSourceType</a></td>
-</tr>
-<tr>
-<td class="datatype_keyword">struct</td>
-<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstglshader.html#gst-gl-shadervariable-desc" title="struct gst_gl_shadervariable_desc">gst_gl_shadervariable_desc</a></td>
-</tr>
-<tr>
+<tbody><tr>
 <td class="datatype_keyword"> </td>
 <td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader-struct" title="GstGLShader">GstGLShader</a></td>
-</tr>
-</tbody>
+</tr></tbody>
 </table></div>
 </div>
 <div class="refsect1">
@@ -490,150 +334,104 @@
 <div class="refsect1">
 <a name="gst-plugins-bad-libs-gstglshader.functions_details"></a><h2>Functions</h2>
 <div class="refsect2">
-<a name="gst-gl-shader-error-quark"></a><h3>gst_gl_shader_error_quark ()</h3>
-<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Quarks.html#GQuark"><span class="returnvalue">GQuark</span></a>
-gst_gl_shader_error_quark (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GST-GL-SHADER-ERROR:CAPS"></a><h3>GST_GL_SHADER_ERROR</h3>
-<pre class="programlisting">#define GST_GL_SHADER_ERROR (gst_gl_shader_error_quark ())
-</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-shadervariable-set"></a><h3>gst_gl_shadervariable_set ()</h3>
-<pre class="programlisting"><span class="returnvalue">int</span>
-gst_gl_shadervariable_set (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a> *shader</code></em>,
-                           <em class="parameter"><code><span class="type">struct gst_gl_shadervariable_desc</span> *ret</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-shadervariables-parse"></a><h3>gst_gl_shadervariables_parse ()</h3>
-<pre class="programlisting"><span class="returnvalue">int</span>
-gst_gl_shadervariables_parse (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a> *shader</code></em>,
-                              <em class="parameter"><code><span class="type">char</span> *variables</code></em>,
-                              <em class="parameter"><code><span class="type">int</span> (*_setvariable) (GstGLShader * shader, struct gst_gl_shadervariable_desc * v)</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
 <a name="gst-gl-shader-new"></a><h3>gst_gl_shader_new ()</h3>
 <pre class="programlisting"><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="returnvalue">GstGLShader</span></a> *
 gst_gl_shader_new (<em class="parameter"><code><a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a> *context</code></em>);</pre>
+<p>Note: must be called in the GL thread</p>
+<div class="refsect3">
+<a name="id-1.2.9.17.9.2.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>context</p></td>
+<td class="parameter_description"><p>a <a class="link" href="GstGLContext.html" title="GstGLContext"><span class="type">GstGLContext</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
 </div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-shader-set-vertex-source"></a><h3>gst_gl_shader_set_vertex_source ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-gst_gl_shader_set_vertex_source (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a> *shader</code></em>,
-                                 <em class="parameter"><code>const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *src</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.9.17.9.2.6"></a><h4>Returns</h4>
+<p> a new empty <em class="parameter"><code>shader</code></em>
+. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
 </div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-shader-set-fragment-source"></a><h3>gst_gl_shader_set_fragment_source ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-gst_gl_shader_set_fragment_source (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a> *shader</code></em>,
-                                   <em class="parameter"><code>const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *src</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-shader-get-vertex-source"></a><h3>gst_gl_shader_get_vertex_source ()</h3>
-<pre class="programlisting">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
-gst_gl_shader_get_vertex_source (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a> *shader</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-shader-get-fragment-source"></a><h3>gst_gl_shader_get_fragment_source ()</h3>
-<pre class="programlisting">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
-gst_gl_shader_get_fragment_source (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a> *shader</code></em>);</pre>
 </div>
 <hr>
 <div class="refsect2">
 <a name="gst-gl-shader-get-program-handle"></a><h3>gst_gl_shader_get_program_handle ()</h3>
 <pre class="programlisting"><span class="returnvalue">int</span>
 gst_gl_shader_get_program_handle (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a> *shader</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.9.17.9.3.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>shader</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
 </div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-shader-set-active"></a><h3>gst_gl_shader_set_active ()</h3>
-<pre class="programlisting"><span class="returnvalue">void</span>
-gst_gl_shader_set_active (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a> *shader</code></em>,
-                          <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> active</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.9.17.9.3.5"></a><h4>Returns</h4>
+<p> the GL program handle for this shader</p>
 </div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-shader-is-compiled"></a><h3>gst_gl_shader_is_compiled ()</h3>
-<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_gl_shader_is_compiled (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a> *shader</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-shader-compile"></a><h3>gst_gl_shader_compile ()</h3>
-<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_gl_shader_compile (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a> *shader</code></em>,
-                       <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a> **error</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-shader-compile-and-check"></a><h3>gst_gl_shader_compile_and_check ()</h3>
-<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_gl_shader_compile_and_check (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a> *shader</code></em>,
-                                 <em class="parameter"><code>const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *source</code></em>,
-                                 <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShaderSourceType" title="enum GstGLShaderSourceType"><span class="type">GstGLShaderSourceType</span></a> type</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-shader-compile-all-with-attribs-and-check"></a><h3>gst_gl_shader_compile_all_with_attribs_and_check ()</h3>
-<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_gl_shader_compile_all_with_attribs_and_check
-                               (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a> *shader</code></em>,
-                                <em class="parameter"><code>const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *v_src</code></em>,
-                                <em class="parameter"><code>const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *f_src</code></em>,
-                                <em class="parameter"><code>const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> n_attribs</code></em>,
-                                <em class="parameter"><code>const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *attrib_names[]</code></em>,
-                                <em class="parameter"><code><span class="type">GLint</span> attrib_locs[]</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-shader-compile-with-default-f-and-check"></a><h3>gst_gl_shader_compile_with_default_f_and_check ()</h3>
-<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_gl_shader_compile_with_default_f_and_check
-                               (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a> *shader</code></em>,
-                                <em class="parameter"><code>const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *v_src</code></em>,
-                                <em class="parameter"><code>const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> n_attribs</code></em>,
-                                <em class="parameter"><code>const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *attrib_names[]</code></em>,
-                                <em class="parameter"><code><span class="type">GLint</span> attrib_locs[]</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-shader-compile-with-default-v-and-check"></a><h3>gst_gl_shader_compile_with_default_v_and_check ()</h3>
-<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_gl_shader_compile_with_default_v_and_check
-                               (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a> *shader</code></em>,
-                                <em class="parameter"><code>const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *f_src</code></em>,
-                                <em class="parameter"><code><span class="type">GLint</span> *pos_loc</code></em>,
-                                <em class="parameter"><code><span class="type">GLint</span> *tex_loc</code></em>);</pre>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-shader-compile-with-default-vf-and-check"></a><h3>gst_gl_shader_compile_with_default_vf_and_check ()</h3>
-<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
-gst_gl_shader_compile_with_default_vf_and_check
-                               (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a> *shader</code></em>,
-                                <em class="parameter"><code><span class="type">GLint</span> *pos_loc</code></em>,
-                                <em class="parameter"><code><span class="type">GLint</span> *tex_loc</code></em>);</pre>
 </div>
 <hr>
 <div class="refsect2">
 <a name="gst-gl-shader-release"></a><h3>gst_gl_shader_release ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gst_gl_shader_release (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a> *shader</code></em>);</pre>
+<p>Releases the shader and stages.</p>
+<p>Note: must be called in the GL thread</p>
+<div class="refsect3">
+<a name="id-1.2.9.17.9.4.6"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>shader</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
 </div>
 <hr>
 <div class="refsect2">
 <a name="gst-gl-shader-use"></a><h3>gst_gl_shader_use ()</h3>
 <pre class="programlisting"><span class="returnvalue">void</span>
 gst_gl_shader_use (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a> *shader</code></em>);</pre>
+<p>Mark's <em class="parameter"><code>shader</code></em>
+ as being used for the next GL draw command.</p>
+<p>Note: must be called in the GL thread and <em class="parameter"><code>shader</code></em>
+ must have been linked.</p>
+<div class="refsect3">
+<a name="id-1.2.9.17.9.5.6"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>shader</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader"><span class="type">GstGLShader</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
 </div>
 <hr>
 <div class="refsect2">
@@ -898,68 +696,6 @@
 <div class="refsect1">
 <a name="gst-plugins-bad-libs-gstglshader.other_details"></a><h2>Types and Values</h2>
 <div class="refsect2">
-<a name="GstGLShaderError"></a><h3>enum GstGLShaderError</h3>
-<div class="refsect3">
-<a name="id-1.2.9.18.10.2.3"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="300px" class="enum_members_name">
-<col class="enum_members_description">
-<col width="200px" class="enum_members_annotations">
-</colgroup>
-<tbody>
-<tr>
-<td class="enum_member_name"><p><a name="GST-GL-SHADER-ERROR-COMPILE:CAPS"></a>GST_GL_SHADER_ERROR_COMPILE</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="GST-GL-SHADER-ERROR-LINK:CAPS"></a>GST_GL_SHADER_ERROR_LINK</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="GST-GL-SHADER-ERROR-PROGRAM:CAPS"></a>GST_GL_SHADER_ERROR_PROGRAM</p></td>
-<td> </td>
-<td> </td>
-</tr>
-</tbody>
-</table></div>
-</div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GstGLShaderSourceType"></a><h3>enum GstGLShaderSourceType</h3>
-<div class="refsect3">
-<a name="id-1.2.9.18.10.3.3"></a><h4>Members</h4>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="300px" class="enum_members_name">
-<col class="enum_members_description">
-<col width="200px" class="enum_members_annotations">
-</colgroup>
-<tbody>
-<tr>
-<td class="enum_member_name"><p><a name="GST-GL-SHADER-FRAGMENT-SOURCE:CAPS"></a>GST_GL_SHADER_FRAGMENT_SOURCE</p></td>
-<td> </td>
-<td> </td>
-</tr>
-<tr>
-<td class="enum_member_name"><p><a name="GST-GL-SHADER-VERTEX-SOURCE:CAPS"></a>GST_GL_SHADER_VERTEX_SOURCE</p></td>
-<td> </td>
-<td> </td>
-</tr>
-</tbody>
-</table></div>
-</div>
-</div>
-<hr>
-<div class="refsect2">
-<a name="gst-gl-shadervariable-desc"></a><h3>struct gst_gl_shadervariable_desc</h3>
-<pre class="programlisting">struct gst_gl_shadervariable_desc;</pre>
-</div>
-<hr>
-<div class="refsect2">
 <a name="GstGLShader-struct"></a><h3>GstGLShader</h3>
 <pre class="programlisting">typedef struct _GstGLShader GstGLShader;</pre>
 </div>
@@ -967,36 +703,12 @@
 <div class="refsect1">
 <a name="gst-plugins-bad-libs-gstglshader.property-details"></a><h2>Property Details</h2>
 <div class="refsect2">
-<a name="GstGLShader--active"></a><h3>The <code class="literal">“active”</code> property</h3>
-<pre class="programlisting">  “active”                   <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
-<p>Enable/Disable the shader.</p>
-<p>Flags: Read / Write</p>
-<p>Default value: NULL</p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GstGLShader--compiled"></a><h3>The <code class="literal">“compiled”</code> property</h3>
-<pre class="programlisting">  “compiled”                 <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
-<p>Shader compile and link status.</p>
+<a name="GstGLShader--linked"></a><h3>The <code class="literal">“linked”</code> property</h3>
+<pre class="programlisting">  “linked”                   <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Shader link status.</p>
 <p>Flags: Read</p>
 <p>Default value: FALSE</p>
 </div>
-<hr>
-<div class="refsect2">
-<a name="GstGLShader--fragment-src"></a><h3>The <code class="literal">“fragment-src”</code> property</h3>
-<pre class="programlisting">  “fragment-src”             <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
-<p>GLSL Fragment Shader source code.</p>
-<p>Flags: Read / Write</p>
-<p>Default value: NULL</p>
-</div>
-<hr>
-<div class="refsect2">
-<a name="GstGLShader--vertex-src"></a><h3>The <code class="literal">“vertex-src”</code> property</h3>
-<pre class="programlisting">  “vertex-src”               <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
-<p>GLSL Vertex Shader source code.</p>
-<p>Flags: Read / Write</p>
-<p>Default value: NULL</p>
-</div>
 </div>
 </div>
 <div class="footer">
diff --git a/docs/libs/html/gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html b/docs/libs/html/gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html
new file mode 100644
index 0000000..caf3ffa
--- /dev/null
+++ b/docs/libs/html/gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html
@@ -0,0 +1,93 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstplayer-gmaincontextsignaldispatcher: GStreamer Bad Plugins 1.0 Library Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Library Reference Manual">
+<link rel="up" href="player.html" title="Player Library">
+<link rel="prev" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">
+<link rel="next" href="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html" title="gstplayer-videooverlayvideorenderer">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.description" class="shortcut">Description</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="player.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-libs-gstplayer-mediainfo.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.top_of_page"></a>gstplayer-gmaincontextsignaldispatcher</span></h2>
+<p>gstplayer-gmaincontextsignaldispatcher — Player GLib MainContext dispatcher</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody><tr>
+<td class="function_type">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerSignalDispatcher"><span class="returnvalue">GstPlayerSignalDispatcher</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html#gst-player-g-main-context-signal-dispatcher-new" title="gst_player_g_main_context_signal_dispatcher_new ()">gst_player_g_main_context_signal_dispatcher_new</a> <span class="c_punctuation">()</span>
+</td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.description"></a><h2>Description</h2>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="gst-player-g-main-context-signal-dispatcher-new"></a><h3>gst_player_g_main_context_signal_dispatcher_new ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerSignalDispatcher"><span class="returnvalue">GstPlayerSignalDispatcher</span></a> *
+gst_player_g_main_context_signal_dispatcher_new
+                               (<em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-The-Main-Event-Loop.html#GMainContext"><span class="type">GMainContext</span></a> *application_context</code></em>);</pre>
+<p>Creates a new GstPlayerSignalDispatcher that uses <em class="parameter"><code>application_context</code></em>
+,
+or the thread default one if <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> is used. See <a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-new-full" title="gst_player_new_full ()"><code class="function">gst_player_new_full()</code></a>.</p>
+<div class="refsect3">
+<a name="id-1.2.10.4.5.2.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>application_context</p></td>
+<td class="parameter_description"><p> GMainContext to use or <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.4.5.2.6"></a><h4>Returns</h4>
+<p> the new GstPlayerSignalDispatcher. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.24</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-bad-libs-gstplayer-mediainfo.html b/docs/libs/html/gst-plugins-bad-libs-gstplayer-mediainfo.html
new file mode 100644
index 0000000..f69807f
--- /dev/null
+++ b/docs/libs/html/gst-plugins-bad-libs-gstplayer-mediainfo.html
@@ -0,0 +1,961 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstplayer-mediainfo: GStreamer Bad Plugins 1.0 Library Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Library Reference Manual">
+<link rel="up" href="player.html" title="Player Library">
+<link rel="prev" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">
+<link rel="next" href="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html" title="gstplayer-gmaincontextsignaldispatcher">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#gst-plugins-bad-libs-gstplayer-mediainfo.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#gst-plugins-bad-libs-gstplayer-mediainfo.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="player.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-libs-gstplayer.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-bad-libs-gstplayer-mediainfo"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-libs-gstplayer-mediainfo.top_of_page"></a>gstplayer-mediainfo</span></h2>
+<p>gstplayer-mediainfo — Player Media Information</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer-mediainfo.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-uri" title="gst_player_media_info_get_uri ()">gst_player_media_info_get_uri</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-duration" title="gst_player_media_info_get_duration ()">gst_player_media_info_get_duration</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-title" title="gst_player_media_info_get_title ()">gst_player_media_info_get_title</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-container-format" title="gst_player_media_info_get_container_format ()">gst_player_media_info_get_container_format</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-is-seekable" title="gst_player_media_info_is_seekable ()">gst_player_media_info_is_seekable</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstSample.html"><span class="returnvalue">GstSample</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-image-sample" title="gst_player_media_info_get_image_sample ()">gst_player_media_info_get_image_sample</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstTagList.html"><span class="returnvalue">GstTagList</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-tags" title="gst_player_media_info_get_tags ()">gst_player_media_info_get_tags</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-stream-list" title="gst_player_media_info_get_stream_list ()">gst_player_media_info_get_stream_list</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-stream-info-get-index" title="gst_player_stream_info_get_index ()">gst_player_stream_info_get_index</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstCaps.html"><span class="returnvalue">GstCaps</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-stream-info-get-caps" title="gst_player_stream_info_get_caps ()">gst_player_stream_info_get_caps</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstTagList.html"><span class="returnvalue">GstTagList</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-stream-info-get-tags" title="gst_player_stream_info_get_tags ()">gst_player_stream_info_get_tags</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-stream-info-get-codec" title="gst_player_stream_info_get_codec ()">gst_player_stream_info_get_codec</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-stream-info-get-stream-type" title="gst_player_stream_info_get_stream_type ()">gst_player_stream_info_get_stream_type</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-audio-info-get-bitrate" title="gst_player_audio_info_get_bitrate ()">gst_player_audio_info_get_bitrate</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-audio-info-get-channels" title="gst_player_audio_info_get_channels ()">gst_player_audio_info_get_channels</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-audio-info-get-language" title="gst_player_audio_info_get_language ()">gst_player_audio_info_get_language</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-audio-info-get-max-bitrate" title="gst_player_audio_info_get_max_bitrate ()">gst_player_audio_info_get_max_bitrate</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-audio-info-get-sample-rate" title="gst_player_audio_info_get_sample_rate ()">gst_player_audio_info_get_sample_rate</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-bitrate" title="gst_player_video_info_get_bitrate ()">gst_player_video_info_get_bitrate</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-height" title="gst_player_video_info_get_height ()">gst_player_video_info_get_height</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-width" title="gst_player_video_info_get_width ()">gst_player_video_info_get_width</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-framerate" title="gst_player_video_info_get_framerate ()">gst_player_video_info_get_framerate</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-max-bitrate" title="gst_player_video_info_get_max_bitrate ()">gst_player_video_info_get_max_bitrate</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-pixel-aspect-ratio" title="gst_player_video_info_get_pixel_aspect_ratio ()">gst_player_video_info_get_pixel_aspect_ratio</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-subtitle-info-get-language" title="gst_player_subtitle_info_get_language ()">gst_player_subtitle_info_get_language</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="GstPlayerMediaInfo"></a><a name="GstPlayerStreamInfo"></a><a name="GstPlayerAudioInfo"></a><a name="GstPlayerVideoInfo"></a><a name="GstPlayerSubtitleInfo"></a><div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer-mediainfo.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo-struct" title="GstPlayerMediaInfo">GstPlayerMediaInfo</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo-struct" title="GstPlayerStreamInfo">GstPlayerStreamInfo</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo-struct" title="GstPlayerAudioInfo">GstPlayerAudioInfo</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo-struct" title="GstPlayerVideoInfo">GstPlayerVideoInfo</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerSubtitleInfo-struct" title="GstPlayerSubtitleInfo">GstPlayerSubtitleInfo</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer-mediainfo.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+    <span class="lineart">├──</span> GstPlayerMediaInfo
+    <span class="lineart">╰──</span> GstPlayerStreamInfo
+        <span class="lineart">├──</span> GstPlayerAudioInfo
+        <span class="lineart">├──</span> GstPlayerSubtitleInfo
+        <span class="lineart">╰──</span> GstPlayerVideoInfo
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer-mediainfo.description"></a><h2>Description</h2>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer-mediainfo.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="gst-player-media-info-get-uri"></a><h3>gst_player_media_info_get_uri ()</h3>
+<pre class="programlisting">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+gst_player_media_info_get_uri (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.2.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.2.5"></a><h4>Returns</h4>
+<p> the URI associated with <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a>.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-media-info-get-duration"></a><h3>gst_player_media_info_get_duration ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a>
+gst_player_media_info_get_duration (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.3.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.3.5"></a><h4>Returns</h4>
+<p> duration of the media.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-media-info-get-title"></a><h3>gst_player_media_info_get_title ()</h3>
+<pre class="programlisting">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+gst_player_media_info_get_title (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.4.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.4.5"></a><h4>Returns</h4>
+<p> the media title.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-media-info-get-container-format"></a><h3>gst_player_media_info_get_container_format ()</h3>
+<pre class="programlisting">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+gst_player_media_info_get_container_format
+                               (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.5.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.5.5"></a><h4>Returns</h4>
+<p> the container format.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-media-info-is-seekable"></a><h3>gst_player_media_info_is_seekable ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gst_player_media_info_is_seekable (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.6.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.6.5"></a><h4>Returns</h4>
+<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the media is seekable.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-media-info-get-image-sample"></a><h3>gst_player_media_info_get_image_sample ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstSample.html"><span class="returnvalue">GstSample</span></a> *
+gst_player_media_info_get_image_sample
+                               (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a> *info</code></em>);</pre>
+<p>Function to get the image (or preview-image) stored in taglist.
+Application can use gst_sample_*_() API's to get caps, buffer etc.</p>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.7.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.7.6"></a><h4>Returns</h4>
+<p> GstSample or NULL. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-media-info-get-tags"></a><h3>gst_player_media_info_get_tags ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstTagList.html"><span class="returnvalue">GstTagList</span></a> *
+gst_player_media_info_get_tags (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.8.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.8.5"></a><h4>Returns</h4>
+<p> the tags contained in media info. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-media-info-get-stream-list"></a><h3>gst_player_media_info_get_stream_list ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *
+gst_player_media_info_get_stream_list (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.9.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.9.5"></a><h4>Returns</h4>
+<p> A <a href="https://developer.gnome.org/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of
+matching <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo"><span class="type">GstPlayerStreamInfo</span></a>. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GstPlayerStreamInfo]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-stream-info-get-index"></a><h3>gst_player_stream_info_get_index ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+gst_player_stream_info_get_index (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo"><span class="type">GstPlayerStreamInfo</span></a> *info</code></em>);</pre>
+<p>Function to get stream index from <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo"><span class="type">GstPlayerStreamInfo</span></a> instance.</p>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.10.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo"><span class="type">GstPlayerStreamInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.10.6"></a><h4>Returns</h4>
+<p> the stream index of this stream.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-stream-info-get-caps"></a><h3>gst_player_stream_info_get_caps ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstCaps.html"><span class="returnvalue">GstCaps</span></a> *
+gst_player_stream_info_get_caps (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo"><span class="type">GstPlayerStreamInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.11.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo"><span class="type">GstPlayerStreamInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.11.5"></a><h4>Returns</h4>
+<p> the <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstCaps.html"><span class="type">GstCaps</span></a> of the stream. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-stream-info-get-tags"></a><h3>gst_player_stream_info_get_tags ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstTagList.html"><span class="returnvalue">GstTagList</span></a> *
+gst_player_stream_info_get_tags (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo"><span class="type">GstPlayerStreamInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.12.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo"><span class="type">GstPlayerStreamInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.12.5"></a><h4>Returns</h4>
+<p> the tags contained in this stream. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-stream-info-get-codec"></a><h3>gst_player_stream_info_get_codec ()</h3>
+<pre class="programlisting">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+gst_player_stream_info_get_codec (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo"><span class="type">GstPlayerStreamInfo</span></a> *info</code></em>);</pre>
+<p>A string describing codec used in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo"><span class="type">GstPlayerStreamInfo</span></a>.</p>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.13.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo"><span class="type">GstPlayerStreamInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.13.6"></a><h4>Returns</h4>
+<p> codec string or NULL on unknown.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-stream-info-get-stream-type"></a><h3>gst_player_stream_info_get_stream_type ()</h3>
+<pre class="programlisting">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+gst_player_stream_info_get_stream_type
+                               (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo"><span class="type">GstPlayerStreamInfo</span></a> *info</code></em>);</pre>
+<p>Function to return human readable name for the stream type
+of the given <em class="parameter"><code>info</code></em>
+ (ex: "audio", "video", "subtitle")</p>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.14.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo"><span class="type">GstPlayerStreamInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.14.6"></a><h4>Returns</h4>
+<p> a human readable name</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-audio-info-get-bitrate"></a><h3>gst_player_audio_info_get_bitrate ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+gst_player_audio_info_get_bitrate (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="type">GstPlayerAudioInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.15.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="type">GstPlayerAudioInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.15.5"></a><h4>Returns</h4>
+<p> the audio bitrate in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="type">GstPlayerAudioInfo</span></a>.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-audio-info-get-channels"></a><h3>gst_player_audio_info_get_channels ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+gst_player_audio_info_get_channels (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="type">GstPlayerAudioInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.16.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="type">GstPlayerAudioInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.16.5"></a><h4>Returns</h4>
+<p> the number of audio channels in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="type">GstPlayerAudioInfo</span></a>.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-audio-info-get-language"></a><h3>gst_player_audio_info_get_language ()</h3>
+<pre class="programlisting">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+gst_player_audio_info_get_language (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="type">GstPlayerAudioInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.17.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="type">GstPlayerAudioInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.17.5"></a><h4>Returns</h4>
+<p> the language of the stream, or NULL if unknown.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-audio-info-get-max-bitrate"></a><h3>gst_player_audio_info_get_max_bitrate ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+gst_player_audio_info_get_max_bitrate (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="type">GstPlayerAudioInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.18.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="type">GstPlayerAudioInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.18.5"></a><h4>Returns</h4>
+<p> the audio maximum bitrate in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="type">GstPlayerAudioInfo</span></a>.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-audio-info-get-sample-rate"></a><h3>gst_player_audio_info_get_sample_rate ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+gst_player_audio_info_get_sample_rate (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="type">GstPlayerAudioInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.19.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="type">GstPlayerAudioInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.19.5"></a><h4>Returns</h4>
+<p> the audio sample rate in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="type">GstPlayerAudioInfo</span></a>.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-video-info-get-bitrate"></a><h3>gst_player_video_info_get_bitrate ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+gst_player_video_info_get_bitrate (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="type">GstPlayerVideoInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.20.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="type">GstPlayerVideoInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.20.5"></a><h4>Returns</h4>
+<p> the current bitrate of video in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="type">GstPlayerVideoInfo</span></a>.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-video-info-get-height"></a><h3>gst_player_video_info_get_height ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+gst_player_video_info_get_height (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="type">GstPlayerVideoInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.21.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="type">GstPlayerVideoInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.21.5"></a><h4>Returns</h4>
+<p> the height of video in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="type">GstPlayerVideoInfo</span></a>.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-video-info-get-width"></a><h3>gst_player_video_info_get_width ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+gst_player_video_info_get_width (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="type">GstPlayerVideoInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.22.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="type">GstPlayerVideoInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.22.5"></a><h4>Returns</h4>
+<p> the width of video in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="type">GstPlayerVideoInfo</span></a>.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-video-info-get-framerate"></a><h3>gst_player_video_info_get_framerate ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_video_info_get_framerate (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="type">GstPlayerVideoInfo</span></a> *info</code></em>,
+                                     <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *fps_n</code></em>,
+                                     <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> *fps_d</code></em>);</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-video-info-get-max-bitrate"></a><h3>gst_player_video_info_get_max_bitrate ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="returnvalue">gint</span></a>
+gst_player_video_info_get_max_bitrate (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="type">GstPlayerVideoInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.24.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="type">GstPlayerVideoInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.24.5"></a><h4>Returns</h4>
+<p> the maximum bitrate of video in <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="type">GstPlayerVideoInfo</span></a>.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-video-info-get-pixel-aspect-ratio"></a><h3>gst_player_video_info_get_pixel_aspect_ratio ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_video_info_get_pixel_aspect_ratio
+                               (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="type">GstPlayerVideoInfo</span></a> *info</code></em>,
+                                <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *par_n</code></em>,
+                                <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> *par_d</code></em>);</pre>
+<p>Returns the pixel aspect ratio in <em class="parameter"><code>par_n</code></em>
+ and <em class="parameter"><code>par_d</code></em>
+</p>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.25.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="type">GstPlayerVideoInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>par_n</p></td>
+<td class="parameter_description"><p> numerator. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>par_d</p></td>
+<td class="parameter_description"><p> denominator. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Parameter for returning results. Default is transfer full."><span class="acronym">out</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-subtitle-info-get-language"></a><h3>gst_player_subtitle_info_get_language ()</h3>
+<pre class="programlisting">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+gst_player_subtitle_info_get_language (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerSubtitleInfo"><span class="type">GstPlayerSubtitleInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.26.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerSubtitleInfo"><span class="type">GstPlayerSubtitleInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.3.12.26.5"></a><h4>Returns</h4>
+<p> the language of the stream, or NULL if unknown.</p>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer-mediainfo.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstPlayerMediaInfo-struct"></a><h3>GstPlayerMediaInfo</h3>
+<pre class="programlisting">typedef struct _GstPlayerMediaInfo GstPlayerMediaInfo;</pre>
+<p>Structure containing the media information of a URI.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayerStreamInfo-struct"></a><h3>GstPlayerStreamInfo</h3>
+<pre class="programlisting">typedef struct _GstPlayerStreamInfo GstPlayerStreamInfo;</pre>
+<p>Base structure for information concering a media stream. Depending on
+the stream type, one can find more media-specific information in
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="type">GstPlayerVideoInfo</span></a>, <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="type">GstPlayerAudioInfo</span></a>, <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerSubtitleInfo"><span class="type">GstPlayerSubtitleInfo</span></a>.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayerAudioInfo-struct"></a><h3>GstPlayerAudioInfo</h3>
+<pre class="programlisting">typedef struct _GstPlayerAudioInfo GstPlayerAudioInfo;</pre>
+<p><a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo"><span class="type">GstPlayerStreamInfo</span></a> specific to audio streams.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayerVideoInfo-struct"></a><h3>GstPlayerVideoInfo</h3>
+<pre class="programlisting">typedef struct _GstPlayerVideoInfo GstPlayerVideoInfo;</pre>
+<p><a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo"><span class="type">GstPlayerStreamInfo</span></a> specific to video streams.</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayerSubtitleInfo-struct"></a><h3>GstPlayerSubtitleInfo</h3>
+<pre class="programlisting">typedef struct _GstPlayerSubtitleInfo GstPlayerSubtitleInfo;</pre>
+<p><a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo"><span class="type">GstPlayerStreamInfo</span></a> specific to subtitle streams.</p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.24</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html b/docs/libs/html/gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html
new file mode 100644
index 0000000..08e32ae
--- /dev/null
+++ b/docs/libs/html/gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html
@@ -0,0 +1,168 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstplayer-videooverlayvideorenderer: GStreamer Bad Plugins 1.0 Library Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Library Reference Manual">
+<link rel="up" href="player.html" title="Player Library">
+<link rel="prev" href="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html" title="gstplayer-gmaincontextsignaldispatcher">
+<link rel="next" href="gst-plugins-bad-libs-gstplayer-visualization.html" title="gstplayer-visualization">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.description" class="shortcut">Description</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="player.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-libs-gstplayer-visualization.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.top_of_page"></a>gstplayer-videooverlayvideorenderer</span></h2>
+<p>gstplayer-videooverlayvideorenderer — Player Video Overlay Video Renderer</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerVideoRenderer"><span class="returnvalue">GstPlayerVideoRenderer</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html#gst-player-video-overlay-video-renderer-new" title="gst_player_video_overlay_video_renderer_new ()">gst_player_video_overlay_video_renderer_new</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="returnvalue">gpointer</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html#gst-player-video-overlay-video-renderer-get-window-handle" title="gst_player_video_overlay_video_renderer_get_window_handle ()">gst_player_video_overlay_video_renderer_get_window_handle</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html#gst-player-video-overlay-video-renderer-set-window-handle" title="gst_player_video_overlay_video_renderer_set_window_handle ()">gst_player_video_overlay_video_renderer_set_window_handle</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.description"></a><h2>Description</h2>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="gst-player-video-overlay-video-renderer-new"></a><h3>gst_player_video_overlay_video_renderer_new ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerVideoRenderer"><span class="returnvalue">GstPlayerVideoRenderer</span></a> *
+gst_player_video_overlay_video_renderer_new
+                               (<em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> window_handle</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.5.5.2.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>window_handle</p></td>
+<td class="parameter_description"><p> Window handle to use or <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a>. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.5.5.2.5"></a><h4>Returns</h4>
+<p>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-video-overlay-video-renderer-get-window-handle"></a><h3>gst_player_video_overlay_video_renderer_get_window_handle ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="returnvalue">gpointer</span></a>
+gst_player_video_overlay_video_renderer_get_window_handle
+                               (<em class="parameter"><code><span class="type">GstPlayerVideoOverlayVideoRenderer</span> *self</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.5.5.3.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>self</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerVideoRenderer"><span class="type">GstPlayerVideoRenderer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.5.5.3.5"></a><h4>Returns</h4>
+<p> The currently set, platform specific window
+handle. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-video-overlay-video-renderer-set-window-handle"></a><h3>gst_player_video_overlay_video_renderer_set_window_handle ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_video_overlay_video_renderer_set_window_handle
+                               (<em class="parameter"><code><span class="type">GstPlayerVideoOverlayVideoRenderer</span> *self</code></em>,
+                                <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a> window_handle</code></em>);</pre>
+<p>Sets the platform specific window handle into which the video
+should be rendered</p>
+<div class="refsect3">
+<a name="id-1.2.10.5.5.4.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>self</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerVideoRenderer"><span class="type">GstPlayerVideoRenderer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>window_handle</p></td>
+<td class="parameter_description"><p>handle referencing to the platform specific window</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.other_details"></a><h2>Types and Values</h2>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.24</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-bad-libs-gstplayer-visualization.html b/docs/libs/html/gst-plugins-bad-libs-gstplayer-visualization.html
new file mode 100644
index 0000000..b6e3b0a
--- /dev/null
+++ b/docs/libs/html/gst-plugins-bad-libs-gstplayer-visualization.html
@@ -0,0 +1,226 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstplayer-visualization: GStreamer Bad Plugins 1.0 Library Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Library Reference Manual">
+<link rel="up" href="player.html" title="Player Library">
+<link rel="prev" href="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html" title="gstplayer-videooverlayvideorenderer">
+<link rel="next" href="ch08.html" title="Interfaces">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#gst-plugins-bad-libs-gstplayer-visualization.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#gst-plugins-bad-libs-gstplayer-visualization.object-hierarchy" class="shortcut">Object Hierarchy</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="player.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="ch08.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-bad-libs-gstplayer-visualization"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-libs-gstplayer-visualization.top_of_page"></a>gstplayer-visualization</span></h2>
+<p>gstplayer-visualization — Player Visualization</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer-visualization.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#GstPlayerVisualization"><span class="returnvalue">GstPlayerVisualization</span></a> **
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#gst-player-visualizations-get" title="gst_player_visualizations_get ()">gst_player_visualizations_get</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#gst-player-visualizations-free" title="gst_player_visualizations_free ()">gst_player_visualizations_free</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#GstPlayerVisualization"><span class="returnvalue">GstPlayerVisualization</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#gst-player-visualization-copy" title="gst_player_visualization_copy ()">gst_player_visualization_copy</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#gst-player-visualization-free" title="gst_player_visualization_free ()">gst_player_visualization_free</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="GstPlayerVisualization"></a><div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer-visualization.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody><tr>
+<td class="datatype_keyword">struct</td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#GstPlayerVisualization-struct" title="struct GstPlayerVisualization">GstPlayerVisualization</a></td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer-visualization.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="https://developer.gnome.org/gobject/unstable/gobject-Boxed-Types.html">GBoxed</a>
+    <span class="lineart">╰──</span> GstPlayerVisualization
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer-visualization.description"></a><h2>Description</h2>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer-visualization.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="gst-player-visualizations-get"></a><h3>gst_player_visualizations_get ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#GstPlayerVisualization"><span class="returnvalue">GstPlayerVisualization</span></a> **
+gst_player_visualizations_get (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.6.8.2.4"></a><h4>Returns</h4>
+<p> a <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> terminated array containing all available
+visualizations. Use <a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#gst-player-visualizations-free" title="gst_player_visualizations_free ()"><code class="function">gst_player_visualizations_free()</code></a> after
+usage. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="Parameter points to an array of items."><span class="acronym">array</span></acronym> zero-terminated=1][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GstPlayerVisualization]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-visualizations-free"></a><h3>gst_player_visualizations_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_visualizations_free (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#GstPlayerVisualization"><span class="type">GstPlayerVisualization</span></a> **viss</code></em>);</pre>
+<p>Frees a <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> terminated array of <a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#GstPlayerVisualization"><span class="type">GstPlayerVisualization</span></a>.</p>
+<div class="refsect3">
+<a name="id-1.2.10.6.8.3.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>viss</p></td>
+<td class="parameter_description"><p>a <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> terminated array of <a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#GstPlayerVisualization"><span class="type">GstPlayerVisualization</span></a> to free</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-visualization-copy"></a><h3>gst_player_visualization_copy ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#GstPlayerVisualization"><span class="returnvalue">GstPlayerVisualization</span></a> *
+gst_player_visualization_copy (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#GstPlayerVisualization"><span class="type">GstPlayerVisualization</span></a> *vis</code></em>);</pre>
+<p>Makes a copy of the <a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#GstPlayerVisualization"><span class="type">GstPlayerVisualization</span></a>. The result must be
+freed using <a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#gst-player-visualization-free" title="gst_player_visualization_free ()"><code class="function">gst_player_visualization_free()</code></a>.</p>
+<div class="refsect3">
+<a name="id-1.2.10.6.8.4.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>vis</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#GstPlayerVisualization"><span class="type">GstPlayerVisualization</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.6.8.4.6"></a><h4>Returns</h4>
+<p> an allocated copy of <em class="parameter"><code>vis</code></em>
+. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-visualization-free"></a><h3>gst_player_visualization_free ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_visualization_free (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#GstPlayerVisualization"><span class="type">GstPlayerVisualization</span></a> *vis</code></em>);</pre>
+<p>Frees a <a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#GstPlayerVisualization"><span class="type">GstPlayerVisualization</span></a>.</p>
+<div class="refsect3">
+<a name="id-1.2.10.6.8.5.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>vis</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#GstPlayerVisualization"><span class="type">GstPlayerVisualization</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer-visualization.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstPlayerVisualization-struct"></a><h3>struct GstPlayerVisualization</h3>
+<pre class="programlisting">struct GstPlayerVisualization {
+  gchar *name;
+  gchar *description;
+};
+</pre>
+<p>A <a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#GstPlayerVisualization"><span class="type">GstPlayerVisualization</span></a> descriptor.</p>
+<div class="refsect3">
+<a name="id-1.2.10.6.9.2.5"></a><h4>Members</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="300px" class="struct_members_name">
+<col class="struct_members_description">
+<col width="200px" class="struct_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="struct_member_name"><p><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstPlayerVisualization-struct.name"></a>name</code></em>;</p></td>
+<td class="struct_member_description"><p>name of the visualization.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+<tr>
+<td class="struct_member_name"><p><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *<em class="structfield"><code><a name="GstPlayerVisualization-struct.description"></a>description</code></em>;</p></td>
+<td class="struct_member_description"><p>description of the visualization.</p></td>
+<td class="struct_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.24</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/libs/html/gst-plugins-bad-libs-gstplayer.html b/docs/libs/html/gst-plugins-bad-libs-gstplayer.html
new file mode 100644
index 0000000..c2d798d
--- /dev/null
+++ b/docs/libs/html/gst-plugins-bad-libs-gstplayer.html
@@ -0,0 +1,2270 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>gstplayer: GStreamer Bad Plugins 1.0 Library Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Library Reference Manual">
+<link rel="up" href="player.html" title="Player Library">
+<link rel="prev" href="player.html" title="Player Library">
+<link rel="next" href="gst-plugins-bad-libs-gstplayer-mediainfo.html" title="gstplayer-mediainfo">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts">
+<a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
+                  <a href="#gst-plugins-bad-libs-gstplayer.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
+                  <a href="#gst-plugins-bad-libs-gstplayer.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_prerequisites">  <span class="dim">|</span> 
+                  <a href="#gst-plugins-bad-libs-gstplayer.prerequisites" class="shortcut">Prerequisites</a></span><span id="nav_implementations">  <span class="dim">|</span> 
+                  <a href="#gst-plugins-bad-libs-gstplayer.implementations" class="shortcut">Known Implementations</a></span><span id="nav_properties">  <span class="dim">|</span> 
+                  <a href="#gst-plugins-bad-libs-gstplayer.properties" class="shortcut">Properties</a></span><span id="nav_signals">  <span class="dim">|</span> 
+                  <a href="#gst-plugins-bad-libs-gstplayer.signals" class="shortcut">Signals</a></span>
+</td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="player.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="player.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-libs-gstplayer-mediainfo.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="refentry">
+<a name="gst-plugins-bad-libs-gstplayer"></a><div class="titlepage"></div>
+<div class="refnamediv"><table width="100%"><tr>
+<td valign="top">
+<h2><span class="refentrytitle"><a name="gst-plugins-bad-libs-gstplayer.top_of_page"></a>gstplayer</span></h2>
+<p>gstplayer — Player</p>
+</td>
+<td class="gallery_image" valign="top" align="right"></td>
+</tr></table></div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer.functions"></a><h2>Functions</h2>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="functions_return">
+<col class="functions_name">
+</colgroup>
+<tbody>
+<tr>
+<td class="function_type">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="returnvalue">GstPlayer</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-new" title="gst_player_new ()">gst_player_new</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="returnvalue">GstPlayer</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-new-full" title="gst_player_new_full ()">gst_player_new_full</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-play" title="gst_player_play ()">gst_player_play</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-pause" title="gst_player_pause ()">gst_player_pause</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-stop" title="gst_player_stop ()">gst_player_stop</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-seek" title="gst_player_seek ()">gst_player_seek</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-uri" title="gst_player_set_uri ()">gst_player_set_uri</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-uri" title="gst_player_get_uri ()">gst_player_get_uri</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-duration" title="gst_player_get_duration ()">gst_player_get_duration</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-position" title="gst_player_get_position ()">gst_player_get_position</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-volume" title="gst_player_set_volume ()">gst_player_set_volume</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-mute" title="gst_player_set_mute ()">gst_player_set_mute</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-volume" title="gst_player_get_volume ()">gst_player_get_volume</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-mute" title="gst_player_get_mute ()">gst_player_get_mute</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="returnvalue">GstElement</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-pipeline" title="gst_player_get_pipeline ()">gst_player_get_pipeline</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-position-update-interval" title="gst_player_set_position_update_interval ()">gst_player_set_position_update_interval</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-position-update-interval" title="gst_player_get_position_update_interval ()">gst_player_get_position_update_interval</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-state-get-name" title="gst_player_state_get_name ()">gst_player_state_get_name</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="define_keyword">#define</td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-ERROR:CAPS" title="GST_PLAYER_ERROR">GST_PLAYER_ERROR</a></td>
+</tr>
+<tr>
+<td class="function_type">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-error-get-name" title="gst_player_error_get_name ()">gst_player_error_get_name</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="returnvalue">GstPlayerMediaInfo</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-media-info" title="gst_player_get_media_info ()">gst_player_get_media_info</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-audio-streams" title="gst_player_get_audio_streams ()">gst_player_get_audio_streams</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-video-streams" title="gst_player_get_video_streams ()">gst_player_get_video_streams</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-subtitle-streams" title="gst_player_get_subtitle_streams ()">gst_player_get_subtitle_streams</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-audio-track" title="gst_player_set_audio_track ()">gst_player_set_audio_track</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-video-track" title="gst_player_set_video_track ()">gst_player_set_video_track</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-subtitle-track" title="gst_player_set_subtitle_track ()">gst_player_set_subtitle_track</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="returnvalue">GstPlayerAudioInfo</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-current-audio-track" title="gst_player_get_current_audio_track ()">gst_player_get_current_audio_track</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="returnvalue">GstPlayerVideoInfo</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-current-video-track" title="gst_player_get_current_video_track ()">gst_player_get_current_video_track</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerSubtitleInfo"><span class="returnvalue">GstPlayerSubtitleInfo</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-current-subtitle-track" title="gst_player_get_current_subtitle_track ()">gst_player_get_current_subtitle_track</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-audio-track-enabled" title="gst_player_set_audio_track_enabled ()">gst_player_set_audio_track_enabled</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-video-track-enabled" title="gst_player_set_video_track_enabled ()">gst_player_set_video_track_enabled</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-subtitle-track-enabled" title="gst_player_set_subtitle_track_enabled ()">gst_player_set_subtitle_track_enabled</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-subtitle-uri" title="gst_player_set_subtitle_uri ()">gst_player_set_subtitle_uri</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-subtitle-uri" title="gst_player_get_subtitle_uri ()">gst_player_get_subtitle_uri</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-visualization" title="gst_player_set_visualization ()">gst_player_set_visualization</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-visualization-enabled" title="gst_player_set_visualization_enabled ()">gst_player_set_visualization_enabled</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-current-visualization" title="gst_player_get_current_visualization ()">gst_player_get_current_visualization</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-color-balance-type-get-name" title="gst_player_color_balance_type_get_name ()">gst_player_color_balance_type_get_name</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-has-color-balance" title="gst_player_has_color_balance ()">gst_player_has_color_balance</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-color-balance" title="gst_player_set_color_balance ()">gst_player_set_color_balance</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-color-balance" title="gst_player_get_color_balance ()">gst_player_get_color_balance</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-get-rate" title="gst_player_get_rate ()">gst_player_get_rate</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+<tr>
+<td class="function_type">
+<span class="returnvalue">void</span>
+</td>
+<td class="function_name">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#gst-player-set-rate" title="gst_player_set_rate ()">gst_player_set_rate</a> <span class="c_punctuation">()</span>
+</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer.properties"></a><h2>Properties</h2>
+<div class="informaltable"><table border="0">
+<colgroup>
+<col width="150px" class="properties_type">
+<col width="300px" class="properties_name">
+<col width="200px" class="properties_flags">
+</colgroup>
+<tbody>
+<tr>
+<td class="property_type">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="type">GstPlayerAudioInfo</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--current-audio-track" title="The “current-audio-track” property">current-audio-track</a></td>
+<td class="property_flags">Read</td>
+</tr>
+<tr>
+<td class="property_type">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerSubtitleInfo"><span class="type">GstPlayerSubtitleInfo</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--current-subtitle-track" title="The “current-subtitle-track” property">current-subtitle-track</a></td>
+<td class="property_flags">Read</td>
+</tr>
+<tr>
+<td class="property_type">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="type">GstPlayerVideoInfo</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--current-video-track" title="The “current-video-track” property">current-video-track</a></td>
+<td class="property_flags">Read</td>
+</tr>
+<tr>
+<td class="property_type"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--duration" title="The “duration” property">duration</a></td>
+<td class="property_flags">Read</td>
+</tr>
+<tr>
+<td class="property_type">
+<a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--media-info" title="The “media-info” property">media-info</a></td>
+<td class="property_flags">Read</td>
+</tr>
+<tr>
+<td class="property_type"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--mute" title="The “mute” property">mute</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--pipeline" title="The “pipeline” property">pipeline</a></td>
+<td class="property_flags">Read</td>
+</tr>
+<tr>
+<td class="property_type"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--position" title="The “position” property">position</a></td>
+<td class="property_flags">Read</td>
+</tr>
+<tr>
+<td class="property_type"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--position-update-interval" title="The “position-update-interval” property">position-update-interval</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--rate" title="The “rate” property">rate</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerSignalDispatcher"><span class="type">GstPlayerSignalDispatcher</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--signal-dispatcher" title="The “signal-dispatcher” property">signal-dispatcher</a></td>
+<td class="property_flags">Write / Construct Only</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--suburi" title="The “suburi” property">suburi</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--uri" title="The “uri” property">uri</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type">
+<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerVideoRenderer"><span class="type">GstPlayerVideoRenderer</span></a> *</td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--video-renderer" title="The “video-renderer” property">video-renderer</a></td>
+<td class="property_flags">Write / Construct Only</td>
+</tr>
+<tr>
+<td class="property_type"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer--volume" title="The “volume” property">volume</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer.signals"></a><h2>Signals</h2>
+<div class="informaltable"><table border="0">
+<colgroup>
+<col width="150px" class="signals_return">
+<col width="300px" class="signals_name">
+<col width="200px" class="signals_flags">
+</colgroup>
+<tbody>
+<tr>
+<td class="signal_type"><span class="returnvalue">void</span></td>
+<td class="signal_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-buffering" title="The “buffering” signal">buffering</a></td>
+<td class="signal_flags"><a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></td>
+</tr>
+<tr>
+<td class="signal_type"><span class="returnvalue">void</span></td>
+<td class="signal_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-duration-changed" title="The “duration-changed” signal">duration-changed</a></td>
+<td class="signal_flags"><a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></td>
+</tr>
+<tr>
+<td class="signal_type"><span class="returnvalue">void</span></td>
+<td class="signal_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-end-of-stream" title="The “end-of-stream” signal">end-of-stream</a></td>
+<td class="signal_flags"><a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></td>
+</tr>
+<tr>
+<td class="signal_type"><span class="returnvalue">void</span></td>
+<td class="signal_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-error" title="The “error” signal">error</a></td>
+<td class="signal_flags"><a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></td>
+</tr>
+<tr>
+<td class="signal_type"><span class="returnvalue">void</span></td>
+<td class="signal_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-media-info-updated" title="The “media-info-updated” signal">media-info-updated</a></td>
+<td class="signal_flags"><a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></td>
+</tr>
+<tr>
+<td class="signal_type"><span class="returnvalue">void</span></td>
+<td class="signal_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-mute-changed" title="The “mute-changed” signal">mute-changed</a></td>
+<td class="signal_flags"><a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></td>
+</tr>
+<tr>
+<td class="signal_type"><span class="returnvalue">void</span></td>
+<td class="signal_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-position-updated" title="The “position-updated” signal">position-updated</a></td>
+<td class="signal_flags"><a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></td>
+</tr>
+<tr>
+<td class="signal_type"><span class="returnvalue">void</span></td>
+<td class="signal_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-seek-done" title="The “seek-done” signal">seek-done</a></td>
+<td class="signal_flags"><a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></td>
+</tr>
+<tr>
+<td class="signal_type"><span class="returnvalue">void</span></td>
+<td class="signal_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-state-changed" title="The “state-changed” signal">state-changed</a></td>
+<td class="signal_flags"><a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></td>
+</tr>
+<tr>
+<td class="signal_type"><span class="returnvalue">void</span></td>
+<td class="signal_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-video-dimensions-changed" title="The “video-dimensions-changed” signal">video-dimensions-changed</a></td>
+<td class="signal_flags"><a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></td>
+</tr>
+<tr>
+<td class="signal_type"><span class="returnvalue">void</span></td>
+<td class="signal_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-volume-changed" title="The “volume-changed” signal">volume-changed</a></td>
+<td class="signal_flags"><a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></td>
+</tr>
+<tr>
+<td class="signal_type"><span class="returnvalue">void</span></td>
+<td class="signal_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-warning" title="The “warning” signal">warning</a></td>
+<td class="signal_flags"><a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<a name="GstPlayer"></a><a name="GstPlayerSignalDispatcher"></a><a name="GstPlayerVideoRenderer"></a><div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer.other"></a><h2>Types and Values</h2>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="name">
+<col class="description">
+</colgroup>
+<tbody>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer-struct" title="GstPlayer">GstPlayer</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerState" title="enum GstPlayerState">GstPlayerState</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerError" title="enum GstPlayerError">GstPlayerError</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">enum</td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerColorBalanceType" title="enum GstPlayerColorBalanceType">GstPlayerColorBalanceType</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerSignalDispatcher-struct" title="GstPlayerSignalDispatcher">GstPlayerSignalDispatcher</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">struct</td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerSignalDispatcherInterface" title="struct GstPlayerSignalDispatcherInterface">GstPlayerSignalDispatcherInterface</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword"> </td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerVideoRenderer-struct" title="GstPlayerVideoRenderer">GstPlayerVideoRenderer</a></td>
+</tr>
+<tr>
+<td class="datatype_keyword">struct</td>
+<td class="function_name"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerVideoRendererInterface" title="struct GstPlayerVideoRendererInterface">GstPlayerVideoRendererInterface</a></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer.object-hierarchy"></a><h2>Object Hierarchy</h2>
+<pre class="screen">    <a href="https://developer.gnome.org/gobject/unstable/gobject-Enumeration-and-Flag-Types.html">GEnum</a>
+    <span class="lineart">├──</span> GstPlayerColorBalanceType
+    <span class="lineart">├──</span> GstPlayerError
+    <span class="lineart">╰──</span> GstPlayerState
+    <a href="https://developer.gnome.org/gobject/unstable/GTypeModule.html">GInterface</a>
+    <span class="lineart">├──</span> GstPlayerSignalDispatcher
+    <span class="lineart">╰──</span> GstPlayerVideoRenderer
+    <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
+    <span class="lineart">╰──</span> <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
+        <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
+            <span class="lineart">╰──</span> GstPlayer
+</pre>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer.prerequisites"></a><h2>Prerequisites</h2>
+<p>
+GstPlayerSignalDispatcher requires
+ <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>.</p>
+<p>
+GstPlayerVideoRenderer requires
+ <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer.implementations"></a><h2>Known Implementations</h2>
+<p>
+GstPlayerVideoRenderer is implemented by
+ GstPlayerVideoOverlayVideoRenderer.</p>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer.description"></a><h2>Description</h2>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer.functions_details"></a><h2>Functions</h2>
+<div class="refsect2">
+<a name="gst-player-new"></a><h3>gst_player_new ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="returnvalue">GstPlayer</span></a> *
+gst_player_new (<em class="parameter"><code><span class="type">void</span></code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.2.4"></a><h4>Returns</h4>
+<p> a new <a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-new-full"></a><h3>gst_player_new_full ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="returnvalue">GstPlayer</span></a> *
+gst_player_new_full (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerVideoRenderer"><span class="type">GstPlayerVideoRenderer</span></a> *video_renderer</code></em>,
+                     <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerSignalDispatcher"><span class="type">GstPlayerSignalDispatcher</span></a> *signal_dispatcher</code></em>);</pre>
+<p>Creates a new <a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance that uses <em class="parameter"><code>signal_dispatcher</code></em>
+ to dispatch
+signals to some event loop system, or emits signals directly if NULL is
+passed. See <a class="link" href="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html#gst-player-g-main-context-signal-dispatcher-new" title="gst_player_g_main_context_signal_dispatcher_new ()"><code class="function">gst_player_g_main_context_signal_dispatcher_new()</code></a>.</p>
+<p>Video is going to be rendered by <em class="parameter"><code>video_renderer</code></em>
+, or if <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#NULL:CAPS"><code class="literal">NULL</code></a> is provided
+no special video set up will be done and some default handling will be
+performed.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.3.6"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>video_renderer</p></td>
+<td class="parameter_description"><p> GstPlayerVideoRenderer to use. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+<tr>
+<td class="parameter_name"><p>signal_dispatcher</p></td>
+<td class="parameter_description"><p> GstPlayerSignalDispatcher to use. </p></td>
+<td class="parameter_annotations"><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>][<acronym title="NULL is OK, both for passing and for returning."><span class="acronym">allow-none</span></acronym>]</span></td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.3.7"></a><h4>Returns</h4>
+<p> a new <a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-play"></a><h3>gst_player_play ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_play (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>);</pre>
+<p>Request to play the loaded stream.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.4.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-pause"></a><h3>gst_player_pause ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_pause (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>);</pre>
+<p>Pauses the current stream.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.5.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-stop"></a><h3>gst_player_stop ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_stop (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>);</pre>
+<p>Stops playing the current stream and resets to the first position
+in the stream.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.6.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-seek"></a><h3>gst_player_seek ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_seek (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>,
+                 <em class="parameter"><code><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="type">GstClockTime</span></a> position</code></em>);</pre>
+<p>Seeks the currently-playing stream to the absolute <em class="parameter"><code>position</code></em>
+ time
+in nanoseconds.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.7.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>position</p></td>
+<td class="parameter_description"><p>position to seek in nanoseconds</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-set-uri"></a><h3>gst_player_set_uri ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_set_uri (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>,
+                    <em class="parameter"><code>const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>);</pre>
+<p>Sets the next URI to play.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.8.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>uri</p></td>
+<td class="parameter_description"><p>next URI to play.</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-get-uri"></a><h3>gst_player_get_uri ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+gst_player_get_uri (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>);</pre>
+<p>Gets the URI of the currently-playing stream.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.9.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.9.6"></a><h4>Returns</h4>
+<p> a string containing the URI of the
+currently-playing stream. <a href="https://developer.gnome.org/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> after usage. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-get-duration"></a><h3>gst_player_get_duration ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a>
+gst_player_get_duration (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>);</pre>
+<p>Retrieves the duration of the media stream that self represents.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.10.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.10.6"></a><h4>Returns</h4>
+<p> the duration of the currently-playing media stream, in
+nanoseconds.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-get-position"></a><h3>gst_player_get_position ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstClock.html#GstClockTime"><span class="returnvalue">GstClockTime</span></a>
+gst_player_get_position (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.11.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.11.5"></a><h4>Returns</h4>
+<p> the absolute position time, in nanoseconds, of the
+currently-playing stream.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-set-volume"></a><h3>gst_player_set_volume ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_set_volume (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>,
+                       <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> val</code></em>);</pre>
+<p>Sets the volume level of the stream as a percentage between 0 and 1.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.12.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>val</p></td>
+<td class="parameter_description"><p>the new volume level, as a percentage between 0 and 1</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-set-mute"></a><h3>gst_player_set_mute ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_set_mute (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>,
+                     <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> val</code></em>);</pre>
+<p><a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the currently-playing stream should be muted.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.13.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>val</p></td>
+<td class="parameter_description"><p>Mute state the should be set</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-get-volume"></a><h3>gst_player_get_volume ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+gst_player_get_volume (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>);</pre>
+<p>Returns the current volume level, as a percentage between 0 and 1.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.14.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.14.6"></a><h4>Returns</h4>
+<p> the volume as percentage between 0 and 1.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-get-mute"></a><h3>gst_player_get_mute ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gst_player_get_mute (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.15.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.15.5"></a><h4>Returns</h4>
+<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the currently-playing stream is muted.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-get-pipeline"></a><h3>gst_player_get_pipeline ()</h3>
+<pre class="programlisting"><a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="returnvalue">GstElement</span></a> *
+gst_player_get_pipeline (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.16.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.16.5"></a><h4>Returns</h4>
+<p> The internal playbin instance. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-set-position-update-interval"></a><h3>gst_player_set_position_update_interval ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_set_position_update_interval
+                               (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>,
+                                <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a> interval</code></em>);</pre>
+<p>Set interval in milliseconds between two position-updated signals.
+Pass 0 to stop updating the position.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.17.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>interval</p></td>
+<td class="parameter_description"><p>interval in ms</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-get-position-update-interval"></a><h3>gst_player_get_position_update_interval ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="returnvalue">guint</span></a>
+gst_player_get_position_update_interval
+                               (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.18.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.18.5"></a><h4>Returns</h4>
+<p> current position update interval in milliseconds</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-state-get-name"></a><h3>gst_player_state_get_name ()</h3>
+<pre class="programlisting">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+gst_player_state_get_name (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerState" title="enum GstPlayerState"><span class="type">GstPlayerState</span></a> state</code></em>);</pre>
+<p>Gets a string representing the given state.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.19.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>state</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerState" title="enum GstPlayerState"><span class="type">GstPlayerState</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.19.6"></a><h4>Returns</h4>
+<p> a string with the name of the state. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GST-PLAYER-ERROR:CAPS"></a><h3>GST_PLAYER_ERROR</h3>
+<pre class="programlisting">#define      GST_PLAYER_ERROR                         (gst_player_error_quark ())
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-error-get-name"></a><h3>gst_player_error_get_name ()</h3>
+<pre class="programlisting">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+gst_player_error_get_name (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerError" title="enum GstPlayerError"><span class="type">GstPlayerError</span></a> error</code></em>);</pre>
+<p>Gets a string representing the given error.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.21.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>error</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerError" title="enum GstPlayerError"><span class="type">GstPlayerError</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.21.6"></a><h4>Returns</h4>
+<p> a string with the given error. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-get-media-info"></a><h3>gst_player_get_media_info ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="returnvalue">GstPlayerMediaInfo</span></a> *
+gst_player_get_media_info (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>);</pre>
+<p>A Function to get the current media info <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a> instance.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.22.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.22.6"></a><h4>Returns</h4>
+<p> media info instance.</p>
+<p>The caller should free it with <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#g-object-unref"><code class="function">g_object_unref()</code></a>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-get-audio-streams"></a><h3>gst_player_get_audio_streams ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *
+gst_player_get_audio_streams (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.23.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.23.5"></a><h4>Returns</h4>
+<p> A <a href="https://developer.gnome.org/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of
+matching <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="type">GstPlayerAudioInfo</span></a>. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GstPlayerAudioInfo]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-get-video-streams"></a><h3>gst_player_get_video_streams ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *
+gst_player_get_video_streams (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.24.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.24.5"></a><h4>Returns</h4>
+<p> A <a href="https://developer.gnome.org/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of
+matching <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="type">GstPlayerVideoInfo</span></a>. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GstPlayerVideoInfo]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-get-subtitle-streams"></a><h3>gst_player_get_subtitle_streams ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="returnvalue">GList</span></a> *
+gst_player_get_subtitle_streams (<em class="parameter"><code>const <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a> *info</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.25.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>info</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.25.5"></a><h4>Returns</h4>
+<p> A <a href="https://developer.gnome.org/glib/unstable/glib-Doubly-Linked-Lists.html#GList"><span class="type">GList</span></a> of
+matching <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerSubtitleInfo"><span class="type">GstPlayerSubtitleInfo</span></a>. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>][<acronym title="Generics and defining elements of containers and arrays."><span class="acronym">element-type</span></acronym> GstPlayerSubtitleInfo]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-set-audio-track"></a><h3>gst_player_set_audio_track ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gst_player_set_audio_track (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>,
+                            <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> stream_index</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.26.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>stream_index</p></td>
+<td class="parameter_description"><p>stream index</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.26.5"></a><h4>Returns</h4>
+<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> or <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a></p>
+<p>Sets the audio track <em class="parameter"><code>stream_idex</code></em>
+.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-set-video-track"></a><h3>gst_player_set_video_track ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gst_player_set_video_track (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>,
+                            <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> stream_index</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.27.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>stream_index</p></td>
+<td class="parameter_description"><p>stream index</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.27.5"></a><h4>Returns</h4>
+<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> or <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a></p>
+<p>Sets the video track <em class="parameter"><code>stream_index</code></em>
+.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-set-subtitle-track"></a><h3>gst_player_set_subtitle_track ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gst_player_set_subtitle_track (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>,
+                               <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a> stream_index</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.28.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>stream_index</p></td>
+<td class="parameter_description"><p>stream index</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.28.5"></a><h4>Returns</h4>
+<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> or <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a></p>
+<p>Sets the subtitle strack <em class="parameter"><code>stream_index</code></em>
+.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-get-current-audio-track"></a><h3>gst_player_get_current_audio_track ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="returnvalue">GstPlayerAudioInfo</span></a> *
+gst_player_get_current_audio_track (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>);</pre>
+<p>A Function to get current audio <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="type">GstPlayerAudioInfo</span></a> instance.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.29.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.29.6"></a><h4>Returns</h4>
+<p> current audio track.</p>
+<p>The caller should free it with <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#g-object-unref"><code class="function">g_object_unref()</code></a>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-get-current-video-track"></a><h3>gst_player_get_current_video_track ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="returnvalue">GstPlayerVideoInfo</span></a> *
+gst_player_get_current_video_track (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>);</pre>
+<p>A Function to get current video <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="type">GstPlayerVideoInfo</span></a> instance.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.30.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.30.6"></a><h4>Returns</h4>
+<p> current video track.</p>
+<p>The caller should free it with <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#g-object-unref"><code class="function">g_object_unref()</code></a>. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-get-current-subtitle-track"></a><h3>gst_player_get_current_subtitle_track ()</h3>
+<pre class="programlisting"><a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerSubtitleInfo"><span class="returnvalue">GstPlayerSubtitleInfo</span></a> *
+gst_player_get_current_subtitle_track (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>);</pre>
+<p>A Function to get current subtitle <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerSubtitleInfo"><span class="type">GstPlayerSubtitleInfo</span></a> instance.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.31.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.31.6"></a><h4>Returns</h4>
+<p> current subtitle track.</p>
+<p>The caller should free it with <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#g-object-unref"><code class="function">g_object_unref()</code></a>. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-set-audio-track-enabled"></a><h3>gst_player_set_audio_track_enabled ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_set_audio_track_enabled (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>,
+                                    <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> enabled</code></em>);</pre>
+<p>Enable or disable the current audio track.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.32.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>enabled</p></td>
+<td class="parameter_description"><p>TRUE or FALSE</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-set-video-track-enabled"></a><h3>gst_player_set_video_track_enabled ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_set_video_track_enabled (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>,
+                                    <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> enabled</code></em>);</pre>
+<p>Enable or disable the current video track.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.33.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>enabled</p></td>
+<td class="parameter_description"><p>TRUE or FALSE</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-set-subtitle-track-enabled"></a><h3>gst_player_set_subtitle_track_enabled ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_set_subtitle_track_enabled (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>,
+                                       <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> enabled</code></em>);</pre>
+<p>Enable or disable the current subtitle track.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.34.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>enabled</p></td>
+<td class="parameter_description"><p>TRUE or FALSE</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-set-subtitle-uri"></a><h3>gst_player_set_subtitle_uri ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gst_player_set_subtitle_uri (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>,
+                             <em class="parameter"><code>const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *uri</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.35.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>uri</p></td>
+<td class="parameter_description"><p>subtitle URI</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.35.5"></a><h4>Returns</h4>
+<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> or <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a></p>
+<p>Sets the external subtitle URI.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-get-subtitle-uri"></a><h3>gst_player_get_subtitle_uri ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+gst_player_get_subtitle_uri (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>);</pre>
+<p>current subtitle URI</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.36.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.36.6"></a><h4>Returns</h4>
+<p> URI of the current external subtitle.
+<a href="https://developer.gnome.org/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> after usage. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-set-visualization"></a><h3>gst_player_set_visualization ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gst_player_set_visualization (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>,
+                              <em class="parameter"><code>const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *name</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.37.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>name</p></td>
+<td class="parameter_description"><p>visualization element obtained from
+<a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#gst-player-visualizations-get" title="gst_player_visualizations_get ()"><code class="function">gst_player_visualizations_get()</code></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.37.5"></a><h4>Returns</h4>
+<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if the visualizations was set correctly. Otherwise,
+<a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-set-visualization-enabled"></a><h3>gst_player_set_visualization_enabled ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_set_visualization_enabled (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>,
+                                      <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a> enabled</code></em>);</pre>
+<p>Enable or disable the visualization.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.38.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>enabled</p></td>
+<td class="parameter_description"><p>TRUE or FALSE</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-get-current-visualization"></a><h3>gst_player_get_current_visualization ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+gst_player_get_current_visualization (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.39.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.39.5"></a><h4>Returns</h4>
+<p> Name of the currently enabled visualization.
+<a href="https://developer.gnome.org/glib/unstable/glib-Memory-Allocation.html#g-free"><code class="function">g_free()</code></a> after usage. </p>
+<p><span class="annotation">[<acronym title="Free data after the code is done."><span class="acronym">transfer full</span></acronym>]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-color-balance-type-get-name"></a><h3>gst_player_color_balance_type_get_name ()</h3>
+<pre class="programlisting">const <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="returnvalue">gchar</span></a> *
+gst_player_color_balance_type_get_name
+                               (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerColorBalanceType" title="enum GstPlayerColorBalanceType"><span class="type">GstPlayerColorBalanceType</span></a> type</code></em>);</pre>
+<p>Gets a string representing the given color balance type.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.40.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>type</p></td>
+<td class="parameter_description"><p>a <a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerColorBalanceType" title="enum GstPlayerColorBalanceType"><span class="type">GstPlayerColorBalanceType</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.40.6"></a><h4>Returns</h4>
+<p> a string with the name of the color
+balance type. </p>
+<p><span class="annotation">[<acronym title="Don't free data after the code is done."><span class="acronym">transfer none</span></acronym>]</span></p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-has-color-balance"></a><h3>gst_player_has_color_balance ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="returnvalue">gboolean</span></a>
+gst_player_has_color_balance (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>);</pre>
+<p>Checks whether the <em class="parameter"><code>player</code></em>
+ has color balance support available.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.41.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.41.6"></a><h4>Returns</h4>
+<p> <a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#TRUE:CAPS"><code class="literal">TRUE</code></a> if <em class="parameter"><code>player</code></em>
+has color balance support. Otherwise,
+<a href="https://developer.gnome.org/glib/unstable/glib-Standard-Macros.html#FALSE:CAPS"><code class="literal">FALSE</code></a>.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-set-color-balance"></a><h3>gst_player_set_color_balance ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_set_color_balance (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>,
+                              <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerColorBalanceType" title="enum GstPlayerColorBalanceType"><span class="type">GstPlayerColorBalanceType</span></a> type</code></em>,
+                              <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> value</code></em>);</pre>
+<p>Sets the current value of the indicated channel <em class="parameter"><code>type</code></em>
+ to the passed
+value.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.42.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>type</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerColorBalanceType" title="enum GstPlayerColorBalanceType"><span class="type">GstPlayerColorBalanceType</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>value</p></td>
+<td class="parameter_description"><p>The new value for the <em class="parameter"><code>type</code></em>
+, ranged [0,1]</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-get-color-balance"></a><h3>gst_player_get_color_balance ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+gst_player_get_color_balance (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>,
+                              <em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerColorBalanceType" title="enum GstPlayerColorBalanceType"><span class="type">GstPlayerColorBalanceType</span></a> type</code></em>);</pre>
+<p>Retrieve the current value of the indicated <em class="parameter"><code>type</code></em>
+.</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.43.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>type</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerColorBalanceType" title="enum GstPlayerColorBalanceType"><span class="type">GstPlayerColorBalanceType</span></a></p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.43.6"></a><h4>Returns</h4>
+<p> The current value of <em class="parameter"><code>type</code></em>
+, between [0,1]. In case of
+error -1 is returned.</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-get-rate"></a><h3>gst_player_get_rate ()</h3>
+<pre class="programlisting"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="returnvalue">gdouble</span></a>
+gst_player_get_rate (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>);</pre>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.44.4"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody><tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.44.5"></a><h4>Returns</h4>
+<p> current playback rate</p>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="gst-player-set-rate"></a><h3>gst_player_set_rate ()</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+gst_player_set_rate (<em class="parameter"><code><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *player</code></em>,
+                     <em class="parameter"><code><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a> rate</code></em>);</pre>
+<p>Playback at specified rate</p>
+<div class="refsect3">
+<a name="id-1.2.10.2.14.45.5"></a><h4>Parameters</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="150px" class="parameters_name">
+<col class="parameters_description">
+<col width="200px" class="parameters_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="parameter_name"><p>player</p></td>
+<td class="parameter_description"><p><a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> instance</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+<tr>
+<td class="parameter_name"><p>rate</p></td>
+<td class="parameter_description"><p>playback rate</p></td>
+<td class="parameter_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer.other_details"></a><h2>Types and Values</h2>
+<div class="refsect2">
+<a name="GstPlayer-struct"></a><h3>GstPlayer</h3>
+<pre class="programlisting">typedef struct _GstPlayer GstPlayer;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayerState"></a><h3>enum GstPlayerState</h3>
+<div class="refsect3">
+<a name="id-1.2.10.2.15.3.3"></a><h4>Members</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="GST-PLAYER-STATE-STOPPED:CAPS"></a>GST_PLAYER_STATE_STOPPED</p></td>
+<td class="enum_member_description">
+<p>the player is stopped.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-PLAYER-STATE-BUFFERING:CAPS"></a>GST_PLAYER_STATE_BUFFERING</p></td>
+<td class="enum_member_description">
+<p>the player is buffering.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-PLAYER-STATE-PAUSED:CAPS"></a>GST_PLAYER_STATE_PAUSED</p></td>
+<td class="enum_member_description">
+<p>the player is paused.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-PLAYER-STATE-PLAYING:CAPS"></a>GST_PLAYER_STATE_PLAYING</p></td>
+<td class="enum_member_description">
+<p>the player is currently playing a
+stream.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayerError"></a><h3>enum GstPlayerError</h3>
+<div class="refsect3">
+<a name="id-1.2.10.2.15.4.3"></a><h4>Members</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody><tr>
+<td class="enum_member_name"><p><a name="GST-PLAYER-ERROR-FAILED:CAPS"></a>GST_PLAYER_ERROR_FAILED</p></td>
+<td class="enum_member_description">
+<p>generic error.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr></tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayerColorBalanceType"></a><h3>enum GstPlayerColorBalanceType</h3>
+<div class="refsect3">
+<a name="id-1.2.10.2.15.5.3"></a><h4>Members</h4>
+<div class="informaltable"><table width="100%" border="0">
+<colgroup>
+<col width="300px" class="enum_members_name">
+<col class="enum_members_description">
+<col width="200px" class="enum_members_annotations">
+</colgroup>
+<tbody>
+<tr>
+<td class="enum_member_name"><p><a name="GST-PLAYER-COLOR-BALANCE-BRIGHTNESS:CAPS"></a>GST_PLAYER_COLOR_BALANCE_BRIGHTNESS</p></td>
+<td class="enum_member_description">
+<p>brightness or black level.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-PLAYER-COLOR-BALANCE-CONTRAST:CAPS"></a>GST_PLAYER_COLOR_BALANCE_CONTRAST</p></td>
+<td class="enum_member_description">
+<p>contrast or luma gain.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-PLAYER-COLOR-BALANCE-SATURATION:CAPS"></a>GST_PLAYER_COLOR_BALANCE_SATURATION</p></td>
+<td class="enum_member_description">
+<p>color saturation or chroma
+gain.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+<tr>
+<td class="enum_member_name"><p><a name="GST-PLAYER-COLOR-BALANCE-HUE:CAPS"></a>GST_PLAYER_COLOR_BALANCE_HUE</p></td>
+<td class="enum_member_description">
+<p>hue or color balance.</p>
+</td>
+<td class="enum_member_annotations"> </td>
+</tr>
+</tbody>
+</table></div>
+</div>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayerSignalDispatcher-struct"></a><h3>GstPlayerSignalDispatcher</h3>
+<pre class="programlisting">typedef struct _GstPlayerSignalDispatcher GstPlayerSignalDispatcher;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayerSignalDispatcherInterface"></a><h3>struct GstPlayerSignalDispatcherInterface</h3>
+<pre class="programlisting">struct GstPlayerSignalDispatcherInterface {
+  GTypeInterface parent_iface;
+
+  void (*dispatch) (GstPlayerSignalDispatcher * self,
+                    GstPlayer * player,
+                    GstPlayerSignalDispatcherFunc emitter,
+                    gpointer data,
+                    GDestroyNotify destroy);
+};
+</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayerVideoRenderer-struct"></a><h3>GstPlayerVideoRenderer</h3>
+<pre class="programlisting">typedef struct _GstPlayerVideoRenderer GstPlayerVideoRenderer;</pre>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayerVideoRendererInterface"></a><h3>struct GstPlayerVideoRendererInterface</h3>
+<pre class="programlisting">struct GstPlayerVideoRendererInterface {
+  GTypeInterface parent_iface;
+
+  GstElement * (*create_video_sink) (GstPlayerVideoRenderer * self, GstPlayer * player);
+};
+</pre>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer.property-details"></a><h2>Property Details</h2>
+<div class="refsect2">
+<a name="GstPlayer--current-audio-track"></a><h3>The <code class="literal">“current-audio-track”</code> property</h3>
+<pre class="programlisting">  “current-audio-track”      <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo"><span class="type">GstPlayerAudioInfo</span></a> *</pre>
+<p>Current audio track information.</p>
+<p>Flags: Read</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer--current-subtitle-track"></a><h3>The <code class="literal">“current-subtitle-track”</code> property</h3>
+<pre class="programlisting">  “current-subtitle-track”   <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerSubtitleInfo"><span class="type">GstPlayerSubtitleInfo</span></a> *</pre>
+<p>Current audio subtitle information.</p>
+<p>Flags: Read</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer--current-video-track"></a><h3>The <code class="literal">“current-video-track”</code> property</h3>
+<pre class="programlisting">  “current-video-track”      <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo"><span class="type">GstPlayerVideoInfo</span></a> *</pre>
+<p>Current video track information.</p>
+<p>Flags: Read</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer--duration"></a><h3>The <code class="literal">“duration”</code> property</h3>
+<pre class="programlisting">  “duration”                 <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a></pre>
+<p>Duration.</p>
+<p>Flags: Read</p>
+<p>Default value: 18446744073709551615</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer--media-info"></a><h3>The <code class="literal">“media-info”</code> property</h3>
+<pre class="programlisting">  “media-info”               <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a> *</pre>
+<p>Current media information.</p>
+<p>Flags: Read</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer--mute"></a><h3>The <code class="literal">“mute”</code> property</h3>
+<pre class="programlisting">  “mute”                     <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gboolean"><span class="type">gboolean</span></a></pre>
+<p>Mute.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: FALSE</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer--pipeline"></a><h3>The <code class="literal">“pipeline”</code> property</h3>
+<pre class="programlisting">  “pipeline”                 <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html"><span class="type">GstElement</span></a> *</pre>
+<p>GStreamer pipeline that is used.</p>
+<p>Flags: Read</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer--position"></a><h3>The <code class="literal">“position”</code> property</h3>
+<pre class="programlisting">  “position”                 <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a></pre>
+<p>Current Position.</p>
+<p>Flags: Read</p>
+<p>Default value: 18446744073709551615</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer--position-update-interval"></a><h3>The <code class="literal">“position-update-interval”</code> property</h3>
+<pre class="programlisting">  “position-update-interval” <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a></pre>
+<p>Interval in milliseconds between two position-updated signals.Pass 0 to stop updating the position.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: &lt;= 10000</p>
+<p>Default value: 100</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer--rate"></a><h3>The <code class="literal">“rate”</code> property</h3>
+<pre class="programlisting">  “rate”                     <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>Playback rate.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [-64,64]</p>
+<p>Default value: 1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer--signal-dispatcher"></a><h3>The <code class="literal">“signal-dispatcher”</code> property</h3>
+<pre class="programlisting">  “signal-dispatcher”        <a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerSignalDispatcher"><span class="type">GstPlayerSignalDispatcher</span></a> *</pre>
+<p>Dispatcher for the signals to e.g. event loops.</p>
+<p>Flags: Write / Construct Only</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer--suburi"></a><h3>The <code class="literal">“suburi”</code> property</h3>
+<pre class="programlisting">  “suburi”                   <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
+<p>Current Subtitle URI.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer--uri"></a><h3>The <code class="literal">“uri”</code> property</h3>
+<pre class="programlisting">  “uri”                      <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gchar"><span class="type">gchar</span></a> *</pre>
+<p>Current URI.</p>
+<p>Flags: Read / Write</p>
+<p>Default value: NULL</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer--video-renderer"></a><h3>The <code class="literal">“video-renderer”</code> property</h3>
+<pre class="programlisting">  “video-renderer”           <a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerVideoRenderer"><span class="type">GstPlayerVideoRenderer</span></a> *</pre>
+<p>Video renderer to use for rendering videos.</p>
+<p>Flags: Write / Construct Only</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer--volume"></a><h3>The <code class="literal">“volume”</code> property</h3>
+<pre class="programlisting">  “volume”                   <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>Volume.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: [0,10]</p>
+<p>Default value: 1</p>
+</div>
+</div>
+<div class="refsect1">
+<a name="gst-plugins-bad-libs-gstplayer.signal-details"></a><h2>Signal Details</h2>
+<div class="refsect2">
+<a name="GstPlayer-buffering"></a><h3>The <code class="literal">“buffering”</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+user_function (<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *gstplayer,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>       arg1,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>   user_data)</pre>
+<p>Flags: <a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer-duration-changed"></a><h3>The <code class="literal">“duration-changed”</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+user_function (<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *gstplayer,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a>    arg1,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>   user_data)</pre>
+<p>Flags: <a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer-end-of-stream"></a><h3>The <code class="literal">“end-of-stream”</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+user_function (<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *gstplayer,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>   user_data)</pre>
+<p>Flags: <a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer-error"></a><h3>The <code class="literal">“error”</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+user_function (<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *gstplayer,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a>    *arg1,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>   user_data)</pre>
+<p>Flags: <a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer-media-info-updated"></a><h3>The <code class="literal">“media-info-updated”</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+user_function (<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a>          *gstplayer,
+               <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo"><span class="type">GstPlayerMediaInfo</span></a> *arg1,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>            user_data)</pre>
+<p>Flags: <a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer-mute-changed"></a><h3>The <code class="literal">“mute-changed”</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+user_function (<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *gstplayer,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>   user_data)</pre>
+<p>Flags: <a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer-position-updated"></a><h3>The <code class="literal">“position-updated”</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+user_function (<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *gstplayer,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a>    arg1,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>   user_data)</pre>
+<p>Flags: <a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer-seek-done"></a><h3>The <code class="literal">“seek-done”</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+user_function (<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *gstplayer,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint64"><span class="type">guint64</span></a>    arg1,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>   user_data)</pre>
+<p>Flags: <a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer-state-changed"></a><h3>The <code class="literal">“state-changed”</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+user_function (<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a>     *gstplayer,
+               <a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerState" title="enum GstPlayerState"><span class="type">GstPlayerState</span></a> arg1,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>       user_data)</pre>
+<p>Flags: <a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer-video-dimensions-changed"></a><h3>The <code class="literal">“video-dimensions-changed”</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+user_function (<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *gstplayer,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>       arg1,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a>       arg2,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>   user_data)</pre>
+<p>Flags: <a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer-volume-changed"></a><h3>The <code class="literal">“volume-changed”</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+user_function (<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *gstplayer,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>   user_data)</pre>
+<p>Flags: <a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstPlayer-warning"></a><h3>The <code class="literal">“warning”</code> signal</h3>
+<pre class="programlisting"><span class="returnvalue">void</span>
+user_function (<a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer"><span class="type">GstPlayer</span></a> *gstplayer,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Error-Reporting.html#GError"><span class="type">GError</span></a>    *arg1,
+               <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gpointer"><span class="type">gpointer</span></a>   user_data)</pre>
+<p>Flags: <a href="https://developer.gnome.org/gobject/unstable/gobject-Signals.html#G-SIGNAL-NO-HOOKS:CAPS">No Hooks</a></p>
+</div>
+</div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.24</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/libs/html/gstreamer-libs-hierarchy.html b/docs/libs/html/gstreamer-libs-hierarchy.html
index 2de97d4..0c757bf 100644
--- a/docs/libs/html/gstreamer-libs-hierarchy.html
+++ b/docs/libs/html/gstreamer-libs-hierarchy.html
@@ -26,9 +26,6 @@
     <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
     <span class="lineart">├──</span> <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
     <span class="lineart">│</span>   <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
-    <span class="lineart">│</span>       <span class="lineart">├──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstAllocator.html">GstAllocator</a>
-    <span class="lineart">│</span>       <span class="lineart">│</span>   <span class="lineart">╰──</span> GstGLBaseBufferAllocator
-    <span class="lineart">│</span>       <span class="lineart">│</span>       <span class="lineart">╰──</span> <a class="link" href="gst-plugins-bad-libs-gstglmemory.html#GstGLAllocator">GstGLAllocator</a>
     <span class="lineart">│</span>       <span class="lineart">├──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
     <span class="lineart">│</span>       <span class="lineart">│</span>   <span class="lineart">├──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstBin.html">GstBin</a>
     <span class="lineart">│</span>       <span class="lineart">│</span>   <span class="lineart">│</span>   <span class="lineart">╰──</span> <a class="link" href="gst-plugins-bad-libs-GstInsertbin.html#GstInsertBin">GstInsertBin</a>
@@ -40,15 +37,24 @@
     <span class="lineart">│</span>       <span class="lineart">├──</span> <a class="link" href="GstGLColorConvert.html" title="GstGLColorConvert">GstGLColorConvert</a>
     <span class="lineart">│</span>       <span class="lineart">├──</span> <a class="link" href="GstGLContext.html" title="GstGLContext">GstGLContext</a>
     <span class="lineart">│</span>       <span class="lineart">├──</span> <a class="link" href="GstGLDisplay.html" title="GstGLDisplay">GstGLDisplay</a>
-    <span class="lineart">│</span>       <span class="lineart">├──</span> <a class="link" href="GstGLDownload.html" title="GstGLDownload">GstGLDownload</a>
     <span class="lineart">│</span>       <span class="lineart">├──</span> <a class="link" href="gst-plugins-bad-libs-gstglshader.html#GstGLShader">GstGLShader</a>
     <span class="lineart">│</span>       <span class="lineart">├──</span> <a class="link" href="GstGLUpload.html" title="GstGLUpload">GstGLUpload</a>
-    <span class="lineart">│</span>       <span class="lineart">├──</span> <a class="link" href="GstGLUploadMeta.html" title="GstGLUploadMeta">GstGLUploadMeta</a>
-    <span class="lineart">│</span>       <span class="lineart">╰──</span> <a class="link" href="GstGLWindow.html" title="GstGLWindow">GstGLWindow</a>
-    <span class="lineart">╰──</span> <a class="link" href="GstGLFramebuffer.html" title="GstGLFramebuffer">GstGLFramebuffer</a>
+    <span class="lineart">│</span>       <span class="lineart">├──</span> <a class="link" href="GstGLWindow.html" title="GstGLWindow">GstGLWindow</a>
+    <span class="lineart">│</span>       <span class="lineart">╰──</span> <a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayer">GstPlayer</a>
+    <span class="lineart">├──</span> <a class="link" href="GstGLFramebuffer.html" title="GstGLFramebuffer">GstGLFramebuffer</a>
+    <span class="lineart">├──</span> <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo">GstPlayerStreamInfo</a>
+    <span class="lineart">│</span>   <span class="lineart">├──</span> <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo">GstPlayerAudioInfo</a>
+    <span class="lineart">│</span>   <span class="lineart">├──</span> <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerSubtitleInfo">GstPlayerSubtitleInfo</a>
+    <span class="lineart">│</span>   <span class="lineart">╰──</span> <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo">GstPlayerVideoInfo</a>
+    <span class="lineart">├──</span> <a class="link" href="gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo">GstPlayerMediaInfo</a>
+    <span class="lineart">╰──</span> GstPlayerVideoOverlayVideoRenderer
+    <a href="https://developer.gnome.org/gobject/unstable/GTypeModule.html">GInterface</a>
+    <span class="lineart">├──</span> <a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerSignalDispatcher">GstPlayerSignalDispatcher</a>
+    <span class="lineart">╰──</span> <a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerVideoRenderer">GstPlayerVideoRenderer</a>
     <a href="https://developer.gnome.org/gobject/unstable/gobject-Boxed-Types.html">GBoxed</a>
     <span class="lineart">├──</span> <a class="link" href="gst-plugins-bad-libs-Base-MPEG-TS-sections.html#GstMpegtsSection">GstMpegtsSection</a>
-    <span class="lineart">╰──</span> <a class="link" href="gst-plugins-bad-libs-Base-MPEG-TS-descriptors.html#GstMpegtsDescriptor">GstMpegtsDescriptor</a>
+    <span class="lineart">├──</span> <a class="link" href="gst-plugins-bad-libs-Base-MPEG-TS-descriptors.html#GstMpegtsDescriptor">GstMpegtsDescriptor</a>
+    <span class="lineart">╰──</span> <a class="link" href="gst-plugins-bad-libs-gstplayer-visualization.html#GstPlayerVisualization">GstPlayerVisualization</a>
     <a href="https://developer.gnome.org/gobject/unstable/gobject-Enumeration-and-Flag-Types.html">GEnum</a>
     <span class="lineart">├──</span> <a class="link" href="gst-plugins-bad-libs-Base-MPEG-TS-sections.html#GstMpegtsSectionType" title="enum GstMpegtsSectionType">GstMpegtsSectionType</a>
     <span class="lineart">├──</span> <a class="link" href="gst-plugins-bad-libs-Base-MPEG-TS-sections.html#GstMpegtsSectionTableID" title="enum GstMpegtsSectionTableID">GstMpegtsSectionTableID</a>
@@ -61,7 +67,10 @@
     <span class="lineart">├──</span> <a class="link" href="gst-plugins-bad-libs-Base-MPEG-TS-descriptors.html#GstMpegtsIso639AudioType" title="enum GstMpegtsIso639AudioType">GstMpegtsIso639AudioType</a>
     <span class="lineart">├──</span> <a class="link" href="gst-plugins-bad-libs-DVB-variants-of-MPEG-TS-sections.html#GstMpegtsRunningStatus" title="enum GstMpegtsRunningStatus">GstMpegtsRunningStatus</a>
     <span class="lineart">├──</span> <a class="link" href="gst-plugins-bad-libs-DVB-variants-of-MPEG-TS-descriptors.html#GstMpegtsDVBServiceType" title="enum GstMpegtsDVBServiceType">GstMpegtsDVBServiceType</a>
-    <span class="lineart">╰──</span> <a class="link" href="gst-plugins-bad-libs-Base-MPEG-TS-sections.html#GstMpegtsStreamType" title="enum GstMpegtsStreamType">GstMpegtsStreamType</a>
+    <span class="lineart">├──</span> <a class="link" href="gst-plugins-bad-libs-Base-MPEG-TS-sections.html#GstMpegtsStreamType" title="enum GstMpegtsStreamType">GstMpegtsStreamType</a>
+    <span class="lineart">├──</span> <a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerColorBalanceType" title="enum GstPlayerColorBalanceType">GstPlayerColorBalanceType</a>
+    <span class="lineart">├──</span> <a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerError" title="enum GstPlayerError">GstPlayerError</a>
+    <span class="lineart">╰──</span> <a class="link" href="gst-plugins-bad-libs-gstplayer.html#GstPlayerState" title="enum GstPlayerState">GstPlayerState</a>
 </pre>
 </div>
 <div class="footer">
diff --git a/docs/libs/html/gstreamer-plugins-bad.html b/docs/libs/html/gstreamer-plugins-bad.html
index 46795fa..68632e8 100644
--- a/docs/libs/html/gstreamer-plugins-bad.html
+++ b/docs/libs/html/gstreamer-plugins-bad.html
@@ -138,9 +138,6 @@
 <span class="refentrytitle"><a href="GstGLDisplay.html">GstGLDisplay</a></span><span class="refpurpose"> — window system display connection abstraction</span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="GstGLDownload.html">GstGLDownload</a></span><span class="refpurpose"> — an object that downloads GL textures</span>
-</dt>
-<dt>
 <span class="refentrytitle"><a href="gst-plugins-bad-libs-GstEGLImageMemory.html">GstEGLImageMemory</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
@@ -165,9 +162,6 @@
 <span class="refentrytitle"><a href="GstGLUpload.html">GstGLUpload</a></span><span class="refpurpose"> — an object that uploads to GL textures</span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="GstGLUploadMeta.html">GstGLUploadMeta</a></span><span class="refpurpose"> — an object that provides <span class="type">GstVideoGLTextureUploadMeta</span></span>
-</dt>
-<dt>
 <span class="refentrytitle"><a href="gst-plugins-bad-libs-Utilities.html">Utilities</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
@@ -192,7 +186,25 @@
 <span class="refentrytitle"><a href="gst-plugins-bad-libs-GstGLWindowX11.html">GstGLWindowX11</a></span><span class="refpurpose"></span>
 </dt>
 </dl></dd>
-<dt><span class="chapter"><a href="ch07.html">Interfaces</a></span></dt>
+<dt><span class="chapter"><a href="player.html">Player Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-libs-gstplayer.html">gstplayer</a></span><span class="refpurpose"> — Player</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-libs-gstplayer-mediainfo.html">gstplayer-mediainfo</a></span><span class="refpurpose"> — Player Media Information</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html">gstplayer-gmaincontextsignaldispatcher</a></span><span class="refpurpose"> — Player GLib MainContext dispatcher</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html">gstplayer-videooverlayvideorenderer</a></span><span class="refpurpose"> — Player Video Overlay Video Renderer</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-libs-gstplayer-visualization.html">gstplayer-visualization</a></span><span class="refpurpose"> — Player Visualization</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="ch08.html">Interfaces</a></span></dt>
 <dd><dl><dt>
 <span class="refentrytitle"><a href="gst-plugins-bad-libs-GstPhotography.html">GstPhotography</a></span><span class="refpurpose"> — Interface for digital image capture elements</span>
 </dt></dl></dd>
diff --git a/docs/libs/html/index.html b/docs/libs/html/index.html
index 9303c36..331bc27 100644
--- a/docs/libs/html/index.html
+++ b/docs/libs/html/index.html
@@ -15,7 +15,7 @@
 <div>
 <div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">GStreamer Bad Plugins 1.0 Library Reference Manual</p></th></tr></table></div>
 <div><p class="releaseinfo">
-      for GStreamer Bad Library 1.0 (1.6.2)
+      for GStreamer Bad Library 1.0 (1.7.1)
       <a class="ulink" href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-libs/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-libs/html/</a>.
     </p></div>
 </div>
@@ -137,9 +137,6 @@
 <span class="refentrytitle"><a href="GstGLDisplay.html">GstGLDisplay</a></span><span class="refpurpose"> — window system display connection abstraction</span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="GstGLDownload.html">GstGLDownload</a></span><span class="refpurpose"> — an object that downloads GL textures</span>
-</dt>
-<dt>
 <span class="refentrytitle"><a href="gst-plugins-bad-libs-GstEGLImageMemory.html">GstEGLImageMemory</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
@@ -164,9 +161,6 @@
 <span class="refentrytitle"><a href="GstGLUpload.html">GstGLUpload</a></span><span class="refpurpose"> — an object that uploads to GL textures</span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="GstGLUploadMeta.html">GstGLUploadMeta</a></span><span class="refpurpose"> — an object that provides <span class="type">GstVideoGLTextureUploadMeta</span></span>
-</dt>
-<dt>
 <span class="refentrytitle"><a href="gst-plugins-bad-libs-Utilities.html">Utilities</a></span><span class="refpurpose"></span>
 </dt>
 <dt>
@@ -191,7 +185,25 @@
 <span class="refentrytitle"><a href="gst-plugins-bad-libs-GstGLWindowX11.html">GstGLWindowX11</a></span><span class="refpurpose"></span>
 </dt>
 </dl></dd>
-<dt><span class="chapter"><a href="ch07.html">Interfaces</a></span></dt>
+<dt><span class="chapter"><a href="player.html">Player Library</a></span></dt>
+<dd><dl>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-libs-gstplayer.html">gstplayer</a></span><span class="refpurpose"> — Player</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-libs-gstplayer-mediainfo.html">gstplayer-mediainfo</a></span><span class="refpurpose"> — Player Media Information</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html">gstplayer-gmaincontextsignaldispatcher</a></span><span class="refpurpose"> — Player GLib MainContext dispatcher</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html">gstplayer-videooverlayvideorenderer</a></span><span class="refpurpose"> — Player Video Overlay Video Renderer</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-libs-gstplayer-visualization.html">gstplayer-visualization</a></span><span class="refpurpose"> — Player Visualization</span>
+</dt>
+</dl></dd>
+<dt><span class="chapter"><a href="ch08.html">Interfaces</a></span></dt>
 <dd><dl><dt>
 <span class="refentrytitle"><a href="gst-plugins-bad-libs-GstPhotography.html">GstPhotography</a></span><span class="refpurpose"> — Interface for digital image capture elements</span>
 </dt></dl></dd>
diff --git a/docs/libs/html/index.sgml b/docs/libs/html/index.sgml
index 6cb3874..e4f2596 100644
--- a/docs/libs/html/index.sgml
+++ b/docs/libs/html/index.sgml
@@ -1345,19 +1345,6 @@
 <ANCHOR id="GstGLDisplay.signal-details" href="gst-plugins-bad-libs-1.0/GstGLDisplay.html#GstGLDisplay.signal-details">
 <ANCHOR id="GstGLDisplay-create-context" href="gst-plugins-bad-libs-1.0/GstGLDisplay.html#GstGLDisplay-create-context">
 <ANCHOR id="GstGLDisplay.see-also" href="gst-plugins-bad-libs-1.0/GstGLDisplay.html#GstGLDisplay.see-also">
-<ANCHOR id="GstGLDownload" href="gst-plugins-bad-libs-1.0/GstGLDownload.html">
-<ANCHOR id="GstGLDownload.functions" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#GstGLDownload.functions">
-<ANCHOR id="GstGLDownload.other" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#GstGLDownload.other">
-<ANCHOR id="GstGLDownload.object-hierarchy" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#GstGLDownload.object-hierarchy">
-<ANCHOR id="GstGLDownload.description" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#GstGLDownload.description">
-<ANCHOR id="GstGLDownload.functions_details" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#GstGLDownload.functions_details">
-<ANCHOR id="gst-gl-download-new" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#gst-gl-download-new">
-<ANCHOR id="gst-gl-download-set-format" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#gst-gl-download-set-format">
-<ANCHOR id="gst-gl-download-transform-caps" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#gst-gl-download-transform-caps">
-<ANCHOR id="gst-gl-download-perform-with-data" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#gst-gl-download-perform-with-data">
-<ANCHOR id="GstGLDownload.other_details" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#GstGLDownload.other_details">
-<ANCHOR id="GstGLDownload-struct" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#GstGLDownload-struct">
-<ANCHOR id="GstGLDownload.see-also" href="gst-plugins-bad-libs-1.0/GstGLDownload.html#GstGLDownload.see-also">
 <ANCHOR id="gst-plugins-bad-libs-GstEGLImageMemory" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-GstEGLImageMemory.html">
 <ANCHOR id="gst-plugins-bad-libs-GstEGLImageMemory.functions" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-GstEGLImageMemory.html#gst-plugins-bad-libs-GstEGLImageMemory.functions">
 <ANCHOR id="gst-plugins-bad-libs-GstEGLImageMemory.other" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-GstEGLImageMemory.html#gst-plugins-bad-libs-GstEGLImageMemory.other">
@@ -1412,24 +1399,15 @@
 <ANCHOR id="GstGLFramebufferClass" href="gst-plugins-bad-libs-1.0/GstGLFramebuffer.html#GstGLFramebufferClass">
 <ANCHOR id="gst-plugins-bad-libs-gstglmemory" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html">
 <ANCHOR id="gst-plugins-bad-libs-gstglmemory.functions" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#gst-plugins-bad-libs-gstglmemory.functions">
-<ANCHOR id="GstGLAllocator" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#GstGLAllocator">
 <ANCHOR id="gst-plugins-bad-libs-gstglmemory.other" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#gst-plugins-bad-libs-gstglmemory.other">
-<ANCHOR id="gst-plugins-bad-libs-gstglmemory.object-hierarchy" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#gst-plugins-bad-libs-gstglmemory.object-hierarchy">
 <ANCHOR id="gst-plugins-bad-libs-gstglmemory.description" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#gst-plugins-bad-libs-gstglmemory.description">
 <ANCHOR id="gst-plugins-bad-libs-gstglmemory.functions_details" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#gst-plugins-bad-libs-gstglmemory.functions_details">
+<ANCHOR id="GST-GL-MEMORY-ALLOCATOR:CAPS" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#GST-GL-MEMORY-ALLOCATOR:CAPS">
 <ANCHOR id="gst-gl-memory-init" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-init">
-<ANCHOR id="gst-gl-memory-alloc" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-alloc">
-<ANCHOR id="gst-gl-memory-wrapped" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-wrapped">
-<ANCHOR id="gst-gl-memory-wrapped-texture" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-wrapped-texture">
-<ANCHOR id="gst-gl-memory-copy-into-texture" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-copy-into-texture">
 <ANCHOR id="gst-gl-memory-setup-buffer" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-setup-buffer">
-<ANCHOR id="gst-gl-memory-setup-wrapped" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#gst-gl-memory-setup-wrapped">
 <ANCHOR id="gst-gl-texture-type-from-format" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#gst-gl-texture-type-from-format">
 <ANCHOR id="gst-is-gl-memory" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#gst-is-gl-memory">
 <ANCHOR id="gst-plugins-bad-libs-gstglmemory.other_details" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#gst-plugins-bad-libs-gstglmemory.other_details">
-<ANCHOR id="GstGLAllocator-struct" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#GstGLAllocator-struct">
-<ANCHOR id="GstGLAllocatorClass" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#GstGLAllocatorClass">
-<ANCHOR id="GST-GL-MEMORY-ALLOCATOR:CAPS" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#GST-GL-MEMORY-ALLOCATOR:CAPS">
 <ANCHOR id="GstGLMemory" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#GstGLMemory">
 <ANCHOR id="gst-plugins-bad-libs-gstglmemory.see-also" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglmemory.html#gst-plugins-bad-libs-gstglmemory.see-also">
 <ANCHOR id="gst-plugins-bad-libs-gstglshader" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html">
@@ -1440,24 +1418,8 @@
 <ANCHOR id="gst-plugins-bad-libs-gstglshader.object-hierarchy" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-plugins-bad-libs-gstglshader.object-hierarchy">
 <ANCHOR id="gst-plugins-bad-libs-gstglshader.description" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-plugins-bad-libs-gstglshader.description">
 <ANCHOR id="gst-plugins-bad-libs-gstglshader.functions_details" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-plugins-bad-libs-gstglshader.functions_details">
-<ANCHOR id="gst-gl-shader-error-quark" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-error-quark">
-<ANCHOR id="GST-GL-SHADER-ERROR:CAPS" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#GST-GL-SHADER-ERROR:CAPS">
-<ANCHOR id="gst-gl-shadervariable-set" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shadervariable-set">
-<ANCHOR id="gst-gl-shadervariables-parse" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shadervariables-parse">
 <ANCHOR id="gst-gl-shader-new" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-new">
-<ANCHOR id="gst-gl-shader-set-vertex-source" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-set-vertex-source">
-<ANCHOR id="gst-gl-shader-set-fragment-source" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-set-fragment-source">
-<ANCHOR id="gst-gl-shader-get-vertex-source" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-get-vertex-source">
-<ANCHOR id="gst-gl-shader-get-fragment-source" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-get-fragment-source">
 <ANCHOR id="gst-gl-shader-get-program-handle" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-get-program-handle">
-<ANCHOR id="gst-gl-shader-set-active" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-set-active">
-<ANCHOR id="gst-gl-shader-is-compiled" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-is-compiled">
-<ANCHOR id="gst-gl-shader-compile" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile">
-<ANCHOR id="gst-gl-shader-compile-and-check" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile-and-check">
-<ANCHOR id="gst-gl-shader-compile-all-with-attribs-and-check" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile-all-with-attribs-and-check">
-<ANCHOR id="gst-gl-shader-compile-with-default-f-and-check" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile-with-default-f-and-check">
-<ANCHOR id="gst-gl-shader-compile-with-default-v-and-check" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile-with-default-v-and-check">
-<ANCHOR id="gst-gl-shader-compile-with-default-vf-and-check" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-compile-with-default-vf-and-check">
 <ANCHOR id="gst-gl-shader-release" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-release">
 <ANCHOR id="gst-gl-shader-use" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-use">
 <ANCHOR id="gst-gl-shader-set-uniform-1i" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-set-uniform-1i">
@@ -1488,20 +1450,9 @@
 <ANCHOR id="gst-gl-shader-get-attribute-location" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-get-attribute-location">
 <ANCHOR id="gst-gl-shader-bind-attribute-location" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shader-bind-attribute-location">
 <ANCHOR id="gst-plugins-bad-libs-gstglshader.other_details" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-plugins-bad-libs-gstglshader.other_details">
-<ANCHOR id="GstGLShaderError" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#GstGLShaderError">
-<ANCHOR id="GST-GL-SHADER-ERROR-COMPILE:CAPS" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#GST-GL-SHADER-ERROR-COMPILE:CAPS">
-<ANCHOR id="GST-GL-SHADER-ERROR-LINK:CAPS" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#GST-GL-SHADER-ERROR-LINK:CAPS">
-<ANCHOR id="GST-GL-SHADER-ERROR-PROGRAM:CAPS" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#GST-GL-SHADER-ERROR-PROGRAM:CAPS">
-<ANCHOR id="GstGLShaderSourceType" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#GstGLShaderSourceType">
-<ANCHOR id="GST-GL-SHADER-FRAGMENT-SOURCE:CAPS" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#GST-GL-SHADER-FRAGMENT-SOURCE:CAPS">
-<ANCHOR id="GST-GL-SHADER-VERTEX-SOURCE:CAPS" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#GST-GL-SHADER-VERTEX-SOURCE:CAPS">
-<ANCHOR id="gst-gl-shadervariable-desc" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-gl-shadervariable-desc">
 <ANCHOR id="GstGLShader-struct" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#GstGLShader-struct">
 <ANCHOR id="gst-plugins-bad-libs-gstglshader.property-details" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#gst-plugins-bad-libs-gstglshader.property-details">
-<ANCHOR id="GstGLShader--active" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#GstGLShader--active">
-<ANCHOR id="GstGLShader--compiled" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#GstGLShader--compiled">
-<ANCHOR id="GstGLShader--fragment-src" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#GstGLShader--fragment-src">
-<ANCHOR id="GstGLShader--vertex-src" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#GstGLShader--vertex-src">
+<ANCHOR id="GstGLShader--linked" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstglshader.html#GstGLShader--linked">
 <ANCHOR id="gst-plugins-bad-libs-GstGLSyncMeta" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-GstGLSyncMeta.html">
 <ANCHOR id="gst-plugins-bad-libs-GstGLSyncMeta.functions" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-GstGLSyncMeta.html#gst-plugins-bad-libs-GstGLSyncMeta.functions">
 <ANCHOR id="gst-plugins-bad-libs-GstGLSyncMeta.other" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-GstGLSyncMeta.html#gst-plugins-bad-libs-GstGLSyncMeta.other">
@@ -1528,23 +1479,9 @@
 <ANCHOR id="gst-gl-upload-propose-allocation" href="gst-plugins-bad-libs-1.0/GstGLUpload.html#gst-gl-upload-propose-allocation">
 <ANCHOR id="gst-gl-upload-transform-caps" href="gst-plugins-bad-libs-1.0/GstGLUpload.html#gst-gl-upload-transform-caps">
 <ANCHOR id="gst-gl-upload-perform-with-buffer" href="gst-plugins-bad-libs-1.0/GstGLUpload.html#gst-gl-upload-perform-with-buffer">
-<ANCHOR id="gst-gl-upload-release-buffer" href="gst-plugins-bad-libs-1.0/GstGLUpload.html#gst-gl-upload-release-buffer">
 <ANCHOR id="GstGLUpload.other_details" href="gst-plugins-bad-libs-1.0/GstGLUpload.html#GstGLUpload.other_details">
 <ANCHOR id="GstGLUpload-struct" href="gst-plugins-bad-libs-1.0/GstGLUpload.html#GstGLUpload-struct">
 <ANCHOR id="GstGLUpload.see-also" href="gst-plugins-bad-libs-1.0/GstGLUpload.html#GstGLUpload.see-also">
-<ANCHOR id="GstGLUploadMeta" href="gst-plugins-bad-libs-1.0/GstGLUploadMeta.html">
-<ANCHOR id="GstGLUploadMeta.functions" href="gst-plugins-bad-libs-1.0/GstGLUploadMeta.html#GstGLUploadMeta.functions">
-<ANCHOR id="GstGLUploadMeta.other" href="gst-plugins-bad-libs-1.0/GstGLUploadMeta.html#GstGLUploadMeta.other">
-<ANCHOR id="GstGLUploadMeta.object-hierarchy" href="gst-plugins-bad-libs-1.0/GstGLUploadMeta.html#GstGLUploadMeta.object-hierarchy">
-<ANCHOR id="GstGLUploadMeta.description" href="gst-plugins-bad-libs-1.0/GstGLUploadMeta.html#GstGLUploadMeta.description">
-<ANCHOR id="GstGLUploadMeta.functions_details" href="gst-plugins-bad-libs-1.0/GstGLUploadMeta.html#GstGLUploadMeta.functions_details">
-<ANCHOR id="gst-gl-upload-meta-new" href="gst-plugins-bad-libs-1.0/GstGLUploadMeta.html#gst-gl-upload-meta-new">
-<ANCHOR id="gst-gl-upload-meta-set-format" href="gst-plugins-bad-libs-1.0/GstGLUploadMeta.html#gst-gl-upload-meta-set-format">
-<ANCHOR id="gst-gl-upload-meta-get-format" href="gst-plugins-bad-libs-1.0/GstGLUploadMeta.html#gst-gl-upload-meta-get-format">
-<ANCHOR id="gst-gl-upload-meta-add-to-buffer" href="gst-plugins-bad-libs-1.0/GstGLUploadMeta.html#gst-gl-upload-meta-add-to-buffer">
-<ANCHOR id="GstGLUploadMeta.other_details" href="gst-plugins-bad-libs-1.0/GstGLUploadMeta.html#GstGLUploadMeta.other_details">
-<ANCHOR id="GstGLUploadMeta-struct" href="gst-plugins-bad-libs-1.0/GstGLUploadMeta.html#GstGLUploadMeta-struct">
-<ANCHOR id="GstGLUploadMeta.see-also" href="gst-plugins-bad-libs-1.0/GstGLUploadMeta.html#GstGLUploadMeta.see-also">
 <ANCHOR id="gst-plugins-bad-libs-Utilities" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-Utilities.html">
 <ANCHOR id="gst-plugins-bad-libs-Utilities.functions" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-Utilities.html#gst-plugins-bad-libs-Utilities.functions">
 <ANCHOR id="gst-plugins-bad-libs-Utilities.other" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-Utilities.html#gst-plugins-bad-libs-Utilities.other">
@@ -1590,7 +1527,6 @@
 <ANCHOR id="GST-GL-WINDOW-CB:CAPS" href="gst-plugins-bad-libs-1.0/GstGLWindow.html#GST-GL-WINDOW-CB:CAPS">
 <ANCHOR id="gst-gl-window-new" href="gst-plugins-bad-libs-1.0/GstGLWindow.html#gst-gl-window-new">
 <ANCHOR id="gst-gl-window-draw" href="gst-plugins-bad-libs-1.0/GstGLWindow.html#gst-gl-window-draw">
-<ANCHOR id="gst-gl-window-draw-unlocked" href="gst-plugins-bad-libs-1.0/GstGLWindow.html#gst-gl-window-draw-unlocked">
 <ANCHOR id="gst-gl-window-is-running" href="gst-plugins-bad-libs-1.0/GstGLWindow.html#gst-gl-window-is-running">
 <ANCHOR id="gst-gl-window-quit" href="gst-plugins-bad-libs-1.0/GstGLWindow.html#gst-gl-window-quit">
 <ANCHOR id="gst-gl-window-run" href="gst-plugins-bad-libs-1.0/GstGLWindow.html#gst-gl-window-run">
@@ -1677,6 +1613,179 @@
 <ANCHOR id="gst-plugins-bad-libs-GstGLWindowX11.other_details" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-GstGLWindowX11.html#gst-plugins-bad-libs-GstGLWindowX11.other_details">
 <ANCHOR id="GstGLWindowX11" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-GstGLWindowX11.html#GstGLWindowX11">
 <ANCHOR id="GstGLWindowX11Class" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-GstGLWindowX11.html#GstGLWindowX11Class">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer.functions" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-plugins-bad-libs-gstplayer.functions">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer.properties" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-plugins-bad-libs-gstplayer.properties">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer.signals" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-plugins-bad-libs-gstplayer.signals">
+<ANCHOR id="GstPlayer" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer">
+<ANCHOR id="GstPlayerSignalDispatcher" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayerSignalDispatcher">
+<ANCHOR id="GstPlayerVideoRenderer" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayerVideoRenderer">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer.other" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-plugins-bad-libs-gstplayer.other">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer.object-hierarchy" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-plugins-bad-libs-gstplayer.object-hierarchy">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer.prerequisites" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-plugins-bad-libs-gstplayer.prerequisites">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer.implementations" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-plugins-bad-libs-gstplayer.implementations">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer.description" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-plugins-bad-libs-gstplayer.description">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer.functions_details" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-plugins-bad-libs-gstplayer.functions_details">
+<ANCHOR id="gst-player-new" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-new">
+<ANCHOR id="gst-player-new-full" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-new-full">
+<ANCHOR id="gst-player-play" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-play">
+<ANCHOR id="gst-player-pause" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-pause">
+<ANCHOR id="gst-player-stop" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-stop">
+<ANCHOR id="gst-player-seek" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-seek">
+<ANCHOR id="gst-player-set-uri" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-set-uri">
+<ANCHOR id="gst-player-get-uri" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-get-uri">
+<ANCHOR id="gst-player-get-duration" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-get-duration">
+<ANCHOR id="gst-player-get-position" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-get-position">
+<ANCHOR id="gst-player-set-volume" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-set-volume">
+<ANCHOR id="gst-player-set-mute" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-set-mute">
+<ANCHOR id="gst-player-get-volume" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-get-volume">
+<ANCHOR id="gst-player-get-mute" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-get-mute">
+<ANCHOR id="gst-player-get-pipeline" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-get-pipeline">
+<ANCHOR id="gst-player-set-position-update-interval" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-set-position-update-interval">
+<ANCHOR id="gst-player-get-position-update-interval" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-get-position-update-interval">
+<ANCHOR id="gst-player-state-get-name" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-state-get-name">
+<ANCHOR id="GST-PLAYER-ERROR:CAPS" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-ERROR:CAPS">
+<ANCHOR id="gst-player-error-get-name" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-error-get-name">
+<ANCHOR id="gst-player-get-media-info" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-get-media-info">
+<ANCHOR id="gst-player-get-audio-streams" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-get-audio-streams">
+<ANCHOR id="gst-player-get-video-streams" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-get-video-streams">
+<ANCHOR id="gst-player-get-subtitle-streams" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-get-subtitle-streams">
+<ANCHOR id="gst-player-set-audio-track" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-set-audio-track">
+<ANCHOR id="gst-player-set-video-track" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-set-video-track">
+<ANCHOR id="gst-player-set-subtitle-track" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-set-subtitle-track">
+<ANCHOR id="gst-player-get-current-audio-track" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-get-current-audio-track">
+<ANCHOR id="gst-player-get-current-video-track" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-get-current-video-track">
+<ANCHOR id="gst-player-get-current-subtitle-track" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-get-current-subtitle-track">
+<ANCHOR id="gst-player-set-audio-track-enabled" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-set-audio-track-enabled">
+<ANCHOR id="gst-player-set-video-track-enabled" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-set-video-track-enabled">
+<ANCHOR id="gst-player-set-subtitle-track-enabled" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-set-subtitle-track-enabled">
+<ANCHOR id="gst-player-set-subtitle-uri" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-set-subtitle-uri">
+<ANCHOR id="gst-player-get-subtitle-uri" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-get-subtitle-uri">
+<ANCHOR id="gst-player-set-visualization" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-set-visualization">
+<ANCHOR id="gst-player-set-visualization-enabled" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-set-visualization-enabled">
+<ANCHOR id="gst-player-get-current-visualization" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-get-current-visualization">
+<ANCHOR id="gst-player-color-balance-type-get-name" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-color-balance-type-get-name">
+<ANCHOR id="gst-player-has-color-balance" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-has-color-balance">
+<ANCHOR id="gst-player-set-color-balance" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-set-color-balance">
+<ANCHOR id="gst-player-get-color-balance" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-get-color-balance">
+<ANCHOR id="gst-player-get-rate" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-get-rate">
+<ANCHOR id="gst-player-set-rate" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-player-set-rate">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer.other_details" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-plugins-bad-libs-gstplayer.other_details">
+<ANCHOR id="GstPlayer-struct" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer-struct">
+<ANCHOR id="GstPlayerState" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayerState">
+<ANCHOR id="GST-PLAYER-STATE-STOPPED:CAPS" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-STATE-STOPPED:CAPS">
+<ANCHOR id="GST-PLAYER-STATE-BUFFERING:CAPS" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-STATE-BUFFERING:CAPS">
+<ANCHOR id="GST-PLAYER-STATE-PAUSED:CAPS" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-STATE-PAUSED:CAPS">
+<ANCHOR id="GST-PLAYER-STATE-PLAYING:CAPS" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-STATE-PLAYING:CAPS">
+<ANCHOR id="GstPlayerError" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayerError">
+<ANCHOR id="GST-PLAYER-ERROR-FAILED:CAPS" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-ERROR-FAILED:CAPS">
+<ANCHOR id="GstPlayerColorBalanceType" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayerColorBalanceType">
+<ANCHOR id="GST-PLAYER-COLOR-BALANCE-BRIGHTNESS:CAPS" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-COLOR-BALANCE-BRIGHTNESS:CAPS">
+<ANCHOR id="GST-PLAYER-COLOR-BALANCE-CONTRAST:CAPS" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-COLOR-BALANCE-CONTRAST:CAPS">
+<ANCHOR id="GST-PLAYER-COLOR-BALANCE-SATURATION:CAPS" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-COLOR-BALANCE-SATURATION:CAPS">
+<ANCHOR id="GST-PLAYER-COLOR-BALANCE-HUE:CAPS" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GST-PLAYER-COLOR-BALANCE-HUE:CAPS">
+<ANCHOR id="GstPlayerSignalDispatcher-struct" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayerSignalDispatcher-struct">
+<ANCHOR id="GstPlayerSignalDispatcherInterface" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayerSignalDispatcherInterface">
+<ANCHOR id="GstPlayerVideoRenderer-struct" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayerVideoRenderer-struct">
+<ANCHOR id="GstPlayerVideoRendererInterface" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayerVideoRendererInterface">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer.property-details" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-plugins-bad-libs-gstplayer.property-details">
+<ANCHOR id="GstPlayer--current-audio-track" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer--current-audio-track">
+<ANCHOR id="GstPlayer--current-subtitle-track" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer--current-subtitle-track">
+<ANCHOR id="GstPlayer--current-video-track" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer--current-video-track">
+<ANCHOR id="GstPlayer--duration" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer--duration">
+<ANCHOR id="GstPlayer--media-info" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer--media-info">
+<ANCHOR id="GstPlayer--mute" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer--mute">
+<ANCHOR id="GstPlayer--pipeline" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer--pipeline">
+<ANCHOR id="GstPlayer--position" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer--position">
+<ANCHOR id="GstPlayer--position-update-interval" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer--position-update-interval">
+<ANCHOR id="GstPlayer--rate" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer--rate">
+<ANCHOR id="GstPlayer--signal-dispatcher" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer--signal-dispatcher">
+<ANCHOR id="GstPlayer--suburi" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer--suburi">
+<ANCHOR id="GstPlayer--uri" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer--uri">
+<ANCHOR id="GstPlayer--video-renderer" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer--video-renderer">
+<ANCHOR id="GstPlayer--volume" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer--volume">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer.signal-details" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#gst-plugins-bad-libs-gstplayer.signal-details">
+<ANCHOR id="GstPlayer-buffering" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer-buffering">
+<ANCHOR id="GstPlayer-duration-changed" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer-duration-changed">
+<ANCHOR id="GstPlayer-end-of-stream" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer-end-of-stream">
+<ANCHOR id="GstPlayer-error" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer-error">
+<ANCHOR id="GstPlayer-media-info-updated" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer-media-info-updated">
+<ANCHOR id="GstPlayer-mute-changed" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer-mute-changed">
+<ANCHOR id="GstPlayer-position-updated" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer-position-updated">
+<ANCHOR id="GstPlayer-seek-done" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer-seek-done">
+<ANCHOR id="GstPlayer-state-changed" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer-state-changed">
+<ANCHOR id="GstPlayer-video-dimensions-changed" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer-video-dimensions-changed">
+<ANCHOR id="GstPlayer-volume-changed" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer-volume-changed">
+<ANCHOR id="GstPlayer-warning" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer.html#GstPlayer-warning">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-mediainfo" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-mediainfo.functions" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-plugins-bad-libs-gstplayer-mediainfo.functions">
+<ANCHOR id="GstPlayerMediaInfo" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo">
+<ANCHOR id="GstPlayerStreamInfo" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo">
+<ANCHOR id="GstPlayerAudioInfo" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo">
+<ANCHOR id="GstPlayerVideoInfo" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo">
+<ANCHOR id="GstPlayerSubtitleInfo" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerSubtitleInfo">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-mediainfo.other" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-plugins-bad-libs-gstplayer-mediainfo.other">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-mediainfo.object-hierarchy" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-plugins-bad-libs-gstplayer-mediainfo.object-hierarchy">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-mediainfo.description" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-plugins-bad-libs-gstplayer-mediainfo.description">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-mediainfo.functions_details" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-plugins-bad-libs-gstplayer-mediainfo.functions_details">
+<ANCHOR id="gst-player-media-info-get-uri" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-uri">
+<ANCHOR id="gst-player-media-info-get-duration" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-duration">
+<ANCHOR id="gst-player-media-info-get-title" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-title">
+<ANCHOR id="gst-player-media-info-get-container-format" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-container-format">
+<ANCHOR id="gst-player-media-info-is-seekable" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-is-seekable">
+<ANCHOR id="gst-player-media-info-get-image-sample" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-image-sample">
+<ANCHOR id="gst-player-media-info-get-tags" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-tags">
+<ANCHOR id="gst-player-media-info-get-stream-list" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-media-info-get-stream-list">
+<ANCHOR id="gst-player-stream-info-get-index" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-stream-info-get-index">
+<ANCHOR id="gst-player-stream-info-get-caps" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-stream-info-get-caps">
+<ANCHOR id="gst-player-stream-info-get-tags" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-stream-info-get-tags">
+<ANCHOR id="gst-player-stream-info-get-codec" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-stream-info-get-codec">
+<ANCHOR id="gst-player-stream-info-get-stream-type" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-stream-info-get-stream-type">
+<ANCHOR id="gst-player-audio-info-get-bitrate" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-audio-info-get-bitrate">
+<ANCHOR id="gst-player-audio-info-get-channels" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-audio-info-get-channels">
+<ANCHOR id="gst-player-audio-info-get-language" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-audio-info-get-language">
+<ANCHOR id="gst-player-audio-info-get-max-bitrate" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-audio-info-get-max-bitrate">
+<ANCHOR id="gst-player-audio-info-get-sample-rate" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-audio-info-get-sample-rate">
+<ANCHOR id="gst-player-video-info-get-bitrate" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-bitrate">
+<ANCHOR id="gst-player-video-info-get-height" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-height">
+<ANCHOR id="gst-player-video-info-get-width" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-width">
+<ANCHOR id="gst-player-video-info-get-framerate" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-framerate">
+<ANCHOR id="gst-player-video-info-get-max-bitrate" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-max-bitrate">
+<ANCHOR id="gst-player-video-info-get-pixel-aspect-ratio" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-video-info-get-pixel-aspect-ratio">
+<ANCHOR id="gst-player-subtitle-info-get-language" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-player-subtitle-info-get-language">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-mediainfo.other_details" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#gst-plugins-bad-libs-gstplayer-mediainfo.other_details">
+<ANCHOR id="GstPlayerMediaInfo-struct" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerMediaInfo-struct">
+<ANCHOR id="GstPlayerStreamInfo-struct" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerStreamInfo-struct">
+<ANCHOR id="GstPlayerAudioInfo-struct" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerAudioInfo-struct">
+<ANCHOR id="GstPlayerVideoInfo-struct" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerVideoInfo-struct">
+<ANCHOR id="GstPlayerSubtitleInfo-struct" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-mediainfo.html#GstPlayerSubtitleInfo-struct">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.functions" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html#gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.functions">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.description" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html#gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.description">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.functions_details" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html#gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.functions_details">
+<ANCHOR id="gst-player-g-main-context-signal-dispatcher-new" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html#gst-player-g-main-context-signal-dispatcher-new">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.other_details" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html#gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.other_details">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.functions" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html#gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.functions">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.description" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html#gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.description">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.functions_details" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html#gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.functions_details">
+<ANCHOR id="gst-player-video-overlay-video-renderer-new" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html#gst-player-video-overlay-video-renderer-new">
+<ANCHOR id="gst-player-video-overlay-video-renderer-get-window-handle" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html#gst-player-video-overlay-video-renderer-get-window-handle">
+<ANCHOR id="gst-player-video-overlay-video-renderer-set-window-handle" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html#gst-player-video-overlay-video-renderer-set-window-handle">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.other_details" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html#gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.other_details">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-visualization" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-visualization.html">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-visualization.functions" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-visualization.html#gst-plugins-bad-libs-gstplayer-visualization.functions">
+<ANCHOR id="GstPlayerVisualization" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-visualization.html#GstPlayerVisualization">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-visualization.other" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-visualization.html#gst-plugins-bad-libs-gstplayer-visualization.other">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-visualization.object-hierarchy" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-visualization.html#gst-plugins-bad-libs-gstplayer-visualization.object-hierarchy">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-visualization.description" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-visualization.html#gst-plugins-bad-libs-gstplayer-visualization.description">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-visualization.functions_details" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-visualization.html#gst-plugins-bad-libs-gstplayer-visualization.functions_details">
+<ANCHOR id="gst-player-visualizations-get" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-visualization.html#gst-player-visualizations-get">
+<ANCHOR id="gst-player-visualizations-free" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-visualization.html#gst-player-visualizations-free">
+<ANCHOR id="gst-player-visualization-copy" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-visualization.html#gst-player-visualization-copy">
+<ANCHOR id="gst-player-visualization-free" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-visualization.html#gst-player-visualization-free">
+<ANCHOR id="gst-plugins-bad-libs-gstplayer-visualization.other_details" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-visualization.html#gst-plugins-bad-libs-gstplayer-visualization.other_details">
+<ANCHOR id="GstPlayerVisualization-struct" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-gstplayer-visualization.html#GstPlayerVisualization-struct">
 <ANCHOR id="gst-plugins-bad-libs-GstPhotography" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-GstPhotography.html">
 <ANCHOR id="gst-plugins-bad-libs-GstPhotography.stability-level" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-GstPhotography.html#gst-plugins-bad-libs-GstPhotography.stability-level">
 <ANCHOR id="gst-plugins-bad-libs-GstPhotography.functions" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-GstPhotography.html#gst-plugins-bad-libs-GstPhotography.functions">
@@ -1832,6 +1941,7 @@
 <ANCHOR id="GST-PHOTOGRAPHY-PROP-FOCUS-MODE:CAPS" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-GstPhotography.html#GST-PHOTOGRAPHY-PROP-FOCUS-MODE:CAPS">
 <ANCHOR id="GST-PHOTOGRAPHY-PROP-ZOOM:CAPS" href="gst-plugins-bad-libs-1.0/gst-plugins-bad-libs-GstPhotography.html#GST-PHOTOGRAPHY-PROP-ZOOM:CAPS">
 <ANCHOR id="annotation-glossterm-allow-none" href="gst-plugins-bad-libs-1.0/annotation-glossary.html#annotation-glossterm-allow-none">
+<ANCHOR id="annotation-glossterm-array" href="gst-plugins-bad-libs-1.0/annotation-glossary.html#annotation-glossterm-array">
 <ANCHOR id="annotation-glossterm-closure" href="gst-plugins-bad-libs-1.0/annotation-glossary.html#annotation-glossterm-closure">
 <ANCHOR id="annotation-glossterm-destroy" href="gst-plugins-bad-libs-1.0/annotation-glossary.html#annotation-glossterm-destroy">
 <ANCHOR id="annotation-glossterm-element-type" href="gst-plugins-bad-libs-1.0/annotation-glossary.html#annotation-glossterm-element-type">
diff --git a/docs/libs/html/player.html b/docs/libs/html/player.html
new file mode 100644
index 0000000..0d90935
--- /dev/null
+++ b/docs/libs/html/player.html
@@ -0,0 +1,46 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
+<html>
+<head>
+<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
+<title>Player Library: GStreamer Bad Plugins 1.0 Library Reference Manual</title>
+<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
+<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Library Reference Manual">
+<link rel="up" href="gstreamer-plugins-bad.html" title="Part I. GStreamer Bad Plugins Libraries">
+<link rel="prev" href="gst-plugins-bad-libs-GstGLWindowX11.html" title="GstGLWindowX11">
+<link rel="next" href="gst-plugins-bad-libs-gstplayer.html" title="gstplayer">
+<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
+<link rel="stylesheet" href="style.css" type="text/css">
+</head>
+<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
+<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
+<td width="100%" align="left" class="shortcuts"></td>
+<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
+<td><a accesskey="u" href="gstreamer-plugins-bad.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-libs-GstGLWindowX11.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-libs-gstplayer.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+</tr></table>
+<div class="chapter">
+<div class="titlepage"><div><div><h2 class="title">
+<a name="player"></a>Player Library</h2></div></div></div>
+<div class="toc"><dl class="toc">
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-libs-gstplayer.html">gstplayer</a></span><span class="refpurpose"> — Player</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-libs-gstplayer-mediainfo.html">gstplayer-mediainfo</a></span><span class="refpurpose"> — Player Media Information</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-libs-gstplayer-gmaincontextsignaldispatcher.html">gstplayer-gmaincontextsignaldispatcher</a></span><span class="refpurpose"> — Player GLib MainContext dispatcher</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-libs-gstplayer-videooverlayvideorenderer.html">gstplayer-videooverlayvideorenderer</a></span><span class="refpurpose"> — Player Video Overlay Video Renderer</span>
+</dt>
+<dt>
+<span class="refentrytitle"><a href="gst-plugins-bad-libs-gstplayer-visualization.html">gstplayer-visualization</a></span><span class="refpurpose"> — Player Visualization</span>
+</dt>
+</dl></div>
+</div>
+<div class="footer">
+<hr>Generated by GTK-Doc V1.24</div>
+</body>
+</html>
\ No newline at end of file
diff --git a/docs/plugins/Makefile.am b/docs/plugins/Makefile.am
index c431f78..7607b55 100644
--- a/docs/plugins/Makefile.am
+++ b/docs/plugins/Makefile.am
@@ -112,7 +112,6 @@
 	$(top_srcdir)/gst/aiff/aiffparse.h \
 	$(top_srcdir)/gst/aiff/aiffmux.h \
 	$(top_srcdir)/gst/autoconvert/gstautoconvert.h \
-	$(top_srcdir)/gst/audiovisualizers/gstaudiovisualizer.h \
 	$(top_srcdir)/gst/audiovisualizers/gstspacescope.h \
 	$(top_srcdir)/gst/audiovisualizers/gstspectrascope.h \
 	$(top_srcdir)/gst/audiovisualizers/gstsynaescope.h \
@@ -151,7 +150,6 @@
 	$(top_srcdir)/gst/geometrictransform/gstwaterripple.h \
 	$(top_srcdir)/gst/ivfparse/gstivfparse.h \
 	$(top_srcdir)/gst/jpegformat/gstjpegparse.h \
-	$(top_srcdir)/gst/liveadder/liveadder.h \
 	$(top_srcdir)/gst/mxf/mxfdemux.h \
 	$(top_srcdir)/gst/mxf/mxfmux.h \
 	$(top_srcdir)/gst/nuvdemux/gstnuvdemux.h \
diff --git a/docs/plugins/Makefile.in b/docs/plugins/Makefile.in
index 1174a97..5c6edd5 100644
--- a/docs/plugins/Makefile.in
+++ b/docs/plugins/Makefile.in
@@ -267,6 +267,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -304,6 +306,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -331,6 +335,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -349,6 +355,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -359,6 +367,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -384,6 +394,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -409,6 +421,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -540,6 +554,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -597,8 +613,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -668,6 +688,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -872,7 +893,6 @@
 	$(top_srcdir)/gst/aiff/aiffparse.h \
 	$(top_srcdir)/gst/aiff/aiffmux.h \
 	$(top_srcdir)/gst/autoconvert/gstautoconvert.h \
-	$(top_srcdir)/gst/audiovisualizers/gstaudiovisualizer.h \
 	$(top_srcdir)/gst/audiovisualizers/gstspacescope.h \
 	$(top_srcdir)/gst/audiovisualizers/gstspectrascope.h \
 	$(top_srcdir)/gst/audiovisualizers/gstsynaescope.h \
@@ -911,7 +931,6 @@
 	$(top_srcdir)/gst/geometrictransform/gstwaterripple.h \
 	$(top_srcdir)/gst/ivfparse/gstivfparse.h \
 	$(top_srcdir)/gst/jpegformat/gstjpegparse.h \
-	$(top_srcdir)/gst/liveadder/liveadder.h \
 	$(top_srcdir)/gst/mxf/mxfdemux.h \
 	$(top_srcdir)/gst/mxf/mxfmux.h \
 	$(top_srcdir)/gst/nuvdemux/gstnuvdemux.h \
diff --git a/docs/plugins/gst-plugins-bad-plugins-docs.sgml b/docs/plugins/gst-plugins-bad-plugins-docs.sgml
index 51278e9..bd25df3 100644
--- a/docs/plugins/gst-plugins-bad-plugins-docs.sgml
+++ b/docs/plugins/gst-plugins-bad-plugins-docs.sgml
@@ -132,7 +132,6 @@
     <xi:include href="xml/plugin-geometrictransform.xml" />
     <xi:include href="xml/plugin-gsm.xml" />
     <xi:include href="xml/plugin-jpegformat.xml" />
-    <xi:include href="xml/plugin-liveadder.xml" />
     <xi:include href="xml/plugin-mimic.xml" />
     <xi:include href="xml/plugin-mms.xml" />
     <xi:include href="xml/plugin-modplug.xml" />
diff --git a/docs/plugins/gst-plugins-bad-plugins-sections.txt b/docs/plugins/gst-plugins-bad-plugins-sections.txt
index 5e869c8..a289e22 100644
--- a/docs/plugins/gst-plugins-bad-plugins-sections.txt
+++ b/docs/plugins/gst-plugins-bad-plugins-sections.txt
@@ -720,15 +720,7 @@
 GstLiveAdder
 <SUBSECTION Standard>
 GstLiveAdderClass
-GST_IS_LIVE_ADDER
-GST_IS_LIVE_ADDER_CLASS
-GST_IS_MXF_DEMUX_PAD
-GST_LIVE_ADDER
-GST_LIVE_ADDER_CLASS
-GST_LIVE_ADDER_GET_CLASS
 GST_TYPE_LIVE_ADDER
-GstLiveAdderFormat
-GstLiveAdderFunction
 gst_live_adder_get_type
 </SECTION>
 
@@ -1008,6 +1000,7 @@
 GST_MXF_DEMUX_CLASS
 GST_TYPE_MXF_DEMUX
 gst_mxf_demux_get_type
+GST_IS_MXF_DEMUX_PAD
 </SECTION>
 
 <SECTION>
diff --git a/docs/plugins/gst-plugins-bad-plugins.args b/docs/plugins/gst-plugins-bad-plugins.args
index 2f1d2b2..3c6b35b 100644
--- a/docs/plugins/gst-plugins-bad-plugins.args
+++ b/docs/plugins/gst-plugins-bad-plugins.args
@@ -23952,10 +23952,10 @@
 <NAME>GstLiveAdder::latency</NAME>
 <TYPE>guint</TYPE>
 <RANGE></RANGE>
-<FLAGS>rw</FLAGS>
-<NICK>Buffering latency</NICK>
-<BLURB>Amount of data to buffer (in milliseconds).</BLURB>
-<DEFAULT>60</DEFAULT>
+<FLAGS>rwx</FLAGS>
+<NICK>Buffer latency</NICK>
+<BLURB>Additional latency in live mode to allow upstream to take longer to produce buffers for the current position (in milliseconds).</BLURB>
+<DEFAULT>30</DEFAULT>
 </ARG>
 
 <ARG>
@@ -47134,7 +47134,7 @@
 <RANGE>>= 0</RANGE>
 <FLAGS>rw</FLAGS>
 <NICK>color (gaussian standard deviation or color sigma</NICK>
-<BLURB>If type is gaussian, this means the standard deviation.If type is bilateral, this means the color-sigma. If zero, Default values are used.Check cvSmooth OpenCV docs: http://opencv.willowgarage.com/documentation/image_filtering.html#cvSmooth.</BLURB>
+<BLURB>If type is gaussian, this means the standard deviation.If type is bilateral, this means the color-sigma. If zero, Default values are used.</BLURB>
 <DEFAULT>0</DEFAULT>
 </ARG>
 
@@ -47143,9 +47143,9 @@
 <TYPE>gint</TYPE>
 <RANGE>>= 0</RANGE>
 <FLAGS>rw</FLAGS>
-<NICK>height (aperture height)</NICK>
-<BLURB>The aperture height, if zero, the width is used.(Must be positive and odd or zero, unuset in median and bilateral types). Check cvSmooth OpenCV docs: http://opencv.willowgarage.com/documentation/image_filtering.html#cvSmooth.</BLURB>
-<DEFAULT>0</DEFAULT>
+<NICK>height (kernel height)</NICK>
+<BLURB>The gaussian kernel height (must be positive and odd).</BLURB>
+<DEFAULT>3</DEFAULT>
 </ARG>
 
 <ARG>
@@ -47154,7 +47154,7 @@
 <RANGE>>= 0</RANGE>
 <FLAGS>rw</FLAGS>
 <NICK>spatial (spatial sigma, bilateral only)</NICK>
-<BLURB>Only used in bilateral type, means the spatial-sigma.Check cvSmooth OpenCV docs: http://opencv.willowgarage.com/documentation/image_filtering.html#cvSmooth.</BLURB>
+<BLURB>Only used in bilateral type, means the spatial-sigma.</BLURB>
 <DEFAULT>0</DEFAULT>
 </ARG>
 
@@ -47163,8 +47163,8 @@
 <TYPE>gint</TYPE>
 <RANGE>>= 1</RANGE>
 <FLAGS>rw</FLAGS>
-<NICK>width (aperture width)</NICK>
-<BLURB>The aperture width (Must be positive and odd).Check cvSmooth OpenCV docs: http://opencv.willowgarage.com/documentation/image_filtering.html#cvSmooth.</BLURB>
+<NICK>width (kernel width)</NICK>
+<BLURB>The gaussian kernel width (must be positive and odd).If type is median, this means the aperture linear size.Check OpenCV docs: http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.htm.</BLURB>
 <DEFAULT>3</DEFAULT>
 </ARG>
 
@@ -47179,6 +47179,26 @@
 </ARG>
 
 <ARG>
+<NAME>GstCvLaplace::scale</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>scale factor</NICK>
+<BLURB>Scale factor.</BLURB>
+<DEFAULT>1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstCvLaplace::shift</NAME>
+<TYPE>gdouble</TYPE>
+<RANGE>>= 0</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Shift</NICK>
+<BLURB>Value added to the scaled source array elements.</BLURB>
+<DEFAULT>0</DEFAULT>
+</ARG>
+
+<ARG>
 <NAME>GstRotate::angle</NAME>
 <TYPE>gdouble</TYPE>
 <RANGE></RANGE>
@@ -59939,6 +59959,16 @@
 </ARG>
 
 <ARG>
+<NAME>GstDashDemux::presentation-delay</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Presentation delay</NICK>
+<BLURB>Default presentation delay (in seconds, milliseconds or fragments) (e.g. 12s, 2500ms, 3f).</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
 <NAME>GstSkinDetect::method</NAME>
 <TYPE>GstSkindetectMethod</TYPE>
 <RANGE></RANGE>
@@ -59980,8 +60010,8 @@
 
 <ARG>
 <NAME>GstHanddetect::ROI-HEIGHT</NAME>
-<TYPE>guint</TYPE>
-<RANGE></RANGE>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
 <FLAGS>rw</FLAGS>
 <NICK>ROI_HEIGHT</NICK>
 <BLURB>HEIGHT of left-top pointer in region of interest 
@@ -59991,8 +60021,8 @@
 
 <ARG>
 <NAME>GstHanddetect::ROI-WIDTH</NAME>
-<TYPE>guint</TYPE>
-<RANGE></RANGE>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
 <FLAGS>rw</FLAGS>
 <NICK>ROI_WIDTH</NICK>
 <BLURB>WIDTH of left-top pointer in region of interest 
@@ -60002,8 +60032,8 @@
 
 <ARG>
 <NAME>GstHanddetect::ROI-X</NAME>
-<TYPE>guint</TYPE>
-<RANGE></RANGE>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
 <FLAGS>rw</FLAGS>
 <NICK>ROI_X</NICK>
 <BLURB>X of left-top pointer in region of interest 
@@ -60013,8 +60043,8 @@
 
 <ARG>
 <NAME>GstHanddetect::ROI-Y</NAME>
-<TYPE>guint</TYPE>
-<RANGE></RANGE>
+<TYPE>gint</TYPE>
+<RANGE>>= 0</RANGE>
 <FLAGS>rw</FLAGS>
 <NICK>ROI_Y</NICK>
 <BLURB>Y of left-top pointer in region of interest 
@@ -67063,6 +67093,56 @@
 </ARG>
 
 <ARG>
+<NAME>GstGLFilterShader::fragment</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Fragment Source</NICK>
+<BLURB>GLSL fragment source.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGLFilterShader::shader</NAME>
+<TYPE>GstGLShader*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Shader object</NICK>
+<BLURB>GstGLShader to use.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGLFilterShader::uniforms</NAME>
+<TYPE>GstStructure*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>GLSL Uniforms</NICK>
+<BLURB>GLSL Uniforms.</BLURB>
+<DEFAULT></DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGLFilterShader::update-shader</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>w</FLAGS>
+<NICK>Update Shader</NICK>
+<BLURB>Emit the 'create-shader' signal for the next frame.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstGLFilterShader::vertex</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Vertex Source</NICK>
+<BLURB>GLSL vertex source.</BLURB>
+<DEFAULT>NULL</DEFAULT>
+</ARG>
+
+<ARG>
 <NAME>GstGLOverlay::angle-png</NAME>
 <TYPE>gint</TYPE>
 <RANGE>[-90,90]</RANGE>
@@ -68940,3 +69020,53 @@
 <DEFAULT>128</DEFAULT>
 </ARG>
 
+<ARG>
+<NAME>GstTeletextDec::font-description</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Pango font description</NICK>
+<BLURB>Font description used for the pango output.</BLURB>
+<DEFAULT>"verdana 12"</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTeletextDec::page</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[100,999]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Page number</NICK>
+<BLURB>Number of page that should displayed.</BLURB>
+<DEFAULT>100</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTeletextDec::subpage</NAME>
+<TYPE>gint</TYPE>
+<RANGE>[G_MAXULONG,153]</RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Sub-page number</NICK>
+<BLURB>Number of sub-page that should displayed (-1 for all).</BLURB>
+<DEFAULT>-1</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTeletextDec::subtitles-mode</NAME>
+<TYPE>gboolean</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Enable subtitles mode</NICK>
+<BLURB>Enables subtitles mode for text output stripping the blank lines and the teletext state lines.</BLURB>
+<DEFAULT>FALSE</DEFAULT>
+</ARG>
+
+<ARG>
+<NAME>GstTeletextDec::subtitles-template</NAME>
+<TYPE>gchar*</TYPE>
+<RANGE></RANGE>
+<FLAGS>rw</FLAGS>
+<NICK>Subtitles output template</NICK>
+<BLURB>Output template used to print each one of the subtitles lines.</BLURB>
+<DEFAULT>"%s\\n"</DEFAULT>
+</ARG>
+
diff --git a/docs/plugins/gst-plugins-bad-plugins.hierarchy b/docs/plugins/gst-plugins-bad-plugins.hierarchy
index 6a0e8a5..d955186 100644
--- a/docs/plugins/gst-plugins-bad-plugins.hierarchy
+++ b/docs/plugins/gst-plugins-bad-plugins.hierarchy
@@ -3,7 +3,8 @@
     GstObject
       GstAllocator
         GstAllocatorSysmem
-        GstWlShmAllocator
+        GstFdAllocator
+          GstWlShmAllocator
       GstAudioRingBuffer
         GstAudioSinkRingBuffer
         GstAudioSrcRingBuffer
@@ -18,6 +19,8 @@
           GstAudioAggregator
             GstAudioInterleave
             GstAudioMixer
+              GstLiveAdder
+          GstMXFMux
           GstVideoAggregator
             GstCompositor
             GstGLBaseMixer
@@ -46,7 +49,7 @@
           GstSirenEnc
           GstVoAacEnc
           GstVoAmrWbEnc
-        GstAudioVisualizer-BadGstAudioVisualizers
+        GstAudioVisualizer-BaseExtLibvisual
           GstSpaceScope
           GstSpectraScope
           GstSynaeScope
@@ -211,10 +214,15 @@
               GstCvLaplace
               GstCvSmooth
               GstCvSobel
+              GstEdgeDetect
               GstFaceBlur
               GstFaceDetect
               GstHanddetect
+              GstMotioncells
+              GstOpencvTextOverlay
+              GstPyramidSegment
               GstSkinDetect
+              GstTemplateMatch
             GstRetinex
             GstRsvgOverlay
             GstSceneChange
@@ -265,7 +273,6 @@
         GstDtlsDec
         GstDtlsEnc
         GstDtlsSrtpDemux
-        GstEdgeDetect
         GstErrorIgnore
         GstFestival
         GstFieldAnalysis
@@ -281,20 +288,16 @@
         GstKateEnc
         GstKateParse
           GstKateTag
-        GstLiveAdder
         GstMXFDemux
         GstMidiParse
         GstMimDec
         GstMimEnc
         GstModPlug
-        GstMotioncells
         GstMpeg2enc
         GstMpegPSDemux
         GstMplex
-        GstOpencvTextOverlay
         GstPcapParse
         GstPitch
-        GstPyramidSegment
         GstRTPBaseDepayload
           GstRTPOpusDepay
           GstRtpH265Depay
@@ -317,7 +320,7 @@
         GstSrtpEnc
         GstTagMux
           GstId3Mux
-        GstTemplateMatch
+        GstTeletextDec
         GstUvcH264MjpgDemux
         GstVideoDecoder
           GstLibde265Dec
@@ -336,6 +339,7 @@
           GstSchroEnc
           GstWebpEnc
           GstX265Enc
+        GstVideoFrameAudioLevel
         GstWebvttEnc
         GstWildmidi
         GstY4mDec
@@ -345,11 +349,13 @@
           MpegTSParse2
         MpegTsMux
       GstGLContext
+      GstGLShader
       GstPad
         GstAggregatorPad
           GstAudioAggregatorPad
             GstAudioInterleavePad
             GstAudioMixerPad
+          GstMXFMuxPad
           GstVideoAggregatorPad
             GstCompositorPad
             GstGLBaseMixerPad
@@ -360,6 +366,7 @@
       GstPluginFeature
         GstDeviceProviderFactory
         GstElementFactory
+        GstTracerFactory
         GstTypeFindFactory
       GstRegistry
       GstTask
diff --git a/docs/plugins/gst-plugins-bad-plugins.interfaces b/docs/plugins/gst-plugins-bad-plugins.interfaces
index b67338c..6b16fd5 100644
--- a/docs/plugins/gst-plugins-bad-plugins.interfaces
+++ b/docs/plugins/gst-plugins-bad-plugins.interfaces
@@ -63,6 +63,7 @@
 GstJifMux GstTagSetter GstTagXmpWriter
 GstKateEnc GstTagSetter
 GstKateTag GstTagSetter
+GstLiveAdder GstChildProxy
 GstMMS GstURIHandler
 GstMpeg2enc GstPreset
 GstMssDemux GstChildProxy
diff --git a/docs/plugins/gst-plugins-bad-plugins.signals b/docs/plugins/gst-plugins-bad-plugins.signals
index 1040a7d..7fecee4 100644
--- a/docs/plugins/gst-plugins-bad-plugins.signals
+++ b/docs/plugins/gst-plugins-bad-plugins.signals
@@ -750,3 +750,10 @@
 GstDtlsDec *gstdtlsdec
 </SIGNAL>
 
+<SIGNAL>
+<NAME>GstGLFilterShader::create-shader</NAME>
+<RETURNS>GstGLShader*</RETURNS>
+<FLAGS>l</FLAGS>
+GstGLFilterShader *gstglfiltershader
+</SIGNAL>
+
diff --git a/docs/plugins/html/ch02.html b/docs/plugins/html/ch02.html
index 2467873..b08fdd5 100644
--- a/docs/plugins/html/ch02.html
+++ b/docs/plugins/html/ch02.html
@@ -93,9 +93,6 @@
 <span class="refentrytitle"><a href="gst-plugins-bad-plugins-plugin-jpegformat.html">jpegformat</a></span><span class="refpurpose"> — JPEG interchange format plugin</span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="gst-plugins-bad-plugins-plugin-liveadder.html">liveadder</a></span><span class="refpurpose"> — Adds multiple live discontinuous streams</span>
-</dt>
-<dt>
 <span class="refentrytitle"><a href="gst-plugins-bad-plugins-plugin-mimic.html">mimic</a></span><span class="refpurpose"> — Mimic codec</span>
 </dt>
 <dt>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-1.0.devhelp2 b/docs/plugins/html/gst-plugins-bad-plugins-1.0.devhelp2
index 869678c..1230f11 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-1.0.devhelp2
+++ b/docs/plugins/html/gst-plugins-bad-plugins-1.0.devhelp2
@@ -114,7 +114,6 @@
       <sub name="geometrictransform" link="gst-plugins-bad-plugins-plugin-geometrictransform.html"/>
       <sub name="gsm" link="gst-plugins-bad-plugins-plugin-gsm.html"/>
       <sub name="jpegformat" link="gst-plugins-bad-plugins-plugin-jpegformat.html"/>
-      <sub name="liveadder" link="gst-plugins-bad-plugins-plugin-liveadder.html"/>
       <sub name="mimic" link="gst-plugins-bad-plugins-plugin-mimic.html"/>
       <sub name="mms" link="gst-plugins-bad-plugins-plugin-mms.html"/>
       <sub name="modplug" link="gst-plugins-bad-plugins-plugin-modplug.html"/>
@@ -180,6 +179,8 @@
     <keyword type="struct" name="struct GstCvEqualizeHist" link="gst-plugins-bad-plugins-cvequalizehist.html#GstCvEqualizeHist-struct"/>
     <keyword type="struct" name="struct GstCvLaplace" link="gst-plugins-bad-plugins-cvlaplace.html#GstCvLaplace-struct"/>
     <keyword type="property" name="The “aperture-size” property" link="gst-plugins-bad-plugins-cvlaplace.html#GstCvLaplace--aperture-size"/>
+    <keyword type="property" name="The “scale” property" link="gst-plugins-bad-plugins-cvlaplace.html#GstCvLaplace--scale"/>
+    <keyword type="property" name="The “shift” property" link="gst-plugins-bad-plugins-cvlaplace.html#GstCvLaplace--shift"/>
     <keyword type="struct" name="struct GstCvSmooth" link="gst-plugins-bad-plugins-cvsmooth.html#GstCvSmooth-struct"/>
     <keyword type="property" name="The “param1” property" link="gst-plugins-bad-plugins-cvsmooth.html#GstCvSmooth--param1"/>
     <keyword type="property" name="The “param2” property" link="gst-plugins-bad-plugins-cvsmooth.html#GstCvSmooth--param2"/>
@@ -304,8 +305,6 @@
     <keyword type="property" name="The “angle” property" link="gst-plugins-bad-plugins-kaleidoscope.html#GstKaleidoscope--angle"/>
     <keyword type="property" name="The “angle2” property" link="gst-plugins-bad-plugins-kaleidoscope.html#GstKaleidoscope--angle2"/>
     <keyword type="property" name="The “sides” property" link="gst-plugins-bad-plugins-kaleidoscope.html#GstKaleidoscope--sides"/>
-    <keyword type="struct" name="struct GstLiveAdder" link="gst-plugins-bad-plugins-liveadder.html#GstLiveAdder-struct"/>
-    <keyword type="property" name="The “latency” property" link="gst-plugins-bad-plugins-liveadder.html#GstLiveAdder--latency"/>
     <keyword type="struct" name="struct GstMarble" link="gst-plugins-bad-plugins-marble.html#GstMarble-struct"/>
     <keyword type="property" name="The “amount” property" link="gst-plugins-bad-plugins-marble.html#GstMarble--amount"/>
     <keyword type="property" name="The “turbulence” property" link="gst-plugins-bad-plugins-marble.html#GstMarble--turbulence"/>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-aiffparse.html b/docs/plugins/html/gst-plugins-bad-plugins-aiffparse.html
index 258193b..75d2e66 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-aiffparse.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-aiffparse.html
@@ -68,7 +68,7 @@
 <p>
 </p>
 <pre class="programlisting">
-gst-launch filesrc location=sine.aiff ! aiffparse ! audioconvert ! alsasink
+gst-launch-1.0 filesrc location=sine.aiff ! aiffparse ! audioconvert ! alsasink
 </pre>
 <p>
 Read a aiff file and output to the soundcard using the ALSA element. The
@@ -77,7 +77,7 @@
 <p>
 </p>
 <pre class="programlisting">
-gst-launch souphhtpsrc location=http://www.example.org/sine.aiff ! queue ! aiffparse ! audioconvert ! alsasink
+gst-launch-1.0 souphttpsrc location=http://www.example.org/sine.aiff ! queue ! aiffparse ! audioconvert ! alsasink
 </pre>
 <p>
 Stream data from a network url.
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-audiomixer.html b/docs/plugins/html/gst-plugins-bad-plugins-audiomixer.html
index 72f580f..8bdb3bd 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-audiomixer.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-audiomixer.html
@@ -94,6 +94,7 @@
                 <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad-libs/html/gst-plugins-bad-libs-GstAggregator.html#GstAggregator">GstAggregator</a>
                     <span class="lineart">╰──</span> GstAudioAggregator
                         <span class="lineart">╰──</span> GstAudioMixer
+                            <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad/html/gst-plugins-bad-plugins-liveadder.html#GstLiveAdder">GstLiveAdder</a>
 </pre>
 </div>
 <div class="refsect1">
@@ -124,7 +125,7 @@
     <tbody>
       <tr>
         <td class="listing_lines" align="right"><pre>1</pre></td>
-        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch audiotestsrc freq<span class="gtkdoc opt">=</span><span class="number">100</span> <span class="gtkdoc opt">!</span> audiomixer name<span class="gtkdoc opt">=</span>mix <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> alsasink audiotestsrc freq<span class="gtkdoc opt">=</span><span class="number">500</span> <span class="gtkdoc opt">!</span> mix<span class="gtkdoc opt">.</span></pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> audiotestsrc freq<span class="gtkdoc opt">=</span><span class="number">100</span> <span class="gtkdoc opt">!</span> audiomixer name<span class="gtkdoc opt">=</span>mix <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> alsasink audiotestsrc freq<span class="gtkdoc opt">=</span><span class="number">500</span> <span class="gtkdoc opt">!</span> mix<span class="gtkdoc opt">.</span></pre></td>
       </tr>
     </tbody>
   </table>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-bulge.html b/docs/plugins/html/gst-plugins-bad-plugins-bulge.html
index 0644338..44426f5 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-bulge.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-bulge.html
@@ -76,10 +76,26 @@
 </div>
 <div class="refsect1">
 <a name="gst-plugins-bad-plugins-bulge.description"></a><h2>Description</h2>
+<p>Bugle is a geometric image transform element. It adds a protuberance in the
+center point.</p>
+<div class="refsect2">
+<a name="id-1.2.9.7.3"></a><h3>Example launch line</h3>
+<div class="informalexample">
+  <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+    <tbody>
+      <tr>
+        <td class="listing_lines" align="right"><pre>1</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> bulge <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+      </tr>
+    </tbody>
+  </table>
+</div>
+
+</div>
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.9.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.9.7.4.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -105,7 +121,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.9.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.9.7.4.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -179,6 +195,10 @@
 <p>Default value: 3</p>
 </div>
 </div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-bulge.see-also"></a><h2>See Also</h2>
+<p>geometrictransform</p>
+</div>
 </div>
 <div class="footer">
 <hr>Generated by GTK-Doc V1.24</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-burn.html b/docs/plugins/html/gst-plugins-bad-plugins-burn.html
index f3f5d62..84bb863 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-burn.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-burn.html
@@ -89,7 +89,7 @@
     <tbody>
       <tr>
         <td class="listing_lines" align="right"><pre>1</pre></td>
-        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> burn <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> burn <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
       </tr>
     </tbody>
   </table>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-chromium.html b/docs/plugins/html/gst-plugins-bad-plugins-chromium.html
index 4012bd5..ee7a5bf 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-chromium.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-chromium.html
@@ -81,7 +81,7 @@
     <tbody>
       <tr>
         <td class="listing_lines" align="right"><pre>1</pre></td>
-        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> chromium <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> chromium <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
       </tr>
     </tbody>
   </table>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-circle.html b/docs/plugins/html/gst-plugins-bad-plugins-circle.html
index 5eb1249..3a1481d 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-circle.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-circle.html
@@ -88,10 +88,26 @@
 </div>
 <div class="refsect1">
 <a name="gst-plugins-bad-plugins-circle.description"></a><h2>Description</h2>
+<p>Circle is a geometric image transform element. It warps the picture into an
+arc shaped form.</p>
+<div class="refsect2">
+<a name="id-1.2.13.7.3"></a><h3>Example launch line</h3>
+<div class="informalexample">
+  <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+    <tbody>
+      <tr>
+        <td class="listing_lines" align="right"><pre>1</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> circle <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+      </tr>
+    </tbody>
+  </table>
+</div>
+
+</div>
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.13.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.13.7.4.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -117,7 +133,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.13.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.13.7.4.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -207,6 +223,10 @@
 <p>Default value: 3.14159</p>
 </div>
 </div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-circle.see-also"></a><h2>See Also</h2>
+<p>geometrictransform</p>
+</div>
 </div>
 <div class="footer">
 <hr>Generated by GTK-Doc V1.24</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-coloreffects.html b/docs/plugins/html/gst-plugins-bad-plugins-coloreffects.html
index 95808c4..1df54d4 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-coloreffects.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-coloreffects.html
@@ -83,7 +83,7 @@
       <tr>
         <td class="listing_lines" align="right"><pre>1
 2</pre></td>
-        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> coloreffects preset<span class="gtkdoc opt">=</span>heat <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> coloreffects preset<span class="gtkdoc opt">=</span>heat <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span>
     autovideosink</pre></td>
       </tr>
     </tbody>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-cvlaplace.html b/docs/plugins/html/gst-plugins-bad-plugins-cvlaplace.html
index 1861d07..126c31d 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-cvlaplace.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-cvlaplace.html
@@ -41,11 +41,23 @@
 <col width="300px" class="properties_name">
 <col width="200px" class="properties_flags">
 </colgroup>
-<tbody><tr>
+<tbody>
+<tr>
 <td class="property_type"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a></td>
 <td class="property_name"><a class="link" href="gst-plugins-bad-plugins-cvlaplace.html#GstCvLaplace--aperture-size" title="The “aperture-size” property">aperture-size</a></td>
 <td class="property_flags">Read / Write</td>
-</tr></tbody>
+</tr>
+<tr>
+<td class="property_type"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-cvlaplace.html#GstCvLaplace--scale" title="The “scale” property">scale</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+<tr>
+<td class="property_type"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></td>
+<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-cvlaplace.html#GstCvLaplace--shift" title="The “shift” property">shift</a></td>
+<td class="property_flags">Read / Write</td>
+</tr>
+</tbody>
 </table></div>
 </div>
 <a name="GstCvLaplace"></a><div class="refsect1">
@@ -177,6 +189,24 @@
 <p>Allowed values: [1,7]</p>
 <p>Default value: 3</p>
 </div>
+<hr>
+<div class="refsect2">
+<a name="GstCvLaplace--scale"></a><h3>The <code class="literal">“scale”</code> property</h3>
+<pre class="programlisting">  “scale”                    <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>Scale factor.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 1</p>
+</div>
+<hr>
+<div class="refsect2">
+<a name="GstCvLaplace--shift"></a><h3>The <code class="literal">“shift”</code> property</h3>
+<pre class="programlisting">  “shift”                    <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
+<p>Value added to the scaled source array elements.</p>
+<p>Flags: Read / Write</p>
+<p>Allowed values: &gt;= 0</p>
+<p>Default value: 0</p>
+</div>
 </div>
 </div>
 <div class="footer">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-cvsmooth.html b/docs/plugins/html/gst-plugins-bad-plugins-cvsmooth.html
index 883abaa..51a684c 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-cvsmooth.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-cvsmooth.html
@@ -274,7 +274,7 @@
 <div class="refsect2">
 <a name="GstCvSmooth--color"></a><h3>The <code class="literal">“color”</code> property</h3>
 <pre class="programlisting">  “color”                    <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
-<p>If type is gaussian, this means the standard deviation.If type is bilateral, this means the color-sigma. If zero, Default values are used.Check cvSmooth OpenCV docs: http://opencv.willowgarage.com/documentation/image_filtering.html#cvSmooth.</p>
+<p>If type is gaussian, this means the standard deviation.If type is bilateral, this means the color-sigma. If zero, Default values are used.</p>
 <p>Flags: Read / Write</p>
 <p>Allowed values: &gt;= 0</p>
 <p>Default value: 0</p>
@@ -283,16 +283,16 @@
 <div class="refsect2">
 <a name="GstCvSmooth--height"></a><h3>The <code class="literal">“height”</code> property</h3>
 <pre class="programlisting">  “height”                   <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
-<p>The aperture height, if zero, the width is used.(Must be positive and odd or zero, unuset in median and bilateral types). Check cvSmooth OpenCV docs: http://opencv.willowgarage.com/documentation/image_filtering.html#cvSmooth.</p>
+<p>The gaussian kernel height (must be positive and odd).</p>
 <p>Flags: Read / Write</p>
 <p>Allowed values: &gt;= 0</p>
-<p>Default value: 0</p>
+<p>Default value: 3</p>
 </div>
 <hr>
 <div class="refsect2">
 <a name="GstCvSmooth--spatial"></a><h3>The <code class="literal">“spatial”</code> property</h3>
 <pre class="programlisting">  “spatial”                  <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gdouble"><span class="type">gdouble</span></a></pre>
-<p>Only used in bilateral type, means the spatial-sigma.Check cvSmooth OpenCV docs: http://opencv.willowgarage.com/documentation/image_filtering.html#cvSmooth.</p>
+<p>Only used in bilateral type, means the spatial-sigma.</p>
 <p>Flags: Read / Write</p>
 <p>Allowed values: &gt;= 0</p>
 <p>Default value: 0</p>
@@ -301,7 +301,7 @@
 <div class="refsect2">
 <a name="GstCvSmooth--width"></a><h3>The <code class="literal">“width”</code> property</h3>
 <pre class="programlisting">  “width”                    <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#gint"><span class="type">gint</span></a></pre>
-<p>The aperture width (Must be positive and odd).Check cvSmooth OpenCV docs: http://opencv.willowgarage.com/documentation/image_filtering.html#cvSmooth.</p>
+<p>The gaussian kernel width (must be positive and odd).If type is median, this means the aperture linear size.Check OpenCV docs: http://docs.opencv.org/2.4/modules/imgproc/doc/filtering.htm.</p>
 <p>Flags: Read / Write</p>
 <p>Allowed values: &gt;= 1</p>
 <p>Default value: 3</p>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-dataurisrc.html b/docs/plugins/html/gst-plugins-bad-plugins-dataurisrc.html
index fd5d278..02dbe96 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-dataurisrc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-dataurisrc.html
@@ -89,7 +89,7 @@
     <tbody>
       <tr>
         <td class="listing_lines" align="right"><pre>1</pre></td>
-        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">0.10</span> <span class="gtkdoc opt">-</span>v dataurisrc uri<span class="gtkdoc opt">=</span><span class="string">&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAfElEQVQ4je2MwQnAIAxFgziA4EnczIsO4MEROo/gzZWc4xdTbe1R6LGRR74heYS7iKElzfcMiRnt4hf8gk8EayB6luefue/HzlJfCA50XsNjYRxprZmenXNIKSGEsC+QUqK1hhgj521BzhnWWiilUGvdF5RS4L2HMQZCCJy8sHMm2TYdJAAAAABJRU5ErkJggg==&quot;</span> <span class="gtkdoc opt">!</span> pngdec <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> freeze <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v dataurisrc uri<span class="gtkdoc opt">=</span><span class="string">&quot;data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAfElEQVQ4je2MwQnAIAxFgziA4EnczIsO4MEROo/gzZWc4xdTbe1R6LGRR74heYS7iKElzfcMiRnt4hf8gk8EayB6luefue/HzlJfCA50XsNjYRxprZmenXNIKSGEsC+QUqK1hhgj521BzhnWWiilUGvdF5RS4L2HMQZCCJy8sHMm2TYdJAAAAABJRU5ErkJggg==&quot;</span> <span class="gtkdoc opt">!</span> pngdec <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> imagefreeze <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
       </tr>
     </tbody>
   </table>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-diffuse.html b/docs/plugins/html/gst-plugins-bad-plugins-diffuse.html
index 5b75384..96b3615 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-diffuse.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-diffuse.html
@@ -75,10 +75,26 @@
 </div>
 <div class="refsect1">
 <a name="gst-plugins-bad-plugins-diffuse.description"></a><h2>Description</h2>
+<p>Diffuse is a geometric image transform element. It diffuses the image by
+moving its pixels in random directions.</p>
+<div class="refsect2">
+<a name="id-1.2.23.7.3"></a><h3>Example launch line</h3>
+<div class="informalexample">
+  <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+    <tbody>
+      <tr>
+        <td class="listing_lines" align="right"><pre>1</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> diffuse <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+      </tr>
+    </tbody>
+  </table>
+</div>
+
+</div>
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.23.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.23.7.4.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -104,7 +120,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.23.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.23.7.4.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -178,6 +194,10 @@
 <p>Default value: 4</p>
 </div>
 </div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-diffuse.see-also"></a><h2>See Also</h2>
+<p>geometrictransform</p>
+</div>
 </div>
 <div class="footer">
 <hr>Generated by GTK-Doc V1.24</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-dilate.html b/docs/plugins/html/gst-plugins-bad-plugins-dilate.html
index 43021aa..56409f3 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-dilate.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-dilate.html
@@ -89,7 +89,7 @@
     <tbody>
       <tr>
         <td class="listing_lines" align="right"><pre>1</pre></td>
-        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> dilate <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> dilate <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
       </tr>
     </tbody>
   </table>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-dodge.html b/docs/plugins/html/gst-plugins-bad-plugins-dodge.html
index 1a1a4c5..2d1da01 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-dodge.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-dodge.html
@@ -82,7 +82,7 @@
     <tbody>
       <tr>
         <td class="listing_lines" align="right"><pre>1</pre></td>
-        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> dodge <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> dodge <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
       </tr>
     </tbody>
   </table>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-dvdspu.html b/docs/plugins/html/gst-plugins-bad-plugins-dvdspu.html
index daf56ba..b61e146 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-dvdspu.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-dvdspu.html
@@ -64,7 +64,7 @@
     <tbody>
       <tr>
         <td class="listing_lines" align="right"><pre>1</pre></td>
-        <td class="listing_code"><pre class="programlisting">FIXME<span class="gtkdoc opt">:</span> gst<span class="gtkdoc opt">-</span>launch <span class="gtkdoc opt">...</span></pre></td>
+        <td class="listing_code"><pre class="programlisting">FIXME<span class="gtkdoc opt">:</span> gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">...</span></pre></td>
       </tr>
     </tbody>
   </table>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-exclusion.html b/docs/plugins/html/gst-plugins-bad-plugins-exclusion.html
index 9b228bb..ebb51eb 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-exclusion.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-exclusion.html
@@ -89,7 +89,7 @@
     <tbody>
       <tr>
         <td class="listing_lines" align="right"><pre>1</pre></td>
-        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> exclusion <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> exclusion <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
       </tr>
     </tbody>
   </table>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-faac.html b/docs/plugins/html/gst-plugins-bad-plugins-faac.html
index 4f43029..ea9bccc 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-faac.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-faac.html
@@ -156,7 +156,27 @@
 </tr>
 <tr>
 <td><p><span class="term">details</span></p></td>
-<td>audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 }, channels=(int)[ 1, 6 ]</td>
+<td>audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 }, channels=(int)1</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 }, channels=(int)2, channel-mask=(bitmask)0x0000000000000003</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 }, channels=(int)3, channel-mask=(bitmask)0x0000000000000007</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 }, channels=(int)4, channel-mask=(bitmask)0x0000000000000107</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 }, channels=(int)5, channel-mask=(bitmask)0x0000000000000037</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 }, channels=(int)6, channel-mask=(bitmask)0x000000000000003f</td>
 </tr>
 </tbody>
 </table></div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-festival.html b/docs/plugins/html/gst-plugins-bad-plugins-festival.html
index 4ce0857..062af12 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-festival.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-festival.html
@@ -67,7 +67,7 @@
     <tbody>
       <tr>
         <td class="listing_lines" align="right"><pre>1</pre></td>
-        <td class="listing_code"><pre class="programlisting">echo <span class="string">'Hello G-Streamer!'</span> <span class="gtkdoc opt">|</span> gst<span class="gtkdoc opt">-</span>launch fdsrc fd<span class="gtkdoc opt">=</span><span class="number">0</span> <span class="gtkdoc opt">!</span> festival <span class="gtkdoc opt">!</span> wavparse <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> alsasink</pre></td>
+        <td class="listing_code"><pre class="programlisting">echo <span class="string">'Hello G-Streamer!'</span> <span class="gtkdoc opt">|</span> gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> fdsrc fd<span class="gtkdoc opt">=</span><span class="number">0</span> <span class="gtkdoc opt">!</span> festival <span class="gtkdoc opt">!</span> wavparse <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> alsasink</pre></td>
       </tr>
     </tbody>
   </table>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-fisheye.html b/docs/plugins/html/gst-plugins-bad-plugins-fisheye.html
index 41015ff..fcd664a 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-fisheye.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-fisheye.html
@@ -59,10 +59,26 @@
 </div>
 <div class="refsect1">
 <a name="gst-plugins-bad-plugins-fisheye.description"></a><h2>Description</h2>
+<p>Fisheye is a geometric image transform element. It simulates a fisheye lens
+by zooming on the center of the image and compressing the edges.</p>
+<div class="refsect2">
+<a name="id-1.2.37.6.3"></a><h3>Example launch line</h3>
+<div class="informalexample">
+  <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+    <tbody>
+      <tr>
+        <td class="listing_lines" align="right"><pre>1</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> fisheye <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+      </tr>
+    </tbody>
+  </table>
+</div>
+
+</div>
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.37.6.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.37.6.4.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -88,7 +104,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.37.6.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.37.6.4.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -151,6 +167,10 @@
 <pre class="programlisting">struct GstFisheye;</pre>
 </div>
 </div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-fisheye.see-also"></a><h2>See Also</h2>
+<p>geometrictransform</p>
+</div>
 </div>
 <div class="footer">
 <hr>Generated by GTK-Doc V1.24</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-fpsdisplaysink.html b/docs/plugins/html/gst-plugins-bad-plugins-fpsdisplaysink.html
index 1bb739d..6e7c808 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-fpsdisplaysink.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-fpsdisplaysink.html
@@ -161,10 +161,10 @@
 2
 3
 4</pre></td>
-        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch videotestsrc <span class="gtkdoc opt">!</span> fpsdisplaysink
-gst<span class="gtkdoc opt">-</span>launch videotestsrc <span class="gtkdoc opt">!</span> fpsdisplaysink text<span class="gtkdoc opt">-</span>overlay<span class="gtkdoc opt">=</span><span class="keyword">false</span>
-gst<span class="gtkdoc opt">-</span>launch filesrc location<span class="gtkdoc opt">=</span>video<span class="gtkdoc opt">.</span>avi <span class="gtkdoc opt">!</span> decodebin name<span class="gtkdoc opt">=</span>d <span class="gtkdoc opt">!</span> queue <span class="gtkdoc opt">!</span> fpsdisplaysink d<span class="gtkdoc opt">. !</span> queue <span class="gtkdoc opt">!</span> fakesink sync<span class="gtkdoc opt">=</span><span class="keyword">true</span>
-gst<span class="gtkdoc opt">-</span>launch playbin uri<span class="gtkdoc opt">=</span>file<span class="gtkdoc opt">:</span><span class="gtkdoc slc">///path/to/video.avi video-sink=&quot;fpsdisplaysink&quot; audio-sink=fakesink</span></pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> videotestsrc <span class="gtkdoc opt">!</span> fpsdisplaysink
+gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> videotestsrc <span class="gtkdoc opt">!</span> fpsdisplaysink text<span class="gtkdoc opt">-</span>overlay<span class="gtkdoc opt">=</span><span class="keyword">false</span>
+gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> filesrc location<span class="gtkdoc opt">=</span>video<span class="gtkdoc opt">.</span>avi <span class="gtkdoc opt">!</span> decodebin name<span class="gtkdoc opt">=</span>d <span class="gtkdoc opt">!</span> queue <span class="gtkdoc opt">!</span> fpsdisplaysink d<span class="gtkdoc opt">. !</span> queue <span class="gtkdoc opt">!</span> fakesink sync<span class="gtkdoc opt">=</span><span class="keyword">true</span>
+gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> playbin uri<span class="gtkdoc opt">=</span>file<span class="gtkdoc opt">:</span><span class="gtkdoc slc">///path/to/video.avi video-sink=&quot;fpsdisplaysink&quot; audio-sink=fakesink</span></pre></td>
       </tr>
     </tbody>
   </table>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-gaussianblur.html b/docs/plugins/html/gst-plugins-bad-plugins-gaussianblur.html
index db5814c..66853ce 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-gaussianblur.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-gaussianblur.html
@@ -41,7 +41,7 @@
     <tbody>
       <tr>
         <td class="listing_lines" align="right"><pre>1</pre></td>
-        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> gaussianblur <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> gaussianblur <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
       </tr>
     </tbody>
   </table>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-jpegparse.html b/docs/plugins/html/gst-plugins-bad-plugins-jpegparse.html
index 7eefe8e..20cc166 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-jpegparse.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-jpegparse.html
@@ -121,7 +121,7 @@
     <tbody>
       <tr>
         <td class="listing_lines" align="right"><pre>1</pre></td>
-        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch <span class="gtkdoc opt">-</span>v souphttpsrc location<span class="gtkdoc opt">=... !</span> jpegparse <span class="gtkdoc opt">!</span> matroskamux <span class="gtkdoc opt">!</span> filesink location<span class="gtkdoc opt">=...</span></pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v souphttpsrc location<span class="gtkdoc opt">=... !</span> jpegparse <span class="gtkdoc opt">!</span> matroskamux <span class="gtkdoc opt">!</span> filesink location<span class="gtkdoc opt">=...</span></pre></td>
       </tr>
     </tbody>
   </table>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-kaleidoscope.html b/docs/plugins/html/gst-plugins-bad-plugins-kaleidoscope.html
index 2f3812e..98b9a28 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-kaleidoscope.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-kaleidoscope.html
@@ -88,10 +88,26 @@
 </div>
 <div class="refsect1">
 <a name="gst-plugins-bad-plugins-kaleidoscope.description"></a><h2>Description</h2>
+<p>The kaleidscope element applies 'kaleidoscope' geometric transform to the
+image.</p>
+<div class="refsect2">
+<a name="id-1.2.41.7.3"></a><h3>Example launch line</h3>
+<div class="informalexample">
+  <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+    <tbody>
+      <tr>
+        <td class="listing_lines" align="right"><pre>1</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> kaleidoscope <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+      </tr>
+    </tbody>
+  </table>
+</div>
+
+</div>
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.41.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.41.7.4.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -117,7 +133,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.41.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.41.7.4.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -207,6 +223,10 @@
 <p>Default value: 3</p>
 </div>
 </div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-kaleidoscope.see-also"></a><h2>See Also</h2>
+<p>geometrictransform</p>
+</div>
 </div>
 <div class="footer">
 <hr>Generated by GTK-Doc V1.24</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-liveadder.html b/docs/plugins/html/gst-plugins-bad-plugins-liveadder.html
index ffba3c2..f51fe92 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-liveadder.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-liveadder.html
@@ -15,9 +15,7 @@
 <table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
 <td width="100%" align="left" class="shortcuts">
 <a href="#" class="shortcut">Top</a><span id="nav_description">  <span class="dim">|</span> 
-                  <a href="#gst-plugins-bad-plugins-liveadder.description" class="shortcut">Description</a></span><span id="nav_hierarchy">  <span class="dim">|</span> 
-                  <a href="#gst-plugins-bad-plugins-liveadder.object-hierarchy" class="shortcut">Object Hierarchy</a></span><span id="nav_properties">  <span class="dim">|</span> 
-                  <a href="#gst-plugins-bad-plugins-liveadder.properties" class="shortcut">Properties</a></span>
+                  <a href="#gst-plugins-bad-plugins-liveadder.description" class="shortcut">Description</a></span>
 </td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="ch01.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
@@ -34,52 +32,11 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="gst-plugins-bad-plugins-liveadder.properties"></a><h2>Properties</h2>
-<div class="informaltable"><table border="0">
-<colgroup>
-<col width="150px" class="properties_type">
-<col width="300px" class="properties_name">
-<col width="200px" class="properties_flags">
-</colgroup>
-<tbody><tr>
-<td class="property_type"><a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a></td>
-<td class="property_name"><a class="link" href="gst-plugins-bad-plugins-liveadder.html#GstLiveAdder--latency" title="The “latency” property">latency</a></td>
-<td class="property_flags">Read / Write</td>
-</tr></tbody>
-</table></div>
-</div>
-<a name="GstLiveAdder"></a><div class="refsect1">
-<a name="gst-plugins-bad-plugins-liveadder.other"></a><h2>Types and Values</h2>
-<div class="informaltable"><table width="100%" border="0">
-<colgroup>
-<col width="150px" class="name">
-<col class="description">
-</colgroup>
-<tbody><tr>
-<td class="datatype_keyword">struct</td>
-<td class="function_name"><a class="link" href="gst-plugins-bad-plugins-liveadder.html#GstLiveAdder-struct" title="struct GstLiveAdder">GstLiveAdder</a></td>
-</tr></tbody>
-</table></div>
-</div>
-<div class="refsect1">
-<a name="gst-plugins-bad-plugins-liveadder.object-hierarchy"></a><h2>Object Hierarchy</h2>
-<pre class="screen">    <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GObject">GObject</a>
-    <span class="lineart">╰──</span> <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
-        <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
-            <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
-                <span class="lineart">╰──</span> GstLiveAdder
-</pre>
-</div>
-<div class="refsect1">
 <a name="gst-plugins-bad-plugins-liveadder.description"></a><h2>Description</h2>
-<p>The live adder allows to mix several streams into one by adding the data.
-Mixed data is clamped to the min/max values of the data format.</p>
-<p>Unlike the adder, the liveadder mixes the streams according the their
-timestamps and waits for some milli-seconds before trying doing the mixing.</p>
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.42.7.4.1"></a><h3>Element Information</h3>
+<a name="id-1.2.42.3.2.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -89,12 +46,12 @@
 <tr>
 <td><p><span class="term">plugin</span></p></td>
 <td>
-            <a class="link" href="gst-plugins-bad-plugins-plugin-liveadder.html#plugin-liveadder">liveadder</a>
+            <a class="link" href="gst-plugins-bad-plugins-plugin-audiomixer.html#plugin-audiomixer">audiomixer</a>
           </td>
 </tr>
 <tr>
 <td><p><span class="term">author</span></p></td>
-<td>Olivier Crete &lt;olivier.crete@collabora.co.uk&gt;</td>
+<td>Sebastian Dröge &lt;sebastian@centricular.com&gt;</td>
 </tr>
 <tr>
 <td><p><span class="term">class</span></p></td>
@@ -105,7 +62,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.42.7.4.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.42.3.2.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -126,7 +83,7 @@
 </tr>
 <tr>
 <td><p><span class="term">details</span></p></td>
-<td>audio/x-raw, format=(string){ S8, U8, S16LE, U16LE, S32LE, U32LE, F32LE, F64LE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</td>
+<td>audio/x-raw, format=(string){ S32LE, U32LE, S16LE, U16LE, S8, U8, F32LE, F64LE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string){ interleaved, non-interleaved }</td>
 </tr>
 </tbody>
 </table></div>
@@ -150,7 +107,7 @@
 </tr>
 <tr>
 <td><p><span class="term">details</span></p></td>
-<td>audio/x-raw, format=(string){ S8, U8, S16LE, U16LE, S32LE, U32LE, F32LE, F64LE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</td>
+<td>audio/x-raw, format=(string){ S32LE, U32LE, S16LE, U16LE, S8, U8, F32LE, F64LE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string){ interleaved, non-interleaved }</td>
 </tr>
 </tbody>
 </table></div>
@@ -163,25 +120,6 @@
 </div>
 <div class="refsect1">
 <a name="gst-plugins-bad-plugins-liveadder.other_details"></a><h2>Types and Values</h2>
-<div class="refsect2">
-<a name="GstLiveAdder-struct"></a><h3>struct GstLiveAdder</h3>
-<pre class="programlisting">struct GstLiveAdder;</pre>
-<p>The adder object structure.</p>
-</div>
-</div>
-<div class="refsect1">
-<a name="gst-plugins-bad-plugins-liveadder.property-details"></a><h2>Property Details</h2>
-<div class="refsect2">
-<a name="GstLiveAdder--latency"></a><h3>The <code class="literal">“latency”</code> property</h3>
-<pre class="programlisting">  “latency”                  <a href="https://developer.gnome.org/glib/unstable/glib-Basic-Types.html#guint"><span class="type">guint</span></a></pre>
-<p>Amount of data to buffer (in milliseconds).</p>
-<p>Flags: Read / Write</p>
-<p>Default value: 60</p>
-</div>
-</div>
-<div class="refsect1">
-<a name="gst-plugins-bad-plugins-liveadder.see-also"></a><h2>See Also</h2>
-<p>adder</p>
 </div>
 </div>
 <div class="footer">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-marble.html b/docs/plugins/html/gst-plugins-bad-plugins-marble.html
index 63dc5f6..c177cc9 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-marble.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-marble.html
@@ -92,10 +92,26 @@
 </div>
 <div class="refsect1">
 <a name="gst-plugins-bad-plugins-marble.description"></a><h2>Description</h2>
+<p>Marble is a geometric image transform element. It applies a marbling effect
+to the image.</p>
+<div class="refsect2">
+<a name="id-1.2.43.7.3"></a><h3>Example launch line</h3>
+<div class="informalexample">
+  <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+    <tbody>
+      <tr>
+        <td class="listing_lines" align="right"><pre>1</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> marble <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+      </tr>
+    </tbody>
+  </table>
+</div>
+
+</div>
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.43.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.43.7.4.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -121,7 +137,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.43.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.43.7.4.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -222,6 +238,10 @@
 <p>Default value: 4</p>
 </div>
 </div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-marble.see-also"></a><h2>See Also</h2>
+<p>geometrictransform</p>
+</div>
 </div>
 <div class="footer">
 <hr>Generated by GTK-Doc V1.24</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-mirror.html b/docs/plugins/html/gst-plugins-bad-plugins-mirror.html
index e290bc0..e18dfaf 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-mirror.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-mirror.html
@@ -75,10 +75,26 @@
 </div>
 <div class="refsect1">
 <a name="gst-plugins-bad-plugins-mirror.description"></a><h2>Description</h2>
+<p>Mirror is a geometric transform element. It splits the image into two halves
+and reflects one over each other.</p>
+<div class="refsect2">
+<a name="id-1.2.46.7.3"></a><h3>Example launch line</h3>
+<div class="informalexample">
+  <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+    <tbody>
+      <tr>
+        <td class="listing_lines" align="right"><pre>1</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> mirror <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+      </tr>
+    </tbody>
+  </table>
+</div>
+
+</div>
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.46.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.46.7.4.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -104,7 +120,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.46.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.46.7.4.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -177,6 +193,10 @@
 <p>Default value: Split horizontally and reflect left into right</p>
 </div>
 </div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-mirror.see-also"></a><h2>See Also</h2>
+<p>geometrictransform</p>
+</div>
 </div>
 <div class="footer">
 <hr>Generated by GTK-Doc V1.24</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-mpegtsmux.html b/docs/plugins/html/gst-plugins-bad-plugins-mpegtsmux.html
index 3baf61a..f95dee2 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-mpegtsmux.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-mpegtsmux.html
@@ -173,6 +173,10 @@
 </tr>
 <tr>
 <td><p><span class="term"></span></p></td>
+<td> audio/x-opus, channels=(int)[ 1, 8 ], channel-mapping-family=(int){ 0, 1 }</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
 <td> subpicture/x-dvb</td>
 </tr>
 <tr>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-opencvtextoverlay.html b/docs/plugins/html/gst-plugins-bad-plugins-opencvtextoverlay.html
index c412bcd..80147c1 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-opencvtextoverlay.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-opencvtextoverlay.html
@@ -110,7 +110,10 @@
     <span class="lineart">╰──</span> <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
         <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
             <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
-                <span class="lineart">╰──</span> GstOpencvTextOverlay
+                <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseTransform.html">GstBaseTransform</a>
+                    <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideofilter.html#GstVideoFilter">GstVideoFilter</a>
+                        <span class="lineart">╰──</span> GstOpencvVideoFilter
+                            <span class="lineart">╰──</span> GstOpencvTextOverlay
 </pre>
 </div>
 <div class="refsect1">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-opusdec.html b/docs/plugins/html/gst-plugins-bad-plugins-opusdec.html
index 4f1427c..f6717a8 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-opusdec.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-opusdec.html
@@ -130,7 +130,11 @@
 </tr>
 <tr>
 <td><p><span class="term">details</span></p></td>
-<td>audio/x-opus</td>
+<td>audio/x-opus, channel-mapping-family=(int)0</td>
+</tr>
+<tr>
+<td><p><span class="term"></span></p></td>
+<td> audio/x-opus, channel-mapping-family=(int)[ 1, 255 ], channels=(int)[ 1, 255 ], stream-count=(int)[ 1, 255 ], coupled-count=(int)[ 0, 255 ]</td>
 </tr>
 </tbody>
 </table></div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-opusenc.html b/docs/plugins/html/gst-plugins-bad-plugins-opusenc.html
index 5804d1c..7e8fd44 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-opusenc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-opusenc.html
@@ -185,11 +185,11 @@
 </tr>
 <tr>
 <td><p><span class="term">details</span></p></td>
-<td>audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int)48000, channels=(int)[ 1, 2 ]</td>
+<td>audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int)48000, channels=(int)[ 1, 8 ]</td>
 </tr>
 <tr>
 <td><p><span class="term"></span></p></td>
-<td> audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 8000, 12000, 16000, 24000 }, channels=(int)[ 1, 2 ]</td>
+<td> audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 8000, 12000, 16000, 24000 }, channels=(int)[ 1, 8 ]</td>
 </tr>
 </tbody>
 </table></div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-pcapparse.html b/docs/plugins/html/gst-plugins-bad-plugins-pcapparse.html
index 9013560..b4fea18 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-pcapparse.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-pcapparse.html
@@ -114,7 +114,7 @@
       <tr>
         <td class="listing_lines" align="right"><pre>1
 2</pre></td>
-        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">0.10</span> filesrc location<span class="gtkdoc opt">=</span>h264crasher<span class="gtkdoc opt">.</span>pcap <span class="gtkdoc opt">!</span> pcapparse <span class="gtkdoc opt">!</span> rtph264depay
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> filesrc location<span class="gtkdoc opt">=</span>h264crasher<span class="gtkdoc opt">.</span>pcap <span class="gtkdoc opt">!</span> pcapparse <span class="gtkdoc opt">!</span> rtph264depay
 <span class="gtkdoc opt">!</span> ffdec_h264 <span class="gtkdoc opt">!</span> fakesink</pre></td>
       </tr>
     </tbody>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-pinch.html b/docs/plugins/html/gst-plugins-bad-plugins-pinch.html
index 1663db4..34e857d 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-pinch.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-pinch.html
@@ -76,10 +76,25 @@
 </div>
 <div class="refsect1">
 <a name="gst-plugins-bad-plugins-pinch.description"></a><h2>Description</h2>
+<p>Pinch applies a 'pinch' geometric transform to the image.</p>
+<div class="refsect2">
+<a name="id-1.2.63.7.3"></a><h3>Example launch line</h3>
+<div class="informalexample">
+  <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+    <tbody>
+      <tr>
+        <td class="listing_lines" align="right"><pre>1</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> pinch <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+      </tr>
+    </tbody>
+  </table>
+</div>
+
+</div>
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.63.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.63.7.4.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -105,7 +120,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.63.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.63.7.4.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -179,6 +194,10 @@
 <p>Default value: 0.5</p>
 </div>
 </div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-pinch.see-also"></a><h2>See Also</h2>
+<p>geometrictransform</p>
+</div>
 </div>
 <div class="footer">
 <hr>Generated by GTK-Doc V1.24</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-aiff.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-aiff.html
index 9c7bb72..dcc53d0 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-aiff.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-aiff.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-assrender.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-assrender.html
index 5d1048b..72320a7 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-assrender.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-assrender.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-audiomixer.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-audiomixer.html
index 8b858d5..6b33924 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-audiomixer.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-audiomixer.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -75,6 +75,10 @@
 <td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-audiomixer.html" title="audiomixer">audiomixer</a></span></p></td>
 <td>Mixes multiple audio streams</td>
 </tr>
+<tr>
+<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-liveadder.html" title="liveadder">liveadder</a></span></p></td>
+<td>Mixes multiple audio streams</td>
+</tr>
 </tbody>
 </table></div>
 </div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-audiovisualizers.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-audiovisualizers.html
index 09518cf..2b6061a 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-audiovisualizers.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-audiovisualizers.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-autoconvert.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-autoconvert.html
index 6d24563..624a615 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-autoconvert.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-autoconvert.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-bayer.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-bayer.html
index d03e673..507d4e6 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-bayer.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-bayer.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-bz2.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-bz2.html
index 8c7c4fc..e562880 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-bz2.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-bz2.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-camerabin.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-camerabin.html
index 84b7020..4cbbcc7 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-camerabin.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-camerabin.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-coloreffects.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-coloreffects.html
index be3e71c..2bcbc4b 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-coloreffects.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-coloreffects.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-curl.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-curl.html
index 5a6cea1..083ef57 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-curl.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-curl.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-dataurisrc.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-dataurisrc.html
index 2c54fcf..3af5562 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-dataurisrc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-dataurisrc.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-debugutilsbad.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-debugutilsbad.html
index e4caf0f..fe51c1a 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-debugutilsbad.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-debugutilsbad.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-dtsdec.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-dtsdec.html
index 4af2656..6b3fa39 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-dtsdec.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-dtsdec.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-dvb.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-dvb.html
index 33d0826..30cfc9e 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-dvb.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-dvb.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-dvdspu.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-dvdspu.html
index 81cdf2c..b222ced 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-dvdspu.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-dvdspu.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-faac.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-faac.html
index de9bf31..a5083bc 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-faac.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-faac.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.5.0.1</td>
+<td>1.7.0.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-faad.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-faad.html
index 91b1119..0d15276 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-faad.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-faad.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-festival.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-festival.html
index c40750d..684cf86 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-festival.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-festival.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-gaudieffects.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-gaudieffects.html
index b7adac0..54a6782 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-gaudieffects.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-gaudieffects.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-geometrictransform.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-geometrictransform.html
index cd92d01..80d2a5d 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-geometrictransform.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-geometrictransform.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-gsm.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-gsm.html
index cc7b22e..b5d60af 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-gsm.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-gsm.html
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-jpegformat.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-jpegformat.html
index 298fe39..8cc647e 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-jpegformat.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-jpegformat.html
@@ -7,7 +7,7 @@
 <link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
 <link rel="up" href="ch02.html" title="gst-plugins-bad Plugins">
 <link rel="prev" href="gst-plugins-bad-plugins-plugin-gsm.html" title="gsm">
-<link rel="next" href="gst-plugins-bad-plugins-plugin-liveadder.html" title="liveadder">
+<link rel="next" href="gst-plugins-bad-plugins-plugin-mimic.html" title="mimic">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
 </head>
@@ -17,7 +17,7 @@
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="ch02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
 <td><a accesskey="p" href="gst-plugins-bad-plugins-plugin-gsm.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gst-plugins-bad-plugins-plugin-liveadder.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
+<td><a accesskey="n" href="gst-plugins-bad-plugins-plugin-mimic.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
 <a name="gst-plugins-bad-plugins-plugin-jpegformat"></a><div class="titlepage"></div>
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-liveadder.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-liveadder.html
deleted file mode 100644
index d6de9d1..0000000
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-liveadder.html
+++ /dev/null
@@ -1,79 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
-<html>
-<head>
-<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
-<title>liveadder: GStreamer Bad Plugins 1.0 Plugins Reference Manual</title>
-<meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
-<link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
-<link rel="up" href="ch02.html" title="gst-plugins-bad Plugins">
-<link rel="prev" href="gst-plugins-bad-plugins-plugin-jpegformat.html" title="jpegformat">
-<link rel="next" href="gst-plugins-bad-plugins-plugin-mimic.html" title="mimic">
-<meta name="generator" content="GTK-Doc V1.24 (XML mode)">
-<link rel="stylesheet" href="style.css" type="text/css">
-</head>
-<body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
-<table class="navigation" id="top" width="100%" summary="Navigation header" cellpadding="2" cellspacing="5"><tr valign="middle">
-<td width="100%" align="left" class="shortcuts"></td>
-<td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
-<td><a accesskey="u" href="ch02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gst-plugins-bad-plugins-plugin-jpegformat.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
-<td><a accesskey="n" href="gst-plugins-bad-plugins-plugin-mimic.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
-</tr></table>
-<div class="refentry">
-<a name="gst-plugins-bad-plugins-plugin-liveadder"></a><div class="titlepage"></div>
-<div class="refnamediv"><table width="100%"><tr>
-<td valign="top">
-<h2><span class="refentrytitle">liveadder</span></h2>
-<p>liveadder — <a name="plugin-liveadder"></a>Adds multiple live discontinuous streams</p>
-</td>
-<td class="gallery_image" valign="top" align="right"></td>
-</tr></table></div>
-<div class="refsect1">
-<a name="id-1.3.25.3"></a><h2>Plugin Information</h2>
-<div class="variablelist"><table border="0" class="variablelist">
-<colgroup>
-<col align="left" valign="top">
-<col>
-</colgroup>
-<tbody>
-<tr>
-<td><p><span class="term">filename</span></p></td>
-<td>libgstliveadder.so</td>
-</tr>
-<tr>
-<td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
-</tr>
-<tr>
-<td><p><span class="term">run-time license</span></p></td>
-<td>LGPL</td>
-</tr>
-<tr>
-<td><p><span class="term">package</span></p></td>
-<td>GStreamer Bad Plug-ins source release</td>
-</tr>
-<tr>
-<td><p><span class="term">origin</span></p></td>
-<td>Unknown package origin</td>
-</tr>
-</tbody>
-</table></div>
-</div>
-<div class="refsect1">
-<a name="id-1.3.25.4"></a><h2>Elements</h2>
-<div class="variablelist"><table border="0" class="variablelist">
-<colgroup>
-<col align="left" valign="top">
-<col>
-</colgroup>
-<tbody><tr>
-<td><p><span class="term"><a class="link" href="gst-plugins-bad-plugins-liveadder.html" title="liveadder">liveadder</a></span></p></td>
-<td>Mixes live/discontinuous audio streams</td>
-</tr></tbody>
-</table></div>
-</div>
-</div>
-<div class="footer">
-<hr>Generated by GTK-Doc V1.24</div>
-</body>
-</html>
\ No newline at end of file
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mimic.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mimic.html
index b6644ae..16908cf 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mimic.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mimic.html
@@ -6,7 +6,7 @@
 <meta name="generator" content="DocBook XSL Stylesheets V1.78.1">
 <link rel="home" href="index.html" title="GStreamer Bad Plugins 1.0 Plugins Reference Manual">
 <link rel="up" href="ch02.html" title="gst-plugins-bad Plugins">
-<link rel="prev" href="gst-plugins-bad-plugins-plugin-liveadder.html" title="liveadder">
+<link rel="prev" href="gst-plugins-bad-plugins-plugin-jpegformat.html" title="jpegformat">
 <link rel="next" href="gst-plugins-bad-plugins-plugin-mms.html" title="mms">
 <meta name="generator" content="GTK-Doc V1.24 (XML mode)">
 <link rel="stylesheet" href="style.css" type="text/css">
@@ -16,7 +16,7 @@
 <td width="100%" align="left" class="shortcuts"></td>
 <td><a accesskey="h" href="index.html"><img src="home.png" width="16" height="16" border="0" alt="Home"></a></td>
 <td><a accesskey="u" href="ch02.html"><img src="up.png" width="16" height="16" border="0" alt="Up"></a></td>
-<td><a accesskey="p" href="gst-plugins-bad-plugins-plugin-liveadder.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
+<td><a accesskey="p" href="gst-plugins-bad-plugins-plugin-jpegformat.html"><img src="left.png" width="16" height="16" border="0" alt="Prev"></a></td>
 <td><a accesskey="n" href="gst-plugins-bad-plugins-plugin-mms.html"><img src="right.png" width="16" height="16" border="0" alt="Next"></a></td>
 </tr></table>
 <div class="refentry">
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.26.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.25.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.26.4"></a><h2>Elements</h2>
+<a name="id-1.3.25.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mms.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mms.html
index 8d98ba8..effcab5 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mms.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mms.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.27.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.26.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.27.4"></a><h2>Elements</h2>
+<a name="id-1.3.26.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-modplug.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-modplug.html
index 318188a..6f0ca22 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-modplug.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-modplug.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.28.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.27.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.28.4"></a><h2>Elements</h2>
+<a name="id-1.3.27.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpeg2enc.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpeg2enc.html
index 6d14610..ffbc078 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpeg2enc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpeg2enc.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.29.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.28.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.29.4"></a><h2>Elements</h2>
+<a name="id-1.3.28.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpegpsmux.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpegpsmux.html
index d4db76d..3f0001b 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpegpsmux.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpegpsmux.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.30.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.29.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.30.4"></a><h2>Elements</h2>
+<a name="id-1.3.29.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpegtsmux.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpegtsmux.html
index 6ddd2db..37eb8ac 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpegtsmux.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mpegtsmux.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.31.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.30.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.31.4"></a><h2>Elements</h2>
+<a name="id-1.3.30.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mplex.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mplex.html
index 254f344..8456da8 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-mplex.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-mplex.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.32.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.31.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.32.4"></a><h2>Elements</h2>
+<a name="id-1.3.31.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-neon.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-neon.html
index aec58b8..3f33c9e 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-neon.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-neon.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.33.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.32.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.33.4"></a><h2>Elements</h2>
+<a name="id-1.3.32.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-ofa.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-ofa.html
index 162da59..887898b 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-ofa.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-ofa.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.34.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.33.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.34.4"></a><h2>Elements</h2>
+<a name="id-1.3.33.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-openal.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-openal.html
index c52a2fc..219f394 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-openal.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-openal.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.35.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.34.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.35.4"></a><h2>Elements</h2>
+<a name="id-1.3.34.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-opencv.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-opencv.html
index 79835c3..b2f2c11 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-opencv.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-opencv.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.36.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.35.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.36.4"></a><h2>Elements</h2>
+<a name="id-1.3.35.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-opus.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-opus.html
index 81dd5b9..7fdc0ab 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-opus.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-opus.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.37.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.36.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.37.4"></a><h2>Elements</h2>
+<a name="id-1.3.36.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-pcapparse.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-pcapparse.html
index ae1ad37..695747b 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-pcapparse.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-pcapparse.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.38.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.37.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.38.4"></a><h2>Elements</h2>
+<a name="id-1.3.37.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-rawparse.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-rawparse.html
index 21c982b..a97eb88 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-rawparse.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-rawparse.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.39.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.38.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.39.4"></a><h2>Elements</h2>
+<a name="id-1.3.38.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-rfbsrc.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-rfbsrc.html
index 85885bb..60362c5 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-rfbsrc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-rfbsrc.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.40.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.39.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.40.4"></a><h2>Elements</h2>
+<a name="id-1.3.39.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-rtmp.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-rtmp.html
index d1b3cc5..73e707b 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-rtmp.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-rtmp.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.41.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.40.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.41.4"></a><h2>Elements</h2>
+<a name="id-1.3.40.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-sdp.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-sdp.html
index 1374653..53d28f7 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-sdp.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-sdp.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.42.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.41.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.42.4"></a><h2>Elements</h2>
+<a name="id-1.3.41.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-shm.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-shm.html
index 623670e..2b55014 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-shm.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-shm.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.43.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.42.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.43.4"></a><h2>Elements</h2>
+<a name="id-1.3.42.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-soundtouch.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-soundtouch.html
index 525f946..d398954 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-soundtouch.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-soundtouch.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.44.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.43.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.44.4"></a><h2>Elements</h2>
+<a name="id-1.3.43.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-speed.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-speed.html
index 0bde06d..6e9cf8e 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-speed.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-speed.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.45.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.44.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.45.4"></a><h2>Elements</h2>
+<a name="id-1.3.44.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-voaacenc.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-voaacenc.html
index 5f58793..46f2cc6 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-voaacenc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-voaacenc.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.46.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.45.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.46.4"></a><h2>Elements</h2>
+<a name="id-1.3.45.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-voamrwbenc.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-voamrwbenc.html
index a87b939..27a086c 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-voamrwbenc.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-voamrwbenc.html
@@ -29,7 +29,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.47.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.46.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -42,7 +42,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.2</td>
+<td>1.7.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -60,7 +60,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.47.4"></a><h2>Elements</h2>
+<a name="id-1.3.46.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-plugin-zbar.html b/docs/plugins/html/gst-plugins-bad-plugins-plugin-zbar.html
index 0a1c0bb..9ea9485 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-plugin-zbar.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-plugin-zbar.html
@@ -28,7 +28,7 @@
 <td class="gallery_image" valign="top" align="right"></td>
 </tr></table></div>
 <div class="refsect1">
-<a name="id-1.3.48.3"></a><h2>Plugin Information</h2>
+<a name="id-1.3.47.3"></a><h2>Plugin Information</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -41,7 +41,7 @@
 </tr>
 <tr>
 <td><p><span class="term">version</span></p></td>
-<td>1.6.1</td>
+<td>1.7.0.1</td>
 </tr>
 <tr>
 <td><p><span class="term">run-time license</span></p></td>
@@ -49,7 +49,7 @@
 </tr>
 <tr>
 <td><p><span class="term">package</span></p></td>
-<td>GStreamer Bad Plug-ins source release</td>
+<td>GStreamer Bad Plug-ins git</td>
 </tr>
 <tr>
 <td><p><span class="term">origin</span></p></td>
@@ -59,7 +59,7 @@
 </table></div>
 </div>
 <div class="refsect1">
-<a name="id-1.3.48.4"></a><h2>Elements</h2>
+<a name="id-1.3.47.4"></a><h2>Elements</h2>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-rtpopusdepay.html b/docs/plugins/html/gst-plugins-bad-plugins-rtpopusdepay.html
index 6e76a1e..f601bd8 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-rtpopusdepay.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-rtpopusdepay.html
@@ -131,7 +131,7 @@
 </tr>
 <tr>
 <td><p><span class="term">details</span></p></td>
-<td>audio/x-opus, multistream=(boolean)false</td>
+<td>audio/x-opus, channel-mapping-family=(int)0</td>
 </tr>
 </tbody>
 </table></div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-rtpopuspay.html b/docs/plugins/html/gst-plugins-bad-plugins-rtpopuspay.html
index a866a3e..5e4bad7 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-rtpopuspay.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-rtpopuspay.html
@@ -107,7 +107,7 @@
 </tr>
 <tr>
 <td><p><span class="term">details</span></p></td>
-<td>audio/x-opus, multistream=(boolean)false</td>
+<td>audio/x-opus, channels=(int)[ 1, 2 ], channel-mapping-family=(int)0</td>
 </tr>
 </tbody>
 </table></div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-sdpdemux.html b/docs/plugins/html/gst-plugins-bad-plugins-sdpdemux.html
index f631006..a11eaae 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-sdpdemux.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-sdpdemux.html
@@ -114,7 +114,7 @@
     <tbody>
       <tr>
         <td class="listing_lines" align="right"><pre>1</pre></td>
-        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch gnomevfssrc location<span class="gtkdoc opt">=</span>http<span class="gtkdoc opt">:</span><span class="gtkdoc slc">//some.server/session.sdp ! sdpdemux ! fakesink</span></pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> souphttpsrc location<span class="gtkdoc opt">=</span>http<span class="gtkdoc opt">:</span><span class="gtkdoc slc">//some.server/session.sdp ! sdpdemux ! fakesink</span></pre></td>
       </tr>
     </tbody>
   </table>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-solarize.html b/docs/plugins/html/gst-plugins-bad-plugins-solarize.html
index 36b57b6..83a0f2e 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-solarize.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-solarize.html
@@ -99,7 +99,7 @@
     <tbody>
       <tr>
         <td class="listing_lines" align="right"><pre>1</pre></td>
-        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> solarize <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> solarize <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
       </tr>
     </tbody>
   </table>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-spacescope.html b/docs/plugins/html/gst-plugins-bad-plugins-spacescope.html
index 0e5d7ec..e5fc0ff 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-spacescope.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-spacescope.html
@@ -67,7 +67,7 @@
     <span class="lineart">╰──</span> <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
         <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
             <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
-                <span class="lineart">╰──</span> GstAudioVisualizer-BadGstAudioVisualizers
+                <span class="lineart">╰──</span> GstAudioVisualizer-BaseExtLibvisual
                     <span class="lineart">╰──</span> GstSpaceScope
 </pre>
 </div>
@@ -82,7 +82,7 @@
     <tbody>
       <tr>
         <td class="listing_lines" align="right"><pre>1</pre></td>
-        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch audiotestsrc <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> spacescope <span class="gtkdoc opt">!</span> ximagesink</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> audiotestsrc <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> spacescope <span class="gtkdoc opt">!</span> ximagesink</pre></td>
       </tr>
     </tbody>
   </table>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-spectrascope.html b/docs/plugins/html/gst-plugins-bad-plugins-spectrascope.html
index 68c1684..e1829f9 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-spectrascope.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-spectrascope.html
@@ -51,7 +51,7 @@
     <span class="lineart">╰──</span> <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
         <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
             <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
-                <span class="lineart">╰──</span> GstAudioVisualizer-BadGstAudioVisualizers
+                <span class="lineart">╰──</span> GstAudioVisualizer-BaseExtLibvisual
                     <span class="lineart">╰──</span> GstSpectraScope
 </pre>
 </div>
@@ -66,7 +66,7 @@
     <tbody>
       <tr>
         <td class="listing_lines" align="right"><pre>1</pre></td>
-        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch audiotestsrc <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> spectrascope <span class="gtkdoc opt">!</span> ximagesink</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> audiotestsrc <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> spectrascope <span class="gtkdoc opt">!</span> ximagesink</pre></td>
       </tr>
     </tbody>
   </table>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-speed.html b/docs/plugins/html/gst-plugins-bad-plugins-speed.html
index 4a5ea35..96e19eb 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-speed.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-speed.html
@@ -84,7 +84,7 @@
     <tbody>
       <tr>
         <td class="listing_lines" align="right"><pre>1</pre></td>
-        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch filesrc location<span class="gtkdoc opt">=</span>test<span class="gtkdoc opt">.</span>ogg <span class="gtkdoc opt">!</span> decodebin <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> speed speed<span class="gtkdoc opt">=</span><span class="number">1.5</span> <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> audioresample <span class="gtkdoc opt">!</span> autoaudiosink</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> filesrc location<span class="gtkdoc opt">=</span>test<span class="gtkdoc opt">.</span>ogg <span class="gtkdoc opt">!</span> decodebin <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> speed speed<span class="gtkdoc opt">=</span><span class="number">1.5</span> <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> audioresample <span class="gtkdoc opt">!</span> autoaudiosink</pre></td>
       </tr>
     </tbody>
   </table>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-sphere.html b/docs/plugins/html/gst-plugins-bad-plugins-sphere.html
index 2de8a27..cb03c49 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-sphere.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-sphere.html
@@ -76,10 +76,25 @@
 </div>
 <div class="refsect1">
 <a name="gst-plugins-bad-plugins-sphere.description"></a><h2>Description</h2>
+<p>The sphere element applies a 'sphere' geometric transform to the image.</p>
+<div class="refsect2">
+<a name="id-1.2.76.7.3"></a><h3>Example launch line</h3>
+<div class="informalexample">
+  <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+    <tbody>
+      <tr>
+        <td class="listing_lines" align="right"><pre>1</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> sphere <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+      </tr>
+    </tbody>
+  </table>
+</div>
+
+</div>
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.76.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.76.7.4.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -105,7 +120,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.76.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.76.7.4.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -178,6 +193,10 @@
 <p>Default value: 1.5</p>
 </div>
 </div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-sphere.see-also"></a><h2>See Also</h2>
+<p>geometrictransform</p>
+</div>
 </div>
 <div class="footer">
 <hr>Generated by GTK-Doc V1.24</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-square.html b/docs/plugins/html/gst-plugins-bad-plugins-square.html
index a752be8..48cbe54 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-square.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-square.html
@@ -87,10 +87,25 @@
 </div>
 <div class="refsect1">
 <a name="gst-plugins-bad-plugins-square.description"></a><h2>Description</h2>
+<p>The square element distorts the center part of the image into a square.</p>
+<div class="refsect2">
+<a name="id-1.2.77.7.3"></a><h3>Example launch line</h3>
+<div class="informalexample">
+  <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+    <tbody>
+      <tr>
+        <td class="listing_lines" align="right"><pre>1</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> square zoom<span class="gtkdoc opt">=</span><span class="number">100</span> <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+      </tr>
+    </tbody>
+  </table>
+</div>
+
+</div>
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.77.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.77.7.4.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -116,7 +131,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.77.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.77.7.4.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -208,6 +223,10 @@
 <p>Default value: 2</p>
 </div>
 </div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-square.see-also"></a><h2>See Also</h2>
+<p>geometrictransform</p>
+</div>
 </div>
 <div class="footer">
 <hr>Generated by GTK-Doc V1.24</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-stretch.html b/docs/plugins/html/gst-plugins-bad-plugins-stretch.html
index a31b72b..5d20b48 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-stretch.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-stretch.html
@@ -76,10 +76,25 @@
 </div>
 <div class="refsect1">
 <a name="gst-plugins-bad-plugins-stretch.description"></a><h2>Description</h2>
+<p>The stretch element stretches the image in a circle around the center point.</p>
+<div class="refsect2">
+<a name="id-1.2.78.7.3"></a><h3>Example launch line</h3>
+<div class="informalexample">
+  <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+    <tbody>
+      <tr>
+        <td class="listing_lines" align="right"><pre>1</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> stretch <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+      </tr>
+    </tbody>
+  </table>
+</div>
+
+</div>
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.78.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.78.7.4.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -105,7 +120,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.78.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.78.7.4.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -179,6 +194,10 @@
 <p>Default value: 0.5</p>
 </div>
 </div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-stretch.see-also"></a><h2>See Also</h2>
+<p>geometrictransform</p>
+</div>
 </div>
 <div class="footer">
 <hr>Generated by GTK-Doc V1.24</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-synaescope.html b/docs/plugins/html/gst-plugins-bad-plugins-synaescope.html
index 625d945..f8db57a 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-synaescope.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-synaescope.html
@@ -51,7 +51,7 @@
     <span class="lineart">╰──</span> <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
         <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
             <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
-                <span class="lineart">╰──</span> GstAudioVisualizer-BadGstAudioVisualizers
+                <span class="lineart">╰──</span> GstAudioVisualizer-BaseExtLibvisual
                     <span class="lineart">╰──</span> GstSynaeScope
 </pre>
 </div>
@@ -66,7 +66,7 @@
     <tbody>
       <tr>
         <td class="listing_lines" align="right"><pre>1</pre></td>
-        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch audiotestsrc <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> synaescope <span class="gtkdoc opt">!</span> ximagesink</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> audiotestsrc <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> synaescope <span class="gtkdoc opt">!</span> ximagesink</pre></td>
       </tr>
     </tbody>
   </table>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-templatematch.html b/docs/plugins/html/gst-plugins-bad-plugins-templatematch.html
index 3b2ce86..258c897 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-templatematch.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-templatematch.html
@@ -80,7 +80,10 @@
     <span class="lineart">╰──</span> <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
         <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
             <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
-                <span class="lineart">╰──</span> GstTemplateMatch
+                <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer-libs/html/GstBaseTransform.html">GstBaseTransform</a>
+                    <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-base-libs/html/gst-plugins-base-libs-gstvideofilter.html#GstVideoFilter">GstVideoFilter</a>
+                        <span class="lineart">╰──</span> GstOpencvVideoFilter
+                            <span class="lineart">╰──</span> GstTemplateMatch
 </pre>
 </div>
 <div class="refsect1">
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-tunnel.html b/docs/plugins/html/gst-plugins-bad-plugins-tunnel.html
index ebdf9fc..6fa8327 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-tunnel.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-tunnel.html
@@ -60,10 +60,26 @@
 </div>
 <div class="refsect1">
 <a name="gst-plugins-bad-plugins-tunnel.description"></a><h2>Description</h2>
+<p>Tunnel is a geometric image transform element. It applies a light tunnel
+effect.</p>
+<div class="refsect2">
+<a name="id-1.2.81.6.3"></a><h3>Example launch line</h3>
+<div class="informalexample">
+  <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+    <tbody>
+      <tr>
+        <td class="listing_lines" align="right"><pre>1</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> tunnel <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+      </tr>
+    </tbody>
+  </table>
+</div>
+
+</div>
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.81.6.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.81.6.4.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -89,7 +105,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.81.6.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.81.6.4.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -152,6 +168,10 @@
 <pre class="programlisting">struct GstTunnel;</pre>
 </div>
 </div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-tunnel.see-also"></a><h2>See Also</h2>
+<p>geometrictransform</p>
+</div>
 </div>
 <div class="footer">
 <hr>Generated by GTK-Doc V1.24</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-twirl.html b/docs/plugins/html/gst-plugins-bad-plugins-twirl.html
index 68bdcc7..ff5bd59 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-twirl.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-twirl.html
@@ -76,10 +76,25 @@
 </div>
 <div class="refsect1">
 <a name="gst-plugins-bad-plugins-twirl.description"></a><h2>Description</h2>
+<p>The twirl element twists the image from the center out.</p>
+<div class="refsect2">
+<a name="id-1.2.82.7.3"></a><h3>Example launch line</h3>
+<div class="informalexample">
+  <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+    <tbody>
+      <tr>
+        <td class="listing_lines" align="right"><pre>1</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> twirl <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+      </tr>
+    </tbody>
+  </table>
+</div>
+
+</div>
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.82.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.82.7.4.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -105,7 +120,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.82.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.82.7.4.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -178,6 +193,10 @@
 <p>Default value: 3.14159</p>
 </div>
 </div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-twirl.see-also"></a><h2>See Also</h2>
+<p>geometrictransform</p>
+</div>
 </div>
 <div class="footer">
 <hr>Generated by GTK-Doc V1.24</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-waterripple.html b/docs/plugins/html/gst-plugins-bad-plugins-waterripple.html
index 1c55430..4bc97fd 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-waterripple.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-waterripple.html
@@ -88,10 +88,25 @@
 </div>
 <div class="refsect1">
 <a name="gst-plugins-bad-plugins-waterripple.description"></a><h2>Description</h2>
+<p>The waterripple element creates a water ripple effect on the image.</p>
+<div class="refsect2">
+<a name="id-1.2.84.7.3"></a><h3>Example launch line</h3>
+<div class="informalexample">
+  <table class="listing_frame" border="0" cellpadding="0" cellspacing="0">
+    <tbody>
+      <tr>
+        <td class="listing_lines" align="right"><pre>1</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> <span class="gtkdoc opt">-</span>v videotestsrc <span class="gtkdoc opt">!</span> waterripple <span class="gtkdoc opt">!</span> videoconvert <span class="gtkdoc opt">!</span> autovideosink</pre></td>
+      </tr>
+    </tbody>
+  </table>
+</div>
+
+</div>
 <div class="refsynopsisdiv">
 <h2>Synopsis</h2>
 <div class="refsect2">
-<a name="id-1.2.84.7.2.1"></a><h3>Element Information</h3>
+<a name="id-1.2.84.7.4.1"></a><h3>Element Information</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -117,7 +132,7 @@
 </div>
 <hr>
 <div class="refsect2">
-<a name="id-1.2.84.7.2.2"></a><h3>Element Pads</h3>
+<a name="id-1.2.84.7.4.2"></a><h3>Element Pads</h3>
 <div class="variablelist"><table border="0" class="variablelist">
 <colgroup>
 <col align="left" valign="top">
@@ -206,6 +221,10 @@
 <p>Default value: 16</p>
 </div>
 </div>
+<div class="refsect1">
+<a name="gst-plugins-bad-plugins-waterripple.see-also"></a><h2>See Also</h2>
+<p>geometrictransform</p>
+</div>
 </div>
 <div class="footer">
 <hr>Generated by GTK-Doc V1.24</div>
diff --git a/docs/plugins/html/gst-plugins-bad-plugins-wavescope.html b/docs/plugins/html/gst-plugins-bad-plugins-wavescope.html
index 2d88e6c..4b0d38d 100644
--- a/docs/plugins/html/gst-plugins-bad-plugins-wavescope.html
+++ b/docs/plugins/html/gst-plugins-bad-plugins-wavescope.html
@@ -67,7 +67,7 @@
     <span class="lineart">╰──</span> <a href="https://developer.gnome.org/gobject/unstable/gobject-The-Base-Object-Type.html#GInitiallyUnowned">GInitiallyUnowned</a>
         <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstObject.html">GstObject</a>
             <span class="lineart">╰──</span> <a href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gstreamer/html/GstElement.html">GstElement</a>
-                <span class="lineart">╰──</span> GstAudioVisualizer-BadGstAudioVisualizers
+                <span class="lineart">╰──</span> GstAudioVisualizer-BaseExtLibvisual
                     <span class="lineart">╰──</span> GstWaveScope
 </pre>
 </div>
@@ -82,7 +82,7 @@
     <tbody>
       <tr>
         <td class="listing_lines" align="right"><pre>1</pre></td>
-        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch audiotestsrc <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> wavescope <span class="gtkdoc opt">!</span> ximagesink</pre></td>
+        <td class="listing_code"><pre class="programlisting">gst<span class="gtkdoc opt">-</span>launch<span class="gtkdoc opt">-</span><span class="number">1.0</span> audiotestsrc <span class="gtkdoc opt">!</span> audioconvert <span class="gtkdoc opt">!</span> wavescope <span class="gtkdoc opt">!</span> ximagesink</pre></td>
       </tr>
     </tbody>
   </table>
diff --git a/docs/plugins/html/index.html b/docs/plugins/html/index.html
index deb3de2..a7946b3 100644
--- a/docs/plugins/html/index.html
+++ b/docs/plugins/html/index.html
@@ -15,7 +15,7 @@
 <div>
 <div><table class="navigation" id="top" width="100%" cellpadding="2" cellspacing="0"><tr><th valign="middle"><p class="title">GStreamer Bad Plugins 1.0 Plugins Reference Manual</p></th></tr></table></div>
 <div><p class="releaseinfo">
-      for GStreamer Bad Plugins 1.0 (1.6.2)
+      for GStreamer Bad Plugins 1.0 (1.7.1)
       The latest version of this documentation can be found on-line at
       <a class="ulink" href="http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad/html/" target="_top">http://gstreamer.freedesktop.org/data/doc/gstreamer/head/gst-plugins-bad/html/</a>.
     </p></div>
@@ -359,9 +359,6 @@
 <span class="refentrytitle"><a href="gst-plugins-bad-plugins-plugin-jpegformat.html">jpegformat</a></span><span class="refpurpose"> — JPEG interchange format plugin</span>
 </dt>
 <dt>
-<span class="refentrytitle"><a href="gst-plugins-bad-plugins-plugin-liveadder.html">liveadder</a></span><span class="refpurpose"> — Adds multiple live discontinuous streams</span>
-</dt>
-<dt>
 <span class="refentrytitle"><a href="gst-plugins-bad-plugins-plugin-mimic.html">mimic</a></span><span class="refpurpose"> — Mimic codec</span>
 </dt>
 <dt>
diff --git a/docs/plugins/html/index.sgml b/docs/plugins/html/index.sgml
index 6257525..9a29d99 100644
--- a/docs/plugins/html/index.sgml
+++ b/docs/plugins/html/index.sgml
@@ -86,6 +86,7 @@
 <ANCHOR id="GstBulge-struct" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-bulge.html#GstBulge-struct">
 <ANCHOR id="gst-plugins-bad-plugins-bulge.property-details" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-bulge.html#gst-plugins-bad-plugins-bulge.property-details">
 <ANCHOR id="GstBulge--zoom" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-bulge.html#GstBulge--zoom">
+<ANCHOR id="gst-plugins-bad-plugins-bulge.see-also" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-bulge.html#gst-plugins-bad-plugins-bulge.see-also">
 <ANCHOR id="gst-plugins-bad-plugins-burn" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-burn.html">
 <ANCHOR id="gst-plugins-bad-plugins-burn.properties" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-burn.html#gst-plugins-bad-plugins-burn.properties">
 <ANCHOR id="GstBurn" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-burn.html#GstBurn">
@@ -126,6 +127,7 @@
 <ANCHOR id="GstCircle--angle" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-circle.html#GstCircle--angle">
 <ANCHOR id="GstCircle--height" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-circle.html#GstCircle--height">
 <ANCHOR id="GstCircle--spread-angle" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-circle.html#GstCircle--spread-angle">
+<ANCHOR id="gst-plugins-bad-plugins-circle.see-also" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-circle.html#gst-plugins-bad-plugins-circle.see-also">
 <ANCHOR id="gst-plugins-bad-plugins-coloreffects" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-coloreffects.html">
 <ANCHOR id="gst-plugins-bad-plugins-coloreffects.properties" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-coloreffects.html#gst-plugins-bad-plugins-coloreffects.properties">
 <ANCHOR id="GstColorEffects" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-coloreffects.html#GstColorEffects">
@@ -182,6 +184,8 @@
 <ANCHOR id="GstCvLaplace-struct" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-cvlaplace.html#GstCvLaplace-struct">
 <ANCHOR id="gst-plugins-bad-plugins-cvlaplace.property-details" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-cvlaplace.html#gst-plugins-bad-plugins-cvlaplace.property-details">
 <ANCHOR id="GstCvLaplace--aperture-size" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-cvlaplace.html#GstCvLaplace--aperture-size">
+<ANCHOR id="GstCvLaplace--scale" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-cvlaplace.html#GstCvLaplace--scale">
+<ANCHOR id="GstCvLaplace--shift" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-cvlaplace.html#GstCvLaplace--shift">
 <ANCHOR id="gst-plugins-bad-plugins-cvsmooth" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-cvsmooth.html">
 <ANCHOR id="gst-plugins-bad-plugins-cvsmooth.properties" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-cvsmooth.html#gst-plugins-bad-plugins-cvsmooth.properties">
 <ANCHOR id="GstCvSmooth" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-cvsmooth.html#GstCvSmooth">
@@ -237,6 +241,7 @@
 <ANCHOR id="GstDiffuse-struct" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-diffuse.html#GstDiffuse-struct">
 <ANCHOR id="gst-plugins-bad-plugins-diffuse.property-details" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-diffuse.html#gst-plugins-bad-plugins-diffuse.property-details">
 <ANCHOR id="GstDiffuse--scale" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-diffuse.html#GstDiffuse--scale">
+<ANCHOR id="gst-plugins-bad-plugins-diffuse.see-also" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-diffuse.html#gst-plugins-bad-plugins-diffuse.see-also">
 <ANCHOR id="gst-plugins-bad-plugins-dilate" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-dilate.html">
 <ANCHOR id="gst-plugins-bad-plugins-dilate.properties" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-dilate.html#gst-plugins-bad-plugins-dilate.properties">
 <ANCHOR id="GstDilate" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-dilate.html#GstDilate">
@@ -420,6 +425,7 @@
 <ANCHOR id="gst-plugins-bad-plugins-fisheye.functions_details" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-fisheye.html#gst-plugins-bad-plugins-fisheye.functions_details">
 <ANCHOR id="gst-plugins-bad-plugins-fisheye.other_details" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-fisheye.html#gst-plugins-bad-plugins-fisheye.other_details">
 <ANCHOR id="GstFisheye-struct" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-fisheye.html#GstFisheye-struct">
+<ANCHOR id="gst-plugins-bad-plugins-fisheye.see-also" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-fisheye.html#gst-plugins-bad-plugins-fisheye.see-also">
 <ANCHOR id="gst-plugins-bad-plugins-fpsdisplaysink" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-fpsdisplaysink.html">
 <ANCHOR id="gst-plugins-bad-plugins-fpsdisplaysink.properties" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-fpsdisplaysink.html#gst-plugins-bad-plugins-fpsdisplaysink.properties">
 <ANCHOR id="gst-plugins-bad-plugins-fpsdisplaysink.signals" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-fpsdisplaysink.html#gst-plugins-bad-plugins-fpsdisplaysink.signals">
@@ -478,18 +484,11 @@
 <ANCHOR id="GstKaleidoscope--angle" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-kaleidoscope.html#GstKaleidoscope--angle">
 <ANCHOR id="GstKaleidoscope--angle2" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-kaleidoscope.html#GstKaleidoscope--angle2">
 <ANCHOR id="GstKaleidoscope--sides" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-kaleidoscope.html#GstKaleidoscope--sides">
+<ANCHOR id="gst-plugins-bad-plugins-kaleidoscope.see-also" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-kaleidoscope.html#gst-plugins-bad-plugins-kaleidoscope.see-also">
 <ANCHOR id="gst-plugins-bad-plugins-liveadder" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-liveadder.html">
-<ANCHOR id="gst-plugins-bad-plugins-liveadder.properties" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-liveadder.html#gst-plugins-bad-plugins-liveadder.properties">
-<ANCHOR id="GstLiveAdder" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-liveadder.html#GstLiveAdder">
-<ANCHOR id="gst-plugins-bad-plugins-liveadder.other" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-liveadder.html#gst-plugins-bad-plugins-liveadder.other">
-<ANCHOR id="gst-plugins-bad-plugins-liveadder.object-hierarchy" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-liveadder.html#gst-plugins-bad-plugins-liveadder.object-hierarchy">
 <ANCHOR id="gst-plugins-bad-plugins-liveadder.description" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-liveadder.html#gst-plugins-bad-plugins-liveadder.description">
 <ANCHOR id="gst-plugins-bad-plugins-liveadder.functions_details" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-liveadder.html#gst-plugins-bad-plugins-liveadder.functions_details">
 <ANCHOR id="gst-plugins-bad-plugins-liveadder.other_details" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-liveadder.html#gst-plugins-bad-plugins-liveadder.other_details">
-<ANCHOR id="GstLiveAdder-struct" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-liveadder.html#GstLiveAdder-struct">
-<ANCHOR id="gst-plugins-bad-plugins-liveadder.property-details" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-liveadder.html#gst-plugins-bad-plugins-liveadder.property-details">
-<ANCHOR id="GstLiveAdder--latency" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-liveadder.html#GstLiveAdder--latency">
-<ANCHOR id="gst-plugins-bad-plugins-liveadder.see-also" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-liveadder.html#gst-plugins-bad-plugins-liveadder.see-also">
 <ANCHOR id="gst-plugins-bad-plugins-marble" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-marble.html">
 <ANCHOR id="gst-plugins-bad-plugins-marble.properties" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-marble.html#gst-plugins-bad-plugins-marble.properties">
 <ANCHOR id="GstMarble" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-marble.html#GstMarble">
@@ -504,6 +503,7 @@
 <ANCHOR id="GstMarble--turbulence" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-marble.html#GstMarble--turbulence">
 <ANCHOR id="GstMarble--x-scale" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-marble.html#GstMarble--x-scale">
 <ANCHOR id="GstMarble--y-scale" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-marble.html#GstMarble--y-scale">
+<ANCHOR id="gst-plugins-bad-plugins-marble.see-also" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-marble.html#gst-plugins-bad-plugins-marble.see-also">
 <ANCHOR id="gst-plugins-bad-plugins-mimenc" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-mimenc.html">
 <ANCHOR id="gst-plugins-bad-plugins-mimenc.properties" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-mimenc.html#gst-plugins-bad-plugins-mimenc.properties">
 <ANCHOR id="GstMimEnc" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-mimenc.html#GstMimEnc">
@@ -534,6 +534,7 @@
 <ANCHOR id="GstMirror-struct" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-mirror.html#GstMirror-struct">
 <ANCHOR id="gst-plugins-bad-plugins-mirror.property-details" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-mirror.html#gst-plugins-bad-plugins-mirror.property-details">
 <ANCHOR id="GstMirror--mode" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-mirror.html#GstMirror--mode">
+<ANCHOR id="gst-plugins-bad-plugins-mirror.see-also" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-mirror.html#gst-plugins-bad-plugins-mirror.see-also">
 <ANCHOR id="gst-plugins-bad-plugins-modplug" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-modplug.html">
 <ANCHOR id="gst-plugins-bad-plugins-modplug.properties" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-modplug.html#gst-plugins-bad-plugins-modplug.properties">
 <ANCHOR id="GstModPlug" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-modplug.html#GstModPlug">
@@ -807,6 +808,7 @@
 <ANCHOR id="GstPinch-struct" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-pinch.html#GstPinch-struct">
 <ANCHOR id="gst-plugins-bad-plugins-pinch.property-details" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-pinch.html#gst-plugins-bad-plugins-pinch.property-details">
 <ANCHOR id="GstPinch--intensity" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-pinch.html#GstPinch--intensity">
+<ANCHOR id="gst-plugins-bad-plugins-pinch.see-also" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-pinch.html#gst-plugins-bad-plugins-pinch.see-also">
 <ANCHOR id="gst-plugins-bad-plugins-pyramidsegment" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-pyramidsegment.html">
 <ANCHOR id="GstPinch" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-pyramidsegment.html#GstPinch">
 <ANCHOR id="gst-plugins-bad-plugins-pyramidsegment.description" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-pyramidsegment.html#gst-plugins-bad-plugins-pyramidsegment.description">
@@ -971,6 +973,7 @@
 <ANCHOR id="GstSphere-struct" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-sphere.html#GstSphere-struct">
 <ANCHOR id="gst-plugins-bad-plugins-sphere.property-details" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-sphere.html#gst-plugins-bad-plugins-sphere.property-details">
 <ANCHOR id="GstSphere--refraction" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-sphere.html#GstSphere--refraction">
+<ANCHOR id="gst-plugins-bad-plugins-sphere.see-also" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-sphere.html#gst-plugins-bad-plugins-sphere.see-also">
 <ANCHOR id="gst-plugins-bad-plugins-square" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-square.html">
 <ANCHOR id="gst-plugins-bad-plugins-square.properties" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-square.html#gst-plugins-bad-plugins-square.properties">
 <ANCHOR id="GstSquare" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-square.html#GstSquare">
@@ -984,6 +987,7 @@
 <ANCHOR id="GstSquare--height" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-square.html#GstSquare--height">
 <ANCHOR id="GstSquare--width" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-square.html#GstSquare--width">
 <ANCHOR id="GstSquare--zoom" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-square.html#GstSquare--zoom">
+<ANCHOR id="gst-plugins-bad-plugins-square.see-also" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-square.html#gst-plugins-bad-plugins-square.see-also">
 <ANCHOR id="gst-plugins-bad-plugins-stretch" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-stretch.html">
 <ANCHOR id="gst-plugins-bad-plugins-stretch.properties" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-stretch.html#gst-plugins-bad-plugins-stretch.properties">
 <ANCHOR id="GstStretch" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-stretch.html#GstStretch">
@@ -995,6 +999,7 @@
 <ANCHOR id="GstStretch-struct" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-stretch.html#GstStretch-struct">
 <ANCHOR id="gst-plugins-bad-plugins-stretch.property-details" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-stretch.html#gst-plugins-bad-plugins-stretch.property-details">
 <ANCHOR id="GstStretch--intensity" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-stretch.html#GstStretch--intensity">
+<ANCHOR id="gst-plugins-bad-plugins-stretch.see-also" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-stretch.html#gst-plugins-bad-plugins-stretch.see-also">
 <ANCHOR id="gst-plugins-bad-plugins-templatematch" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-templatematch.html">
 <ANCHOR id="gst-plugins-bad-plugins-templatematch.properties" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-templatematch.html#gst-plugins-bad-plugins-templatematch.properties">
 <ANCHOR id="GstSynaeScope" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-templatematch.html#GstSynaeScope">
@@ -1037,6 +1042,7 @@
 <ANCHOR id="gst-plugins-bad-plugins-tunnel.functions_details" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-tunnel.html#gst-plugins-bad-plugins-tunnel.functions_details">
 <ANCHOR id="gst-plugins-bad-plugins-tunnel.other_details" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-tunnel.html#gst-plugins-bad-plugins-tunnel.other_details">
 <ANCHOR id="GstTunnel-struct" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-tunnel.html#GstTunnel-struct">
+<ANCHOR id="gst-plugins-bad-plugins-tunnel.see-also" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-tunnel.html#gst-plugins-bad-plugins-tunnel.see-also">
 <ANCHOR id="gst-plugins-bad-plugins-twirl" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-twirl.html">
 <ANCHOR id="gst-plugins-bad-plugins-twirl.properties" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-twirl.html#gst-plugins-bad-plugins-twirl.properties">
 <ANCHOR id="GstTwirl" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-twirl.html#GstTwirl">
@@ -1048,6 +1054,7 @@
 <ANCHOR id="GstTwirl-struct" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-twirl.html#GstTwirl-struct">
 <ANCHOR id="gst-plugins-bad-plugins-twirl.property-details" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-twirl.html#gst-plugins-bad-plugins-twirl.property-details">
 <ANCHOR id="GstTwirl--angle" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-twirl.html#GstTwirl--angle">
+<ANCHOR id="gst-plugins-bad-plugins-twirl.see-also" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-twirl.html#gst-plugins-bad-plugins-twirl.see-also">
 <ANCHOR id="gst-plugins-bad-plugins-videoparse" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-videoparse.html">
 <ANCHOR id="gst-plugins-bad-plugins-videoparse.properties" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-videoparse.html#gst-plugins-bad-plugins-videoparse.properties">
 <ANCHOR id="GstVideoParse" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-videoparse.html#GstVideoParse">
@@ -1085,6 +1092,7 @@
 <ANCHOR id="GstWaterRipple--amplitude" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-waterripple.html#GstWaterRipple--amplitude">
 <ANCHOR id="GstWaterRipple--phase" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-waterripple.html#GstWaterRipple--phase">
 <ANCHOR id="GstWaterRipple--wavelength" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-waterripple.html#GstWaterRipple--wavelength">
+<ANCHOR id="gst-plugins-bad-plugins-waterripple.see-also" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-waterripple.html#gst-plugins-bad-plugins-waterripple.see-also">
 <ANCHOR id="gst-plugins-bad-plugins-zbar" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-zbar.html">
 <ANCHOR id="gst-plugins-bad-plugins-zbar.properties" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-zbar.html#gst-plugins-bad-plugins-zbar.properties">
 <ANCHOR id="gst-plugins-bad-plugins-zbar.other" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-zbar.html#gst-plugins-bad-plugins-zbar.other">
@@ -1170,8 +1178,6 @@
 <ANCHOR id="plugin-gsm" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-plugin-gsm.html#plugin-gsm">
 <ANCHOR id="gst-plugins-bad-plugins-plugin-jpegformat" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-plugin-jpegformat.html">
 <ANCHOR id="plugin-jpegformat" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-plugin-jpegformat.html#plugin-jpegformat">
-<ANCHOR id="gst-plugins-bad-plugins-plugin-liveadder" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-plugin-liveadder.html">
-<ANCHOR id="plugin-liveadder" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-plugin-liveadder.html#plugin-liveadder">
 <ANCHOR id="gst-plugins-bad-plugins-plugin-mimic" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-plugin-mimic.html">
 <ANCHOR id="plugin-mimic" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-plugin-mimic.html#plugin-mimic">
 <ANCHOR id="gst-plugins-bad-plugins-plugin-mms" href="gst-plugins-bad-plugins-1.0/gst-plugins-bad-plugins-plugin-mms.html">
diff --git a/docs/plugins/inspect/plugin-accurip.xml b/docs/plugins/inspect/plugin-accurip.xml
index 9471ef9..c9d4d62 100644
--- a/docs/plugins/inspect/plugin-accurip.xml
+++ b/docs/plugins/inspect/plugin-accurip.xml
@@ -3,7 +3,7 @@
   <description>Computes an AccurateRip CRC</description>
   <filename>../../gst/accurip/.libs/libgstaccurip.so</filename>
   <basename>libgstaccurip.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-adpcmdec.xml b/docs/plugins/inspect/plugin-adpcmdec.xml
index 5f3d1ea..91235c3 100644
--- a/docs/plugins/inspect/plugin-adpcmdec.xml
+++ b/docs/plugins/inspect/plugin-adpcmdec.xml
@@ -3,7 +3,7 @@
   <description>ADPCM decoder</description>
   <filename>../../gst/adpcmdec/.libs/libgstadpcmdec.so</filename>
   <basename>libgstadpcmdec.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-adpcmenc.xml b/docs/plugins/inspect/plugin-adpcmenc.xml
index 7eb1ac3..196fdf5 100644
--- a/docs/plugins/inspect/plugin-adpcmenc.xml
+++ b/docs/plugins/inspect/plugin-adpcmenc.xml
@@ -3,7 +3,7 @@
   <description>ADPCM encoder</description>
   <filename>../../gst/adpcmenc/.libs/libgstadpcmenc.so</filename>
   <basename>libgstadpcmenc.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-aiff.xml b/docs/plugins/inspect/plugin-aiff.xml
index 22ccfb8..5509238 100644
--- a/docs/plugins/inspect/plugin-aiff.xml
+++ b/docs/plugins/inspect/plugin-aiff.xml
@@ -3,7 +3,7 @@
   <description>Create and parse Audio Interchange File Format (AIFF) files</description>
   <filename>../../gst/aiff/.libs/libgstaiff.so</filename>
   <basename>libgstaiff.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-asfmux.xml b/docs/plugins/inspect/plugin-asfmux.xml
index c26c758..94cbd7f 100644
--- a/docs/plugins/inspect/plugin-asfmux.xml
+++ b/docs/plugins/inspect/plugin-asfmux.xml
@@ -3,7 +3,7 @@
   <description>ASF Muxer Plugin</description>
   <filename>../../gst/asfmux/.libs/libgstasfmux.so</filename>
   <basename>libgstasfmux.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-assrender.xml b/docs/plugins/inspect/plugin-assrender.xml
index 6da1b48..2b82155 100644
--- a/docs/plugins/inspect/plugin-assrender.xml
+++ b/docs/plugins/inspect/plugin-assrender.xml
@@ -3,7 +3,7 @@
   <description>ASS/SSA subtitle renderer</description>
   <filename>../../ext/assrender/.libs/libgstassrender.so</filename>
   <basename>libgstassrender.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-audiofxbad.xml b/docs/plugins/inspect/plugin-audiofxbad.xml
index 49cf08f..33be9db 100644
--- a/docs/plugins/inspect/plugin-audiofxbad.xml
+++ b/docs/plugins/inspect/plugin-audiofxbad.xml
@@ -3,7 +3,7 @@
   <description>Audio filters from gst-plugins-bad</description>
   <filename>../../gst/audiofxbad/.libs/libgstaudiofxbad.so</filename>
   <basename>libgstaudiofxbad.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-audiomixer.xml b/docs/plugins/inspect/plugin-audiomixer.xml
index 905842b..4ee5420 100644
--- a/docs/plugins/inspect/plugin-audiomixer.xml
+++ b/docs/plugins/inspect/plugin-audiomixer.xml
@@ -3,7 +3,7 @@
   <description>Mixes multiple audio streams</description>
   <filename>../../gst/audiomixer/.libs/libgstaudiomixer.so</filename>
   <basename>libgstaudiomixer.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
@@ -51,5 +51,26 @@
         </caps>
       </pads>
     </element>
+    <element>
+      <name>liveadder</name>
+      <longname>AudioMixer</longname>
+      <class>Generic/Audio</class>
+      <description>Mixes multiple audio streams</description>
+      <author>Sebastian Dröge &lt;sebastian@centricular.com&gt;</author>
+      <pads>
+        <caps>
+          <name>sink_%u</name>
+          <direction>sink</direction>
+          <presence>request</presence>
+          <details>audio/x-raw, format=(string){ S32LE, U32LE, S16LE, U16LE, S8, U8, F32LE, F64LE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string){ interleaved, non-interleaved }</details>
+        </caps>
+        <caps>
+          <name>src</name>
+          <direction>source</direction>
+          <presence>always</presence>
+          <details>audio/x-raw, format=(string){ S32LE, U32LE, S16LE, U16LE, S8, U8, F32LE, F64LE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ], layout=(string){ interleaved, non-interleaved }</details>
+        </caps>
+      </pads>
+    </element>
   </elements>
 </plugin>
\ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-audiovisualizers.xml b/docs/plugins/inspect/plugin-audiovisualizers.xml
index 02c81d7..e51db5a 100644
--- a/docs/plugins/inspect/plugin-audiovisualizers.xml
+++ b/docs/plugins/inspect/plugin-audiovisualizers.xml
@@ -3,7 +3,7 @@
   <description>Creates video visualizations of audio input</description>
   <filename>../../gst/audiovisualizers/.libs/libgstaudiovisualizers.so</filename>
   <basename>libgstaudiovisualizers.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-autoconvert.xml b/docs/plugins/inspect/plugin-autoconvert.xml
index 44271dd..9cefab8 100644
--- a/docs/plugins/inspect/plugin-autoconvert.xml
+++ b/docs/plugins/inspect/plugin-autoconvert.xml
@@ -3,7 +3,7 @@
   <description>Selects convertor element based on caps</description>
   <filename>../../gst/autoconvert/.libs/libgstautoconvert.so</filename>
   <basename>libgstautoconvert.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-bayer.xml b/docs/plugins/inspect/plugin-bayer.xml
index 573200d..6689df2 100644
--- a/docs/plugins/inspect/plugin-bayer.xml
+++ b/docs/plugins/inspect/plugin-bayer.xml
@@ -3,7 +3,7 @@
   <description>Elements to convert Bayer images</description>
   <filename>../../gst/bayer/.libs/libgstbayer.so</filename>
   <basename>libgstbayer.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-bz2.xml b/docs/plugins/inspect/plugin-bz2.xml
index 400396f..31ccde0 100644
--- a/docs/plugins/inspect/plugin-bz2.xml
+++ b/docs/plugins/inspect/plugin-bz2.xml
@@ -3,7 +3,7 @@
   <description>Compress or decompress streams</description>
   <filename>../../ext/bz2/.libs/libgstbz2.so</filename>
   <basename>libgstbz2.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-camerabin.xml b/docs/plugins/inspect/plugin-camerabin.xml
index 5af5025..4fb7261 100644
--- a/docs/plugins/inspect/plugin-camerabin.xml
+++ b/docs/plugins/inspect/plugin-camerabin.xml
@@ -3,7 +3,7 @@
   <description>Take image snapshots and record movies from camera</description>
   <filename>../../gst/camerabin2/.libs/libgstcamerabin2.so</filename>
   <basename>libgstcamerabin2.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-chromaprint.xml b/docs/plugins/inspect/plugin-chromaprint.xml
index c65b366..8ddc3fb 100644
--- a/docs/plugins/inspect/plugin-chromaprint.xml
+++ b/docs/plugins/inspect/plugin-chromaprint.xml
@@ -3,7 +3,7 @@
   <description>Calculate Chromaprint fingerprint from audio files</description>
   <filename>../../ext/chromaprint/.libs/libgstchromaprint.so</filename>
   <basename>libgstchromaprint.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-coloreffects.xml b/docs/plugins/inspect/plugin-coloreffects.xml
index 67ee31d..8c617c1 100644
--- a/docs/plugins/inspect/plugin-coloreffects.xml
+++ b/docs/plugins/inspect/plugin-coloreffects.xml
@@ -3,7 +3,7 @@
   <description>Color Look-up Table filters</description>
   <filename>../../gst/coloreffects/.libs/libgstcoloreffects.so</filename>
   <basename>libgstcoloreffects.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-compositor.xml b/docs/plugins/inspect/plugin-compositor.xml
index de4b36d..1919763 100644
--- a/docs/plugins/inspect/plugin-compositor.xml
+++ b/docs/plugins/inspect/plugin-compositor.xml
@@ -3,7 +3,7 @@
   <description>Compositor</description>
   <filename>../../gst/compositor/.libs/libgstcompositor.so</filename>
   <basename>libgstcompositor.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-curl.xml b/docs/plugins/inspect/plugin-curl.xml
index c528703..937a1e6 100644
--- a/docs/plugins/inspect/plugin-curl.xml
+++ b/docs/plugins/inspect/plugin-curl.xml
@@ -3,7 +3,7 @@
   <description>libcurl-based elements</description>
   <filename>../../ext/curl/.libs/libgstcurl.so</filename>
   <basename>libgstcurl.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-dashdemux.xml b/docs/plugins/inspect/plugin-dashdemux.xml
index 66c110d..3b3fb4e 100644
--- a/docs/plugins/inspect/plugin-dashdemux.xml
+++ b/docs/plugins/inspect/plugin-dashdemux.xml
@@ -3,7 +3,7 @@
   <description>DASH demuxer plugin</description>
   <filename>../../ext/dash/.libs/libgstdashdemux.so</filename>
   <basename>libgstdashdemux.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins</package>
@@ -31,6 +31,12 @@
           <details>ANY</details>
         </caps>
         <caps>
+          <name>subtitle_%02u</name>
+          <direction>source</direction>
+          <presence>sometimes</presence>
+          <details>ANY</details>
+        </caps>
+        <caps>
           <name>video_%02u</name>
           <direction>source</direction>
           <presence>sometimes</presence>
diff --git a/docs/plugins/inspect/plugin-dataurisrc.xml b/docs/plugins/inspect/plugin-dataurisrc.xml
index 6a42b06..ef767d9 100644
--- a/docs/plugins/inspect/plugin-dataurisrc.xml
+++ b/docs/plugins/inspect/plugin-dataurisrc.xml
@@ -3,7 +3,7 @@
   <description>data: URI source</description>
   <filename>../../gst/dataurisrc/.libs/libgstdataurisrc.so</filename>
   <basename>libgstdataurisrc.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-debugutilsbad.xml b/docs/plugins/inspect/plugin-debugutilsbad.xml
index cb6304b..3ceb8e5 100644
--- a/docs/plugins/inspect/plugin-debugutilsbad.xml
+++ b/docs/plugins/inspect/plugin-debugutilsbad.xml
@@ -3,7 +3,7 @@
   <description>Collection of elements that may or may not be useful for debugging</description>
   <filename>../../gst/debugutils/.libs/libgstdebugutilsbad.so</filename>
   <basename>libgstdebugutilsbad.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-decklink.xml b/docs/plugins/inspect/plugin-decklink.xml
index d732843..cc1c762 100644
--- a/docs/plugins/inspect/plugin-decklink.xml
+++ b/docs/plugins/inspect/plugin-decklink.xml
@@ -3,7 +3,7 @@
   <description>Blackmagic Decklink plugin</description>
   <filename>../../sys/decklink/.libs/libgstdecklink.so</filename>
   <basename>libgstdecklink.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-dfbvideosink.xml b/docs/plugins/inspect/plugin-dfbvideosink.xml
index 2e830da..71d30b7 100644
--- a/docs/plugins/inspect/plugin-dfbvideosink.xml
+++ b/docs/plugins/inspect/plugin-dfbvideosink.xml
@@ -3,7 +3,7 @@
   <description>DirectFB video output plugin</description>
   <filename>../../ext/directfb/.libs/libgstdfbvideosink.so</filename>
   <basename>libgstdfbvideosink.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-dtls.xml b/docs/plugins/inspect/plugin-dtls.xml
index fce27d4..d6e61eb 100644
--- a/docs/plugins/inspect/plugin-dtls.xml
+++ b/docs/plugins/inspect/plugin-dtls.xml
@@ -3,7 +3,7 @@
   <description>DTLS decoder and encoder plugins</description>
   <filename>../../ext/dtls/.libs/libgstdtls.so</filename>
   <basename>libgstdtls.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>BSD</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-dtsdec.xml b/docs/plugins/inspect/plugin-dtsdec.xml
index e2509b1..2498439 100644
--- a/docs/plugins/inspect/plugin-dtsdec.xml
+++ b/docs/plugins/inspect/plugin-dtsdec.xml
@@ -3,7 +3,7 @@
   <description>Decodes DTS audio streams</description>
   <filename>../../ext/dts/.libs/libgstdtsdec.so</filename>
   <basename>libgstdtsdec.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>GPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-dvb.xml b/docs/plugins/inspect/plugin-dvb.xml
index eea85df..192620a 100644
--- a/docs/plugins/inspect/plugin-dvb.xml
+++ b/docs/plugins/inspect/plugin-dvb.xml
@@ -3,7 +3,7 @@
   <description>DVB elements</description>
   <filename>../../sys/dvb/.libs/libgstdvb.so</filename>
   <basename>libgstdvb.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-dvbsuboverlay.xml b/docs/plugins/inspect/plugin-dvbsuboverlay.xml
index d2bc937..60406d4 100644
--- a/docs/plugins/inspect/plugin-dvbsuboverlay.xml
+++ b/docs/plugins/inspect/plugin-dvbsuboverlay.xml
@@ -3,7 +3,7 @@
   <description>DVB subtitle renderer</description>
   <filename>../../gst/dvbsuboverlay/.libs/libgstdvbsuboverlay.so</filename>
   <basename>libgstdvbsuboverlay.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-dvdspu.xml b/docs/plugins/inspect/plugin-dvdspu.xml
index 32672a4..24df678 100644
--- a/docs/plugins/inspect/plugin-dvdspu.xml
+++ b/docs/plugins/inspect/plugin-dvdspu.xml
@@ -3,7 +3,7 @@
   <description>DVD Sub-picture Overlay element</description>
   <filename>../../gst/dvdspu/.libs/libgstdvdspu.so</filename>
   <basename>libgstdvdspu.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-faac.xml b/docs/plugins/inspect/plugin-faac.xml
index 1b91088..1a8a21c 100644
--- a/docs/plugins/inspect/plugin-faac.xml
+++ b/docs/plugins/inspect/plugin-faac.xml
@@ -3,7 +3,7 @@
   <description>Free AAC Encoder (FAAC)</description>
   <filename>../../ext/faac/.libs/libgstfaac.so</filename>
   <basename>libgstfaac.so</basename>
-  <version>1.5.0.1</version>
+  <version>1.7.0.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins git</package>
@@ -20,7 +20,7 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 }, channels=(int)[ 1, 6 ]</details>
+          <details>audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 }, channels=(int)1; audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 }, channels=(int)2, channel-mask=(bitmask)0x0000000000000003; audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 }, channels=(int)3, channel-mask=(bitmask)0x0000000000000007; audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 }, channels=(int)4, channel-mask=(bitmask)0x0000000000000107; audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 }, channels=(int)5, channel-mask=(bitmask)0x0000000000000037; audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, 64000, 88200, 96000 }, channels=(int)6, channel-mask=(bitmask)0x000000000000003f</details>
         </caps>
         <caps>
           <name>src</name>
diff --git a/docs/plugins/inspect/plugin-faad.xml b/docs/plugins/inspect/plugin-faad.xml
index 5a39313..87de695 100644
--- a/docs/plugins/inspect/plugin-faad.xml
+++ b/docs/plugins/inspect/plugin-faad.xml
@@ -3,7 +3,7 @@
   <description>Free AAC Decoder (FAAD)</description>
   <filename>../../ext/faad/.libs/libgstfaad.so</filename>
   <basename>libgstfaad.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>GPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-fbdevsink.xml b/docs/plugins/inspect/plugin-fbdevsink.xml
index 1a51e52..a2131a3 100644
--- a/docs/plugins/inspect/plugin-fbdevsink.xml
+++ b/docs/plugins/inspect/plugin-fbdevsink.xml
@@ -3,7 +3,7 @@
   <description>Linux framebuffer video sink</description>
   <filename>../../sys/fbdev/.libs/libgstfbdevsink.so</filename>
   <basename>libgstfbdevsink.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-festival.xml b/docs/plugins/inspect/plugin-festival.xml
index 56a0d91..ab6617c 100644
--- a/docs/plugins/inspect/plugin-festival.xml
+++ b/docs/plugins/inspect/plugin-festival.xml
@@ -3,7 +3,7 @@
   <description>Synthesizes plain text into audio</description>
   <filename>../../gst/festival/.libs/libgstfestival.so</filename>
   <basename>libgstfestival.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-fieldanalysis.xml b/docs/plugins/inspect/plugin-fieldanalysis.xml
index 8df0d37..48ed3f4 100644
--- a/docs/plugins/inspect/plugin-fieldanalysis.xml
+++ b/docs/plugins/inspect/plugin-fieldanalysis.xml
@@ -3,7 +3,7 @@
   <description>Video field analysis</description>
   <filename>../../gst/fieldanalysis/.libs/libgstfieldanalysis.so</filename>
   <basename>libgstfieldanalysis.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer</package>
diff --git a/docs/plugins/inspect/plugin-flite.xml b/docs/plugins/inspect/plugin-flite.xml
index 2b1f73d..b3d1cbb 100644
--- a/docs/plugins/inspect/plugin-flite.xml
+++ b/docs/plugins/inspect/plugin-flite.xml
@@ -3,7 +3,7 @@
   <description>Flite speech synthesizer plugin</description>
   <filename>../../ext/flite/.libs/libgstflite.so</filename>
   <basename>libgstflite.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-fluidsynthmidi.xml b/docs/plugins/inspect/plugin-fluidsynthmidi.xml
index 0ee0b8e..5e8e0d0 100644
--- a/docs/plugins/inspect/plugin-fluidsynthmidi.xml
+++ b/docs/plugins/inspect/plugin-fluidsynthmidi.xml
@@ -3,7 +3,7 @@
   <description>Fluidsynth MIDI Plugin</description>
   <filename>../../ext/fluidsynth/.libs/libgstfluidsynthmidi.so</filename>
   <basename>libgstfluidsynthmidi.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-freeverb.xml b/docs/plugins/inspect/plugin-freeverb.xml
index 56971a3..0adcede 100644
--- a/docs/plugins/inspect/plugin-freeverb.xml
+++ b/docs/plugins/inspect/plugin-freeverb.xml
@@ -3,7 +3,7 @@
   <description>Reverberation/room effect</description>
   <filename>../../gst/freeverb/.libs/libgstfreeverb.so</filename>
   <basename>libgstfreeverb.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-frei0r.xml b/docs/plugins/inspect/plugin-frei0r.xml
index 591f45c..e05fece 100644
--- a/docs/plugins/inspect/plugin-frei0r.xml
+++ b/docs/plugins/inspect/plugin-frei0r.xml
@@ -3,7 +3,7 @@
   <description>frei0r plugin library</description>
   <filename>../../gst/frei0r/.libs/libgstfrei0r.so</filename>
   <basename>libgstfrei0r.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-gaudieffects.xml b/docs/plugins/inspect/plugin-gaudieffects.xml
index e7c4de8..5969f03 100644
--- a/docs/plugins/inspect/plugin-gaudieffects.xml
+++ b/docs/plugins/inspect/plugin-gaudieffects.xml
@@ -3,7 +3,7 @@
   <description>Gaudi video effects.</description>
   <filename>../../gst/gaudieffects/.libs/libgstgaudieffects.so</filename>
   <basename>libgstgaudieffects.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer</package>
diff --git a/docs/plugins/inspect/plugin-gdp.xml b/docs/plugins/inspect/plugin-gdp.xml
index bfc65da..1687c20 100644
--- a/docs/plugins/inspect/plugin-gdp.xml
+++ b/docs/plugins/inspect/plugin-gdp.xml
@@ -3,7 +3,7 @@
   <description>Payload/depayload GDP packets</description>
   <filename>../../gst/gdp/.libs/libgstgdp.so</filename>
   <basename>libgstgdp.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-geometrictransform.xml b/docs/plugins/inspect/plugin-geometrictransform.xml
index 5b46454..2c4599f 100644
--- a/docs/plugins/inspect/plugin-geometrictransform.xml
+++ b/docs/plugins/inspect/plugin-geometrictransform.xml
@@ -3,7 +3,7 @@
   <description>Various geometric image transform elements</description>
   <filename>../../gst/geometrictransform/.libs/libgstgeometrictransform.so</filename>
   <basename>libgstgeometrictransform.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-gmedec.xml b/docs/plugins/inspect/plugin-gmedec.xml
index a305d6c..881ff6e 100644
--- a/docs/plugins/inspect/plugin-gmedec.xml
+++ b/docs/plugins/inspect/plugin-gmedec.xml
@@ -3,7 +3,7 @@
   <description>GME Audio Decoder</description>
   <filename>../../ext/gme/.libs/libgstgme.so</filename>
   <basename>libgstgme.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-gsm.xml b/docs/plugins/inspect/plugin-gsm.xml
index 5e345dc..e702d25 100644
--- a/docs/plugins/inspect/plugin-gsm.xml
+++ b/docs/plugins/inspect/plugin-gsm.xml
@@ -3,7 +3,7 @@
   <description>GSM encoder/decoder</description>
   <filename>../../ext/gsm/.libs/libgstgsm.so</filename>
   <basename>libgstgsm.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-gstgtk.xml b/docs/plugins/inspect/plugin-gstgtk.xml
index 7b983d4..d920cd7 100644
--- a/docs/plugins/inspect/plugin-gstgtk.xml
+++ b/docs/plugins/inspect/plugin-gstgtk.xml
@@ -3,7 +3,7 @@
   <description>Gtk+ sink</description>
   <filename>../../ext/gtk/.libs/libgstgtksink.so</filename>
   <basename>libgstgtksink.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-gstsiren.xml b/docs/plugins/inspect/plugin-gstsiren.xml
index 29f8072..201e957 100644
--- a/docs/plugins/inspect/plugin-gstsiren.xml
+++ b/docs/plugins/inspect/plugin-gstsiren.xml
@@ -3,7 +3,7 @@
   <description>Siren encoder/decoder/payloader/depayloader plugins</description>
   <filename>../../gst/siren/.libs/libgstsiren.so</filename>
   <basename>libgstsiren.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-fragmented.xml b/docs/plugins/inspect/plugin-hls.xml
similarity index 83%
rename from docs/plugins/inspect/plugin-fragmented.xml
rename to docs/plugins/inspect/plugin-hls.xml
index 687e9a8..b1f2475 100644
--- a/docs/plugins/inspect/plugin-fragmented.xml
+++ b/docs/plugins/inspect/plugin-hls.xml
@@ -1,13 +1,13 @@
 <plugin>
-  <name>fragmented</name>
-  <description>Fragmented streaming plugins</description>
-  <filename>../../ext/hls/.libs/libgstfragmented.so</filename>
-  <basename>libgstfragmented.so</basename>
-  <version>1.6.2</version>
+  <name>hls</name>
+  <description>HTTP Live Streaming (HLS)</description>
+  <filename>../../ext/hls/.libs/libgsthls.so</filename>
+  <basename>libgsthls.so</basename>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins</package>
-  <origin>http://www.gstreamer.org/</origin>
+  <origin>Unknown package origin</origin>
   <elements>
     <element>
       <name>hlsdemux</name>
diff --git a/docs/plugins/inspect/plugin-id3tag.xml b/docs/plugins/inspect/plugin-id3tag.xml
index 8932eda..3892dbf 100644
--- a/docs/plugins/inspect/plugin-id3tag.xml
+++ b/docs/plugins/inspect/plugin-id3tag.xml
@@ -3,7 +3,7 @@
   <description>ID3 v1 and v2 muxing plugin</description>
   <filename>../../gst/id3tag/.libs/libgstid3tag.so</filename>
   <basename>libgstid3tag.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-inter.xml b/docs/plugins/inspect/plugin-inter.xml
index 79f813f..dba74e6 100644
--- a/docs/plugins/inspect/plugin-inter.xml
+++ b/docs/plugins/inspect/plugin-inter.xml
@@ -3,7 +3,7 @@
   <description>plugin for inter-pipeline communication</description>
   <filename>../../gst/inter/.libs/libgstinter.so</filename>
   <basename>libgstinter.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-interlace.xml b/docs/plugins/inspect/plugin-interlace.xml
index 7346bcf..0672d82 100644
--- a/docs/plugins/inspect/plugin-interlace.xml
+++ b/docs/plugins/inspect/plugin-interlace.xml
@@ -3,7 +3,7 @@
   <description>Create an interlaced video stream</description>
   <filename>../../gst/interlace/.libs/libgstinterlace.so</filename>
   <basename>libgstinterlace.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-ivfparse.xml b/docs/plugins/inspect/plugin-ivfparse.xml
index fe47977..d0318a8 100644
--- a/docs/plugins/inspect/plugin-ivfparse.xml
+++ b/docs/plugins/inspect/plugin-ivfparse.xml
@@ -3,7 +3,7 @@
   <description>IVF parser</description>
   <filename>../../gst/ivfparse/.libs/libgstivfparse.so</filename>
   <basename>libgstivfparse.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-ivtc.xml b/docs/plugins/inspect/plugin-ivtc.xml
index 0e09701..6f7c51c 100644
--- a/docs/plugins/inspect/plugin-ivtc.xml
+++ b/docs/plugins/inspect/plugin-ivtc.xml
@@ -3,7 +3,7 @@
   <description>Inverse Telecine</description>
   <filename>../../gst/ivtc/.libs/libgstivtc.so</filename>
   <basename>libgstivtc.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-jp2kdecimator.xml b/docs/plugins/inspect/plugin-jp2kdecimator.xml
index d6aa30d..747864a 100644
--- a/docs/plugins/inspect/plugin-jp2kdecimator.xml
+++ b/docs/plugins/inspect/plugin-jp2kdecimator.xml
@@ -3,7 +3,7 @@
   <description>JPEG2000 decimator</description>
   <filename>../../gst/jp2kdecimator/.libs/libgstjp2kdecimator.so</filename>
   <basename>libgstjp2kdecimator.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-jpegformat.xml b/docs/plugins/inspect/plugin-jpegformat.xml
index 2b8d11a..7d6092c 100644
--- a/docs/plugins/inspect/plugin-jpegformat.xml
+++ b/docs/plugins/inspect/plugin-jpegformat.xml
@@ -3,7 +3,7 @@
   <description>JPEG interchange format plugin</description>
   <filename>../../gst/jpegformat/.libs/libgstjpegformat.so</filename>
   <basename>libgstjpegformat.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-kate.xml b/docs/plugins/inspect/plugin-kate.xml
index 0b50320..581c1fe 100644
--- a/docs/plugins/inspect/plugin-kate.xml
+++ b/docs/plugins/inspect/plugin-kate.xml
@@ -3,7 +3,7 @@
   <description>Kate plugin</description>
   <filename>../../ext/kate/.libs/libgstkate.so</filename>
   <basename>libgstkate.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-ladspa.xml b/docs/plugins/inspect/plugin-ladspa.xml
index 1f79d4c..5334d1f 100644
--- a/docs/plugins/inspect/plugin-ladspa.xml
+++ b/docs/plugins/inspect/plugin-ladspa.xml
@@ -3,7 +3,7 @@
   <description>LADSPA plugin</description>
   <filename>../../ext/ladspa/.libs/libgstladspa.so</filename>
   <basename>libgstladspa.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-libde265.xml b/docs/plugins/inspect/plugin-libde265.xml
index 35b4a55..d0d1904 100644
--- a/docs/plugins/inspect/plugin-libde265.xml
+++ b/docs/plugins/inspect/plugin-libde265.xml
@@ -3,7 +3,7 @@
   <description>HEVC/H.265 decoder using libde265</description>
   <filename>../../ext/libde265/.libs/libgstlibde265.so</filename>
   <basename>libgstlibde265.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-liveadder.xml b/docs/plugins/inspect/plugin-liveadder.xml
deleted file mode 100644
index 06005bf..0000000
--- a/docs/plugins/inspect/plugin-liveadder.xml
+++ /dev/null
@@ -1,34 +0,0 @@
-<plugin>
-  <name>liveadder</name>
-  <description>Adds multiple live discontinuous streams</description>
-  <filename>../../gst/liveadder/.libs/libgstliveadder.so</filename>
-  <basename>libgstliveadder.so</basename>
-  <version>1.6.2</version>
-  <license>LGPL</license>
-  <source>gst-plugins-bad</source>
-  <package>GStreamer Bad Plug-ins source release</package>
-  <origin>Unknown package origin</origin>
-  <elements>
-    <element>
-      <name>liveadder</name>
-      <longname>Live Adder element</longname>
-      <class>Generic/Audio</class>
-      <description>Mixes live/discontinuous audio streams</description>
-      <author>Olivier Crete &lt;olivier.crete@collabora.co.uk&gt;</author>
-      <pads>
-        <caps>
-          <name>sink_%u</name>
-          <direction>sink</direction>
-          <presence>request</presence>
-          <details>audio/x-raw, format=(string){ S8, U8, S16LE, U16LE, S32LE, U32LE, F32LE, F64LE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</details>
-        </caps>
-        <caps>
-          <name>src</name>
-          <direction>source</direction>
-          <presence>always</presence>
-          <details>audio/x-raw, format=(string){ S8, U8, S16LE, U16LE, S32LE, U32LE, F32LE, F64LE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</details>
-        </caps>
-      </pads>
-    </element>
-  </elements>
-</plugin>
\ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-midi.xml b/docs/plugins/inspect/plugin-midi.xml
index 33b7ea1..eb1c653 100644
--- a/docs/plugins/inspect/plugin-midi.xml
+++ b/docs/plugins/inspect/plugin-midi.xml
@@ -3,7 +3,7 @@
   <description>Parse MIDI files</description>
   <filename>../../gst/midi/.libs/libgstmidi.so</filename>
   <basename>libgstmidi.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-mimic.xml b/docs/plugins/inspect/plugin-mimic.xml
index 03e05ab..429f3ea 100644
--- a/docs/plugins/inspect/plugin-mimic.xml
+++ b/docs/plugins/inspect/plugin-mimic.xml
@@ -3,7 +3,7 @@
   <description>Mimic codec</description>
   <filename>../../ext/mimic/.libs/libgstmimic.so</filename>
   <basename>libgstmimic.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-mms.xml b/docs/plugins/inspect/plugin-mms.xml
index 9f7817e..7e5bba2 100644
--- a/docs/plugins/inspect/plugin-mms.xml
+++ b/docs/plugins/inspect/plugin-mms.xml
@@ -3,7 +3,7 @@
   <description>Microsoft Multi Media Server streaming protocol support</description>
   <filename>../../ext/libmms/.libs/libgstmms.so</filename>
   <basename>libgstmms.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-modplug.xml b/docs/plugins/inspect/plugin-modplug.xml
index c66ea78..b1ad224 100644
--- a/docs/plugins/inspect/plugin-modplug.xml
+++ b/docs/plugins/inspect/plugin-modplug.xml
@@ -3,7 +3,7 @@
   <description>.MOD audio decoding</description>
   <filename>../../ext/modplug/.libs/libgstmodplug.so</filename>
   <basename>libgstmodplug.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-mpeg2enc.xml b/docs/plugins/inspect/plugin-mpeg2enc.xml
index eb4ad07..00c040f 100644
--- a/docs/plugins/inspect/plugin-mpeg2enc.xml
+++ b/docs/plugins/inspect/plugin-mpeg2enc.xml
@@ -3,7 +3,7 @@
   <description>High-quality MPEG-1/2 video encoder</description>
   <filename>../../ext/mpeg2enc/.libs/libgstmpeg2enc.so</filename>
   <basename>libgstmpeg2enc.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>GPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-mpegpsdemux.xml b/docs/plugins/inspect/plugin-mpegpsdemux.xml
index 6d1c9b5..dc5323c 100644
--- a/docs/plugins/inspect/plugin-mpegpsdemux.xml
+++ b/docs/plugins/inspect/plugin-mpegpsdemux.xml
@@ -3,7 +3,7 @@
   <description>MPEG-PS demuxer</description>
   <filename>../../gst/mpegdemux/.libs/libgstmpegpsdemux.so</filename>
   <basename>libgstmpegpsdemux.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>unknown</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-mpegpsmux.xml b/docs/plugins/inspect/plugin-mpegpsmux.xml
index 477fa26..9ac3419 100644
--- a/docs/plugins/inspect/plugin-mpegpsmux.xml
+++ b/docs/plugins/inspect/plugin-mpegpsmux.xml
@@ -3,7 +3,7 @@
   <description>MPEG-PS muxer</description>
   <filename>../../gst/mpegpsmux/.libs/libgstmpegpsmux.so</filename>
   <basename>libgstmpegpsmux.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-mpegtsdemux.xml b/docs/plugins/inspect/plugin-mpegtsdemux.xml
index 275e68b..582c551 100644
--- a/docs/plugins/inspect/plugin-mpegtsdemux.xml
+++ b/docs/plugins/inspect/plugin-mpegtsdemux.xml
@@ -3,7 +3,7 @@
   <description>MPEG TS demuxer</description>
   <filename>../../gst/mpegtsdemux/.libs/libgstmpegtsdemux.so</filename>
   <basename>libgstmpegtsdemux.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
@@ -27,7 +27,7 @@
           <name>audio_%04x</name>
           <direction>source</direction>
           <presence>sometimes</presence>
-          <details>audio/mpeg, mpegversion=(int)1; audio/mpeg, mpegversion=(int)2, stream-format=(string)adts; audio/mpeg, mpegversion=(int)4, stream-format=(string)loas; audio/x-lpcm, width=(int){ 16, 20, 24 }, rate=(int){ 48000, 96000 }, channels=(int)[ 1, 8 ], dynamic_range=(int)[ 0, 255 ], emphasis=(boolean){ false, true }, mute=(boolean){ false, true }; audio/x-ac3; audio/x-eac3; audio/x-dts; audio/x-private-ts-lpcm</details>
+          <details>audio/mpeg, mpegversion=(int)1; audio/mpeg, mpegversion=(int)2, stream-format=(string)adts; audio/mpeg, mpegversion=(int)4, stream-format=(string)loas; audio/x-lpcm, width=(int){ 16, 20, 24 }, rate=(int){ 48000, 96000 }, channels=(int)[ 1, 8 ], dynamic_range=(int)[ 0, 255 ], emphasis=(boolean){ false, true }, mute=(boolean){ false, true }; audio/x-ac3; audio/x-eac3; audio/x-dts; audio/x-opus; audio/x-private-ts-lpcm</details>
         </caps>
         <caps>
           <name>private_%04x</name>
@@ -39,7 +39,7 @@
           <name>subpicture_%04x</name>
           <direction>source</direction>
           <presence>sometimes</presence>
-          <details>subpicture/x-pgs; subpicture/x-dvd</details>
+          <details>subpicture/x-pgs; subpicture/x-dvd; subpicture/x-dvb</details>
         </caps>
         <caps>
           <name>video_%04x</name>
diff --git a/docs/plugins/inspect/plugin-mpegtsmux.xml b/docs/plugins/inspect/plugin-mpegtsmux.xml
index e90205a..29385f8 100644
--- a/docs/plugins/inspect/plugin-mpegtsmux.xml
+++ b/docs/plugins/inspect/plugin-mpegtsmux.xml
@@ -3,7 +3,7 @@
   <description>MPEG-TS muxer</description>
   <filename>../../gst/mpegtsmux/.libs/libgstmpegtsmux.so</filename>
   <basename>libgstmpegtsmux.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
@@ -20,7 +20,7 @@
           <name>sink_%d</name>
           <direction>sink</direction>
           <presence>request</presence>
-          <details>video/mpeg, parsed=(boolean)true, mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false; video/x-dirac; video/x-h264, stream-format=(string)byte-stream, alignment=(string){ au, nal }; audio/mpeg, parsed=(boolean)true, mpegversion=(int){ 1, 2 }; audio/mpeg, framed=(boolean)true, mpegversion=(int)4, stream-format=(string)adts; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw; audio/x-lpcm, width=(int){ 16, 20, 24 }, rate=(int){ 48000, 96000 }, channels=(int)[ 1, 8 ], dynamic_range=(int)[ 0, 255 ], emphasis=(boolean){ false, true }, mute=(boolean){ false, true }; audio/x-ac3, framed=(boolean)true; audio/x-dts, framed=(boolean)true; subpicture/x-dvb; application/x-teletext; meta/x-klv, parsed=(boolean)true</details>
+          <details>video/mpeg, parsed=(boolean)true, mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false; video/x-dirac; video/x-h264, stream-format=(string)byte-stream, alignment=(string){ au, nal }; audio/mpeg, parsed=(boolean)true, mpegversion=(int){ 1, 2 }; audio/mpeg, framed=(boolean)true, mpegversion=(int)4, stream-format=(string)adts; audio/mpeg, mpegversion=(int)4, stream-format=(string)raw; audio/x-lpcm, width=(int){ 16, 20, 24 }, rate=(int){ 48000, 96000 }, channels=(int)[ 1, 8 ], dynamic_range=(int)[ 0, 255 ], emphasis=(boolean){ false, true }, mute=(boolean){ false, true }; audio/x-ac3, framed=(boolean)true; audio/x-dts, framed=(boolean)true; audio/x-opus, channels=(int)[ 1, 8 ], channel-mapping-family=(int){ 0, 1 }; subpicture/x-dvb; application/x-teletext; meta/x-klv, parsed=(boolean)true</details>
         </caps>
         <caps>
           <name>src</name>
diff --git a/docs/plugins/inspect/plugin-mpg123.xml b/docs/plugins/inspect/plugin-mpg123.xml
index 7dfd782..3d0005b 100644
--- a/docs/plugins/inspect/plugin-mpg123.xml
+++ b/docs/plugins/inspect/plugin-mpg123.xml
@@ -3,7 +3,7 @@
   <description>mp3 decoding based on the mpg123 library</description>
   <filename>../../ext/mpg123/.libs/libgstmpg123.so</filename>
   <basename>libgstmpg123.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-mplex.xml b/docs/plugins/inspect/plugin-mplex.xml
index 27ea111..e8be8ee 100644
--- a/docs/plugins/inspect/plugin-mplex.xml
+++ b/docs/plugins/inspect/plugin-mplex.xml
@@ -3,7 +3,7 @@
   <description>High-quality MPEG/DVD/SVCD/VCD video/audio multiplexer</description>
   <filename>../../ext/mplex/.libs/libgstmplex.so</filename>
   <basename>libgstmplex.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>GPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-mxf.xml b/docs/plugins/inspect/plugin-mxf.xml
index 609789d..6eb16a2 100644
--- a/docs/plugins/inspect/plugin-mxf.xml
+++ b/docs/plugins/inspect/plugin-mxf.xml
@@ -3,7 +3,7 @@
   <description>MXF plugin library</description>
   <filename>../../gst/mxf/.libs/libgstmxf.so</filename>
   <basename>libgstmxf.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
@@ -30,5 +30,68 @@
         </caps>
       </pads>
     </element>
+    <element>
+      <name>mxfmux</name>
+      <longname>MXF muxer</longname>
+      <class>Codec/Muxer</class>
+      <description>Muxes video/audio streams into a MXF stream</description>
+      <author>Sebastian Dröge &lt;sebastian.droege@collabora.co.uk&gt;</author>
+      <pads>
+        <caps>
+          <name>alaw_audio_sink_%u</name>
+          <direction>sink</direction>
+          <presence>request</presence>
+          <details>audio/x-alaw, rate=(int)[ 8000, 192000 ], channels=(int)[ 1, 2 ]</details>
+        </caps>
+        <caps>
+          <name>bwf_audio_sink_%u</name>
+          <direction>sink</direction>
+          <presence>request</presence>
+          <details>audio/x-raw, format=(string)S32LE, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw, format=(string)S32BE, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw, format=(string)S24LE, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw, format=(string)S24BE, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw, format=(string)S16LE, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw, format=(string)S16BE, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]; audio/x-raw, format=(string)U8, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</details>
+        </caps>
+        <caps>
+          <name>dv_dif_video_sink_%u</name>
+          <direction>sink</direction>
+          <presence>request</presence>
+          <details>video/x-dv, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], systemstream=(boolean)true</details>
+        </caps>
+        <caps>
+          <name>jpeg2000_video_sink_%u</name>
+          <direction>sink</direction>
+          <presence>request</presence>
+          <details>image/x-jpc, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], colorspace=(string){ sRGB, sYUV }</details>
+        </caps>
+        <caps>
+          <name>mpeg_audio_sink_%u</name>
+          <direction>sink</direction>
+          <presence>request</presence>
+          <details>audio/mpeg, mpegversion=(int)1, layer=(int)[ 1, 3 ], rate=(int)[ 8000, 48000 ], channels=(int)[ 1, 2 ], parsed=(boolean)true; audio/x-ac3, rate=(int)[ 4000, 96000 ], channels=(int)[ 1, 6 ]; audio/mpeg, mpegversion=(int)2, rate=(int)[ 8000, 96000 ], channels=(int)[ 1, 8 ]</details>
+        </caps>
+        <caps>
+          <name>mpeg_video_sink_%u</name>
+          <direction>sink</direction>
+          <presence>request</presence>
+          <details>video/mpeg, mpegversion=(int){ 1, 2, 4 }, systemstream=(boolean)false, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-h264, stream-format=(string)byte-stream, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+        </caps>
+        <caps>
+          <name>up_video_sink_%u</name>
+          <direction>sink</direction>
+          <presence>request</presence>
+          <details>video/x-raw, format=(string)RGB, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string)BGR, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string)RGBx, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string)xRGB, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string)BGRx, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string)xBGR, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string)ARGB, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string)ABGR, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string)BGRA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string)AYUV, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string)v308, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string)UYVY, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string)YUY2, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+        </caps>
+        <caps>
+          <name>vc3_video_sink_%u</name>
+          <direction>sink</direction>
+          <presence>request</presence>
+          <details>video/x-dnxhd, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+        </caps>
+        <caps>
+          <name>src</name>
+          <direction>source</direction>
+          <presence>always</presence>
+          <details>application/mxf</details>
+        </caps>
+      </pads>
+    </element>
   </elements>
 </plugin>
\ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-neon.xml b/docs/plugins/inspect/plugin-neon.xml
index de2ce6b..c53fcd4 100644
--- a/docs/plugins/inspect/plugin-neon.xml
+++ b/docs/plugins/inspect/plugin-neon.xml
@@ -3,7 +3,7 @@
   <description>lib neon http client src</description>
   <filename>../../ext/neon/.libs/libgstneonhttpsrc.so</filename>
   <basename>libgstneonhttpsrc.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-ofa.xml b/docs/plugins/inspect/plugin-ofa.xml
index 81acd7b..2a176dd 100644
--- a/docs/plugins/inspect/plugin-ofa.xml
+++ b/docs/plugins/inspect/plugin-ofa.xml
@@ -3,7 +3,7 @@
   <description>Calculate MusicIP fingerprint from audio files</description>
   <filename>../../ext/ofa/.libs/libgstofa.so</filename>
   <basename>libgstofa.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>GPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-openal.xml b/docs/plugins/inspect/plugin-openal.xml
index 66bfe0b..fd8e61b 100644
--- a/docs/plugins/inspect/plugin-openal.xml
+++ b/docs/plugins/inspect/plugin-openal.xml
@@ -3,7 +3,7 @@
   <description>OpenAL plugin library</description>
   <filename>../../ext/openal/.libs/libgstopenal.so</filename>
   <basename>libgstopenal.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-opencv.xml b/docs/plugins/inspect/plugin-opencv.xml
index b448c46..2af2837 100644
--- a/docs/plugins/inspect/plugin-opencv.xml
+++ b/docs/plugins/inspect/plugin-opencv.xml
@@ -3,7 +3,7 @@
   <description>GStreamer OpenCV Plugins</description>
   <filename>../../ext/opencv/.libs/libgstopencv.so</filename>
   <basename>libgstopencv.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-openexr.xml b/docs/plugins/inspect/plugin-openexr.xml
index 8786c33..f26c022 100644
--- a/docs/plugins/inspect/plugin-openexr.xml
+++ b/docs/plugins/inspect/plugin-openexr.xml
@@ -3,7 +3,7 @@
   <description>OpenEXR image plugin</description>
   <filename>../../ext/openexr/.libs/libgstopenexr.so</filename>
   <basename>libgstopenexr.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-opengl.xml b/docs/plugins/inspect/plugin-opengl.xml
index 3630f53..b109778 100644
--- a/docs/plugins/inspect/plugin-opengl.xml
+++ b/docs/plugins/inspect/plugin-opengl.xml
@@ -3,7 +3,7 @@
   <description>OpenGL plugin</description>
   <filename>../../ext/gl/.libs/libgstopengl.so</filename>
   <basename>libgstopengl.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
@@ -20,13 +20,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE, RGB16, BGR16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:GLMemory, meta:GstVideoOverlayComposition), format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE, RGB16, BGR16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string){ RGBA, RGB, RGBx, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE, RGB16, BGR16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string){ 2D, rectangle, external-oes }; video/x-raw(memory:GLMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, RGB, RGBx, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE, RGB16, BGR16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string){ 2D, rectangle, external-oes }</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE, RGB16, BGR16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:GLMemory, meta:GstVideoOverlayComposition), format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE, RGB16, BGR16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string){ RGBA, RGB, RGBx, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE, RGB16, BGR16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string){ 2D, rectangle, external-oes }; video/x-raw(memory:GLMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, RGB, RGBx, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE, RGB16, BGR16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string){ 2D, rectangle, external-oes }</details>
         </caps>
       </pads>
     </element>
@@ -35,19 +35,20 @@
       <longname>OpenGL color scale</longname>
       <class>Filter/Effect/Video</class>
       <description>Colorspace converter and video scaler</description>
-      <author>Julien Isorce &lt;julien.isorce@gmail.com&gt;</author>
+      <author>Julien Isorce &lt;julien.isorce@gmail.com&gt;
+Matthew Waters &lt;matthew@centricular.com&gt;</author>
       <pads>
         <caps>
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -62,13 +63,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -83,13 +84,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -125,13 +126,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -146,13 +147,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -167,13 +168,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -188,13 +189,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -209,13 +210,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -230,13 +231,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -251,13 +252,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -272,13 +273,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -293,13 +294,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -314,13 +315,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -335,13 +336,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -356,13 +357,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -377,13 +378,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -398,13 +399,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -419,13 +420,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -440,13 +441,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -461,13 +462,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -482,13 +483,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -503,13 +504,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -524,13 +525,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -545,13 +546,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -566,7 +567,7 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:GLMemory), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:GLMemory), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
@@ -587,13 +588,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -608,13 +609,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -629,7 +630,7 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:GLMemory), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:GLMemory), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
@@ -644,7 +645,7 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:GLMemory, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string){ 2D, external-oes }; video/x-raw(memory:GLMemory, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string){ 2D, external-oes }</details>
         </caps>
       </pads>
     </element>
@@ -659,7 +660,7 @@
           <name>sink_%u</name>
           <direction>sink</direction>
           <presence>request</presence>
-          <details>video/x-raw(memory:GLMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:GLMemory), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:GLMemory), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
@@ -701,13 +702,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -715,20 +716,20 @@
       <name>glshader</name>
       <longname>OpenGL fragment shader filter</longname>
       <class>Filter/Effect</class>
-      <description>Load GLSL fragment shader from file</description>
-      <author>&lt;luc.deschenaux@freesurf.ch&gt;</author>
+      <description>Perform operations with a GLSL shader</description>
+      <author>&lt;matthew@centricular.com&gt;</author>
       <pads>
         <caps>
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -743,7 +744,7 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:GLMemory), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:GLMemory), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
@@ -773,13 +774,13 @@
           <name>sink_%u</name>
           <direction>sink</direction>
           <presence>request</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE, RGB16, BGR16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGBA, RGB, RGBx, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE, RGB16, BGR16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE, RGB16, BGR16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGBA, RGB, RGBx, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE, RGB16, BGR16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
       </pads>
     </element>
@@ -795,7 +796,7 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE, RGB16, BGR16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGBA, RGB, RGBx, BGR, BGRx, BGRA, xRGB, xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, Y41B, NV12, NV21, YUY2, UYVY, AYUV, GRAY8, GRAY16_LE, GRAY16_BE, RGB16, BGR16 }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>left</name>
@@ -822,7 +823,7 @@
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
@@ -837,7 +838,7 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:GLMemory), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:GLMemory), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
@@ -858,7 +859,7 @@
           <name>sink_%u</name>
           <direction>sink</direction>
           <presence>request</presence>
-          <details>video/x-raw(memory:GLMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:GLMemory), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:SystemMemory, meta:GstVideoOverlayComposition), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta, meta:GstVideoOverlayComposition), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:GLMemory), format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(memory:EGLImage), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw, format=(string){ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, GRAY8, GRAY16_LE, GRAY16_BE }, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; video/x-raw(meta:GstVideoGLTextureUploadMeta), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
         </caps>
         <caps>
           <name>src</name>
@@ -901,13 +902,13 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
         <caps>
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]</details>
+          <details>video/x-raw(memory:GLMemory), format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ], texture-target=(string)2D</details>
         </caps>
       </pads>
     </element>
diff --git a/docs/plugins/inspect/plugin-openh264.xml b/docs/plugins/inspect/plugin-openh264.xml
index cd5b089..832e398 100644
--- a/docs/plugins/inspect/plugin-openh264.xml
+++ b/docs/plugins/inspect/plugin-openh264.xml
@@ -3,7 +3,7 @@
   <description>OpenH264 encoder/decoder plugin</description>
   <filename>../../ext/openh264/.libs/libgstopenh264.so</filename>
   <basename>libgstopenh264.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>BSD</license>
   <source>gst-plugins-bad</source>
   <package>OpenWebRTC GStreamer plugins</package>
diff --git a/docs/plugins/inspect/plugin-openjpeg.xml b/docs/plugins/inspect/plugin-openjpeg.xml
index a6c819a..a343126 100644
--- a/docs/plugins/inspect/plugin-openjpeg.xml
+++ b/docs/plugins/inspect/plugin-openjpeg.xml
@@ -3,7 +3,7 @@
   <description>OpenJPEG-based JPEG2000 image decoder/encoder</description>
   <filename>../../ext/openjpeg/.libs/libgstopenjpeg.so</filename>
   <basename>libgstopenjpeg.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-opus.xml b/docs/plugins/inspect/plugin-opus.xml
index 1f9ad6f..3f050db 100644
--- a/docs/plugins/inspect/plugin-opus.xml
+++ b/docs/plugins/inspect/plugin-opus.xml
@@ -3,7 +3,7 @@
   <description>OPUS plugin library</description>
   <filename>../../ext/opus/.libs/libgstopus.so</filename>
   <basename>libgstopus.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
@@ -20,7 +20,7 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>audio/x-opus</details>
+          <details>audio/x-opus, channel-mapping-family=(int)0; audio/x-opus, channel-mapping-family=(int)[ 1, 255 ], channels=(int)[ 1, 255 ], stream-count=(int)[ 1, 255 ], coupled-count=(int)[ 0, 255 ]</details>
         </caps>
         <caps>
           <name>src</name>
@@ -41,7 +41,7 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int)48000, channels=(int)[ 1, 2 ]; audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 8000, 12000, 16000, 24000 }, channels=(int)[ 1, 2 ]</details>
+          <details>audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int)48000, channels=(int)[ 1, 8 ]; audio/x-raw, format=(string)S16LE, layout=(string)interleaved, rate=(int){ 8000, 12000, 16000, 24000 }, channels=(int)[ 1, 8 ]</details>
         </caps>
         <caps>
           <name>src</name>
@@ -89,7 +89,7 @@
           <name>src</name>
           <direction>source</direction>
           <presence>always</presence>
-          <details>audio/x-opus, multistream=(boolean)false</details>
+          <details>audio/x-opus, channel-mapping-family=(int)0</details>
         </caps>
       </pads>
     </element>
@@ -104,7 +104,7 @@
           <name>sink</name>
           <direction>sink</direction>
           <presence>always</presence>
-          <details>audio/x-opus, multistream=(boolean)false</details>
+          <details>audio/x-opus, channels=(int)[ 1, 2 ], channel-mapping-family=(int)0</details>
         </caps>
         <caps>
           <name>src</name>
diff --git a/docs/plugins/inspect/plugin-pcapparse.xml b/docs/plugins/inspect/plugin-pcapparse.xml
index fe701f1..53791b2 100644
--- a/docs/plugins/inspect/plugin-pcapparse.xml
+++ b/docs/plugins/inspect/plugin-pcapparse.xml
@@ -3,7 +3,7 @@
   <description>Element parsing raw pcap streams</description>
   <filename>../../gst/pcapparse/.libs/libgstpcapparse.so</filename>
   <basename>libgstpcapparse.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer</package>
diff --git a/docs/plugins/inspect/plugin-pnm.xml b/docs/plugins/inspect/plugin-pnm.xml
index 8f3a3e5..89eff8d 100644
--- a/docs/plugins/inspect/plugin-pnm.xml
+++ b/docs/plugins/inspect/plugin-pnm.xml
@@ -3,7 +3,7 @@
   <description>PNM plugin</description>
   <filename>../../gst/pnm/.libs/libgstpnm.so</filename>
   <basename>libgstpnm.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-qt.xml b/docs/plugins/inspect/plugin-qt.xml
index cf418a3..b44e97e 100644
--- a/docs/plugins/inspect/plugin-qt.xml
+++ b/docs/plugins/inspect/plugin-qt.xml
@@ -1,9 +1,9 @@
 <plugin>
   <name>qt</name>
   <description>Qt sink</description>
-  <filename>../../ext/qt/.libs/libqtsink.so</filename>
-  <basename>libqtsink.so</basename>
-  <version>1.6.2</version>
+  <filename>../../ext/qt/.libs/libgstqtsink.so</filename>
+  <basename>libgstqtsink.so</basename>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-rawparse.xml b/docs/plugins/inspect/plugin-rawparse.xml
index a86476c..77e9ec3 100644
--- a/docs/plugins/inspect/plugin-rawparse.xml
+++ b/docs/plugins/inspect/plugin-rawparse.xml
@@ -3,7 +3,7 @@
   <description>Parses byte streams into raw frames</description>
   <filename>../../gst/rawparse/.libs/libgstrawparse.so</filename>
   <basename>libgstrawparse.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-removesilence.xml b/docs/plugins/inspect/plugin-removesilence.xml
index 51be950..6d9fcde 100644
--- a/docs/plugins/inspect/plugin-removesilence.xml
+++ b/docs/plugins/inspect/plugin-removesilence.xml
@@ -3,7 +3,7 @@
   <description>Removes silence from an audio stream</description>
   <filename>../../gst/removesilence/.libs/libgstremovesilence.so</filename>
   <basename>libgstremovesilence.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-resindvd.xml b/docs/plugins/inspect/plugin-resindvd.xml
index efccb7d..b7ed305 100644
--- a/docs/plugins/inspect/plugin-resindvd.xml
+++ b/docs/plugins/inspect/plugin-resindvd.xml
@@ -3,7 +3,7 @@
   <description>Resin DVD playback elements</description>
   <filename>../../ext/resindvd/.libs/libgstresindvd.so</filename>
   <basename>libgstresindvd.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>GPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer</package>
diff --git a/docs/plugins/inspect/plugin-rfbsrc.xml b/docs/plugins/inspect/plugin-rfbsrc.xml
index 82b0c8c..e4243cb 100644
--- a/docs/plugins/inspect/plugin-rfbsrc.xml
+++ b/docs/plugins/inspect/plugin-rfbsrc.xml
@@ -3,7 +3,7 @@
   <description>Connects to a VNC server and decodes RFB stream</description>
   <filename>../../gst/librfb/.libs/libgstrfbsrc.so</filename>
   <basename>libgstrfbsrc.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-rsvg.xml b/docs/plugins/inspect/plugin-rsvg.xml
index a94419b..79d20c3 100644
--- a/docs/plugins/inspect/plugin-rsvg.xml
+++ b/docs/plugins/inspect/plugin-rsvg.xml
@@ -3,7 +3,7 @@
   <description>RSVG plugin library</description>
   <filename>../../ext/rsvg/.libs/libgstrsvg.so</filename>
   <basename>libgstrsvg.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-rtmp.xml b/docs/plugins/inspect/plugin-rtmp.xml
index f773983..547f3c4 100644
--- a/docs/plugins/inspect/plugin-rtmp.xml
+++ b/docs/plugins/inspect/plugin-rtmp.xml
@@ -3,7 +3,7 @@
   <description>RTMP source and sink</description>
   <filename>../../ext/rtmp/.libs/libgstrtmp.so</filename>
   <basename>libgstrtmp.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-rtpbad.xml b/docs/plugins/inspect/plugin-rtpbad.xml
index 2f072c1..00b65f7 100644
--- a/docs/plugins/inspect/plugin-rtpbad.xml
+++ b/docs/plugins/inspect/plugin-rtpbad.xml
@@ -3,7 +3,7 @@
   <description>Real-time protocol plugins</description>
   <filename>../../gst/rtp/.libs/libgstrtpbad.so</filename>
   <basename>libgstrtpbad.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-rtponvif.xml b/docs/plugins/inspect/plugin-rtponvif.xml
index 1e8487c..3423e87 100644
--- a/docs/plugins/inspect/plugin-rtponvif.xml
+++ b/docs/plugins/inspect/plugin-rtponvif.xml
@@ -3,7 +3,7 @@
   <description>ONVIF Streaming features</description>
   <filename>../../gst/onvif/.libs/libgstrtponvif.so</filename>
   <basename>libgstrtponvif.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>unknown</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-sbc.xml b/docs/plugins/inspect/plugin-sbc.xml
index 9fe3165..6e0ae60 100644
--- a/docs/plugins/inspect/plugin-sbc.xml
+++ b/docs/plugins/inspect/plugin-sbc.xml
@@ -3,7 +3,7 @@
   <description>SBC bluetooth audio support</description>
   <filename>../../ext/sbc/.libs/libgstsbc.so</filename>
   <basename>libgstsbc.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-schro.xml b/docs/plugins/inspect/plugin-schro.xml
index 9762b26..edbb068 100644
--- a/docs/plugins/inspect/plugin-schro.xml
+++ b/docs/plugins/inspect/plugin-schro.xml
@@ -3,7 +3,7 @@
   <description>Schroedinger plugin</description>
   <filename>../../ext/schroedinger/.libs/libgstschro.so</filename>
   <basename>libgstschro.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-sdp.xml b/docs/plugins/inspect/plugin-sdp.xml
index 08cbe8f..7f7ebf8 100644
--- a/docs/plugins/inspect/plugin-sdp.xml
+++ b/docs/plugins/inspect/plugin-sdp.xml
@@ -3,7 +3,7 @@
   <description>configure streaming sessions using SDP</description>
   <filename>../../gst/sdp/.libs/libgstsdpelem.so</filename>
   <basename>libgstsdpelem.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-segmentclip.xml b/docs/plugins/inspect/plugin-segmentclip.xml
index 0584150..b0e7d6a 100644
--- a/docs/plugins/inspect/plugin-segmentclip.xml
+++ b/docs/plugins/inspect/plugin-segmentclip.xml
@@ -3,7 +3,7 @@
   <description>Segment clip elements</description>
   <filename>../../gst/segmentclip/.libs/libgstsegmentclip.so</filename>
   <basename>libgstsegmentclip.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-shm.xml b/docs/plugins/inspect/plugin-shm.xml
index 89a7aa4..25b367b 100644
--- a/docs/plugins/inspect/plugin-shm.xml
+++ b/docs/plugins/inspect/plugin-shm.xml
@@ -3,7 +3,7 @@
   <description>shared memory sink source</description>
   <filename>../../sys/shm/.libs/libgstshm.so</filename>
   <basename>libgstshm.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-smooth.xml b/docs/plugins/inspect/plugin-smooth.xml
index eaf6a06..e25a3f3 100644
--- a/docs/plugins/inspect/plugin-smooth.xml
+++ b/docs/plugins/inspect/plugin-smooth.xml
@@ -3,7 +3,7 @@
   <description>Apply a smooth filter to an image</description>
   <filename>../../gst/smooth/.libs/libgstsmooth.so</filename>
   <basename>libgstsmooth.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-smoothstreaming.xml b/docs/plugins/inspect/plugin-smoothstreaming.xml
index 324b923..f1c4497 100644
--- a/docs/plugins/inspect/plugin-smoothstreaming.xml
+++ b/docs/plugins/inspect/plugin-smoothstreaming.xml
@@ -3,7 +3,7 @@
   <description>Microsoft&apos;s Smooth Streaming format support </description>
   <filename>../../ext/smoothstreaming/.libs/libgstsmoothstreaming.so</filename>
   <basename>libgstsmoothstreaming.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-soundtouch.xml b/docs/plugins/inspect/plugin-soundtouch.xml
index 925cd70..1fae792 100644
--- a/docs/plugins/inspect/plugin-soundtouch.xml
+++ b/docs/plugins/inspect/plugin-soundtouch.xml
@@ -3,7 +3,7 @@
   <description>Audio Pitch Controller &amp; BPM Detection</description>
   <filename>../../ext/soundtouch/.libs/libgstsoundtouch.so</filename>
   <basename>libgstsoundtouch.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-spandsp.xml b/docs/plugins/inspect/plugin-spandsp.xml
index 81039be..4a6e005 100644
--- a/docs/plugins/inspect/plugin-spandsp.xml
+++ b/docs/plugins/inspect/plugin-spandsp.xml
@@ -3,7 +3,7 @@
   <description>libspandsp plugin</description>
   <filename>../../ext/spandsp/.libs/libgstspandsp.so</filename>
   <basename>libgstspandsp.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-speed.xml b/docs/plugins/inspect/plugin-speed.xml
index 5102b0a..d5c05d4 100644
--- a/docs/plugins/inspect/plugin-speed.xml
+++ b/docs/plugins/inspect/plugin-speed.xml
@@ -3,7 +3,7 @@
   <description>Set speed/pitch on audio/raw streams (resampler)</description>
   <filename>../../gst/speed/.libs/libgstspeed.so</filename>
   <basename>libgstspeed.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-srtp.xml b/docs/plugins/inspect/plugin-srtp.xml
index 31c95f2..9b1f527 100644
--- a/docs/plugins/inspect/plugin-srtp.xml
+++ b/docs/plugins/inspect/plugin-srtp.xml
@@ -3,7 +3,7 @@
   <description>GStreamer SRTP</description>
   <filename>../../ext/srtp/.libs/libgstsrtp.so</filename>
   <basename>libgstsrtp.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer</package>
diff --git a/docs/plugins/inspect/plugin-stereo.xml b/docs/plugins/inspect/plugin-stereo.xml
index 8bf3426..d4d1af5 100644
--- a/docs/plugins/inspect/plugin-stereo.xml
+++ b/docs/plugins/inspect/plugin-stereo.xml
@@ -3,7 +3,7 @@
   <description>Muck with the stereo signal, enhance it&apos;s &apos;stereo-ness&apos;</description>
   <filename>../../gst/stereo/.libs/libgststereo.so</filename>
   <basename>libgststereo.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-subenc.xml b/docs/plugins/inspect/plugin-subenc.xml
index b70ed46..2c6d48e 100644
--- a/docs/plugins/inspect/plugin-subenc.xml
+++ b/docs/plugins/inspect/plugin-subenc.xml
@@ -3,7 +3,7 @@
   <description>subtitle encoders</description>
   <filename>../../gst/subenc/.libs/libgstsubenc.so</filename>
   <basename>libgstsubenc.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-teletext.xml b/docs/plugins/inspect/plugin-teletext.xml
new file mode 100644
index 0000000..448a909
--- /dev/null
+++ b/docs/plugins/inspect/plugin-teletext.xml
@@ -0,0 +1,34 @@
+<plugin>
+  <name>teletext</name>
+  <description>Teletext plugin</description>
+  <filename>../../ext/teletextdec/.libs/libgstteletextdec.so</filename>
+  <basename>libgstteletextdec.so</basename>
+  <version>1.7.1</version>
+  <license>LGPL</license>
+  <source>gst-plugins-bad</source>
+  <package>GStreamer</package>
+  <origin>http://gstreamer.net/</origin>
+  <elements>
+    <element>
+      <name>teletextdec</name>
+      <longname>Teletext decoder</longname>
+      <class>Decoder</class>
+      <description>Decode a raw VBI stream containing teletext information to RGBA and text</description>
+      <author>Sebastian Pölsterl &lt;sebp@k-d-w.org&gt;, Andoni Morales Alastruey &lt;ylatuya@gmail.com&gt;</author>
+      <pads>
+        <caps>
+          <name>sink</name>
+          <direction>sink</direction>
+          <presence>always</presence>
+          <details>application/x-teletext</details>
+        </caps>
+        <caps>
+          <name>src</name>
+          <direction>source</direction>
+          <presence>always</presence>
+          <details>video/x-raw, format=(string)RGBA, width=(int)[ 1, 2147483647 ], height=(int)[ 1, 2147483647 ], framerate=(fraction)[ 0/1, 2147483647/1 ]; text/x-raw, format=(string){ utf-8, pango-markup }</details>
+        </caps>
+      </pads>
+    </element>
+  </elements>
+</plugin>
\ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-uvch264.xml b/docs/plugins/inspect/plugin-uvch264.xml
index 9e564e3..f985d85 100644
--- a/docs/plugins/inspect/plugin-uvch264.xml
+++ b/docs/plugins/inspect/plugin-uvch264.xml
@@ -3,7 +3,7 @@
   <description>UVC compliant H264 encoding cameras plugin</description>
   <filename>../../sys/uvch264/.libs/libgstuvch264.so</filename>
   <basename>libgstuvch264.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-vcdsrc.xml b/docs/plugins/inspect/plugin-vcdsrc.xml
index 3bedcc2..024cfcd 100644
--- a/docs/plugins/inspect/plugin-vcdsrc.xml
+++ b/docs/plugins/inspect/plugin-vcdsrc.xml
@@ -3,7 +3,7 @@
   <description>Asynchronous read from VCD disk</description>
   <filename>../../sys/vcd/.libs/libgstvcdsrc.so</filename>
   <basename>libgstvcdsrc.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-videofiltersbad.xml b/docs/plugins/inspect/plugin-videofiltersbad.xml
index fcfb3a1..9a5b669 100644
--- a/docs/plugins/inspect/plugin-videofiltersbad.xml
+++ b/docs/plugins/inspect/plugin-videofiltersbad.xml
@@ -3,7 +3,7 @@
   <description>Video filters in gst-plugins-bad</description>
   <filename>../../gst/videofilters/.libs/libgstvideofiltersbad.so</filename>
   <basename>libgstvideofiltersbad.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-videoframe_audiolevel.xml b/docs/plugins/inspect/plugin-videoframe_audiolevel.xml
new file mode 100644
index 0000000..fd29f63
--- /dev/null
+++ b/docs/plugins/inspect/plugin-videoframe_audiolevel.xml
@@ -0,0 +1,46 @@
+<plugin>
+  <name>videoframe_audiolevel</name>
+  <description>Video frame-synchronized audio level</description>
+  <filename>../../gst/videoframe_audiolevel/.libs/libgstvideoframe_audiolevel.so</filename>
+  <basename>libgstvideoframe_audiolevel.so</basename>
+  <version>1.7.1</version>
+  <license>LGPL</license>
+  <source>gst-plugins-bad</source>
+  <package>GStreamer Bad Plug-ins source release</package>
+  <origin>Unknown package origin</origin>
+  <elements>
+    <element>
+      <name>videoframe-audiolevel</name>
+      <longname>Video-frame audio level</longname>
+      <class>Filter/Analyzer/Audio</class>
+      <description>Synchronized audio/video RMS Level messenger for audio/raw</description>
+      <author>Vivia Nikolaidou &lt;vivia@toolsonair.com&gt;</author>
+      <pads>
+        <caps>
+          <name>asink</name>
+          <direction>sink</direction>
+          <presence>always</presence>
+          <details>audio/x-raw, format=(string){ S8, S16LE, S32LE, F32LE, F64LE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</details>
+        </caps>
+        <caps>
+          <name>vsink</name>
+          <direction>sink</direction>
+          <presence>always</presence>
+          <details>video/x-raw</details>
+        </caps>
+        <caps>
+          <name>asrc</name>
+          <direction>source</direction>
+          <presence>always</presence>
+          <details>audio/x-raw, format=(string){ S8, S16LE, S32LE, F32LE, F64LE }, rate=(int)[ 1, 2147483647 ], channels=(int)[ 1, 2147483647 ]</details>
+        </caps>
+        <caps>
+          <name>vsrc</name>
+          <direction>source</direction>
+          <presence>always</presence>
+          <details>video/x-raw</details>
+        </caps>
+      </pads>
+    </element>
+  </elements>
+</plugin>
\ No newline at end of file
diff --git a/docs/plugins/inspect/plugin-videoparsersbad.xml b/docs/plugins/inspect/plugin-videoparsersbad.xml
index 8d65864..1e791be 100644
--- a/docs/plugins/inspect/plugin-videoparsersbad.xml
+++ b/docs/plugins/inspect/plugin-videoparsersbad.xml
@@ -3,7 +3,7 @@
   <description>videoparsers</description>
   <filename>../../gst/videoparsers/.libs/libgstvideoparsersbad.so</filename>
   <basename>libgstvideoparsersbad.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-videosignal.xml b/docs/plugins/inspect/plugin-videosignal.xml
index 888cad8..fa81559 100644
--- a/docs/plugins/inspect/plugin-videosignal.xml
+++ b/docs/plugins/inspect/plugin-videosignal.xml
@@ -3,7 +3,7 @@
   <description>Various video signal analysers</description>
   <filename>../../gst/videosignal/.libs/libgstvideosignal.so</filename>
   <basename>libgstvideosignal.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-vmnc.xml b/docs/plugins/inspect/plugin-vmnc.xml
index a0a26a3..a402cf2 100644
--- a/docs/plugins/inspect/plugin-vmnc.xml
+++ b/docs/plugins/inspect/plugin-vmnc.xml
@@ -3,7 +3,7 @@
   <description>VmWare Video Codec plugins</description>
   <filename>../../gst/vmnc/.libs/libgstvmnc.so</filename>
   <basename>libgstvmnc.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-voaacenc.xml b/docs/plugins/inspect/plugin-voaacenc.xml
index 270f46e..5f9421d 100644
--- a/docs/plugins/inspect/plugin-voaacenc.xml
+++ b/docs/plugins/inspect/plugin-voaacenc.xml
@@ -3,7 +3,7 @@
   <description>AAC audio encoder</description>
   <filename>../../ext/voaacenc/.libs/libgstvoaacenc.so</filename>
   <basename>libgstvoaacenc.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-voamrwbenc.xml b/docs/plugins/inspect/plugin-voamrwbenc.xml
index 1781313..986d584 100644
--- a/docs/plugins/inspect/plugin-voamrwbenc.xml
+++ b/docs/plugins/inspect/plugin-voamrwbenc.xml
@@ -3,7 +3,7 @@
   <description>Adaptive Multi-Rate Wide-Band Encoder</description>
   <filename>../../ext/voamrwbenc/.libs/libgstvoamrwbenc.so</filename>
   <basename>libgstvoamrwbenc.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>unknown</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-waylandsink.xml b/docs/plugins/inspect/plugin-waylandsink.xml
index 4ba4e09..806a65c 100644
--- a/docs/plugins/inspect/plugin-waylandsink.xml
+++ b/docs/plugins/inspect/plugin-waylandsink.xml
@@ -3,7 +3,7 @@
   <description>Wayland Video Sink</description>
   <filename>../../ext/wayland/.libs/libgstwaylandsink.so</filename>
   <basename>libgstwaylandsink.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-webp.xml b/docs/plugins/inspect/plugin-webp.xml
index 65fc8ef..40560b9 100644
--- a/docs/plugins/inspect/plugin-webp.xml
+++ b/docs/plugins/inspect/plugin-webp.xml
@@ -3,7 +3,7 @@
   <description>WebP plugin</description>
   <filename>../../ext/webp/.libs/libgstwebp.so</filename>
   <basename>libgstwebp.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-wildmidi.xml b/docs/plugins/inspect/plugin-wildmidi.xml
index 4f8ed15..7e7e3fc 100644
--- a/docs/plugins/inspect/plugin-wildmidi.xml
+++ b/docs/plugins/inspect/plugin-wildmidi.xml
@@ -3,7 +3,7 @@
   <description>Wildmidi Plugin</description>
   <filename>../../ext/timidity/.libs/libgstwildmidi.so</filename>
   <basename>libgstwildmidi.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>GPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-x265.xml b/docs/plugins/inspect/plugin-x265.xml
index 8b21bc1..55bff54 100644
--- a/docs/plugins/inspect/plugin-x265.xml
+++ b/docs/plugins/inspect/plugin-x265.xml
@@ -3,7 +3,7 @@
   <description>x265-based H265 plugins</description>
   <filename>../../ext/x265/.libs/libgstx265.so</filename>
   <basename>libgstx265.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>GPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins source release</package>
diff --git a/docs/plugins/inspect/plugin-y4mdec.xml b/docs/plugins/inspect/plugin-y4mdec.xml
index e6cadf5..327e501 100644
--- a/docs/plugins/inspect/plugin-y4mdec.xml
+++ b/docs/plugins/inspect/plugin-y4mdec.xml
@@ -3,7 +3,7 @@
   <description>Demuxes/decodes YUV4MPEG streams</description>
   <filename>../../gst/y4m/.libs/libgsty4mdec.so</filename>
   <basename>libgsty4mdec.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-yadif.xml b/docs/plugins/inspect/plugin-yadif.xml
index 940ed5e..a3dcb01 100644
--- a/docs/plugins/inspect/plugin-yadif.xml
+++ b/docs/plugins/inspect/plugin-yadif.xml
@@ -3,7 +3,7 @@
   <description>YADIF deinterlacing filter</description>
   <filename>../../gst/yadif/.libs/libgstyadif.so</filename>
   <basename>libgstyadif.so</basename>
-  <version>1.6.2</version>
+  <version>1.7.1</version>
   <license>GPL</license>
   <source>gst-plugins-bad</source>
   <package>GStreamer Bad Plug-ins</package>
diff --git a/docs/plugins/inspect/plugin-zbar.xml b/docs/plugins/inspect/plugin-zbar.xml
index f55c12b..1935311 100644
--- a/docs/plugins/inspect/plugin-zbar.xml
+++ b/docs/plugins/inspect/plugin-zbar.xml
@@ -3,10 +3,10 @@
   <description>zbar barcode scanner</description>
   <filename>../../ext/zbar/.libs/libgstzbar.so</filename>
   <basename>libgstzbar.so</basename>
-  <version>1.6.1</version>
+  <version>1.7.0.1</version>
   <license>LGPL</license>
   <source>gst-plugins-bad</source>
-  <package>GStreamer Bad Plug-ins source release</package>
+  <package>GStreamer Bad Plug-ins git</package>
   <origin>Unknown package origin</origin>
   <elements>
     <element>
diff --git a/ext/Makefile.in b/ext/Makefile.in
index 4f5eae9..867d289 100644
--- a/ext/Makefile.in
+++ b/ext/Makefile.in
@@ -253,6 +253,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -290,6 +292,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -317,6 +321,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -335,6 +341,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -345,6 +353,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -370,6 +380,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -395,6 +407,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -526,6 +540,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -583,8 +599,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -654,6 +674,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/apexsink/Makefile.in b/ext/apexsink/Makefile.in
index f673a41..7e8b913 100644
--- a/ext/apexsink/Makefile.in
+++ b/ext/apexsink/Makefile.in
@@ -277,6 +277,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -314,6 +316,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -341,6 +345,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -359,6 +365,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -369,6 +377,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -394,6 +404,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -419,6 +431,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -550,6 +564,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -607,8 +623,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -678,6 +698,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/assrender/Makefile.in b/ext/assrender/Makefile.in
index 6816025..30e633d 100644
--- a/ext/assrender/Makefile.in
+++ b/ext/assrender/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/assrender/gstassrender.c b/ext/assrender/gstassrender.c
index de76af0..913beb5 100644
--- a/ext/assrender/gstassrender.c
+++ b/ext/assrender/gstassrender.c
@@ -26,7 +26,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v filesrc location=/path/to/mkv ! matroskademux name=d ! queue ! mp3parse ! mad ! audioconvert ! autoaudiosink  d. ! queue ! ffdec_h264 ! videoconvert ! r.   d. ! queue ! "application/x-ass" ! assrender name=r ! videoconvert ! autovideosink
+ * gst-launch-1.0 -v filesrc location=/path/to/mkv ! matroskademux name=d ! queue ! mpegaudioparse ! mad ! audioconvert ! autoaudiosink  d. ! queue ! h264parse ! avdec_h264 ! videoconvert ! r.   d. ! queue ! "application/x-ass" ! assrender name=r ! videoconvert ! autovideosink
  * ]| This pipeline demuxes a Matroska file with h.264 video, MP3 audio and embedded ASS subtitles and renders the subtitles on top of the video.
  * </refsect2>
  */
@@ -184,7 +184,6 @@
       "Sebastian Dröge <sebastian.droege@collabora.co.uk>");
 }
 
-#if defined(LIBASS_VERSION) && LIBASS_VERSION >= 0x00907000
 static void
 _libass_message_cb (gint level, const gchar * fmt, va_list args,
     gpointer render)
@@ -204,7 +203,6 @@
 
   g_free (message);
 }
-#endif
 
 static void
 gst_ass_render_init (GstAssRender * render)
@@ -256,9 +254,7 @@
 
   g_mutex_init (&render->ass_mutex);
   render->ass_library = ass_library_init ();
-#if defined(LIBASS_VERSION) && LIBASS_VERSION >= 0x00907000
   ass_set_message_cb (render->ass_library, _libass_message_cb, render);
-#endif
   ass_set_extract_fonts (render->ass_library, 1);
 
   render->ass_renderer = ass_renderer_init (render->ass_library);
@@ -298,6 +294,15 @@
 }
 
 static void
+gst_ass_render_reset_composition (GstAssRender * render)
+{
+  if (render->composition) {
+    gst_video_overlay_composition_unref (render->composition);
+    render->composition = NULL;
+  }
+}
+
+static void
 gst_ass_render_set_property (GObject * object, guint prop_id,
     const GValue * value, GParamSpec * pspec)
 {
@@ -391,12 +396,9 @@
       if (render->ass_track)
         ass_free_track (render->ass_track);
       render->ass_track = NULL;
-      if (render->composition) {
-        gst_video_overlay_composition_unref (render->composition);
-        render->composition = NULL;
-      }
       render->track_init_ok = FALSE;
       render->renderer_init_ok = FALSE;
+      gst_ass_render_reset_composition (render);
       g_mutex_unlock (&render->ass_mutex);
       break;
     case GST_STATE_CHANGE_READY_TO_PAUSED:
@@ -684,34 +686,40 @@
     dst_x = ass_image->dst_x + x_off;
     dst_y = ass_image->dst_y + y_off;
 
-    if (dst_y >= height || dst_x >= width)
+    w = MIN (ass_image->w, width - dst_x);
+    h = MIN (ass_image->h, height - dst_y);
+    if (w <= 0 || h <= 0)
       goto next;
 
     alpha = 255 - (ass_image->color & 0xff);
+    if (!alpha)
+      goto next;
+
     r = ((ass_image->color) >> 24) & 0xff;
     g = ((ass_image->color) >> 16) & 0xff;
     b = ((ass_image->color) >> 8) & 0xff;
+
     src = ass_image->bitmap;
     dst = data + dst_y * stride + dst_x * 4;
 
-    w = MIN (ass_image->w, width - dst_x);
-    h = MIN (ass_image->h, height - dst_y);
     src_skip = ass_image->stride - w;
     dst_skip = stride - w * 4;
 
     for (y = 0; y < h; y++) {
       for (x = 0; x < w; x++) {
-        k = src[0] * alpha / 255;
-        if (dst[3] == 0) {
-          dst[3] = k;
-          dst[2] = (k * r) / 255;
-          dst[1] = (k * g) / 255;
-          dst[0] = (k * b) / 255;
-        } else {
-          dst[3] = k + (255 - k) * dst[3] / 255;
-          dst[2] = (k * r + (255 - k) * dst[2]) / 255;
-          dst[1] = (k * g + (255 - k) * dst[1]) / 255;
-          dst[0] = (k * b + (255 - k) * dst[0]) / 255;
+        if (src[0]) {
+          k = src[0] * alpha / 255;
+          if (dst[3] == 0) {
+            dst[3] = k;
+            dst[2] = (k * r) / 255;
+            dst[1] = (k * g) / 255;
+            dst[0] = (k * b) / 255;
+          } else {
+            dst[3] = k + (255 - k) * dst[3] / 255;
+            dst[2] = (k * r + (255 - k) * dst[2]) / 255;
+            dst[1] = (k * g + (255 - k) * dst[1]) / 255;
+            dst[0] = (k * b + (255 - k) * dst[0]) / 255;
+          }
         }
         src++;
         dst += 4;
@@ -740,137 +748,228 @@
   return ret;
 }
 
+static void
+gst_ass_render_update_render_size (GstAssRender * render)
+{
+  gdouble video_aspect = (gdouble) render->info.width /
+      (gdouble) render->info.height;
+  gdouble window_aspect = (gdouble) render->window_width /
+      (gdouble) render->window_height;
+
+  /* render at the window size, with the video aspect ratio */
+  if (video_aspect >= window_aspect) {
+    render->ass_frame_width = render->window_width;
+    render->ass_frame_height = render->window_width / video_aspect;
+  } else {
+    render->ass_frame_width = render->window_height * video_aspect;
+    render->ass_frame_height = render->window_height;
+  }
+}
+
+static gboolean
+gst_ass_render_negotiate (GstAssRender * render, GstCaps * caps)
+{
+  gboolean upstream_has_meta = FALSE;
+  gboolean caps_has_meta = FALSE;
+  gboolean alloc_has_meta = FALSE;
+  gboolean attach = FALSE;
+  gboolean ret = TRUE;
+  guint width, height;
+  GstCapsFeatures *f;
+  GstCaps *overlay_caps;
+  GstQuery *query;
+  guint alloc_index;
+
+  GST_DEBUG_OBJECT (render, "performing negotiation");
+
+  /* Clear cached composition */
+  gst_ass_render_reset_composition (render);
+
+  /* Clear any pending reconfigure flag */
+  gst_pad_check_reconfigure (render->srcpad);
+
+  if (!caps)
+    caps = gst_pad_get_current_caps (render->video_sinkpad);
+  else
+    gst_caps_ref (caps);
+
+  if (!caps || gst_caps_is_empty (caps))
+    goto no_format;
+
+  /* Check if upstream caps have meta */
+  if ((f = gst_caps_get_features (caps, 0))) {
+    upstream_has_meta = gst_caps_features_contains (f,
+        GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION);
+  }
+
+  /* Initialize dimensions */
+  width = render->info.width;
+  height = render->info.height;
+
+  if (upstream_has_meta) {
+    overlay_caps = gst_caps_ref (caps);
+  } else {
+    GstCaps *peercaps;
+
+    /* BaseTransform requires caps for the allocation query to work */
+    overlay_caps = gst_caps_copy (caps);
+    f = gst_caps_get_features (overlay_caps, 0);
+    gst_caps_features_add (f,
+        GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION);
+
+    /* Then check if downstream accept overlay composition in caps */
+    /* FIXME: We should probably check if downstream *prefers* the
+     * overlay meta, and only enforce usage of it if we can't handle
+     * the format ourselves and thus would have to drop the overlays.
+     * Otherwise we should prefer what downstream wants here.
+     */
+    peercaps = gst_pad_peer_query_caps (render->srcpad, NULL);
+    caps_has_meta = gst_caps_can_intersect (peercaps, overlay_caps);
+    gst_caps_unref (peercaps);
+
+    GST_DEBUG ("caps have overlay meta %d", caps_has_meta);
+  }
+
+  if (upstream_has_meta || caps_has_meta) {
+    /* Send caps immediatly, it's needed by GstBaseTransform to get a reply
+     * from allocation query */
+    ret = gst_pad_set_caps (render->srcpad, overlay_caps);
+
+    /* First check if the allocation meta has compositon */
+    query = gst_query_new_allocation (overlay_caps, FALSE);
+
+    if (!gst_pad_peer_query (render->srcpad, query)) {
+      /* no problem, we use the query defaults */
+      GST_DEBUG_OBJECT (render, "ALLOCATION query failed");
+
+      /* In case we were flushing, mark reconfigure and fail this method,
+       * will make it retry */
+      if (render->video_flushing)
+        ret = FALSE;
+    }
+
+    alloc_has_meta = gst_query_find_allocation_meta (query,
+        GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, &alloc_index);
+
+    GST_DEBUG ("sink alloc has overlay meta %d", alloc_has_meta);
+
+    if (alloc_has_meta) {
+      const GstStructure *params;
+
+      gst_query_parse_nth_allocation_meta (query, alloc_index, &params);
+      if (params) {
+        if (gst_structure_get (params, "width", G_TYPE_UINT, &width,
+                "height", G_TYPE_UINT, &height, NULL)) {
+          GST_DEBUG ("received window size: %dx%d", width, height);
+          g_assert (width != 0 && height != 0);
+        }
+      }
+    }
+
+    gst_query_unref (query);
+  }
+
+  /* Update render size if needed */
+  render->window_width = width;
+  render->window_height = height;
+  gst_ass_render_update_render_size (render);
+
+  /* For backward compatbility, we will prefer bliting if downstream
+   * allocation does not support the meta. In other case we will prefer
+   * attaching, and will fail the negotiation in the unlikely case we are
+   * force to blit, but format isn't supported. */
+
+  if (upstream_has_meta) {
+    attach = TRUE;
+  } else if (caps_has_meta) {
+    if (alloc_has_meta) {
+      attach = TRUE;
+    } else {
+      /* Don't attach unless we cannot handle the format */
+      attach = !gst_ass_render_can_handle_caps (caps);
+    }
+  } else {
+    ret = gst_ass_render_can_handle_caps (caps);
+  }
+
+  /* If we attach, then pick the overlay caps */
+  if (attach) {
+    GST_DEBUG_OBJECT (render, "Using caps %" GST_PTR_FORMAT, overlay_caps);
+    /* Caps where already sent */
+  } else if (ret) {
+    GST_DEBUG_OBJECT (render, "Using caps %" GST_PTR_FORMAT, caps);
+    ret = gst_pad_set_caps (render->srcpad, caps);
+  }
+
+  render->attach_compo_to_buffer = attach;
+
+  if (!ret) {
+    GST_DEBUG_OBJECT (render, "negotiation failed, schedule reconfigure");
+    gst_pad_mark_reconfigure (render->srcpad);
+  } else {
+    g_mutex_lock (&render->ass_mutex);
+    ass_set_frame_size (render->ass_renderer,
+        render->ass_frame_width, render->ass_frame_height);
+    ass_set_storage_size (render->ass_renderer,
+        render->info.width, render->info.height);
+    ass_set_pixel_aspect (render->ass_renderer,
+        (gdouble) render->info.par_n / (gdouble) render->info.par_d);
+    ass_set_font_scale (render->ass_renderer, 1.0);
+    ass_set_hinting (render->ass_renderer, ASS_HINTING_LIGHT);
+
+    ass_set_fonts (render->ass_renderer, "Arial", "sans-serif", 1, NULL, 1);
+    ass_set_fonts (render->ass_renderer, NULL, "Sans", 1, NULL, 1);
+    ass_set_margins (render->ass_renderer, 0, 0, 0, 0);
+    ass_set_use_margins (render->ass_renderer, 0);
+    g_mutex_unlock (&render->ass_mutex);
+
+    render->renderer_init_ok = TRUE;
+
+    GST_DEBUG_OBJECT (render, "ass renderer setup complete");
+  }
+
+  gst_caps_unref (overlay_caps);
+  gst_caps_unref (caps);
+
+  return ret;
+
+no_format:
+  {
+    if (caps)
+      gst_caps_unref (caps);
+    return FALSE;
+  }
+}
+
 static gboolean
 gst_ass_render_setcaps_video (GstPad * pad, GstAssRender * render,
     GstCaps * caps)
 {
-  GstQuery *query;
-  gboolean ret = FALSE;
-  gint par_n = 1, par_d = 1;
-  gdouble dar;
   GstVideoInfo info;
-  gboolean attach = FALSE;
-  gboolean caps_has_meta = TRUE;
-  GstCapsFeatures *f;
-  GstCaps *original_caps = caps;
+  gboolean ret;
 
   if (!gst_video_info_from_caps (&info, caps))
     goto invalid_caps;
 
   render->info = info;
-  gst_caps_ref (caps);
 
-  /* Try to use the overlay meta if possible */
-  f = gst_caps_get_features (caps, 0);
+  ret = gst_ass_render_negotiate (render, caps);
 
-  /* if the caps doesn't have the overlay meta, we query if downstream
-   * accepts it before trying the version without the meta
-   * If upstream already is using the meta then we can only use it */
-  if (!f
-      || !gst_caps_features_contains (f,
-          GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION)) {
-    GstCaps *overlay_caps;
+  GST_ASS_RENDER_LOCK (render);
 
-    /* In this case we added the meta, but we can work without it
-     * so preserve the original caps so we can use it as a fallback */
-    overlay_caps = gst_caps_copy (caps);
-
-    f = gst_caps_get_features (overlay_caps, 0);
-    gst_caps_features_add (f,
-        GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION);
-
-    ret = gst_pad_peer_query_accept_caps (render->srcpad, overlay_caps);
-    GST_DEBUG_OBJECT (render, "Downstream accepts the overlay meta: %d", ret);
-    if (ret) {
-      gst_caps_unref (caps);
-      caps = overlay_caps;
-
-    } else {
-      /* fallback to the original */
-      gst_caps_unref (overlay_caps);
-      caps_has_meta = FALSE;
-    }
-
+  if (!render->attach_compo_to_buffer && !gst_ass_render_can_handle_caps (caps)) {
+    GST_DEBUG_OBJECT (render, "unsupported caps %" GST_PTR_FORMAT, caps);
+    ret = FALSE;
   }
-  GST_DEBUG_OBJECT (render, "Using caps %" GST_PTR_FORMAT, caps);
-  ret = gst_pad_set_caps (render->srcpad, caps);
-  gst_caps_unref (caps);
-
-  if (!ret)
-    goto out;
-
-  render->width = info.width;
-  render->height = info.height;
-
-  query = gst_query_new_allocation (caps, FALSE);
-  if (caps_has_meta && gst_pad_peer_query (render->srcpad, query)) {
-    if (gst_query_find_allocation_meta (query,
-            GST_VIDEO_OVERLAY_COMPOSITION_META_API_TYPE, NULL))
-      attach = TRUE;
-  }
-  gst_query_unref (query);
-
-  render->attach_compo_to_buffer = attach;
-
-  if (!attach) {
-    if (caps_has_meta) {
-      /* Some elements (fakesink) claim to accept the meta on caps but won't
-         put it in the allocation query result, this leads below
-         check to fail. Prevent this by removing the meta from caps */
-      caps = original_caps;
-      ret = gst_pad_set_caps (render->srcpad, caps);
-      if (!ret)
-        goto out;
-    }
-    if (!gst_ass_render_can_handle_caps (caps))
-      goto unsupported_caps;
-  }
-
-  g_mutex_lock (&render->ass_mutex);
-  ass_set_frame_size (render->ass_renderer, render->width, render->height);
-
-  dar = (((gdouble) par_n) * ((gdouble) render->width))
-      / (((gdouble) par_d) * ((gdouble) render->height));
-#if !defined(LIBASS_VERSION) || LIBASS_VERSION < 0x00907000
-  ass_set_aspect_ratio (render->ass_renderer, dar);
-#else
-  ass_set_aspect_ratio (render->ass_renderer,
-      dar, ((gdouble) render->width) / ((gdouble) render->height));
-#endif
-  ass_set_font_scale (render->ass_renderer, 1.0);
-  ass_set_hinting (render->ass_renderer, ASS_HINTING_LIGHT);
-
-#if !defined(LIBASS_VERSION) || LIBASS_VERSION < 0x00907000
-  ass_set_fonts (render->ass_renderer, "Arial", "sans-serif");
-  ass_set_fonts (render->ass_renderer, NULL, "Sans");
-#else
-  ass_set_fonts (render->ass_renderer, "Arial", "sans-serif", 1, NULL, 1);
-  ass_set_fonts (render->ass_renderer, NULL, "Sans", 1, NULL, 1);
-#endif
-  ass_set_margins (render->ass_renderer, 0, 0, 0, 0);
-  ass_set_use_margins (render->ass_renderer, 0);
-  g_mutex_unlock (&render->ass_mutex);
-
-  render->renderer_init_ok = TRUE;
-
-  GST_DEBUG_OBJECT (render, "ass renderer setup complete");
-
-out:
+  GST_ASS_RENDER_UNLOCK (render);
 
   return ret;
 
   /* ERRORS */
 invalid_caps:
   {
-    GST_ERROR_OBJECT (render, "Can't parse caps: %" GST_PTR_FORMAT, caps);
-    ret = FALSE;
-    goto out;
-  }
-unsupported_caps:
-  {
-    GST_ERROR_OBJECT (render, "Unsupported caps: %" GST_PTR_FORMAT, caps);
-    ret = FALSE;
-    goto out;
+    GST_ERROR_OBJECT (render, "could not parse caps");
+    return FALSE;
   }
 }
 
@@ -963,6 +1062,7 @@
   gint max_x, max_y;
   gint width, height;
   gint stride;
+  gdouble hscale, vscale;
   gpointer data;
 
   min_x = G_MAXINT;
@@ -982,8 +1082,8 @@
       max_y = image->dst_y + image->h;
   }
 
-  width = MIN (max_x - min_x, render->width);
-  height = MIN (max_y - min_y, render->height);
+  width = MIN (max_x - min_x, render->ass_frame_width);
+  height = MIN (max_y - min_y, render->ass_frame_height);
 
   GST_DEBUG_OBJECT (render, "render overlay rectangle %dx%d%+d%+d",
       width, height, min_x, min_y);
@@ -1007,8 +1107,12 @@
       -min_x, -min_y);
   gst_video_meta_unmap (vmeta, 0, &map);
 
-  rectangle = gst_video_overlay_rectangle_new_raw (buffer, min_x, min_y,
-      width, height, GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA);
+  hscale = (gdouble) render->info.width / (gdouble) render->ass_frame_width;
+  vscale = (gdouble) render->info.height / (gdouble) render->ass_frame_height;
+
+  rectangle = gst_video_overlay_rectangle_new_raw (buffer,
+      hscale * min_x, vscale * min_y, hscale * width, vscale * height,
+      GST_VIDEO_OVERLAY_FORMAT_FLAG_PREMULTIPLIED_ALPHA);
 
   gst_buffer_unref (buffer);
 
@@ -1057,6 +1161,9 @@
   guint64 start, stop, clip_start = 0, clip_stop = 0;
   ASS_Image *ass_image;
 
+  if (gst_pad_check_reconfigure (render->srcpad))
+    gst_ass_render_negotiate (render, NULL);
+
   if (!GST_BUFFER_TIMESTAMP_IS_VALID (buffer))
     goto missing_timestamp;
 
@@ -1189,8 +1296,7 @@
 
       if ((!ass_image || changed) && render->composition) {
         GST_DEBUG_OBJECT (render, "release overlay (changed %d)", changed);
-        gst_video_overlay_composition_unref (render->composition);
-        render->composition = NULL;
+        gst_ass_render_reset_composition (render);
       }
 
       if (ass_image != NULL) {
diff --git a/ext/assrender/gstassrender.h b/ext/assrender/gstassrender.h
index 4acd9e6..42f74a0 100644
--- a/ext/assrender/gstassrender.h
+++ b/ext/assrender/gstassrender.h
@@ -76,13 +76,14 @@
   ASS_Library *ass_library;
   ASS_Renderer *ass_renderer;
   ASS_Track *ass_track;
+  gint ass_frame_width, ass_frame_height;
 
   gboolean renderer_init_ok, track_init_ok;
   gboolean need_process;
 
   /* overlay stuff */
   GstVideoOverlayComposition *composition;
-  gint width, height;
+  guint window_width, window_height;
   gboolean attach_compo_to_buffer;
 };
 
diff --git a/ext/bs2b/Makefile.in b/ext/bs2b/Makefile.in
index 0433f09..9bb49e4 100644
--- a/ext/bs2b/Makefile.in
+++ b/ext/bs2b/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/bz2/Makefile.in b/ext/bz2/Makefile.in
index 79b3c0d..87f6f6e 100644
--- a/ext/bz2/Makefile.in
+++ b/ext/bz2/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/chromaprint/Makefile.in b/ext/chromaprint/Makefile.in
index 37b65a1..ff35fb1 100644
--- a/ext/chromaprint/Makefile.in
+++ b/ext/chromaprint/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/chromaprint/gstchromaprint.c b/ext/chromaprint/gstchromaprint.c
index 7c05221..b7217a6 100644
--- a/ext/chromaprint/gstchromaprint.c
+++ b/ext/chromaprint/gstchromaprint.c
@@ -32,7 +32,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -m uridecodebin uri=file:///path/to/song.ogg ! audioconvert ! chromaprint ! fakesink
+ * gst-launch-1.0 -m uridecodebin uri=file:///path/to/song.ogg ! audioconvert ! chromaprint ! fakesink
  * ]|
  * </refsect2>
  */
diff --git a/ext/curl/Makefile.in b/ext/curl/Makefile.in
index 21ca399..5f319de 100644
--- a/ext/curl/Makefile.in
+++ b/ext/curl/Makefile.in
@@ -288,6 +288,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -325,6 +327,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -352,6 +356,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -370,6 +376,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -380,6 +388,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -405,6 +415,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -430,6 +442,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -561,6 +575,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -618,8 +634,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -689,6 +709,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/curl/gstcurlbasesink.c b/ext/curl/gstcurlbasesink.c
index b47f246..58397a1 100644
--- a/ext/curl/gstcurlbasesink.c
+++ b/ext/curl/gstcurlbasesink.c
@@ -28,7 +28,7 @@
  * <refsect2>
  * <title>Example launch line (upload a JPEG file to an HTTP server)</title>
  * |[
- * gst-launch filesrc location=image.jpg ! jpegparse ! curlsink  \
+ * gst-launch-1.0 filesrc location=image.jpg ! jpegparse ! curlsink  \
  *     file-name=image.jpg  \
  *     location=http://192.168.0.1:8080/cgi-bin/patupload.cgi/  \
  *     user=test passwd=test  \
diff --git a/ext/curl/gstcurlfilesink.c b/ext/curl/gstcurlfilesink.c
index d286540..b4aa174 100644
--- a/ext/curl/gstcurlfilesink.c
+++ b/ext/curl/gstcurlfilesink.c
@@ -29,7 +29,7 @@
  * <title>Example launch line (upload a JPEG file to /home/test/images
  * directory)</title>
  * |[
- * gst-launch filesrc location=image.jpg ! jpegparse ! curlfilesink  \
+ * gst-launch-1.0 filesrc location=image.jpg ! jpegparse ! curlfilesink  \
  *     file-name=image.jpg  \
  *     location=file:///home/test/images/
  * ]|
diff --git a/ext/curl/gstcurlftpsink.c b/ext/curl/gstcurlftpsink.c
index 995fe38..92b5c4e 100644
--- a/ext/curl/gstcurlftpsink.c
+++ b/ext/curl/gstcurlftpsink.c
@@ -29,7 +29,7 @@
  * <title>Example launch line (upload a JPEG file to /home/test/images
  * directory)</title>
  * |[
- * gst-launch filesrc location=image.jpg ! jpegparse ! curlftpsink  \
+ * gst-launch-1.0 filesrc location=image.jpg ! jpegparse ! curlftpsink  \
  *     file-name=image.jpg  \
  *     location=ftp://192.168.0.1/images/
  * ]|
@@ -230,7 +230,8 @@
       return FALSE;
     }
 
-    res = curl_easy_setopt (basesink->curl, CURLOPT_POSTQUOTE, sink->headerlist);
+    res =
+        curl_easy_setopt (basesink->curl, CURLOPT_POSTQUOTE, sink->headerlist);
     if (res != CURLE_OK) {
       basesink->error = g_strdup_printf ("failed to set post quote: %s",
           curl_easy_strerror (res));
diff --git a/ext/curl/gstcurlhttpsink.c b/ext/curl/gstcurlhttpsink.c
index 3660f5b..a50a057 100644
--- a/ext/curl/gstcurlhttpsink.c
+++ b/ext/curl/gstcurlhttpsink.c
@@ -28,7 +28,7 @@
  * <refsect2>
  * <title>Example launch line (upload a JPEG file to an HTTP server)</title>
  * |[
- * gst-launch filesrc location=image.jpg ! jpegparse ! curlhttpsink  \
+ * gst-launch-1.0 filesrc location=image.jpg ! jpegparse ! curlhttpsink  \
  *     file-name=image.jpg  \
  *     location=http://192.168.0.1:8080/cgi-bin/patupload.cgi/  \
  *     user=test passwd=test  \
diff --git a/ext/curl/gstcurlsftpsink.c b/ext/curl/gstcurlsftpsink.c
index 5b544f0..939ebd8 100644
--- a/ext/curl/gstcurlsftpsink.c
+++ b/ext/curl/gstcurlsftpsink.c
@@ -28,7 +28,7 @@
  * <refsect2>
  * <title>Example launch line (upload a file to /home/john/sftp_tests/)</title>
  * |[
- * gst-launch filesrc location=/home/jdoe/some.file ! curlsftpsink  \
+ * gst-launch-1.0 filesrc location=/home/jdoe/some.file ! curlsftpsink  \
  *     file-name=some.file.backup  \
  *     user=john location=sftp://192.168.0.1/~/sftp_tests/  \
  *     ssh-auth-type=1 ssh-key-passphrase=blabla  \
diff --git a/ext/curl/gstcurlsmtpsink.c b/ext/curl/gstcurlsmtpsink.c
index 7de1ddf..40ab016 100644
--- a/ext/curl/gstcurlsmtpsink.c
+++ b/ext/curl/gstcurlsmtpsink.c
@@ -28,7 +28,7 @@
  * <refsect2>
  * <title>Example launch line (upload a JPEG file to an SMTP server)</title>
  * |[
- * gst-launch filesrc location=image.jpg ! jpegparse ! curlsmtpsink  \
+ * gst-launch-1.0 filesrc location=image.jpg ! jpegparse ! curlsmtpsink  \
  *     file-name=image.jpg  \
  *     location=smtp://smtp.gmail.com:507 \
  *     user=test passwd=test  \
diff --git a/ext/daala/Makefile.in b/ext/daala/Makefile.in
index c37c4ad..9fb4b04 100644
--- a/ext/daala/Makefile.in
+++ b/ext/daala/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/daala/gstdaaladec.c b/ext/daala/gstdaaladec.c
index 0cf4f63..085685c 100644
--- a/ext/daala/gstdaaladec.c
+++ b/ext/daala/gstdaaladec.c
@@ -33,7 +33,7 @@
  * <refsect2>
  * <title>Example pipeline</title>
  * |[
- * gst-launch -v filesrc location=videotestsrc.ogg ! oggdemux ! daaladec ! xvimagesink
+ * gst-launch-1.0 -v filesrc location=videotestsrc.ogg ! oggdemux ! daaladec ! xvimagesink
  * ]| This example pipeline will decode an ogg stream and decodes the daala video. Refer to
  * the daalaenc example to create the ogg file.
  * </refsect2>
diff --git a/ext/daala/gstdaalaenc.c b/ext/daala/gstdaalaenc.c
index 77ab0b2..705c7e6 100644
--- a/ext/daala/gstdaalaenc.c
+++ b/ext/daala/gstdaalaenc.c
@@ -33,7 +33,7 @@
  * <refsect2>
  * <title>Example pipeline</title>
  * |[
- * gst-launch -v videotestsrc num-buffers=1000 ! daalaenc ! oggmux ! filesink location=videotestsrc.ogg
+ * gst-launch-1.0 -v videotestsrc num-buffers=1000 ! daalaenc ! oggmux ! filesink location=videotestsrc.ogg
  * ]| This example pipeline will encode a test video source to daala muxed in an
  * ogg container. Refer to the daaladec documentation to decode the create
  * stream.
diff --git a/ext/dash/Makefile.in b/ext/dash/Makefile.in
index 934aaa6..35e0af3 100644
--- a/ext/dash/Makefile.in
+++ b/ext/dash/Makefile.in
@@ -279,6 +279,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -316,6 +318,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -343,6 +347,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -361,6 +367,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -371,6 +379,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -396,6 +406,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -421,6 +433,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -552,6 +566,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -609,8 +625,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -680,6 +700,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/dash/gstdashdemux.c b/ext/dash/gstdashdemux.c
index 20d6764..35ae2e3 100644
--- a/ext/dash/gstdashdemux.c
+++ b/ext/dash/gstdashdemux.c
@@ -146,6 +146,7 @@
 
 #include <string.h>
 #include <stdio.h>
+#include <stdlib.h>
 #include <inttypes.h>
 #include <gio/gio.h>
 #include <gst/base/gsttypefindhelper.h>
@@ -167,6 +168,12 @@
     GST_PAD_SOMETIMES,
     GST_STATIC_CAPS_ANY);
 
+static GstStaticPadTemplate gst_dash_demux_subtitlesrc_template =
+GST_STATIC_PAD_TEMPLATE ("subtitle_%02u",
+    GST_PAD_SRC,
+    GST_PAD_SOMETIMES,
+    GST_STATIC_CAPS_ANY);
+
 static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
     GST_PAD_SINK,
     GST_PAD_ALWAYS,
@@ -182,6 +189,7 @@
   PROP_MAX_BUFFERING_TIME,
   PROP_BANDWIDTH_USAGE,
   PROP_MAX_BITRATE,
+  PROP_PRESENTATION_DELAY,
   PROP_LAST
 };
 
@@ -189,6 +197,7 @@
 #define DEFAULT_MAX_BUFFERING_TIME       30     /* in seconds */
 #define DEFAULT_BANDWIDTH_USAGE         0.8     /* 0 to 1     */
 #define DEFAULT_MAX_BITRATE        24000000     /* in bit/s  */
+#define DEFAULT_PRESENTATION_DELAY     NULL     /* zero */
 
 /* Clock drift compensation for live streams */
 #define SLOW_CLOCK_UPDATE_INTERVAL  (1000000 * 30 * 60) /* 30 minutes */
@@ -201,11 +210,9 @@
   GMutex clock_lock;            /* used to protect access to struct */
   guint selected_url;
   gint64 next_update;
-  GCond clock_cond;             /* used for waiting until got_clock==TRUE */
   /* @clock_compensation: amount (in usecs) to add to client's idea of
      now to map it to the server's idea of now */
   GTimeSpan clock_compensation;
-  gboolean got_clock;           /* indicates time source has returned a valid clock at least once */
   GstClock *ntp_clock;
 };
 
@@ -293,6 +300,7 @@
 
   gst_dash_demux_clock_drift_free (demux->clock_drift);
   demux->clock_drift = NULL;
+  g_free (demux->default_presentation_delay);
   G_OBJECT_CLASS (parent_class)->dispose (obj);
 }
 
@@ -303,8 +311,8 @@
   GstDashDemux *self = GST_DASH_DEMUX (demux);
   GDateTime *now = gst_dash_demux_get_server_now_utc (self);
   GDateTime *mstart =
-      gst_date_time_to_g_date_time (self->client->
-      mpd_node->availabilityStartTime);
+      gst_date_time_to_g_date_time (self->client->mpd_node->
+      availabilityStartTime);
   GTimeSpan stream_now;
 
   stream_now = g_date_time_difference (now, mstart);
@@ -364,7 +372,7 @@
           "Percentage of the available bandwidth to use when "
           "selecting representations (deprecated)",
           0, 1, DEFAULT_BANDWIDTH_USAGE,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_DEPRECATED));
 #endif
 
   g_object_class_install_property (gobject_class, PROP_MAX_BITRATE,
@@ -373,10 +381,18 @@
           1000, G_MAXUINT, DEFAULT_MAX_BITRATE,
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
+  g_object_class_install_property (gobject_class, PROP_PRESENTATION_DELAY,
+      g_param_spec_string ("presentation-delay", "Presentation delay",
+          "Default presentation delay (in seconds, milliseconds or fragments) (e.g. 12s, 2500ms, 3f)",
+          DEFAULT_PRESENTATION_DELAY,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
   gst_element_class_add_pad_template (gstelement_class,
       gst_static_pad_template_get (&gst_dash_demux_audiosrc_template));
   gst_element_class_add_pad_template (gstelement_class,
       gst_static_pad_template_get (&gst_dash_demux_videosrc_template));
+  gst_element_class_add_pad_template (gstelement_class,
+      gst_static_pad_template_get (&gst_dash_demux_subtitlesrc_template));
 
   gst_element_class_add_pad_template (gstelement_class,
       gst_static_pad_template_get (&sinktemplate));
@@ -433,6 +449,7 @@
   /* Properties */
   demux->max_buffering_time = DEFAULT_MAX_BUFFERING_TIME * GST_SECOND;
   demux->max_bitrate = DEFAULT_MAX_BITRATE;
+  demux->default_presentation_delay = DEFAULT_PRESENTATION_DELAY;
 
   g_mutex_init (&demux->client_lock);
 
@@ -457,6 +474,10 @@
     case PROP_MAX_BITRATE:
       demux->max_bitrate = g_value_get_uint (value);
       break;
+    case PROP_PRESENTATION_DELAY:
+      g_free (demux->default_presentation_delay);
+      demux->default_presentation_delay = g_value_dup_string (value);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -480,6 +501,12 @@
     case PROP_MAX_BITRATE:
       g_value_set_uint (value, demux->max_bitrate);
       break;
+    case PROP_PRESENTATION_DELAY:
+      if (demux->default_presentation_delay == NULL)
+        g_value_set_static_string (value, "");
+      else
+        g_value_set_string (value, demux->default_presentation_delay);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -535,11 +562,11 @@
     active_stream = gst_mpdparser_get_active_stream_by_index (demux->client, i);
     if (active_stream == NULL)
       continue;
-    /* TODO: support 'application' mimeType */
-    if (active_stream->mimeType == GST_STREAM_APPLICATION)
-      continue;
 
     srcpad = gst_dash_demux_create_pad (demux, active_stream);
+    if (srcpad == NULL)
+      continue;
+
     caps = gst_dash_demux_get_input_caps (demux, active_stream);
     GST_LOG_OBJECT (demux, "Creating stream %d %" GST_PTR_FORMAT, i, caps);
 
@@ -548,9 +575,16 @@
       lang = adp_set->lang;
 
       /* Fallback to the language in ContentComponent node */
-      if (lang == NULL && g_list_length (adp_set->ContentComponents) == 1) {
-        GstContentComponentNode *cc_node = adp_set->ContentComponents->data;
-        lang = cc_node->lang;
+      if (lang == NULL) {
+        GList *it;
+
+        for (it = adp_set->ContentComponents; it; it = it->next) {
+          GstContentComponentNode *cc_node = it->data;
+          if (cc_node->lang) {
+            lang = cc_node->lang;
+            break;
+          }
+        }
       }
     }
 
@@ -575,9 +609,9 @@
         active_stream->cur_adapt_set->RepresentationBase &&
         active_stream->cur_adapt_set->RepresentationBase->ContentProtection) {
       GST_DEBUG_OBJECT (demux, "Adding ContentProtection events to source pad");
-      g_list_foreach (active_stream->cur_adapt_set->
-          RepresentationBase->ContentProtection,
-          gst_dash_demux_send_content_protection_event, stream);
+      g_list_foreach (active_stream->cur_adapt_set->RepresentationBase->
+          ContentProtection, gst_dash_demux_send_content_protection_event,
+          stream);
     }
 
     gst_isoff_sidx_parser_init (&stream->sidx_parser);
@@ -669,6 +703,13 @@
           dashdemux->client->mpd_node->suggestedPresentationDelay * -1000);
       gst_date_time_unref (now);
       now = target;
+    } else if (dashdemux->default_presentation_delay) {
+      gint64 dfp =
+          gst_mpd_client_parse_default_presentation_delay (dashdemux->client,
+          dashdemux->default_presentation_delay);
+      GstDateTime *target = gst_mpd_client_add_time_difference (now, dfp);
+      gst_date_time_unref (now);
+      now = target;
     }
     period_idx =
         gst_mpd_client_get_period_index_at_time (dashdemux->client, now);
@@ -771,6 +812,15 @@
       name = g_strdup_printf ("video_%02u", demux->n_video_streams++);
       tmpl = gst_static_pad_template_get (&gst_dash_demux_videosrc_template);
       break;
+    case GST_STREAM_APPLICATION:
+      if (gst_mpd_client_active_stream_contains_subtitles (stream)) {
+        name = g_strdup_printf ("subtitle_%02u", demux->n_subtitle_streams++);
+        tmpl =
+            gst_static_pad_template_get (&gst_dash_demux_subtitlesrc_template);
+      } else {
+        return NULL;
+      }
+      break;
     default:
       g_assert_not_reached ();
       return NULL;
@@ -814,7 +864,8 @@
     GstActiveStream * stream)
 {
   guint width = 0, height = 0;
-  const gchar *mimeType = NULL;
+  gint fps_num = 0, fps_den = 1;
+  gboolean have_fps = FALSE;
   GstCaps *caps = NULL;
 
   if (stream == NULL)
@@ -824,17 +875,23 @@
   if (!gst_mpd_client_get_bitstream_switching_flag (stream)) {
     width = gst_mpd_client_get_video_stream_width (stream);
     height = gst_mpd_client_get_video_stream_height (stream);
+    have_fps =
+        gst_mpd_client_get_video_stream_framerate (stream, &fps_num, &fps_den);
   }
-  mimeType = gst_mpd_client_get_stream_mimeType (stream);
-  if (mimeType == NULL)
+  caps = gst_mpd_client_get_stream_caps (stream);
+  if (caps == NULL)
     return NULL;
 
-  caps = gst_caps_from_string (mimeType);
   if (width > 0 && height > 0) {
     gst_caps_set_simple (caps, "width", G_TYPE_INT, width, "height",
         G_TYPE_INT, height, NULL);
   }
 
+  if (have_fps) {
+    gst_caps_set_simple (caps, "framerate", GST_TYPE_FRACTION, fps_num,
+        fps_den, NULL);
+  }
+
   return caps;
 }
 
@@ -843,7 +900,6 @@
     GstActiveStream * stream)
 {
   guint rate = 0, channels = 0;
-  const gchar *mimeType;
   GstCaps *caps = NULL;
 
   if (stream == NULL)
@@ -854,11 +910,10 @@
     channels = gst_mpd_client_get_audio_stream_num_channels (stream);
     rate = gst_mpd_client_get_audio_stream_rate (stream);
   }
-  mimeType = gst_mpd_client_get_stream_mimeType (stream);
-  if (mimeType == NULL)
+  caps = gst_mpd_client_get_stream_caps (stream);
+  if (caps == NULL)
     return NULL;
 
-  caps = gst_caps_from_string (mimeType);
   if (rate > 0) {
     gst_caps_set_simple (caps, "rate", G_TYPE_INT, rate, NULL);
   }
@@ -873,18 +928,15 @@
 gst_dash_demux_get_application_input_caps (GstDashDemux * demux,
     GstActiveStream * stream)
 {
-  const gchar *mimeType;
   GstCaps *caps = NULL;
 
   if (stream == NULL)
     return NULL;
 
-  mimeType = gst_mpd_client_get_stream_mimeType (stream);
-  if (mimeType == NULL)
+  caps = gst_mpd_client_get_stream_caps (stream);
+  if (caps == NULL)
     return NULL;
 
-  caps = gst_caps_from_string (mimeType);
-
   return caps;
 }
 
@@ -994,24 +1046,43 @@
   return GST_FLOW_EOS;
 }
 
+static gint
+gst_dash_demux_index_entry_search (GstSidxBoxEntry * entry, GstClockTime * ts,
+    gpointer user_data)
+{
+  GstClockTime entry_ts = entry->pts + entry->duration;
+  if (entry_ts < *ts)
+    return -1;
+  else if (entry->pts > *ts)
+    return 1;
+  else
+    return 0;
+}
+
 static void
 gst_dash_demux_stream_sidx_seek (GstDashDemuxStream * dashstream,
     GstClockTime ts)
 {
   GstSidxBox *sidx = SIDX (dashstream);
-  gint i;
+  GstSidxBoxEntry *entry;
+  gint idx = sidx->entries_count;
 
-  /* TODO optimize to a binary search */
-  for (i = 0; i < sidx->entries_count; i++) {
-    if (sidx->entries[i].pts + sidx->entries[i].duration >= ts)
-      break;
-  }
-  sidx->entry_index = i;
-  dashstream->sidx_index = i;
-  if (i < sidx->entries_count)
-    dashstream->sidx_current_remaining = sidx->entries[i].size;
-  else
+  /* check whether ts is already past the last element or not */
+  if (sidx->entries[idx - 1].pts + sidx->entries[idx - 1].duration < ts) {
     dashstream->sidx_current_remaining = 0;
+  } else {
+    entry =
+        gst_util_array_binary_search (sidx->entries, sidx->entries_count,
+        sizeof (GstSidxBoxEntry),
+        (GCompareDataFunc) gst_dash_demux_index_entry_search,
+        GST_SEARCH_MODE_BEFORE, &ts, NULL);
+
+    idx = entry - sidx->entries;
+    dashstream->sidx_current_remaining = sidx->entries[idx].size;
+  }
+
+  sidx->entry_index = idx;
+  dashstream->sidx_index = idx;
 }
 
 static GstFlowReturn
@@ -1404,7 +1475,8 @@
     /* subtract the server's clock drift, so that if the server's
        time is behind our idea of UTC, we need to sleep for longer
        before requesting a fragment */
-    return diff - gst_dash_demux_get_clock_compensation (dashdemux);
+    return diff -
+        gst_dash_demux_get_clock_compensation (dashdemux) * GST_USECOND;
   }
   return 0;
 }
@@ -1584,7 +1656,6 @@
 
   clock_drift = g_slice_new0 (GstDashDemuxClockDrift);
   g_mutex_init (&clock_drift->clock_lock);
-  g_cond_init (&clock_drift->clock_cond);
   clock_drift->next_update = g_get_monotonic_time ();
   return clock_drift;
 }
@@ -1596,7 +1667,6 @@
     g_mutex_lock (&clock_drift->clock_lock);
     if (clock_drift->ntp_clock)
       g_object_unref (clock_drift->ntp_clock);
-    g_cond_clear (&clock_drift->clock_cond);
     g_mutex_unlock (&clock_drift->clock_lock);
     g_mutex_clear (&clock_drift->clock_lock);
     g_slice_free (GstDashDemuxClockDrift, clock_drift);
@@ -1956,8 +2026,6 @@
       g_mutex_lock (&clock_drift->clock_lock);
       clock_drift->clock_compensation =
           g_date_time_difference (server_now, client_now);
-      clock_drift->got_clock = TRUE;
-      g_cond_broadcast (&clock_drift->clock_cond);
       g_mutex_unlock (&clock_drift->clock_lock);
       GST_DEBUG_OBJECT (demux,
           "Difference between client and server clocks is %lfs",
diff --git a/ext/dash/gstdashdemux.h b/ext/dash/gstdashdemux.h
index ca2af31..5ed9620 100644
--- a/ext/dash/gstdashdemux.h
+++ b/ext/dash/gstdashdemux.h
@@ -96,9 +96,11 @@
   /* Properties */
   GstClockTime max_buffering_time;      /* Maximum buffering time accumulated during playback */
   guint64 max_bitrate;          /* max of bitrate supported by target decoder         */
+  gchar* default_presentation_delay; /* presentation time delay if MPD@suggestedPresentationDelay is not present */
 
   gint n_audio_streams;
   gint n_video_streams;
+  gint n_subtitle_streams;
 };
 
 struct _GstDashDemuxClass
diff --git a/ext/dash/gstmpdparser.c b/ext/dash/gstmpdparser.c
index 80dc0df..8510999 100644
--- a/ext/dash/gstmpdparser.c
+++ b/ext/dash/gstmpdparser.c
@@ -33,6 +33,9 @@
 #define GST_CAT_DEFAULT gst_dash_demux_debug
 
 /* Property parsing */
+static gboolean gst_mpdparser_get_xml_prop_validated_string (xmlNode * a_node,
+    const gchar * property_name, gchar ** property_value,
+    gboolean (*validator) (const char *));
 static gboolean gst_mpdparser_get_xml_prop_string (xmlNode * a_node,
     const gchar * property_name, gchar ** property_value);
 static gboolean gst_mpdparser_get_xml_ns_prop_string (xmlNode * a_node,
@@ -69,7 +72,8 @@
 static gboolean gst_mpdparser_get_xml_prop_dateTime (xmlNode * a_node,
     const gchar * property_name, GstDateTime ** property_value);
 static gboolean gst_mpdparser_get_xml_prop_duration (xmlNode * a_node,
-    const gchar * property_name, gint64 default_value, gint64 * property_value);
+    const gchar * property_name, guint64 default_value,
+    guint64 * property_value);
 static gboolean gst_mpdparser_get_xml_node_content (xmlNode * a_node,
     gchar ** content);
 static gchar *gst_mpdparser_get_xml_node_namespace (xmlNode * a_node,
@@ -95,33 +99,36 @@
 static void gst_mpdparser_parse_s_node (GQueue * queue, xmlNode * a_node);
 static void gst_mpdparser_parse_segment_timeline_node (GstSegmentTimelineNode **
     pointer, xmlNode * a_node);
-static void gst_mpdparser_parse_mult_seg_base_type_ext (GstMultSegmentBaseType
-    ** pointer, xmlNode * a_node, GstMultSegmentBaseType * parent);
-static void gst_mpdparser_parse_segment_list_node (GstSegmentListNode **
+static gboolean
+gst_mpdparser_parse_mult_seg_base_type_ext (GstMultSegmentBaseType ** pointer,
+    xmlNode * a_node, GstMultSegmentBaseType * parent);
+static gboolean gst_mpdparser_parse_segment_list_node (GstSegmentListNode **
     pointer, xmlNode * a_node, GstSegmentListNode * parent);
 static void
 gst_mpdparser_parse_representation_base_type (GstRepresentationBaseType **
     pointer, xmlNode * a_node);
-static void gst_mpdparser_parse_representation_node (GList ** list,
+static gboolean gst_mpdparser_parse_representation_node (GList ** list,
     xmlNode * a_node, GstAdaptationSetNode * parent);
-static void gst_mpdparser_parse_adaptation_set_node (GList ** list,
+static gboolean gst_mpdparser_parse_adaptation_set_node (GList ** list,
     xmlNode * a_node, GstPeriodNode * parent);
 static void gst_mpdparser_parse_subset_node (GList ** list, xmlNode * a_node);
-static void gst_mpdparser_parse_segment_template_node (GstSegmentTemplateNode **
-    pointer, xmlNode * a_node, GstSegmentTemplateNode * parent);
-static void gst_mpdparser_parse_period_node (GList ** list, xmlNode * a_node);
+static gboolean
+gst_mpdparser_parse_segment_template_node (GstSegmentTemplateNode ** pointer,
+    xmlNode * a_node, GstSegmentTemplateNode * parent);
+static gboolean gst_mpdparser_parse_period_node (GList ** list,
+    xmlNode * a_node);
 static void gst_mpdparser_parse_program_info_node (GList ** list,
     xmlNode * a_node);
 static void gst_mpdparser_parse_metrics_range_node (GList ** list,
     xmlNode * a_node);
 static void gst_mpdparser_parse_metrics_node (GList ** list, xmlNode * a_node);
-static void gst_mpdparser_parse_root_node (GstMPDNode ** pointer,
+static gboolean gst_mpdparser_parse_root_node (GstMPDNode ** pointer,
     xmlNode * a_node);
 static void gst_mpdparser_parse_utctiming_node (GList ** list,
     xmlNode * a_node);
 
 /* Helper functions */
-static gint convert_to_millisecs (gint decimals, gint pos);
+static guint convert_to_millisecs (guint decimals, gint pos);
 static int strncmp_ext (const char *s1, const char *s2);
 static GstStreamPeriod *gst_mpdparser_get_stream_period (GstMpdClient * client);
 static GstSNode *gst_mpdparser_clone_s_node (GstSNode * pointer);
@@ -140,11 +147,12 @@
 static gchar *gst_mpdparser_build_URL_from_template (const gchar * url_template,
     const gchar * id, guint number, guint bandwidth, guint64 time);
 static gboolean gst_mpd_client_add_media_segment (GstActiveStream * stream,
-    GstSegmentURLNode * url_node, guint number, gint repeat, gint64 scale_start,
-    gint64 scale_duration, GstClockTime start, GstClockTime duration);
+    GstSegmentURLNode * url_node, guint number, gint repeat,
+    guint64 scale_start, guint64 scale_duration, GstClockTime start,
+    GstClockTime duration);
 static const gchar *gst_mpdparser_mimetype_to_caps (const gchar * mimeType);
 static GstClockTime gst_mpd_client_get_segment_duration (GstMpdClient * client,
-    GstActiveStream * stream, gint64 * scale_duration);
+    GstActiveStream * stream, guint64 * scale_duration);
 static GstDateTime *gst_mpd_client_get_availability_start_time (GstMpdClient *
     client);
 
@@ -253,14 +261,20 @@
 
 /* functions to parse node namespaces, content and properties */
 static gboolean
-gst_mpdparser_get_xml_prop_string (xmlNode * a_node,
-    const gchar * property_name, gchar ** property_value)
+gst_mpdparser_get_xml_prop_validated_string (xmlNode * a_node,
+    const gchar * property_name, gchar ** property_value,
+    gboolean (*validate) (const char *))
 {
   xmlChar *prop_string;
   gboolean exists = FALSE;
 
   prop_string = xmlGetProp (a_node, (const xmlChar *) property_name);
   if (prop_string) {
+    if (validate && !(*validate) ((const char *) prop_string)) {
+      GST_WARNING ("Validation failure: %s", prop_string);
+      xmlFree (prop_string);
+      return FALSE;
+    }
     *property_value = (gchar *) prop_string;
     exists = TRUE;
     GST_LOG (" - %s: %s", property_name, prop_string);
@@ -289,6 +303,28 @@
 }
 
 static gboolean
+gst_mpdparser_get_xml_prop_string (xmlNode * a_node,
+    const gchar * property_name, gchar ** property_value)
+{
+  return gst_mpdparser_get_xml_prop_validated_string (a_node, property_name,
+      property_value, NULL);
+}
+
+static gboolean
+gst_mpdparser_validate_no_whitespace (const char *s)
+{
+  return !strpbrk (s, "\r\n\t ");
+}
+
+static gboolean
+gst_mpdparser_get_xml_prop_string_no_whitespace (xmlNode * a_node,
+    const gchar * property_name, gchar ** property_value)
+{
+  return gst_mpdparser_get_xml_prop_validated_string (a_node, property_name,
+      property_value, gst_mpdparser_validate_no_whitespace);
+}
+
+static gboolean
 gst_mpdparser_get_xml_prop_string_vector_type (xmlNode * a_node,
     const gchar * property_name, gchar *** property_value)
 {
@@ -351,13 +387,16 @@
   *property_value = default_val;
   prop_string = xmlGetProp (a_node, (const xmlChar *) property_name);
   if (prop_string) {
-    if (sscanf ((gchar *) prop_string, "%u", property_value) == 1) {
+    if (sscanf ((gchar *) prop_string, "%u", property_value) == 1 &&
+        strstr ((gchar *) prop_string, "-") == NULL) {
       exists = TRUE;
       GST_LOG (" - %s: %u", property_name, *property_value);
     } else {
       GST_WARNING
           ("failed to parse unsigned integer property %s from xml string %s",
           property_name, prop_string);
+      /* sscanf might have written to *property_value. Restore to default */
+      *property_value = default_val;
     }
     xmlFree (prop_string);
   }
@@ -376,13 +415,16 @@
   prop_string = xmlGetProp (a_node, (const xmlChar *) property_name);
   if (prop_string) {
     if (sscanf ((gchar *) prop_string, "%" G_GUINT64_FORMAT,
-            property_value) == 1) {
+            property_value) == 1 &&
+        strstr ((gchar *) prop_string, "-") == NULL) {
       exists = TRUE;
       GST_LOG (" - %s: %" G_GUINT64_FORMAT, property_name, *property_value);
     } else {
       GST_WARNING
           ("failed to parse unsigned integer property %s from xml string %s",
           property_name, prop_string);
+      /* sscanf might have written to *property_value. Restore to default */
+      *property_value = default_val;
     }
     xmlFree (prop_string);
   }
@@ -409,12 +451,21 @@
         exists = TRUE;
         GST_LOG (" - %s:", property_name);
         for (i = 0; i < *value_size; i++) {
-          if (sscanf ((gchar *) str_vector[i], "%u", &prop_uint_vector[i]) == 1) {
+          if (sscanf ((gchar *) str_vector[i], "%u", &prop_uint_vector[i]) == 1
+              && strstr (str_vector[i], "-") == NULL) {
             GST_LOG ("    %u", prop_uint_vector[i]);
           } else {
             GST_WARNING
                 ("failed to parse uint vector type property %s from xml string %s",
                 property_name, str_vector[i]);
+            /* there is no special value to put in prop_uint_vector[i] to
+             * signal it is invalid, so we just clean everything and return
+             * FALSE
+             */
+            g_free (prop_uint_vector);
+            prop_uint_vector = NULL;
+            exists = FALSE;
+            break;
           }
         }
         *property_value = prop_uint_vector;
@@ -562,13 +613,25 @@
     }
     /* read first_byte_pos */
     if (pos != 0) {
-      if (sscanf (str, "%" G_GUINT64_FORMAT, &first_byte_pos) != 1) {
+      /* replace str[pos] with '\0' to allow sscanf to not be confused by
+       * the minus sign (eg " -1" (observe the space before -) would otherwise
+       * be interpreted as range -1 to 1)
+       */
+      str[pos] = 0;
+      if (sscanf (str, "%" G_GUINT64_FORMAT, &first_byte_pos) != 1 ||
+          strstr (str, "-") != NULL) {
+        /* sscanf failed or it found a negative number */
+        /* restore the '-' sign */
+        str[pos] = '-';
         goto error;
       }
+      /* restore the '-' sign */
+      str[pos] = '-';
     }
     /* read last_byte_pos */
     if (pos < (len - 1)) {
-      if (sscanf (str + pos + 1, "%" G_GUINT64_FORMAT, &last_byte_pos) != 1) {
+      if (sscanf (str + pos + 1, "%" G_GUINT64_FORMAT, &last_byte_pos) != 1 ||
+          strstr (str + pos + 1, "-") != NULL) {
         goto error;
       }
     }
@@ -613,6 +676,10 @@
       GST_TRACE ("pos %d >= len %d", pos, len);
       goto error;
     }
+    /* search for negative sign */
+    if (strstr (str, "-") != NULL) {
+      goto error;
+    }
     /* read num */
     if (pos != 0) {
       if (sscanf (str, "%u", &num) != 1) {
@@ -659,6 +726,11 @@
     str = (gchar *) prop_string;
     GST_TRACE ("framerate: %s, len %d", str, len);
 
+    /* search for negative sign */
+    if (strstr (str, "-") != NULL) {
+      goto error;
+    }
+
     /* read "/" if available */
     pos = strcspn (str, "/");
     /* read num */
@@ -717,7 +789,7 @@
       val = 0;
     } else {
       flag = TRUE;
-      if (sscanf (str, "%u", &val) != 1)
+      if (sscanf (str, "%u", &val) != 1 || strstr (str, "-") != NULL)
         goto error;
     }
 
@@ -764,7 +836,8 @@
   xmlChar *prop_string;
   gchar *str;
   gint ret, pos;
-  gint year, month, day, hour, minute, second;
+  gint year, month, day, hour, minute;
+  gdouble second;
   gboolean exists = FALSE;
 
   prop_string = xmlGetProp (a_node, (const xmlChar *) property_name);
@@ -773,46 +846,46 @@
     GST_TRACE ("dateTime: %s, len %d", str, xmlStrlen (prop_string));
     /* parse year */
     ret = sscanf (str, "%d", &year);
-    if (ret != 1)
+    if (ret != 1 || year <= 0)
       goto error;
     pos = strcspn (str, "-");
     str += (pos + 1);
     GST_TRACE (" - year %d", year);
     /* parse month */
     ret = sscanf (str, "%d", &month);
-    if (ret != 1)
+    if (ret != 1 || month <= 0)
       goto error;
     pos = strcspn (str, "-");
     str += (pos + 1);
     GST_TRACE (" - month %d", month);
     /* parse day */
     ret = sscanf (str, "%d", &day);
-    if (ret != 1)
+    if (ret != 1 || day <= 0)
       goto error;
     pos = strcspn (str, "T");
     str += (pos + 1);
     GST_TRACE (" - day %d", day);
     /* parse hour */
     ret = sscanf (str, "%d", &hour);
-    if (ret != 1)
+    if (ret != 1 || hour < 0)
       goto error;
     pos = strcspn (str, ":");
     str += (pos + 1);
     GST_TRACE (" - hour %d", hour);
     /* parse minute */
     ret = sscanf (str, "%d", &minute);
-    if (ret != 1)
+    if (ret != 1 || minute < 0)
       goto error;
     pos = strcspn (str, ":");
     str += (pos + 1);
     GST_TRACE (" - minute %d", minute);
     /* parse second */
-    ret = sscanf (str, "%d", &second);
-    if (ret != 1)
+    ret = sscanf (str, "%lf", &second);
+    if (ret != 1 || second < 0)
       goto error;
-    GST_TRACE (" - second %d", second);
+    GST_TRACE (" - second %lf", second);
 
-    GST_LOG (" - %s: %4d/%02d/%02d %02d:%02d:%02d", property_name,
+    GST_LOG (" - %s: %4d/%02d/%02d %02d:%02d:%09.6lf", property_name,
         year, month, day, hour, minute, second);
 
     exists = TRUE;
@@ -849,10 +922,11 @@
 */
 
 /* this function computes decimals * 10 ^ (3 - pos) */
-static gint
-convert_to_millisecs (gint decimals, gint pos)
+static guint
+convert_to_millisecs (guint decimals, gint pos)
 {
-  gint num = 1, den = 1, i = 3 - pos;
+  guint num = 1, den = 1;
+  gint i = 3 - pos;
 
   while (i < 0) {
     den *= 10;
@@ -867,141 +941,239 @@
 }
 
 static gboolean
+accumulate (guint64 * v, guint64 mul, guint64 add)
+{
+  guint64 tmp;
+
+  if (*v > G_MAXUINT64 / mul)
+    return FALSE;
+  tmp = *v * mul;
+  if (tmp > G_MAXUINT64 - add)
+    return FALSE;
+  *v = tmp + add;
+  return TRUE;
+}
+
+static gboolean
+gst_mpdparser_parse_duration (const char *str, guint64 * value)
+{
+  gint ret, len, pos, posT;
+  gint years = -1, months = -1, days = -1, hours = -1, minutes = -1, seconds =
+      -1, decimals = -1, read;
+  gboolean have_ms = FALSE;
+  guint64 tmp_value;
+
+  len = strlen (str);
+  GST_TRACE ("duration: %s, len %d", str, len);
+  if (strspn (str, "PT0123456789., \tHMDSY") < len) {
+    GST_WARNING ("Invalid character found: '%s'", str);
+    goto error;
+  }
+  /* skip leading/trailing whitespace */
+  while (strchr (" \t", str[0])) {
+    str++;
+    len--;
+  }
+  while (len > 0 && strchr (" \t", str[len - 1]))
+    --len;
+
+  /* read "P" for period */
+  if (str[0] != 'P') {
+    GST_WARNING ("P not found at the beginning of the string!");
+    goto error;
+  }
+  str++;
+  len--;
+
+  /* read "T" for time (if present) */
+  posT = strcspn (str, "T");
+  len -= posT;
+  if (posT > 0) {
+    /* there is some room between P and T, so there must be a period section */
+    /* read years, months, days */
+    do {
+      GST_TRACE ("parsing substring %s", str);
+      pos = strcspn (str, "YMD");
+      ret = sscanf (str, "%u", &read);
+      if (ret != 1) {
+        GST_WARNING ("can not read integer value from string %s!", str);
+        goto error;
+      }
+      switch (str[pos]) {
+        case 'Y':
+          if (years != -1 || months != -1 || days != -1) {
+            GST_WARNING ("year, month or day was already set");
+            goto error;
+          }
+          years = read;
+          break;
+        case 'M':
+          if (months != -1 || days != -1) {
+            GST_WARNING ("month or day was already set");
+            goto error;
+          }
+          months = read;
+          if (months >= 12) {
+            GST_WARNING ("Month out of range");
+            goto error;
+          }
+          break;
+        case 'D':
+          if (days != -1) {
+            GST_WARNING ("day was already set");
+            goto error;
+          }
+          days = read;
+          if (days >= 31) {
+            GST_WARNING ("Day out of range");
+            goto error;
+          }
+          break;
+        default:
+          GST_WARNING ("unexpected char %c!", str[pos]);
+          goto error;
+          break;
+      }
+      GST_TRACE ("read number %u type %c", read, str[pos]);
+      str += (pos + 1);
+      posT -= (pos + 1);
+    } while (posT > 0);
+  }
+
+  if (years == -1)
+    years = 0;
+  if (months == -1)
+    months = 0;
+  if (days == -1)
+    days = 0;
+
+  GST_TRACE ("Y:M:D=%d:%d:%d", years, months, days);
+
+  /* read "T" for time (if present) */
+  /* here T is at pos == 0 */
+  str++;
+  len--;
+  pos = 0;
+  if (pos < len) {
+    /* T found, there is a time section */
+    /* read hours, minutes, seconds, hundredths of second */
+    do {
+      GST_TRACE ("parsing substring %s", str);
+      pos = strcspn (str, "HMS,.");
+      ret = sscanf (str, "%u", &read);
+      if (ret != 1) {
+        GST_WARNING ("can not read integer value from string %s!", str);
+        goto error;
+      }
+      switch (str[pos]) {
+        case 'H':
+          if (hours != -1 || minutes != -1 || seconds != -1) {
+            GST_WARNING ("hour, minute or second was already set");
+            goto error;
+          }
+          hours = read;
+          if (hours >= 24) {
+            GST_WARNING ("Hour out of range");
+            goto error;
+          }
+          break;
+        case 'M':
+          if (minutes != -1 || seconds != -1) {
+            GST_WARNING ("minute or second was already set");
+            goto error;
+          }
+          minutes = read;
+          if (minutes >= 60) {
+            GST_WARNING ("Minute out of range");
+            goto error;
+          }
+          break;
+        case 'S':
+          if (have_ms) {
+            /* we have read the decimal part of the seconds */
+            decimals = convert_to_millisecs (read, pos);
+            GST_TRACE ("decimal number %u (%d digits) -> %d ms", read, pos,
+                decimals);
+          } else {
+            if (seconds != -1) {
+              GST_WARNING ("second was already set");
+              goto error;
+            }
+            /* no decimals */
+            seconds = read;
+          }
+          break;
+        case '.':
+        case ',':
+          /* we have read the integer part of a decimal number in seconds */
+          if (seconds != -1) {
+            GST_WARNING ("second was already set");
+            goto error;
+          }
+          seconds = read;
+          have_ms = TRUE;
+          break;
+        default:
+          GST_WARNING ("unexpected char %c!", str[pos]);
+          goto error;
+          break;
+      }
+      GST_TRACE ("read number %u type %c", read, str[pos]);
+      str += pos + 1;
+      len -= (pos + 1);
+    } while (len > 0);
+  }
+
+  if (hours == -1)
+    hours = 0;
+  if (minutes == -1)
+    minutes = 0;
+  if (seconds == -1)
+    seconds = 0;
+  if (decimals == -1)
+    decimals = 0;
+  GST_TRACE ("H:M:S.MS=%d:%d:%d.%03d", hours, minutes, seconds, decimals);
+
+  tmp_value = 0;
+  if (!accumulate (&tmp_value, 1, years)
+      || !accumulate (&tmp_value, 365, months * 30)
+      || !accumulate (&tmp_value, 1, days)
+      || !accumulate (&tmp_value, 24, hours)
+      || !accumulate (&tmp_value, 60, minutes)
+      || !accumulate (&tmp_value, 60, seconds)
+      || !accumulate (&tmp_value, 1000, decimals))
+    goto error;
+
+  /* ensure it can be converted from milliseconds to nanoseconds */
+  if (tmp_value > G_MAXUINT64 / 1000000)
+    goto error;
+
+  *value = tmp_value;
+  return TRUE;
+
+error:
+  return FALSE;
+}
+
+static gboolean
 gst_mpdparser_get_xml_prop_duration (xmlNode * a_node,
-    const gchar * property_name, gint64 default_value, gint64 * property_value)
+    const gchar * property_name, guint64 default_value,
+    guint64 * property_value)
 {
   xmlChar *prop_string;
   gchar *str;
-  gint ret, read, len, pos, posT;
-  gint years = 0, months = 0, days = 0, hours = 0, minutes = 0, seconds =
-      0, decimals = 0;
-  gint sign = 1;
-  gboolean have_ms = FALSE;
   gboolean exists = FALSE;
 
   *property_value = default_value;
   prop_string = xmlGetProp (a_node, (const xmlChar *) property_name);
   if (prop_string) {
-    len = xmlStrlen (prop_string);
     str = (gchar *) prop_string;
-    GST_TRACE ("duration: %s, len %d", str, len);
-    /* read "-" for sign, if present */
-    pos = strcspn (str, "-");
-    if (pos < len) {            /* found "-" */
-      if (pos != 0) {
-        GST_WARNING ("sign \"-\" non at the beginning of the string");
-        goto error;
-      }
-      GST_TRACE ("found - sign at the beginning");
-      sign = -1;
-      str++;
-      len--;
-    }
-    /* read "P" for period */
-    pos = strcspn (str, "P");
-    if (pos != 0) {
-      GST_WARNING ("P not found at the beginning of the string!");
+    if (!gst_mpdparser_parse_duration (str, property_value))
       goto error;
-    }
-    str++;
-    len--;
-    /* read "T" for time (if present) */
-    posT = strcspn (str, "T");
-    len -= posT;
-    if (posT > 0) {
-      /* there is some room between P and T, so there must be a period section */
-      /* read years, months, days */
-      do {
-        GST_TRACE ("parsing substring %s", str);
-        pos = strcspn (str, "YMD");
-        ret = sscanf (str, "%d", &read);
-        if (ret != 1) {
-          GST_WARNING ("can not read integer value from string %s!", str);
-          goto error;
-        }
-        switch (str[pos]) {
-          case 'Y':
-            years = read;
-            break;
-          case 'M':
-            months = read;
-            break;
-          case 'D':
-            days = read;
-            break;
-          default:
-            GST_WARNING ("unexpected char %c!", str[pos]);
-            goto error;
-            break;
-        }
-        GST_TRACE ("read number %d type %c", read, str[pos]);
-        str += (pos + 1);
-        posT -= (pos + 1);
-      } while (posT > 0);
-
-      GST_TRACE ("Y:M:D=%d:%d:%d", years, months, days);
-    }
-    /* read "T" for time (if present) */
-    /* here T is at pos == 0 */
-    str++;
-    len--;
-    pos = 0;
-    if (pos < len) {
-      /* T found, there is a time section */
-      /* read hours, minutes, seconds, cents of second */
-      do {
-        GST_TRACE ("parsing substring %s", str);
-        pos = strcspn (str, "HMS,.");
-        ret = sscanf (str, "%d", &read);
-        if (ret != 1) {
-          GST_WARNING ("can not read integer value from string %s!", str);
-          goto error;
-        }
-        switch (str[pos]) {
-          case 'H':
-            hours = read;
-            break;
-          case 'M':
-            minutes = read;
-            break;
-          case 'S':
-            if (have_ms) {
-              /* we have read the decimal part of the seconds */
-              decimals = convert_to_millisecs (read, pos);
-              GST_TRACE ("decimal number %d (%d digits) -> %d ms", read, pos,
-                  decimals);
-            } else {
-              /* no decimals */
-              seconds = read;
-            }
-            break;
-          case '.':
-          case ',':
-            /* we have read the integer part of a decimal number in seconds */
-            seconds = read;
-            have_ms = TRUE;
-            break;
-          default:
-            GST_WARNING ("unexpected char %c!", str[pos]);
-            goto error;
-            break;
-        }
-        GST_TRACE ("read number %d type %c", read, str[pos]);
-        str += pos + 1;
-        len -= (pos + 1);
-      } while (len > 0);
-
-      GST_TRACE ("H:M:S.MS=%d:%d:%d.%03d", hours, minutes, seconds, decimals);
-    }
-
+    GST_LOG (" - %s: %" G_GUINT64_FORMAT, property_name, *property_value);
     xmlFree (prop_string);
     exists = TRUE;
-    *property_value =
-        sign * ((((((gint64) years * 365 + months * 30 + days) * 24 +
-                    hours) * 60 + minutes) * 60 + seconds) * 1000 + decimals);
-    GST_LOG (" - %s: %" G_GINT64_FORMAT, property_name, *property_value);
   }
-
   return exists;
 
 error:
@@ -1396,16 +1568,17 @@
   }
 }
 
-static void
+static gboolean
 gst_mpdparser_parse_mult_seg_base_type_ext (GstMultSegmentBaseType ** pointer,
     xmlNode * a_node, GstMultSegmentBaseType * parent)
 {
   xmlNode *cur_node;
   GstMultSegmentBaseType *mult_seg_base_type;
   guint intval;
+  gboolean has_timeline = FALSE, has_duration = FALSE;
 
   gst_mpdparser_free_mult_seg_base_type_ext (*pointer);
-  *pointer = mult_seg_base_type = g_slice_new0 (GstMultSegmentBaseType);
+  mult_seg_base_type = g_slice_new0 (GstMultSegmentBaseType);
 
   mult_seg_base_type->duration = 0;
   mult_seg_base_type->startNumber = 1;
@@ -1424,6 +1597,7 @@
   if (gst_mpdparser_get_xml_prop_unsigned_integer (a_node, "duration", 0,
           &intval)) {
     mult_seg_base_type->duration = intval;
+    has_duration = TRUE;
   }
 
   if (gst_mpdparser_get_xml_prop_unsigned_integer (a_node, "startNumber", 1,
@@ -1442,6 +1616,7 @@
         /* parse frees the segmenttimeline if any */
         gst_mpdparser_parse_segment_timeline_node
             (&mult_seg_base_type->SegmentTimeline, cur_node);
+        has_timeline = TRUE;
       } else if (xmlStrcmp (cur_node->name,
               (xmlChar *) "BitstreamSwitching") == 0) {
         /* parse frees the old url before setting the new one */
@@ -1450,18 +1625,31 @@
       }
     }
   }
+
+  if (!has_duration && !has_timeline) {
+    GST_ERROR ("segment has neither duration nor timeline");
+    goto error;
+  }
+
+  *pointer = mult_seg_base_type;
+  return TRUE;
+
+error:
+  gst_mpdparser_free_mult_seg_base_type_ext (mult_seg_base_type);
+  return FALSE;
 }
 
-static void
+static gboolean
 gst_mpdparser_parse_segment_list_node (GstSegmentListNode ** pointer,
     xmlNode * a_node, GstSegmentListNode * parent)
 {
   xmlNode *cur_node;
   GstSegmentListNode *new_segment_list;
   gchar *actuate;
+  gboolean segment_urls_inherited_from_parent = FALSE;
 
   gst_mpdparser_free_segment_list_node (*pointer);
-  *pointer = new_segment_list = g_slice_new0 (GstSegmentListNode);
+  new_segment_list = g_slice_new0 (GstSegmentListNode);
 
   /* Inherit attribute values from parent */
   if (parent) {
@@ -1473,6 +1661,7 @@
       new_segment_list->SegmentURL =
           g_list_append (new_segment_list->SegmentURL,
           gst_mpdparser_clone_segment_url (seg_url));
+      segment_urls_inherited_from_parent = TRUE;
     }
   }
 
@@ -1487,19 +1676,44 @@
   }
 
   GST_LOG ("extension of SegmentList node:");
-  gst_mpdparser_parse_mult_seg_base_type_ext
+  if (!gst_mpdparser_parse_mult_seg_base_type_ext
       (&new_segment_list->MultSegBaseType, a_node,
-      (parent ? parent->MultSegBaseType : NULL));
+          (parent ? parent->MultSegBaseType : NULL)))
+    goto error;
 
   /* explore children nodes */
   for (cur_node = a_node->children; cur_node; cur_node = cur_node->next) {
     if (cur_node->type == XML_ELEMENT_NODE) {
       if (xmlStrcmp (cur_node->name, (xmlChar *) "SegmentURL") == 0) {
+        if (segment_urls_inherited_from_parent) {
+          /*
+           * SegmentBase, SegmentTemplate and SegmentList shall inherit
+           * attributes and elements from the same element on a higher level.
+           * If the same attribute or element is present on both levels,
+           * the one on the lower level shall take precedence over the one
+           * on the higher level.
+           */
+
+          /* Clear the list of inherited segment URLs */
+          g_list_free_full (new_segment_list->SegmentURL,
+              (GDestroyNotify) gst_mpdparser_free_segment_url_node);
+          new_segment_list->SegmentURL = NULL;
+
+          /* mark the fact that we cleared the list, so that it is not tried again */
+          segment_urls_inherited_from_parent = FALSE;
+        }
         gst_mpdparser_parse_segment_url_node (&new_segment_list->SegmentURL,
             cur_node);
       }
     }
   }
+
+  *pointer = new_segment_list;
+  return TRUE;
+
+error:
+  gst_mpdparser_free_segment_list_node (new_segment_list);
+  return FALSE;
 }
 
 static void
@@ -1522,6 +1736,10 @@
   gst_mpdparser_get_xml_prop_ratio (a_node, "sar", &representation_base->sar);
   gst_mpdparser_get_xml_prop_framerate (a_node, "frameRate",
       &representation_base->frameRate);
+  gst_mpdparser_get_xml_prop_framerate (a_node, "minFrameRate",
+      &representation_base->minFrameRate);
+  gst_mpdparser_get_xml_prop_framerate (a_node, "maxFrameRate",
+      &representation_base->maxFrameRate);
   gst_mpdparser_get_xml_prop_string (a_node, "audioSamplingRate",
       &representation_base->audioSamplingRate);
   gst_mpdparser_get_xml_prop_string (a_node, "mimeType",
@@ -1560,7 +1778,7 @@
   }
 }
 
-static void
+static gboolean
 gst_mpdparser_parse_representation_node (GList ** list, xmlNode * a_node,
     GstAdaptationSetNode * parent)
 {
@@ -1568,10 +1786,10 @@
   GstRepresentationNode *new_representation;
 
   new_representation = g_slice_new0 (GstRepresentationNode);
-  *list = g_list_append (*list, new_representation);
 
   GST_LOG ("attributes of Representation node:");
-  gst_mpdparser_get_xml_prop_string (a_node, "id", &new_representation->id);
+  gst_mpdparser_get_xml_prop_string_no_whitespace (a_node, "id",
+      &new_representation->id);
   gst_mpdparser_get_xml_prop_unsigned_integer (a_node, "bandwidth", 0,
       &new_representation->bandwidth);
   gst_mpdparser_get_xml_prop_unsigned_integer (a_node, "qualityRanking", 0,
@@ -1592,12 +1810,14 @@
         gst_mpdparser_parse_seg_base_type_ext (&new_representation->SegmentBase,
             cur_node, parent->SegmentBase);
       } else if (xmlStrcmp (cur_node->name, (xmlChar *) "SegmentTemplate") == 0) {
-        gst_mpdparser_parse_segment_template_node
+        if (!gst_mpdparser_parse_segment_template_node
             (&new_representation->SegmentTemplate, cur_node,
-            parent->SegmentTemplate);
+                parent->SegmentTemplate))
+          goto error;
       } else if (xmlStrcmp (cur_node->name, (xmlChar *) "SegmentList") == 0) {
-        gst_mpdparser_parse_segment_list_node (&new_representation->SegmentList,
-            cur_node, parent->SegmentList);
+        if (!gst_mpdparser_parse_segment_list_node
+            (&new_representation->SegmentList, cur_node, parent->SegmentList))
+          goto error;
       } else if (xmlStrcmp (cur_node->name, (xmlChar *) "BaseURL") == 0) {
         gst_mpdparser_parse_baseURL_node (&new_representation->BaseURLs,
             cur_node);
@@ -1608,9 +1828,18 @@
       }
     }
   }
+
+  /* some sanity checking */
+
+  *list = g_list_append (*list, new_representation);
+  return TRUE;
+
+error:
+  gst_mpdparser_free_representation_node (new_representation);
+  return FALSE;
 }
 
-static void
+static gboolean
 gst_mpdparser_parse_adaptation_set_node (GList ** list, xmlNode * a_node,
     GstPeriodNode * parent)
 {
@@ -1619,7 +1848,6 @@
   gchar *actuate;
 
   new_adap_set = g_slice_new0 (GstAdaptationSetNode);
-  *list = g_list_append (*list, new_adap_set);
 
   GST_LOG ("attributes of AdaptationSet node:");
 
@@ -1653,14 +1881,19 @@
       &new_adap_set->minHeight);
   gst_mpdparser_get_xml_prop_unsigned_integer (a_node, "maxHeight", 0,
       &new_adap_set->maxHeight);
-  gst_mpdparser_get_xml_prop_framerate (a_node, "minFrameRate",
-      &new_adap_set->minFrameRate);
-  gst_mpdparser_get_xml_prop_framerate (a_node, "maxFrameRate",
-      &new_adap_set->maxFrameRate);
   gst_mpdparser_get_xml_prop_cond_uint (a_node, "segmentAlignment",
       &new_adap_set->segmentAlignment);
   gst_mpdparser_get_xml_prop_boolean (a_node, "bitstreamSwitching",
-      FALSE, &new_adap_set->bitstreamSwitching);
+      parent->bitstreamSwitching, &new_adap_set->bitstreamSwitching);
+  if (parent->bitstreamSwitching && !new_adap_set->bitstreamSwitching) {
+    /* according to the standard, if the Period's bitstreamSwitching attribute
+     * is true, the AdaptationSet should not have the bitstreamSwitching
+     * attribute set to false.
+     * We should return a parsing error, but we are generous and ignore the
+     * standard violation.
+     */
+    new_adap_set->bitstreamSwitching = parent->bitstreamSwitching;
+  }
   gst_mpdparser_get_xml_prop_cond_uint (a_node, "subsegmentAlignment",
       &new_adap_set->subsegmentAlignment);
   gst_mpdparser_get_xml_prop_SAP_type (a_node, "subsegmentStartsWithSAP",
@@ -1691,15 +1924,17 @@
         gst_mpdparser_parse_seg_base_type_ext (&new_adap_set->SegmentBase,
             cur_node, parent->SegmentBase);
       } else if (xmlStrcmp (cur_node->name, (xmlChar *) "SegmentList") == 0) {
-        gst_mpdparser_parse_segment_list_node (&new_adap_set->SegmentList,
-            cur_node, parent->SegmentList);
+        if (!gst_mpdparser_parse_segment_list_node (&new_adap_set->SegmentList,
+                cur_node, parent->SegmentList))
+          goto error;
       } else if (xmlStrcmp (cur_node->name,
               (xmlChar *) "ContentComponent") == 0) {
         gst_mpdparser_parse_content_component_node
             (&new_adap_set->ContentComponents, cur_node);
       } else if (xmlStrcmp (cur_node->name, (xmlChar *) "SegmentTemplate") == 0) {
-        gst_mpdparser_parse_segment_template_node
-            (&new_adap_set->SegmentTemplate, cur_node, parent->SegmentTemplate);
+        if (!gst_mpdparser_parse_segment_template_node
+            (&new_adap_set->SegmentTemplate, cur_node, parent->SegmentTemplate))
+          goto error;
       }
     }
   }
@@ -1711,11 +1946,19 @@
   for (cur_node = a_node->children; cur_node; cur_node = cur_node->next) {
     if (cur_node->type == XML_ELEMENT_NODE) {
       if (xmlStrcmp (cur_node->name, (xmlChar *) "Representation") == 0) {
-        gst_mpdparser_parse_representation_node (&new_adap_set->Representations,
-            cur_node, new_adap_set);
+        if (!gst_mpdparser_parse_representation_node
+            (&new_adap_set->Representations, cur_node, new_adap_set))
+          goto error;
       }
     }
   }
+
+  *list = g_list_append (*list, new_adap_set);
+  return TRUE;
+
+error:
+  gst_mpdparser_free_adaptation_set_node (new_adap_set);
+  return FALSE;
 }
 
 static void
@@ -1731,7 +1974,7 @@
       &new_subset->contains, &new_subset->size);
 }
 
-static void
+static gboolean
 gst_mpdparser_parse_segment_template_node (GstSegmentTemplateNode ** pointer,
     xmlNode * a_node, GstSegmentTemplateNode * parent)
 {
@@ -1739,12 +1982,13 @@
   gchar *strval;
 
   gst_mpdparser_free_segment_template_node (*pointer);
-  *pointer = new_segment_template = g_slice_new0 (GstSegmentTemplateNode);
+  new_segment_template = g_slice_new0 (GstSegmentTemplateNode);
 
   GST_LOG ("extension of SegmentTemplate node:");
-  gst_mpdparser_parse_mult_seg_base_type_ext
+  if (!gst_mpdparser_parse_mult_seg_base_type_ext
       (&new_segment_template->MultSegBaseType, a_node,
-      (parent ? parent->MultSegBaseType : NULL));
+          (parent ? parent->MultSegBaseType : NULL)))
+    goto error;
 
   /* Inherit attribute values from parent when the value isn't found */
   GST_LOG ("attributes of SegmentTemplate node:");
@@ -1773,9 +2017,16 @@
     new_segment_template->bitstreamSwitching =
         xmlMemStrdup (parent->bitstreamSwitching);
   }
+
+  *pointer = new_segment_template;
+  return TRUE;
+
+error:
+  gst_mpdparser_free_segment_template_node (new_segment_template);
+  return FALSE;
 }
 
-static void
+static gboolean
 gst_mpdparser_parse_period_node (GList ** list, xmlNode * a_node)
 {
   xmlNode *cur_node;
@@ -1783,7 +2034,6 @@
   gchar *actuate;
 
   new_period = g_slice_new0 (GstPeriodNode);
-  *list = g_list_append (*list, new_period);
 
   GST_LOG ("attributes of Period node:");
 
@@ -1798,11 +2048,12 @@
   }
 
   gst_mpdparser_get_xml_prop_string (a_node, "id", &new_period->id);
-  gst_mpdparser_get_xml_prop_duration (a_node, "start", -1, &new_period->start);
-  gst_mpdparser_get_xml_prop_duration (a_node, "duration", -1,
-      &new_period->duration);
-  gst_mpdparser_get_xml_prop_boolean (a_node, "bitstreamSwitching",
-      FALSE, &new_period->bitstreamSwitching);
+  gst_mpdparser_get_xml_prop_duration (a_node, "start", GST_MPD_DURATION_NONE,
+      &new_period->start);
+  gst_mpdparser_get_xml_prop_duration (a_node, "duration",
+      GST_MPD_DURATION_NONE, &new_period->duration);
+  gst_mpdparser_get_xml_prop_boolean (a_node, "bitstreamSwitching", FALSE,
+      &new_period->bitstreamSwitching);
 
   /* explore children nodes */
   for (cur_node = a_node->children; cur_node; cur_node = cur_node->next) {
@@ -1811,11 +2062,13 @@
         gst_mpdparser_parse_seg_base_type_ext (&new_period->SegmentBase,
             cur_node, NULL);
       } else if (xmlStrcmp (cur_node->name, (xmlChar *) "SegmentList") == 0) {
-        gst_mpdparser_parse_segment_list_node (&new_period->SegmentList,
-            cur_node, NULL);
+        if (!gst_mpdparser_parse_segment_list_node (&new_period->SegmentList,
+                cur_node, NULL))
+          goto error;
       } else if (xmlStrcmp (cur_node->name, (xmlChar *) "SegmentTemplate") == 0) {
-        gst_mpdparser_parse_segment_template_node (&new_period->SegmentTemplate,
-            cur_node, NULL);
+        if (!gst_mpdparser_parse_segment_template_node
+            (&new_period->SegmentTemplate, cur_node, NULL))
+          goto error;
       } else if (xmlStrcmp (cur_node->name, (xmlChar *) "Subset") == 0) {
         gst_mpdparser_parse_subset_node (&new_period->Subsets, cur_node);
       } else if (xmlStrcmp (cur_node->name, (xmlChar *) "BaseURL") == 0) {
@@ -1831,11 +2084,19 @@
   for (cur_node = a_node->children; cur_node; cur_node = cur_node->next) {
     if (cur_node->type == XML_ELEMENT_NODE) {
       if (xmlStrcmp (cur_node->name, (xmlChar *) "AdaptationSet") == 0) {
-        gst_mpdparser_parse_adaptation_set_node (&new_period->AdaptationSets,
-            cur_node, new_period);
+        if (!gst_mpdparser_parse_adaptation_set_node
+            (&new_period->AdaptationSets, cur_node, new_period))
+          goto error;
       }
     }
   }
+
+  *list = g_list_append (*list, new_period);
+  return TRUE;
+
+error:
+  gst_mpdparser_free_period_node (new_period);
+  return FALSE;
 }
 
 static void
@@ -1877,10 +2138,10 @@
   *list = g_list_append (*list, new_metrics_range);
 
   GST_LOG ("attributes of Metrics Range node:");
-  gst_mpdparser_get_xml_prop_duration (a_node, "starttime", -1,
-      &new_metrics_range->starttime);
-  gst_mpdparser_get_xml_prop_duration (a_node, "duration", -1,
-      &new_metrics_range->duration);
+  gst_mpdparser_get_xml_prop_duration (a_node, "starttime",
+      GST_MPD_DURATION_NONE, &new_metrics_range->starttime);
+  gst_mpdparser_get_xml_prop_duration (a_node, "duration",
+      GST_MPD_DURATION_NONE, &new_metrics_range->duration);
 }
 
 static void
@@ -1946,20 +2207,26 @@
     }
     new_timing->urls = g_strsplit (value, " ", max_tokens);
     xmlFree (value);
+  }
+
+  /* append to list only if both method and urls were set */
+  if (new_timing->method != 0 && new_timing->urls != NULL &&
+      g_strv_length (new_timing->urls) != 0) {
     *list = g_list_append (*list, new_timing);
   } else {
     gst_mpdparser_free_utctiming_node (new_timing);
   }
 }
 
-static void
+static gboolean
 gst_mpdparser_parse_root_node (GstMPDNode ** pointer, xmlNode * a_node)
 {
   xmlNode *cur_node;
   GstMPDNode *new_mpd;
 
   gst_mpdparser_free_mpd_node (*pointer);
-  *pointer = new_mpd = g_slice_new0 (GstMPDNode);
+  *pointer = NULL;
+  new_mpd = g_slice_new0 (GstMPDNode);
 
   GST_LOG ("namespaces of root MPD node:");
   new_mpd->default_namespace =
@@ -1977,26 +2244,27 @@
       &new_mpd->availabilityStartTime);
   gst_mpdparser_get_xml_prop_dateTime (a_node, "availabilityEndTime",
       &new_mpd->availabilityEndTime);
-  gst_mpdparser_get_xml_prop_duration (a_node, "mediaPresentationDuration", -1,
-      &new_mpd->mediaPresentationDuration);
-  gst_mpdparser_get_xml_prop_duration (a_node, "minimumUpdatePeriod", -1,
-      &new_mpd->minimumUpdatePeriod);
-  gst_mpdparser_get_xml_prop_duration (a_node, "minBufferTime", -1,
-      &new_mpd->minBufferTime);
-  gst_mpdparser_get_xml_prop_duration (a_node, "timeShiftBufferDepth", -1,
-      &new_mpd->timeShiftBufferDepth);
-  gst_mpdparser_get_xml_prop_duration (a_node, "suggestedPresentationDelay", -1,
-      &new_mpd->suggestedPresentationDelay);
-  gst_mpdparser_get_xml_prop_duration (a_node, "maxSegmentDuration", -1,
-      &new_mpd->maxSegmentDuration);
-  gst_mpdparser_get_xml_prop_duration (a_node, "maxSubsegmentDuration", -1,
-      &new_mpd->maxSubsegmentDuration);
+  gst_mpdparser_get_xml_prop_duration (a_node, "mediaPresentationDuration",
+      GST_MPD_DURATION_NONE, &new_mpd->mediaPresentationDuration);
+  gst_mpdparser_get_xml_prop_duration (a_node, "minimumUpdatePeriod",
+      GST_MPD_DURATION_NONE, &new_mpd->minimumUpdatePeriod);
+  gst_mpdparser_get_xml_prop_duration (a_node, "minBufferTime",
+      GST_MPD_DURATION_NONE, &new_mpd->minBufferTime);
+  gst_mpdparser_get_xml_prop_duration (a_node, "timeShiftBufferDepth",
+      GST_MPD_DURATION_NONE, &new_mpd->timeShiftBufferDepth);
+  gst_mpdparser_get_xml_prop_duration (a_node, "suggestedPresentationDelay",
+      GST_MPD_DURATION_NONE, &new_mpd->suggestedPresentationDelay);
+  gst_mpdparser_get_xml_prop_duration (a_node, "maxSegmentDuration",
+      GST_MPD_DURATION_NONE, &new_mpd->maxSegmentDuration);
+  gst_mpdparser_get_xml_prop_duration (a_node, "maxSubsegmentDuration",
+      GST_MPD_DURATION_NONE, &new_mpd->maxSubsegmentDuration);
 
   /* explore children Period nodes */
   for (cur_node = a_node->children; cur_node; cur_node = cur_node->next) {
     if (cur_node->type == XML_ELEMENT_NODE) {
       if (xmlStrcmp (cur_node->name, (xmlChar *) "Period") == 0) {
-        gst_mpdparser_parse_period_node (&new_mpd->Periods, cur_node);
+        if (!gst_mpdparser_parse_period_node (&new_mpd->Periods, cur_node))
+          goto error;
       } else if (xmlStrcmp (cur_node->name,
               (xmlChar *) "ProgramInformation") == 0) {
         gst_mpdparser_parse_program_info_node (&new_mpd->ProgramInfo, cur_node);
@@ -2011,6 +2279,14 @@
       }
     }
   }
+
+  gst_mpdparser_free_mpd_node (*pointer);
+  *pointer = new_mpd;
+  return TRUE;
+
+error:
+  gst_mpdparser_free_mpd_node (new_mpd);
+  return FALSE;
 }
 
 /* comparison functions */
@@ -2472,6 +2748,8 @@
       xmlFree (representation_base->profiles);
     g_slice_free (GstRatio, representation_base->sar);
     g_slice_free (GstFrameRate, representation_base->frameRate);
+    g_slice_free (GstFrameRate, representation_base->minFrameRate);
+    g_slice_free (GstFrameRate, representation_base->maxFrameRate);
     if (representation_base->audioSamplingRate)
       xmlFree (representation_base->audioSamplingRate);
     if (representation_base->mimeType)
@@ -2502,8 +2780,6 @@
     if (adaptation_set_node->contentType)
       xmlFree (adaptation_set_node->contentType);
     g_slice_free (GstRatio, adaptation_set_node->par);
-    g_slice_free (GstFrameRate, adaptation_set_node->minFrameRate);
-    g_slice_free (GstFrameRate, adaptation_set_node->maxFrameRate);
     g_slice_free (GstConditionalUintType,
         adaptation_set_node->segmentAlignment);
     g_slice_free (GstConditionalUintType,
@@ -2796,28 +3072,26 @@
 static gboolean
 validate_format (const gchar * format)
 {
-  gchar *p;
+  const gchar *p = format;
 
-  /* Check if there is a % at all */
-  p = strchr (format, '%');
-  if (!p)
-    return TRUE;
+  /* Check if it starts with % */
+  if (!p || p[0] != '%')
+    return FALSE;
   p++;
 
-  /* Following the % must be a 0, or any of d, x or u.
-   * x and u are not part of the spec, but don't hurt us
+  /* the spec mandates a format like %0[width]d */
+  /* Following the %, we must have a 0 */
+  if (p[0] != '0')
+    return FALSE;
+
+  /* Following the % must be a number starting with 0
    */
-  if (p[0] == '0') {
+  while (g_ascii_isdigit (*p))
     p++;
 
-    while (g_ascii_isdigit (*p))
-      p++;
-  }
-
-  /* After any 0 and alphanumeric values, there must be
-   * an d, x or u.
+  /* After any 0 and alphanumeric values, there must be a d.
    */
-  if (p[0] != 'd' && p[0] != 'x' && p[0] != 'u')
+  if (p[0] != 'd')
     return FALSE;
   p++;
 
@@ -2834,16 +3108,13 @@
 static gchar *
 promote_format_to_uint64 (const gchar * format)
 {
-  gchar *p;
+  const gchar *p = format;
   gchar *promoted_format;
 
   /* Must be called with a validated format! */
   g_return_val_if_fail (validate_format (format), NULL);
 
-  /* Check if there is a % at all */
-  p = strchr (format, '%');
-  if (!p)
-    return g_strdup (format);
+  /* it starts with % */
   p++;
 
   /* Following the % must be a 0, or any of d, x or u.
@@ -2856,10 +3127,10 @@
       p++;
   }
 
-  /* After any 0 and alphanumeric values, there must be
-   * an d, x or u. Otherwise validation would have failed
+  /* After any 0 and alphanumeric values, there must be a d.
+   * Otherwise validation would have failed
    */
-  g_assert (p[0] == 'd' || p[0] == 'x' || p[0] == 'u');
+  g_assert (p[0] == 'd');
 
   promoted_format =
       g_strdup_printf ("%.*s" G_GINT64_MODIFIER "%s", (gint) (p - format),
@@ -2868,6 +3139,26 @@
   return promoted_format;
 }
 
+static gboolean
+gst_mpdparser_validate_rfc1738_url (const char *s)
+{
+  while (*s) {
+    if (!strchr
+        (";:@&=aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789$-_.+!*'(),%/",
+            *s))
+      return FALSE;
+    if (*s == '%') {
+      /* g_ascii_isdigit returns FALSE for NUL, and || is a short circuiting
+         operator, so this is safe for strings ending before two hex digits */
+      if (!g_ascii_isxdigit (s[1]) || !g_ascii_isxdigit (s[2]))
+        return FALSE;
+      s += 2;
+    }
+    s++;
+  }
+  return TRUE;
+}
+
 static gchar *
 gst_mpdparser_build_URL_from_template (const gchar * url_template,
     const gchar * id, guint number, guint bandwidth, guint64 time)
@@ -2876,7 +3167,6 @@
   gchar **tokens, *token, *ret;
   const gchar *format;
   gint i, num_tokens;
-  gboolean last_token_par = TRUE;       /* last token was a parameter */
 
   g_return_val_if_fail (url_template != NULL, NULL);
   tokens = g_strsplit_set (url_template, "$", -1);
@@ -2886,14 +3176,36 @@
   }
   num_tokens = g_strv_length (tokens);
 
+  /*
+   * each identifier is guarded by 2 $, which means that we must have an odd number of tokens
+   * An even number of tokens means the string is not valid.
+   */
+  if ((num_tokens & 1) == 0) {
+    GST_ERROR ("Invalid number of tokens (%d). url_template is '%s'",
+        num_tokens, url_template);
+    g_strfreev (tokens);
+    return NULL;
+  }
+
   for (i = 0; i < num_tokens; i++) {
     token = tokens[i];
     format = default_format;
 
+    /* the tokens to replace must be provided between $ characters, eg $token$
+     * For a string like token0$token1$token2$token3$token4, only the odd number
+     * tokens (1,3,...) must be parsed.
+     *
+     * Skip even tokens
+     */
+    if ((i & 1) == 0)
+      continue;
+
     if (!g_strcmp0 (token, "RepresentationID")) {
+      if (!gst_mpdparser_validate_rfc1738_url (id))
+        goto invalid_representation_id;
+
       tokens[i] = g_strdup_printf ("%s", id);
       g_free (token);
-      last_token_par = TRUE;
     } else if (!strncmp (token, "Number", 6)) {
       if (strlen (token) > 6) {
         format = token + 6;     /* format tag */
@@ -2903,7 +3215,6 @@
 
       tokens[i] = g_strdup_printf (format, number);
       g_free (token);
-      last_token_par = TRUE;
     } else if (!strncmp (token, "Bandwidth", 9)) {
       if (strlen (token) > 9) {
         format = token + 9;     /* format tag */
@@ -2913,7 +3224,6 @@
 
       tokens[i] = g_strdup_printf (format, bandwidth);
       g_free (token);
-      last_token_par = TRUE;
     } else if (!strncmp (token, "Time", 4)) {
       gchar *promoted_format;
 
@@ -2927,17 +3237,16 @@
       tokens[i] = g_strdup_printf (promoted_format, time);
       g_free (promoted_format);
       g_free (token);
-      last_token_par = TRUE;
     } else if (!g_strcmp0 (token, "")) {
-      if (!last_token_par) {
-        tokens[i] = g_strdup_printf ("%s", "$");
-        g_free (token);
-        last_token_par = TRUE;
-      } else {
-        last_token_par = FALSE;
-      }
+      tokens[i] = g_strdup_printf ("%s", "$");
+      g_free (token);
     } else {
-      last_token_par = FALSE;
+      /* unexpected identifier found between $ signs
+       *
+       * "If the URL contains unescaped $ symbols which do not enclose a valid
+       * identifier then the result of URL formation is undefined"
+       */
+      goto invalid_format;
     }
   }
 
@@ -2955,6 +3264,16 @@
 
     return NULL;
   }
+invalid_representation_id:
+  {
+    GST_ERROR
+        ("Representation ID string '%s' has characters invalid in an RFC 1738 URL",
+        id);
+
+    g_strfreev (tokens);
+
+    return NULL;
+  }
 }
 
 guint
@@ -3053,8 +3372,7 @@
     gst_uri_unref (base);
 
     if (ret && query) {
-      if (*query)
-        g_free (*query);
+      g_free (*query);
       *query = gst_uri_get_query_string (ret);
       if (*query) {
         ret = gst_uri_make_writable (ret);
@@ -3120,7 +3438,7 @@
 
 static GstClockTime
 gst_mpd_client_get_segment_duration (GstMpdClient * client,
-    GstActiveStream * stream, gint64 * scale_dur)
+    GstActiveStream * stream, guint64 * scale_dur)
 {
   GstStreamPeriod *stream_period;
   GstMultSegmentBaseType *base = NULL;
@@ -3216,7 +3534,11 @@
 static void
 gst_mpd_client_check_profiles (GstMpdClient * client)
 {
-  GST_DEBUG ("Profiles: %s", client->mpd_node->profiles);
+  GST_DEBUG ("Profiles: %s",
+      client->mpd_node->profiles ? client->mpd_node->profiles : "<none>");
+
+  if (!client->mpd_node->profiles)
+    return;
 
   if (g_strstr_len (client->mpd_node->profiles, -1,
           "urn:mpeg:dash:profile:isoff-on-demand:2011")) {
@@ -3391,6 +3713,8 @@
 gboolean
 gst_mpd_parse (GstMpdClient * client, const gchar * data, gint size)
 {
+  gboolean ret = FALSE;
+
   if (data) {
     xmlDocPtr doc;
     xmlNode *root_element = NULL;
@@ -3409,7 +3733,7 @@
     doc = xmlReadMemory (data, size, "noname.xml", NULL, XML_PARSE_NONET);
     if (doc == NULL) {
       GST_ERROR ("failed to parse the MPD file");
-      return FALSE;
+      ret = FALSE;
     } else {
       /* get the root element node */
       root_element = xmlDocGetRootElement (doc);
@@ -3418,23 +3742,24 @@
           || xmlStrcmp (root_element->name, (xmlChar *) "MPD") != 0) {
         GST_ERROR
             ("can not find the root element MPD, failed to parse the MPD file");
+        ret = FALSE;            /* used to return TRUE before, but this seems wrong */
       } else {
         /* now we can parse the MPD root node and all children nodes, recursively */
-        gst_mpdparser_parse_root_node (&client->mpd_node, root_element);
+        ret = gst_mpdparser_parse_root_node (&client->mpd_node, root_element);
       }
       /* free the document */
       xmlFreeDoc (doc);
     }
 
-    gst_mpd_client_check_profiles (client);
+    if (ret) {
+      gst_mpd_client_check_profiles (client);
 
-    if (!gst_mpd_client_fetch_on_load_external_resources (client))
-      return FALSE;
-
-    return TRUE;
+      if (!gst_mpd_client_fetch_on_load_external_resources (client))
+        return FALSE;
+    }
   }
 
-  return FALSE;
+  return ret;
 }
 
 const gchar *
@@ -3472,89 +3797,9 @@
 }
 
 static gboolean
-gst_mpdparser_find_segment_by_index (GstMpdClient * client,
-    GPtrArray * segments, gint index, GstMediaSegment * result)
-{
-  gint i;
-  for (i = 0; i < segments->len; i++) {
-    GstMediaSegment *s;
-    gint repeat;
-
-    s = g_ptr_array_index (segments, i);
-    if (s->repeat >= 0) {
-      repeat = s->repeat;
-    } else {
-      GstClockTime start = s->start;
-      GstClockTime end =
-          gst_mpdparser_get_segment_end_time (client, segments, s, i);
-      repeat = (guint) (end - start) / s->duration;
-    }
-    if (s->number + repeat >= index) {
-      /* it is in this segment */
-      result->SegmentURL = s->SegmentURL;
-      result->number = index;
-      result->scale_start =
-          s->scale_start + (index - s->number) * s->scale_duration;
-      result->scale_duration = s->scale_duration;
-      result->start = s->start + (index - s->number) * s->duration;
-      result->duration = s->duration;
-      return TRUE;
-    }
-  }
-
-  return FALSE;
-}
-
-gboolean
-gst_mpdparser_get_chunk_by_index (GstMpdClient * client, guint indexStream,
-    guint indexChunk, GstMediaSegment * segment)
-{
-  GstActiveStream *stream;
-
-  /* select stream */
-  g_return_val_if_fail (client != NULL, FALSE);
-  g_return_val_if_fail (client->active_streams != NULL, FALSE);
-  stream = g_list_nth_data (client->active_streams, indexStream);
-  g_return_val_if_fail (stream != NULL, FALSE);
-
-  indexChunk += 1;
-
-  if (stream->segments) {
-    return gst_mpdparser_find_segment_by_index (client, stream->segments,
-        indexChunk, segment);
-  } else {
-    GstClockTime duration;
-    GstStreamPeriod *stream_period;
-    gint64 scale_dur;
-
-    g_return_val_if_fail (stream->cur_seg_template->MultSegBaseType->
-        SegmentTimeline == NULL, FALSE);
-    /* segment template generator */
-    duration = gst_mpd_client_get_segment_duration (client, stream, &scale_dur);
-    if (!GST_CLOCK_TIME_IS_VALID (duration))
-      return FALSE;
-
-    stream_period = gst_mpdparser_get_stream_period (client);
-
-    segment->number = indexChunk
-        + stream->cur_seg_template->MultSegBaseType->startNumber;
-    segment->scale_start = indexChunk * scale_dur;
-    segment->scale_duration = scale_dur;
-    segment->start = duration * indexChunk;
-    segment->duration = duration;
-    segment->SegmentURL = NULL;
-
-    if (segment->start >= stream_period->duration) {
-      return FALSE;
-    }
-  }
-  return TRUE;
-}
-
-static gboolean
 gst_mpd_client_add_media_segment (GstActiveStream * stream,
     GstSegmentURLNode * url_node, guint number, gint repeat,
-    gint64 scale_start, gint64 scale_duration,
+    guint64 scale_start, guint64 scale_duration,
     GstClockTime start, GstClockTime duration)
 {
   GstMediaSegment *media_segment;
@@ -3580,6 +3825,34 @@
   return TRUE;
 }
 
+static void
+gst_mpd_client_stream_update_presentation_time_offset (GstMpdClient * client,
+    GstActiveStream * stream)
+{
+  GstSegmentBaseType *segbase = NULL;
+
+  /* Find the used segbase */
+  if (stream->cur_segment_list) {
+    segbase = stream->cur_segment_list->MultSegBaseType->SegBaseType;
+  } else if (stream->cur_seg_template) {
+    segbase = stream->cur_seg_template->MultSegBaseType->SegBaseType;
+  } else if (stream->cur_segment_base) {
+    segbase = stream->cur_segment_base;
+  }
+
+  if (segbase) {
+    /* Avoid overflows */
+    stream->presentationTimeOffset =
+        gst_util_uint64_scale (segbase->presentationTimeOffset, GST_SECOND,
+        segbase->timescale);
+  } else {
+    stream->presentationTimeOffset = 0;
+  }
+
+  GST_LOG ("Setting stream's presentation time offset to %" GST_TIME_FORMAT,
+      GST_TIME_ARGS (stream->presentationTimeOffset));
+}
+
 gboolean
 gst_mpd_client_setup_representation (GstMpdClient * client,
     GstActiveStream * stream, GstRepresentationNode * representation)
@@ -3681,6 +3954,12 @@
             start_time = gst_util_uint64_scale (S->t, GST_SECOND, timescale);
           }
 
+          if (!SegmentURL) {
+            GST_WARNING
+                ("SegmentTimeline does not have a matching SegmentURL, aborting...");
+            return FALSE;
+          }
+
           if (!gst_mpd_client_add_media_segment (stream, SegmentURL->data, i,
                   S->r, start, S->d, start_time, duration)) {
             return FALSE;
@@ -3691,7 +3970,7 @@
           SegmentURL = g_list_next (SegmentURL);
         }
       } else {
-        gint64 scale_dur;
+        guint64 scale_dur;
 
         duration =
             gst_mpd_client_get_segment_duration (client, stream, &scale_dur);
@@ -3739,13 +4018,6 @@
       GST_LOG ("Building media segment list using this template: %s",
           stream->cur_seg_template->media);
 
-      /* Avoid overflows */
-      stream->presentationTimeOffset =
-          gst_util_uint64_scale (mult_seg->SegBaseType->presentationTimeOffset,
-          GST_SECOND, mult_seg->SegBaseType->timescale);
-      GST_LOG ("Setting stream's presentation time offset to %" GST_TIME_FORMAT,
-          GST_TIME_ARGS (stream->presentationTimeOffset));
-
       if (mult_seg->SegmentTimeline) {
         GstSegmentTimelineNode *timeline;
         GstSNode *S;
@@ -3801,6 +4073,8 @@
   stream->baseURL =
       gst_mpdparser_parse_baseURL (client, stream, &stream->queryURL);
 
+  gst_mpd_client_stream_update_presentation_time_offset (client, stream);
+
   return TRUE;
 }
 
@@ -3943,6 +4217,13 @@
   idx = 0;
   start = 0;
   duration = GST_CLOCK_TIME_NONE;
+
+  if (client->mpd_node->mediaPresentationDuration <= 0 &&
+      client->mpd_node->mediaPresentationDuration != -1) {
+    /* Invalid MPD file: MPD duration is negative or zero */
+    goto syntax_error;
+  }
+
   for (list = client->mpd_node->Periods; list; /* explicitly advanced below */ ) {
     GstPeriodNode *period_node = list->data;
     GstPeriodNode *next_period_node = NULL;
@@ -4064,6 +4345,10 @@
         }
         duration = next_period_node->start * GST_MSECOND - start;
       } else if (period_node->duration != -1) {
+        if (period_node->duration <= 0) {
+          /* Invalid MPD file: duration would be negative or zero */
+          goto syntax_error;
+        }
         duration = period_node->duration * GST_MSECOND;
       } else if (client->mpd_node->type == GST_MPD_FILE_TYPE_DYNAMIC) {
         /* might be a live file, ignore unspecified duration */
@@ -4504,20 +4789,25 @@
   stream = g_list_nth_data (client->active_streams, stream_idx);
   g_return_val_if_fail (stream != NULL, 0);
 
-  segment_idx = gst_mpd_client_get_segments_counts (client, stream) - 1;
-  currentChunk = g_ptr_array_index (stream->segments, segment_idx);
-
-  if (currentChunk->repeat >= 0) {
-    *ts =
-        currentChunk->start + (currentChunk->duration * (1 +
-            currentChunk->repeat));
-  } else {
-    /* 5.3.9.6.1: negative repeat means repeat till the end of the
-     * period, or the next update of the MPD (which I think is
-     * implicit, as this will all get deleted/recreated), or the
-     * start of the next segment, if any. */
+  if (!stream->segments) {
     stream_period = gst_mpdparser_get_stream_period (client);
     *ts = stream_period->start + stream_period->duration;
+  } else {
+    segment_idx = gst_mpd_client_get_segments_counts (client, stream) - 1;
+    currentChunk = g_ptr_array_index (stream->segments, segment_idx);
+
+    if (currentChunk->repeat >= 0) {
+      *ts =
+          currentChunk->start + (currentChunk->duration * (1 +
+              currentChunk->repeat));
+    } else {
+      /* 5.3.9.6.1: negative repeat means repeat till the end of the
+       * period, or the next update of the MPD (which I think is
+       * implicit, as this will all get deleted/recreated), or the
+       * start of the next segment, if any. */
+      stream_period = gst_mpdparser_get_stream_period (client);
+      *ts = stream_period->start + stream_period->duration;
+    }
   }
 
   return TRUE;
@@ -4961,22 +5251,12 @@
       *range_start = 0;
       *range_end = stream->cur_segment_base->indexRange->first_byte_pos - 1;
     }
-  } else if (stream->cur_seg_template) {
-    const gchar *initialization = NULL;
-    if (stream->cur_seg_template->initialization) {
-      initialization = stream->cur_seg_template->initialization;
-    } else if (stream->cur_adapt_set->SegmentTemplate
-        && stream->cur_adapt_set->SegmentTemplate->initialization) {
-      initialization = stream->cur_adapt_set->SegmentTemplate->initialization;
-    } else if (stream_period->period->SegmentTemplate
-        && stream_period->period->SegmentTemplate->initialization) {
-      initialization = stream_period->period->SegmentTemplate->initialization;
-    }
-    if (initialization) {
-      *uri = gst_mpdparser_build_URL_from_template (initialization,
-          stream->cur_representation->id, 0,
-          stream->cur_representation->bandwidth, 0);
-    }
+  } else if (stream->cur_seg_template
+      && stream->cur_seg_template->initialization) {
+    *uri =
+        gst_mpdparser_build_URL_from_template (stream->
+        cur_seg_template->initialization, stream->cur_representation->id, 0,
+        stream->cur_representation->bandwidth, 0);
   }
 
   return *uri == NULL ? FALSE : TRUE;
@@ -5007,21 +5287,11 @@
             stream->cur_segment_base->Initialization));
     *range_start = stream->cur_segment_base->indexRange->first_byte_pos;
     *range_end = stream->cur_segment_base->indexRange->last_byte_pos;
-  } else if (stream->cur_seg_template) {
-    const gchar *initialization = NULL;
-    if (stream->cur_seg_template->index) {
-      initialization = stream->cur_seg_template->index;
-    } else if (stream->cur_adapt_set->SegmentTemplate
-        && stream->cur_adapt_set->SegmentTemplate->index) {
-      initialization = stream->cur_adapt_set->SegmentTemplate->index;
-    } else if (stream_period->period->SegmentTemplate
-        && stream_period->period->SegmentTemplate->index) {
-      initialization = stream_period->period->SegmentTemplate->index;
-    }
-    if (initialization)
-      *uri = gst_mpdparser_build_URL_from_template (initialization,
-          stream->cur_representation->id, 0,
-          stream->cur_representation->bandwidth, 0);
+  } else if (stream->cur_seg_template && stream->cur_seg_template->index) {
+    *uri =
+        gst_mpdparser_build_URL_from_template (stream->cur_seg_template->index,
+        stream->cur_representation->id, 0,
+        stream->cur_representation->bandwidth, 0);
   }
 
   return *uri == NULL ? FALSE : TRUE;
@@ -5264,6 +5534,27 @@
   return g_list_nth_data (client->active_streams, stream_idx);
 }
 
+gboolean
+gst_mpd_client_active_stream_contains_subtitles (GstActiveStream * stream)
+{
+  const gchar *mimeType;
+  const gchar *adapt_set_codecs;
+  const gchar *rep_codecs;
+
+  mimeType = stream->cur_representation->RepresentationBase->mimeType;
+  if (!mimeType)
+    mimeType = stream->cur_adapt_set->RepresentationBase->mimeType;
+
+  if (g_strcmp0 (mimeType, "application/ttml+xml") == 0)
+    return TRUE;
+
+  adapt_set_codecs = stream->cur_adapt_set->RepresentationBase->codecs;
+  rep_codecs = stream->cur_representation->RepresentationBase->codecs;
+
+  return (adapt_set_codecs && g_str_has_prefix (adapt_set_codecs, "stpp"))
+      || (rep_codecs && g_str_has_prefix (rep_codecs, "stpp"));
+}
+
 static const gchar *
 gst_mpdparser_mimetype_to_caps (const gchar * mimeType)
 {
@@ -5279,10 +5570,11 @@
     return mimeType;
 }
 
-const gchar *
-gst_mpd_client_get_stream_mimeType (GstActiveStream * stream)
+GstCaps *
+gst_mpd_client_get_stream_caps (GstActiveStream * stream)
 {
-  const gchar *mimeType;
+  const gchar *mimeType, *caps_string;
+  GstCaps *ret = NULL;
 
   if (stream == NULL || stream->cur_adapt_set == NULL
       || stream->cur_representation == NULL)
@@ -5293,7 +5585,16 @@
     mimeType = stream->cur_adapt_set->RepresentationBase->mimeType;
   }
 
-  return gst_mpdparser_mimetype_to_caps (mimeType);
+  caps_string = gst_mpdparser_mimetype_to_caps (mimeType);
+
+  if ((g_strcmp0 (caps_string, "application/mp4") == 0)
+      && gst_mpd_client_active_stream_contains_subtitles (stream))
+    caps_string = "video/quicktime";
+
+  if (caps_string)
+    ret = gst_caps_from_string (caps_string);
+
+  return ret;
 }
 
 gboolean
@@ -5339,6 +5640,46 @@
   return height;
 }
 
+gboolean
+gst_mpd_client_get_video_stream_framerate (GstActiveStream * stream,
+    gint * fps_num, gint * fps_den)
+{
+  if (stream == NULL)
+    return FALSE;
+
+  if (stream->cur_adapt_set &&
+      stream->cur_adapt_set->RepresentationBase->frameRate != NULL) {
+    *fps_num = stream->cur_adapt_set->RepresentationBase->frameRate->num;
+    *fps_den = stream->cur_adapt_set->RepresentationBase->frameRate->den;
+    return TRUE;
+  }
+
+  if (stream->cur_adapt_set &&
+      stream->cur_adapt_set->RepresentationBase->maxFrameRate != NULL) {
+    *fps_num = stream->cur_adapt_set->RepresentationBase->maxFrameRate->num;
+    *fps_den = stream->cur_adapt_set->RepresentationBase->maxFrameRate->den;
+    return TRUE;
+  }
+
+  if (stream->cur_representation &&
+      stream->cur_representation->RepresentationBase->frameRate != NULL) {
+    *fps_num = stream->cur_representation->RepresentationBase->frameRate->num;
+    *fps_den = stream->cur_representation->RepresentationBase->frameRate->den;
+    return TRUE;
+  }
+
+  if (stream->cur_representation &&
+      stream->cur_representation->RepresentationBase->maxFrameRate != NULL) {
+    *fps_num =
+        stream->cur_representation->RepresentationBase->maxFrameRate->num;
+    *fps_den =
+        stream->cur_representation->RepresentationBase->maxFrameRate->den;
+    return TRUE;
+  }
+
+  return FALSE;
+}
+
 guint
 gst_mpd_client_get_audio_stream_rate (GstActiveStream * stream)
 {
@@ -5451,69 +5792,6 @@
   return rv;
 }
 
-gint
-gst_mpd_client_check_time_position (GstMpdClient * client,
-    GstActiveStream * stream, GstClockTime ts, gint64 * diff)
-{
-  GDateTime *now = g_date_time_new_now_utc ();
-  GDateTime *start =
-      gst_date_time_to_g_date_time (client->mpd_node->availabilityStartTime);
-  GTimeSpan stream_now;
-  GTimeSpan ts_microseconds;
-  GstClockTime duration;
-
-  g_return_val_if_fail (gst_mpd_client_is_live (client), 0);
-
-  duration = gst_mpd_client_get_segment_duration (client, stream, NULL);
-  stream_now = g_date_time_difference (now, start);
-  g_date_time_unref (now);
-  g_date_time_unref (start);
-
-  /* sum duration to check if the segment is fully ready */
-  ts_microseconds = (ts + duration) / GST_USECOND;
-
-  /*
-   * This functions checks if a given ts is in the 'available range' of
-   * a DASH presentation. This only makes sense for live streams, which
-   * are continuously adding new segments and removing old ones.
-   *
-   * Note: Both the client and the server should use UTC as a time reference.
-   *
-   * @ts is the time since the beginning of the stream and we need to find out
-   * if it is currently available. The server should be hosting segments
-   *
-   * * ---------------- ... --- * ----------- * ---- ...
-   * |
-   * | past(unavailable) |      | available   | future(unavailable yet)
-   * |
-   * * ---------------- ... --- * ----------- * ---- ...
-   * |                          |             |
-   * availabilitStartTime       |             UTC now
-   *                            UTC now - timeShiftBufferDepth
-   *
-   * This function should return 0 if @ts is in the 'available' area, 1 for
-   * 'future' and '-1' for past and the corresponding distance to the
-   * 'available' area is set to @diff
-   *
-   * TODO untested with live presentations with multiple periods as no
-   * examples for it could be found/generated
-   */
-
-  if (ts_microseconds > stream_now) {
-    *diff = ts_microseconds - stream_now;
-    return 1;
-  }
-  if (client->mpd_node->timeShiftBufferDepth != -1
-      && ts_microseconds <
-      stream_now - client->mpd_node->timeShiftBufferDepth) {
-    *diff = ts_microseconds - stream_now;
-    return -1;
-  }
-
-  *diff = 0;
-  return 0;
-}
-
 gboolean
 gst_mpd_client_seek_to_time (GstMpdClient * client, GDateTime * time)
 {
@@ -5552,3 +5830,43 @@
 {
   return client->profile_isoff_ondemand;
 }
+
+/**
+ * gst_mpd_client_parse_default_presentation_delay:
+ * @client: #GstMpdClient that has a parsed manifest
+ * @default_presentation_delay: A string that specifies a time period
+ * in fragments (e.g. "5 f"), seconds ("12 s") or milliseconds
+ * ("12000 ms")
+ * Returns: the parsed string in milliseconds
+ *
+ * Since: 1.6
+ */
+gint64
+gst_mpd_client_parse_default_presentation_delay (GstMpdClient * client,
+    const gchar * default_presentation_delay)
+{
+  gint64 value;
+  char *endptr = NULL;
+
+  g_return_val_if_fail (client != NULL, 0);
+  g_return_val_if_fail (default_presentation_delay != NULL, 0);
+  value = strtol (default_presentation_delay, &endptr, 10);
+  if (endptr == default_presentation_delay || value == 0) {
+    return 0;
+  }
+  while (*endptr == ' ')
+    endptr++;
+  if (*endptr == 's' || *endptr == 'S') {
+    value *= 1000;              /* convert to ms */
+  } else if (*endptr == 'f' || *endptr == 'F') {
+    gint64 segment_duration;
+    g_assert (client->mpd_node != NULL);
+    segment_duration = client->mpd_node->maxSegmentDuration;
+    value *= segment_duration;
+  } else if (*endptr != 'm' && *endptr != 'M') {
+    GST_ERROR ("Unable to parse default presentation delay: %s",
+        default_presentation_delay);
+    value = 0;
+  }
+  return value;
+}
diff --git a/ext/dash/gstmpdparser.h b/ext/dash/gstmpdparser.h
index 36569b5..fcd3b69 100644
--- a/ext/dash/gstmpdparser.h
+++ b/ext/dash/gstmpdparser.h
@@ -67,6 +67,8 @@
 #define GST_MPD_CLIENT_LOCK(c) g_mutex_lock (&c->lock);
 #define GST_MPD_CLIENT_UNLOCK(c) g_mutex_unlock (&c->lock);
 
+#define GST_MPD_DURATION_NONE ((guint64)-1)
+
 typedef enum
 {
   GST_STREAM_UNKNOWN,
@@ -219,6 +221,8 @@
   guint width;
   guint height;
   GstRatio *sar;
+  GstFrameRate *minFrameRate;
+  GstFrameRate *maxFrameRate;
   GstFrameRate *frameRate;
   gchar *audioSamplingRate;
   gchar *mimeType;
@@ -304,8 +308,6 @@
   guint maxWidth;
   guint minHeight;
   guint maxHeight;
-  GstFrameRate *minFrameRate;
-  GstFrameRate *maxFrameRate;
   GstConditionalUintType *segmentAlignment;
   GstConditionalUintType *subsegmentAlignment;
   GstSAPType subsegmentStartsWithSAP;
@@ -346,8 +348,8 @@
 struct _GstPeriodNode
 {
   gchar *id;
-  gint64 start;                      /* [ms] */
-  gint64 duration;                   /* [ms] */
+  guint64 start;                     /* [ms] */
+  guint64 duration;                  /* [ms] */
   gboolean bitstreamSwitching;
   /* SegmentBase node */
   GstSegmentBaseType *SegmentBase;
@@ -378,8 +380,8 @@
 
 struct _GstMetricsRangeNode
 {
-  gint64 starttime;                  /* [ms] */
-  gint64 duration;                   /* [ms] */
+  guint64 starttime;                 /* [ms] */
+  guint64 duration;                  /* [ms] */
 };
 
 struct _GstMetricsNode
@@ -408,13 +410,13 @@
   GstMPDFileType type;
   GstDateTime *availabilityStartTime;
   GstDateTime *availabilityEndTime;
-  gint64 mediaPresentationDuration;  /* [ms] */
-  gint64 minimumUpdatePeriod;        /* [ms] */
-  gint64 minBufferTime;              /* [ms] */
-  gint64 timeShiftBufferDepth;       /* [ms] */
-  gint64 suggestedPresentationDelay; /* [ms] */
-  gint64 maxSegmentDuration;         /* [ms] */
-  gint64 maxSubsegmentDuration;      /* [ms] */
+  guint64 mediaPresentationDuration;  /* [ms] */
+  guint64 minimumUpdatePeriod;        /* [ms] */
+  guint64 minBufferTime;              /* [ms] */
+  guint64 timeShiftBufferDepth;       /* [ms] */
+  guint64 suggestedPresentationDelay; /* [ms] */
+  guint64 maxSegmentDuration;         /* [ms] */
+  guint64 maxSubsegmentDuration;      /* [ms] */
   /* list of BaseURL nodes */
   GList *BaseURLs;
   /* list of Location nodes */
@@ -452,8 +454,8 @@
   GstSegmentURLNode *SegmentURL;              /* this is NULL when using a SegmentTemplate */
   guint number;                               /* segment number */
   gint repeat;                                /* number of extra repetitions (0 = played only once) */
-  gint64 scale_start;                         /* start time in timescale units */
-  gint64 scale_duration;                      /* duration in timescale units */
+  guint64 scale_start;                        /* start time in timescale units */
+  guint64 scale_duration;                     /* duration in timescale units */
   GstClockTime start;                         /* segment start time */
   GstClockTime duration;                      /* segment duration */
 };
@@ -544,7 +546,6 @@
 gboolean gst_mpd_client_is_live (GstMpdClient * client);
 gboolean gst_mpd_client_stream_seek (GstMpdClient * client, GstActiveStream * stream, GstClockTime ts);
 gboolean gst_mpd_client_seek_to_time (GstMpdClient * client, GDateTime * time);
-gint gst_mpd_client_check_time_position (GstMpdClient * client, GstActiveStream * stream, GstClockTime ts, gint64 * diff);
 GstClockTime gst_mpd_parser_get_stream_presentation_offset (GstMpdClient *client, guint stream_idx);
 gchar** gst_mpd_client_get_utc_timing_sources (GstMpdClient *client, guint methods, GstMPDUTCTimingType *selected_method);
 GstClockTime gst_mpd_parser_get_period_start_time (GstMpdClient *client);
@@ -564,11 +565,11 @@
 
 /* URL management */
 const gchar *gst_mpdparser_get_baseURL (GstMpdClient *client, guint indexStream);
-gboolean gst_mpdparser_get_chunk_by_index (GstMpdClient *client, guint indexStream, guint indexChunk, GstMediaSegment * segment);
 
 /* Active stream */
 guint gst_mpdparser_get_nb_active_stream (GstMpdClient *client);
 GstActiveStream *gst_mpdparser_get_active_stream_by_index (GstMpdClient *client, guint stream_idx);
+gboolean gst_mpd_client_active_stream_contains_subtitles (GstActiveStream * stream);
 
 /* AdaptationSet */
 guint gst_mpdparser_get_nb_adaptationSet (GstMpdClient *client);
@@ -580,11 +581,12 @@
 void gst_mpd_client_seek_to_first_segment (GstMpdClient * client);
 GstDateTime *gst_mpd_client_get_next_segment_availability_end_time (GstMpdClient * client, GstActiveStream * stream);
 
-/* Get audio/video stream parameters (mimeType, width, height, rate, number of channels) */
-const gchar *gst_mpd_client_get_stream_mimeType (GstActiveStream * stream);
+/* Get audio/video stream parameters (caps, width, height, rate, number of channels) */
+GstCaps * gst_mpd_client_get_stream_caps (GstActiveStream * stream);
 gboolean gst_mpd_client_get_bitstream_switching_flag (GstActiveStream * stream);
 guint gst_mpd_client_get_video_stream_width (GstActiveStream * stream);
 guint gst_mpd_client_get_video_stream_height (GstActiveStream * stream);
+gboolean gst_mpd_client_get_video_stream_framerate (GstActiveStream * stream, gint * fps_num, gint * fps_den);
 guint gst_mpd_client_get_audio_stream_rate (GstActiveStream * stream);
 guint gst_mpd_client_get_audio_stream_num_channels (GstActiveStream * stream);
 
@@ -593,6 +595,7 @@
 
 gint64 gst_mpd_client_calculate_time_difference (const GstDateTime * t1, const GstDateTime * t2);
 GstDateTime *gst_mpd_client_add_time_difference (GstDateTime * t1, gint64 usecs);
+gint64 gst_mpd_client_parse_default_presentation_delay(GstMpdClient * client, const gchar * default_presentation_delay);
 
 /* profiles */
 gboolean gst_mpd_client_has_isoff_ondemand_profile (GstMpdClient *client);
diff --git a/ext/dc1394/Makefile.in b/ext/dc1394/Makefile.in
index 2ff9f98..b8e7948 100644
--- a/ext/dc1394/Makefile.in
+++ b/ext/dc1394/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/directfb/Makefile.in b/ext/directfb/Makefile.in
index 0462348..82c33ee 100644
--- a/ext/directfb/Makefile.in
+++ b/ext/directfb/Makefile.in
@@ -284,6 +284,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -321,6 +323,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -348,6 +352,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -366,6 +372,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -376,6 +384,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -401,6 +411,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -426,6 +438,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -557,6 +571,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -614,8 +630,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -685,6 +705,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/directfb/dfbvideosink.c b/ext/directfb/dfbvideosink.c
index 22dd3d7..db8ef17 100644
--- a/ext/directfb/dfbvideosink.c
+++ b/ext/directfb/dfbvideosink.c
@@ -29,7 +29,7 @@
  *   <para>
  *   Standalone: this mode will take complete control of the monitor forcing
  *   <ulink url="http://www.directfb.org/">DirectFB</ulink> to fullscreen layout.
- *   This is convenient to test using the  gst-launch command line tool or
+ *   This is convenient to test using the  gst-launch-1.0 command line tool or
  *   other simple applications. It is possible to interrupt playback while
  *   being in this mode by pressing the Escape key.
  *   </para>
@@ -77,7 +77,7 @@
  * <refsect2>
  * <title>Example pipelines</title>
  * |[
- * gst-launch -v videotestsrc ! dfbvideosink hue=20000 saturation=40000 brightness=25000
+ * gst-launch-1.0 -v videotestsrc ! dfbvideosink hue=20000 saturation=40000 brightness=25000
  * ]| test the colorbalance interface implementation in dfbvideosink
  * </refsect2>
  */
diff --git a/ext/dtls/Makefile.in b/ext/dtls/Makefile.in
index f860ac7..6a5eb8b 100644
--- a/ext/dtls/Makefile.in
+++ b/ext/dtls/Makefile.in
@@ -281,6 +281,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -318,6 +320,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -345,6 +349,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -363,6 +369,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -373,6 +381,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -398,6 +408,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -423,6 +435,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -554,6 +568,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -611,8 +627,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -682,6 +702,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/dtls/gstdtlsdec.c b/ext/dtls/gstdtlsdec.c
index eecc458..f05b4f1 100644
--- a/ext/dtls/gstdtlsdec.c
+++ b/ext/dtls/gstdtlsdec.c
@@ -569,7 +569,8 @@
     return GST_FLOW_OK;
   }
 
-  GST_DEBUG_OBJECT (self, "received buffer from %s with length %" G_GSIZE_FORMAT,
+  GST_DEBUG_OBJECT (self,
+      "received buffer from %s with length %" G_GSIZE_FORMAT,
       self->connection_id, gst_buffer_get_size (buffer));
 
   buffer = gst_buffer_make_writable (buffer);
diff --git a/ext/dts/Makefile.in b/ext/dts/Makefile.in
index 42ad365..d06ba46 100644
--- a/ext/dts/Makefile.in
+++ b/ext/dts/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/dts/gstdtsdec.c b/ext/dts/gstdtsdec.c
index c1f12c5..767b6bf 100644
--- a/ext/dts/gstdtsdec.c
+++ b/ext/dts/gstdtsdec.c
@@ -26,10 +26,10 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch dvdreadsrc title=1 ! mpegpsdemux ! dtsdec ! audioresample ! audioconvert ! alsasink
+ * gst-launch-1.0 dvdreadsrc title=1 ! mpegpsdemux ! dtsdec ! audioresample ! audioconvert ! alsasink
  * ]| Play a DTS audio track from a dvd.
  * |[
- * gst-launch filesrc location=abc.dts ! dtsdec ! audioresample ! audioconvert ! alsasink
+ * gst-launch-1.0 filesrc location=abc.dts ! dtsdec ! audioresample ! audioconvert ! alsasink
  * ]| Decode a standalone file and play it.
  * </refsect2>
  */
diff --git a/ext/faac/Makefile.in b/ext/faac/Makefile.in
index 748ec62..55e737e 100644
--- a/ext/faac/Makefile.in
+++ b/ext/faac/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/faac/gstfaac.c b/ext/faac/gstfaac.c
index a4a7c36..6804cbf 100644
--- a/ext/faac/gstfaac.c
+++ b/ext/faac/gstfaac.c
@@ -27,7 +27,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch audiotestsrc wave=sine num-buffers=100 ! audioconvert ! faac ! matroskamux ! filesink location=sine.mkv
+ * gst-launch-1.0 audiotestsrc wave=sine num-buffers=100 ! audioconvert ! faac ! matroskamux ! filesink location=sine.mkv
  * ]| Encode a sine beep as aac and write to matroska container.
  * </refsect2>
  */
@@ -189,6 +189,8 @@
   gobject_class->set_property = gst_faac_set_property;
   gobject_class->get_property = gst_faac_get_property;
 
+  GST_DEBUG_CATEGORY_INIT (faac_debug, "faac", 0, "AAC encoding");
+
   gst_element_class_add_pad_template (gstelement_class,
       gst_static_pad_template_get (&src_template));
 
@@ -236,8 +238,6 @@
           "Block type encorcing",
           GST_TYPE_FAAC_SHORTCTL, FAAC_DEFAULT_SHORTCTL,
           G_PARAM_CONSTRUCT | G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-
-  GST_DEBUG_CATEGORY_INIT (faac_debug, "faac", 0, "AAC encoding");
 }
 
 static void
diff --git a/ext/faad/Makefile.in b/ext/faad/Makefile.in
index 78b78ee..5a1e47f 100644
--- a/ext/faad/Makefile.in
+++ b/ext/faad/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/faad/gstfaad.c b/ext/faad/gstfaad.c
index 65a3f89..8197ca5 100644
--- a/ext/faad/gstfaad.c
+++ b/ext/faad/gstfaad.c
@@ -27,10 +27,10 @@
  * <refsect2>
  * <title>Example launch lines</title>
  * |[
- * gst-launch filesrc location=example.mp4 ! qtdemux ! faad ! audioconvert ! audioresample ! autoaudiosink
+ * gst-launch-1.0 filesrc location=example.mp4 ! qtdemux ! faad ! audioconvert ! audioresample ! autoaudiosink
  * ]| Play aac from mp4 file.
  * |[
- * gst-launch filesrc location=example.adts ! faad ! audioconvert ! audioresample ! autoaudiosink
+ * gst-launch-1.0 filesrc location=example.adts ! faad ! audioconvert ! audioresample ! autoaudiosink
  * ]| Play standalone aac bitstream.
  * </refsect2>
  */
diff --git a/ext/flite/Makefile.in b/ext/flite/Makefile.in
index 4657d60..822b579 100644
--- a/ext/flite/Makefile.in
+++ b/ext/flite/Makefile.in
@@ -273,6 +273,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -310,6 +312,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -337,6 +341,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -355,6 +361,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -365,6 +373,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -390,6 +400,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -415,6 +427,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -546,6 +560,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -603,8 +619,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -674,6 +694,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/fluidsynth/Makefile.in b/ext/fluidsynth/Makefile.in
index 0f8b4fd..c039273 100644
--- a/ext/fluidsynth/Makefile.in
+++ b/ext/fluidsynth/Makefile.in
@@ -282,6 +282,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -319,6 +321,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -346,6 +350,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -364,6 +370,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -374,6 +382,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -399,6 +409,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -424,6 +436,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -555,6 +569,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -612,8 +628,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -683,6 +703,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/gl/Makefile.am b/ext/gl/Makefile.am
index 1a634ef..e1b1447 100644
--- a/ext/gl/Makefile.am
+++ b/ext/gl/Makefile.am
@@ -35,7 +35,10 @@
 	gstglmixer.c \
 	gstglvideomixer.c \
 	gstglfiltershader.c \
-	gstglfilterapp.c
+	gstglfilterapp.c \
+	gstglviewconvert.c \
+	gstglstereosplit.c \
+	gstglstereomix.c
 
 noinst_HEADERS = \
 	gstglbasemixer.h \
@@ -54,16 +57,16 @@
 	gstglmixer.h \
 	gstglvideomixer.h \
 	gstglfiltershader.h \
-	gstglfilterapp.h
+	gstglfilterapp.h \
+	gstglstereosplit.h \
+	gstglstereomix.h \
+	gstglviewconvert.h
 
 # full opengl required
 if USE_OPENGL
 libgstopengl_la_SOURCES += \
 	gstglfilterglass.c \
 	gstgldeinterlace.c \
-	gstglviewconvert.c \
-	gstglstereosplit.c \
-	gstglstereomix.c \
 	gltestsrc.c \
 	gstgltestsrc.c \
 	gstglmosaic.c
@@ -71,9 +74,6 @@
 noinst_HEADERS += \
 	gstglfilterglass.h \
 	gstgldeinterlace.h \
-	gstglstereosplit.h \
-	gstglstereomix.h \
-	gstglviewconvert.h \
 	gltestsrc.h \
 	gstgltestsrc.h \
 	gstglmosaic.h \
diff --git a/ext/gl/Makefile.in b/ext/gl/Makefile.in
index bf0c30c..64242a8 100644
--- a/ext/gl/Makefile.in
+++ b/ext/gl/Makefile.in
@@ -95,9 +95,6 @@
 @USE_OPENGL_TRUE@am__append_1 = \
 @USE_OPENGL_TRUE@	gstglfilterglass.c \
 @USE_OPENGL_TRUE@	gstgldeinterlace.c \
-@USE_OPENGL_TRUE@	gstglviewconvert.c \
-@USE_OPENGL_TRUE@	gstglstereosplit.c \
-@USE_OPENGL_TRUE@	gstglstereomix.c \
 @USE_OPENGL_TRUE@	gltestsrc.c \
 @USE_OPENGL_TRUE@	gstgltestsrc.c \
 @USE_OPENGL_TRUE@	gstglmosaic.c
@@ -105,9 +102,6 @@
 @USE_OPENGL_TRUE@am__append_2 = \
 @USE_OPENGL_TRUE@	gstglfilterglass.h \
 @USE_OPENGL_TRUE@	gstgldeinterlace.h \
-@USE_OPENGL_TRUE@	gstglstereosplit.h \
-@USE_OPENGL_TRUE@	gstglstereomix.h \
-@USE_OPENGL_TRUE@	gstglviewconvert.h \
 @USE_OPENGL_TRUE@	gltestsrc.h \
 @USE_OPENGL_TRUE@	gstgltestsrc.h \
 @USE_OPENGL_TRUE@	gstglmosaic.h \
@@ -232,16 +226,14 @@
 	effects/gstgleffectblur.c effects/gstgleffectsobel.c \
 	effects/gstgleffectlaplacian.c gstglcolorscale.c gstglmixer.c \
 	gstglvideomixer.c gstglfiltershader.c gstglfilterapp.c \
-	gstglfilterglass.c gstgldeinterlace.c gstglviewconvert.c \
-	gstglstereosplit.c gstglstereomix.c gltestsrc.c gstgltestsrc.c \
-	gstglmosaic.c gstgldifferencematte.c gstgltransformation.c \
-	gstgltransformation.h gstgloverlay.c caopengllayersink.m
+	gstglviewconvert.c gstglstereosplit.c gstglstereomix.c \
+	gstglfilterglass.c gstgldeinterlace.c gltestsrc.c \
+	gstgltestsrc.c gstglmosaic.c gstgldifferencematte.c \
+	gstgltransformation.c gstgltransformation.h gstgloverlay.c \
+	caopengllayersink.m
 am__dirstamp = $(am__leading_dot)dirstamp
 @USE_OPENGL_TRUE@am__objects_1 = libgstopengl_la-gstglfilterglass.lo \
 @USE_OPENGL_TRUE@	libgstopengl_la-gstgldeinterlace.lo \
-@USE_OPENGL_TRUE@	libgstopengl_la-gstglviewconvert.lo \
-@USE_OPENGL_TRUE@	libgstopengl_la-gstglstereosplit.lo \
-@USE_OPENGL_TRUE@	libgstopengl_la-gstglstereomix.lo \
 @USE_OPENGL_TRUE@	libgstopengl_la-gltestsrc.lo \
 @USE_OPENGL_TRUE@	libgstopengl_la-gstgltestsrc.lo \
 @USE_OPENGL_TRUE@	libgstopengl_la-gstglmosaic.lo
@@ -284,7 +276,10 @@
 	libgstopengl_la-gstglmixer.lo \
 	libgstopengl_la-gstglvideomixer.lo \
 	libgstopengl_la-gstglfiltershader.lo \
-	libgstopengl_la-gstglfilterapp.lo $(am__objects_1) \
+	libgstopengl_la-gstglfilterapp.lo \
+	libgstopengl_la-gstglviewconvert.lo \
+	libgstopengl_la-gstglstereosplit.lo \
+	libgstopengl_la-gstglstereomix.lo $(am__objects_1) \
 	$(am__objects_2) $(am__objects_3) $(am__objects_4) \
 	$(am__objects_5)
 libgstopengl_la_OBJECTS = $(am_libgstopengl_la_OBJECTS)
@@ -361,9 +356,9 @@
 	gstglimagesink.h gstglfiltercube.h gstgleffects.h \
 	effects/gstgleffectssources.h gstglcolorscale.h gstglmixer.h \
 	gstglvideomixer.h gstglfiltershader.h gstglfilterapp.h \
-	gstglfilterglass.h gstgldeinterlace.h gstglstereosplit.h \
-	gstglstereomix.h gstglviewconvert.h gltestsrc.h gstgltestsrc.h \
-	gstglmosaic.h effects/gstgleffectscurves.h \
+	gstglstereosplit.h gstglstereomix.h gstglviewconvert.h \
+	gstglfilterglass.h gstgldeinterlace.h gltestsrc.h \
+	gstgltestsrc.h gstglmosaic.h effects/gstgleffectscurves.h \
 	effects/gstgleffectlumatocurve.h gstgldifferencematte.h \
 	gstgloverlay.h caopengllayersink.h
 HEADERS = $(noinst_HEADERS)
@@ -423,6 +418,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -460,6 +457,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -487,6 +486,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -505,6 +506,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -515,6 +518,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -540,6 +545,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -565,6 +572,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -696,6 +705,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -753,8 +764,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -824,6 +839,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -926,6 +942,7 @@
 	effects/gstgleffectblur.c effects/gstgleffectsobel.c \
 	effects/gstgleffectlaplacian.c gstglcolorscale.c gstglmixer.c \
 	gstglvideomixer.c gstglfiltershader.c gstglfilterapp.c \
+	gstglviewconvert.c gstglstereosplit.c gstglstereomix.c \
 	$(am__append_1) $(am__append_3) $(am__append_5) \
 	$(am__append_6) $(am__append_8)
 noinst_HEADERS = gstglbasemixer.h gstgluploadelement.h \
@@ -934,6 +951,7 @@
 	gstglimagesink.h gstglfiltercube.h gstgleffects.h \
 	effects/gstgleffectssources.h gstglcolorscale.h gstglmixer.h \
 	gstglvideomixer.h gstglfiltershader.h gstglfilterapp.h \
+	gstglstereosplit.h gstglstereomix.h gstglviewconvert.h \
 	$(am__append_2) $(am__append_4) $(am__append_7) \
 	$(am__append_9)
 libgstopengl_la_OBJCFLAGS = \
@@ -1411,20 +1429,6 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopengl_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopengl_la_CFLAGS) $(CFLAGS) -c -o libgstopengl_la-gstglfilterapp.lo `test -f 'gstglfilterapp.c' || echo '$(srcdir)/'`gstglfilterapp.c
 
-libgstopengl_la-gstglfilterglass.lo: gstglfilterglass.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopengl_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopengl_la_CFLAGS) $(CFLAGS) -MT libgstopengl_la-gstglfilterglass.lo -MD -MP -MF $(DEPDIR)/libgstopengl_la-gstglfilterglass.Tpo -c -o libgstopengl_la-gstglfilterglass.lo `test -f 'gstglfilterglass.c' || echo '$(srcdir)/'`gstglfilterglass.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopengl_la-gstglfilterglass.Tpo $(DEPDIR)/libgstopengl_la-gstglfilterglass.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstglfilterglass.c' object='libgstopengl_la-gstglfilterglass.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopengl_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopengl_la_CFLAGS) $(CFLAGS) -c -o libgstopengl_la-gstglfilterglass.lo `test -f 'gstglfilterglass.c' || echo '$(srcdir)/'`gstglfilterglass.c
-
-libgstopengl_la-gstgldeinterlace.lo: gstgldeinterlace.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopengl_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopengl_la_CFLAGS) $(CFLAGS) -MT libgstopengl_la-gstgldeinterlace.lo -MD -MP -MF $(DEPDIR)/libgstopengl_la-gstgldeinterlace.Tpo -c -o libgstopengl_la-gstgldeinterlace.lo `test -f 'gstgldeinterlace.c' || echo '$(srcdir)/'`gstgldeinterlace.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopengl_la-gstgldeinterlace.Tpo $(DEPDIR)/libgstopengl_la-gstgldeinterlace.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstgldeinterlace.c' object='libgstopengl_la-gstgldeinterlace.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopengl_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopengl_la_CFLAGS) $(CFLAGS) -c -o libgstopengl_la-gstgldeinterlace.lo `test -f 'gstgldeinterlace.c' || echo '$(srcdir)/'`gstgldeinterlace.c
-
 libgstopengl_la-gstglviewconvert.lo: gstglviewconvert.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopengl_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopengl_la_CFLAGS) $(CFLAGS) -MT libgstopengl_la-gstglviewconvert.lo -MD -MP -MF $(DEPDIR)/libgstopengl_la-gstglviewconvert.Tpo -c -o libgstopengl_la-gstglviewconvert.lo `test -f 'gstglviewconvert.c' || echo '$(srcdir)/'`gstglviewconvert.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopengl_la-gstglviewconvert.Tpo $(DEPDIR)/libgstopengl_la-gstglviewconvert.Plo
@@ -1446,6 +1450,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopengl_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopengl_la_CFLAGS) $(CFLAGS) -c -o libgstopengl_la-gstglstereomix.lo `test -f 'gstglstereomix.c' || echo '$(srcdir)/'`gstglstereomix.c
 
+libgstopengl_la-gstglfilterglass.lo: gstglfilterglass.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopengl_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopengl_la_CFLAGS) $(CFLAGS) -MT libgstopengl_la-gstglfilterglass.lo -MD -MP -MF $(DEPDIR)/libgstopengl_la-gstglfilterglass.Tpo -c -o libgstopengl_la-gstglfilterglass.lo `test -f 'gstglfilterglass.c' || echo '$(srcdir)/'`gstglfilterglass.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopengl_la-gstglfilterglass.Tpo $(DEPDIR)/libgstopengl_la-gstglfilterglass.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstglfilterglass.c' object='libgstopengl_la-gstglfilterglass.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopengl_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopengl_la_CFLAGS) $(CFLAGS) -c -o libgstopengl_la-gstglfilterglass.lo `test -f 'gstglfilterglass.c' || echo '$(srcdir)/'`gstglfilterglass.c
+
+libgstopengl_la-gstgldeinterlace.lo: gstgldeinterlace.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopengl_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopengl_la_CFLAGS) $(CFLAGS) -MT libgstopengl_la-gstgldeinterlace.lo -MD -MP -MF $(DEPDIR)/libgstopengl_la-gstgldeinterlace.Tpo -c -o libgstopengl_la-gstgldeinterlace.lo `test -f 'gstgldeinterlace.c' || echo '$(srcdir)/'`gstgldeinterlace.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopengl_la-gstgldeinterlace.Tpo $(DEPDIR)/libgstopengl_la-gstgldeinterlace.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstgldeinterlace.c' object='libgstopengl_la-gstgldeinterlace.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopengl_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopengl_la_CFLAGS) $(CFLAGS) -c -o libgstopengl_la-gstgldeinterlace.lo `test -f 'gstgldeinterlace.c' || echo '$(srcdir)/'`gstgldeinterlace.c
+
 libgstopengl_la-gltestsrc.lo: gltestsrc.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopengl_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopengl_la_CFLAGS) $(CFLAGS) -MT libgstopengl_la-gltestsrc.lo -MD -MP -MF $(DEPDIR)/libgstopengl_la-gltestsrc.Tpo -c -o libgstopengl_la-gltestsrc.lo `test -f 'gltestsrc.c' || echo '$(srcdir)/'`gltestsrc.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopengl_la-gltestsrc.Tpo $(DEPDIR)/libgstopengl_la-gltestsrc.Plo
diff --git a/ext/gl/caopengllayersink.m b/ext/gl/caopengllayersink.m
index 22954ff..42b8f90 100644
--- a/ext/gl/caopengllayersink.m
+++ b/ext/gl/caopengllayersink.m
@@ -167,9 +167,12 @@
     GST_STATIC_PAD_TEMPLATE ("sink",
     GST_PAD_SINK,
     GST_PAD_ALWAYS,
-    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
-        (GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
-            "RGBA"))
+    GST_STATIC_CAPS ("video/x-raw(" GST_CAPS_FEATURE_MEMORY_GL_MEMORY "), "
+      "format = (string) RGBA, "
+      "width = " GST_VIDEO_SIZE_RANGE ", "
+      "height = " GST_VIDEO_SIZE_RANGE ", "
+      "framerate = " GST_VIDEO_FPS_RANGE ","
+      "texture-target = (string) 2D")
     );
 
 enum
@@ -476,6 +479,8 @@
 
   if (ca_sink->display)
     gst_gl_display_filter_gl_api (ca_sink->display, SUPPORTED_GL_APIS);
+
+  GST_ELEMENT_CLASS (parent_class)->set_context (element, context);
 }
 
 static GstStateChangeReturn
@@ -887,13 +892,20 @@
 gst_ca_opengl_layer_sink_thread_init_redisplay (GstCAOpenGLLayerSink * ca_sink)
 {
   const GstGLFuncs *gl = ca_sink->context->gl_vtable;
+  GError *error = NULL;
 
-  ca_sink->redisplay_shader = gst_gl_shader_new (ca_sink->context);
-
-  if (!gst_gl_shader_compile_with_default_vf_and_check
-      (ca_sink->redisplay_shader, &ca_sink->attr_position,
-          &ca_sink->attr_texture))
+  if (!(ca_sink->redisplay_shader = gst_gl_shader_new_default (ca_sink->context, &error))) {
+    GST_ERROR_OBJECT (ca_sink, "Failed to link shader: %s", error->message);
     gst_ca_opengl_layer_sink_cleanup_glthread (ca_sink);
+    return;
+  }
+
+  ca_sink->attr_position =
+      gst_gl_shader_get_attribute_location (ca_sink->redisplay_shader,
+      "a_position");
+  ca_sink->attr_texture =
+      gst_gl_shader_get_attribute_location (ca_sink->redisplay_shader,
+      "a_texcoord");
 
   if (gl->GenVertexArrays) {
     gl->GenVertexArrays (1, &ca_sink->vao);
diff --git a/ext/gl/effects/gstgleffectidentity.c b/ext/gl/effects/gstgleffectidentity.c
index 9740cc7..ce29f60 100644
--- a/ext/gl/effects/gstgleffectidentity.c
+++ b/ext/gl/effects/gstgleffectidentity.c
@@ -42,17 +42,18 @@
 
   shader = g_hash_table_lookup (effects->shaderstable, "identity0");
   if (!shader) {
-    shader = gst_gl_shader_new (context);
-    g_hash_table_insert (effects->shaderstable, (gchar *) "identity0", shader);
+    GError *error = NULL;
 
-    if (!gst_gl_shader_compile_with_default_vf_and_check (shader,
-            &filter->draw_attr_position_loc, &filter->draw_attr_texture_loc)) {
-      /* gst gl context error is already set */
+    if (!(shader = gst_gl_shader_new_default (context, &error))) {
       GST_ELEMENT_ERROR (effects, RESOURCE, NOT_FOUND,
-          ("Failed to initialize identity shader, %s",
-              gst_gl_context_get_error ()), (NULL));
+          ("Failed to initialize identity shader: %s", error->message), (NULL));
       return;
     }
+
+    filter->draw_attr_position_loc =
+        gst_gl_shader_get_attribute_location (shader, "a_position");
+    filter->draw_attr_texture_loc =
+        gst_gl_shader_get_attribute_location (shader, "a_texcoord");
   }
   gst_gl_shader_use (shader);
 
diff --git a/ext/gl/gstglbasemixer.c b/ext/gl/gstglbasemixer.c
index 3bad769..ef90479 100644
--- a/ext/gl/gstglbasemixer.c
+++ b/ext/gl/gstglbasemixer.c
@@ -320,6 +320,8 @@
 
   if (mix->display)
     gst_gl_display_filter_gl_api (mix->display, mix_class->supported_gl_api);
+
+  GST_ELEMENT_CLASS (parent_class)->set_context (element, context);
 }
 
 static gboolean
diff --git a/ext/gl/gstglcolorconvertelement.c b/ext/gl/gstglcolorconvertelement.c
index e4ff6ca..76a70f2 100644
--- a/ext/gl/gstglcolorconvertelement.c
+++ b/ext/gl/gstglcolorconvertelement.c
@@ -58,15 +58,13 @@
 GST_STATIC_PAD_TEMPLATE ("src",
     GST_PAD_SRC,
     GST_PAD_ALWAYS,
-    GST_STATIC_CAPS (GST_GL_COLOR_CONVERT_VIDEO_CAPS ";"
-        GST_GL_COLOR_CONVERT_VIDEO_OVERLAY_COMPOSITION_CAPS));
+    GST_STATIC_CAPS (GST_GL_COLOR_CONVERT_VIDEO_CAPS));
 
 static GstStaticPadTemplate gst_gl_color_convert_element_sink_pad_template =
 GST_STATIC_PAD_TEMPLATE ("sink",
     GST_PAD_SINK,
     GST_PAD_ALWAYS,
-    GST_STATIC_CAPS (GST_GL_COLOR_CONVERT_VIDEO_CAPS ";"
-        GST_GL_COLOR_CONVERT_VIDEO_OVERLAY_COMPOSITION_CAPS));
+    GST_STATIC_CAPS (GST_GL_COLOR_CONVERT_VIDEO_CAPS));
 
 static gboolean
 gst_gl_color_convert_element_stop (GstBaseTransform * bt)
@@ -240,18 +238,7 @@
 gst_gl_color_convert_element_fixate_caps (GstBaseTransform *
     bt, GstPadDirection direction, GstCaps * caps, GstCaps * othercaps)
 {
-  GstCaps *ret;
+  GstGLContext *context = GST_GL_BASE_FILTER (bt)->context;
 
-  ret =
-      GST_BASE_TRANSFORM_CLASS
-      (gst_gl_color_convert_element_parent_class)->fixate_caps (bt, direction,
-      caps, othercaps);
-
-  if (direction == GST_PAD_SINK) {
-    if (gst_caps_is_subset (caps, ret)) {
-      gst_caps_replace (&ret, caps);
-    }
-  }
-
-  return ret;
+  return gst_gl_color_convert_fixate_caps (context, direction, caps, othercaps);
 }
diff --git a/ext/gl/gstglcolorscale.c b/ext/gl/gstglcolorscale.c
index a79e524..c7df0a8 100644
--- a/ext/gl/gstglcolorscale.c
+++ b/ext/gl/gstglcolorscale.c
@@ -70,24 +70,25 @@
 static void gst_gl_colorscale_get_property (GObject * object, guint prop_id,
     GValue * value, GParamSpec * pspec);
 
-static gboolean gst_gl_colorscale_gen_gl_resources (GstGLFilter * filter);
-static gboolean gst_gl_colorscale_del_gl_resources (GstBaseTransform * trans);
+static gboolean gst_gl_colorscale_gl_start (GstGLBaseFilter * base_filter);
+static void gst_gl_colorscale_gl_stop (GstGLBaseFilter * base_filter);
 
 static gboolean gst_gl_colorscale_filter_texture (GstGLFilter * filter,
     guint in_tex, guint out_tex);
-static void gst_gl_colorscale_callback (gint width, gint height,
-    guint texture, gpointer stuff);
 
 static void
 gst_gl_colorscale_class_init (GstGLColorscaleClass * klass)
 {
   GObjectClass *gobject_class;
   GstElementClass *element_class;
+  GstBaseTransformClass *basetransform_class;
+  GstGLBaseFilterClass *base_filter_class;
   GstGLFilterClass *filter_class;
-  GstBaseTransformClass *basetransform_class = GST_BASE_TRANSFORM_CLASS (klass);
 
   gobject_class = (GObjectClass *) klass;
   element_class = GST_ELEMENT_CLASS (klass);
+  basetransform_class = GST_BASE_TRANSFORM_CLASS (klass);
+  base_filter_class = GST_GL_BASE_FILTER_CLASS (klass);
   filter_class = GST_GL_FILTER_CLASS (klass);
 
   gobject_class->set_property = gst_gl_colorscale_set_property;
@@ -95,24 +96,22 @@
 
   gst_element_class_set_metadata (element_class, "OpenGL color scale",
       "Filter/Effect/Video", "Colorspace converter and video scaler",
-      "Julien Isorce <julien.isorce@gmail.com>");
+      "Julien Isorce <julien.isorce@gmail.com>\n"
+      "Matthew Waters <matthew@centricular.com>");
 
-  filter_class->init_fbo =
-      GST_DEBUG_FUNCPTR (gst_gl_colorscale_gen_gl_resources);
+  basetransform_class->passthrough_on_same_caps = TRUE;
+
+  base_filter_class->gl_start = GST_DEBUG_FUNCPTR (gst_gl_colorscale_gl_start);
+  base_filter_class->gl_stop = GST_DEBUG_FUNCPTR (gst_gl_colorscale_gl_stop);
+  base_filter_class->supported_gl_api =
+      GST_GL_API_OPENGL | GST_GL_API_OPENGL3 | GST_GL_API_GLES2;
 
   filter_class->filter_texture = gst_gl_colorscale_filter_texture;
-
-  basetransform_class->stop =
-      GST_DEBUG_FUNCPTR (gst_gl_colorscale_del_gl_resources);
-  basetransform_class->passthrough_on_same_caps = TRUE;
-  GST_GL_BASE_FILTER_CLASS (klass)->supported_gl_api =
-      GST_GL_API_OPENGL | GST_GL_API_OPENGL3 | GST_GL_API_GLES2;
 }
 
 static void
 gst_gl_colorscale_init (GstGLColorscale * colorscale)
 {
-  colorscale->shader = NULL;
 }
 
 static void
@@ -137,93 +136,53 @@
   }
 }
 
-static void
-_compile_identity_shader (GstGLContext * context, GstGLColorscale * colorscale)
+static gboolean
+gst_gl_colorscale_gl_start (GstGLBaseFilter * base_filter)
 {
-  GstGLFilter *filter = GST_GL_FILTER (colorscale);
+  GstGLColorscale *colorscale = GST_GL_COLORSCALE (base_filter);
+  GstGLFilter *filter = GST_GL_FILTER (base_filter);
+  GstGLShader *shader;
+  GError *error = NULL;
 
-  colorscale->shader = gst_gl_shader_new (context);
+  if (!(shader = gst_gl_shader_new_default (base_filter->context, &error))) {
+    GST_ERROR_OBJECT (colorscale, "Failed to initialize shader: %s",
+        error->message);
+    gst_object_unref (shader);
+    return FALSE;
+  }
 
-  if (!gst_gl_shader_compile_with_default_vf_and_check (colorscale->shader,
-          &filter->draw_attr_position_loc, &filter->draw_attr_texture_loc)) {
-    gst_gl_context_clear_shader (context);
+  filter->draw_attr_position_loc =
+      gst_gl_shader_get_attribute_location (shader, "a_position");
+  filter->draw_attr_texture_loc =
+      gst_gl_shader_get_attribute_location (shader, "a_texcoord");
+
+  colorscale->shader = shader;
+
+  return GST_GL_BASE_FILTER_CLASS (parent_class)->gl_start (base_filter);
+}
+
+static void
+gst_gl_colorscale_gl_stop (GstGLBaseFilter * base_filter)
+{
+  GstGLColorscale *colorscale = GST_GL_COLORSCALE (base_filter);
+
+  if (colorscale->shader) {
     gst_object_unref (colorscale->shader);
     colorscale->shader = NULL;
   }
-}
 
-static gboolean
-gst_gl_colorscale_gen_gl_resources (GstGLFilter * filter)
-{
-  GstGLColorscale *colorscale = GST_GL_COLORSCALE (filter);
-
-  if (gst_gl_context_get_gl_api (GST_GL_BASE_FILTER (filter)->context) &
-      (GST_GL_API_GLES2 | GST_GL_API_OPENGL3)) {
-    gst_gl_context_thread_add (GST_GL_BASE_FILTER (filter)->context,
-        (GstGLContextThreadFunc) _compile_identity_shader, colorscale);
-
-    if (!colorscale->shader) {
-      gst_gl_context_set_error (GST_GL_BASE_FILTER (filter)->context,
-          "Failed to initialize identity shader");
-      GST_ELEMENT_ERROR (colorscale, RESOURCE, NOT_FOUND, ("%s",
-              gst_gl_context_get_error ()), (NULL));
-      return FALSE;
-    }
-  }
-
-  return TRUE;
-}
-
-static gboolean
-gst_gl_colorscale_del_gl_resources (GstBaseTransform * trans)
-{
-  GstGLColorscale *colorscale = GST_GL_COLORSCALE (trans);
-
-  if (colorscale->shader) {
-    gst_gl_context_del_shader (GST_GL_BASE_FILTER (trans)->context,
-        colorscale->shader);
-    colorscale->shader = NULL;
-  }
-
-  return GST_BASE_TRANSFORM_CLASS (parent_class)->stop (trans);
+  return GST_GL_BASE_FILTER_CLASS (parent_class)->gl_stop (base_filter);
 }
 
 static gboolean
 gst_gl_colorscale_filter_texture (GstGLFilter * filter, guint in_tex,
     guint out_tex)
 {
-  GstGLColorscale *colorscale;
+  GstGLColorscale *colorscale = GST_GL_COLORSCALE (filter);
 
-  colorscale = GST_GL_COLORSCALE (filter);
-
-  if (gst_gl_context_get_gl_api (GST_GL_BASE_FILTER (filter)->context) &
-      (GST_GL_API_GLES2 | GST_GL_API_OPENGL3))
+  if (gst_gl_context_get_gl_api (GST_GL_BASE_FILTER (filter)->context))
     gst_gl_filter_render_to_target_with_shader (filter, TRUE, in_tex, out_tex,
         colorscale->shader);
 
-  if (gst_gl_context_get_gl_api (GST_GL_BASE_FILTER (filter)->context) &
-      GST_GL_API_OPENGL)
-    gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
-        gst_gl_colorscale_callback, colorscale);
-
   return TRUE;
 }
-
-static void
-gst_gl_colorscale_callback (gint width, gint height, guint texture,
-    gpointer stuff)
-{
-  GstGLFilter *filter = GST_GL_FILTER (stuff);
-
-#if GST_GL_HAVE_OPENGL
-  if (gst_gl_context_get_gl_api (GST_GL_BASE_FILTER (filter)->context) &
-      GST_GL_API_OPENGL) {
-    const GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
-
-    gl->MatrixMode (GL_PROJECTION);
-    gl->LoadIdentity ();
-  }
-#endif
-
-  gst_gl_filter_draw_texture (filter, texture, width, height);
-}
diff --git a/ext/gl/gstgldeinterlace.c b/ext/gl/gstgldeinterlace.c
index 2d48749..bd0eff0 100644
--- a/ext/gl/gstgldeinterlace.c
+++ b/ext/gl/gstgldeinterlace.c
@@ -26,7 +26,7 @@
  * <refsect2>
  * <title>Examples</title>
  * |[
- * gst-launch videotestsrc ! glupload ! gldeinterlace ! glimagesink
+ * gst-launch-1.0 videotestsrc ! glupload ! gldeinterlace ! glimagesink
  * ]|
  * FBO (Frame Buffer Object) and GLSL (OpenGL Shading Language) are required.
  * </refsect2>
diff --git a/ext/gl/gstgldifferencematte.c b/ext/gl/gstgldifferencematte.c
index b2b5fa5..6304c6d 100644
--- a/ext/gl/gstgldifferencematte.c
+++ b/ext/gl/gstgldifferencematte.c
@@ -26,7 +26,7 @@
  * <refsect2>
  * <title>Examples</title>
  * |[
- * gst-launch videotestsrc ! glupload ! gldifferencemate location=backgroundimagefile ! glimagesink
+ * gst-launch-1.0 videotestsrc ! glupload ! gldifferencemate location=backgroundimagefile ! glimagesink
  * ]|
  * FBO (Frame Buffer Object) and GLSL (OpenGL Shading Language) are required.
  * </refsect2>
@@ -78,7 +78,9 @@
 gst_gl_differencematte_init_gl_resources (GstGLFilter * filter)
 {
   GstGLDifferenceMatte *differencematte = GST_GL_DIFFERENCEMATTE (filter);
-  GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
+  GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
+  const GstGLFuncs *gl = context->gl_vtable;
+  GError *error = NULL;
   gint i;
 
   for (i = 0; i < 4; i++) {
@@ -96,45 +98,57 @@
         gst_gl_shader_new (GST_GL_BASE_FILTER (filter)->context);
   }
 
-  if (!gst_gl_shader_compile_with_default_v_and_check (differencematte->shader
-          [0], difference_fragment_source, &filter->draw_attr_position_loc,
-          &filter->draw_attr_texture_loc)) {
-    gst_gl_context_set_error (GST_GL_BASE_FILTER (differencematte)->context,
-        "Failed to initialize difference shader");
+  if (!(differencematte->shader[0] =
+          gst_gl_shader_new_link_with_stages (context, &error,
+              gst_glsl_stage_new_default_vertex (context),
+              gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
+                  GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_ES,
+                  difference_fragment_source), NULL))) {
     GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, ("%s",
             gst_gl_context_get_error ()), (NULL));
     return;
   }
 
-  if (!gst_gl_shader_compile_with_default_v_and_check (differencematte->shader
-          [1], hconv7_fragment_source_gles2, &filter->draw_attr_position_loc,
-          &filter->draw_attr_texture_loc)) {
-    gst_gl_context_set_error (GST_GL_BASE_FILTER (differencematte)->context,
-        "Failed to initialize hconv7 shader");
+  if (!(differencematte->shader[1] =
+          gst_gl_shader_new_link_with_stages (context, &error,
+              gst_glsl_stage_new_default_vertex (context),
+              gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
+                  GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_ES,
+                  hconv7_fragment_source_gles2), NULL))) {
     GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, ("%s",
             gst_gl_context_get_error ()), (NULL));
     return;
   }
 
-  if (!gst_gl_shader_compile_with_default_v_and_check (differencematte->shader
-          [2], vconv7_fragment_source_gles2, &filter->draw_attr_position_loc,
-          &filter->draw_attr_texture_loc)) {
-    gst_gl_context_set_error (GST_GL_BASE_FILTER (differencematte)->context,
-        "Failed to initialize vconv7 shader");
+  if (!(differencematte->shader[2] =
+          gst_gl_shader_new_link_with_stages (context, &error,
+              gst_glsl_stage_new_default_vertex (context),
+              gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
+                  GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_ES,
+                  vconv7_fragment_source_gles2), NULL))) {
     GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, ("%s",
             gst_gl_context_get_error ()), (NULL));
     return;
   }
 
-  if (!gst_gl_shader_compile_with_default_v_and_check (differencematte->shader
-          [3], texture_interp_fragment_source, &filter->draw_attr_position_loc,
-          &filter->draw_attr_texture_loc)) {
-    gst_gl_context_set_error (GST_GL_BASE_FILTER (differencematte)->context,
-        "Failed to initialize interp shader");
+  if (!(differencematte->shader[3] =
+          gst_gl_shader_new_link_with_stages (context, &error,
+              gst_glsl_stage_new_default_vertex (context),
+              gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
+                  GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_ES,
+                  texture_interp_fragment_source), NULL))) {
     GST_ELEMENT_ERROR (differencematte, RESOURCE, NOT_FOUND, ("%s",
             gst_gl_context_get_error ()), (NULL));
     return;
   }
+
+  /* FIXME: this should really be per shader */
+  filter->draw_attr_position_loc =
+      gst_gl_shader_get_attribute_location (differencematte->shader[3],
+      "a_position");
+  filter->draw_attr_texture_loc =
+      gst_gl_shader_get_attribute_location (differencematte->shader[3],
+      "a_texcoord");
 }
 
 /* free resources that need a gl context */
@@ -222,8 +236,7 @@
 
   switch (prop_id) {
     case PROP_LOCATION:
-      if (differencematte->location != NULL)
-        g_free (differencematte->location);
+      g_free (differencematte->location);
       differencematte->bg_has_changed = TRUE;
       differencematte->location = g_value_dup_string (value);
       break;
diff --git a/ext/gl/gstgldownloadelement.c b/ext/gl/gstgldownloadelement.c
index 94a6e7a..917bdc7 100644
--- a/ext/gl/gstgldownloadelement.c
+++ b/ext/gl/gstgldownloadelement.c
@@ -176,7 +176,8 @@
     if (gst_is_gl_memory (mem)) {
       if (!features || gst_caps_features_contains (features,
               GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY)) {
-        gst_gl_memory_download_transfer ((GstGLMemory *) mem);
+        if (gst_is_gl_memory_pbo (mem))
+          gst_gl_memory_pbo_download_transfer ((GstGLMemoryPBO *) mem);
       }
     }
   }
diff --git a/ext/gl/gstgleffects.c b/ext/gl/gstgleffects.c
index 6cf5afc..5c906fc 100644
--- a/ext/gl/gstgleffects.c
+++ b/ext/gl/gstgleffects.c
@@ -26,7 +26,7 @@
  * <refsect2>
  * <title>Examples</title>
  * |[
- * gst-launch videotestsrc ! glupload ! gleffects effect=5 ! glimagesink
+ * gst-launch-1.0 videotestsrc ! glupload ! gleffects effect=5 ! glimagesink
  * ]|
  * FBO (Frame Buffer Object) and GLSL (OpenGL Shading Language) are required.
  * </refsect2>
@@ -545,21 +545,22 @@
   shader = g_hash_table_lookup (effects->shaderstable, shader_name);
 
   if (!shader) {
-    shader = gst_gl_shader_new (context);
-    if (!gst_gl_shader_compile_with_default_v_and_check (shader,
-            shader_source_gles2, &filter->draw_attr_position_loc,
-            &filter->draw_attr_texture_loc)) {
-      /* gst gl context error is already set */
-      GST_ELEMENT_ERROR (effects, RESOURCE, NOT_FOUND,
-          ("Failed to initialize %s shader, %s",
-              shader_name, gst_gl_context_get_error ()), (NULL));
-      gst_object_unref (shader);
-      shader = NULL;
-    }
-  }
+    GError *error = NULL;
 
-  if (!shader)
-    return NULL;
+    if (!(shader = gst_gl_shader_new_link_with_stages (context, &error,
+                gst_glsl_stage_new_default_vertex (context),
+                gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
+                    GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_ES,
+                    shader_source_gles2), NULL))) {
+      GST_ELEMENT_ERROR (effects, RESOURCE, NOT_FOUND,
+          ("Failed to initialize %s shader", shader_name), (NULL));
+    }
+
+    filter->draw_attr_position_loc =
+        gst_gl_shader_get_attribute_location (shader, "a_position");
+    filter->draw_attr_texture_loc =
+        gst_gl_shader_get_attribute_location (shader, "a_texcoord");
+  }
 
   g_hash_table_insert (effects->shaderstable, (gchar *) shader_name, shader);
 
diff --git a/ext/gl/gstglfiltershader.c b/ext/gl/gstglfiltershader.c
index e201f74..12a8a9a 100644
--- a/ext/gl/gstglfiltershader.c
+++ b/ext/gl/gstglfiltershader.c
@@ -27,7 +27,7 @@
  * <refsect2>
  * <title>Examples</title>
  * |[
- * gst-launch videotestsrc ! glupload ! glshader location=myshader.fs ! glimagesink
+ * gst-launch-1.0 videotestsrc ! glupload ! glshader location=myshader.fs ! glimagesink
  * ]|
  * FBO (Frame Buffer Object) and GLSL (OpenGL Shading Language) are required.
  * </refsect2>
@@ -37,30 +37,31 @@
 #endif
 
 #include <gst/gst.h>
-#include <gst/gl/gstglshadervariables.h>
 
 #include "gstglfiltershader.h"
-
-/* horizontal filter */
-static gchar *hfilter_fragment_source;
-static gchar *hfilter_fragment_variables[2];
+#if HAVE_GRAPHENE
+#include <graphene-gobject.h>
+#endif
 
 enum
 {
   PROP_0,
-  PROP_LOCATION,
-  PROP_PRESET,
-  PROP_VARIABLES
+  PROP_SHADER,
+  PROP_VERTEX,
+  PROP_FRAGMENT,
+  PROP_UNIFORMS,
+  PROP_UPDATE_SHADER,
+  PROP_LAST,
 };
 
-static const gchar text_vertex_shader[] =
-    "attribute vec4 a_position;   \n"
-    "attribute vec2 a_texcoord;   \n"
-    "varying vec2 v_texcoord;     \n"
-    "void main()                  \n"
-    "{                            \n"
-    "   gl_Position = a_position; \n"
-    "   v_texcoord = a_texcoord;  \n" "}                            \n";
+enum
+{
+  SIGNAL_0,
+  SIGNAL_CREATE_SHADER,
+  SIGNAL_LAST,
+};
+
+static guint gst_gl_shader_signals[SIGNAL_LAST] = { 0 };
 
 #define GST_CAT_DEFAULT gst_gl_filtershader_debug
 GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
@@ -71,17 +72,13 @@
 G_DEFINE_TYPE_WITH_CODE (GstGLFilterShader, gst_gl_filtershader,
     GST_TYPE_GL_FILTER, DEBUG_INIT);
 
+static void gst_gl_filtershader_finalize (GObject * object);
 static void gst_gl_filtershader_set_property (GObject * object, guint prop_id,
     const GValue * value, GParamSpec * pspec);
 static void gst_gl_filtershader_get_property (GObject * object, guint prop_id,
     GValue * value, GParamSpec * pspec);
-static gboolean gst_gl_filter_filtershader_reset (GstBaseTransform * trans);
-
-static gboolean gst_gl_filtershader_load_shader (GstGLFilterShader *
-    filter_shader, char *filename, char **storage);
-static gboolean gst_gl_filtershader_load_variables (GstGLFilterShader *
-    filter_shader, char *filename, char **storage);
-static gboolean gst_gl_filtershader_init_shader (GstGLFilter * filter);
+static gboolean gst_gl_filtershader_gl_start (GstGLBaseFilter * base);
+static void gst_gl_filtershader_gl_stop (GstGLBaseFilter * base);
 static gboolean gst_gl_filtershader_filter (GstGLFilter * filter,
     GstBuffer * inbuf, GstBuffer * outbuf);
 static gboolean gst_gl_filtershader_filter_texture (GstGLFilter * filter,
@@ -89,32 +86,6 @@
 static void gst_gl_filtershader_hcallback (gint width, gint height,
     guint texture, gpointer stuff);
 
-
-static void
-gst_gl_filtershader_init_resources (GstGLFilter * filter)
-{
-  GstGLContext *context = GST_GL_BASE_FILTER (filter)->context;
-  guint internal_format;
-
-  internal_format =
-      gst_gl_sized_gl_format_from_gl_format_type (context, GL_RGBA,
-      GL_UNSIGNED_BYTE);
-  glTexImage2D (GL_TEXTURE_2D, 0, internal_format,
-      GST_VIDEO_INFO_WIDTH (&filter->out_info),
-      GST_VIDEO_INFO_HEIGHT (&filter->out_info), 0, GL_RGBA, GL_UNSIGNED_BYTE,
-      NULL);
-  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-  glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
-}
-
-static void
-gst_gl_filtershader_reset_resources (GstGLFilter * filter)
-{
-  //GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (filter);
-}
-
 static void
 gst_gl_filtershader_class_init (GstGLFilterShaderClass * klass)
 {
@@ -124,39 +95,60 @@
   gobject_class = (GObjectClass *) klass;
   element_class = GST_ELEMENT_CLASS (klass);
 
+  gobject_class->finalize = gst_gl_filtershader_finalize;
   gobject_class->set_property = gst_gl_filtershader_set_property;
   gobject_class->get_property = gst_gl_filtershader_get_property;
 
-  g_object_class_install_property (gobject_class, PROP_LOCATION,
-      g_param_spec_string ("location", "File Location",
-          "Location of the GLSL file to load", NULL,
+  g_object_class_install_property (gobject_class, PROP_SHADER,
+      g_param_spec_object ("shader", "Shader object",
+          "GstGLShader to use", GST_GL_TYPE_SHADER,
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
-  g_object_class_install_property (gobject_class, PROP_PRESET,
-      g_param_spec_string ("preset", "Preset File Location",
-          "Location of the shader uniform variables preset file", NULL,
+  g_object_class_install_property (gobject_class, PROP_VERTEX,
+      g_param_spec_string ("vertex", "Vertex Source",
+          "GLSL vertex source", NULL,
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
 
-  g_object_class_install_property (gobject_class, PROP_VARIABLES,
-      g_param_spec_string ("vars", "Uniform variables",
-          "Set the shader uniform variables", NULL,
-          G_PARAM_WRITABLE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
+  g_object_class_install_property (gobject_class, PROP_FRAGMENT,
+      g_param_spec_string ("fragment", "Fragment Source",
+          "GLSL fragment source", NULL,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+  /* FIXME: add other stages */
+
+  g_object_class_install_property (gobject_class, PROP_UNIFORMS,
+      g_param_spec_boxed ("uniforms", "GLSL Uniforms",
+          "GLSL Uniforms", GST_TYPE_STRUCTURE,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_property (gobject_class, PROP_UPDATE_SHADER,
+      g_param_spec_boolean ("update-shader", "Update Shader",
+          "Emit the \'create-shader\' signal for the next frame",
+          FALSE, G_PARAM_WRITABLE | G_PARAM_STATIC_STRINGS));
+
+  /*
+   * GstGLFilterShader::create-shader:
+   * @object: the #GstGLFilterShader
+   *
+   * Ask's the application for a shader to render with as a result of
+   * inititialization or setting the 'update-shader' property.
+   *
+   * Returns: a new #GstGLShader for use in the rendering pipeline
+   */
+  gst_gl_shader_signals[SIGNAL_CREATE_SHADER] =
+      g_signal_new ("create-shader", G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST, 0, NULL, NULL, g_cclosure_marshal_generic,
+      GST_GL_TYPE_SHADER, 0);
 
   gst_element_class_set_metadata (element_class,
       "OpenGL fragment shader filter", "Filter/Effect",
-      "Load GLSL fragment shader from file", "<luc.deschenaux@freesurf.ch>");
-
-  GST_BASE_TRANSFORM_CLASS (klass)->stop = gst_gl_filter_filtershader_reset;
+      "Perform operations with a GLSL shader", "<matthew@centricular.com>");
 
   GST_GL_FILTER_CLASS (klass)->filter = gst_gl_filtershader_filter;
   GST_GL_FILTER_CLASS (klass)->filter_texture =
       gst_gl_filtershader_filter_texture;
-  GST_GL_FILTER_CLASS (klass)->display_init_cb =
-      gst_gl_filtershader_init_resources;
-  GST_GL_FILTER_CLASS (klass)->display_reset_cb =
-      gst_gl_filtershader_reset_resources;
-  GST_GL_FILTER_CLASS (klass)->init_fbo = gst_gl_filtershader_init_shader;
 
+  GST_GL_BASE_FILTER_CLASS (klass)->gl_start = gst_gl_filtershader_gl_start;
+  GST_GL_BASE_FILTER_CLASS (klass)->gl_stop = gst_gl_filtershader_gl_stop;
   GST_GL_BASE_FILTER_CLASS (klass)->supported_gl_api =
       GST_GL_API_OPENGL | GST_GL_API_GLES2 | GST_GL_API_OPENGL3;
 }
@@ -164,21 +156,25 @@
 static void
 gst_gl_filtershader_init (GstGLFilterShader * filtershader)
 {
-  filtershader->shader0 = NULL;
+  filtershader->new_source = TRUE;
 }
 
-static gboolean
-gst_gl_filter_filtershader_reset (GstBaseTransform * trans)
+static void
+gst_gl_filtershader_finalize (GObject * object)
 {
-  GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (trans);
+  GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (object);
 
-  //blocking call, wait the opengl thread has destroyed the shader
-  if (filtershader->shader0)
-    gst_gl_context_del_shader (GST_GL_BASE_FILTER (trans)->context,
-        filtershader->shader0);
-  filtershader->shader0 = NULL;
+  g_free (filtershader->vertex);
+  filtershader->vertex = NULL;
 
-  return GST_BASE_TRANSFORM_CLASS (parent_class)->stop (trans);
+  g_free (filtershader->fragment);
+  filtershader->fragment = NULL;
+
+  if (filtershader->uniforms)
+    gst_structure_free (filtershader->uniforms);
+  filtershader->uniforms = NULL;
+
+  G_OBJECT_CLASS (gst_gl_filtershader_parent_class)->finalize (object);
 }
 
 static void
@@ -188,59 +184,40 @@
   GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (object);
 
   switch (prop_id) {
-
-    case PROP_LOCATION:
-
-      if (filtershader->filename) {
-        g_free (filtershader->filename);
-      }
-      if (filtershader->compiled) {
-        if (filtershader->shader0)
-          gst_gl_context_del_shader (GST_GL_BASE_FILTER (filtershader)->context,
-              filtershader->shader0);
-        filtershader->shader0 = 0;
-      }
-      filtershader->filename = g_strdup (g_value_get_string (value));
-      filtershader->compiled = 0;
-      filtershader->texSet = 0;
-
+    case PROP_SHADER:
+      GST_OBJECT_LOCK (filtershader);
+      gst_object_replace ((GstObject **) & filtershader->shader,
+          g_value_dup_object (value));
+      filtershader->new_source = FALSE;
+      GST_OBJECT_UNLOCK (filtershader);
       break;
-
-    case PROP_PRESET:
-
-      if (filtershader->presetfile) {
-        g_free (filtershader->presetfile);
-      }
-
-      filtershader->presetfile = g_strdup (g_value_get_string (value));
-
-      if (hfilter_fragment_variables[0]) {
-        g_free (hfilter_fragment_variables[0]);
-        hfilter_fragment_variables[0] = 0;
-      }
-
-      if (!filtershader->presetfile[0]) {
-        g_free (filtershader->presetfile);
-        filtershader->presetfile = 0;
-      }
-
+    case PROP_VERTEX:
+      GST_OBJECT_LOCK (filtershader);
+      g_free (filtershader->vertex);
+      filtershader->vertex = g_value_dup_string (value);
+      filtershader->new_source = TRUE;
+      GST_OBJECT_UNLOCK (filtershader);
       break;
-
-    case PROP_VARIABLES:
-
-      if (hfilter_fragment_variables[1]) {
-        g_free (hfilter_fragment_variables[1]);
-      }
-
-      hfilter_fragment_variables[1] = g_strdup (g_value_get_string (value));
-
-      if (!hfilter_fragment_variables[1][0]) {
-        g_free (hfilter_fragment_variables[1]);
-        hfilter_fragment_variables[1] = 0;
-      }
-
+    case PROP_FRAGMENT:
+      GST_OBJECT_LOCK (filtershader);
+      g_free (filtershader->fragment);
+      filtershader->fragment = g_value_dup_string (value);
+      filtershader->new_source = TRUE;
+      GST_OBJECT_UNLOCK (filtershader);
       break;
-
+    case PROP_UNIFORMS:
+      GST_OBJECT_LOCK (filtershader);
+      if (filtershader->uniforms)
+        gst_structure_free (filtershader->uniforms);
+      filtershader->uniforms = g_value_dup_boxed (value);
+      filtershader->new_uniforms = TRUE;
+      GST_OBJECT_UNLOCK (filtershader);
+      break;
+    case PROP_UPDATE_SHADER:
+      GST_OBJECT_LOCK (filtershader);
+      filtershader->update_shader = g_value_get_boolean (value);
+      GST_OBJECT_UNLOCK (filtershader);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -254,101 +231,48 @@
   GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (object);
 
   switch (prop_id) {
-    case PROP_LOCATION:
-      g_value_set_string (value, filtershader->filename);
+    case PROP_SHADER:
+      GST_OBJECT_LOCK (filtershader);
+      g_value_set_object (value, filtershader->shader);
+      GST_OBJECT_UNLOCK (filtershader);
       break;
-
-    case PROP_PRESET:
-      g_value_set_string (value, filtershader->presetfile);
+    case PROP_VERTEX:
+      GST_OBJECT_LOCK (filtershader);
+      g_value_set_string (value, filtershader->vertex);
+      GST_OBJECT_UNLOCK (filtershader);
       break;
-
+    case PROP_FRAGMENT:
+      GST_OBJECT_LOCK (filtershader);
+      g_value_set_string (value, filtershader->fragment);
+      GST_OBJECT_UNLOCK (filtershader);
+      break;
+    case PROP_UNIFORMS:
+      GST_OBJECT_LOCK (filtershader);
+      g_value_set_boxed (value, filtershader->uniforms);
+      GST_OBJECT_UNLOCK (filtershader);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
   }
 }
 
-static gboolean
-gst_gl_filtershader_load_shader (GstGLFilterShader * filter_shader,
-    char *filename, char **storage)
-{
-  GError *error = NULL;
-  gsize length;
-
-  g_return_val_if_fail (storage != NULL, FALSE);
-
-  if (!filename) {
-    GST_ELEMENT_ERROR (filter_shader, RESOURCE, NOT_FOUND,
-        ("A shader file is required"), (NULL));
-    return FALSE;
-  }
-
-  if (!g_file_get_contents (filename, storage, &length, &error)) {
-    GST_ELEMENT_ERROR (filter_shader, RESOURCE, NOT_FOUND, ("%s",
-            error->message), (NULL));
-    g_error_free (error);
-
-    return FALSE;
-  }
-
-  return TRUE;
-}
-
-static gboolean
-gst_gl_filtershader_load_variables (GstGLFilterShader * filter_shader,
-    char *filename, char **storage)
-{
-  GError *error = NULL;
-  gsize length;
-
-  if (storage[0]) {
-    g_free (storage[0]);
-    storage[0] = 0;
-  }
-
-  if (!filename)
-    return TRUE;
-
-  if (!g_file_get_contents (filename, storage, &length, &error)) {
-    GST_ELEMENT_ERROR (filter_shader, RESOURCE, NOT_FOUND, ("%s",
-            error->message), (NULL));
-    g_error_free (error);
-
-    return FALSE;
-  }
-
-  return TRUE;
-}
-
 static void
-gst_gl_filtershader_variables_parse (GstGLShader * shader, gchar * variables)
+gst_gl_filtershader_gl_stop (GstGLBaseFilter * base)
 {
-  gst_gl_shadervariables_parse (shader, variables, 0);
+  GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (base);
+
+  if (filtershader->shader)
+    gst_object_unref (filtershader->shader);
+  filtershader->shader = NULL;
+
+  GST_GL_BASE_FILTER_CLASS (parent_class)->gl_stop (base);
 }
 
 static gboolean
-gst_gl_filtershader_init_shader (GstGLFilter * filter)
+gst_gl_filtershader_gl_start (GstGLBaseFilter * base)
 {
-
-  GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (filter);
-
-  if (!gst_gl_filtershader_load_shader (filtershader, filtershader->filename,
-          &hfilter_fragment_source))
-    return FALSE;
-
-  //blocking call, wait the opengl thread has compiled the shader
-  if (!gst_gl_context_gen_shader (GST_GL_BASE_FILTER (filter)->context,
-          text_vertex_shader, hfilter_fragment_source, &filtershader->shader0))
-    return FALSE;
-
-
-  if (!gst_gl_filtershader_load_variables (filtershader,
-          filtershader->presetfile, &hfilter_fragment_variables[0]))
-    return FALSE;
-
-  filtershader->compiled = 1;
-
-  return TRUE;
+  return GST_GL_BASE_FILTER_CLASS (parent_class)->gl_start (base);
 }
 
 static inline gboolean
@@ -397,9 +321,178 @@
   gst_gl_filter_render_to_target (filter, TRUE, in_tex, out_tex,
       gst_gl_filtershader_hcallback, filtershader);
 
+  if (!filtershader->shader)
+    return FALSE;
+
   return TRUE;
 }
 
+static gboolean
+_set_uniform (GQuark field_id, const GValue * value, gpointer user_data)
+{
+  GstGLShader *shader = user_data;
+  const gchar *field_name = g_quark_to_string (field_id);
+
+  if (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_INT)) {
+    gst_gl_shader_set_uniform_1i (shader, field_name, g_value_get_int (value));
+  } else if (G_TYPE_CHECK_VALUE_TYPE ((value), G_TYPE_FLOAT)) {
+    gst_gl_shader_set_uniform_1f (shader, field_name,
+        g_value_get_float (value));
+#if HAVE_GRAPHENE
+  } else if (G_TYPE_CHECK_VALUE_TYPE ((value), GRAPHENE_TYPE_VEC2)) {
+    graphene_vec2_t *vec2 = g_value_get_boxed (value);
+    float x = graphene_vec2_get_x (vec2);
+    float y = graphene_vec2_get_y (vec2);
+    gst_gl_shader_set_uniform_2f (shader, field_name, x, y);
+  } else if (G_TYPE_CHECK_VALUE_TYPE ((value), GRAPHENE_TYPE_VEC3)) {
+    graphene_vec3_t *vec3 = g_value_get_boxed (value);
+    float x = graphene_vec3_get_x (vec3);
+    float y = graphene_vec3_get_y (vec3);
+    float z = graphene_vec3_get_z (vec3);
+    gst_gl_shader_set_uniform_3f (shader, field_name, x, y, z);
+  } else if (G_TYPE_CHECK_VALUE_TYPE ((value), GRAPHENE_TYPE_VEC4)) {
+    graphene_vec4_t *vec4 = g_value_get_boxed (value);
+    float x = graphene_vec4_get_x (vec4);
+    float y = graphene_vec4_get_y (vec4);
+    float z = graphene_vec4_get_z (vec4);
+    float w = graphene_vec4_get_w (vec4);
+    gst_gl_shader_set_uniform_4f (shader, field_name, x, y, z, w);
+  } else if (G_TYPE_CHECK_VALUE_TYPE ((value), GRAPHENE_TYPE_MATRIX)) {
+    graphene_matrix_t *matrix = g_value_get_boxed (value);
+    float matrix_f[16];
+    graphene_matrix_to_float (matrix, matrix_f);
+    gst_gl_shader_set_uniform_matrix_4fv (shader, field_name, 1, FALSE,
+        matrix_f);
+#endif
+  } else {
+    /* FIXME: Add support for unsigned ints, non 4x4 matrices, etc */
+    GST_FIXME ("Don't know how to set the \'%s\' paramater.  Unknown type",
+        field_name);
+    return TRUE;
+  }
+
+  return TRUE;
+}
+
+static void
+_update_uniforms (GstGLFilterShader * filtershader)
+{
+  if (filtershader->new_uniforms && filtershader->uniforms) {
+    gst_gl_shader_use (filtershader->shader);
+
+    gst_structure_foreach (filtershader->uniforms,
+        (GstStructureForeachFunc) _set_uniform, filtershader->shader);
+    filtershader->new_uniforms = FALSE;
+  }
+}
+
+static GstGLShader *
+_maybe_recompile_shader (GstGLFilterShader * filtershader)
+{
+  GstGLContext *context = GST_GL_BASE_FILTER (filtershader)->context;
+  GstGLShader *shader;
+  GError *error = NULL;
+
+  GST_OBJECT_LOCK (filtershader);
+
+  if (!filtershader->shader || filtershader->update_shader) {
+    filtershader->update_shader = FALSE;
+    GST_OBJECT_UNLOCK (filtershader);
+    g_signal_emit (filtershader, gst_gl_shader_signals[SIGNAL_CREATE_SHADER], 0,
+        &shader);
+    GST_OBJECT_LOCK (filtershader);
+
+    if (shader) {
+      if (filtershader->shader)
+        gst_object_unref (filtershader->shader);
+      filtershader->new_source = FALSE;
+      filtershader->shader = gst_object_ref (shader);
+      filtershader->new_uniforms = TRUE;
+      _update_uniforms (filtershader);
+      GST_OBJECT_UNLOCK (filtershader);
+      return shader;
+    }
+  }
+
+  if (filtershader->shader) {
+    shader = gst_object_ref (filtershader->shader);
+    _update_uniforms (filtershader);
+    GST_OBJECT_UNLOCK (filtershader);
+    return shader;
+  }
+
+  if (filtershader->new_source) {
+    GstGLSLStage *stage;
+
+    shader = gst_gl_shader_new (context);
+
+    if (filtershader->vertex) {
+      if (!(stage = gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER,
+                  GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_NONE,
+                  filtershader->vertex))) {
+        g_set_error (&error, GST_GLSL_ERROR, GST_GLSL_ERROR_COMPILE,
+            "Failed to create shader vertex stage");
+        goto print_error;
+      }
+    } else {
+      stage = gst_glsl_stage_new_default_vertex (context);
+    }
+
+    if (!gst_gl_shader_compile_attach_stage (shader, stage, &error)) {
+      gst_object_unref (stage);
+      goto print_error;
+    }
+
+    if (filtershader->fragment) {
+      if (!(stage = gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
+                  GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_NONE,
+                  filtershader->fragment))) {
+        g_set_error (&error, GST_GLSL_ERROR, GST_GLSL_ERROR_COMPILE,
+            "Failed to create shader fragment stage");
+        goto print_error;
+      }
+    } else {
+      stage = gst_glsl_stage_new_default_fragment (context);
+    }
+
+    if (!gst_gl_shader_compile_attach_stage (shader, stage, &error)) {
+      gst_object_unref (stage);
+      goto print_error;
+    }
+
+    if (!gst_gl_shader_link (shader, &error)) {
+      goto print_error;
+    }
+    if (filtershader->shader)
+      gst_object_unref (filtershader->shader);
+    filtershader->shader = gst_object_ref (shader);
+    filtershader->new_source = FALSE;
+    filtershader->new_uniforms = TRUE;
+    _update_uniforms (filtershader);
+
+    GST_OBJECT_UNLOCK (filtershader);
+    return shader;
+  } else if (filtershader->shader) {
+    _update_uniforms (filtershader);
+    shader = gst_object_ref (filtershader->shader);
+    GST_OBJECT_UNLOCK (filtershader);
+    return shader;
+  }
+
+  return NULL;
+
+print_error:
+  if (shader) {
+    gst_object_unref (shader);
+    shader = NULL;
+  }
+
+  GST_OBJECT_UNLOCK (filtershader);
+  GST_ELEMENT_ERROR (filtershader, RESOURCE, NOT_FOUND,
+      ("%s", error->message), (NULL));
+  return NULL;
+}
+
 static void
 gst_gl_filtershader_hcallback (gint width, gint height, guint texture,
     gpointer stuff)
@@ -407,39 +500,32 @@
   GstGLFilter *filter = GST_GL_FILTER (stuff);
   GstGLFilterShader *filtershader = GST_GL_FILTERSHADER (filter);
   GstGLFuncs *gl = GST_GL_BASE_FILTER (filter)->context->gl_vtable;
+  GstGLShader *shader;
 
-  gst_gl_shader_use (filtershader->shader0);
+  if (!(shader = _maybe_recompile_shader (filtershader)))
+    return;
+
+  gl->ClearColor (0.0, 0.0, 0.0, 1.0);
+  gl->Clear (GL_COLOR_BUFFER_BIT);
+
+  gst_gl_shader_use (shader);
+
+  /* FIXME: propertise these */
+  gst_gl_shader_set_uniform_1i (shader, "tex", 0);
+  gst_gl_shader_set_uniform_1f (shader, "width", width);
+  gst_gl_shader_set_uniform_1f (shader, "height", height);
+  gst_gl_shader_set_uniform_1f (shader, "time", filtershader->time);
+
+  /* FIXME: propertise these */
+  filter->draw_attr_position_loc =
+      gst_gl_shader_get_attribute_location (shader, "a_position");
+  filter->draw_attr_texture_loc =
+      gst_gl_shader_get_attribute_location (shader, "a_texcoord");
 
   gl->ActiveTexture (GL_TEXTURE0);
   gl->BindTexture (GL_TEXTURE_2D, texture);
 
-  gst_gl_shader_set_uniform_1i (filtershader->shader0, "tex", 0);
-  gst_gl_shader_set_uniform_1f (filtershader->shader0, "width", width);
-  gst_gl_shader_set_uniform_1f (filtershader->shader0, "height", height);
-  gst_gl_shader_set_uniform_1f (filtershader->shader0, "time",
-      filtershader->time);
-
-  filter->draw_attr_position_loc =
-      gst_gl_shader_get_attribute_location (filtershader->shader0,
-      "a_position");
-  filter->draw_attr_texture_loc =
-      gst_gl_shader_get_attribute_location (filtershader->shader0,
-      "a_texcoord");
-
-  if (hfilter_fragment_variables[0]) {
-    gst_gl_filtershader_variables_parse (filtershader->shader0,
-        hfilter_fragment_variables[0]);
-    g_free (hfilter_fragment_variables[0]);
-    hfilter_fragment_variables[0] = 0;
-  }
-  if (hfilter_fragment_variables[1]) {
-    gst_gl_filtershader_variables_parse (filtershader->shader0,
-        hfilter_fragment_variables[1]);
-    g_free (hfilter_fragment_variables[1]);
-    hfilter_fragment_variables[1] = 0;
-  }
-
-  gl->Clear (GL_COLOR_BUFFER_BIT);
-
   gst_gl_filter_draw_texture (filter, texture, width, height);
+
+  gst_object_unref (shader);
 }
diff --git a/ext/gl/gstglfiltershader.h b/ext/gl/gstglfiltershader.h
index 615382a..adf1410 100644
--- a/ext/gl/gstglfiltershader.h
+++ b/ext/gl/gstglfiltershader.h
@@ -37,11 +37,16 @@
 struct _GstGLFilterShader
 {
   GstGLFilter filter;
-  GstGLShader *shader0;
-  int compiled;
-  gchar *filename;
-  gchar *presetfile;
-  int texSet;
+
+  /* properties */
+  GstGLShader *shader;
+  gchar *vertex;
+  gchar *fragment;
+  gboolean update_shader; /* update the shader on the next draw */
+  GstStructure *uniforms;
+
+  gboolean new_source;
+  gboolean new_uniforms;
   gdouble time;
 
   gint attr_position_loc;
diff --git a/ext/gl/gstglimagesink.c b/ext/gl/gstglimagesink.c
index 49e59b8..dc25e66 100644
--- a/ext/gl/gstglimagesink.c
+++ b/ext/gl/gstglimagesink.c
@@ -89,6 +89,7 @@
 
 #include <gst/video/videooverlay.h>
 #include <gst/video/navigation.h>
+#include <gst/video/gstvideoaffinetransformationmeta.h>
 
 #include "gstglimagesink.h"
 #include "gstglsinkbin.h"
@@ -321,17 +322,26 @@
 static gboolean update_output_format (GstGLImageSink * glimage_sink);
 
 #define GST_GL_SINK_CAPS \
-    GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, "RGBA")
-
-#define GST_GL_SINK_OVERLAY_CAPS \
-    GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_GL_MEMORY "," \
-            GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION, "RGBA")
+    "video/x-raw(" GST_CAPS_FEATURE_MEMORY_GL_MEMORY "), "              \
+    "format = (string) RGBA, "                                          \
+    "width = " GST_VIDEO_SIZE_RANGE ", "                                \
+    "height = " GST_VIDEO_SIZE_RANGE ", "                               \
+    "framerate = " GST_VIDEO_FPS_RANGE ", "                             \
+    "texture-target = (string) { 2D, external-oes } "                   \
+    " ; "                                                               \
+    "video/x-raw(" GST_CAPS_FEATURE_MEMORY_GL_MEMORY ","                \
+    GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION "), "           \
+    "format = (string) RGBA, "                                          \
+    "width = " GST_VIDEO_SIZE_RANGE ", "                                \
+    "height = " GST_VIDEO_SIZE_RANGE ", "                               \
+    "framerate = " GST_VIDEO_FPS_RANGE ", "                             \
+    "texture-target = (string) { 2D, external-oes } "
 
 static GstStaticPadTemplate gst_glimage_sink_template =
-    GST_STATIC_PAD_TEMPLATE ("sink",
+GST_STATIC_PAD_TEMPLATE ("sink",
     GST_PAD_SINK,
     GST_PAD_ALWAYS,
-    GST_STATIC_CAPS (GST_GL_SINK_CAPS ";" GST_GL_SINK_OVERLAY_CAPS));
+    GST_STATIC_CAPS (GST_GL_SINK_CAPS));
 
 enum
 {
@@ -411,7 +421,7 @@
   }
 
   window = gst_gl_context_get_window (sink->context);
-  g_return_if_fail (GST_GL_IS_WINDOW (window));
+  g_return_if_fail (GST_IS_GL_WINDOW (window));
 
   width = GST_VIDEO_SINK_WIDTH (sink);
   height = GST_VIDEO_SINK_HEIGHT (sink);
@@ -884,6 +894,7 @@
       buf[0] = glimage_sink->stored_buffer[0];
       buf[1] = glimage_sink->stored_buffer[1];
       glimage_sink->stored_buffer[0] = glimage_sink->stored_buffer[1] = NULL;
+      glimage_sink->stored_sync_meta = glimage_sink->next_sync_meta = NULL;
       GST_GLIMAGE_SINK_UNLOCK (glimage_sink);
 
       gst_buffer_replace (buf, NULL);
@@ -916,6 +927,8 @@
 
   if (gl_sink->display)
     gst_gl_display_filter_gl_api (gl_sink->display, SUPPORTED_GL_APIS);
+
+  GST_ELEMENT_CLASS (parent_class)->set_context (element, context);
 }
 
 static GstStateChangeReturn
@@ -937,14 +950,11 @@
         return GST_STATE_CHANGE_FAILURE;
 
       gst_gl_display_filter_gl_api (glimage_sink->display, SUPPORTED_GL_APIS);
-      break;
-    case GST_STATE_CHANGE_READY_TO_PAUSED:
+
       if (!_ensure_gl_setup (glimage_sink))
         return GST_STATE_CHANGE_FAILURE;
-
-      glimage_sink->overlay_compositor =
-          gst_gl_overlay_compositor_new (glimage_sink->context);
-
+      break;
+    case GST_STATE_CHANGE_READY_TO_PAUSED:
       g_atomic_int_set (&glimage_sink->to_quit, 0);
       break;
     case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
@@ -972,6 +982,7 @@
       buf[0] = glimage_sink->stored_buffer[0];
       buf[1] = glimage_sink->stored_buffer[1];
       glimage_sink->stored_buffer[0] = glimage_sink->stored_buffer[1] = NULL;
+      glimage_sink->stored_sync_meta = glimage_sink->next_sync_meta = NULL;
 
       if (glimage_sink->stored_sync)
         gst_buffer_unref (glimage_sink->stored_sync);
@@ -999,6 +1010,17 @@
         gst_caps_unref (glimage_sink->out_caps);
         glimage_sink->out_caps = NULL;
       }
+      if (glimage_sink->in_caps) {
+        gst_caps_unref (glimage_sink->in_caps);
+        glimage_sink->in_caps = NULL;
+      }
+      break;
+    }
+    case GST_STATE_CHANGE_READY_TO_NULL:
+      if (glimage_sink->overlay_compositor) {
+        gst_object_unref (glimage_sink->overlay_compositor);
+        glimage_sink->overlay_compositor = NULL;
+      }
 
       if (glimage_sink->context) {
         GstGLWindow *window = gst_gl_context_get_window (glimage_sink->context);
@@ -1017,16 +1039,11 @@
           g_signal_handler_disconnect (window, glimage_sink->mouse_sig_id);
         glimage_sink->mouse_sig_id = 0;
 
-        gst_object_unref (glimage_sink->overlay_compositor);
-        glimage_sink->overlay_compositor = NULL;
-
         gst_object_unref (window);
         gst_object_unref (glimage_sink->context);
         glimage_sink->context = NULL;
       }
-      break;
-    }
-    case GST_STATE_CHANGE_READY_TO_NULL:
+
       if (glimage_sink->other_context) {
         gst_object_unref (glimage_sink->other_context);
         glimage_sink->other_context = NULL;
@@ -1164,9 +1181,14 @@
   gboolean input_is_mono = FALSE;
   GstVideoMultiviewMode mv_mode;
   GstGLWindow *window = NULL;
+  GstGLTextureTarget previous_target;
+  GstStructure *s;
+  const gchar *target_str;
+  GstCaps *out_caps;
   gboolean ret;
 
   *out_info = glimage_sink->in_info;
+  previous_target = glimage_sink->texture_target;
 
   mv_mode = GST_VIDEO_INFO_MULTIVIEW_MODE (&glimage_sink->in_info);
 
@@ -1205,15 +1227,51 @@
     glimage_sink->out_info.height = MAX (1, glimage_sink->display_rect.h);
     GST_LOG_OBJECT (glimage_sink, "Set 3D output scale to %d,%d",
         glimage_sink->display_rect.w, glimage_sink->display_rect.h);
+  }
+
+  s = gst_caps_get_structure (glimage_sink->in_caps, 0);
+  target_str = gst_structure_get_string (s, "texture-target");
+
+  if (!target_str)
+    target_str = GST_GL_TEXTURE_TARGET_2D_STR;
+
+  glimage_sink->texture_target = gst_gl_texture_target_from_string (target_str);
+  if (!glimage_sink->texture_target)
+    return FALSE;
+
+  out_caps = gst_video_info_to_caps (out_info);
+  gst_caps_set_features (out_caps, 0,
+      gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_GL_MEMORY));
+  gst_caps_set_simple (out_caps, "texture-target", G_TYPE_STRING,
+      target_str, NULL);
+
+  if (glimage_sink->convert_views) {
+    gst_caps_set_simple (out_caps, "texture-target", G_TYPE_STRING,
+        GST_GL_TEXTURE_TARGET_2D_STR, NULL);
+
+    glimage_sink->texture_target = GST_GL_TEXTURE_TARGET_2D;
 
     GST_GLIMAGE_SINK_UNLOCK (glimage_sink);
-    gst_gl_view_convert_set_format (glimage_sink->convert_views,
-        &glimage_sink->in_info, &glimage_sink->out_info);
+    gst_gl_view_convert_set_caps (glimage_sink->convert_views,
+        glimage_sink->in_caps, out_caps);
     g_object_set (glimage_sink->convert_views, "downmix-mode",
         glimage_sink->mview_downmix_mode, NULL);
     GST_GLIMAGE_SINK_LOCK (glimage_sink);
   }
 
+  if (glimage_sink->out_caps)
+    gst_caps_unref (glimage_sink->out_caps);
+  glimage_sink->out_caps = out_caps;
+
+  if (previous_target != GST_GL_TEXTURE_TARGET_NONE &&
+      glimage_sink->texture_target != previous_target) {
+    /* regenerate the shader for the changed target */
+    GstGLWindow *window = gst_gl_context_get_window (glimage_sink->context);
+    gst_gl_window_send_message (window,
+        GST_GL_WINDOW_CB (gst_glimage_sink_cleanup_glthread), glimage_sink);
+    gst_object_unref (window);
+  }
+
   glimage_sink->output_mode_changed = FALSE;
 
   if (glimage_sink->context)
@@ -1223,10 +1281,6 @@
     gst_object_unref (window);
   }
 
-  if (glimage_sink->out_caps)
-    gst_caps_unref (glimage_sink->out_caps);
-  glimage_sink->out_caps = gst_video_info_to_caps (out_info);
-
   return ret;
 }
 
@@ -1249,6 +1303,9 @@
     return FALSE;
 
   GST_GLIMAGE_SINK_LOCK (glimage_sink);
+  if (glimage_sink->in_caps)
+    gst_caps_unref (glimage_sink->in_caps);
+  glimage_sink->in_caps = gst_caps_ref (caps);
   glimage_sink->in_info = vinfo;
   ok = update_output_format (glimage_sink);
 
@@ -1264,7 +1321,7 @@
 {
   GstBuffer *in_buffer, *next_buffer, *old_buffer;
   GstBuffer *in_buffer2 = NULL, *next_buffer2 = NULL, *old_buffer2;
-  GstBuffer *next_sync, *old_sync;
+  GstBuffer *next_sync = NULL, *old_sync;
   GstGLSyncMeta *sync_meta;
   GstVideoFrame gl_frame;
   GstGLViewConvert *convert_views = NULL;
@@ -1315,6 +1372,7 @@
         goto fail;
     }
     gst_object_unref (convert_views);
+    convert_views = NULL;
 
     if (next_buffer == NULL) {
       /* Not ready to paint a buffer yet */
@@ -1326,20 +1384,33 @@
     info = &glimage_sink->in_info;
   }
 
+  if (!glimage_sink->overlay_compositor) {
+    if (!(glimage_sink->overlay_compositor =
+            gst_gl_overlay_compositor_new (glimage_sink->context))) {
+      gst_buffer_unref (next_buffer);
+      goto fail;
+    }
+  }
+
   gst_gl_overlay_compositor_upload_overlays (glimage_sink->overlay_compositor,
       next_buffer);
 
+  sync_meta = gst_buffer_get_gl_sync_meta (next_buffer);
+
+  if (!sync_meta) {
+    next_sync = gst_buffer_new ();
+    sync_meta = gst_buffer_add_gl_sync_meta (glimage_sink->context, next_sync);
+    gst_gl_sync_meta_set_sync_point (sync_meta, glimage_sink->context);
+  }
+
   /* in_buffer invalid now */
   if (!gst_video_frame_map (&gl_frame, info, next_buffer,
           GST_MAP_READ | GST_MAP_GL)) {
     gst_buffer_unref (next_buffer);
+    GST_ERROR ("Failed to map video frame.");
     goto fail;
   }
 
-  next_sync = gst_buffer_new ();
-  sync_meta = gst_buffer_add_gl_sync_meta (glimage_sink->context, next_sync);
-  gst_gl_sync_meta_set_sync_point (sync_meta, glimage_sink->context);
-
   GST_GLIMAGE_SINK_LOCK (glimage_sink);
   glimage_sink->next_tex = *(guint *) gl_frame.data[0];
 
@@ -1350,6 +1421,7 @@
 
   old_sync = glimage_sink->next_sync;
   glimage_sink->next_sync = next_sync;
+  glimage_sink->next_sync_meta = sync_meta;
 
   /* Need to drop the lock again, to avoid a deadlock if we're
    * dropping the last ref on this buffer and it goes back to our
@@ -1369,6 +1441,8 @@
   return TRUE;
 
 fail:
+  if (convert_views)
+    gst_object_unref (convert_views);
   GST_GLIMAGE_SINK_LOCK (glimage_sink);
   return FALSE;
 }
@@ -1377,6 +1451,7 @@
 gst_glimage_sink_prepare (GstBaseSink * bsink, GstBuffer * buf)
 {
   GstGLImageSink *glimage_sink;
+  GstGLSyncMeta *sync_meta;
   GstBuffer **target;
   GstBuffer *old_input;
 
@@ -1392,6 +1467,10 @@
   if (!_ensure_gl_setup (glimage_sink))
     return GST_FLOW_NOT_NEGOTIATED;
 
+  sync_meta = gst_buffer_get_gl_sync_meta (buf);
+  if (sync_meta)
+    gst_gl_sync_meta_wait (sync_meta, glimage_sink->context);
+
   GST_GLIMAGE_SINK_LOCK (glimage_sink);
   target = &glimage_sink->input_buffer;
   if (GST_VIDEO_INFO_MULTIVIEW_MODE (&glimage_sink->in_info) ==
@@ -1682,13 +1761,47 @@
 gst_glimage_sink_thread_init_redisplay (GstGLImageSink * gl_sink)
 {
   const GstGLFuncs *gl = gl_sink->context->gl_vtable;
+  GError *error = NULL;
+  GstGLSLStage *frag_stage, *vert_stage;
 
-  gl_sink->redisplay_shader = gst_gl_shader_new (gl_sink->context);
-
-  if (!gst_gl_shader_compile_with_default_vf_and_check
-      (gl_sink->redisplay_shader, &gl_sink->attr_position,
-          &gl_sink->attr_texture))
+  if (gl_sink->texture_target == GST_GL_TEXTURE_TARGET_EXTERNAL_OES) {
+    vert_stage = gst_glsl_stage_new_with_string (gl_sink->context,
+        GL_VERTEX_SHADER, GST_GLSL_VERSION_NONE,
+        GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
+        gst_gl_shader_string_vertex_mat4_texture_transform);
+    frag_stage = gst_glsl_stage_new_with_string (gl_sink->context,
+        GL_FRAGMENT_SHADER, GST_GLSL_VERSION_NONE,
+        GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
+        gst_gl_shader_string_fragment_external_oes_default);
+  } else {
+    vert_stage = gst_glsl_stage_new_default_vertex (gl_sink->context);
+    frag_stage = gst_glsl_stage_new_default_fragment (gl_sink->context);
+  }
+  if (!vert_stage || !frag_stage) {
+    GST_ERROR_OBJECT (gl_sink, "Failed to retreive fragment shader for "
+        "texture target");
+    if (vert_stage)
+      gst_object_unref (vert_stage);
+    if (frag_stage)
+      gst_object_unref (frag_stage);
     gst_glimage_sink_cleanup_glthread (gl_sink);
+    return;
+  }
+
+  if (!(gl_sink->redisplay_shader =
+          gst_gl_shader_new_link_with_stages (gl_sink->context, &error,
+              vert_stage, frag_stage, NULL))) {
+    GST_ERROR_OBJECT (gl_sink, "Failed to link shader: %s", error->message);
+    gst_glimage_sink_cleanup_glthread (gl_sink);
+    return;
+  }
+
+  gl_sink->attr_position =
+      gst_gl_shader_get_attribute_location (gl_sink->redisplay_shader,
+      "a_position");
+  gl_sink->attr_texture =
+      gst_gl_shader_get_attribute_location (gl_sink->redisplay_shader,
+      "a_texcoord");
 
   if (gl->GenVertexArrays) {
     gl->GenVertexArrays (1, &gl_sink->vao);
@@ -1743,7 +1856,8 @@
     gl_sink->vbo_indices = 0;
   }
 
-  gst_gl_overlay_compositor_free_overlays (gl_sink->overlay_compositor);
+  if (gl_sink->overlay_compositor)
+    gst_gl_overlay_compositor_free_overlays (gl_sink->overlay_compositor);
 }
 
 /* Called with object lock held */
@@ -1783,6 +1897,9 @@
         gst_event_new_reconfigure ());
   }
 
+  gst_gl_insert_debug_marker (gl_sink->context, "%s window resize to %ix%i",
+      GST_OBJECT_NAME (gl_sink), width, height);
+
   /* default reshape */
   if (!do_reshape) {
     if (gl_sink->keep_aspect_ratio) {
@@ -1821,6 +1938,13 @@
   GST_GLIMAGE_SINK_UNLOCK (gl_sink);
 }
 
+static const gfloat identity_matrix[] = {
+  1.0f, 0.0f, 0.0, 0.0f,
+  0.0f, 1.0f, 0.0, 0.0f,
+  0.0f, 0.0f, 1.0, 0.0f,
+  0.0f, 0.0f, 0.0, 1.0f,
+};
+
 static void
 gst_glimage_sink_on_draw (GstGLImageSink * gl_sink)
 {
@@ -1833,8 +1957,8 @@
   const GstGLFuncs *gl = NULL;
   GstGLWindow *window = NULL;
   gboolean do_redisplay = FALSE;
-  GstGLSyncMeta *sync_meta = NULL;
   GstSample *sample = NULL;
+  guint gl_target = gst_gl_texture_target_to_gl (gl_sink->texture_target);
 
   g_return_if_fail (GST_IS_GLIMAGE_SINK (gl_sink));
 
@@ -1852,19 +1976,17 @@
   window->is_drawing = TRUE;
 
   /* opengl scene */
+  gst_gl_insert_debug_marker (gl_sink->context, "%s element drawing texture %u",
+      GST_OBJECT_NAME (gl_sink), gl_sink->redisplay_texture);
   GST_TRACE ("redrawing texture:%u", gl_sink->redisplay_texture);
 
-  sync_meta = gst_buffer_get_gl_sync_meta (gl_sink->stored_sync);
-  if (sync_meta)
-    gst_gl_sync_meta_wait (sync_meta, gst_gl_context_get_current ());
+  if (gl_sink->stored_sync_meta)
+    gst_gl_sync_meta_wait (gl_sink->stored_sync_meta,
+        gst_gl_context_get_current ());
 
   /* make sure that the environnement is clean */
   gst_gl_context_clear_shader (gl_sink->context);
-  gl->BindTexture (GL_TEXTURE_2D, 0);
-#if GST_GL_HAVE_OPENGL
-  if (USING_OPENGL (gl_sink->context))
-    gl->Disable (GL_TEXTURE_2D);
-#endif
+  gl->BindTexture (gl_target, 0);
 
   sample = gst_sample_new (gl_sink->stored_buffer[0],
       gl_sink->out_caps, &GST_BASE_SINK (gl_sink)->segment, NULL);
@@ -1901,11 +2023,25 @@
       _bind_buffer (gl_sink);
 
     gl->ActiveTexture (GL_TEXTURE0);
-    gl->BindTexture (GL_TEXTURE_2D, gl_sink->redisplay_texture);
+    gl->BindTexture (gl_target, gl_sink->redisplay_texture);
     gst_gl_shader_set_uniform_1i (gl_sink->redisplay_shader, "tex", 0);
+    if (gl_sink->texture_target == GST_GL_TEXTURE_TARGET_EXTERNAL_OES) {
+      GstVideoAffineTransformationMeta *af_meta;
+
+      af_meta =
+          gst_buffer_get_video_affine_transformation_meta
+          (gl_sink->stored_buffer[0]);
+      if (af_meta)
+        gst_gl_shader_set_uniform_matrix_4fv (gl_sink->redisplay_shader,
+            "u_transformation", 1, FALSE, af_meta->matrix);
+      else
+        gst_gl_shader_set_uniform_matrix_4fv (gl_sink->redisplay_shader,
+            "u_transformation", 1, FALSE, identity_matrix);
+    }
 
     gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
 
+    gl->BindTexture (gl_target, 0);
     gst_gl_context_clear_shader (gl_sink->context);
 
     if (gl->GenVertexArrays)
@@ -2004,7 +2140,11 @@
       gl_sink->stored_buffer[1] = NULL;
 
     old_sync = gl_sink->stored_sync;
-    gl_sink->stored_sync = gst_buffer_ref (gl_sink->next_sync);
+    if (gl_sink->next_sync)
+      gl_sink->stored_sync = gst_buffer_ref (gl_sink->next_sync);
+    else
+      gl_sink->stored_sync = NULL;
+    gl_sink->stored_sync_meta = gl_sink->next_sync_meta;
     GST_GLIMAGE_SINK_UNLOCK (gl_sink);
 
     gst_buffer_replace (old_stored_buffer, NULL);
diff --git a/ext/gl/gstglimagesink.h b/ext/gl/gstglimagesink.h
index f7b3bfb..8f9b2e6 100644
--- a/ext/gl/gstglimagesink.h
+++ b/ext/gl/gstglimagesink.h
@@ -64,10 +64,12 @@
 
     /* Input info before 3d stereo output conversion, if any */
     GstVideoInfo in_info;
+    GstCaps *in_caps;
 
     /* format/caps we actually hand off to the app */
     GstVideoInfo out_info;
     GstCaps *out_caps;
+    GstGLTextureTarget texture_target;
 
     GstGLDisplay *display;
     GstGLContext *context;
@@ -87,6 +89,7 @@
     GstBuffer *next_buffer;
     GstBuffer *next_buffer2; /* frame-by-frame 2nd view */
     GstBuffer *next_sync;
+    GstGLSyncMeta *next_sync_meta;
 
     volatile gint to_quit;
     gboolean keep_aspect_ratio;
@@ -96,6 +99,7 @@
     GMutex drawing_lock;
     GstBuffer *stored_buffer[2];
     GstBuffer *stored_sync;
+    GstGLSyncMeta *stored_sync_meta;
     GLuint redisplay_texture;
 
     gboolean caps_change;
diff --git a/ext/gl/gstglmixerbin.c b/ext/gl/gstglmixerbin.c
index c6488b5..6f83f82 100644
--- a/ext/gl/gstglmixerbin.c
+++ b/ext/gl/gstglmixerbin.c
@@ -458,7 +458,7 @@
     struct input_chain *chain = l->data;
     if (GST_PAD (chain->ghost_pad) == pad) {
       self->priv->input_chains =
-          g_list_remove_link (self->priv->input_chains, l);
+          g_list_delete_link (self->priv->input_chains, l);
       GST_OBJECT_UNLOCK (element);
 
       _free_input_chain (chain);
diff --git a/ext/gl/gstgloverlay.c b/ext/gl/gstgloverlay.c
index ca07f8b..fa6c6c1 100644
--- a/ext/gl/gstgloverlay.c
+++ b/ext/gl/gstgloverlay.c
@@ -277,8 +277,7 @@
 
   switch (prop_id) {
     case PROP_LOCATION:
-      if (overlay->location != NULL)
-        g_free (overlay->location);
+      g_free (overlay->location);
       overlay->location_has_changed = TRUE;
       overlay->location = g_value_dup_string (value);
       break;
@@ -669,6 +668,8 @@
 static gboolean
 gst_gl_overlay_load_jpeg (GstGLOverlay * overlay, FILE * fp)
 {
+  GstGLBaseMemoryAllocator *mem_allocator;
+  GstGLVideoAllocationParams *params;
   GstVideoInfo v_info;
   GstVideoAlignment v_align;
   GstMapInfo map_info;
@@ -696,9 +697,17 @@
   v_align.stride_align[0] = 32 - 1;
   gst_video_info_align (&v_info, &v_align);
 
+  mem_allocator =
+      GST_GL_BASE_MEMORY_ALLOCATOR (gst_gl_memory_allocator_get_default
+      (GST_GL_BASE_FILTER (overlay)->context));
+  params =
+      gst_gl_video_allocation_params_new (GST_GL_BASE_FILTER (overlay)->context,
+      NULL, &v_info, 0, &v_align, GST_GL_TEXTURE_TARGET_2D);
   overlay->image_memory = (GstGLMemory *)
-      gst_gl_memory_alloc (GST_GL_BASE_FILTER (overlay)->context,
-      NULL, &v_info, 0, &v_align);
+      gst_gl_base_memory_alloc (mem_allocator,
+      (GstGLAllocationParams *) params);
+  gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
+  gst_object_unref (mem_allocator);
 
   if (!gst_memory_map ((GstMemory *) overlay->image_memory, &map_info,
           GST_MAP_WRITE)) {
@@ -721,6 +730,8 @@
 static gboolean
 gst_gl_overlay_load_png (GstGLOverlay * overlay, FILE * fp)
 {
+  GstGLBaseMemoryAllocator *mem_allocator;
+  GstGLVideoAllocationParams *params;
   GstVideoInfo v_info;
   GstMapInfo map_info;
 
@@ -801,9 +812,17 @@
   overlay->image_height = height;
 
   gst_video_info_set_format (&v_info, GST_VIDEO_FORMAT_RGBA, width, height);
+  mem_allocator =
+      GST_GL_BASE_MEMORY_ALLOCATOR (gst_gl_memory_allocator_get_default
+      (GST_GL_BASE_FILTER (overlay)->context));
+  params =
+      gst_gl_video_allocation_params_new (GST_GL_BASE_FILTER (overlay)->context,
+      NULL, &v_info, 0, NULL, GST_GL_TEXTURE_TARGET_2D);
   overlay->image_memory = (GstGLMemory *)
-      gst_gl_memory_alloc (GST_GL_BASE_FILTER (overlay)->context,
-      NULL, &v_info, 0, NULL);
+      gst_gl_base_memory_alloc (mem_allocator,
+      (GstGLAllocationParams *) params);
+  gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
+  gst_object_unref (mem_allocator);
 
   if (!gst_memory_map ((GstMemory *) overlay->image_memory, &map_info,
           GST_MAP_WRITE)) {
diff --git a/ext/gl/gstglstereomix.c b/ext/gl/gstglstereomix.c
index b880d06..c342a23 100644
--- a/ext/gl/gstglstereomix.c
+++ b/ext/gl/gstglstereomix.c
@@ -58,9 +58,13 @@
 static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
     GST_PAD_SRC,
     GST_PAD_ALWAYS,
-    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
-        (GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
-            "RGBA") "; "
+    GST_STATIC_CAPS ("video/x-raw(" GST_CAPS_FEATURE_MEMORY_GL_MEMORY "), "
+        "format = (string) RGBA, "
+        "width = " GST_VIDEO_SIZE_RANGE ", "
+        "height = " GST_VIDEO_SIZE_RANGE ", "
+        "framerate = " GST_VIDEO_FPS_RANGE ","
+        "texture-target = (string) 2D"
+        "; "
         GST_VIDEO_CAPS_MAKE_WITH_FEATURES
         (GST_CAPS_FEATURE_META_GST_VIDEO_GL_TEXTURE_UPLOAD_META,
             "RGBA")
@@ -70,9 +74,13 @@
 static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink_%u",
     GST_PAD_SINK,
     GST_PAD_REQUEST,
-    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
-        (GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
-            "RGBA") "; "
+    GST_STATIC_CAPS ("video/x-raw(" GST_CAPS_FEATURE_MEMORY_GL_MEMORY "), "
+        "format = (string) RGBA, "
+        "width = " GST_VIDEO_SIZE_RANGE ", "
+        "height = " GST_VIDEO_SIZE_RANGE ", "
+        "framerate = " GST_VIDEO_FPS_RANGE ","
+        "texture-target = (string) 2D"
+        "; "
         GST_VIDEO_CAPS_MAKE_WITH_FEATURES
         (GST_CAPS_FEATURE_META_GST_VIDEO_GL_TEXTURE_UPLOAD_META,
             "RGBA")
@@ -475,6 +483,7 @@
 _negotiated_caps (GstVideoAggregator * vagg, GstCaps * caps)
 {
   GstGLStereoMix *mix = GST_GL_STEREO_MIX (vagg);
+  GstCaps *in_caps;
 
   GST_LOG_OBJECT (mix, "Configured output caps %" GST_PTR_FORMAT, caps);
 
@@ -490,11 +499,16 @@
   /* We can configure the view_converter now */
   gst_gl_view_convert_set_context (mix->viewconvert,
       GST_GL_BASE_MIXER (mix)->context);
-  gst_gl_view_convert_set_format (mix->viewconvert, &mix->mix_info,
-      &mix->out_info);
+
+  in_caps = gst_video_info_to_caps (&mix->mix_info);
+  gst_caps_set_features (in_caps, 0,
+      gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_GL_MEMORY));
+  gst_caps_set_simple (in_caps, "texture-target", G_TYPE_STRING,
+      GST_GL_TEXTURE_TARGET_2D_STR, NULL);
+
+  gst_gl_view_convert_set_caps (mix->viewconvert, in_caps, caps);
 
   return TRUE;
-
 }
 
 static gboolean
diff --git a/ext/gl/gstglstereomix.h b/ext/gl/gstglstereomix.h
index debe347..0c06d42 100644
--- a/ext/gl/gstglstereomix.h
+++ b/ext/gl/gstglstereomix.h
@@ -50,7 +50,6 @@
   GPtrArray *frames;
 
   GLuint out_tex_id;
-  GstGLDownload *download;
 
   GstGLViewConvert *viewconvert;
   GstGLStereoDownmix downmix_mode;
diff --git a/ext/gl/gstglstereosplit.c b/ext/gl/gstglstereosplit.c
index e175df8..456d9f0 100644
--- a/ext/gl/gstglstereosplit.c
+++ b/ext/gl/gstglstereosplit.c
@@ -26,7 +26,7 @@
  * <refsect2>
  * <title>Examples</title>
  * |[
- * gst-launch videotestsrc ! glstereosplit name=s ! queue ! glimagesink s. ! queue ! glimagesink
+ * gst-launch-1.0 videotestsrc ! glstereosplit name=s ! queue ! glimagesink s. ! queue ! glimagesink
  * ]|
  * FBO (Frame Buffer Object) and GLSL (OpenGL Shading Language) are required.
  * </refsect2>
@@ -210,6 +210,9 @@
 
   if (stereosplit->display)
     gst_gl_display_filter_gl_api (stereosplit->display, SUPPORTED_GL_APIS);
+
+  GST_ELEMENT_CLASS (gst_gl_stereosplit_parent_class)->set_context (element,
+      context);
 }
 
 static GstStateChangeReturn
diff --git a/ext/gl/gstgltestsrc.c b/ext/gl/gstgltestsrc.c
index 93ddfda..bcf8fb9 100644
--- a/ext/gl/gstgltestsrc.c
+++ b/ext/gl/gstgltestsrc.c
@@ -33,7 +33,7 @@
  * <title>Example launch line</title>
  * <para>
  * <programlisting>
- * gst-launch -v gltestsrc pattern=smpte ! glimagesink
+ * gst-launch-1.0 -v gltestsrc pattern=smpte ! glimagesink
  * </programlisting>
  * Shows original SMPTE color bars in a window.
  * </para>
@@ -63,13 +63,18 @@
       /* FILL ME */
 };
 
+/* *INDENT-OFF* */
 static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
     GST_PAD_SRC,
     GST_PAD_ALWAYS,
-    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
-        (GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
-            "RGBA"))
+    GST_STATIC_CAPS ("video/x-raw(" GST_CAPS_FEATURE_MEMORY_GL_MEMORY "), "
+        "format = (string) RGBA, "
+        "width = " GST_VIDEO_SIZE_RANGE ", "
+        "height = " GST_VIDEO_SIZE_RANGE ", "
+        "framerate = " GST_VIDEO_FPS_RANGE ","
+        "texture-target = (string) 2D")
     );
+/* *INDENT-ON* */
 
 #define gst_gl_test_src_parent_class parent_class
 G_DEFINE_TYPE (GstGLTestSrc, gst_gl_test_src, GST_TYPE_PUSH_SRC);
@@ -459,6 +464,8 @@
 
   if (src->display)
     gst_gl_display_filter_gl_api (src->display, SUPPORTED_GL_APIS);
+
+  GST_ELEMENT_CLASS (parent_class)->set_context (element, context);
 }
 
 static gboolean
diff --git a/ext/gl/gstgltransformation.c b/ext/gl/gstgltransformation.c
index 5a82ade..7d1472f 100644
--- a/ext/gl/gstgltransformation.c
+++ b/ext/gl/gstgltransformation.c
@@ -26,16 +26,16 @@
  * <refsect2>
  * <title>Examples</title>
  * |[
- * gst-launch gltestsrc ! gltransformation rotation-z=45 ! glimagesink
+ * gst-launch-1.0 gltestsrc ! gltransformation rotation-z=45 ! glimagesink
  * ]| A pipeline to rotate by 45 degrees
  * |[
- * gst-launch gltestsrc ! gltransformation translation-x=0.5 ! glimagesink
+ * gst-launch-1.0 gltestsrc ! gltransformation translation-x=0.5 ! glimagesink
  * ]| Translate the video by 0.5
  * |[
- * gst-launch gltestsrc ! gltransformation scale-y=0.5 scale-x=0.5 ! glimagesink
+ * gst-launch-1.0 gltestsrc ! gltransformation scale-y=0.5 scale-x=0.5 ! glimagesink
  * ]| Resize the video by 0.5
  * |[
- * gst-launch gltestsrc ! gltransformation rotation-x=-45 ortho=True ! glimagesink
+ * gst-launch-1.0 gltestsrc ! gltransformation rotation-x=-45 ortho=True ! glimagesink
  * ]| Rotate the video around the X-Axis by -45° with an orthographic projection
  * </refsect2>
  */
diff --git a/ext/gl/gstgluploadelement.c b/ext/gl/gstgluploadelement.c
index 83ff24c..86e8b01 100644
--- a/ext/gl/gstgluploadelement.c
+++ b/ext/gl/gstgluploadelement.c
@@ -220,8 +220,6 @@
     return GST_FLOW_NOT_NEGOTIATED;
 
   ret = gst_gl_upload_perform_with_buffer (upload->upload, buffer, outbuf);
-  /* FIXME Having to release after perform is an aberation */
-  gst_gl_upload_release_buffer (upload->upload);
 
   if (ret != GST_GL_UPLOAD_DONE || *outbuf == NULL) {
     GST_ELEMENT_ERROR (bt, RESOURCE, NOT_FOUND, ("%s",
diff --git a/ext/gl/gstopengl.c b/ext/gl/gstopengl.c
index 1fad0a2..5f2a1ac 100644
--- a/ext/gl/gstopengl.c
+++ b/ext/gl/gstopengl.c
@@ -60,6 +60,7 @@
 #include "gstglfilterapp.h"
 #include "gstglstereosplit.h"
 #include "gstglstereomix.h"
+#include "gstglviewconvert.h"
 
 #if HAVE_GRAPHENE
 #include "gstgltransformation.h"
@@ -75,7 +76,6 @@
 #include "gstglfilterglass.h"
 /* #include "gstglfilterreflectedscreen.h" */
 #include "gstgldeinterlace.h"
-#include "gstglviewconvert.h"
 #include "gstglmosaic.h"
 #if HAVE_PNG
 #include "gstgldifferencematte.h"
@@ -199,6 +199,21 @@
           GST_RANK_NONE, GST_TYPE_GL_FILTER_APP)) {
     return FALSE;
   }
+
+  if (!gst_element_register (plugin, "glviewconvert",
+          GST_RANK_NONE, GST_TYPE_GL_VIEW_CONVERT_ELEMENT)) {
+    return FALSE;
+  }
+
+  if (!gst_element_register (plugin, "glstereosplit",
+          GST_RANK_NONE, GST_TYPE_GL_STEREOSPLIT)) {
+    return FALSE;
+  }
+
+  if (!gst_element_register (plugin, "glstereomix",
+          GST_RANK_NONE, GST_TYPE_GL_STEREO_MIX)) {
+    return FALSE;
+  }
 #if HAVE_JPEG
 #if HAVE_PNG
   if (!gst_element_register (plugin, "gloverlay",
@@ -228,11 +243,6 @@
     return FALSE;
   }
 
-  if (!gst_element_register (plugin, "glviewconvert",
-          GST_RANK_NONE, GST_TYPE_GL_VIEW_CONVERT_ELEMENT)) {
-    return FALSE;
-  }
-
   if (!gst_element_register (plugin, "glmosaic",
           GST_RANK_NONE, GST_TYPE_GL_MOSAIC)) {
     return FALSE;
@@ -249,14 +259,6 @@
   }
 #endif
 #endif /* HAVE_PNG */
-  if (!gst_element_register (plugin, "glstereosplit",
-          GST_RANK_NONE, GST_TYPE_GL_STEREOSPLIT)) {
-    return FALSE;
-  }
-  if (!gst_element_register (plugin, "glstereomix",
-          GST_RANK_NONE, GST_TYPE_GL_STEREO_MIX)) {
-    return FALSE;
-  }
 #endif /* GST_GL_HAVE_OPENGL */
 #if GST_GL_HAVE_WINDOW_COCOA
   if (!gst_element_register (plugin, "caopengllayersink",
diff --git a/ext/gme/Makefile.in b/ext/gme/Makefile.in
index 9ab8ce6..43c0bf8 100644
--- a/ext/gme/Makefile.in
+++ b/ext/gme/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/gsettings/Makefile.in b/ext/gsettings/Makefile.in
index 4560b18..ad1741a 100644
--- a/ext/gsettings/Makefile.in
+++ b/ext/gsettings/Makefile.in
@@ -286,6 +286,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -323,6 +325,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -350,6 +354,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -368,6 +374,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -378,6 +386,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -403,6 +413,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -428,6 +440,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -559,6 +573,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -616,8 +632,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -687,6 +707,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/gsm/Makefile.in b/ext/gsm/Makefile.in
index 42c750b..a9f029e 100644
--- a/ext/gsm/Makefile.in
+++ b/ext/gsm/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/gtk/Makefile.in b/ext/gtk/Makefile.in
index 43ceb56..427fe0c 100644
--- a/ext/gtk/Makefile.in
+++ b/ext/gtk/Makefile.in
@@ -288,6 +288,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -325,6 +327,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -352,6 +356,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -370,6 +376,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -380,6 +388,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -405,6 +415,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -430,6 +442,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -561,6 +575,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -618,8 +634,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -689,6 +709,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/gtk/gtkgstglwidget.c b/ext/gtk/gtkgstglwidget.c
index 7b3f37f..c4d53a2 100644
--- a/ext/gtk/gtkgstglwidget.c
+++ b/ext/gtk/gtkgstglwidget.c
@@ -52,8 +52,7 @@
 
 G_DEFINE_TYPE_WITH_CODE (GtkGstGLWidget, gtk_gst_gl_widget, GTK_TYPE_GL_AREA,
     GST_DEBUG_CATEGORY_INIT (GST_CAT_DEFAULT, "gtkgstglwidget", 0,
-        "Gtk Gst GL Widget");
-    );
+        "Gtk Gst GL Widget"););
 
 #define GTK_GST_GL_WIDGET_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
     GTK_TYPE_GST_GL_WIDGET, GtkGstGLWidgetPrivate))
@@ -119,11 +118,18 @@
 {
   GtkGstGLWidgetPrivate *priv = gst_widget->priv;
   const GstGLFuncs *gl = priv->context->gl_vtable;
+  GError *error = NULL;
 
-  priv->shader = gst_gl_shader_new (priv->context);
+  gst_gl_insert_debug_marker (priv->other_context, "initializing redisplay");
+  if (!(priv->shader = gst_gl_shader_new_default (priv->context, &error))) {
+    GST_ERROR ("Failed to initialize shader: %s", error->message);
+    return;
+  }
 
-  gst_gl_shader_compile_with_default_vf_and_check (priv->shader,
-      &priv->attr_position, &priv->attr_texture);
+  priv->attr_position =
+      gst_gl_shader_get_attribute_location (priv->shader, "a_position");
+  priv->attr_texture =
+      gst_gl_shader_get_attribute_location (priv->shader, "a_texcoord");
 
   if (gl->GenVertexArrays) {
     gl->GenVertexArrays (1, &priv->vao);
@@ -207,6 +213,7 @@
 {
   const GstGLFuncs *gl = context->gl_vtable;
 
+  gst_gl_insert_debug_marker (context, "no buffer.  rendering black");
   gl->ClearColor (0.0, 0.0, 0.0, 0.0);
   gl->Clear (GL_COLOR_BUFFER_BIT);
 }
@@ -244,6 +251,10 @@
       goto done;
     }
 
+    priv->current_tex = *(guint *) gl_frame.data[0];
+    gst_gl_insert_debug_marker (priv->other_context, "redrawing texture %u",
+        priv->current_tex);
+
     gst_gl_overlay_compositor_upload_overlays (priv->overlay_compositor,
         buffer);
 
@@ -253,8 +264,6 @@
       gst_gl_sync_meta_wait (sync_meta, priv->other_context);
     }
 
-    priv->current_tex = *(guint *) gl_frame.data[0];
-
     gst_video_frame_unmap (&gl_frame);
 
     if (base_widget->buffer)
@@ -271,6 +280,9 @@
   _redraw_texture (GTK_GST_GL_WIDGET (widget), priv->current_tex);
   gst_gl_overlay_compositor_draw_overlays (priv->overlay_compositor);
 
+  gst_gl_insert_debug_marker (priv->other_context, "texture %u redrawn",
+      priv->current_tex);
+
 done:
   if (priv->other_context)
     gst_gl_context_activate (priv->other_context, FALSE);
@@ -493,7 +505,7 @@
     GTK_GST_BASE_WIDGET_LOCK (gst_widget);
   }
 
-  if (!GST_GL_IS_CONTEXT (priv->other_context)) {
+  if (!GST_IS_GL_CONTEXT (priv->other_context)) {
     GTK_GST_BASE_WIDGET_UNLOCK (gst_widget);
     return FALSE;
   }
diff --git a/ext/hls/Makefile.am b/ext/hls/Makefile.am
index f66880f..f163202 100644
--- a/ext/hls/Makefile.am
+++ b/ext/hls/Makefile.am
@@ -1,25 +1,25 @@
 
-plugin_LTLIBRARIES = libgstfragmented.la
+plugin_LTLIBRARIES = libgsthls.la
 
-libgstfragmented_la_SOURCES =			\
+libgsthls_la_SOURCES =			\
 	m3u8.c					\
 	gsthlsdemux.c				\
-	gstfragmentedplugin.c 			\
+	gsthlsplugin.c 			\
 	gsthlssink.c 				\
 	gstm3u8playlist.c
 
-libgstfragmented_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GIO_CFLAGS) $(LIBGCRYPT_CFLAGS) $(NETTLE_CFLAGS)
-libgstfragmented_la_LIBADD = \
+libgsthls_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(LIBGCRYPT_CFLAGS) $(NETTLE_CFLAGS)
+libgsthls_la_LIBADD = \
 	$(top_builddir)/gst-libs/gst/uridownloader/libgsturidownloader-@GST_API_VERSION@.la \
         $(top_builddir)/gst-libs/gst/adaptivedemux/libgstadaptivedemux-@GST_API_VERSION@.la \
 	$(GST_PLUGINS_BASE_LIBS) -lgstpbutils-$(GST_API_VERSION) -lgstvideo-$(GST_API_VERSION) \
-	$(GST_BASE_LIBS) $(GST_LIBS) $(GIO_LIBS) $(LIBM) $(LIBGCRYPT_LIBS) $(NETTLE_LIBS) $(OPENSSL_LIBS)
-libgstfragmented_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -no-undefined
-libgstfragmented_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
+	$(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) $(LIBGCRYPT_LIBS) $(NETTLE_LIBS) $(OPENSSL_LIBS)
+libgsthls_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -no-undefined
+libgsthls_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
 
 # headers we need but don't want installed
 noinst_HEADERS = 			\
-	gstfragmented.h			\
+	gsthls.h			\
 	gsthlsdemux.h			\
 	gsthlssink.h			\
 	gstm3u8playlist.h		\
diff --git a/ext/hls/Makefile.in b/ext/hls/Makefile.in
index a328db9..8e803f6 100644
--- a/ext/hls/Makefile.in
+++ b/ext/hls/Makefile.in
@@ -164,26 +164,24 @@
 am__installdirs = "$(DESTDIR)$(plugindir)"
 LTLIBRARIES = $(plugin_LTLIBRARIES)
 am__DEPENDENCIES_1 =
-libgstfragmented_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/uridownloader/libgsturidownloader-@GST_API_VERSION@.la \
+libgsthls_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/uridownloader/libgsturidownloader-@GST_API_VERSION@.la \
 	$(top_builddir)/gst-libs/gst/adaptivedemux/libgstadaptivedemux-@GST_API_VERSION@.la \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_libgstfragmented_la_OBJECTS = libgstfragmented_la-m3u8.lo \
-	libgstfragmented_la-gsthlsdemux.lo \
-	libgstfragmented_la-gstfragmentedplugin.lo \
-	libgstfragmented_la-gsthlssink.lo \
-	libgstfragmented_la-gstm3u8playlist.lo
-libgstfragmented_la_OBJECTS = $(am_libgstfragmented_la_OBJECTS)
+	$(am__DEPENDENCIES_1)
+am_libgsthls_la_OBJECTS = libgsthls_la-m3u8.lo \
+	libgsthls_la-gsthlsdemux.lo libgsthls_la-gsthlsplugin.lo \
+	libgsthls_la-gsthlssink.lo libgsthls_la-gstm3u8playlist.lo
+libgsthls_la_OBJECTS = $(am_libgsthls_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
-libgstfragmented_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
-	$(libgstfragmented_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
-	--mode=link $(CCLD) $(libgstfragmented_la_CFLAGS) $(CFLAGS) \
-	$(libgstfragmented_la_LDFLAGS) $(LDFLAGS) -o $@
+libgsthls_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(libgsthls_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+	$(CCLD) $(libgsthls_la_CFLAGS) $(CFLAGS) \
+	$(libgsthls_la_LDFLAGS) $(LDFLAGS) -o $@
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -218,8 +216,8 @@
 am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = $(libgstfragmented_la_SOURCES)
-DIST_SOURCES = $(libgstfragmented_la_SOURCES)
+SOURCES = $(libgsthls_la_SOURCES)
+DIST_SOURCES = $(libgsthls_la_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -282,6 +280,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -319,6 +319,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -346,6 +348,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -364,6 +368,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -374,6 +380,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -399,6 +407,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -424,6 +434,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -555,6 +567,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -612,8 +626,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -683,6 +701,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -769,27 +788,27 @@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 wayland_scanner = @wayland_scanner@
-plugin_LTLIBRARIES = libgstfragmented.la
-libgstfragmented_la_SOURCES = \
+plugin_LTLIBRARIES = libgsthls.la
+libgsthls_la_SOURCES = \
 	m3u8.c					\
 	gsthlsdemux.c				\
-	gstfragmentedplugin.c 			\
+	gsthlsplugin.c 			\
 	gsthlssink.c 				\
 	gstm3u8playlist.c
 
-libgstfragmented_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(GIO_CFLAGS) $(LIBGCRYPT_CFLAGS) $(NETTLE_CFLAGS)
-libgstfragmented_la_LIBADD = \
+libgsthls_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(LIBGCRYPT_CFLAGS) $(NETTLE_CFLAGS)
+libgsthls_la_LIBADD = \
 	$(top_builddir)/gst-libs/gst/uridownloader/libgsturidownloader-@GST_API_VERSION@.la \
         $(top_builddir)/gst-libs/gst/adaptivedemux/libgstadaptivedemux-@GST_API_VERSION@.la \
 	$(GST_PLUGINS_BASE_LIBS) -lgstpbutils-$(GST_API_VERSION) -lgstvideo-$(GST_API_VERSION) \
-	$(GST_BASE_LIBS) $(GST_LIBS) $(GIO_LIBS) $(LIBM) $(LIBGCRYPT_LIBS) $(NETTLE_LIBS) $(OPENSSL_LIBS)
+	$(GST_BASE_LIBS) $(GST_LIBS) $(LIBM) $(LIBGCRYPT_LIBS) $(NETTLE_LIBS) $(OPENSSL_LIBS)
 
-libgstfragmented_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -no-undefined
-libgstfragmented_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
+libgsthls_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS) -no-undefined
+libgsthls_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
 
 # headers we need but don't want installed
 noinst_HEADERS = \
-	gstfragmented.h			\
+	gsthls.h			\
 	gsthlsdemux.h			\
 	gsthlssink.h			\
 	gstm3u8playlist.h		\
@@ -864,8 +883,8 @@
 	  rm -f $${locs}; \
 	}
 
-libgstfragmented.la: $(libgstfragmented_la_OBJECTS) $(libgstfragmented_la_DEPENDENCIES) $(EXTRA_libgstfragmented_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(libgstfragmented_la_LINK) -rpath $(plugindir) $(libgstfragmented_la_OBJECTS) $(libgstfragmented_la_LIBADD) $(LIBS)
+libgsthls.la: $(libgsthls_la_OBJECTS) $(libgsthls_la_DEPENDENCIES) $(EXTRA_libgsthls_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(libgsthls_la_LINK) -rpath $(plugindir) $(libgsthls_la_OBJECTS) $(libgsthls_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -873,11 +892,11 @@
 distclean-compile:
 	-rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfragmented_la-gstfragmentedplugin.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfragmented_la-gsthlsdemux.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfragmented_la-gsthlssink.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfragmented_la-gstm3u8playlist.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstfragmented_la-m3u8.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsthls_la-gsthlsdemux.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsthls_la-gsthlsplugin.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsthls_la-gsthlssink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsthls_la-gstm3u8playlist.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgsthls_la-m3u8.Plo@am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@@ -903,40 +922,40 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
-libgstfragmented_la-m3u8.lo: m3u8.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstfragmented_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfragmented_la_CFLAGS) $(CFLAGS) -MT libgstfragmented_la-m3u8.lo -MD -MP -MF $(DEPDIR)/libgstfragmented_la-m3u8.Tpo -c -o libgstfragmented_la-m3u8.lo `test -f 'm3u8.c' || echo '$(srcdir)/'`m3u8.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstfragmented_la-m3u8.Tpo $(DEPDIR)/libgstfragmented_la-m3u8.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='m3u8.c' object='libgstfragmented_la-m3u8.lo' libtool=yes @AMDEPBACKSLASH@
+libgsthls_la-m3u8.lo: m3u8.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthls_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthls_la_CFLAGS) $(CFLAGS) -MT libgsthls_la-m3u8.lo -MD -MP -MF $(DEPDIR)/libgsthls_la-m3u8.Tpo -c -o libgsthls_la-m3u8.lo `test -f 'm3u8.c' || echo '$(srcdir)/'`m3u8.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgsthls_la-m3u8.Tpo $(DEPDIR)/libgsthls_la-m3u8.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='m3u8.c' object='libgsthls_la-m3u8.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstfragmented_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfragmented_la_CFLAGS) $(CFLAGS) -c -o libgstfragmented_la-m3u8.lo `test -f 'm3u8.c' || echo '$(srcdir)/'`m3u8.c
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthls_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthls_la_CFLAGS) $(CFLAGS) -c -o libgsthls_la-m3u8.lo `test -f 'm3u8.c' || echo '$(srcdir)/'`m3u8.c
 
-libgstfragmented_la-gsthlsdemux.lo: gsthlsdemux.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstfragmented_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfragmented_la_CFLAGS) $(CFLAGS) -MT libgstfragmented_la-gsthlsdemux.lo -MD -MP -MF $(DEPDIR)/libgstfragmented_la-gsthlsdemux.Tpo -c -o libgstfragmented_la-gsthlsdemux.lo `test -f 'gsthlsdemux.c' || echo '$(srcdir)/'`gsthlsdemux.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstfragmented_la-gsthlsdemux.Tpo $(DEPDIR)/libgstfragmented_la-gsthlsdemux.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gsthlsdemux.c' object='libgstfragmented_la-gsthlsdemux.lo' libtool=yes @AMDEPBACKSLASH@
+libgsthls_la-gsthlsdemux.lo: gsthlsdemux.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthls_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthls_la_CFLAGS) $(CFLAGS) -MT libgsthls_la-gsthlsdemux.lo -MD -MP -MF $(DEPDIR)/libgsthls_la-gsthlsdemux.Tpo -c -o libgsthls_la-gsthlsdemux.lo `test -f 'gsthlsdemux.c' || echo '$(srcdir)/'`gsthlsdemux.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgsthls_la-gsthlsdemux.Tpo $(DEPDIR)/libgsthls_la-gsthlsdemux.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gsthlsdemux.c' object='libgsthls_la-gsthlsdemux.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstfragmented_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfragmented_la_CFLAGS) $(CFLAGS) -c -o libgstfragmented_la-gsthlsdemux.lo `test -f 'gsthlsdemux.c' || echo '$(srcdir)/'`gsthlsdemux.c
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthls_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthls_la_CFLAGS) $(CFLAGS) -c -o libgsthls_la-gsthlsdemux.lo `test -f 'gsthlsdemux.c' || echo '$(srcdir)/'`gsthlsdemux.c
 
-libgstfragmented_la-gstfragmentedplugin.lo: gstfragmentedplugin.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstfragmented_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfragmented_la_CFLAGS) $(CFLAGS) -MT libgstfragmented_la-gstfragmentedplugin.lo -MD -MP -MF $(DEPDIR)/libgstfragmented_la-gstfragmentedplugin.Tpo -c -o libgstfragmented_la-gstfragmentedplugin.lo `test -f 'gstfragmentedplugin.c' || echo '$(srcdir)/'`gstfragmentedplugin.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstfragmented_la-gstfragmentedplugin.Tpo $(DEPDIR)/libgstfragmented_la-gstfragmentedplugin.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstfragmentedplugin.c' object='libgstfragmented_la-gstfragmentedplugin.lo' libtool=yes @AMDEPBACKSLASH@
+libgsthls_la-gsthlsplugin.lo: gsthlsplugin.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthls_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthls_la_CFLAGS) $(CFLAGS) -MT libgsthls_la-gsthlsplugin.lo -MD -MP -MF $(DEPDIR)/libgsthls_la-gsthlsplugin.Tpo -c -o libgsthls_la-gsthlsplugin.lo `test -f 'gsthlsplugin.c' || echo '$(srcdir)/'`gsthlsplugin.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgsthls_la-gsthlsplugin.Tpo $(DEPDIR)/libgsthls_la-gsthlsplugin.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gsthlsplugin.c' object='libgsthls_la-gsthlsplugin.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstfragmented_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfragmented_la_CFLAGS) $(CFLAGS) -c -o libgstfragmented_la-gstfragmentedplugin.lo `test -f 'gstfragmentedplugin.c' || echo '$(srcdir)/'`gstfragmentedplugin.c
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthls_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthls_la_CFLAGS) $(CFLAGS) -c -o libgsthls_la-gsthlsplugin.lo `test -f 'gsthlsplugin.c' || echo '$(srcdir)/'`gsthlsplugin.c
 
-libgstfragmented_la-gsthlssink.lo: gsthlssink.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstfragmented_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfragmented_la_CFLAGS) $(CFLAGS) -MT libgstfragmented_la-gsthlssink.lo -MD -MP -MF $(DEPDIR)/libgstfragmented_la-gsthlssink.Tpo -c -o libgstfragmented_la-gsthlssink.lo `test -f 'gsthlssink.c' || echo '$(srcdir)/'`gsthlssink.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstfragmented_la-gsthlssink.Tpo $(DEPDIR)/libgstfragmented_la-gsthlssink.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gsthlssink.c' object='libgstfragmented_la-gsthlssink.lo' libtool=yes @AMDEPBACKSLASH@
+libgsthls_la-gsthlssink.lo: gsthlssink.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthls_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthls_la_CFLAGS) $(CFLAGS) -MT libgsthls_la-gsthlssink.lo -MD -MP -MF $(DEPDIR)/libgsthls_la-gsthlssink.Tpo -c -o libgsthls_la-gsthlssink.lo `test -f 'gsthlssink.c' || echo '$(srcdir)/'`gsthlssink.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgsthls_la-gsthlssink.Tpo $(DEPDIR)/libgsthls_la-gsthlssink.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gsthlssink.c' object='libgsthls_la-gsthlssink.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstfragmented_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfragmented_la_CFLAGS) $(CFLAGS) -c -o libgstfragmented_la-gsthlssink.lo `test -f 'gsthlssink.c' || echo '$(srcdir)/'`gsthlssink.c
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthls_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthls_la_CFLAGS) $(CFLAGS) -c -o libgsthls_la-gsthlssink.lo `test -f 'gsthlssink.c' || echo '$(srcdir)/'`gsthlssink.c
 
-libgstfragmented_la-gstm3u8playlist.lo: gstm3u8playlist.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstfragmented_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfragmented_la_CFLAGS) $(CFLAGS) -MT libgstfragmented_la-gstm3u8playlist.lo -MD -MP -MF $(DEPDIR)/libgstfragmented_la-gstm3u8playlist.Tpo -c -o libgstfragmented_la-gstm3u8playlist.lo `test -f 'gstm3u8playlist.c' || echo '$(srcdir)/'`gstm3u8playlist.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstfragmented_la-gstm3u8playlist.Tpo $(DEPDIR)/libgstfragmented_la-gstm3u8playlist.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstm3u8playlist.c' object='libgstfragmented_la-gstm3u8playlist.lo' libtool=yes @AMDEPBACKSLASH@
+libgsthls_la-gstm3u8playlist.lo: gstm3u8playlist.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthls_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthls_la_CFLAGS) $(CFLAGS) -MT libgsthls_la-gstm3u8playlist.lo -MD -MP -MF $(DEPDIR)/libgsthls_la-gstm3u8playlist.Tpo -c -o libgsthls_la-gstm3u8playlist.lo `test -f 'gstm3u8playlist.c' || echo '$(srcdir)/'`gstm3u8playlist.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgsthls_la-gstm3u8playlist.Tpo $(DEPDIR)/libgsthls_la-gstm3u8playlist.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstm3u8playlist.c' object='libgsthls_la-gstm3u8playlist.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstfragmented_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstfragmented_la_CFLAGS) $(CFLAGS) -c -o libgstfragmented_la-gstm3u8playlist.lo `test -f 'gstm3u8playlist.c' || echo '$(srcdir)/'`gstm3u8playlist.c
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgsthls_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgsthls_la_CFLAGS) $(CFLAGS) -c -o libgsthls_la-gstm3u8playlist.lo `test -f 'gstm3u8playlist.c' || echo '$(srcdir)/'`gstm3u8playlist.c
 
 mostlyclean-libtool:
 	-rm -f *.lo
diff --git a/ext/hls/gstfragmented.h b/ext/hls/gstfragmented.h
deleted file mode 100644
index c1c7a2b..0000000
--- a/ext/hls/gstfragmented.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#ifndef __GST_FRAGMENTED_H__
-#define __GST_FRAGMENTED_H__
-
-#include <gst/gst.h>
-
-G_BEGIN_DECLS
-
-GST_DEBUG_CATEGORY_EXTERN (fragmented_debug);
-
-#define LOG_CAPS(obj, caps) GST_DEBUG_OBJECT (obj, "%s: %" GST_PTR_FORMAT, #caps, caps)
-
-G_END_DECLS
-
-#endif /* __GST_FRAGMENTED_H__ */
diff --git a/ext/hls/gstfragmentedplugin.c b/ext/hls/gstfragmentedplugin.c
deleted file mode 100644
index 89a7741..0000000
--- a/ext/hls/gstfragmentedplugin.c
+++ /dev/null
@@ -1,32 +0,0 @@
-#ifdef HAVE_CONFIG_H
-#  include <config.h>
-#endif
-
-#include <gst/gst.h>
-
-#include "gstfragmented.h"
-#include "gsthlsdemux.h"
-#include "gsthlssink.h"
-
-GST_DEBUG_CATEGORY (fragmented_debug);
-
-static gboolean
-fragmented_init (GstPlugin * plugin)
-{
-  GST_DEBUG_CATEGORY_INIT (fragmented_debug, "fragmented", 0, "fragmented");
-
-  if (!gst_element_register (plugin, "hlsdemux", GST_RANK_PRIMARY,
-          GST_TYPE_HLS_DEMUX) || FALSE)
-    return FALSE;
-
-  if (!gst_hls_sink_plugin_init (plugin))
-    return FALSE;
-
-  return TRUE;
-}
-
-GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
-    GST_VERSION_MINOR,
-    fragmented,
-    "Fragmented streaming plugins",
-    fragmented_init, VERSION, "LGPL", PACKAGE_NAME, "http://www.gstreamer.org/")
diff --git a/ext/hls/gsthls.h b/ext/hls/gsthls.h
new file mode 100644
index 0000000..3806f4f
--- /dev/null
+++ b/ext/hls/gsthls.h
@@ -0,0 +1,12 @@
+#ifndef __GST_HLS_H__
+#define __GST_HLS_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+GST_DEBUG_CATEGORY_EXTERN (hls_debug);
+
+G_END_DECLS
+
+#endif /* __GST_HLS_H__ */
diff --git a/ext/hls/gsthlsdemux.c b/ext/hls/gsthlsdemux.c
index 1c05fa8..6c5468d 100644
--- a/ext/hls/gsthlsdemux.c
+++ b/ext/hls/gsthlsdemux.c
@@ -57,22 +57,8 @@
 GST_DEBUG_CATEGORY_STATIC (gst_hls_demux_debug);
 #define GST_CAT_DEFAULT gst_hls_demux_debug
 
-enum
-{
-  PROP_0,
-
-  PROP_FRAGMENTS_CACHE,
-  PROP_LAST
-};
-
-#define DEFAULT_FRAGMENTS_CACHE 1
-
 /* GObject */
-static void gst_hls_demux_set_property (GObject * object, guint prop_id,
-    const GValue * value, GParamSpec * pspec);
-static void gst_hls_demux_get_property (GObject * object, guint prop_id,
-    GValue * value, GParamSpec * pspec);
-static void gst_hls_demux_dispose (GObject * obj);
+static void gst_hls_demux_finalize (GObject * obj);
 
 /* GstElement */
 static GstStateChangeReturn
@@ -81,8 +67,6 @@
 /* GstHLSDemux */
 static gboolean gst_hls_demux_update_playlist (GstHLSDemux * demux,
     gboolean update, GError ** err);
-static gboolean gst_hls_demux_set_location (GstHLSDemux * demux,
-    const gchar * uri, const gchar * base_uri);
 static gchar *gst_hls_src_buf_to_utf8_playlist (GstBuffer * buf);
 
 static gboolean gst_hls_demux_change_playlist (GstHLSDemux * demux,
@@ -125,14 +109,14 @@
 G_DEFINE_TYPE (GstHLSDemux, gst_hls_demux, GST_TYPE_ADAPTIVE_DEMUX);
 
 static void
-gst_hls_demux_dispose (GObject * obj)
+gst_hls_demux_finalize (GObject * obj)
 {
   GstHLSDemux *demux = GST_HLS_DEMUX (obj);
 
   gst_hls_demux_reset (GST_ADAPTIVE_DEMUX_CAST (demux));
   gst_m3u8_client_free (demux->client);
 
-  G_OBJECT_CLASS (parent_class)->dispose (obj);
+  G_OBJECT_CLASS (parent_class)->finalize (obj);
 }
 
 static void
@@ -146,18 +130,7 @@
   element_class = (GstElementClass *) klass;
   adaptivedemux_class = (GstAdaptiveDemuxClass *) klass;
 
-  gobject_class->set_property = gst_hls_demux_set_property;
-  gobject_class->get_property = gst_hls_demux_get_property;
-  gobject_class->dispose = gst_hls_demux_dispose;
-
-#ifndef GST_REMOVE_DEPRECATED
-  g_object_class_install_property (gobject_class, PROP_FRAGMENTS_CACHE,
-      g_param_spec_uint ("fragments-cache", "Fragments cache",
-          "Number of fragments needed to be cached to start playing "
-          "(DEPRECATED: Has no effect since 1.3.1)",
-          1, G_MAXUINT, DEFAULT_FRAGMENTS_CACHE,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_DEPRECATED));
-#endif
+  gobject_class->finalize = gst_hls_demux_finalize;
 
   element_class->change_state = GST_DEBUG_FUNCPTR (gst_hls_demux_change_state);
 
@@ -204,33 +177,6 @@
   demux->do_typefind = TRUE;
 }
 
-static void
-gst_hls_demux_set_property (GObject * object, guint prop_id,
-    const GValue * value, GParamSpec * pspec)
-{
-  switch (prop_id) {
-    case PROP_FRAGMENTS_CACHE:
-      break;
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-      break;
-  }
-}
-
-static void
-gst_hls_demux_get_property (GObject * object, guint prop_id, GValue * value,
-    GParamSpec * pspec)
-{
-  switch (prop_id) {
-    case PROP_FRAGMENTS_CACHE:
-      g_value_set_uint (value, 1);
-      break;
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-      break;
-  }
-}
-
 static GstStateChangeReturn
 gst_hls_demux_change_state (GstElement * element, GstStateChange transition)
 {
@@ -301,6 +247,7 @@
   gint64 current_sequence;
   GstM3U8MediaFile *file;
   guint64 bitrate;
+  gboolean snap_before, snap_after, snap_nearest;
 
   gst_event_parse_seek (seek, &rate, &format, &flags, &start_type, &start,
       &stop_type, &stop);
@@ -358,13 +305,29 @@
   current_sequence = file->sequence;
   current_pos = 0;
   target_pos = rate > 0 ? start : stop;
+
+  /* Snap to segment boundary. Improves seek performance on slow machines. */
+  snap_before = snap_after = snap_nearest = FALSE;
+  if ((flags & GST_SEEK_FLAG_SNAP_NEAREST) == GST_SEEK_FLAG_SNAP_NEAREST)
+    snap_nearest = TRUE;
+  else if (flags & GST_SEEK_FLAG_SNAP_BEFORE)
+    snap_before = TRUE;
+  else if (flags & GST_SEEK_FLAG_SNAP_AFTER)
+    snap_after = TRUE;
+
   /* FIXME: Here we need proper discont handling */
   for (walk = hlsdemux->client->current->files; walk; walk = walk->next) {
     file = walk->data;
 
     current_sequence = file->sequence;
     current_file = walk;
-    if (current_pos <= target_pos && target_pos < current_pos + file->duration) {
+    if (snap_after || snap_nearest) {
+      if (current_pos >= target_pos)
+        break;
+      if (snap_nearest && target_pos - current_pos < file->duration / 2)
+        break;
+    } else if (current_pos <= target_pos
+        && target_pos < current_pos + file->duration) {
       break;
     }
     current_pos += file->duration;
@@ -383,6 +346,10 @@
   hlsdemux->client->sequence_position = current_pos;
   GST_M3U8_CLIENT_UNLOCK (hlsdemux->client);
 
+  if (snap_before || snap_after || snap_nearest)
+    gst_segment_do_seek (&demux->segment, rate, format, flags, start_type,
+        current_pos, stop_type, stop, NULL);
+
   return TRUE;
 }
 
@@ -416,8 +383,14 @@
   GstHLSDemux *hlsdemux = GST_HLS_DEMUX_CAST (demux);
   gchar *playlist = NULL;
 
-  gst_hls_demux_set_location (hlsdemux, demux->manifest_uri,
-      demux->manifest_base_uri);
+  if (hlsdemux->client)
+    gst_m3u8_client_free (hlsdemux->client);
+
+  hlsdemux->client =
+      gst_m3u8_client_new (demux->manifest_uri, demux->manifest_base_uri);
+
+  GST_INFO_OBJECT (demux, "Changed location: %s (base uri: %s)",
+      demux->manifest_uri, GST_STR_NULL (demux->manifest_base_uri));
 
   playlist = gst_hls_src_buf_to_utf8_playlist (buf);
   if (playlist == NULL) {
@@ -444,6 +417,9 @@
     } else {
       GList *tmp = gst_m3u8_client_get_playlist_for_bitrate (hlsdemux->client,
           demux->connection_speed);
+      GST_M3U8_CLIENT_LOCK (hlsdemux->client);
+      hlsdemux->client->main->current_variant = tmp;
+      GST_M3U8_CLIENT_UNLOCK (hlsdemux->client);
 
       child = GST_M3U8 (tmp->data);
     }
@@ -525,9 +501,12 @@
   return TRUE;
 
 key_failed:
-  /* TODO Raise this error to the user */
-  GST_WARNING_OBJECT (demux, "Failed to decrypt data");
-  return FALSE;
+  {
+    GST_ELEMENT_ERROR (demux, STREAM, DEMUX,
+        ("Couldn't retrieve key for decryption"), (NULL));
+    GST_WARNING_OBJECT (demux, "Failed to decrypt data");
+    return FALSE;
+  }
 }
 
 static GstFlowReturn
@@ -715,23 +694,25 @@
     return GST_FLOW_EOS;
   }
 
+  if (stream->discont)
+    discont = TRUE;
+
   /* set up our source for download */
-  if (hlsdemux->reset_pts || discont) {
+  if (hlsdemux->reset_pts || discont || stream->demux->segment.rate < 0.0) {
     stream->fragment.timestamp = timestamp;
   } else {
     stream->fragment.timestamp = GST_CLOCK_TIME_NONE;
   }
 
-  if (hlsdemux->current_key)
-    g_free (hlsdemux->current_key);
+  g_free (hlsdemux->current_key);
   hlsdemux->current_key = key;
-  if (hlsdemux->current_iv)
-    g_free (hlsdemux->current_iv);
+  g_free (hlsdemux->current_iv);
   hlsdemux->current_iv = iv;
   g_free (stream->fragment.uri);
   stream->fragment.uri = next_fragment_uri;
   stream->fragment.range_start = range_start;
   stream->fragment.range_end = range_end;
+  stream->fragment.duration = duration;
   if (discont)
     stream->discont = discont;
 
@@ -802,18 +783,6 @@
   gst_hls_demux_decrypt_end (demux);
 }
 
-static gboolean
-gst_hls_demux_set_location (GstHLSDemux * demux, const gchar * uri,
-    const gchar * base_uri)
-{
-  if (demux->client)
-    gst_m3u8_client_free (demux->client);
-  demux->client = gst_m3u8_client_new (uri, base_uri);
-  GST_INFO_OBJECT (demux, "Changed location: %s (base uri: %s)", uri,
-      GST_STR_NULL (base_uri));
-  return TRUE;
-}
-
 static gchar *
 gst_hls_src_buf_to_utf8_playlist (GstBuffer * buf)
 {
@@ -858,63 +827,64 @@
       TRUE, TRUE, TRUE, err);
   g_free (main_uri);
   if (download == NULL) {
-    if (!adaptive_demux->cancelled && update && !main_checked
-        && gst_m3u8_client_has_variant_playlist (demux->client)
-        && gst_m3u8_client_has_main (demux->client)) {
-      GError *err2 = NULL;
-      main_uri = gst_m3u8_client_get_uri (demux->client);
-      GST_INFO_OBJECT (demux,
-          "Updating playlist %s failed, attempt to refresh variant playlist %s",
-          uri, main_uri);
-      download =
-          gst_uri_downloader_fetch_uri (adaptive_demux->downloader,
-          main_uri, NULL, TRUE, TRUE, TRUE, &err2);
-      g_free (main_uri);
-      g_clear_error (&err2);
-      if (download != NULL) {
-        gchar *base_uri;
+    gchar *base_uri;
 
-        buf = gst_fragment_get_buffer (download);
-        playlist = gst_hls_src_buf_to_utf8_playlist (buf);
-        gst_buffer_unref (buf);
-
-        if (playlist == NULL) {
-          GST_WARNING_OBJECT (demux,
-              "Failed to validate variant playlist encoding");
-          g_free (uri);
-          g_object_unref (download);
-          return FALSE;
-        }
-
-        g_free (uri);
-        if (download->redirect_permanent && download->redirect_uri) {
-          uri = download->redirect_uri;
-          base_uri = NULL;
-        } else {
-          uri = download->uri;
-          base_uri = download->redirect_uri;
-        }
-
-        if (!gst_m3u8_client_update_variant_playlist (demux->client, playlist,
-                uri, base_uri)) {
-          GST_WARNING_OBJECT (demux, "Failed to update the variant playlist");
-          g_object_unref (download);
-          return FALSE;
-        }
-
-        g_object_unref (download);
-
-        g_clear_error (err);
-        main_checked = TRUE;
-        goto retry;
-      } else {
-        g_free (uri);
-        return FALSE;
-      }
-    } else {
+    if (!update || main_checked
+        || !gst_m3u8_client_has_variant_playlist (demux->client)) {
       g_free (uri);
       return FALSE;
     }
+
+    g_clear_error (err);
+    main_uri = gst_m3u8_client_get_uri (demux->client);
+    GST_INFO_OBJECT (demux,
+        "Updating playlist %s failed, attempt to refresh variant playlist %s",
+        uri, main_uri);
+    download =
+        gst_uri_downloader_fetch_uri (adaptive_demux->downloader,
+        main_uri, NULL, TRUE, TRUE, TRUE, err);
+    g_free (main_uri);
+    if (download == NULL) {
+      g_free (uri);
+      return FALSE;
+    }
+
+    buf = gst_fragment_get_buffer (download);
+    playlist = gst_hls_src_buf_to_utf8_playlist (buf);
+    gst_buffer_unref (buf);
+
+    if (playlist == NULL) {
+      GST_WARNING_OBJECT (demux,
+          "Failed to validate variant playlist encoding");
+      g_free (uri);
+      g_object_unref (download);
+      g_set_error (err, GST_STREAM_ERROR, GST_STREAM_ERROR_WRONG_TYPE,
+          "Couldn't validate playlist encoding");
+      return FALSE;
+    }
+
+    g_free (uri);
+    if (download->redirect_permanent && download->redirect_uri) {
+      uri = download->redirect_uri;
+      base_uri = NULL;
+    } else {
+      uri = download->uri;
+      base_uri = download->redirect_uri;
+    }
+
+    if (!gst_m3u8_client_update_variant_playlist (demux->client, playlist,
+            uri, base_uri)) {
+      GST_WARNING_OBJECT (demux, "Failed to update the variant playlist");
+      g_object_unref (download);
+      g_set_error (err, GST_STREAM_ERROR, GST_STREAM_ERROR_FAILED,
+          "Couldn't update playlist");
+      return FALSE;
+    }
+
+    g_object_unref (download);
+
+    main_checked = TRUE;
+    goto retry;
   }
   g_free (uri);
 
@@ -1000,6 +970,9 @@
       target_pos = MAX (target_pos, demux->client->sequence_position);
     }
 
+    GST_LOG_OBJECT (demux, "Looking for sequence position %"
+        GST_TIME_FORMAT " in updated playlist", GST_TIME_ARGS (target_pos));
+
     current_pos = 0;
     for (walk = demux->client->current->files; walk; walk = walk->next) {
       GstM3U8MediaFile *file = walk->data;
@@ -1058,9 +1031,8 @@
 
   GST_INFO_OBJECT (demux, "Client was on %dbps, max allowed is %dbps, switching"
       " to bitrate %dbps", old_bandwidth, max_bitrate, new_bandwidth);
-  stream->discont = TRUE;
 
-  if (gst_hls_demux_update_playlist (demux, FALSE, NULL)) {
+  if (gst_hls_demux_update_playlist (demux, TRUE, NULL)) {
     gchar *uri;
     gchar *main_uri;
     uri = gst_m3u8_client_get_current_uri (demux->client);
@@ -1075,6 +1047,7 @@
     g_free (main_uri);
     if (changed)
       *changed = TRUE;
+    stream->discont = TRUE;
   } else {
     GList *failover = NULL;
 
diff --git a/ext/hls/gsthlsdemux.h b/ext/hls/gsthlsdemux.h
index daa3670..1154236 100644
--- a/ext/hls/gsthlsdemux.h
+++ b/ext/hls/gsthlsdemux.h
@@ -26,7 +26,7 @@
 
 #include <gst/gst.h>
 #include "m3u8.h"
-#include "gstfragmented.h"
+#include "gsthls.h"
 #include <gst/adaptivedemux/gstadaptivedemux.h>
 #if defined(HAVE_OPENSSL)
 #include <openssl/evp.h>
diff --git a/ext/hls/gsthlsplugin.c b/ext/hls/gsthlsplugin.c
new file mode 100644
index 0000000..552f514
--- /dev/null
+++ b/ext/hls/gsthlsplugin.c
@@ -0,0 +1,32 @@
+#ifdef HAVE_CONFIG_H
+#  include <config.h>
+#endif
+
+#include <gst/gst.h>
+
+#include "gsthls.h"
+#include "gsthlsdemux.h"
+#include "gsthlssink.h"
+
+GST_DEBUG_CATEGORY (hls_debug);
+
+static gboolean
+hls_init (GstPlugin * plugin)
+{
+  GST_DEBUG_CATEGORY_INIT (hls_debug, "hls", 0, "HTTP Live Streaming (HLS)");
+
+  if (!gst_element_register (plugin, "hlsdemux", GST_RANK_PRIMARY,
+          GST_TYPE_HLS_DEMUX) || FALSE)
+    return FALSE;
+
+  if (!gst_hls_sink_plugin_init (plugin))
+    return FALSE;
+
+  return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+    GST_VERSION_MINOR,
+    hls,
+    "HTTP Live Streaming (HLS)",
+    hls_init, VERSION, GST_LICENSE, PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/ext/hls/gsthlssink.c b/ext/hls/gsthlssink.c
index de5e84c..03671d0 100644
--- a/ext/hls/gsthlssink.c
+++ b/ext/hls/gsthlssink.c
@@ -36,7 +36,6 @@
 #include "gsthlssink.h"
 #include <gst/pbutils/pbutils.h>
 #include <gst/video/video.h>
-#include <gio/gio.h>
 #include <glib/gstdio.h>
 #include <memory.h>
 
diff --git a/ext/hls/gstm3u8playlist.c b/ext/hls/gstm3u8playlist.c
index f2c556b..c600702 100644
--- a/ext/hls/gstm3u8playlist.c
+++ b/ext/hls/gstm3u8playlist.c
@@ -21,20 +21,10 @@
 
 #include <glib.h>
 
-#include "gstfragmented.h"
+#include "gsthls.h"
 #include "gstm3u8playlist.h"
 
-#define GST_CAT_DEFAULT fragmented_debug
-
-#define M3U8_HEADER_TAG "#EXTM3U\n"
-#define M3U8_VERSION_TAG "#EXT-X-VERSION:%d\n"
-#define M3U8_ALLOW_CACHE_TAG "#EXT-X-ALLOW-CACHE:%s\n"
-#define M3U8_TARGETDURATION_TAG "#EXT-X-TARGETDURATION:%d\n"
-#define M3U8_MEDIA_SEQUENCE_TAG "#EXT-X-MEDIA-SEQUENCE:%d\n"
-#define M3U8_DISCONTINUITY_TAG "#EXT-X-DISCONTINUITY\n"
-#define M3U8_INT_INF_TAG "#EXTINF:%d,%s\n%s\n"
-#define M3U8_FLOAT_INF_TAG "#EXTINF:%s,%s\n%s\n"
-#define M3U8_ENDLIST_TAG "#EXT-X-ENDLIST"
+#define GST_CAT_DEFAULT hls_debug
 
 enum
 {
@@ -42,6 +32,16 @@
   GST_M3U8_PLAYLIST_TYPE_VOD,
 };
 
+typedef struct _GstM3U8Entry GstM3U8Entry;
+
+struct _GstM3U8Entry
+{
+  gfloat duration;
+  gchar *title;
+  gchar *url;
+  gboolean discontinuous;
+};
+
 static GstM3U8Entry *
 gst_m3u8_entry_new (const gchar * url, const gchar * title,
     gfloat duration, gboolean discontinuous)
@@ -68,25 +68,6 @@
   g_free (entry);
 }
 
-static gchar *
-gst_m3u8_entry_render (GstM3U8Entry * entry, guint version)
-{
-  gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
-
-  g_return_val_if_fail (entry != NULL, NULL);
-
-  if (version < 3)
-    return g_strdup_printf ("%s" M3U8_INT_INF_TAG,
-        entry->discontinuous ? M3U8_DISCONTINUITY_TAG : "",
-        (gint) ((entry->duration + 500 * GST_MSECOND) / GST_SECOND),
-        entry->title ? entry->title : "", entry->url);
-
-  return g_strdup_printf ("%s" M3U8_FLOAT_INF_TAG,
-      entry->discontinuous ? M3U8_DISCONTINUITY_TAG : "",
-      g_ascii_dtostr (buf, sizeof (buf), (entry->duration / GST_SECOND)),
-      entry->title ? entry->title : "", entry->url);
-}
-
 GstM3U8Playlist *
 gst_m3u8_playlist_new (guint version, guint window_size, gboolean allow_cache)
 {
@@ -148,12 +129,12 @@
 static guint
 gst_m3u8_playlist_target_duration (GstM3U8Playlist * playlist)
 {
-  gint i;
-  GstM3U8Entry *entry;
   guint64 target_duration = 0;
+  GList *l;
 
-  for (i = 0; i < playlist->entries->length; i++) {
-    entry = (GstM3U8Entry *) g_queue_peek_nth (playlist->entries, i);
+  for (l = playlist->entries->head; l != NULL; l = l->next) {
+    GstM3U8Entry *entry = l->data;
+
     if (entry->duration > target_duration)
       target_duration = entry->duration;
   }
@@ -161,65 +142,52 @@
   return (guint) ((target_duration + 500 * GST_MSECOND) / GST_SECOND);
 }
 
-static void
-render_entry (GstM3U8Entry * entry, GstM3U8Playlist * playlist)
-{
-  gchar *entry_str;
-
-  entry_str = gst_m3u8_entry_render (entry, playlist->version);
-  g_string_append_printf (playlist->playlist_str, "%s", entry_str);
-  g_free (entry_str);
-}
-
 gchar *
 gst_m3u8_playlist_render (GstM3U8Playlist * playlist)
 {
-  gchar *pl;
+  GString *playlist_str;
+  GList *l;
 
   g_return_val_if_fail (playlist != NULL, NULL);
 
-  playlist->playlist_str = g_string_new ("");
+  playlist_str = g_string_new ("#EXTM3U\n");
 
-  /* #EXTM3U */
-  g_string_append_printf (playlist->playlist_str, M3U8_HEADER_TAG);
-  /* #EXT-X-VERSION */
-  g_string_append_printf (playlist->playlist_str, M3U8_VERSION_TAG,
+  g_string_append_printf (playlist_str, "#EXT-X-VERSION:%d\n",
       playlist->version);
-  /* #EXT-X-ALLOW_CACHE */
-  g_string_append_printf (playlist->playlist_str, M3U8_ALLOW_CACHE_TAG,
+
+  g_string_append_printf (playlist_str, "#EXT-X-ALLOW-CACHE:%s\n",
       playlist->allow_cache ? "YES" : "NO");
-  /* #EXT-X-MEDIA-SEQUENCE */
-  g_string_append_printf (playlist->playlist_str, M3U8_MEDIA_SEQUENCE_TAG,
+
+  g_string_append_printf (playlist_str, "#EXT-X-MEDIA-SEQUENCE:%d\n",
       playlist->sequence_number - playlist->entries->length);
-  /* #EXT-X-TARGETDURATION */
-  g_string_append_printf (playlist->playlist_str, M3U8_TARGETDURATION_TAG,
+
+  g_string_append_printf (playlist_str, "#EXT-X-TARGETDURATION:%u\n",
       gst_m3u8_playlist_target_duration (playlist));
-  g_string_append_printf (playlist->playlist_str, "\n");
+  g_string_append (playlist_str, "\n");
 
   /* Entries */
-  g_queue_foreach (playlist->entries, (GFunc) render_entry, playlist);
+  for (l = playlist->entries->head; l != NULL; l = l->next) {
+    gchar buf[G_ASCII_DTOSTR_BUF_SIZE];
+    GstM3U8Entry *entry = l->data;
+
+    if (entry->discontinuous)
+      g_string_append (playlist_str, "#EXT-X-DISCONTINUITY\n");
+
+    if (playlist->version < 3) {
+      g_string_append_printf (playlist_str, "#EXTINF:%d,%s\n",
+          (gint) ((entry->duration + 500 * GST_MSECOND) / GST_SECOND),
+          entry->title ? entry->title : "");
+    } else {
+      g_string_append_printf (playlist_str, "#EXTINF:%s,%s\n",
+          g_ascii_dtostr (buf, sizeof (buf), entry->duration / GST_SECOND),
+          entry->title ? entry->title : "");
+    }
+
+    g_string_append_printf (playlist_str, "%s\n", entry->url);
+  }
 
   if (playlist->end_list)
-    g_string_append_printf (playlist->playlist_str, M3U8_ENDLIST_TAG);
+    g_string_append (playlist_str, "#EXT-X-ENDLIST");
 
-  pl = playlist->playlist_str->str;
-  g_string_free (playlist->playlist_str, FALSE);
-  return pl;
-}
-
-void
-gst_m3u8_playlist_clear (GstM3U8Playlist * playlist)
-{
-  g_return_if_fail (playlist != NULL);
-
-  g_queue_foreach (playlist->entries, (GFunc) gst_m3u8_entry_free, NULL);
-  g_queue_clear (playlist->entries);
-}
-
-guint
-gst_m3u8_playlist_n_entries (GstM3U8Playlist * playlist)
-{
-  g_return_val_if_fail (playlist != NULL, 0);
-
-  return playlist->entries->length;
+  return g_string_free (playlist_str, FALSE);
 }
diff --git a/ext/hls/gstm3u8playlist.h b/ext/hls/gstm3u8playlist.h
index 0e95132..7d80435 100644
--- a/ext/hls/gstm3u8playlist.h
+++ b/ext/hls/gstm3u8playlist.h
@@ -23,21 +23,10 @@
 #define __GST_M3U8_PLAYLIST_H__
 
 #include <glib.h>
-#include <gio/gio.h>
 
 G_BEGIN_DECLS
 
 typedef struct _GstM3U8Playlist GstM3U8Playlist;
-typedef struct _GstM3U8Entry GstM3U8Entry;
-
-
-struct _GstM3U8Entry
-{
-  gfloat duration;
-  gchar *title;
-  gchar *url;
-  gboolean discontinuous;
-};
 
 struct _GstM3U8Playlist
 {
@@ -50,23 +39,24 @@
 
   /*< Private >*/
   GQueue *entries;
-  GString *playlist_str;
 };
 
 
 GstM3U8Playlist * gst_m3u8_playlist_new (guint version, 
 				         guint window_size,
 					 gboolean allow_cache);
-void gst_m3u8_playlist_free (GstM3U8Playlist * playlist);
-gboolean gst_m3u8_playlist_add_entry (GstM3U8Playlist * playlist,
-    				     const gchar * url,
-				     const gchar *title,
-				     gfloat duration,
-				     guint index,
-				     gboolean discontinuous);
-gchar * gst_m3u8_playlist_render (GstM3U8Playlist * playlist); 
-void gst_m3u8_playlist_clear (GstM3U8Playlist * playlist); 
-guint gst_m3u8_playlist_n_entries (GstM3U8Playlist * playlist); 
+
+void              gst_m3u8_playlist_free (GstM3U8Playlist * playlist);
+
+gboolean          gst_m3u8_playlist_add_entry (GstM3U8Playlist * playlist,
+                                               const gchar     * url,
+                                               const gchar     * title,
+                                               gfloat            duration,
+                                               guint             index,
+                                               gboolean          discontinuous);
+
+gchar *           gst_m3u8_playlist_render (GstM3U8Playlist * playlist);
 
 G_END_DECLS
+
 #endif /* __M3U8_H__ */
diff --git a/ext/hls/m3u8.c b/ext/hls/m3u8.c
index 4265f97..df267f7 100644
--- a/ext/hls/m3u8.c
+++ b/ext/hls/m3u8.c
@@ -25,29 +25,10 @@
 #include <glib.h>
 #include <string.h>
 
-#include "gstfragmented.h"
+#include "gsthls.h"
 #include "m3u8.h"
 
-#define GST_CAT_DEFAULT fragmented_debug
-
-#if !GLIB_CHECK_VERSION (2, 33, 4)
-#define g_list_copy_deep gst_g_list_copy_deep
-static GList *
-gst_g_list_copy_deep (GList * list, GCopyFunc func, gpointer user_data)
-{
-  list = g_list_copy (list);
-
-  if (func != NULL) {
-    GList *l;
-
-    for (l = list; l != NULL; l = l->next) {
-      l->data = func (l->data, user_data);
-    }
-  }
-
-  return list;
-}
-#endif
+#define GST_CAT_DEFAULT hls_debug
 
 static GstM3U8 *gst_m3u8_new (void);
 static void gst_m3u8_free (GstM3U8 * m3u8);
@@ -131,84 +112,6 @@
   g_free (self);
 }
 
-static GstM3U8MediaFile *
-gst_m3u8_media_file_copy (const GstM3U8MediaFile * self, gpointer user_data)
-{
-  g_return_val_if_fail (self != NULL, NULL);
-
-  return gst_m3u8_media_file_new (g_strdup (self->uri), g_strdup (self->title),
-      self->duration, self->sequence);
-}
-
-static GstM3U8 *
-_m3u8_copy (const GstM3U8 * self, GstM3U8 * parent)
-{
-  GstM3U8 *dup;
-
-  g_return_val_if_fail (self != NULL, NULL);
-
-  dup = gst_m3u8_new ();
-  dup->uri = g_strdup (self->uri);
-  dup->base_uri = g_strdup (self->base_uri);
-  dup->name = g_strdup (self->name);
-  dup->endlist = self->endlist;
-  dup->version = self->version;
-  dup->targetduration = self->targetduration;
-  dup->allowcache = self->allowcache;
-  dup->bandwidth = self->bandwidth;
-  dup->program_id = self->program_id;
-  dup->codecs = g_strdup (self->codecs);
-  dup->width = self->width;
-  dup->height = self->height;
-  dup->iframe = self->iframe;
-  dup->files =
-      g_list_copy_deep (self->files, (GCopyFunc) gst_m3u8_media_file_copy,
-      NULL);
-
-  /* private */
-  dup->last_data = g_strdup (self->last_data);
-  dup->lists = g_list_copy_deep (self->lists, (GCopyFunc) _m3u8_copy, dup);
-  dup->iframe_lists =
-      g_list_copy_deep (self->iframe_lists, (GCopyFunc) _m3u8_copy, dup);
-  /* NOTE: current_variant will get set in gst_m3u8_copy () */
-  dup->parent = parent;
-  dup->mediasequence = self->mediasequence;
-  return dup;
-}
-
-static GstM3U8 *
-gst_m3u8_copy (const GstM3U8 * self)
-{
-  GList *entry;
-  guint n;
-
-  GstM3U8 *dup = _m3u8_copy (self, NULL);
-
-  if (self->current_variant != NULL) {
-    for (n = 0, entry = self->lists; entry; entry = entry->next, n++) {
-      if (entry == self->current_variant) {
-        dup->current_variant = g_list_nth (dup->lists, n);
-        break;
-      }
-    }
-
-    if (!dup->current_variant) {
-      for (n = 0, entry = self->iframe_lists; entry; entry = entry->next, n++) {
-        if (entry == self->current_variant) {
-          dup->current_variant = g_list_nth (dup->iframe_lists, n);
-          break;
-        }
-      }
-
-      if (!dup->current_variant) {
-        GST_ERROR ("Failed to determine current playlist");
-      }
-    }
-  }
-
-  return dup;
-}
-
 static gboolean
 int_from_string (gchar * ptr, gchar ** endptr, gint * val)
 {
@@ -297,7 +200,7 @@
 static gboolean
 parse_attributes (gchar ** ptr, gchar ** a, gchar ** v)
 {
-  gchar *end = NULL, *p;
+  gchar *end = NULL, *p, *ve;
 
   g_return_val_if_fail (ptr != NULL, FALSE);
   g_return_val_if_fail (*ptr != NULL, FALSE);
@@ -330,8 +233,20 @@
 
   *v = p = g_utf8_strchr (*ptr, -1, '=');
   if (*v) {
-    *v = g_utf8_next_char (*v);
     *p = '\0';
+    *v = g_utf8_next_char (*v);
+    if (**v == '"') {
+      ve = g_utf8_next_char (*v);
+      if (ve) {
+        ve = g_utf8_strchr (ve, -1, '"');
+      }
+      if (ve) {
+        *v = g_utf8_next_char (*v);
+        *ve = '\0';
+      } else {
+        GST_WARNING ("Cannot remove quotation marks from %s", *a);
+      }
+    }
   } else {
     GST_WARNING ("missing = after attribute");
     return FALSE;
@@ -341,28 +256,6 @@
   return TRUE;
 }
 
-static gchar *
-unquote_string (gchar * string)
-{
-  gchar *string_ret;
-
-  string_ret = strchr (string, '"');
-  if (string_ret != NULL) {
-    /* found initialization quotation mark of string */
-    string = string_ret + 1;
-    string_ret = strchr (string, '"');
-    if (string_ret != NULL) {
-      /* found finalizing quotation mark of string */
-      string_ret[0] = '\0';
-    } else {
-      GST_WARNING
-          ("wrong string unqouting - cannot find finalizing quotation mark");
-      return NULL;
-    }
-  }
-  return string;
-}
-
 static gint
 _m3u8_compare_uri (GstM3U8 * a, gchar * uri)
 {
@@ -394,6 +287,7 @@
   gboolean have_iv = FALSE;
   guint8 iv[16] = { 0, };
   gint64 size = -1, offset = -1;
+  gint64 mediasequence;
 
   g_return_val_if_fail (self != NULL, FALSE);
   g_return_val_if_fail (data != NULL, FALSE);
@@ -416,6 +310,8 @@
     return FALSE;
   }
 
+  GST_TRACE ("data:\n%s", data);
+
   g_free (self->last_data);
   self->last_data = data;
 
@@ -426,6 +322,7 @@
     self->files = NULL;
   }
   client->duration = GST_CLOCK_TIME_NONE;
+  mediasequence = 0;
 
   /* By default, allow caching */
   self->allowcache = TRUE;
@@ -469,9 +366,7 @@
         list = NULL;
       } else {
         GstM3U8MediaFile *file;
-        file =
-            gst_m3u8_media_file_new (data, title, duration,
-            self->mediasequence++);
+        file = gst_m3u8_media_file_new (data, title, duration, mediasequence++);
 
         /* set encryption params */
         file->key = current_key ? g_strdup (current_key) : NULL;
@@ -547,7 +442,6 @@
         GstM3U8 *new_list;
 
         new_list = gst_m3u8_new ();
-        new_list->parent = self;
         new_list->iframe = iframe;
         data = data + (iframe ? 26 : 18);
         while (data && parse_attributes (&data, &a, &v)) {
@@ -572,24 +466,13 @@
             }
           } else if (iframe && g_str_equal (a, "URI")) {
             gchar *name;
-            gchar *uri = g_strdup (v);
-            gchar *urip = uri;
+            gchar *uri;
 
-            uri = unquote_string (uri);
+            uri = uri_join (self->base_uri ? self->base_uri : self->uri, v);
             if (uri) {
-              uri = uri_join (self->base_uri ? self->base_uri : self->uri, uri);
-              if (uri == NULL) {
-                g_free (urip);
-                continue;
-              }
               name = g_strdup (uri);
-
               gst_m3u8_set_uri (new_list, uri, NULL, name);
-            } else {
-              GST_WARNING
-                  ("Cannot remove quotation marks from i-frame-stream URI");
             }
-            g_free (urip);
           }
         }
 
@@ -613,7 +496,7 @@
           self->targetduration = val * GST_SECOND;
       } else if (g_str_has_prefix (data_ext_x, "MEDIA-SEQUENCE:")) {
         if (int_from_string (data + 22, &data, &val))
-          self->mediasequence = val;
+          mediasequence = val;
       } else if (g_str_has_prefix (data_ext_x, "DISCONTINUITY")) {
         discontinuity = TRUE;
       } else if (g_str_has_prefix (data_ext_x, "PROGRAM-DATE-TIME:")) {
@@ -632,18 +515,8 @@
         current_key = NULL;
         while (data && parse_attributes (&data, &a, &v)) {
           if (g_str_equal (a, "URI")) {
-            gchar *key = g_strdup (v);
-            gchar *keyp = key;
-
-            key = unquote_string (key);
-            if (key) {
-              current_key =
-                  uri_join (self->base_uri ? self->base_uri : self->uri, key);
-            } else {
-              GST_WARNING
-                  ("Cannot remove quotation marks from decryption key URI");
-            }
-            g_free (keyp);
+            current_key =
+                uri_join (self->base_uri ? self->base_uri : self->uri, v);
           } else if (g_str_equal (a, "IV")) {
             gchar *ivp = v;
             gint i;
@@ -786,7 +659,6 @@
   client->current_file_duration = GST_CLOCK_TIME_NONE;
   client->sequence = -1;
   client->sequence_position = 0;
-  client->update_failed_count = 0;
   client->highest_sequence_number = -1;
   client->duration = GST_CLOCK_TIME_NONE;
   g_mutex_init (&client->lock);
@@ -813,7 +685,6 @@
   GST_M3U8_CLIENT_LOCK (self);
   if (m3u8 != self->current) {
     self->current = m3u8;
-    self->update_failed_count = 0;
     self->duration = GST_CLOCK_TIME_NONE;
     self->current_file = NULL;
   }
@@ -835,10 +706,8 @@
   if (!gst_m3u8_update (self, m3u8, data, &updated))
     goto out;
 
-  if (!updated) {
-    self->update_failed_count++;
+  if (!updated)
     goto out;
-  }
 
   if (self->current && !self->current->files) {
     GST_ERROR ("Invalid media playlist, it does not contain any media files");
@@ -925,7 +794,7 @@
       GList *match = g_list_find_custom (unmatched_lists, list_entry->data,
           (GCompareFunc) _find_m3u8_list_match);
       if (match)
-        unmatched_lists = g_list_remove_link (unmatched_lists, match);
+        unmatched_lists = g_list_delete_link (unmatched_lists, match);
     }
 
     if (unmatched_lists != NULL) {
@@ -941,10 +810,12 @@
       g_list_free (unmatched_lists);
     }
 
-    /* Switch out the variant playlist */
+    /* Switch out the variant playlist, steal it from new_client */
     old = self->main;
 
-    self->main = gst_m3u8_copy (new_client->main);
+    self->main = new_client->main;
+    new_client->main = gst_m3u8_new ();
+
     if (self->main->lists)
       self->current = self->main->current_variant->data;
     else
@@ -962,12 +833,6 @@
   return ret;
 }
 
-static gboolean
-_find_current (GstM3U8MediaFile * file, GstM3U8Client * client)
-{
-  return file->sequence != client->sequence;
-}
-
 static GList *
 find_next_fragment (GstM3U8Client * client, GList * l, gboolean forward)
 {
@@ -1145,16 +1010,34 @@
     GList *l;
 
     GST_DEBUG ("Looking for fragment %" G_GINT64_FORMAT, client->sequence);
-    l = g_list_find_custom (client->current->files, client,
-        (GCompareFunc) _find_current);
-    if (l == NULL) {
+    for (l = client->current->files; l != NULL; l = l->next) {
+      if (GST_M3U8_MEDIA_FILE (l->data)->sequence == client->sequence) {
+        client->current_file = l;
+        break;
+      }
+    }
+    if (client->current_file == NULL) {
       GST_DEBUG
           ("Could not find current fragment, trying next fragment directly");
       alternate_advance (client, forward);
+
+      /* Resync sequence number if the above has failed for live streams */
+      if (client->current_file == NULL && GST_M3U8_CLIENT_IS_LIVE (client)) {
+        /* for live streams, start GST_M3U8_LIVE_MIN_FRAGMENT_DISTANCE from
+           the end of the playlist. See section 6.3.3 of HLS draft */
+        gint pos =
+            g_list_length (client->current->files) -
+            GST_M3U8_LIVE_MIN_FRAGMENT_DISTANCE;
+        client->current_file =
+            g_list_nth (client->current->files, pos >= 0 ? pos : 0);
+        client->current_file_duration =
+            GST_M3U8_MEDIA_FILE (client->current_file->data)->duration;
+
+        GST_WARNING ("Resyncing live playlist");
+      }
       GST_M3U8_CLIENT_UNLOCK (client);
       return;
     }
-    client->current_file = l;
   }
 
   file = GST_M3U8_MEDIA_FILE (client->current_file->data);
@@ -1256,22 +1139,6 @@
 }
 
 gboolean
-gst_m3u8_client_has_main (GstM3U8Client * client)
-{
-  gboolean ret;
-
-  g_return_val_if_fail (client != NULL, FALSE);
-
-  GST_M3U8_CLIENT_LOCK (client);
-  if (client->main)
-    ret = TRUE;
-  else
-    ret = FALSE;
-  GST_M3U8_CLIENT_UNLOCK (client);
-  return ret;
-}
-
-gboolean
 gst_m3u8_client_has_variant_playlist (GstM3U8Client * client)
 {
   gboolean ret;
@@ -1380,28 +1247,6 @@
   return ret;
 }
 
-guint64
-gst_m3u8_client_get_current_fragment_duration (GstM3U8Client * client)
-{
-  guint64 dur;
-  GList *list;
-
-  g_return_val_if_fail (client != NULL, 0);
-
-  GST_M3U8_CLIENT_LOCK (client);
-
-  list = g_list_find_custom (client->current->files, client,
-      (GCompareFunc) _find_current);
-  if (list == NULL) {
-    dur = -1;
-  } else {
-    dur = GST_M3U8_MEDIA_FILE (list->data)->duration;
-  }
-
-  GST_M3U8_CLIENT_UNLOCK (client);
-  return dur;
-}
-
 gboolean
 gst_m3u8_client_get_seek_range (GstM3U8Client * client, gint64 * start,
     gint64 * stop)
@@ -1410,6 +1255,7 @@
   GList *walk;
   GstM3U8MediaFile *file;
   guint count;
+  guint min_distance = 0;
 
   g_return_val_if_fail (client != NULL, FALSE);
 
@@ -1420,13 +1266,16 @@
     return FALSE;
   }
 
+  if (GST_M3U8_CLIENT_IS_LIVE (client)) {
+    /* min_distance is used to make sure the seek range is never closer than
+       GST_M3U8_LIVE_MIN_FRAGMENT_DISTANCE fragments from the end of a live
+       playlist - see 6.3.3. "Playing the Playlist file" of the HLS draft */
+    min_distance = GST_M3U8_LIVE_MIN_FRAGMENT_DISTANCE;
+  }
   count = g_list_length (client->current->files);
 
-  /* count is used to make sure the seek range is never closer than
-     GST_M3U8_LIVE_MIN_FRAGMENT_DISTANCE fragments from the end of the
-     playlist - see 6.3.3. "Playing the Playlist file" of the HLS draft */
   for (walk = client->current->files;
-      walk && count >= GST_M3U8_LIVE_MIN_FRAGMENT_DISTANCE; walk = walk->next) {
+      walk && count >= min_distance; walk = walk->next) {
     file = walk->data;
     --count;
     duration += file->duration;
diff --git a/ext/hls/m3u8.h b/ext/hls/m3u8.h
index 7b09de1..24eaaa1 100644
--- a/ext/hls/m3u8.h
+++ b/ext/hls/m3u8.h
@@ -25,7 +25,9 @@
 
 #include <glib.h>
 
-G_BEGIN_DECLS typedef struct _GstM3U8 GstM3U8;
+G_BEGIN_DECLS
+
+typedef struct _GstM3U8 GstM3U8;
 typedef struct _GstM3U8MediaFile GstM3U8MediaFile;
 typedef struct _GstM3U8Client GstM3U8Client;
 
@@ -36,11 +38,6 @@
 #define GST_M3U8_CLIENT_UNLOCK(c) g_mutex_unlock (&c->lock);
 
 #define GST_M3U8_CLIENT_IS_LIVE(c) ((!(c)->current || (c)->current->endlist) ? FALSE : TRUE)
-/* hlsdemux must not get closer to the end of a live stream than
-   GST_M3U8_LIVE_MIN_FRAGMENT_DISTANCE fragments. Section 6.3.3
-   "Playing the Playlist file" of the HLS draft states that this
-   value is three fragments */
-#define GST_M3U8_LIVE_MIN_FRAGMENT_DISTANCE 3
 
 /* hlsdemux must not get closer to the end of a live stream than
    GST_M3U8_LIVE_MIN_FRAGMENT_DISTANCE fragments. Section 6.3.3
@@ -74,8 +71,6 @@
   GList *lists;                 /* list of GstM3U8 from the main playlist */
   GList *iframe_lists;          /* I-frame lists from the main playlist */
   GList *current_variant;       /* Current variant playlist used */
-  GstM3U8 *parent;              /* main playlist (if any) */
-  gint64 mediasequence;          /* EXT-X-MEDIA-SEQUENCE & increased with new media file */
 };
 
 struct _GstM3U8MediaFile
@@ -94,7 +89,6 @@
 {
   GstM3U8 *main;                /* main playlist */
   GstM3U8 *current;
-  guint update_failed_count;
   GList *current_file;
   GstClockTime current_file_duration; /* Duration of current fragment */
   gint64 sequence;              /* the next sequence for this client */
@@ -107,30 +101,56 @@
 };
 
 
-GstM3U8Client *gst_m3u8_client_new (const gchar * uri, const gchar * base_uri);
-void gst_m3u8_client_free (GstM3U8Client * client);
-gboolean gst_m3u8_client_update (GstM3U8Client * client, gchar * data);
-gboolean gst_m3u8_client_update_variant_playlist (GstM3U8Client * client, gchar * data, const gchar * uri, const gchar * base_uri);
-void gst_m3u8_client_set_current (GstM3U8Client * client, GstM3U8 * m3u8);
-gboolean gst_m3u8_client_get_next_fragment (GstM3U8Client * client,
-    gboolean * discontinuity, gchar ** uri, GstClockTime * duration,
-    GstClockTime * timestamp, gint64 * range_start, gint64 * range_end,
-    gchar ** key, guint8 ** iv, gboolean forward);
-gboolean gst_m3u8_client_has_next_fragment (GstM3U8Client * client, gboolean forward);
-void gst_m3u8_client_advance_fragment (GstM3U8Client * client, gboolean forward);
-GstClockTime gst_m3u8_client_get_duration (GstM3U8Client * client);
-GstClockTime gst_m3u8_client_get_target_duration (GstM3U8Client * client);
-gchar *gst_m3u8_client_get_uri(GstM3U8Client * client);
-gchar *gst_m3u8_client_get_current_uri(GstM3U8Client * client);
-gboolean gst_m3u8_client_has_main(GstM3U8Client * client);
-gboolean gst_m3u8_client_has_variant_playlist(GstM3U8Client * client);
-gboolean gst_m3u8_client_is_live(GstM3U8Client * client);
-GList * gst_m3u8_client_get_playlist_for_bitrate (GstM3U8Client * client,
-    guint bitrate);
+GstM3U8Client * gst_m3u8_client_new (const gchar * uri, const gchar * base_uri);
 
-guint64 gst_m3u8_client_get_current_fragment_duration (GstM3U8Client * client);
+void            gst_m3u8_client_free (GstM3U8Client * client);
 
-gboolean gst_m3u8_client_get_seek_range(GstM3U8Client * client, gint64 * start, gint64 * stop);
+gboolean        gst_m3u8_client_update (GstM3U8Client * client, gchar * data);
+
+gboolean        gst_m3u8_client_update_variant_playlist (GstM3U8Client * client,
+                                                         gchar         * data,
+                                                         const gchar   * uri,
+                                                         const gchar   * base_uri);
+
+void            gst_m3u8_client_set_current         (GstM3U8Client * client,
+                                                     GstM3U8       * m3u8);
+
+gboolean        gst_m3u8_client_get_next_fragment   (GstM3U8Client * client,
+                                                     gboolean      * discontinuity,
+                                                     gchar        ** uri,
+                                                     GstClockTime  * duration,
+                                                     GstClockTime  * timestamp,
+                                                     gint64        * range_start,
+                                                     gint64        * range_end,
+                                                     gchar        ** key,
+                                                     guint8       ** iv,
+                                                     gboolean        forward);
+
+gboolean        gst_m3u8_client_has_next_fragment   (GstM3U8Client * client,
+                                                     gboolean        forward);
+
+void            gst_m3u8_client_advance_fragment    (GstM3U8Client * client,
+                                                     gboolean        forward);
+
+GstClockTime    gst_m3u8_client_get_duration        (GstM3U8Client * client);
+
+GstClockTime    gst_m3u8_client_get_target_duration (GstM3U8Client * client);
+
+gchar *         gst_m3u8_client_get_uri             (GstM3U8Client * client);
+
+gchar *         gst_m3u8_client_get_current_uri     (GstM3U8Client * client);
+
+gboolean        gst_m3u8_client_has_variant_playlist (GstM3U8Client * client);
+
+gboolean        gst_m3u8_client_is_live             (GstM3U8Client * client);
+
+GList *         gst_m3u8_client_get_playlist_for_bitrate (GstM3U8Client * client,
+                                                          guint           bitrate);
+
+gboolean        gst_m3u8_client_get_seek_range      (GstM3U8Client * client,
+                                                     gint64        * start,
+                                                     gint64        * stop);
 
 G_END_DECLS
+
 #endif /* __M3U8_H__ */
diff --git a/ext/kate/Makefile.in b/ext/kate/Makefile.in
index 50bc58c..8fc3534 100644
--- a/ext/kate/Makefile.in
+++ b/ext/kate/Makefile.in
@@ -280,6 +280,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -317,6 +319,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -344,6 +348,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -362,6 +368,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -372,6 +380,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -397,6 +407,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -422,6 +434,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -553,6 +567,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -610,8 +626,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -681,6 +701,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/kate/gstkatedec.c b/ext/kate/gstkatedec.c
index 8748498..c61d514 100644
--- a/ext/kate/gstkatedec.c
+++ b/ext/kate/gstkatedec.c
@@ -61,14 +61,14 @@
  * <para>
  * This explicitely decodes a Kate stream:
  * <programlisting>
- * gst-launch filesrc location=test.ogg ! oggdemux ! katedec ! fakesink silent=TRUE
+ * gst-launch-1.0 filesrc location=test.ogg ! oggdemux ! katedec ! fakesink silent=TRUE
  * </programlisting>
  * </para>
  * <para>
  * This will automatically detect and use any Kate streams multiplexed
  * in an Ogg stream:
  * <programlisting>
- * gst-launch playbin uri=file:///tmp/test.ogg
+ * gst-launch-1.0 playbin uri=file:///tmp/test.ogg
  * </programlisting>
  * </para>
  * </refsect2>
diff --git a/ext/kate/gstkateenc.c b/ext/kate/gstkateenc.c
index 595868f..d88914a 100644
--- a/ext/kate/gstkateenc.c
+++ b/ext/kate/gstkateenc.c
@@ -62,7 +62,7 @@
  * <para>
  * This encodes a DVD SPU track to a Kate stream:
  * <programlisting>
- * gst-launch dvdreadsrc ! dvddemux ! dvdsubparse ! kateenc category=spu-subtitles ! oggmux ! filesink location=test.ogg
+ * gst-launch-1.0 dvdreadsrc ! dvddemux ! dvdsubparse ! kateenc category=spu-subtitles ! oggmux ! filesink location=test.ogg
  * </programlisting>
  * </para>
  * </refsect2>
@@ -791,12 +791,9 @@
   kbitmap = (kate_bitmap *) g_malloc (sizeof (kate_bitmap));
   kpalette = (kate_palette *) g_malloc (sizeof (kate_palette));
   if (!kregion || !kpalette || !kbitmap) {
-    if (kregion)
-      g_free (kregion);
-    if (kbitmap)
-      g_free (kbitmap);
-    if (kpalette)
-      g_free (kpalette);
+    g_free (kregion);
+    g_free (kbitmap);
+    g_free (kpalette);
     GST_ELEMENT_ERROR (ke, STREAM, ENCODE, (NULL), ("Out of memory"));
     return GST_FLOW_ERROR;
   }
diff --git a/ext/kate/gstkateparse.c b/ext/kate/gstkateparse.c
index 86657b8..99ea0c8 100644
--- a/ext/kate/gstkateparse.c
+++ b/ext/kate/gstkateparse.c
@@ -41,14 +41,14 @@
  * <title>Example pipelines</title>
  * <para>
  * <programlisting>
- * gst-launch -v filesrc location=kate.ogg ! oggdemux ! kateparse ! fakesink
+ * gst-launch-1.0 -v filesrc location=kate.ogg ! oggdemux ! kateparse ! fakesink
  * </programlisting>
  * This pipeline shows that the streamheader is set in the caps, and that each
  * buffer has the timestamp, duration, offset, and offset_end set.
  * </para>
  * <para>
  * <programlisting>
- * gst-launch filesrc location=kate.ogg ! oggdemux ! kateparse \
+ * gst-launch-1.0 filesrc location=kate.ogg ! oggdemux ! kateparse \
  *            ! oggmux ! filesink location=kate-remuxed.ogg
  * </programlisting>
  * This pipeline shows remuxing. kate-remuxed.ogg might not be exactly the same
diff --git a/ext/kate/gstkatespu.c b/ext/kate/gstkatespu.c
index bdf0dd8..b7838c1 100644
--- a/ext/kate/gstkatespu.c
+++ b/ext/kate/gstkatespu.c
@@ -911,7 +911,6 @@
 
 error:
   kate_tracker_clear (&kin);
-  if (bytes)
-    g_free (bytes);
+  g_free (bytes);
   return NULL;
 }
diff --git a/ext/kate/gstkatetag.c b/ext/kate/gstkatetag.c
index b7d88ed..e280917 100644
--- a/ext/kate/gstkatetag.c
+++ b/ext/kate/gstkatetag.c
@@ -44,20 +44,20 @@
  * </para>
  * <title>Example pipelines</title>
  * <para>
- * This element is only useful with gst-launch for modifying the language
+ * This element is only useful with gst-launch-1.0 for modifying the language
  * and/or category (which are properties of the stream located in the kate
  * beginning of stream header), because it does not support setting the tags
  * on a #GstTagSetter interface. Conceptually, the element will usually be
  * used like:
  * <programlisting>
- * gst-launch -v filesrc location=foo.ogg ! oggdemux ! katetag ! oggmux ! filesink location=bar.ogg
+ * gst-launch-1.0 -v filesrc location=foo.ogg ! oggdemux ! katetag ! oggmux ! filesink location=bar.ogg
  * </programlisting>
  * </para>
  * <para>
  * This pipeline will set the language and category of the stream to the
  * given values:
  * <programlisting>
- * gst-launch -v filesrc location=foo.ogg ! oggdemux ! katetag language=pt_BR category=subtitles ! oggmux ! filesink location=bar.ogg
+ * gst-launch-1.0 -v filesrc location=foo.ogg ! oggdemux ! katetag language=pt_BR category=subtitles ! oggmux ! filesink location=bar.ogg
  * </programlisting>
  * </para>
  * </refsect2>
diff --git a/ext/kate/gstkateutil.c b/ext/kate/gstkateutil.c
index 93777ab..cf1a2af 100644
--- a/ext/kate/gstkateutil.c
+++ b/ext/kate/gstkateutil.c
@@ -371,11 +371,9 @@
         }
 
         /* update properties */
-        if (decoder->language)
-          g_free (decoder->language);
+        g_free (decoder->language);
         decoder->language = g_strdup (decoder->k.ki->language);
-        if (decoder->category)
-          g_free (decoder->category);
+        g_free (decoder->category);
         decoder->category = g_strdup (decoder->k.ki->category);
         decoder->original_canvas_width = decoder->k.ki->original_canvas_width;
         decoder->original_canvas_height = decoder->k.ki->original_canvas_height;
diff --git a/ext/ladspa/Makefile.in b/ext/ladspa/Makefile.in
index ea14b1e..5b6ddaa 100644
--- a/ext/ladspa/Makefile.in
+++ b/ext/ladspa/Makefile.in
@@ -279,6 +279,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -316,6 +318,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -343,6 +347,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -361,6 +367,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -371,6 +379,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -396,6 +406,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -421,6 +433,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -552,6 +566,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -609,8 +625,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -680,6 +700,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/ladspa/gstladspa.c b/ext/ladspa/gstladspa.c
index 02bb179..df06693 100644
--- a/ext/ladspa/gstladspa.c
+++ b/ext/ladspa/gstladspa.c
@@ -37,9 +37,9 @@
  * |[
  * (padsp) listplugins
  * (padsp) analyseplugin cmt.so amp_mono
- * gst-launch -e filesrc location="$myfile" ! decodebin ! audioconvert ! audioresample ! "audio/x-raw,format=S16LE,rate=48000,channels=1" ! wavenc ! filesink location="testin.wav"
+ * gst-launch-1.0 -e filesrc location="$myfile" ! decodebin ! audioconvert ! audioresample ! "audio/x-raw,format=S16LE,rate=48000,channels=1" ! wavenc ! filesink location="testin.wav"
  * (padsp) applyplugin testin.wav testout.wav cmt.so amp_mono 2 
- * gst-launch playbin uri=file://"$PWD"/testout.wav
+ * gst-launch-1.0 playbin uri=file://"$PWD"/testout.wav
  * ]| Decode any audio file into wav with the format expected for the specific ladspa plugin to be applied, apply the ladspa filter and play it.
  * </refsect2>
  *
@@ -48,7 +48,7 @@
  * <refsect2>
  * <title>Example LADSPA line with this plugins</title>
  * |[
- * gst-launch autoaudiosrc ! ladspa-cmt-so-amp-mono gain=2 ! ladspa-caps-so-plate ! ladspa-tap-echo-so-tap-stereo-echo l-delay=500 r-haas-delay=500 ! tee name=myT myT. ! queue ! autoaudiosink myT. ! queue ! audioconvert ! goom ! videoconvert ! xvimagesink pixel-aspect-ratio=3/4
+ * gst-launch-1.0 autoaudiosrc ! ladspa-cmt-so-amp-mono gain=2 ! ladspa-caps-so-plate ! ladspa-tap-echo-so-tap-stereo-echo l-delay=500 r-haas-delay=500 ! tee name=myT myT. ! queue ! autoaudiosink myT. ! queue ! audioconvert ! goom ! videoconvert ! xvimagesink pixel-aspect-ratio=3/4
  * ]| Get audio input, filter it through CAPS Plate and TAP Stereo Echo, play it and show a visualization (recommended hearphones).
  * </refsect2>
  *
@@ -82,7 +82,7 @@
  * <refsect2>
  * <title>Example Filter/Effect/Audio/LADSPA line with this plugins</title>
  * |[
- * gst-launch filesrc location="$myfile" ! decodebin ! audioconvert ! audioresample ! ladspa-calf-so-reverb decay-time=15 high-frq-damp=20000 room-size=5 diffusion=1 wet-amount=2 dry-amount=2 pre-delay=50 bass-cut=20000 treble-cut=20000 ! ladspa-tap-echo-so-tap-stereo-echo l-delay=500 r-haas-delay=500 ! autoaudiosink
+ * gst-launch-1.0 filesrc location="$myfile" ! decodebin ! audioconvert ! audioresample ! ladspa-calf-so-reverb decay-time=15 high-frq-damp=20000 room-size=5 diffusion=1 wet-amount=2 dry-amount=2 pre-delay=50 bass-cut=20000 treble-cut=20000 ! ladspa-tap-echo-so-tap-stereo-echo l-delay=500 r-haas-delay=500 ! autoaudiosink
  * ]| Decode any audio file, filter it through Calf Reverb LADSPA then TAP Stereo Echo, and play it.
  * </refsect2>
  * </listitem>
@@ -90,19 +90,19 @@
  * <refsect2>
  * <title>Example Source/Audio/LADSPA line with this plugins</title>
  * |[
- * gst-launch ladspasrc-sine-so-sine-fcac frequency=220 amplitude=100 ! audioconvert ! autoaudiosink
+ * gst-launch-1.0 ladspasrc-sine-so-sine-fcac frequency=220 amplitude=100 ! audioconvert ! autoaudiosink
  * ]| Generate a sine wave with Sine Oscillator (Freq:control, Amp:control) and play it.
  * </refsect2>
  * <refsect2>
  * <title>Example Source/Audio/LADSPA line with this plugins</title>
  * |[
- * gst-launch ladspasrc-caps-so-click bpm=240 volume=1 ! autoaudiosink
+ * gst-launch-1.0 ladspasrc-caps-so-click bpm=240 volume=1 ! autoaudiosink
  * ]| Generate clicks with CAPS Click - Metronome at 240 beats per minute and play it.
  * </refsect2>
  * <refsect2>
  * <title>Example Source/Audio/LADSPA line with this plugins</title>
  * |[
- * gst-launch ladspasrc-random-1661-so-random-fcsc-oa ! ladspa-cmt-so-amp-mono gain=1.5 ! ladspa-caps-so-plate ! tee name=myT myT. ! queue ! autoaudiosink myT. ! queue ! audioconvert ! wavescope ! videoconvert ! autovideosink
+ * gst-launch-1.0 ladspasrc-random-1661-so-random-fcsc-oa ! ladspa-cmt-so-amp-mono gain=1.5 ! ladspa-caps-so-plate ! tee name=myT myT. ! queue ! autoaudiosink myT. ! queue ! audioconvert ! wavescope ! videoconvert ! autovideosink
  * ]| Generate random wave, filter it trhough Mono Amplifier and Versatile Plate Reverb, and play, while showing, it.
  * </refsect2>
  * </listitem>
@@ -110,7 +110,7 @@
  * <refsect2>
  * <title>Example Sink/Audio/LADSPA line with this plugins</title>
  * |[
- * gst-launch autoaudiosrc ! ladspa-cmt-so-amp-mono gain=2 ! ladspa-caps-so-plate ! ladspa-tap-echo-so-tap-stereo-echo l-delay=500 r-haas-delay=500 ! tee name=myT myT. ! audioconvert ! audioresample ! queue ! ladspasink-cmt-so-null-ai myT. ! audioconvert ! audioresample ! queue ! goom ! videoconvert ! xvimagesink pixel-aspect-ratio=3/4
+ * gst-launch-1.0 autoaudiosrc ! ladspa-cmt-so-amp-mono gain=2 ! ladspa-caps-so-plate ! ladspa-tap-echo-so-tap-stereo-echo l-delay=500 r-haas-delay=500 ! tee name=myT myT. ! audioconvert ! audioresample ! queue ! ladspasink-cmt-so-null-ai myT. ! audioconvert ! audioresample ! queue ! goom ! videoconvert ! xvimagesink pixel-aspect-ratio=3/4
  * ]| Get audio input, filter it trhough Mono Amplifier, CAPS Plate LADSPA and TAP Stereo Echo, explicitily anulate audio with Null (Audio Output), and play a visualization (recommended hearphones).
  * </refsect2>
  * </listitem>
diff --git a/ext/libde265/Makefile.in b/ext/libde265/Makefile.in
index 3229225..85817da 100644
--- a/ext/libde265/Makefile.in
+++ b/ext/libde265/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/libde265/libde265-dec.c b/ext/libde265/libde265-dec.c
index 7cba37a..e11f12c 100644
--- a/ext/libde265/libde265-dec.c
+++ b/ext/libde265/libde265-dec.c
@@ -41,58 +41,6 @@
 
 #include "libde265-dec.h"
 
-#if !GLIB_CHECK_VERSION(2, 36, 0)
-#include <stdio.h>
-#ifdef HAVE_UNISTD_H
-#include <unistd.h>
-#endif
-#ifdef G_OS_WIN32
-#include <windows.h>
-#endif
-#define g_get_num_processors gst_g_get_num_processors
-static guint
-gst_g_get_num_processors (void)
-{
-  guint threads = 0;
-
-#if defined(_SC_NPROC_ONLN)
-  threads = sysconf (_SC_NPROC_ONLN);
-#elif defined(_SC_NPROCESSORS_ONLN)
-  threads = sysconf (_SC_NPROCESSORS_ONLN);
-#elif defined(G_OS_WIN32)
-  {
-    SYSTEM_INFO sysinfo;
-    DWORD_PTR process_cpus;
-    DWORD_PTR system_cpus;
-
-    /* This *never* fails, but doesn't take CPU affinity into account */
-    GetSystemInfo (&sysinfo);
-    threads = (int) sysinfo.dwNumberOfProcessors;
-
-    /* This *can* fail, but produces correct results if affinity mask is used,
-     * unlike the simpler code above.
-     */
-    if (GetProcessAffinityMask (GetCurrentProcess (),
-            &process_cpus, &system_cpus)) {
-      unsigned int count;
-
-      for (count = 0; process_cpus != 0; process_cpus >>= 1)
-        if (process_cpus & 1)
-          count++;
-    }
-  }
-#else
-#warning "Don't know how to get number of CPU cores, will use the default thread count"
-  threads = DEFAULT_THREAD_COUNT;
-#endif
-
-  if (threads > 0)
-    return threads;
-
-  return 1;
-}
-#endif /* !GLIB_CHECK_VERSION(2, 36, 0) */
-
 /* use two decoder threads if no information about
  * available CPU cores can be retrieved */
 #define DEFAULT_THREAD_COUNT        2
diff --git a/ext/libmms/Makefile.in b/ext/libmms/Makefile.in
index 795abde..65540f5 100644
--- a/ext/libmms/Makefile.in
+++ b/ext/libmms/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/libmms/gstmms.c b/ext/libmms/gstmms.c
index 25938c8..5e3ff38 100644
--- a/ext/libmms/gstmms.c
+++ b/ext/libmms/gstmms.c
@@ -609,8 +609,7 @@
   }
 
   GST_OBJECT_LOCK (src);
-  if (src->uri_name)
-    g_free (src->uri_name);
+  g_free (src->uri_name);
   src->uri_name = fixed_uri;
   GST_OBJECT_UNLOCK (src);
 
diff --git a/ext/libvisual/Makefile.in b/ext/libvisual/Makefile.in
index 9e59264..7836d28 100644
--- a/ext/libvisual/Makefile.in
+++ b/ext/libvisual/Makefile.in
@@ -272,6 +272,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -309,6 +311,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -336,6 +340,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -354,6 +360,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -364,6 +372,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -389,6 +399,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -414,6 +426,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -545,6 +559,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -602,8 +618,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -673,6 +693,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/libvisual/visual-gl.c b/ext/libvisual/visual-gl.c
index 88b4419..85c91e0 100644
--- a/ext/libvisual/visual-gl.c
+++ b/ext/libvisual/visual-gl.c
@@ -27,7 +27,7 @@
  * <refsect2>
  * <title>Examples</title>
  * |[
- * gst-launch -v audiotestsrc ! libvisual_gl_lv_flower ! glimagesink
+ * gst-launch-1.0 -v audiotestsrc ! libvisual_gl_lv_flower ! glimagesink
  * ]|
  * </refsect2>
  */
diff --git a/ext/lv2/Makefile.in b/ext/lv2/Makefile.in
index 42eae42..37a0992 100644
--- a/ext/lv2/Makefile.in
+++ b/ext/lv2/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/mimic/Makefile.in b/ext/mimic/Makefile.in
index 72b3479..80c93ff 100644
--- a/ext/mimic/Makefile.in
+++ b/ext/mimic/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/modplug/Makefile.in b/ext/modplug/Makefile.in
index fc40634..1466db5 100644
--- a/ext/modplug/Makefile.in
+++ b/ext/modplug/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/mpeg2enc/Makefile.in b/ext/mpeg2enc/Makefile.in
index f304776..c4c10f0 100644
--- a/ext/mpeg2enc/Makefile.in
+++ b/ext/mpeg2enc/Makefile.in
@@ -278,6 +278,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -315,6 +317,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -342,6 +346,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -360,6 +366,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -370,6 +378,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -395,6 +405,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -420,6 +432,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -551,6 +565,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -608,8 +624,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -679,6 +699,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/mpeg2enc/gstmpeg2enc.cc b/ext/mpeg2enc/gstmpeg2enc.cc
index 9e631e3..bff4c70 100644
--- a/ext/mpeg2enc/gstmpeg2enc.cc
+++ b/ext/mpeg2enc/gstmpeg2enc.cc
@@ -34,7 +34,7 @@
  * <refsect2>
  * <title>Example pipeline</title>
  * |[
- * gst-launch-0.10 videotestsrc num-buffers=1000 ! mpeg2enc ! filesink location=videotestsrc.m1v
+ * gst-launch-1.0 videotestsrc num-buffers=1000 ! mpeg2enc ! filesink location=videotestsrc.m1v
  * ]| This example pipeline will encode a test video source to a an MPEG1
  * elementary stream (with Generic MPEG1 profile).
  * <para>
@@ -47,7 +47,7 @@
  * in the example above) allow most parameters to be adjusted.
  * </para>
  * |[
- * gst-launch-0.10 videotestsrc num-buffers=1000 ! videoscale ! mpeg2enc format=1 norm=p ! filesink location=videotestsrc.m1v
+ * gst-launch-1.0 videotestsrc num-buffers=1000 ! videoscale ! mpeg2enc format=1 norm=p ! filesink location=videotestsrc.m1v
  * ]| This will produce an MPEG1 profile stream according to VCD2.0 specifications
  * for PAL #GstMpeg2enc:norm (as the image height is dependent on video norm).
  * </refsect2>
diff --git a/ext/mpg123/Makefile.in b/ext/mpg123/Makefile.in
index f3494d8..e0f8f27 100644
--- a/ext/mpg123/Makefile.in
+++ b/ext/mpg123/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/mpg123/gstmpg123audiodec.c b/ext/mpg123/gstmpg123audiodec.c
index aa8598c..cfd017e 100644
--- a/ext/mpg123/gstmpg123audiodec.c
+++ b/ext/mpg123/gstmpg123audiodec.c
@@ -25,7 +25,7 @@
  * <refsect2>
  * <title>Example pipelines</title>
  * |[
- * gst-launch filesrc location=music.mp3 ! mpegaudioparse ! mpg123audiodec ! audioconvert ! audioresample ! autoaudiosink
+ * gst-launch-1.0 filesrc location=music.mp3 ! mpegaudioparse ! mpg123audiodec ! audioconvert ! audioresample ! autoaudiosink
  * ]| Decode and play the mp3 file
  * </refsect2>
  */
diff --git a/ext/mplex/Makefile.in b/ext/mplex/Makefile.in
index a7cf8d5..24c9190 100644
--- a/ext/mplex/Makefile.in
+++ b/ext/mplex/Makefile.in
@@ -278,6 +278,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -315,6 +317,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -342,6 +346,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -360,6 +366,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -370,6 +378,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -395,6 +405,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -420,6 +432,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -551,6 +565,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -608,8 +624,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -679,6 +699,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/mplex/gstmplex.cc b/ext/mplex/gstmplex.cc
index b109d18..ae50bea 100644
--- a/ext/mplex/gstmplex.cc
+++ b/ext/mplex/gstmplex.cc
@@ -35,7 +35,7 @@
  * <refsect2>
  * <title>Example pipeline</title>
  * |[
- * gst-launch -v videotestsrc num-buffers=1000 ! mpeg2enc ! mplex ! filesink location=videotestsrc.mpg
+ * gst-launch-1.0 -v videotestsrc num-buffers=1000 ! mpeg2enc ! mplex ! filesink location=videotestsrc.mpg
  * ]| This example pipeline will encode a test video source to an
  * MPEG1 elementary stream and multiplexes this to an MPEG system stream.
  * <para>
diff --git a/ext/musepack/Makefile.in b/ext/musepack/Makefile.in
index 466ad3a..e9dc694 100644
--- a/ext/musepack/Makefile.in
+++ b/ext/musepack/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/nas/Makefile.in b/ext/nas/Makefile.in
index 48706dd..a39a6cd 100644
--- a/ext/nas/Makefile.in
+++ b/ext/nas/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/neon/Makefile.in b/ext/neon/Makefile.in
index 80b7331..2aefd6d 100644
--- a/ext/neon/Makefile.in
+++ b/ext/neon/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/neon/gstneonhttpsrc.c b/ext/neon/gstneonhttpsrc.c
index e20b509..8a4ff0d 100644
--- a/ext/neon/gstneonhttpsrc.c
+++ b/ext/neon/gstneonhttpsrc.c
@@ -321,8 +321,7 @@
       break;
     }
     case PROP_USER_AGENT:
-      if (src->user_agent)
-        g_free (src->user_agent);
+      g_free (src->user_agent);
       src->user_agent = g_strdup (g_value_get_string (value));
       break;
     case PROP_COOKIES:
diff --git a/ext/ofa/Makefile.in b/ext/ofa/Makefile.in
index a67de80..cc260f5 100644
--- a/ext/ofa/Makefile.in
+++ b/ext/ofa/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/openal/Makefile.in b/ext/openal/Makefile.in
index 3bf3b97..2a64f94 100644
--- a/ext/openal/Makefile.in
+++ b/ext/openal/Makefile.in
@@ -279,6 +279,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -316,6 +318,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -343,6 +347,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -361,6 +367,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -371,6 +379,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -396,6 +406,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -421,6 +433,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -552,6 +566,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -609,8 +625,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -680,6 +700,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/openal/gstopenalsink.c b/ext/openal/gstopenalsink.c
index 1fa1c65..74f58e4 100644
--- a/ext/openal/gstopenalsink.c
+++ b/ext/openal/gstopenalsink.c
@@ -34,13 +34,13 @@
  * <refsect2>
  * <title>Example pipelines</title>
  * |[
- * gst-launch audiotestsrc ! audioconvert ! volume volume=0.5 ! openalsink
+ * gst-launch-1.0 audiotestsrc ! audioconvert ! volume volume=0.5 ! openalsink
  * ]| will play a sine wave (continuous beep sound) through OpenAL.
  * |[
- * gst-launch filesrc location=stream.wav ! decodebin ! audioconvert ! openalsink
+ * gst-launch-1.0 filesrc location=stream.wav ! decodebin ! audioconvert ! openalsink
  * ]| will play a wav audio file through OpenAL.
  * |[
- * gst-launch openalsrc ! "audio/x-raw,format=S16LE,rate=44100" ! audioconvert ! volume volume=0.25 ! openalsink
+ * gst-launch-1.0 openalsrc ! "audio/x-raw,format=S16LE,rate=44100" ! audioconvert ! volume volume=0.25 ! openalsink
  * ]| will capture and play audio through OpenAL.
  * </refsect2>
  */
diff --git a/ext/openal/gstopenalsrc.c b/ext/openal/gstopenalsrc.c
index ef48475..d06b3c4 100644
--- a/ext/openal/gstopenalsrc.c
+++ b/ext/openal/gstopenalsrc.c
@@ -57,10 +57,10 @@
  * <refsect2>
  * <title>Example pipelines</title>
  * |[
- * gst-launch -v openalsrc ! audioconvert ! wavenc ! filesink location=stream.wav
+ * gst-launch-1.0 -v openalsrc ! audioconvert ! wavenc ! filesink location=stream.wav
  * ]| * will capture sound through OpenAL and encode it to a wav file.
  * |[
- * gst-launch openalsrc ! "audio/x-raw,format=S16LE,rate=44100" ! audioconvert ! volume volume=0.25 ! openalsink
+ * gst-launch-1.0 openalsrc ! "audio/x-raw,format=S16LE,rate=44100" ! audioconvert ! volume volume=0.25 ! openalsink
  * ]| will capture and play audio through OpenAL.
  * </refsect2>
  */
diff --git a/ext/opencv/Makefile.am b/ext/opencv/Makefile.am
index 72472fb..0eee38c 100644
--- a/ext/opencv/Makefile.am
+++ b/ext/opencv/Makefile.am
@@ -2,24 +2,24 @@
 
 # sources used to compile this plug-in
 libgstopencv_la_SOURCES = gstopencv.cpp \
-			gstopencvvideofilter.c \
-			gstopencvutils.c \
-			gstcvdilate.c \
-			gstcvdilateerode.c \
-			gstcvequalizehist.c \
-			gstcverode.c \
-			gstcvlaplace.c \
-			gstcvsmooth.c \
-			gstcvsobel.c \
+			gstopencvvideofilter.cpp \
+			gstopencvutils.cpp \
+			gstcvdilate.cpp \
+			gstcvdilateerode.cpp \
+			gstcvequalizehist.cpp \
+			gstcverode.cpp \
+			gstcvlaplace.cpp \
+			gstcvsmooth.cpp \
+			gstcvsobel.cpp \
 			gstedgedetect.cpp \
 			gstfaceblur.cpp \
-			gsthanddetect.c \
-			gstpyramidsegment.c \
-			gsttemplatematch.c \
-			gsttextoverlay.c \
-			gstmotioncells.c \
-			gstskindetect.c \
-			gstretinex.c \
+			gsthanddetect.cpp \
+			gstpyramidsegment.cpp \
+			gsttemplatematch.cpp \
+			gsttextoverlay.cpp \
+			gstmotioncells.cpp \
+			gstskindetect.cpp \
+			gstretinex.cpp \
 			gstfacedetect.cpp \
 			gstsegmentation.cpp \
 			gstgrabcut.cpp \
@@ -27,7 +27,8 @@
 			motioncells_wrapper.cpp \
 			MotionCells.cpp
 
-libgstopencv_la_CXXFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CXXFLAGS) $(OPENCV_CFLAGS)
+libgstopencv_la_CXXFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CXXFLAGS) $(OPENCV_CFLAGS) \
+	-DGST_HAAR_CASCADES_DIR=\"$(pkgdatadir)/@GST_API_VERSION@/opencv_haarcascades\"
 
 # flags used to compile this facedetect
 # add other _CFLAGS and _LIBS as needed
@@ -36,7 +37,6 @@
 # OpenCV's define isn't good enough to avoid 'unused' gcc warnings (at v2.1.0)
 libgstopencv_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) \
 	$(GST_CFLAGS) $(OPENCV_CFLAGS) \
-	-DGST_HAAR_CASCADES_DIR=\"$(pkgdatadir)/@GST_API_VERSION@/opencv_haarcascades\" \
 	-DCV_INLINE="static inline" \
 	-DCV_NO_BACKWARD_COMPATIBILITY
 
diff --git a/ext/opencv/Makefile.in b/ext/opencv/Makefile.in
index 4e79c89..f26b480 100644
--- a/ext/opencv/Makefile.in
+++ b/ext/opencv/Makefile.in
@@ -214,24 +214,6 @@
 depcomp = $(SHELL) $(top_srcdir)/depcomp
 am__depfiles_maybe = depfiles
 am__mv = mv -f
-COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
-	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
-LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
-	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
-	$(AM_CFLAGS) $(CFLAGS)
-AM_V_CC = $(am__v_CC_@AM_V@)
-am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
-am__v_CC_0 = @echo "  CC      " $@;
-am__v_CC_1 = 
-CCLD = $(CC)
-LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
-	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
-	$(AM_LDFLAGS) $(LDFLAGS) -o $@
-AM_V_CCLD = $(am__v_CCLD_@AM_V@)
-am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
-am__v_CCLD_0 = @echo "  CCLD    " $@;
-am__v_CCLD_1 = 
 CXXCOMPILE = $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \
 	$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CXXFLAGS) $(CXXFLAGS)
 LTCXXCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CXX $(AM_LIBTOOLFLAGS) \
@@ -315,6 +297,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -352,6 +336,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -379,6 +365,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -397,6 +385,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -407,6 +397,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -432,6 +424,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -457,6 +451,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -588,6 +584,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -645,8 +643,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -716,6 +718,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -806,24 +809,24 @@
 
 # sources used to compile this plug-in
 libgstopencv_la_SOURCES = gstopencv.cpp \
-			gstopencvvideofilter.c \
-			gstopencvutils.c \
-			gstcvdilate.c \
-			gstcvdilateerode.c \
-			gstcvequalizehist.c \
-			gstcverode.c \
-			gstcvlaplace.c \
-			gstcvsmooth.c \
-			gstcvsobel.c \
+			gstopencvvideofilter.cpp \
+			gstopencvutils.cpp \
+			gstcvdilate.cpp \
+			gstcvdilateerode.cpp \
+			gstcvequalizehist.cpp \
+			gstcverode.cpp \
+			gstcvlaplace.cpp \
+			gstcvsmooth.cpp \
+			gstcvsobel.cpp \
 			gstedgedetect.cpp \
 			gstfaceblur.cpp \
-			gsthanddetect.c \
-			gstpyramidsegment.c \
-			gsttemplatematch.c \
-			gsttextoverlay.c \
-			gstmotioncells.c \
-			gstskindetect.c \
-			gstretinex.c \
+			gsthanddetect.cpp \
+			gstpyramidsegment.cpp \
+			gsttemplatematch.cpp \
+			gsttextoverlay.cpp \
+			gstmotioncells.cpp \
+			gstskindetect.cpp \
+			gstretinex.cpp \
 			gstfacedetect.cpp \
 			gstsegmentation.cpp \
 			gstgrabcut.cpp \
@@ -831,7 +834,9 @@
 			motioncells_wrapper.cpp \
 			MotionCells.cpp
 
-libgstopencv_la_CXXFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CXXFLAGS) $(OPENCV_CFLAGS)
+libgstopencv_la_CXXFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CXXFLAGS) $(OPENCV_CFLAGS) \
+	-DGST_HAAR_CASCADES_DIR=\"$(pkgdatadir)/@GST_API_VERSION@/opencv_haarcascades\"
+
 
 # flags used to compile this facedetect
 # add other _CFLAGS and _LIBS as needed
@@ -840,7 +845,6 @@
 # OpenCV's define isn't good enough to avoid 'unused' gcc warnings (at v2.1.0)
 libgstopencv_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) \
 	$(GST_CFLAGS) $(OPENCV_CFLAGS) \
-	-DGST_HAAR_CASCADES_DIR=\"$(pkgdatadir)/@GST_API_VERSION@/opencv_haarcascades\" \
 	-DCV_INLINE="static inline" \
 	-DCV_NO_BACKWARD_COMPATIBILITY
 
@@ -881,7 +885,7 @@
 all: all-am
 
 .SUFFIXES:
-.SUFFIXES: .c .cpp .lo .o .obj
+.SUFFIXES: .cpp .lo .o .obj
 $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
 	@for dep in $?; do \
 	  case '$(am__configure_deps)' in \
@@ -982,142 +986,6 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstopencv_la-gsttextoverlay.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstopencv_la-motioncells_wrapper.Plo@am__quote@
 
-.c.o:
-@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
-@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
-
-.c.obj:
-@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
-@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
-@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
-
-.c.lo:
-@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
-@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
-@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
-
-libgstopencv_la-gstopencvvideofilter.lo: gstopencvvideofilter.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -MT libgstopencv_la-gstopencvvideofilter.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstopencvvideofilter.Tpo -c -o libgstopencv_la-gstopencvvideofilter.lo `test -f 'gstopencvvideofilter.c' || echo '$(srcdir)/'`gstopencvvideofilter.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstopencvvideofilter.Tpo $(DEPDIR)/libgstopencv_la-gstopencvvideofilter.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstopencvvideofilter.c' object='libgstopencv_la-gstopencvvideofilter.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -c -o libgstopencv_la-gstopencvvideofilter.lo `test -f 'gstopencvvideofilter.c' || echo '$(srcdir)/'`gstopencvvideofilter.c
-
-libgstopencv_la-gstopencvutils.lo: gstopencvutils.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -MT libgstopencv_la-gstopencvutils.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstopencvutils.Tpo -c -o libgstopencv_la-gstopencvutils.lo `test -f 'gstopencvutils.c' || echo '$(srcdir)/'`gstopencvutils.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstopencvutils.Tpo $(DEPDIR)/libgstopencv_la-gstopencvutils.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstopencvutils.c' object='libgstopencv_la-gstopencvutils.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -c -o libgstopencv_la-gstopencvutils.lo `test -f 'gstopencvutils.c' || echo '$(srcdir)/'`gstopencvutils.c
-
-libgstopencv_la-gstcvdilate.lo: gstcvdilate.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -MT libgstopencv_la-gstcvdilate.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstcvdilate.Tpo -c -o libgstopencv_la-gstcvdilate.lo `test -f 'gstcvdilate.c' || echo '$(srcdir)/'`gstcvdilate.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstcvdilate.Tpo $(DEPDIR)/libgstopencv_la-gstcvdilate.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstcvdilate.c' object='libgstopencv_la-gstcvdilate.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -c -o libgstopencv_la-gstcvdilate.lo `test -f 'gstcvdilate.c' || echo '$(srcdir)/'`gstcvdilate.c
-
-libgstopencv_la-gstcvdilateerode.lo: gstcvdilateerode.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -MT libgstopencv_la-gstcvdilateerode.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstcvdilateerode.Tpo -c -o libgstopencv_la-gstcvdilateerode.lo `test -f 'gstcvdilateerode.c' || echo '$(srcdir)/'`gstcvdilateerode.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstcvdilateerode.Tpo $(DEPDIR)/libgstopencv_la-gstcvdilateerode.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstcvdilateerode.c' object='libgstopencv_la-gstcvdilateerode.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -c -o libgstopencv_la-gstcvdilateerode.lo `test -f 'gstcvdilateerode.c' || echo '$(srcdir)/'`gstcvdilateerode.c
-
-libgstopencv_la-gstcvequalizehist.lo: gstcvequalizehist.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -MT libgstopencv_la-gstcvequalizehist.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstcvequalizehist.Tpo -c -o libgstopencv_la-gstcvequalizehist.lo `test -f 'gstcvequalizehist.c' || echo '$(srcdir)/'`gstcvequalizehist.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstcvequalizehist.Tpo $(DEPDIR)/libgstopencv_la-gstcvequalizehist.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstcvequalizehist.c' object='libgstopencv_la-gstcvequalizehist.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -c -o libgstopencv_la-gstcvequalizehist.lo `test -f 'gstcvequalizehist.c' || echo '$(srcdir)/'`gstcvequalizehist.c
-
-libgstopencv_la-gstcverode.lo: gstcverode.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -MT libgstopencv_la-gstcverode.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstcverode.Tpo -c -o libgstopencv_la-gstcverode.lo `test -f 'gstcverode.c' || echo '$(srcdir)/'`gstcverode.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstcverode.Tpo $(DEPDIR)/libgstopencv_la-gstcverode.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstcverode.c' object='libgstopencv_la-gstcverode.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -c -o libgstopencv_la-gstcverode.lo `test -f 'gstcverode.c' || echo '$(srcdir)/'`gstcverode.c
-
-libgstopencv_la-gstcvlaplace.lo: gstcvlaplace.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -MT libgstopencv_la-gstcvlaplace.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstcvlaplace.Tpo -c -o libgstopencv_la-gstcvlaplace.lo `test -f 'gstcvlaplace.c' || echo '$(srcdir)/'`gstcvlaplace.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstcvlaplace.Tpo $(DEPDIR)/libgstopencv_la-gstcvlaplace.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstcvlaplace.c' object='libgstopencv_la-gstcvlaplace.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -c -o libgstopencv_la-gstcvlaplace.lo `test -f 'gstcvlaplace.c' || echo '$(srcdir)/'`gstcvlaplace.c
-
-libgstopencv_la-gstcvsmooth.lo: gstcvsmooth.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -MT libgstopencv_la-gstcvsmooth.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstcvsmooth.Tpo -c -o libgstopencv_la-gstcvsmooth.lo `test -f 'gstcvsmooth.c' || echo '$(srcdir)/'`gstcvsmooth.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstcvsmooth.Tpo $(DEPDIR)/libgstopencv_la-gstcvsmooth.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstcvsmooth.c' object='libgstopencv_la-gstcvsmooth.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -c -o libgstopencv_la-gstcvsmooth.lo `test -f 'gstcvsmooth.c' || echo '$(srcdir)/'`gstcvsmooth.c
-
-libgstopencv_la-gstcvsobel.lo: gstcvsobel.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -MT libgstopencv_la-gstcvsobel.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstcvsobel.Tpo -c -o libgstopencv_la-gstcvsobel.lo `test -f 'gstcvsobel.c' || echo '$(srcdir)/'`gstcvsobel.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstcvsobel.Tpo $(DEPDIR)/libgstopencv_la-gstcvsobel.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstcvsobel.c' object='libgstopencv_la-gstcvsobel.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -c -o libgstopencv_la-gstcvsobel.lo `test -f 'gstcvsobel.c' || echo '$(srcdir)/'`gstcvsobel.c
-
-libgstopencv_la-gsthanddetect.lo: gsthanddetect.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -MT libgstopencv_la-gsthanddetect.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gsthanddetect.Tpo -c -o libgstopencv_la-gsthanddetect.lo `test -f 'gsthanddetect.c' || echo '$(srcdir)/'`gsthanddetect.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gsthanddetect.Tpo $(DEPDIR)/libgstopencv_la-gsthanddetect.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gsthanddetect.c' object='libgstopencv_la-gsthanddetect.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -c -o libgstopencv_la-gsthanddetect.lo `test -f 'gsthanddetect.c' || echo '$(srcdir)/'`gsthanddetect.c
-
-libgstopencv_la-gstpyramidsegment.lo: gstpyramidsegment.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -MT libgstopencv_la-gstpyramidsegment.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstpyramidsegment.Tpo -c -o libgstopencv_la-gstpyramidsegment.lo `test -f 'gstpyramidsegment.c' || echo '$(srcdir)/'`gstpyramidsegment.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstpyramidsegment.Tpo $(DEPDIR)/libgstopencv_la-gstpyramidsegment.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstpyramidsegment.c' object='libgstopencv_la-gstpyramidsegment.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -c -o libgstopencv_la-gstpyramidsegment.lo `test -f 'gstpyramidsegment.c' || echo '$(srcdir)/'`gstpyramidsegment.c
-
-libgstopencv_la-gsttemplatematch.lo: gsttemplatematch.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -MT libgstopencv_la-gsttemplatematch.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gsttemplatematch.Tpo -c -o libgstopencv_la-gsttemplatematch.lo `test -f 'gsttemplatematch.c' || echo '$(srcdir)/'`gsttemplatematch.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gsttemplatematch.Tpo $(DEPDIR)/libgstopencv_la-gsttemplatematch.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gsttemplatematch.c' object='libgstopencv_la-gsttemplatematch.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -c -o libgstopencv_la-gsttemplatematch.lo `test -f 'gsttemplatematch.c' || echo '$(srcdir)/'`gsttemplatematch.c
-
-libgstopencv_la-gsttextoverlay.lo: gsttextoverlay.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -MT libgstopencv_la-gsttextoverlay.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gsttextoverlay.Tpo -c -o libgstopencv_la-gsttextoverlay.lo `test -f 'gsttextoverlay.c' || echo '$(srcdir)/'`gsttextoverlay.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gsttextoverlay.Tpo $(DEPDIR)/libgstopencv_la-gsttextoverlay.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gsttextoverlay.c' object='libgstopencv_la-gsttextoverlay.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -c -o libgstopencv_la-gsttextoverlay.lo `test -f 'gsttextoverlay.c' || echo '$(srcdir)/'`gsttextoverlay.c
-
-libgstopencv_la-gstmotioncells.lo: gstmotioncells.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -MT libgstopencv_la-gstmotioncells.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstmotioncells.Tpo -c -o libgstopencv_la-gstmotioncells.lo `test -f 'gstmotioncells.c' || echo '$(srcdir)/'`gstmotioncells.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstmotioncells.Tpo $(DEPDIR)/libgstopencv_la-gstmotioncells.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstmotioncells.c' object='libgstopencv_la-gstmotioncells.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -c -o libgstopencv_la-gstmotioncells.lo `test -f 'gstmotioncells.c' || echo '$(srcdir)/'`gstmotioncells.c
-
-libgstopencv_la-gstskindetect.lo: gstskindetect.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -MT libgstopencv_la-gstskindetect.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstskindetect.Tpo -c -o libgstopencv_la-gstskindetect.lo `test -f 'gstskindetect.c' || echo '$(srcdir)/'`gstskindetect.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstskindetect.Tpo $(DEPDIR)/libgstopencv_la-gstskindetect.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstskindetect.c' object='libgstopencv_la-gstskindetect.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -c -o libgstopencv_la-gstskindetect.lo `test -f 'gstskindetect.c' || echo '$(srcdir)/'`gstskindetect.c
-
-libgstopencv_la-gstretinex.lo: gstretinex.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -MT libgstopencv_la-gstretinex.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstretinex.Tpo -c -o libgstopencv_la-gstretinex.lo `test -f 'gstretinex.c' || echo '$(srcdir)/'`gstretinex.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstretinex.Tpo $(DEPDIR)/libgstopencv_la-gstretinex.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstretinex.c' object='libgstopencv_la-gstretinex.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CFLAGS) $(CFLAGS) -c -o libgstopencv_la-gstretinex.lo `test -f 'gstretinex.c' || echo '$(srcdir)/'`gstretinex.c
-
 .cpp.o:
 @am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
 @am__fastdepCXX_TRUE@	$(CXXCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
@@ -1149,6 +1017,69 @@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstopencv_la-gstopencv.lo `test -f 'gstopencv.cpp' || echo '$(srcdir)/'`gstopencv.cpp
 
+libgstopencv_la-gstopencvvideofilter.lo: gstopencvvideofilter.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -MT libgstopencv_la-gstopencvvideofilter.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstopencvvideofilter.Tpo -c -o libgstopencv_la-gstopencvvideofilter.lo `test -f 'gstopencvvideofilter.cpp' || echo '$(srcdir)/'`gstopencvvideofilter.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstopencvvideofilter.Tpo $(DEPDIR)/libgstopencv_la-gstopencvvideofilter.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gstopencvvideofilter.cpp' object='libgstopencv_la-gstopencvvideofilter.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstopencv_la-gstopencvvideofilter.lo `test -f 'gstopencvvideofilter.cpp' || echo '$(srcdir)/'`gstopencvvideofilter.cpp
+
+libgstopencv_la-gstopencvutils.lo: gstopencvutils.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -MT libgstopencv_la-gstopencvutils.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstopencvutils.Tpo -c -o libgstopencv_la-gstopencvutils.lo `test -f 'gstopencvutils.cpp' || echo '$(srcdir)/'`gstopencvutils.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstopencvutils.Tpo $(DEPDIR)/libgstopencv_la-gstopencvutils.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gstopencvutils.cpp' object='libgstopencv_la-gstopencvutils.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstopencv_la-gstopencvutils.lo `test -f 'gstopencvutils.cpp' || echo '$(srcdir)/'`gstopencvutils.cpp
+
+libgstopencv_la-gstcvdilate.lo: gstcvdilate.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -MT libgstopencv_la-gstcvdilate.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstcvdilate.Tpo -c -o libgstopencv_la-gstcvdilate.lo `test -f 'gstcvdilate.cpp' || echo '$(srcdir)/'`gstcvdilate.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstcvdilate.Tpo $(DEPDIR)/libgstopencv_la-gstcvdilate.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gstcvdilate.cpp' object='libgstopencv_la-gstcvdilate.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstopencv_la-gstcvdilate.lo `test -f 'gstcvdilate.cpp' || echo '$(srcdir)/'`gstcvdilate.cpp
+
+libgstopencv_la-gstcvdilateerode.lo: gstcvdilateerode.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -MT libgstopencv_la-gstcvdilateerode.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstcvdilateerode.Tpo -c -o libgstopencv_la-gstcvdilateerode.lo `test -f 'gstcvdilateerode.cpp' || echo '$(srcdir)/'`gstcvdilateerode.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstcvdilateerode.Tpo $(DEPDIR)/libgstopencv_la-gstcvdilateerode.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gstcvdilateerode.cpp' object='libgstopencv_la-gstcvdilateerode.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstopencv_la-gstcvdilateerode.lo `test -f 'gstcvdilateerode.cpp' || echo '$(srcdir)/'`gstcvdilateerode.cpp
+
+libgstopencv_la-gstcvequalizehist.lo: gstcvequalizehist.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -MT libgstopencv_la-gstcvequalizehist.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstcvequalizehist.Tpo -c -o libgstopencv_la-gstcvequalizehist.lo `test -f 'gstcvequalizehist.cpp' || echo '$(srcdir)/'`gstcvequalizehist.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstcvequalizehist.Tpo $(DEPDIR)/libgstopencv_la-gstcvequalizehist.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gstcvequalizehist.cpp' object='libgstopencv_la-gstcvequalizehist.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstopencv_la-gstcvequalizehist.lo `test -f 'gstcvequalizehist.cpp' || echo '$(srcdir)/'`gstcvequalizehist.cpp
+
+libgstopencv_la-gstcverode.lo: gstcverode.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -MT libgstopencv_la-gstcverode.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstcverode.Tpo -c -o libgstopencv_la-gstcverode.lo `test -f 'gstcverode.cpp' || echo '$(srcdir)/'`gstcverode.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstcverode.Tpo $(DEPDIR)/libgstopencv_la-gstcverode.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gstcverode.cpp' object='libgstopencv_la-gstcverode.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstopencv_la-gstcverode.lo `test -f 'gstcverode.cpp' || echo '$(srcdir)/'`gstcverode.cpp
+
+libgstopencv_la-gstcvlaplace.lo: gstcvlaplace.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -MT libgstopencv_la-gstcvlaplace.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstcvlaplace.Tpo -c -o libgstopencv_la-gstcvlaplace.lo `test -f 'gstcvlaplace.cpp' || echo '$(srcdir)/'`gstcvlaplace.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstcvlaplace.Tpo $(DEPDIR)/libgstopencv_la-gstcvlaplace.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gstcvlaplace.cpp' object='libgstopencv_la-gstcvlaplace.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstopencv_la-gstcvlaplace.lo `test -f 'gstcvlaplace.cpp' || echo '$(srcdir)/'`gstcvlaplace.cpp
+
+libgstopencv_la-gstcvsmooth.lo: gstcvsmooth.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -MT libgstopencv_la-gstcvsmooth.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstcvsmooth.Tpo -c -o libgstopencv_la-gstcvsmooth.lo `test -f 'gstcvsmooth.cpp' || echo '$(srcdir)/'`gstcvsmooth.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstcvsmooth.Tpo $(DEPDIR)/libgstopencv_la-gstcvsmooth.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gstcvsmooth.cpp' object='libgstopencv_la-gstcvsmooth.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstopencv_la-gstcvsmooth.lo `test -f 'gstcvsmooth.cpp' || echo '$(srcdir)/'`gstcvsmooth.cpp
+
+libgstopencv_la-gstcvsobel.lo: gstcvsobel.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -MT libgstopencv_la-gstcvsobel.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstcvsobel.Tpo -c -o libgstopencv_la-gstcvsobel.lo `test -f 'gstcvsobel.cpp' || echo '$(srcdir)/'`gstcvsobel.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstcvsobel.Tpo $(DEPDIR)/libgstopencv_la-gstcvsobel.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gstcvsobel.cpp' object='libgstopencv_la-gstcvsobel.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstopencv_la-gstcvsobel.lo `test -f 'gstcvsobel.cpp' || echo '$(srcdir)/'`gstcvsobel.cpp
+
 libgstopencv_la-gstedgedetect.lo: gstedgedetect.cpp
 @am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -MT libgstopencv_la-gstedgedetect.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstedgedetect.Tpo -c -o libgstopencv_la-gstedgedetect.lo `test -f 'gstedgedetect.cpp' || echo '$(srcdir)/'`gstedgedetect.cpp
 @am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstedgedetect.Tpo $(DEPDIR)/libgstopencv_la-gstedgedetect.Plo
@@ -1163,6 +1094,55 @@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstopencv_la-gstfaceblur.lo `test -f 'gstfaceblur.cpp' || echo '$(srcdir)/'`gstfaceblur.cpp
 
+libgstopencv_la-gsthanddetect.lo: gsthanddetect.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -MT libgstopencv_la-gsthanddetect.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gsthanddetect.Tpo -c -o libgstopencv_la-gsthanddetect.lo `test -f 'gsthanddetect.cpp' || echo '$(srcdir)/'`gsthanddetect.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gsthanddetect.Tpo $(DEPDIR)/libgstopencv_la-gsthanddetect.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gsthanddetect.cpp' object='libgstopencv_la-gsthanddetect.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstopencv_la-gsthanddetect.lo `test -f 'gsthanddetect.cpp' || echo '$(srcdir)/'`gsthanddetect.cpp
+
+libgstopencv_la-gstpyramidsegment.lo: gstpyramidsegment.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -MT libgstopencv_la-gstpyramidsegment.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstpyramidsegment.Tpo -c -o libgstopencv_la-gstpyramidsegment.lo `test -f 'gstpyramidsegment.cpp' || echo '$(srcdir)/'`gstpyramidsegment.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstpyramidsegment.Tpo $(DEPDIR)/libgstopencv_la-gstpyramidsegment.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gstpyramidsegment.cpp' object='libgstopencv_la-gstpyramidsegment.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstopencv_la-gstpyramidsegment.lo `test -f 'gstpyramidsegment.cpp' || echo '$(srcdir)/'`gstpyramidsegment.cpp
+
+libgstopencv_la-gsttemplatematch.lo: gsttemplatematch.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -MT libgstopencv_la-gsttemplatematch.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gsttemplatematch.Tpo -c -o libgstopencv_la-gsttemplatematch.lo `test -f 'gsttemplatematch.cpp' || echo '$(srcdir)/'`gsttemplatematch.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gsttemplatematch.Tpo $(DEPDIR)/libgstopencv_la-gsttemplatematch.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gsttemplatematch.cpp' object='libgstopencv_la-gsttemplatematch.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstopencv_la-gsttemplatematch.lo `test -f 'gsttemplatematch.cpp' || echo '$(srcdir)/'`gsttemplatematch.cpp
+
+libgstopencv_la-gsttextoverlay.lo: gsttextoverlay.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -MT libgstopencv_la-gsttextoverlay.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gsttextoverlay.Tpo -c -o libgstopencv_la-gsttextoverlay.lo `test -f 'gsttextoverlay.cpp' || echo '$(srcdir)/'`gsttextoverlay.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gsttextoverlay.Tpo $(DEPDIR)/libgstopencv_la-gsttextoverlay.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gsttextoverlay.cpp' object='libgstopencv_la-gsttextoverlay.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstopencv_la-gsttextoverlay.lo `test -f 'gsttextoverlay.cpp' || echo '$(srcdir)/'`gsttextoverlay.cpp
+
+libgstopencv_la-gstmotioncells.lo: gstmotioncells.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -MT libgstopencv_la-gstmotioncells.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstmotioncells.Tpo -c -o libgstopencv_la-gstmotioncells.lo `test -f 'gstmotioncells.cpp' || echo '$(srcdir)/'`gstmotioncells.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstmotioncells.Tpo $(DEPDIR)/libgstopencv_la-gstmotioncells.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gstmotioncells.cpp' object='libgstopencv_la-gstmotioncells.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstopencv_la-gstmotioncells.lo `test -f 'gstmotioncells.cpp' || echo '$(srcdir)/'`gstmotioncells.cpp
+
+libgstopencv_la-gstskindetect.lo: gstskindetect.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -MT libgstopencv_la-gstskindetect.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstskindetect.Tpo -c -o libgstopencv_la-gstskindetect.lo `test -f 'gstskindetect.cpp' || echo '$(srcdir)/'`gstskindetect.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstskindetect.Tpo $(DEPDIR)/libgstopencv_la-gstskindetect.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gstskindetect.cpp' object='libgstopencv_la-gstskindetect.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstopencv_la-gstskindetect.lo `test -f 'gstskindetect.cpp' || echo '$(srcdir)/'`gstskindetect.cpp
+
+libgstopencv_la-gstretinex.lo: gstretinex.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -MT libgstopencv_la-gstretinex.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstretinex.Tpo -c -o libgstopencv_la-gstretinex.lo `test -f 'gstretinex.cpp' || echo '$(srcdir)/'`gstretinex.cpp
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstretinex.Tpo $(DEPDIR)/libgstopencv_la-gstretinex.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gstretinex.cpp' object='libgstopencv_la-gstretinex.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstopencv_la-gstretinex.lo `test -f 'gstretinex.cpp' || echo '$(srcdir)/'`gstretinex.cpp
+
 libgstopencv_la-gstfacedetect.lo: gstfacedetect.cpp
 @am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstopencv_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstopencv_la_CXXFLAGS) $(CXXFLAGS) -MT libgstopencv_la-gstfacedetect.lo -MD -MP -MF $(DEPDIR)/libgstopencv_la-gstfacedetect.Tpo -c -o libgstopencv_la-gstfacedetect.lo `test -f 'gstfacedetect.cpp' || echo '$(srcdir)/'`gstfacedetect.cpp
 @am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstopencv_la-gstfacedetect.Tpo $(DEPDIR)/libgstopencv_la-gstfacedetect.Plo
diff --git a/ext/opencv/MotionCells.cpp b/ext/opencv/MotionCells.cpp
index eaa013f..9a16176 100644
--- a/ext/opencv/MotionCells.cpp
+++ b/ext/opencv/MotionCells.cpp
@@ -49,10 +49,7 @@
 //#endif
 #endif
 
-#include <cstdlib>
 #include <errno.h>
-#include <math.h>
-#include <gst/gst.h>
 #include "MotionCells.h"
 #include <opencv2/imgproc/imgproc_c.h>
 
diff --git a/ext/opencv/MotionCells.h b/ext/opencv/MotionCells.h
index 41bb9c7..97137bb 100644
--- a/ext/opencv/MotionCells.h
+++ b/ext/opencv/MotionCells.h
@@ -52,11 +52,8 @@
 #ifdef HAVE_OPENCV2_HIGHGUI_HIGHGUI_C_H
 #include <opencv2/highgui/highgui_c.h>            // includes highGUI definitions
 #endif
-#include <iostream>
 #include <fstream>
 #include <vector>
-#include <cstdio>
-#include <cmath>
 #include <glib.h>
 
 //MotionCells defines
diff --git a/ext/opencv/gstcvdilate.c b/ext/opencv/gstcvdilate.cpp
similarity index 86%
rename from ext/opencv/gstcvdilate.c
rename to ext/opencv/gstcvdilate.cpp
index da0713d..bc6b032 100644
--- a/ext/opencv/gstcvdilate.c
+++ b/ext/opencv/gstcvdilate.cpp
@@ -1,7 +1,7 @@
 /*
  * GStreamer
  * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -41,12 +41,23 @@
  * Boston, MA 02110-1301, USA.
  */
 
+/**
+ * SECTION:element-cvdilate
+ *
+ * Dilates the image with the cvDilate OpenCV function.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 videotestsrc ! cvdilate ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
+
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
 #endif
 
-#include <gst/gst.h>
-
 #include "gstcvdilate.h"
 #include <opencv2/imgproc/imgproc_c.h>
 
@@ -57,8 +68,6 @@
 
 static GstFlowReturn gst_cv_dilate_transform_ip (GstOpencvVideoFilter *
     filter, GstBuffer * buf, IplImage * img);
-static GstFlowReturn gst_cv_dilate_transform (GstOpencvVideoFilter * filter,
-    GstBuffer * buf, IplImage * img, GstBuffer * outbuf, IplImage * outimg);
 
 /* initialize the cvdilate's class */
 static void
@@ -70,7 +79,6 @@
   gstopencvbasefilter_class = (GstOpencvVideoFilterClass *) klass;
 
   gstopencvbasefilter_class->cv_trans_ip_func = gst_cv_dilate_transform_ip;
-  gstopencvbasefilter_class->cv_trans_func = gst_cv_dilate_transform;
   gst_element_class_set_static_metadata (element_class,
       "cvdilate",
       "Transform/Effect/Video",
@@ -89,18 +97,6 @@
 }
 
 static GstFlowReturn
-gst_cv_dilate_transform (GstOpencvVideoFilter * base, GstBuffer * buf,
-    IplImage * img, GstBuffer * outbuf, IplImage * outimg)
-{
-  GstCvDilateErode *filter = GST_CV_DILATE_ERODE (base);
-
-  /* TODO support kernel as a parameter */
-  cvDilate (img, outimg, NULL, filter->iterations);
-
-  return GST_FLOW_OK;
-}
-
-static GstFlowReturn
 gst_cv_dilate_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf,
     IplImage * img)
 {
diff --git a/ext/opencv/gstcvdilateerode.c b/ext/opencv/gstcvdilateerode.cpp
similarity index 96%
rename from ext/opencv/gstcvdilateerode.c
rename to ext/opencv/gstcvdilateerode.cpp
index 13342ab..69a4169 100644
--- a/ext/opencv/gstcvdilateerode.c
+++ b/ext/opencv/gstcvdilateerode.cpp
@@ -1,7 +1,7 @@
 /*
  * GStreamer
  * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -50,8 +50,6 @@
 #  include <config.h>
 #endif
 
-#include <gst/gst.h>
-
 #include "gstopencvutils.h"
 #include "gstcvdilateerode.h"
 
@@ -131,7 +129,8 @@
   g_object_class_install_property (gobject_class, PROP_ITERATIONS,
       g_param_spec_int ("iterations", "iterations",
           "Number of iterations to run the algorithm", 1, G_MAXINT,
-          DEFAULT_ITERATIONS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          DEFAULT_ITERATIONS,
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   /* add sink and source pad templates */
   caps = gst_opencv_caps_from_cv_image_type (CV_16UC1);
@@ -155,7 +154,8 @@
     GstCvDilateErodeClass * gclass)
 {
   filter->iterations = DEFAULT_ITERATIONS;
-  gst_base_transform_set_in_place (GST_BASE_TRANSFORM (filter), TRUE);
+  gst_opencv_video_filter_set_in_place (GST_OPENCV_VIDEO_FILTER_CAST (filter),
+      TRUE);
 }
 
 static void
diff --git a/ext/opencv/gstcvdilateerode.h b/ext/opencv/gstcvdilateerode.h
index 94425f5..bd2aa7c 100644
--- a/ext/opencv/gstcvdilateerode.h
+++ b/ext/opencv/gstcvdilateerode.h
@@ -1,7 +1,7 @@
 /*
  * GStreamer
  * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -44,8 +44,6 @@
 #ifndef __GST_CV_DILATE_ERODE_H__
 #define __GST_CV_DILATE_ERODE_H__
 
-#include <gst/gst.h>
-
 #include <gstopencvvideofilter.h>
 
 G_BEGIN_DECLS
@@ -72,7 +70,7 @@
   gint iterations;
 };
 
-struct _GstCvDilateErodeClass 
+struct _GstCvDilateErodeClass
 {
   GstOpencvVideoFilterClass parent_class;
 };
diff --git a/ext/opencv/gstcvequalizehist.c b/ext/opencv/gstcvequalizehist.cpp
similarity index 90%
rename from ext/opencv/gstcvequalizehist.c
rename to ext/opencv/gstcvequalizehist.cpp
index 7384df1..ea1db28 100644
--- a/ext/opencv/gstcvequalizehist.c
+++ b/ext/opencv/gstcvequalizehist.cpp
@@ -1,7 +1,7 @@
 /*
  * GStreamer
  * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -41,13 +41,25 @@
  * Boston, MA 02110-1301, USA.
  */
 
+/**
+ * SECTION:element-cvequalizehist
+ *
+ * Equalizes the histogram of a grayscale image with the cvEqualizeHist OpenCV
+ * function.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 videotestsrc pattern=23 ! cvequalizehist ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
+
+
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
 #endif
 
-#include <gst/gst.h>
-
-#include "gstopencvutils.h"
 #include "gstcvequalizehist.h"
 #include <opencv2/imgproc/imgproc_c.h>
 
@@ -96,7 +108,8 @@
 static void
 gst_cv_equalize_hist_init (GstCvEqualizeHist * filter)
 {
-  gst_base_transform_set_in_place (GST_BASE_TRANSFORM (filter), FALSE);
+  gst_opencv_video_filter_set_in_place (GST_OPENCV_VIDEO_FILTER_CAST (filter),
+      FALSE);
 }
 
 static GstFlowReturn
diff --git a/ext/opencv/gstcvequalizehist.h b/ext/opencv/gstcvequalizehist.h
index d1d600d..c185994 100644
--- a/ext/opencv/gstcvequalizehist.h
+++ b/ext/opencv/gstcvequalizehist.h
@@ -1,7 +1,7 @@
 /*
  * GStreamer
  * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -44,8 +44,6 @@
 #ifndef __GST_CV_EQUALIZE_HIST_H__
 #define __GST_CV_EQUALIZE_HIST_H__
 
-#include <gst/gst.h>
-
 #include <gstopencvvideofilter.h>
 
 G_BEGIN_DECLS
@@ -70,7 +68,7 @@
   GstOpencvVideoFilter element;
 };
 
-struct _GstCvEqualizeHistClass 
+struct _GstCvEqualizeHistClass
 {
   GstOpencvVideoFilterClass parent_class;
 };
diff --git a/ext/opencv/gstcverode.c b/ext/opencv/gstcverode.cpp
similarity index 86%
rename from ext/opencv/gstcverode.c
rename to ext/opencv/gstcverode.cpp
index 4c62624..39b72be 100644
--- a/ext/opencv/gstcverode.c
+++ b/ext/opencv/gstcverode.cpp
@@ -1,7 +1,7 @@
 /*
  * GStreamer
  * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -41,12 +41,23 @@
  * Boston, MA 02110-1301, USA.
  */
 
+/**
+ * SECTION:element-cverode
+ *
+ * Erodes the image with the cvErode OpenCV function.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 videotestsrc ! cverode ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
+
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
 #endif
 
-#include <gst/gst.h>
-
 #include "gstcverode.h"
 #include <opencv2/imgproc/imgproc_c.h>
 
@@ -57,8 +68,6 @@
 
 static GstFlowReturn gst_cv_erode_transform_ip (GstOpencvVideoFilter *
     filter, GstBuffer * buf, IplImage * img);
-static GstFlowReturn gst_cv_erode_transform (GstOpencvVideoFilter * filter,
-    GstBuffer * buf, IplImage * img, GstBuffer * outbuf, IplImage * outimg);
 
 /* initialize the cverode's class */
 static void
@@ -70,7 +79,6 @@
   gstopencvbasefilter_class = (GstOpencvVideoFilterClass *) klass;
 
   gstopencvbasefilter_class->cv_trans_ip_func = gst_cv_erode_transform_ip;
-  gstopencvbasefilter_class->cv_trans_func = gst_cv_erode_transform;
   gst_element_class_set_static_metadata (element_class,
       "cverode",
       "Transform/Effect/Video",
@@ -89,18 +97,6 @@
 }
 
 static GstFlowReturn
-gst_cv_erode_transform (GstOpencvVideoFilter * base, GstBuffer * buf,
-    IplImage * img, GstBuffer * outbuf, IplImage * outimg)
-{
-  GstCvDilateErode *filter = GST_CV_DILATE_ERODE (base);
-
-  /* TODO support kernel as a parameter */
-  cvErode (img, outimg, NULL, filter->iterations);
-
-  return GST_FLOW_OK;
-}
-
-static GstFlowReturn
 gst_cv_erode_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf,
     IplImage * img)
 {
diff --git a/ext/opencv/gstcvlaplace.c b/ext/opencv/gstcvlaplace.cpp
similarity index 85%
rename from ext/opencv/gstcvlaplace.c
rename to ext/opencv/gstcvlaplace.cpp
index 5b95618..04cd575 100644
--- a/ext/opencv/gstcvlaplace.c
+++ b/ext/opencv/gstcvlaplace.cpp
@@ -1,7 +1,7 @@
 /*
  * GStreamer
  * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -41,13 +41,23 @@
  * Boston, MA 02110-1301, USA.
  */
 
+/**
+ * SECTION:element-cvlaplace
+ *
+ * Applies cvLaplace OpenCV function to the image.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 videotestsrc ! cvlaplace ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
+
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
 #endif
 
-#include <gst/gst.h>
-
-#include "gstopencvutils.h"
 #include "gstcvlaplace.h"
 #include <opencv2/imgproc/imgproc_c.h>
 
@@ -83,10 +93,14 @@
 enum
 {
   PROP_0,
-  PROP_APERTURE_SIZE
+  PROP_APERTURE_SIZE,
+  PROP_SCALE,
+  PROP_SHIFT
 };
 
 #define DEFAULT_APERTURE_SIZE 3
+#define DEFAULT_SCALE_FACTOR 1.0
+#define DEFAULT_SHIFT 0.0
 
 G_DEFINE_TYPE (GstCvLaplace, gst_cv_laplace, GST_TYPE_OPENCV_VIDEO_FILTER);
 
@@ -142,7 +156,15 @@
   g_object_class_install_property (gobject_class, PROP_APERTURE_SIZE,
       g_param_spec_int ("aperture-size", "aperture size",
           "Size of the extended Laplace Kernel (1, 3, 5 or 7)", 1, 7,
-          DEFAULT_APERTURE_SIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          DEFAULT_APERTURE_SIZE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
+  g_object_class_install_property (gobject_class, PROP_SCALE,
+      g_param_spec_double ("scale", "scale factor",
+          "Scale factor", 0.0, G_MAXDOUBLE,
+          DEFAULT_SCALE_FACTOR, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
+  g_object_class_install_property (gobject_class, PROP_SHIFT,
+      g_param_spec_double ("shift", "Shift",
+          "Value added to the scaled source array elements", 0.0, G_MAXDOUBLE,
+          DEFAULT_SHIFT, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   gst_element_class_add_pad_template (element_class,
       gst_static_pad_template_get (&src_factory));
@@ -160,8 +182,11 @@
 gst_cv_laplace_init (GstCvLaplace * filter)
 {
   filter->aperture_size = DEFAULT_APERTURE_SIZE;
+  filter->scale = DEFAULT_SCALE_FACTOR;
+  filter->shift = DEFAULT_SHIFT;
 
-  gst_base_transform_set_in_place (GST_BASE_TRANSFORM (filter), FALSE);
+  gst_opencv_video_filter_set_in_place (GST_OPENCV_VIDEO_FILTER_CAST (filter),
+      FALSE);
 }
 
 static gboolean
@@ -200,7 +225,7 @@
   GstCaps *templ;
   GstStructure *structure;
   GstPad *other;
-  gint i;
+  guint i;
 
   to = gst_caps_new_empty ();
 
@@ -277,6 +302,12 @@
         filter->aperture_size = g_value_get_int (value);
     }
       break;
+    case PROP_SCALE:
+      filter->scale = g_value_get_double (value);
+      break;
+    case PROP_SHIFT:
+      filter->shift = g_value_get_double (value);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -293,6 +324,12 @@
     case PROP_APERTURE_SIZE:
       g_value_set_int (value, filter->aperture_size);
       break;
+    case PROP_SCALE:
+      g_value_set_double (value, filter->scale);
+      break;
+    case PROP_SHIFT:
+      g_value_set_double (value, filter->shift);
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -308,7 +345,8 @@
   g_assert (filter->intermediary_img);
 
   cvLaplace (img, filter->intermediary_img, filter->aperture_size);
-  cvConvertScale (filter->intermediary_img, outimg, 1, 0);
+  cvConvertScale (filter->intermediary_img, outimg, filter->scale,
+      filter->shift);
 
   return GST_FLOW_OK;
 }
diff --git a/ext/opencv/gstcvlaplace.h b/ext/opencv/gstcvlaplace.h
index 098b347..7ac9172 100644
--- a/ext/opencv/gstcvlaplace.h
+++ b/ext/opencv/gstcvlaplace.h
@@ -1,7 +1,7 @@
 /*
  * GStreamer
  * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -44,8 +44,6 @@
 #ifndef __GST_CV_LAPLACE_H__
 #define __GST_CV_LAPLACE_H__
 
-#include <gst/gst.h>
-
 #include <gstopencvvideofilter.h>
 
 G_BEGIN_DECLS
@@ -70,11 +68,13 @@
   GstOpencvVideoFilter element;
 
   gint aperture_size;
+  gdouble scale;
+  gdouble shift;
 
   IplImage *intermediary_img;
 };
 
-struct _GstCvLaplaceClass 
+struct _GstCvLaplaceClass
 {
   GstOpencvVideoFilterClass parent_class;
 };
diff --git a/ext/opencv/gstcvsmooth.c b/ext/opencv/gstcvsmooth.cpp
similarity index 77%
rename from ext/opencv/gstcvsmooth.c
rename to ext/opencv/gstcvsmooth.cpp
index 169fd16..648bfec 100644
--- a/ext/opencv/gstcvsmooth.c
+++ b/ext/opencv/gstcvsmooth.cpp
@@ -1,7 +1,7 @@
 /*
  * GStreamer
  * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -41,19 +41,32 @@
  * Boston, MA 02110-1301, USA.
  */
 
+/**
+ * SECTION:element-cvsmooth
+ *
+ * Smooths the image using thes cvSmooth OpenCV function.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 videotestsrc ! cvsmooth ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
+
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
 #endif
 
-#include <gst/gst.h>
-
 #include "gstopencvutils.h"
 #include "gstcvsmooth.h"
-#include <opencv2/imgproc/imgproc_c.h>
+#include <opencv2/imgproc/imgproc.hpp>
+
 
 GST_DEBUG_CATEGORY_STATIC (gst_cv_smooth_debug);
 #define GST_CAT_DEFAULT gst_cv_smooth_debug
 
+using namespace cv;
 /* Filter signals and args */
 enum
 {
@@ -86,7 +99,6 @@
   static GType cv_smooth_type_type = 0;
 
   static const GEnumValue smooth_types[] = {
-/*    {CV_BLUR_NO_SCALE, "CV Blur No Scale", "blur-no-scale"}, */
     {CV_BLUR, "CV Blur", "blur"},
     {CV_GAUSSIAN, "CV Gaussian", "gaussian"},
     {CV_MEDIAN, "CV Median", "median"},
@@ -103,7 +115,7 @@
 
 #define DEFAULT_CV_SMOOTH_TYPE CV_GAUSSIAN
 #define DEFAULT_WIDTH 3
-#define DEFAULT_HEIGHT 0
+#define DEFAULT_HEIGHT 3
 #define DEFAULT_COLORSIGMA 0.0
 #define DEFAULT_SPATIALSIGMA 0.0
 
@@ -143,38 +155,35 @@
           "type",
           "Smooth Type",
           GST_TYPE_CV_SMOOTH_TYPE,
-          DEFAULT_CV_SMOOTH_TYPE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)
+          DEFAULT_CV_SMOOTH_TYPE,
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS))
       );
   g_object_class_install_property (gobject_class, PROP_WIDTH,
-      g_param_spec_int ("width", "width (aperture width)",
-          "The aperture width (Must be positive and odd)."
-          "Check cvSmooth OpenCV docs: http://opencv.willowgarage.com"
-          "/documentation/image_filtering.html#cvSmooth", 1, G_MAXINT,
-          DEFAULT_WIDTH, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+      g_param_spec_int ("width", "width (kernel width)",
+          "The gaussian kernel width (must be positive and odd)."
+          "If type is median, this means the aperture linear size."
+          "Check OpenCV docs: http://docs.opencv.org"
+          "/2.4/modules/imgproc/doc/filtering.htm",
+          1, G_MAXINT, DEFAULT_WIDTH,
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_HEIGHT,
-      g_param_spec_int ("height", "height (aperture height)",
-          "The aperture height, if zero, the width is used."
-          "(Must be positive and odd or zero, unuset in median and bilateral "
-          "types). Check cvSmooth OpenCV docs: http://opencv.willowgarage.com"
-          "/documentation/image_filtering.html#cvSmooth", 0, G_MAXINT,
-          DEFAULT_HEIGHT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+      g_param_spec_int ("height", "height (kernel height)",
+          "The gaussian kernel height (must be positive and odd).",
+          0, G_MAXINT, DEFAULT_HEIGHT,
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_COLORSIGMA,
       g_param_spec_double ("color", "color (gaussian standard deviation or "
           "color sigma",
           "If type is gaussian, this means the standard deviation."
           "If type is bilateral, this means the color-sigma. If zero, "
-          "Default values are used."
-          "Check cvSmooth OpenCV docs: http://opencv.willowgarage.com"
-          "/documentation/image_filtering.html#cvSmooth",
+          "Default values are used.",
           0, G_MAXDOUBLE, DEFAULT_COLORSIGMA,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_SPATIALSIGMA,
       g_param_spec_double ("spatial", "spatial (spatial sigma, bilateral only)",
-          "Only used in bilateral type, means the spatial-sigma."
-          "Check cvSmooth OpenCV docs: http://opencv.willowgarage.com"
-          "/documentation/image_filtering.html#cvSmooth",
+          "Only used in bilateral type, means the spatial-sigma.",
           0, G_MAXDOUBLE, DEFAULT_SPATIALSIGMA,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   gst_element_class_set_static_metadata (element_class,
       "cvsmooth",
@@ -206,7 +215,8 @@
   filter->colorsigma = DEFAULT_COLORSIGMA;
   filter->spatialsigma = DEFAULT_SPATIALSIGMA;
 
-  gst_base_transform_set_in_place (GST_BASE_TRANSFORM (filter), FALSE);
+  gst_opencv_video_filter_set_in_place (GST_OPENCV_VIDEO_FILTER_CAST (filter),
+      FALSE);
 }
 
 static void
@@ -220,10 +230,12 @@
   switch (value) {
     case CV_GAUSSIAN:
     case CV_BLUR:
-      gst_base_transform_set_in_place (GST_BASE_TRANSFORM (filter), TRUE);
+      gst_opencv_video_filter_set_in_place (GST_OPENCV_VIDEO_FILTER_CAST
+          (filter), TRUE);
       break;
     default:
-      gst_base_transform_set_in_place (GST_BASE_TRANSFORM (filter), FALSE);
+      gst_opencv_video_filter_set_in_place (GST_OPENCV_VIDEO_FILTER_CAST
+          (filter), FALSE);
       break;
   }
 }
@@ -252,7 +264,7 @@
     case PROP_HEIGHT:{
       gint prop = g_value_get_int (value);
 
-      if (prop % 2 == 1 || prop == 0) {
+      if (prop % 2 == 1) {
         filter->height = prop;
       } else {
         GST_WARNING_OBJECT (filter, "Ignoring value for height, not odd"
@@ -306,8 +318,24 @@
 {
   GstCvSmooth *filter = GST_CV_SMOOTH (base);
 
-  cvSmooth (img, outimg, filter->type, filter->width, filter->height,
-      filter->colorsigma, filter->spatialsigma);
+  switch (filter->type) {
+    case CV_BLUR:
+      blur (Mat (img), Mat (outimg), Size (filter->width, filter->height),
+          Point (-1, -1));
+      break;
+    case CV_GAUSSIAN:
+      GaussianBlur (Mat (img), Mat (outimg), Size (filter->width,
+              filter->height), filter->colorsigma, filter->colorsigma);
+      break;
+    case CV_MEDIAN:
+      medianBlur (Mat (img), Mat (outimg), filter->width);
+      break;
+    case CV_BILATERAL:
+      bilateralFilter (Mat (img), Mat (outimg), -1, filter->colorsigma, 0.0);
+      break;
+    default:
+      break;
+  }
 
   return GST_FLOW_OK;
 }
@@ -318,8 +346,24 @@
 {
   GstCvSmooth *filter = GST_CV_SMOOTH (base);
 
-  cvSmooth (img, img, filter->type, filter->width, filter->height,
-      filter->colorsigma, filter->spatialsigma);
+  switch (filter->type) {
+    case CV_BLUR:
+      blur (Mat (img), Mat (img), Size (filter->width, filter->height),
+          Point (-1, -1));
+      break;
+    case CV_GAUSSIAN:
+      GaussianBlur (Mat (img), Mat (img), Size (filter->width, filter->height),
+          filter->colorsigma, filter->colorsigma);
+      break;
+    case CV_MEDIAN:
+      medianBlur (Mat (img), Mat (img), filter->width);
+      break;
+    case CV_BILATERAL:
+      bilateralFilter (Mat (img), Mat (img), -1, filter->colorsigma, 0.0);
+      break;
+    default:
+      break;
+  }
 
   return GST_FLOW_OK;
 }
diff --git a/ext/opencv/gstcvsmooth.h b/ext/opencv/gstcvsmooth.h
index c3e5164..7c74fbd 100644
--- a/ext/opencv/gstcvsmooth.h
+++ b/ext/opencv/gstcvsmooth.h
@@ -1,7 +1,7 @@
 /*
  * GStreamer
  * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -44,8 +44,6 @@
 #ifndef __GST_CV_SMOOTH_H__
 #define __GST_CV_SMOOTH_H__
 
-#include <gst/gst.h>
-
 #include <gstopencvvideofilter.h>
 
 G_BEGIN_DECLS
@@ -77,7 +75,7 @@
   gdouble spatialsigma;
 };
 
-struct _GstCvSmoothClass 
+struct _GstCvSmoothClass
 {
   GstOpencvVideoFilterClass parent_class;
 };
diff --git a/ext/opencv/gstcvsobel.c b/ext/opencv/gstcvsobel.cpp
similarity index 91%
rename from ext/opencv/gstcvsobel.c
rename to ext/opencv/gstcvsobel.cpp
index 1d9b151..f1f6750 100644
--- a/ext/opencv/gstcvsobel.c
+++ b/ext/opencv/gstcvsobel.cpp
@@ -1,7 +1,7 @@
 /*
  * GStreamer
  * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -41,13 +41,23 @@
  * Boston, MA 02110-1301, USA.
  */
 
+/**
+ * SECTION:element-cvsobel
+ *
+ * Applies the cvSobel OpenCV function to the image.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 videotestsrc ! cvsobel ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
+
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
 #endif
 
-#include <gst/gst.h>
-
-#include "gstopencvutils.h"
 #include "gstcvsobel.h"
 #include <opencv2/imgproc/imgproc_c.h>
 
@@ -129,15 +139,17 @@
   g_object_class_install_property (gobject_class, PROP_X_ORDER,
       g_param_spec_int ("x-order", "x order",
           "Order of the derivative x", -1, G_MAXINT,
-          DEFAULT_X_ORDER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          DEFAULT_X_ORDER,
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_Y_ORDER,
-      g_param_spec_int ("y-order", "y order",
-          "Order of the derivative y", -1, G_MAXINT,
-          DEFAULT_Y_ORDER, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+      g_param_spec_int ("y-order", "y order", "Order of the derivative y", -1,
+          G_MAXINT, DEFAULT_Y_ORDER,
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_APERTURE_SIZE,
       g_param_spec_int ("aperture-size", "aperture size",
           "Size of the extended Sobel Kernel (1, 3, 5 or 7)", 1, 7,
-          DEFAULT_APERTURE_SIZE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          DEFAULT_APERTURE_SIZE,
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   gst_element_class_add_pad_template (element_class,
       gst_static_pad_template_get (&src_factory));
@@ -158,7 +170,8 @@
   filter->y_order = DEFAULT_Y_ORDER;
   filter->aperture_size = DEFAULT_APERTURE_SIZE;
 
-  gst_base_transform_set_in_place (GST_BASE_TRANSFORM (filter), FALSE);
+  gst_opencv_video_filter_set_in_place (GST_OPENCV_VIDEO_FILTER_CAST (filter),
+      FALSE);
 }
 
 static GstCaps *
@@ -169,7 +182,7 @@
   GstCaps *templ;
   GstStructure *structure;
   GstPad *other;
-  gint i;
+  guint i;
 
   to = gst_caps_new_empty ();
 
diff --git a/ext/opencv/gstcvsobel.h b/ext/opencv/gstcvsobel.h
index c6719a0..a7f306a 100644
--- a/ext/opencv/gstcvsobel.h
+++ b/ext/opencv/gstcvsobel.h
@@ -1,7 +1,7 @@
 /*
  * GStreamer
  * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -44,8 +44,6 @@
 #ifndef __GST_CV_SOBEL_H__
 #define __GST_CV_SOBEL_H__
 
-#include <gst/gst.h>
-
 #include <gstopencvvideofilter.h>
 
 G_BEGIN_DECLS
@@ -74,7 +72,7 @@
   gint aperture_size;
 };
 
-struct _GstCvSobelClass 
+struct _GstCvSobelClass
 {
   GstOpencvVideoFilterClass parent_class;
 };
diff --git a/ext/opencv/gstdisparity.cpp b/ext/opencv/gstdisparity.cpp
index f3f9d64..28f06a7 100644
--- a/ext/opencv/gstdisparity.cpp
+++ b/ext/opencv/gstdisparity.cpp
@@ -53,32 +53,32 @@
  * run prefiltering stages to normalize brightness between the inputs, and to maximize texture.
  *
  * Note that in general is hard to find correspondences between soft textures, for instance a
- * block of gloss blue colour. The output is a gray image with values close to white meaning 
+ * block of gloss blue colour. The output is a gray image with values close to white meaning
  * closer to the cameras and darker far away. Black means that the pixels were not matched
  * correctly (not found). The resulting depth map can be transformed into real world coordinates
  * by means of OpenCV function (reprojectImageTo3D) but for this the camera matrixes need to
  * be fully known.
  *
  * Algorithm 1 is the OpenCV Stereo Block Matching, similar to the one developed by Kurt Konolige
- * [A] and that works by using small Sum-of-absolute-differenc (SAD) windows to find matching 
+ * [A] and that works by using small Sum-of-absolute-differenc (SAD) windows to find matching
  * points between the left and right rectified images. This algorithm finds only strongly matching
  * points between both images, this means normally strong textures. In soft textures, such as a
  * single coloured wall (as opposed to, f.i. a hairy rug), not all pixels might have correspondence.
  *
  * Algorithm 2 is the Semi Global Matching (SGM) algorithm [B] which models the scene structure
- * with a point-wise matching cost and an associated smoothness term. The energy minimization 
- * is then computed in a multitude of 1D lines. For each point, the disparity corresponding to 
- * the minimum aggregated cost is selected. In [B] the author proposes to use 8 or 16 different 
- * independent paths. The SGM approach works well near depth discontinuities, but produces less 
- * accurate results. Despite its relatively large memory footprint, this method is very fast and 
+ * with a point-wise matching cost and an associated smoothness term. The energy minimization
+ * is then computed in a multitude of 1D lines. For each point, the disparity corresponding to
+ * the minimum aggregated cost is selected. In [B] the author proposes to use 8 or 16 different
+ * independent paths. The SGM approach works well near depth discontinuities, but produces less
+ * accurate results. Despite its relatively large memory footprint, this method is very fast and
  * potentially robust to complicated textured regions.
  *
- * Algorithm 3 is the OpenCV implementation of a modification of the variational stereo 
+ * Algorithm 3 is the OpenCV implementation of a modification of the variational stereo
  * correspondence algorithm, described in [C].
  *
- * Algorithm 4 is the Graph Cut stereo vision algorithm (GC) introduced in [D]; it is a global 
+ * Algorithm 4 is the Graph Cut stereo vision algorithm (GC) introduced in [D]; it is a global
  * stereo vision method. It calculates depth discontinuities by minimizing an energy function
- * combingin a point-wise matching cost and a smoothness term. The energy function is passed 
+ * combingin a point-wise matching cost and a smoothness term. The energy function is passed
  * to graph and Graph Cut is used to find a lowest-energy cut. GC is computationally intensive due
  * to its global nature and uses loads of memory, but it can deal with textureless regions and
  * reflections better than other methods.
@@ -86,15 +86,15 @@
  *
  * Some test images can be found here: http://vision.stanford.edu/~birch/p2p/
  *
- * [A] K. Konolige. Small vision system. hardware and implementation. In Proc. International 
+ * [A] K. Konolige. Small vision system. hardware and implementation. In Proc. International
  * Symposium on Robotics Research, pages 111--116, Hayama, Japan, 1997.
- * [B] H. Hirschmüller, “Accurate and efficient stereo processing by semi-global matching and 
- * mutual information,” in Proceedings of the IEEE Conference on Computer Vision and Pattern 
+ * [B] H. Hirschmüller, “Accurate and efficient stereo processing by semi-global matching and
+ * mutual information,” in Proceedings of the IEEE Conference on Computer Vision and Pattern
  * Recognition, 2005, pp. 807–814.
  * [C] S. Kosov, T. Thormaehlen, H.-P. Seidel "Accurate Real-Time Disparity Estimation with
- * Variational Methods" Proceedings of the 5th International Symposium on Visual Computing, 
+ * Variational Methods" Proceedings of the 5th International Symposium on Visual Computing,
  * Vegas, USA
- * [D] Scharstein, D. & Szeliski, R. (2001). A taxonomy and evaluation of dense two-frame stereo 
+ * [D] Scharstein, D. & Szeliski, R. (2001). A taxonomy and evaluation of dense two-frame stereo
  * correspondence algorithms, International Journal of Computer Vision 47: 7–42.
  *
  * <refsect2>
@@ -103,7 +103,7 @@
  * gst-launch-1.0       videotestsrc ! video/x-raw,width=320,height=240 ! disp0.sink_right      videotestsrc ! video/x-raw,width=320,height=240 ! disp0.sink_left      disparity name=disp0 ! videoconvert ! ximagesink
  * ]|
  * Another example, with two png files representing a classical stereo matching,
- * downloadable from http://vision.middlebury.edu/stereo/submit/tsukuba/im4.png and 
+ * downloadable from http://vision.middlebury.edu/stereo/submit/tsukuba/im4.png and
  * im3.png. Note here they are downloaded in ~ (home).
  * |[
 gst-launch-1.0    multifilesrc  location=~/im3.png ! pngdec ! videoconvert  ! disp0.sink_right     multifilesrc  location=~/im4.png ! pngdec ! videoconvert ! disp0.sink_left disparity   name=disp0 method=sbm     disp0.src ! videoconvert ! ximagesink
@@ -119,8 +119,6 @@
 #include <config.h>
 #endif
 
-#include <gst/gst.h>
-#include <gst/video/video.h>
 #include <opencv2/contrib/contrib.hpp>
 #include "gstdisparity.h"
 
@@ -548,19 +546,19 @@
       fs->width, fs->height, fs->actualChannels);
 
   /* Stereo corresponding using semi-global block matching. According to OpenCV:
-     "" The class implements modified H. Hirschmuller algorithm HH08 . The main 
+     "" The class implements modified H. Hirschmuller algorithm HH08 . The main
      differences between the implemented algorithm and the original one are:
 
-     - by default the algorithm is single-pass, i.e. instead of 8 directions we 
+     - by default the algorithm is single-pass, i.e. instead of 8 directions we
      only consider 5. Set fullDP=true to run the full variant of the algorithm
      (which could consume a lot of memory)
      - the algorithm matches blocks, not individual pixels (though, by setting
      SADWindowSize=1 the blocks are reduced to single pixels)
      - mutual information cost function is not implemented. Instead, we use a
-     simpler Birchfield-Tomasi sub-pixel metric from BT96 , though the color 
+     simpler Birchfield-Tomasi sub-pixel metric from BT96 , though the color
      images are supported as well.
-     - we include some pre- and post- processing steps from K. Konolige 
-     algorithm FindStereoCorrespondenceBM , such as pre-filtering 
+     - we include some pre- and post- processing steps from K. Konolige
+     algorithm FindStereoCorrespondenceBM , such as pre-filtering
      ( CV_STEREO_BM_XSOBEL type) and post-filtering (uniqueness check, quadratic
      interpolation and speckle filtering) ""
    */
@@ -572,7 +570,7 @@
         CV_MINMAX, NULL);
     cvCvtColor (fs->cvGray_depth_map2, fs->cvRGB_right, CV_GRAY2RGB);
   }
-  /* Algorithm 1 is the OpenCV Stereo Block Matching, similar to the one 
+  /* Algorithm 1 is the OpenCV Stereo Block Matching, similar to the one
      developed by Kurt Konolige [A] and that works by using small Sum-of-absolute-
      differences (SAD) window. See the comments on top of the file.
    */
@@ -593,9 +591,9 @@
     run_svar_iteration (fs);
     cvCvtColor (fs->cvGray_depth_map2, fs->cvRGB_right, CV_GRAY2RGB);
   }
-  /* The Graph Cut stereo vision algorithm (GC) introduced in [D] is a global 
-     stereo vision method. It calculates depth discontinuities by minimizing an 
-     energy function combingin a point-wise matching cost and a smoothness term. 
+  /* The Graph Cut stereo vision algorithm (GC) introduced in [D] is a global
+     stereo vision method. It calculates depth discontinuities by minimizing an
+     energy function combingin a point-wise matching cost and a smoothness term.
      See the comments on top of the file.
    */
   else if (METHOD_GC == fs->method) {
diff --git a/ext/opencv/gstdisparity.h b/ext/opencv/gstdisparity.h
index adbb9ae..07e2417 100644
--- a/ext/opencv/gstdisparity.h
+++ b/ext/opencv/gstdisparity.h
@@ -45,6 +45,7 @@
 #define __GST_DISPARITY_H__
 
 #include <gst/gst.h>
+#include <gst/video/video.h>
 
 #include <opencv2/legacy/legacy.hpp>
 
diff --git a/ext/opencv/gstedgedetect.cpp b/ext/opencv/gstedgedetect.cpp
index 5ecf8ec..7e6c1e7 100644
--- a/ext/opencv/gstedgedetect.cpp
+++ b/ext/opencv/gstedgedetect.cpp
@@ -3,7 +3,7 @@
  * Copyright (C) 2005 Thomas Vander Stichele <thomas@apestaart.org>
  * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
  * Copyright (C) 2008 Michael Sheldon <mike@mikeasoft.com>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -51,7 +51,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch-0.10 videotestsrc ! decodebin ! videoconvert ! edgedetect ! videoconvert ! xvimagesink
+ * gst-launch-1.0 videotestsrc ! decodebin ! videoconvert ! edgedetect ! videoconvert ! xvimagesink
  * ]|
  * </refsect2>
  */
@@ -60,9 +60,6 @@
 #  include <config.h>
 #endif
 
-#include <gst/gst.h>
-
-#include "gstopencvutils.h"
 #include "gstedgedetect.h"
 #include <opencv2/imgproc/imgproc_c.h>
 
@@ -101,7 +98,7 @@
     GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("RGB"))
     );
 
-G_DEFINE_TYPE (GstEdgeDetect, gst_edge_detect, GST_TYPE_ELEMENT);
+G_DEFINE_TYPE (GstEdgeDetect, gst_edge_detect, GST_TYPE_OPENCV_VIDEO_FILTER);
 
 static void gst_edge_detect_set_property (GObject * object, guint prop_id,
     const GValue * value, GParamSpec * pspec);
@@ -110,8 +107,11 @@
 
 static gboolean gst_edge_detect_handle_sink_event (GstPad * pad,
     GstObject * parent, GstEvent * event);
-static GstFlowReturn gst_edge_detect_chain (GstPad * pad, GstObject * parent,
-    GstBuffer * buf);
+static GstFlowReturn gst_edge_detect_transform (GstOpencvVideoFilter * filter,
+    GstBuffer * buf, IplImage * img, GstBuffer * outbuf, IplImage * outimg);
+static gboolean gst_edge_detect_set_caps (GstOpencvVideoFilter * transform,
+    gint in_width, gint in_height, gint in_depth, gint in_channels,
+    gint out_width, gint out_height, gint out_depth, gint out_channels);
 
 /* Clean up */
 static void
@@ -119,8 +119,7 @@
 {
   GstEdgeDetect *filter = GST_EDGE_DETECT (obj);
 
-  if (filter->cvImage != NULL) {
-    cvReleaseImage (&filter->cvImage);
+  if (filter->cvEdge != NULL) {
     cvReleaseImage (&filter->cvCEdge);
     cvReleaseImage (&filter->cvGray);
     cvReleaseImage (&filter->cvEdge);
@@ -134,14 +133,19 @@
 gst_edge_detect_class_init (GstEdgeDetectClass * klass)
 {
   GObjectClass *gobject_class;
+  GstOpencvVideoFilterClass *gstopencvbasefilter_class;
 
   GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
   gobject_class = (GObjectClass *) klass;
+  gstopencvbasefilter_class = (GstOpencvVideoFilterClass *) klass;
 
   gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_edge_detect_finalize);
   gobject_class->set_property = gst_edge_detect_set_property;
   gobject_class->get_property = gst_edge_detect_get_property;
 
+  gstopencvbasefilter_class->cv_trans_func = gst_edge_detect_transform;
+  gstopencvbasefilter_class->cv_set_caps = gst_edge_detect_set_caps;
+
   g_object_class_install_property (gobject_class, PROP_MASK,
       g_param_spec_boolean ("mask", "Mask",
           "Sets whether the detected edges should be used as a mask on the original input or not",
@@ -179,22 +183,16 @@
 static void
 gst_edge_detect_init (GstEdgeDetect * filter)
 {
-  filter->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink");
-  GST_PAD_SET_PROXY_CAPS (filter->sinkpad);
-  gst_pad_set_event_function (filter->sinkpad,
+  gst_pad_set_event_function (GST_BASE_TRANSFORM_SINK_PAD (filter),
       GST_DEBUG_FUNCPTR (gst_edge_detect_handle_sink_event));
-  gst_pad_set_chain_function (filter->sinkpad,
-      GST_DEBUG_FUNCPTR (gst_edge_detect_chain));
 
-  filter->srcpad = gst_pad_new_from_static_template (&src_factory, "src");
-  GST_PAD_SET_PROXY_CAPS (filter->srcpad);
-
-  gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad);
-  gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad);
   filter->mask = TRUE;
   filter->threshold1 = 50;
   filter->threshold2 = 150;
   filter->aperture = 3;
+
+  gst_opencv_video_filter_set_in_place (GST_OPENCV_VIDEO_FILTER_CAST (filter),
+      FALSE);
 }
 
 static void
@@ -251,6 +249,23 @@
 
 /* this function handles the link with other elements */
 static gboolean
+gst_edge_detect_set_caps (GstOpencvVideoFilter * transform,
+    gint in_width, gint in_height, gint in_depth, gint in_channels,
+    gint out_width, gint out_height, gint out_depth, gint out_channels)
+{
+  GstEdgeDetect *filter = GST_EDGE_DETECT (transform);
+
+  if (filter->cvGray)
+    cvReleaseImage (&filter->cvGray);
+
+  filter->cvGray =
+      cvCreateImage (cvSize (in_width, in_height), IPL_DEPTH_8U, 1);
+
+  return TRUE;
+}
+
+/* this function handles the link with other elements */
+static gboolean
 gst_edge_detect_handle_sink_event (GstPad * pad, GstObject * parent,
     GstEvent * event)
 {
@@ -271,14 +286,12 @@
       gst_structure_get_int (structure, "width", &width);
       gst_structure_get_int (structure, "height", &height);
 
-      if (filter->cvImage != NULL) {
-        cvReleaseImage (&filter->cvImage);
+      if (filter->cvEdge != NULL) {
         cvReleaseImage (&filter->cvCEdge);
         cvReleaseImage (&filter->cvGray);
         cvReleaseImage (&filter->cvEdge);
       }
 
-      filter->cvImage = cvCreateImage (cvSize (width, height), IPL_DEPTH_8U, 3);
       filter->cvCEdge = cvCreateImage (cvSize (width, height), IPL_DEPTH_8U, 3);
       filter->cvGray = cvCreateImage (cvSize (width, height), IPL_DEPTH_8U, 1);
       filter->cvEdge = cvCreateImage (cvSize (width, height), IPL_DEPTH_8U, 1);
@@ -291,49 +304,31 @@
   res = gst_pad_event_default (pad, parent, event);
 
   return res;
-
 }
 
-/* chain function
- * this function does the actual processing
- */
 static GstFlowReturn
-gst_edge_detect_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
+gst_edge_detect_transform (GstOpencvVideoFilter * base, GstBuffer * buf,
+    IplImage * img, GstBuffer * outbuf, IplImage * outimg)
 {
-  GstEdgeDetect *filter;
-  GstBuffer *outbuf;
-  GstMapInfo in_info;
+  GstEdgeDetect *filter = GST_EDGE_DETECT (base);
   GstMapInfo out_info;
 
-  filter = GST_EDGE_DETECT (parent);
-
-  buf = gst_buffer_make_writable (buf);
-  gst_buffer_map (buf, &in_info, GST_MAP_WRITE);
-  filter->cvImage->imageData = (char *) in_info.data;
-
-  cvCvtColor (filter->cvImage, filter->cvGray, CV_RGB2GRAY);
+  cvCvtColor (img, filter->cvGray, CV_RGB2GRAY);
   cvCanny (filter->cvGray, filter->cvEdge, filter->threshold1,
       filter->threshold2, filter->aperture);
 
   cvZero (filter->cvCEdge);
   if (filter->mask) {
-    cvCopy (filter->cvImage, filter->cvCEdge, filter->cvEdge);
+    cvCopy (img, filter->cvCEdge, filter->cvEdge);
   } else {
     cvCvtColor (filter->cvEdge, filter->cvCEdge, CV_GRAY2RGB);
   }
 
-  outbuf = gst_buffer_new_and_alloc (filter->cvCEdge->imageSize);
-  gst_buffer_copy_into (outbuf, buf,
-      (GstBufferCopyFlags) GST_BUFFER_COPY_METADATA, 0, -1);
-
   gst_buffer_map (outbuf, &out_info, GST_MAP_WRITE);
   memcpy (out_info.data, filter->cvCEdge->imageData,
       gst_buffer_get_size (outbuf));
 
-  gst_buffer_unmap (buf, &in_info);
-  gst_buffer_unmap (outbuf, &out_info);
-  gst_buffer_unref (buf);
-  return gst_pad_push (filter->srcpad, outbuf);
+  return GST_FLOW_OK;
 }
 
 /* entry point to initialize the plug-in
@@ -343,9 +338,7 @@
 gboolean
 gst_edge_detect_plugin_init (GstPlugin * plugin)
 {
-  /* debug category for fltering log messages
-   *
-   */
+  /* debug category for fltering log messages */
   GST_DEBUG_CATEGORY_INIT (gst_edge_detect_debug, "edgedetect",
       0, "Performs canny edge detection on videos and images");
 
diff --git a/ext/opencv/gstedgedetect.h b/ext/opencv/gstedgedetect.h
index 23c95e6..0472c5d 100644
--- a/ext/opencv/gstedgedetect.h
+++ b/ext/opencv/gstedgedetect.h
@@ -3,7 +3,7 @@
  * Copyright (C) 2005 Thomas Vander Stichele <thomas@apestaart.org>
  * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
  * Copyright (C) 2008 Michael Sheldon <mike@mikeasoft.com>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -46,7 +46,7 @@
 #ifndef __GST_EDGE_DETECT_H__
 #define __GST_EDGE_DETECT_H__
 
-#include <gst/gst.h>
+#include <gstopencvvideofilter.h>
 #include <opencv2/core/core_c.h>
 
 G_BEGIN_DECLS
@@ -61,25 +61,24 @@
   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_EDGE_DETECT))
 #define GST_IS_EDGE_DETECT_CLASS(klass) \
   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_EDGE_DETECT))
+
 typedef struct _GstEdgeDetect GstEdgeDetect;
 typedef struct _GstEdgeDetectClass GstEdgeDetectClass;
 
 struct _GstEdgeDetect
 {
-  GstElement element;
-
-  GstPad *sinkpad, *srcpad;
+  GstOpencvVideoFilter element;
 
   gboolean mask;
 
   int threshold1, threshold2, aperture;
 
-  IplImage *cvEdge, *cvGray, *cvImage, *cvCEdge;
+  IplImage *cvEdge, *cvGray, *cvCEdge;
 };
 
 struct _GstEdgeDetectClass
 {
-  GstElementClass parent_class;
+  GstOpencvVideoFilterClass parent_class;
 };
 
 GType gst_edge_detect_get_type (void);
diff --git a/ext/opencv/gstfaceblur.cpp b/ext/opencv/gstfaceblur.cpp
index 40ff4f8..2bc88d1 100644
--- a/ext/opencv/gstfaceblur.cpp
+++ b/ext/opencv/gstfaceblur.cpp
@@ -4,7 +4,7 @@
  * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
  * Copyright (C) 2008 Michael Sheldon <mike@mikeasoft.com>
  * Copyright (C) 2011 Robert Jobbagy <jobbagy.robert@gmail.com>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -61,10 +61,8 @@
 #  include <config.h>
 #endif
 
-#include <gst/gst.h>
 #include <vector>
 
-#include "gstopencvutils.h"
 #include "gstfaceblur.h"
 #include <opencv2/imgproc/imgproc_c.h>
 #include <opencv2/imgproc/imgproc.hpp>
diff --git a/ext/opencv/gstfaceblur.h b/ext/opencv/gstfaceblur.h
index 890c0c9..9c86e1b 100644
--- a/ext/opencv/gstfaceblur.h
+++ b/ext/opencv/gstfaceblur.h
@@ -4,7 +4,7 @@
  * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
  * Copyright (C) 2008 Michael Sheldon <mike@mikeasoft.com>
  * Copyright (C) 2011 Robert Jobbagy <jobbagy.robert@gmail.com>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
diff --git a/ext/opencv/gstfacedetect.cpp b/ext/opencv/gstfacedetect.cpp
index 7ec6e39..aff9979 100644
--- a/ext/opencv/gstfacedetect.cpp
+++ b/ext/opencv/gstfacedetect.cpp
@@ -76,11 +76,8 @@
 #  include <config.h>
 #endif
 
-#include <gst/gst.h>
-#include <gst/video/gstvideometa.h>
 #include <vector>
 
-#include "gstopencvutils.h"
 #include "gstfacedetect.h"
 #include <opencv2/imgproc/imgproc_c.h>
 
@@ -573,7 +570,7 @@
   }
 }
 
-/* 
+/*
  * Performs the face detection
  */
 static GstFlowReturn
diff --git a/ext/opencv/gstgrabcut.cpp b/ext/opencv/gstgrabcut.cpp
index c9ff4f9..eaf727b 100644
--- a/ext/opencv/gstgrabcut.cpp
+++ b/ext/opencv/gstgrabcut.cpp
@@ -1,7 +1,7 @@
 /*
  * GStreamer
  * Copyright (C) 2013 Miguel Casas-Sanchez <miguelecasassanchez@gmail.com>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -48,23 +48,23 @@
  * This element is a wrapper around OpenCV grabcut implementation. GrabCut is an
  * image segmentation method based on graph cuts technique. It can be seen as a
  * way of fine-grain segmenting the image from some FG and BG "seed" areas. The
- * OpenCV implementation follows the article [1]. 
+ * OpenCV implementation follows the article [1].
  * The "seed" areas are taken in this element from either an input bounding box
  * coming from a face detection, or from alpha channel values. The input box is
- * taken from a "face" event such as the one generated from the 'facedetect' 
- * element. The Alpha channel values should be one of the following (cv.hpp): 
- * enum{  
+ * taken from a "face" event such as the one generated from the 'facedetect'
+ * element. The Alpha channel values should be one of the following (cv.hpp):
+ * enum{
  *  GC_BGD    = 0,  //!< background
  *  GC_FGD    = 1,  //!< foreground
  *  GC_PR_BGD = 2,  //!< most probably background
  *  GC_PR_FGD = 3   //!< most probably foreground
  * };
  * with values over GC_PR_FGD interpreted as GC_PR_FGD. IN CASE OF no alpha mask
- * input (all 0's or all 1's), the 'GstOpenCvFaceDetect-face' downstream event 
+ * input (all 0's or all 1's), the 'GstOpenCvFaceDetect-face' downstream event
  * is used to create a bbox of PR_FG elements. If both foreground alpha
  * is not specified and there is no face detection, nothing is done.
  *
- * [1] C. Rother, V. Kolmogorov, and A. Blake, "GrabCut: Interactive foreground 
+ * [1] C. Rother, V. Kolmogorov, and A. Blake, "GrabCut: Interactive foreground
  * extraction using iterated graph cuts, ACM Trans. Graph., vol. 23, pp. 309–314,
  * 2004.
  *
@@ -84,11 +84,9 @@
 #include <config.h>
 #endif
 
-#include <gst/gst.h>
 #include "gstgrabcut.h"
 extern "C"
 {
-#include <gst/video/gstvideometa.h>
 #include <opencv2/imgproc/imgproc_c.h>
 }
 #include <opencv2/imgproc/imgproc.hpp>
@@ -326,8 +324,8 @@
   cvCvtColor (gc->cvRGBAin, gc->cvRGBin, CV_BGRA2BGR);
   compose_matrix_from_image (gc->grabcut_mask, gc->cvD);
 
-  /*  Pass cvD to grabcut_mask for the graphcut stuff but that only if 
-     really there is something in the mask! otherwise -->input bbox is 
+  /*  Pass cvD to grabcut_mask for the graphcut stuff but that only if
+     really there is something in the mask! otherwise -->input bbox is
      what we use */
   alphapixels = cvCountNonZero (gc->cvD);
   if ((0 < alphapixels) && (alphapixels < (gc->width * gc->height))) {
diff --git a/ext/opencv/gsthanddetect.c b/ext/opencv/gsthanddetect.cpp
similarity index 66%
rename from ext/opencv/gsthanddetect.c
rename to ext/opencv/gsthanddetect.cpp
index c4dd390..e36b80e 100644
--- a/ext/opencv/gsthanddetect.c
+++ b/ext/opencv/gsthanddetect.cpp
@@ -62,7 +62,6 @@
 
 /* element header */
 #include "gsthanddetect.h"
-#include "gstopencvutils.h"
 #include <opencv2/imgproc/imgproc_c.h>
 
 GST_DEBUG_CATEGORY_STATIC (gst_handdetect_debug);
@@ -72,6 +71,7 @@
 #define HAAR_FILE_FIST GST_HAAR_CASCADES_DIR G_DIR_SEPARATOR_S "fist.xml"
 #define HAAR_FILE_PALM GST_HAAR_CASCADES_DIR G_DIR_SEPARATOR_S "palm.xml"
 
+using namespace cv;
 /* Filter signals and args */
 enum
 {
@@ -113,8 +113,8 @@
 static GstFlowReturn gst_handdetect_transform_ip (GstOpencvVideoFilter *
     transform, GstBuffer * buffer, IplImage * img);
 
-static CvHaarClassifierCascade *gst_handdetect_load_profile (GstHanddetect *
-    filter, gchar * profile);
+static CascadeClassifier *gst_handdetect_load_profile (GstHanddetect * filter,
+    gchar * profile);
 
 static void gst_handdetect_navigation_interface_init (GstNavigationInterface *
     iface);
@@ -160,10 +160,9 @@
 
   if (filter->cvGray)
     cvReleaseImage (&filter->cvGray);
-  if (filter->cvStorage)
-    cvReleaseMemStorage (&filter->cvStorage);
   g_free (filter->profile_fist);
   g_free (filter->profile_palm);
+  delete (filter->best_r);
 
   G_OBJECT_CLASS (gst_handdetect_parent_class)->finalize (obj);
 }
@@ -191,53 +190,53 @@
       g_param_spec_boolean ("display",
           "Display",
           "Whether the detected hands are highlighted in output frame",
-          TRUE, G_PARAM_READWRITE)
+          TRUE, (GParamFlags)G_PARAM_READWRITE)
       );
   g_object_class_install_property (gobject_class,
       PROP_PROFILE_FIST,
       g_param_spec_string ("profile_fist",
           "Profile_fist",
           "Location of HAAR cascade file (fist gesture)",
-          HAAR_FILE_FIST, G_PARAM_READWRITE)
+          HAAR_FILE_FIST, (GParamFlags)G_PARAM_READWRITE)
       );
   g_object_class_install_property (gobject_class,
       PROP_PROFILE_PALM,
       g_param_spec_string ("profile_palm",
           "Profile_palm",
           "Location of HAAR cascade file (palm gesture)",
-          HAAR_FILE_PALM, G_PARAM_READWRITE)
+          HAAR_FILE_PALM, (GParamFlags)G_PARAM_READWRITE)
       );
   /* FIXME: property name needs fixing */
   g_object_class_install_property (gobject_class,
       PROP_ROI_X,
-      g_param_spec_uint ("ROI_X",
+      g_param_spec_int ("ROI_X",
           "ROI_X",
           "X of left-top pointer in region of interest \nGestures in the defined region of interest will emit messages",
-          0, UINT_MAX, 0, G_PARAM_READWRITE)
+          0, INT_MAX, 0, (GParamFlags)G_PARAM_READWRITE)
       );
   /* FIXME: property name needs fixing */
   g_object_class_install_property (gobject_class,
       PROP_ROI_Y,
-      g_param_spec_uint ("ROI_Y",
+      g_param_spec_int ("ROI_Y",
           "ROI_Y",
           "Y of left-top pointer in region of interest \nGestures in the defined region of interest will emit messages",
-          0, UINT_MAX, 0, G_PARAM_READWRITE)
+          0, INT_MAX, 0, (GParamFlags)G_PARAM_READWRITE)
       );
   /* FIXME: property name needs fixing */
   g_object_class_install_property (gobject_class,
       PROP_ROI_WIDTH,
-      g_param_spec_uint ("ROI_WIDTH",
+      g_param_spec_int ("ROI_WIDTH",
           "ROI_WIDTH",
           "WIDTH of left-top pointer in region of interest \nGestures in the defined region of interest will emit messages",
-          0, UINT_MAX, 0, G_PARAM_READWRITE)
+          0, INT_MAX, 0, (GParamFlags)G_PARAM_READWRITE)
       );
   /* FIXME: property name needs fixing */
   g_object_class_install_property (gobject_class,
       PROP_ROI_HEIGHT,
-      g_param_spec_uint ("ROI_HEIGHT",
+      g_param_spec_int ("ROI_HEIGHT",
           "ROI_HEIGHT",
           "HEIGHT of left-top pointer in region of interest \nGestures in the defined region of interest will emit messages",
-          0, UINT_MAX, 0, G_PARAM_READWRITE)
+          0, INT_MAX, 0, (GParamFlags)G_PARAM_READWRITE)
       );
 
   gst_element_class_set_static_metadata (element_class,
@@ -261,8 +260,17 @@
 static void
 gst_handdetect_init (GstHanddetect * filter)
 {
-  filter->profile_fist = g_strdup (HAAR_FILE_FIST);
-  filter->profile_palm = g_strdup (HAAR_FILE_PALM);
+  const gchar *haar_path;
+
+  haar_path = g_getenv ("GST_HAAR_CASCADES_PATH");
+  if (haar_path) {
+    filter->profile_fist = g_build_filename (haar_path, "fist.xml", NULL);
+    filter->profile_palm = g_build_filename (haar_path, "palm.xml", NULL);
+  } else {
+    filter->profile_fist = g_strdup (HAAR_FILE_FIST);
+    filter->profile_palm = g_strdup (HAAR_FILE_PALM);
+  }
+
   filter->roi_x = 0;
   filter->roi_y = 0;
   filter->roi_width = 0;
@@ -288,7 +296,7 @@
     case PROP_PROFILE_FIST:
       g_free (filter->profile_fist);
       if (filter->cvCascade_fist)
-        cvReleaseHaarClassifierCascade (&filter->cvCascade_fist);
+        delete filter->cvCascade_fist;
       filter->profile_fist = g_value_dup_string (value);
       filter->cvCascade_fist =
           gst_handdetect_load_profile (filter, filter->profile_fist);
@@ -296,7 +304,7 @@
     case PROP_PROFILE_PALM:
       g_free (filter->profile_palm);
       if (filter->cvCascade_palm)
-        cvReleaseHaarClassifierCascade (&filter->cvCascade_palm);
+        delete filter->cvCascade_palm;
       filter->profile_palm = g_value_dup_string (value);
       filter->cvCascade_palm =
           gst_handdetect_load_profile (filter, filter->profile_palm);
@@ -305,16 +313,16 @@
       filter->display = g_value_get_boolean (value);
       break;
     case PROP_ROI_X:
-      filter->roi_x = g_value_get_uint (value);
+      filter->roi_x = g_value_get_int (value);
       break;
     case PROP_ROI_Y:
-      filter->roi_y = g_value_get_uint (value);
+      filter->roi_y = g_value_get_int (value);
       break;
     case PROP_ROI_WIDTH:
-      filter->roi_width = g_value_get_uint (value);
+      filter->roi_width = g_value_get_int (value);
       break;
     case PROP_ROI_HEIGHT:
-      filter->roi_height = g_value_get_uint (value);
+      filter->roi_height = g_value_get_int (value);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -339,16 +347,16 @@
       g_value_set_string (value, filter->profile_palm);
       break;
     case PROP_ROI_X:
-      g_value_set_uint (value, filter->roi_x);
+      g_value_set_int (value, filter->roi_x);
       break;
     case PROP_ROI_Y:
-      g_value_set_uint (value, filter->roi_y);
+      g_value_set_int (value, filter->roi_y);
       break;
     case PROP_ROI_WIDTH:
-      g_value_set_uint (value, filter->roi_width);
+      g_value_set_int (value, filter->roi_width);
       break;
     case PROP_ROI_HEIGHT:
-      g_value_set_uint (value, filter->roi_height);
+      g_value_set_int (value, filter->roi_height);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -376,10 +384,6 @@
   filter->cvGray =
       cvCreateImage (cvSize (in_width, in_height), IPL_DEPTH_8U, 1);
 
-  if (!filter->cvStorage)
-    filter->cvStorage = cvCreateMemStorage (0);
-  else
-    cvClearMemStorage (filter->cvStorage);
   return TRUE;
 }
 
@@ -391,147 +395,54 @@
     GstBuffer * buffer, IplImage * img)
 {
   GstHanddetect *filter = GST_HANDDETECT (transform);
-  CvSeq *hands;
-  CvRect *r;
+  Rect *r;
   GstStructure *s;
   GstMessage *m;
-  int i;
+  unsigned int i;
+  vector < Rect > hands;
 
   /* check detection cascades */
-  if (!filter->cvCascade_fist || !filter->cvCascade_palm)
-    return GST_FLOW_OK;
-
+  if (filter->cvCascade_fist && filter->cvCascade_palm) {
   /* cvt to gray colour space for hand detect */
-  cvCvtColor (img, filter->cvGray, CV_RGB2GRAY);
-  cvClearMemStorage (filter->cvStorage);
+    cvCvtColor (img, filter->cvGray, CV_RGB2GRAY);
 
-  /* detect FIST gesture fist */
-  hands =
-      cvHaarDetectObjects (filter->cvGray, filter->cvCascade_fist,
-      filter->cvStorage, 1.1, 2, CV_HAAR_DO_CANNY_PRUNING, cvSize (24, 24),
-      cvSize (0, 0));
+    /* detect FIST gesture fist */
+    Mat roi (filter->cvGray, Rect (filter->cvGray->origin,
+            filter->cvGray->origin, filter->cvGray->width,
+            filter->cvGray->height));
+    filter->cvCascade_fist->detectMultiScale (roi, hands, 1.1, 2,
+        CV_HAAR_DO_CANNY_PRUNING, cvSize (24, 24), cvSize (0, 0));
 
-  /* if FIST gesture detected */
-  if (hands && hands->total > 0) {
-    int min_distance, distance;
-    CvRect temp_r;
-    CvPoint c;
+    /* if FIST gesture detected */
+    if (!hands.empty ()) {
 
-    GST_DEBUG_OBJECT (filter, "%d FIST gestures detected\n",
-        (int) hands->total);
-
-    /* Go through all detected FIST gestures to get the best one
-     * prev_r => previous hand
-     * best_r => best hand in this frame
-     */
-    /* set min_distance for init comparison */
-    min_distance = img->width + img->height;
-    /* Init filter->prev_r */
-    temp_r = cvRect (0, 0, 0, 0);
-    if (filter->prev_r == NULL)
-      filter->prev_r = &temp_r;
-    /* Get the best FIST gesture */
-    for (i = 0; i < hands->total; i++) {
-      r = (CvRect *) cvGetSeqElem (hands, i);
-      distance = (int) sqrt (pow ((r->x - filter->prev_r->x),
-              2) + pow ((r->y - filter->prev_r->y), 2));
-      if (distance <= min_distance) {
-        min_distance = distance;
-        filter->best_r = r;
-      }
-    }
-    /* Save best_r as prev_r for next frame comparison */
-    filter->prev_r = (CvRect *) filter->best_r;
-    /* send msg to app/bus if the detected gesture falls in the region of interest */
-    /* get center point of gesture */
-    c = cvPoint (filter->best_r->x + filter->best_r->width / 2,
-        filter->best_r->y + filter->best_r->height / 2);
-    /* send message:
-     * if the center point is in the region of interest, OR,
-     * if the region of interest remains default as (0,0,0,0)*/
-    if ((c.x >= filter->roi_x && c.x <= (filter->roi_x + filter->roi_width)
-            && c.y >= filter->roi_y
-            && c.y <= (filter->roi_y + filter->roi_height))
-        || (filter->roi_x == 0
-            && filter->roi_y == 0
-            && filter->roi_width == 0 && filter->roi_height == 0)) {
-      /* Define structure for message post */
-      s = gst_structure_new ("hand-gesture",
-          "gesture", G_TYPE_STRING, "fist",
-          "x", G_TYPE_UINT,
-          (guint) (filter->best_r->x + filter->best_r->width * 0.5), "y",
-          G_TYPE_UINT,
-          (guint) (filter->best_r->y + filter->best_r->height * 0.5), "width",
-          G_TYPE_UINT, (guint) filter->best_r->width, "height", G_TYPE_UINT,
-          (guint) filter->best_r->height, NULL);
-      /* Init message element */
-      m = gst_message_new_element (GST_OBJECT (filter), s);
-      /* Send message */
-      gst_element_post_message (GST_ELEMENT (filter), m);
-
-#if 0
-      /* send event
-       * here we use mouse-move event instead of fist-move or palm-move event
-       * !!! this will CHANGE in the future !!!
-       * !!! by adding gst_navigation_send_hand_detect_event() in navigation.c !!!
-       */
-      gst_navigation_send_mouse_event (GST_NAVIGATION (filter),
-          "mouse-move",
-          0,
-          (double) (filter->best_r->x + filter->best_r->width * 0.5),
-          (double) (filter->best_r->y + filter->best_r->height * 0.5));
-#endif
-    }
-    /* Check filter->display,
-     * If TRUE, displaying red circle marker in the out frame */
-    if (filter->display) {
-      CvPoint center;
-      int radius;
-      center.x = cvRound ((filter->best_r->x + filter->best_r->width * 0.5));
-      center.y = cvRound ((filter->best_r->y + filter->best_r->height * 0.5));
-      radius =
-          cvRound ((filter->best_r->width + filter->best_r->height) * 0.25);
-      cvCircle (img, center, radius, CV_RGB (0, 0, 200), 1, 8, 0);
-    }
-  } else {
-    /* if NO FIST gesture, detecting PALM gesture */
-    hands =
-        cvHaarDetectObjects (filter->cvGray, filter->cvCascade_palm,
-        filter->cvStorage, 1.1, 3, CV_HAAR_DO_CANNY_PRUNING, cvSize (24, 24),
-        cvSize (0, 0));
-    /* if PALM detected */
-    if (hands && hands->total > 0) {
       int min_distance, distance;
-      CvRect temp_r;
+      Rect temp_r;
       CvPoint c;
-      /* set frame buffer writable */
-      if (filter->display) {
-        buffer = gst_buffer_make_writable (buffer);
-        GST_DEBUG_OBJECT (filter, "%d PALM gestures detected\n",
-            (int) hands->total);
-      }
-      /* Go through all detected PALM gestures to get the best one
+
+      /* Go through all detected FIST gestures to get the best one
        * prev_r => previous hand
        * best_r => best hand in this frame
        */
-      /* suppose a min_distance for init comparison */
+      /* set min_distance for init comparison */
       min_distance = img->width + img->height;
       /* Init filter->prev_r */
-      temp_r = cvRect (0, 0, 0, 0);
+      temp_r = Rect (0, 0, 0, 0);
       if (filter->prev_r == NULL)
         filter->prev_r = &temp_r;
-      /* Get the best PALM gesture */
-      for (i = 0; i < hands->total; i++) {
-        r = (CvRect *) cvGetSeqElem (hands, i);
+      /* Get the best FIST gesture */
+      for (i = 0; i < hands.size(); i++) {
+        r = &hands[i];
         distance = (int) sqrt (pow ((r->x - filter->prev_r->x),
                 2) + pow ((r->y - filter->prev_r->y), 2));
         if (distance <= min_distance) {
           min_distance = distance;
-          filter->best_r = r;
+          delete (filter->best_r);
+          filter->best_r = new Rect (*r);
         }
       }
       /* Save best_r as prev_r for next frame comparison */
-      filter->prev_r = (CvRect *) filter->best_r;
+      filter->prev_r = filter->best_r;
 
       /* send msg to app/bus if the detected gesture falls in the region of interest */
       /* get center point of gesture */
@@ -548,13 +459,13 @@
               && filter->roi_width == 0 && filter->roi_height == 0)) {
         /* Define structure for message post */
         s = gst_structure_new ("hand-gesture",
-            "gesture", G_TYPE_STRING, "palm",
-            "x", G_TYPE_UINT,
-            (guint) (filter->best_r->x + filter->best_r->width * 0.5), "y",
-            G_TYPE_UINT,
-            (guint) (filter->best_r->y + filter->best_r->height * 0.5), "width",
-            G_TYPE_UINT, (guint) filter->best_r->width, "height", G_TYPE_UINT,
-            (guint) filter->best_r->height, NULL);
+            "gesture", G_TYPE_STRING, "fist",
+            "x", G_TYPE_INT,
+            (gint) (filter->best_r->x + filter->best_r->width * 0.5), "y",
+            G_TYPE_INT,
+            (gint) (filter->best_r->y + filter->best_r->height * 0.5), "width",
+            G_TYPE_INT, (gint) filter->best_r->width, "height", G_TYPE_INT,
+            (gint) filter->best_r->height, NULL);
         /* Init message element */
         m = gst_message_new_element (GST_OBJECT (filter), s);
         /* Send message */
@@ -572,20 +483,6 @@
             (double) (filter->best_r->x + filter->best_r->width * 0.5),
             (double) (filter->best_r->y + filter->best_r->height * 0.5));
 
-        /* or use another way to send upstream navigation event for debug
-         *
-         * GstEvent *event =
-         * gst_event_new_navigation (gst_structure_new
-         * ("application/x-gst-navigation", "event", G_TYPE_STRING,
-         * "mouse-move",
-         * "button", G_TYPE_INT, 0,
-         * "pointer_x", G_TYPE_DOUBLE,
-         * (double) (filter->best_r->x + filter->best_r->width * 0.5),
-         * "pointer_y", G_TYPE_DOUBLE,
-         * (double) (filter->best_r->y + filter->best_r->height * 0.5),
-         * NULL));
-         * gst_pad_send_event (GST_BASE_TRANSFORM_CAST (filter)->srcpad, event);
-         */
 #endif
       }
       /* Check filter->display,
@@ -599,6 +496,113 @@
             cvRound ((filter->best_r->width + filter->best_r->height) * 0.25);
         cvCircle (img, center, radius, CV_RGB (0, 0, 200), 1, 8, 0);
       }
+    } else {
+     /* if NO FIST gesture, detecting PALM gesture */
+      filter->cvCascade_palm->detectMultiScale (roi, hands, 1.1, 2,
+          CV_HAAR_DO_CANNY_PRUNING, cvSize (24, 24), cvSize (0, 0));
+      /* if PALM detected */
+      if (!hands.empty ()) {
+        int min_distance, distance;
+        Rect temp_r;
+        CvPoint c;
+
+        if (filter->display) {
+          GST_DEBUG_OBJECT (filter, "%d PALM gestures detected\n",
+              (int) hands.size ());
+        }
+        /* Go through all detected PALM gestures to get the best one
+         * prev_r => previous hand
+         * best_r => best hand in this frame
+         */
+        /* suppose a min_distance for init comparison */
+        min_distance = img->width + img->height;
+        /* Init filter->prev_r */
+        temp_r = Rect (0, 0, 0, 0);
+       if (filter->prev_r == NULL)
+          filter->prev_r = &temp_r;
+        /* Get the best PALM gesture */
+        for (i = 0; i < hands.size (); ++i) {
+          r = &hands[i];
+          distance = (int) sqrt (pow ((r->x - filter->prev_r->x),
+                  2) + pow ((r->y - filter->prev_r->y), 2));
+          if (distance <= min_distance) {
+            min_distance = distance;
+            delete (filter->best_r);
+            filter->best_r = new Rect (*r);
+          }
+        }
+        /* Save best_r as prev_r for next frame comparison */
+        filter->prev_r = filter->best_r;
+
+        /* send msg to app/bus if the detected gesture falls in the region of interest */
+        /* get center point of gesture */
+        c = cvPoint (filter->best_r->x + filter->best_r->width / 2,
+            filter->best_r->y + filter->best_r->height / 2);
+        /* send message:
+         * if the center point is in the region of interest, OR,
+         * if the region of interest remains default as (0,0,0,0)*/
+        if (((gint) c.x >= filter->roi_x
+                && (gint) c.x <= (filter->roi_x + filter->roi_width)
+                && (gint) c.y >= filter->roi_y
+                && (gint) c.y <= (filter->roi_y + filter->roi_height))
+            || (filter->roi_x == 0 && filter->roi_y == 0
+                && filter->roi_width == 0 && filter->roi_height == 0)) {
+          /* Define structure for message post */
+          s = gst_structure_new ("hand-gesture",
+              "gesture", G_TYPE_STRING, "palm",
+              "x", G_TYPE_INT,
+              (gint) (filter->best_r->x + filter->best_r->width * 0.5), "y",
+              G_TYPE_INT,
+              (gint) (filter->best_r->y + filter->best_r->height * 0.5),
+              "width", G_TYPE_INT, (gint) filter->best_r->width, "height",
+              G_TYPE_INT, (gint) filter->best_r->height, NULL);
+          /* Init message element */
+          m = gst_message_new_element (GST_OBJECT (filter), s);
+          /* Send message */
+          gst_element_post_message (GST_ELEMENT (filter), m);
+
+#if 0
+          /* send event
+           * here we use mouse-move event instead of fist-move or palm-move event
+           * !!! this will CHANGE in the future !!!
+           * !!! by adding gst_navigation_send_hand_detect_event() in navigation.c !!!
+           */
+          gst_navigation_send_mouse_event (GST_NAVIGATION (filter),
+              "mouse-move",
+              0,
+              (double) (filter->best_r->x + filter->best_r->width * 0.5),
+              (double) (filter->best_r->y + filter->best_r->height * 0.5));
+
+          /* or use another way to send upstream navigation event for debug
+           *
+           * GstEvent *event =
+           * gst_event_new_navigation (gst_structure_new
+           * ("application/x-gst-navigation", "event", G_TYPE_STRING,
+           * "mouse-move",
+           * "button", G_TYPE_INT, 0,
+           * "pointer_x", G_TYPE_DOUBLE,
+           * (double) (filter->best_r->x + filter->best_r->width * 0.5),
+           * "pointer_y", G_TYPE_DOUBLE,
+           * (double) (filter->best_r->y + filter->best_r->height * 0.5),
+           * NULL));
+           * gst_pad_send_event (GST_BASE_TRANSFORM_CAST (filter)->srcpad, event);
+           */
+#endif
+        }
+        /* Check filter->display,
+         * If TRUE, displaying red circle marker in the out frame */
+        if (filter->display) {
+          CvPoint center;
+          int radius;
+          center.x =
+              cvRound ((filter->best_r->x + filter->best_r->width * 0.5));
+          center.y =
+              cvRound ((filter->best_r->y + filter->best_r->height * 0.5));
+          radius =
+              cvRound ((filter->best_r->width + filter->best_r->height) * 0.25);
+          cvCircle (img, center, radius, CV_RGB (0, 0, 200), 1, 8, 0);
+        }
+      }
     }
   }
 
@@ -606,17 +610,18 @@
   return GST_FLOW_OK;
 }
 
-static CvHaarClassifierCascade *
+static CascadeClassifier *
 gst_handdetect_load_profile (GstHanddetect * filter, gchar * profile)
 {
-  CvHaarClassifierCascade *cascade;
+  CascadeClassifier *cascade;
 
-  if (profile == NULL)
+  cascade = new CascadeClassifier (profile);
+  if (cascade->empty ()) {
+    GST_ERROR_OBJECT (filter, "Invalid profile file: %s", profile);
+    delete cascade;
     return NULL;
-  if (!(cascade = (CvHaarClassifierCascade *) cvLoad (profile, 0, 0, 0))) {
-    GST_WARNING_OBJECT (filter, "Couldn't load Haar classifier cascade: %s.",
-        profile);
   }
+
   return cascade;
 }
 
diff --git a/ext/opencv/gsthanddetect.h b/ext/opencv/gsthanddetect.h
index 01a30bd..39308c8 100644
--- a/ext/opencv/gsthanddetect.h
+++ b/ext/opencv/gsthanddetect.h
@@ -45,9 +45,7 @@
 #ifndef __GST_HANDDETECT_H__
 #define __GST_HANDDETECT_H__
 
-#include <gst/gst.h>
-#include <gst/video/video.h>
-#include <gst/video/navigation.h>
+#include <cv.h>
 
 #include "gstopencvvideofilter.h"
 /* opencv */
@@ -83,20 +81,19 @@
   gchar *profile_fist;
   gchar *profile_palm;
   /* region of interest */
-  guint roi_x;
-  guint roi_y;
-  guint roi_width;
-  guint roi_height;
+  gint roi_x;
+  gint roi_y;
+  gint roi_width;
+  gint roi_height;
 
   /* opencv
    * cvGray - image to gray colour
    */
   IplImage *cvGray;
-  CvHaarClassifierCascade *cvCascade_fist;
-  CvHaarClassifierCascade *cvCascade_palm;
-  CvMemStorage *cvStorage;
-  CvRect *prev_r;
-  CvRect *best_r;
+  cv::CascadeClassifier *cvCascade_fist;
+  cv::CascadeClassifier *cvCascade_palm;
+  cv::Rect *prev_r;
+  cv::Rect *best_r;
 };
 
 struct _GstHanddetectClass
diff --git a/ext/opencv/gstmotioncells.c b/ext/opencv/gstmotioncells.cpp
similarity index 71%
rename from ext/opencv/gstmotioncells.c
rename to ext/opencv/gstmotioncells.cpp
index 2de99ab..a3290f7 100644
--- a/ext/opencv/gstmotioncells.c
+++ b/ext/opencv/gstmotioncells.cpp
@@ -2,7 +2,7 @@
  * GStreamer MotioCells detect areas of motion
  * Copyright (C) 2011 Robert Jobbagy <jobbagy.robert@gmail.com>
  * Copyright (C) 2011 Nicola Murino <nicola.murino@gmail.com>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -50,7 +50,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch-0.10 videotestsrc pattern=18 ! videorate ! videoscale ! video/x-raw,width=320,height=240,framerate=5/1 ! videoconvert ! motioncells ! videoconvert ! xvimagesink
+ * gst-launch-1.0 videotestsrc pattern=18 ! videorate ! videoscale ! video/x-raw,width=320,height=240,framerate=5/1 ! videoconvert ! motioncells ! videoconvert ! xvimagesink
  * ]|
  * </refsect2>
  */
@@ -59,16 +59,7 @@
 #  include <config.h>
 #endif
 
-#include <stdio.h>
-#include <string.h>
-#include <sys/time.h>
-#include <time.h>
-#include <limits.h>
-
-#include <glib.h>
 #include "gstmotioncells.h"
-#include "motioncells_wrapper.h"
-#include <gst/video/video.h>
 
 GST_DEBUG_CATEGORY_STATIC (gst_motion_cells_debug);
 #define GST_CAT_DEFAULT gst_motion_cells_debug
@@ -150,7 +141,7 @@
     GST_PAD_ALWAYS,
     GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("RGB")));
 
-G_DEFINE_TYPE (GstMotioncells, gst_motion_cells, GST_TYPE_ELEMENT);
+G_DEFINE_TYPE (GstMotioncells, gst_motion_cells, GST_TYPE_OPENCV_VIDEO_FILTER);
 
 static void gst_motion_cells_set_property (GObject * object, guint prop_id,
     const GValue * value, GParamSpec * pspec);
@@ -159,8 +150,8 @@
 
 static gboolean gst_motion_cells_handle_sink_event (GstPad * pad,
     GstObject * parent, GstEvent * event);
-static GstFlowReturn gst_motion_cells_chain (GstPad * pad, GstObject * parent,
-    GstBuffer * buf);
+static GstFlowReturn gst_motion_cells_transform_ip (GstOpencvVideoFilter *
+    filter, GstBuffer * buf, IplImage * img);
 
 static void gst_motioncells_update_motion_cells (GstMotioncells * filter);
 static void gst_motioncells_update_motion_masks (GstMotioncells * filter);
@@ -185,10 +176,6 @@
     GFREE (filter->motioncellsidx);
   }
 
-  if (filter->cvImage) {
-    cvReleaseImage (&filter->cvImage);
-  }
-
   GFREE (filter->motioncellscolor);
   GFREE (filter->prev_datafile);
   GFREE (filter->cur_datafile);
@@ -203,106 +190,112 @@
 gst_motion_cells_class_init (GstMotioncellsClass * klass)
 {
   GObjectClass *gobject_class;
+  GstOpencvVideoFilterClass *gstopencvbasefilter_class;
 
   GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
   gobject_class = (GObjectClass *) klass;
+  gstopencvbasefilter_class = (GstOpencvVideoFilterClass *) klass;
 
   gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_motion_cells_finalize);
   gobject_class->set_property = gst_motion_cells_set_property;
   gobject_class->get_property = gst_motion_cells_get_property;
 
+  gstopencvbasefilter_class->cv_trans_ip_func = gst_motion_cells_transform_ip;
+
   g_object_class_install_property (gobject_class, PROP_GRID_X,
       g_param_spec_int ("gridx", "Number of Horizontal Grids",
           "You can give number of horizontal grid cells.", GRID_MIN, GRID_MAX,
-          GRID_DEF, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          GRID_DEF,
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_GRID_Y,
       g_param_spec_int ("gridy", "Number of Vertical Grids",
           "You can give number of vertical grid cells.", GRID_MIN, GRID_MAX,
-          GRID_DEF, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          GRID_DEF,
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_SENSITIVITY,
       g_param_spec_double ("sensitivity", "Motion Sensitivity",
           "You can tunning the element motion sensitivity.", SENSITIVITY_MIN,
           SENSITIVITY_MAX, SENSITIVITY_DEFAULT,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_THRESHOLD,
       g_param_spec_double ("threshold", "Lower bound of motion cells number",
           "Threshold value for motion, when motion cells number greater sum cells * threshold, we show motion.",
           THRESHOLD_MIN, THRESHOLD_MAX, THRESHOLD_DEFAULT,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_GAP,
       g_param_spec_int ("gap",
           "Gap is time in second, elapsed time from last motion timestamp. ",
           "If elapsed time minus form last motion timestamp is greater or equal than gap then we post motion finished bus message. ",
           GAP_MIN, GAP_MAX, GAP_DEF,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_POSTNOMOTION,
       g_param_spec_int ("postnomotion", "POSTNOMOTION",
           "If non 0 post a no_motion event is posted on the bus if no motion is detected for N seconds",
           POST_NO_MOTION_MIN, POST_NO_MOTION_MAX, POST_NO_MOTION_DEF,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_MINIMUNMOTIONFRAMES,
       g_param_spec_int ("minimummotionframes", "MINIMUN MOTION FRAMES",
           "Define the minimum number of motion frames that trigger a motion event",
           MINIMUM_MOTION_FRAMES_MIN, MINIMUM_MOTION_FRAMES_MAX,
           MINIMUM_MOTION_FRAMES_DEF,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_DISPLAY,
       g_param_spec_boolean ("display", "Display",
           "Motion Cells visible or not on Current Frame", FALSE,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_POSTALLMOTION,
       g_param_spec_boolean ("postallmotion", "Post All Motion",
           "Element post bus msg for every motion frame or just motion start and motion stop",
-          FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          FALSE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_USEALPHA,
       g_param_spec_boolean ("usealpha", "Use alpha",
           "Use or not alpha blending on frames with motion cells", TRUE,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 #if 0
   /* FIXME: should not be a long property, make it either gint or gint64
    * (is this property actually used or useful for anything?) */
   g_object_class_install_property (gobject_class, PROP_DATE,
       g_param_spec_long ("date", "Motion Cell Date",
           "Current Date in milliseconds", DATE_MIN, DATE_MAX, DATE_DEF,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 #endif
   g_object_class_install_property (gobject_class, PROP_DATAFILE,
       g_param_spec_string ("datafile", "DataFile",
           "Location of motioncells data file (empty string means no saving)",
-          NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          NULL, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_DATAFILE_EXT,
       g_param_spec_string ("datafileextension", "DataFile Extension",
           "Extension of datafile", DEF_DATAFILEEXT,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_MOTIONMASKCOORD,
       g_param_spec_string ("motionmaskcoords", "Motion Mask with Coordinates",
           "The upper left x, y and lower right x, y coordinates separated with \":\", "
           "describe a region. Regions separated with \",\"", NULL,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_MOTIONMASKCELLSPOS,
       g_param_spec_string ("motionmaskcellspos",
           "Motion Mask with Cells Position",
           "The line and column idx separated with \":\" what cells want we mask-out, "
           "describe a cell. Cells separated with \",\"", NULL,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_CELLSCOLOR,
       g_param_spec_string ("cellscolor", "Color of Motion Cells",
           "The color of motion cells separated with \",\"", "255,255,0",
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_MOTIONCELLSIDX,
       g_param_spec_string ("motioncellsidx", "Motion Cells Of Interest(MOCI)",
           "The line and column idx separated with \":\", "
           "describe a cell. Cells separated with \",\"", NULL,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_CALCULATEMOTION,
       g_param_spec_boolean ("calculatemotion", "Calculate Motion",
           "If needs calculate motion on frame you need this property setting true otherwise false",
-          TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          TRUE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_MOTIONCELLTHICKNESS,
       g_param_spec_int ("motioncellthickness", "Motion Cell Thickness",
           "Motion Cell Border Thickness, if it's -1 then motion cell will be fill",
           THICKNESS_MIN, THICKNESS_MAX, THICKNESS_DEF,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   gst_element_class_set_static_metadata (element_class,
       "motioncells",
@@ -324,19 +317,8 @@
 static void
 gst_motion_cells_init (GstMotioncells * filter)
 {
-  filter->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink");
-  GST_PAD_SET_PROXY_CAPS (filter->sinkpad);
-
-  gst_pad_set_event_function (filter->sinkpad,
+  gst_pad_set_event_function (GST_BASE_TRANSFORM_SINK_PAD (filter),
       GST_DEBUG_FUNCPTR (gst_motion_cells_handle_sink_event));
-  gst_pad_set_chain_function (filter->sinkpad,
-      GST_DEBUG_FUNCPTR (gst_motion_cells_chain));
-
-  filter->srcpad = gst_pad_new_from_static_template (&src_factory, "src");
-  GST_PAD_SET_PROXY_CAPS (filter->srcpad);
-
-  gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad);
-  gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad);
 
   filter->display = TRUE;
   filter->calculate_motion = TRUE;
@@ -394,6 +376,8 @@
   filter->datafileidx = 0;
   filter->id = motion_cells_init ();
 
+  gst_opencv_video_filter_set_in_place (GST_OPENCV_VIDEO_FILTER_CAST (filter),
+      TRUE);
 }
 
 static void
@@ -518,8 +502,7 @@
           filter->motionmaskcoord_count = 0;
         }
       }
-      if (strs)
-        g_strfreev (strs);
+      g_strfreev (strs);
       tmpux = -1;
       tmpuy = -1;
       tmplx = -1;
@@ -546,8 +529,7 @@
           filter->motionmaskcells_count = 0;
         }
       }
-      if (motionmaskcellsstr)
-        g_strfreev (motionmaskcellsstr);
+      g_strfreev (motionmaskcellsstr);
       tmpux = -1;
       tmpuy = -1;
       tmplx = -1;
@@ -569,8 +551,7 @@
         filter->motioncellscolor->G_channel_value = g;
         filter->motioncellscolor->B_channel_value = b;
       }
-      if (colorstr)
-        g_strfreev (colorstr);
+      g_strfreev (colorstr);
       break;
     case PROP_MOTIONCELLSIDX:
       motioncellsstr = g_strsplit (g_value_get_string (value), ",", 255);
@@ -596,8 +577,7 @@
           filter->motioncells_count = 0;
         }
       }
-      if (motioncellsstr)
-        g_strfreev (motioncellsstr);
+      g_strfreev (motioncellsstr);
       tmpux = -1;
       tmpuy = -1;
       tmplx = -1;
@@ -834,11 +814,6 @@
       filter->height = info.height;
 
       filter->framerate = (double) info.fps_n / (double) info.fps_d;
-      if (filter->cvImage)
-        cvReleaseImage (&filter->cvImage);
-      filter->cvImage =
-          cvCreateImage (cvSize (filter->width, filter->height), IPL_DEPTH_8U,
-          3);
       break;
     }
     default:
@@ -848,19 +823,17 @@
   res = gst_pad_event_default (pad, parent, event);
 
   return res;
-
-
 }
 
 /* chain function
  * this function does the actual processing
  */
 static GstFlowReturn
-gst_motion_cells_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
+gst_motion_cells_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf,
+    IplImage * img)
 {
-  GstMotioncells *filter;
-  GstMapInfo info;
-  filter = gst_motion_cells (parent);
+  GstMotioncells *filter = gst_motion_cells (base);
+
   GST_OBJECT_LOCK (filter);
   if (filter->calculate_motion) {
     double sensitivity;
@@ -868,8 +841,8 @@
         motioncells_count, i;
     int thickness, success, motioncellsidxcnt, numberOfCells,
         motioncellsnumber, cellsOfInterestNumber;
-    int mincellsOfInterestNumber, motiondetect, minimum_motion_frames,
-        postnomotion;
+    int mincellsOfInterestNumber, motiondetect;
+    uint minimum_motion_frames, postnomotion;
     char *datafile;
     bool display, changed_datafile, useAlpha;
     gint64 starttime;
@@ -879,230 +852,235 @@
     motioncellidx *motioncellsidx;
 
     buf = gst_buffer_make_writable (buf);
-    if (gst_buffer_map (buf, &info, GST_MAP_WRITE)) {
-      filter->cvImage->imageData = (char *) info.data;
-      if (filter->firstframe) {
-        setPrevFrame (filter->cvImage, filter->id);
-        filter->firstframe = FALSE;
-      }
-      minimum_motion_frames = filter->minimum_motion_frames;
-      postnomotion = filter->postnomotion;
-      sensitivity = filter->sensitivity;
-      framerate = filter->framerate;
-      gridx = filter->gridx;
-      gridy = filter->gridy;
-      display = filter->display;
-      motionmaskcoord_count = filter->motionmaskcoord_count;
-      motionmaskcoords =
-          g_new0 (motionmaskcoordrect, filter->motionmaskcoord_count);
-      for (i = 0; i < filter->motionmaskcoord_count; i++) {     //we need divide 2 because we use gauss pyramid in C++ side
-        motionmaskcoords[i].upper_left_x =
-            filter->motionmaskcoords[i].upper_left_x / 2;
-        motionmaskcoords[i].upper_left_y =
-            filter->motionmaskcoords[i].upper_left_y / 2;
-        motionmaskcoords[i].lower_right_x =
-            filter->motionmaskcoords[i].lower_right_x / 2;
-        motionmaskcoords[i].lower_right_y =
-            filter->motionmaskcoords[i].lower_right_y / 2;
-      }
+    if (filter->firstframe) {
+      setPrevFrame (img, filter->id);
+      filter->firstframe = FALSE;
+    }
 
-      motioncellscolor.R_channel_value =
-          filter->motioncellscolor->R_channel_value;
-      motioncellscolor.G_channel_value =
-          filter->motioncellscolor->G_channel_value;
-      motioncellscolor.B_channel_value =
-          filter->motioncellscolor->B_channel_value;
+    minimum_motion_frames = filter->minimum_motion_frames;
+    postnomotion = filter->postnomotion;
+    sensitivity = filter->sensitivity;
+    framerate = filter->framerate;
+    gridx = filter->gridx;
+    gridy = filter->gridy;
+    display = filter->display;
+    motionmaskcoord_count = filter->motionmaskcoord_count;
+    motionmaskcoords =
+        g_new0 (motionmaskcoordrect, filter->motionmaskcoord_count);
+    for (i = 0; i < filter->motionmaskcoord_count; i++) {       //we need divide 2 because we use gauss pyramid in C++ side
+      motionmaskcoords[i].upper_left_x =
+          filter->motionmaskcoords[i].upper_left_x / 2;
+      motionmaskcoords[i].upper_left_y =
+          filter->motionmaskcoords[i].upper_left_y / 2;
+      motionmaskcoords[i].lower_right_x =
+          filter->motionmaskcoords[i].lower_right_x / 2;
+      motionmaskcoords[i].lower_right_y =
+          filter->motionmaskcoords[i].lower_right_y / 2;
+    }
 
-      if ((filter->changed_gridx || filter->changed_gridy
-              || filter->changed_startime)) {
-        if ((g_strcmp0 (filter->cur_datafile, NULL) != 0)) {
-          GFREE (filter->cur_datafile);
-          filter->datafileidx++;
-          filter->cur_datafile =
-              g_strdup_printf ("%s-%d.%s", filter->basename_datafile,
-              filter->datafileidx, filter->datafile_extension);
-          filter->changed_datafile = TRUE;
-          motion_cells_free_resources (filter->id);
-        }
-        if (filter->motioncells_count > 0)
-          gst_motioncells_update_motion_cells (filter);
-        if (filter->motionmaskcells_count > 0)
-          gst_motioncells_update_motion_masks (filter);
-        filter->changed_gridx = FALSE;
-        filter->changed_gridy = FALSE;
-        filter->changed_startime = FALSE;
-      }
-      datafile = g_strdup (filter->cur_datafile);
-      filter->cur_buff_timestamp = (GST_BUFFER_TIMESTAMP (buf) / GST_MSECOND);
-      filter->starttime +=
-          (filter->cur_buff_timestamp - filter->prev_buff_timestamp);
-      starttime = filter->starttime;
-      if (filter->changed_datafile || filter->diff_timestamp < 0)
-        filter->diff_timestamp =
-            (gint64) (GST_BUFFER_TIMESTAMP (buf) / GST_MSECOND);
-      changed_datafile = filter->changed_datafile;
-      motionmaskcells_count = filter->motionmaskcells_count;
-      motionmaskcellsidx =
-          g_new0 (motioncellidx, filter->motionmaskcells_count);
-      for (i = 0; i < filter->motionmaskcells_count; i++) {
-        motionmaskcellsidx[i].lineidx = filter->motionmaskcellsidx[i].lineidx;
-        motionmaskcellsidx[i].columnidx =
-            filter->motionmaskcellsidx[i].columnidx;
-      }
-      motioncells_count = filter->motioncells_count;
-      motioncellsidx = g_new0 (motioncellidx, filter->motioncells_count);
-      for (i = 0; i < filter->motioncells_count; i++) {
-        motioncellsidx[i].lineidx = filter->motioncellsidx[i].lineidx;
-        motioncellsidx[i].columnidx = filter->motioncellsidx[i].columnidx;
-      }
-      useAlpha = filter->usealpha;
-      thickness = filter->thickness;
-      success =
-          perform_detection_motion_cells (filter->cvImage, sensitivity,
-          framerate, gridx, gridy,
-          (gint64) (GST_BUFFER_TIMESTAMP (buf) / GST_MSECOND) -
-          filter->diff_timestamp, display, useAlpha, motionmaskcoord_count,
-          motionmaskcoords, motionmaskcells_count, motionmaskcellsidx,
-          motioncellscolor, motioncells_count, motioncellsidx, starttime,
-          datafile, changed_datafile, thickness, filter->id);
+    motioncellscolor.R_channel_value =
+        filter->motioncellscolor->R_channel_value;
+    motioncellscolor.G_channel_value =
+        filter->motioncellscolor->G_channel_value;
+    motioncellscolor.B_channel_value =
+        filter->motioncellscolor->B_channel_value;
 
-      if ((success == 1) && (filter->sent_init_error_msg == FALSE)) {
-        char *initfailedreason;
-        int initerrorcode;
-        GstStructure *s;
-        GstMessage *m;
-        initfailedreason = getInitDataFileFailed (filter->id);
-        initerrorcode = getInitErrorCode (filter->id);
-        s = gst_structure_new ("motion", "init_error_code", G_TYPE_INT,
-            initerrorcode, "details", G_TYPE_STRING, initfailedreason, NULL);
-        m = gst_message_new_element (GST_OBJECT (filter), s);
-        gst_element_post_message (GST_ELEMENT (filter), m);
-        filter->sent_init_error_msg = TRUE;
+    if ((filter->changed_gridx || filter->changed_gridy
+            || filter->changed_startime)) {
+      if ((g_strcmp0 (filter->cur_datafile, NULL) != 0)) {
+        GFREE (filter->cur_datafile);
+        filter->datafileidx++;
+        filter->cur_datafile =
+            g_strdup_printf ("%s-%d.%s", filter->basename_datafile,
+            filter->datafileidx, filter->datafile_extension);
+        filter->changed_datafile = TRUE;
+        motion_cells_free_resources (filter->id);
       }
-      if ((success == -1) && (filter->sent_save_error_msg == FALSE)) {
-        char *savefailedreason;
-        int saveerrorcode;
-        GstStructure *s;
-        GstMessage *m;
-        savefailedreason = getSaveDataFileFailed (filter->id);
-        saveerrorcode = getSaveErrorCode (filter->id);
-        s = gst_structure_new ("motion", "save_error_code", G_TYPE_INT,
-            saveerrorcode, "details", G_TYPE_STRING, savefailedreason, NULL);
-        m = gst_message_new_element (GST_OBJECT (filter), s);
-        gst_element_post_message (GST_ELEMENT (filter), m);
-        filter->sent_save_error_msg = TRUE;
-      }
-      if (success == -2) {
-        GST_LOG_OBJECT (filter, "frame dropped");
-        gst_buffer_unmap (buf, &info);
-        filter->prev_buff_timestamp = filter->cur_buff_timestamp;
-        //free
-        GFREE (datafile);
-        GFREE (motionmaskcoords);
-        GFREE (motionmaskcellsidx);
-        GFREE (motioncellsidx);
-        GST_OBJECT_UNLOCK (filter);
-        return gst_pad_push (filter->srcpad, buf);
-      }
-      filter->changed_datafile = getChangedDataFile (filter->id);
-      motioncellsidxcnt = getMotionCellsIdxCnt (filter->id);
-      numberOfCells = filter->gridx * filter->gridy;
-      motioncellsnumber = motioncellsidxcnt / MSGLEN;
-      cellsOfInterestNumber = (filter->motioncells_count > 0) ? //how many cells interest for us
-          (filter->motioncells_count) : (numberOfCells);
-      mincellsOfInterestNumber =
-          floor ((double) cellsOfInterestNumber * filter->threshold);
-      GST_OBJECT_UNLOCK (filter);
-      motiondetect = (motioncellsnumber >= mincellsOfInterestNumber) ? 1 : 0;
-      if ((motioncellsidxcnt > 0) && (motiondetect == 1)) {
-        char *detectedmotioncells;
-        filter->last_motion_timestamp = GST_BUFFER_TIMESTAMP (buf);
-        detectedmotioncells = getMotionCellsIdx (filter->id);
-        if (detectedmotioncells) {
-          filter->consecutive_motion++;
-          if ((filter->previous_motion == FALSE)
-              && (filter->consecutive_motion >= minimum_motion_frames)) {
-            GstStructure *s;
-            GstMessage *m;
-            GST_DEBUG_OBJECT (filter, "motion started, post msg on the bus");
-            filter->previous_motion = TRUE;
-            filter->motion_begin_timestamp = GST_BUFFER_TIMESTAMP (buf);
-            s = gst_structure_new ("motion", "motion_cells_indices",
-                G_TYPE_STRING, detectedmotioncells, "motion_begin",
-                G_TYPE_UINT64, filter->motion_begin_timestamp, NULL);
-            m = gst_message_new_element (GST_OBJECT (filter), s);
-            gst_element_post_message (GST_ELEMENT (filter), m);
-          } else if (filter->postallmotion) {
-            GstStructure *s;
-            GstMessage *m;
-            GST_DEBUG_OBJECT (filter, "motion, post msg on the bus");
-            filter->motion_timestamp = GST_BUFFER_TIMESTAMP (buf);
-            s = gst_structure_new ("motion", "motion_cells_indices",
-                G_TYPE_STRING, detectedmotioncells, "motion", G_TYPE_UINT64,
-                filter->motion_timestamp, NULL);
-            m = gst_message_new_element (GST_OBJECT (filter), s);
-            gst_element_post_message (GST_ELEMENT (filter), m);
-          }
-        } else {
-          GstStructure *s;
-          GstMessage *m;
-          s = gst_structure_new ("motion", "motion_cells_indices",
-              G_TYPE_STRING, "error", NULL);
-          m = gst_message_new_element (GST_OBJECT (filter), s);
-          gst_element_post_message (GST_ELEMENT (filter), m);
-        }
-      } else {
-        filter->consecutive_motion = 0;
-        if ((((GST_BUFFER_TIMESTAMP (buf) -
-                        filter->last_motion_timestamp) / 1000000000l) >=
-                filter->gap)
-            && (filter->last_motion_timestamp > 0)) {
-          if (filter->previous_motion) {
-            GstStructure *s;
-            GstMessage *m;
-            GST_DEBUG_OBJECT (filter, "motion finished, post msg on the bus");
-            filter->previous_motion = FALSE;
-            s = gst_structure_new ("motion", "motion_finished", G_TYPE_UINT64,
-                filter->last_motion_timestamp, NULL);
-            m = gst_message_new_element (GST_OBJECT (filter), s);
-            gst_element_post_message (GST_ELEMENT (filter), m);
-          }
-        }
-      }
-      if (postnomotion > 0) {
-        guint64 last_buf_timestamp = GST_BUFFER_TIMESTAMP (buf) / 1000000000l;
-        if ((last_buf_timestamp -
-                (filter->last_motion_timestamp / 1000000000l)) >=
-            filter->postnomotion) {
-          GST_DEBUG_OBJECT (filter, "post no motion msg on the bus");
-          if ((last_buf_timestamp -
-                  (filter->last_nomotion_notified / 1000000000l)) >=
-              filter->postnomotion) {
-            GstStructure *s;
-            GstMessage *m;
-            filter->last_nomotion_notified = GST_BUFFER_TIMESTAMP (buf);
-            s = gst_structure_new ("motion", "no_motion", G_TYPE_UINT64,
-                filter->last_motion_timestamp, NULL);
-            m = gst_message_new_element (GST_OBJECT (filter), s);
-            gst_element_post_message (GST_ELEMENT (filter), m);
-          }
-        }
-      }
-      gst_buffer_unmap (buf, &info);
+      if (filter->motioncells_count > 0)
+        gst_motioncells_update_motion_cells (filter);
+      if (filter->motionmaskcells_count > 0)
+        gst_motioncells_update_motion_masks (filter);
+      filter->changed_gridx = FALSE;
+      filter->changed_gridy = FALSE;
+      filter->changed_startime = FALSE;
+    }
+
+    datafile = g_strdup (filter->cur_datafile);
+    filter->cur_buff_timestamp = (GST_BUFFER_TIMESTAMP (buf) / GST_MSECOND);
+    filter->starttime +=
+        (filter->cur_buff_timestamp - filter->prev_buff_timestamp);
+    starttime = filter->starttime;
+    if (filter->changed_datafile || filter->diff_timestamp < 0)
+      filter->diff_timestamp =
+          (gint64) (GST_BUFFER_TIMESTAMP (buf) / GST_MSECOND);
+    changed_datafile = filter->changed_datafile;
+
+    motionmaskcells_count = filter->motionmaskcells_count;
+    motionmaskcellsidx = g_new0 (motioncellidx, filter->motionmaskcells_count);
+    for (i = 0; i < filter->motionmaskcells_count; i++) {
+      motionmaskcellsidx[i].lineidx = filter->motionmaskcellsidx[i].lineidx;
+      motionmaskcellsidx[i].columnidx = filter->motionmaskcellsidx[i].columnidx;
+    }
+    motioncells_count = filter->motioncells_count;
+    motioncellsidx = g_new0 (motioncellidx, filter->motioncells_count);
+    for (i = 0; i < filter->motioncells_count; i++) {
+      motioncellsidx[i].lineidx = filter->motioncellsidx[i].lineidx;
+      motioncellsidx[i].columnidx = filter->motioncellsidx[i].columnidx;
+    }
+
+    useAlpha = filter->usealpha;
+    thickness = filter->thickness;
+    success =
+        perform_detection_motion_cells (img, sensitivity,
+        framerate, gridx, gridy,
+        (gint64) (GST_BUFFER_TIMESTAMP (buf) / GST_MSECOND) -
+        filter->diff_timestamp, display, useAlpha, motionmaskcoord_count,
+        motionmaskcoords, motionmaskcells_count, motionmaskcellsidx,
+        motioncellscolor, motioncells_count, motioncellsidx, starttime,
+        datafile, changed_datafile, thickness, filter->id);
+
+    if ((success == 1) && (filter->sent_init_error_msg == FALSE)) {
+      char *initfailedreason;
+      int initerrorcode;
+      GstStructure *s;
+      GstMessage *m;
+
+      initfailedreason = getInitDataFileFailed (filter->id);
+      initerrorcode = getInitErrorCode (filter->id);
+      s = gst_structure_new ("motion", "init_error_code", G_TYPE_INT,
+          initerrorcode, "details", G_TYPE_STRING, initfailedreason, NULL);
+      m = gst_message_new_element (GST_OBJECT (filter), s);
+      gst_element_post_message (GST_ELEMENT (filter), m);
+      filter->sent_init_error_msg = TRUE;
+    }
+    if ((success == -1) && (filter->sent_save_error_msg == FALSE)) {
+      char *savefailedreason;
+      int saveerrorcode;
+      GstStructure *s;
+      GstMessage *m;
+
+      savefailedreason = getSaveDataFileFailed (filter->id);
+      saveerrorcode = getSaveErrorCode (filter->id);
+      s = gst_structure_new ("motion", "save_error_code", G_TYPE_INT,
+          saveerrorcode, "details", G_TYPE_STRING, savefailedreason, NULL);
+      m = gst_message_new_element (GST_OBJECT (filter), s);
+      gst_element_post_message (GST_ELEMENT (filter), m);
+      filter->sent_save_error_msg = TRUE;
+    }
+    if (success == -2) {
+      GST_LOG_OBJECT (filter, "frame dropped");
       filter->prev_buff_timestamp = filter->cur_buff_timestamp;
       //free
       GFREE (datafile);
       GFREE (motionmaskcoords);
       GFREE (motionmaskcellsidx);
       GFREE (motioncellsidx);
-    } else {
-      GST_WARNING_OBJECT (filter, "error mapping input buffer");
       GST_OBJECT_UNLOCK (filter);
+      return GST_FLOW_OK;
     }
+
+    filter->changed_datafile = getChangedDataFile (filter->id);
+    motioncellsidxcnt = getMotionCellsIdxCnt (filter->id);
+    numberOfCells = filter->gridx * filter->gridy;
+    motioncellsnumber = motioncellsidxcnt / MSGLEN;
+    cellsOfInterestNumber = (filter->motioncells_count > 0) ?   //how many cells interest for us
+        (filter->motioncells_count) : (numberOfCells);
+    mincellsOfInterestNumber =
+        floor ((double) cellsOfInterestNumber * filter->threshold);
+    GST_OBJECT_UNLOCK (filter);
+    motiondetect = (motioncellsnumber >= mincellsOfInterestNumber) ? 1 : 0;
+    if ((motioncellsidxcnt > 0) && (motiondetect == 1)) {
+      char *detectedmotioncells;
+
+      filter->last_motion_timestamp = GST_BUFFER_TIMESTAMP (buf);
+      detectedmotioncells = getMotionCellsIdx (filter->id);
+      if (detectedmotioncells) {
+        filter->consecutive_motion++;
+        if ((filter->previous_motion == FALSE)
+            && (filter->consecutive_motion >= minimum_motion_frames)) {
+          GstStructure *s;
+          GstMessage *m;
+
+          GST_DEBUG_OBJECT (filter, "motion started, post msg on the bus");
+          filter->previous_motion = TRUE;
+          filter->motion_begin_timestamp = GST_BUFFER_TIMESTAMP (buf);
+          s = gst_structure_new ("motion", "motion_cells_indices",
+              G_TYPE_STRING, detectedmotioncells, "motion_begin",
+              G_TYPE_UINT64, filter->motion_begin_timestamp, NULL);
+          m = gst_message_new_element (GST_OBJECT (filter), s);
+          gst_element_post_message (GST_ELEMENT (filter), m);
+        } else if (filter->postallmotion) {
+          GstStructure *s;
+          GstMessage *m;
+
+          GST_DEBUG_OBJECT (filter, "motion, post msg on the bus");
+          filter->motion_timestamp = GST_BUFFER_TIMESTAMP (buf);
+          s = gst_structure_new ("motion", "motion_cells_indices",
+              G_TYPE_STRING, detectedmotioncells, "motion", G_TYPE_UINT64,
+              filter->motion_timestamp, NULL);
+          m = gst_message_new_element (GST_OBJECT (filter), s);
+          gst_element_post_message (GST_ELEMENT (filter), m);
+        }
+      } else {
+        GstStructure *s;
+        GstMessage *m;
+
+        s = gst_structure_new ("motion", "motion_cells_indices",
+            G_TYPE_STRING, "error", NULL);
+        m = gst_message_new_element (GST_OBJECT (filter), s);
+        gst_element_post_message (GST_ELEMENT (filter), m);
+      }
+    } else {
+      filter->consecutive_motion = 0;
+      if ((((GST_BUFFER_TIMESTAMP (buf) -
+                      filter->last_motion_timestamp) / 1000000000l) >=
+              filter->gap)
+          && (filter->last_motion_timestamp > 0)) {
+        if (filter->previous_motion) {
+          GstStructure *s;
+          GstMessage *m;
+
+          GST_DEBUG_OBJECT (filter, "motion finished, post msg on the bus");
+          filter->previous_motion = FALSE;
+          s = gst_structure_new ("motion", "motion_finished", G_TYPE_UINT64,
+              filter->last_motion_timestamp, NULL);
+          m = gst_message_new_element (GST_OBJECT (filter), s);
+          gst_element_post_message (GST_ELEMENT (filter), m);
+        }
+      }
+    }
+    if (postnomotion > 0) {
+      guint64 last_buf_timestamp = GST_BUFFER_TIMESTAMP (buf) / 1000000000l;
+      if ((last_buf_timestamp -
+              (filter->last_motion_timestamp / 1000000000l)) >=
+          filter->postnomotion) {
+        GST_DEBUG_OBJECT (filter, "post no motion msg on the bus");
+        if ((last_buf_timestamp -
+                (filter->last_nomotion_notified / 1000000000l)) >=
+            filter->postnomotion) {
+          GstStructure *s;
+          GstMessage *m;
+
+          filter->last_nomotion_notified = GST_BUFFER_TIMESTAMP (buf);
+          s = gst_structure_new ("motion", "no_motion", G_TYPE_UINT64,
+              filter->last_motion_timestamp, NULL);
+          m = gst_message_new_element (GST_OBJECT (filter), s);
+          gst_element_post_message (GST_ELEMENT (filter), m);
+        }
+      }
+    }
+    filter->prev_buff_timestamp = filter->cur_buff_timestamp;
+
+    //free
+    GFREE (datafile);
+    GFREE (motionmaskcoords);
+    GFREE (motionmaskcellsidx);
+    GFREE (motioncellsidx);
   } else {
+    GST_WARNING_OBJECT (filter, "error mapping input buffer");
     GST_OBJECT_UNLOCK (filter);
   }
-  return gst_pad_push (filter->srcpad, buf);
+  return GST_FLOW_OK;
 }
 
 /* entry point to initialize the plug-in
diff --git a/ext/opencv/gstmotioncells.h b/ext/opencv/gstmotioncells.h
index 0a7daa0..da04a74 100644
--- a/ext/opencv/gstmotioncells.h
+++ b/ext/opencv/gstmotioncells.h
@@ -2,7 +2,7 @@
  * GStreamer
  * Copyright (C) 2011 Robert Jobbagy <jobbagy.robert@gmail.com>
  * Copyright (C) 2011 Nicola Murino <nicola.murino@gmail.com>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -45,8 +45,9 @@
 #ifndef __GST_MOTIONCELLS_H__
 #define __GST_MOTIONCELLS_H__
 
-#include <gst/gst.h>
+#include <gstopencvvideofilter.h>
 #include <opencv2/core/core_c.h>
+#include "motioncells_wrapper.h"
 
 G_BEGIN_DECLS
 /* #defines don't like whitespacey bits */
@@ -63,28 +64,9 @@
 typedef struct _GstMotioncells GstMotioncells;
 typedef struct _GstMotioncellsClass GstMotioncellsClass;
 
-typedef struct {
-	int upper_left_x;
-	int upper_left_y;
-	int lower_right_x;
-	int lower_right_y;
-} motionmaskcoordrect;
-
-typedef struct {
-	int R_channel_value;
-	int G_channel_value;
-	int B_channel_value;
-} cellscolor;
-
-typedef struct {
-	int lineidx;
-	int columnidx;
-} motioncellidx;
-
 struct _GstMotioncells
 {
-  GstElement element;
-  GstPad *sinkpad, *srcpad;
+  GstOpencvVideoFilter element;
   GstState state;
   gboolean display, calculate_motion, firstgridx, firstgridy, changed_gridx,
       changed_gridy, changed_startime;
@@ -94,12 +76,12 @@
   gchar *prev_datafile, *cur_datafile, *basename_datafile, *datafile_extension;
   gint prevgridx, gridx, prevgridy, gridy, id;
   gdouble sensitivity, threshold;
-  IplImage *cvImage;
   motionmaskcoordrect *motionmaskcoords;
   cellscolor *motioncellscolor;
   motioncellidx *motioncellsidx, *motionmaskcellsidx;
   int motionmaskcoord_count, motioncells_count, motionmaskcells_count;
-  int gap, thickness, datafileidx, postnomotion, minimum_motion_frames;
+  int thickness;
+  guint gap, datafileidx, postnomotion, minimum_motion_frames;
   guint64 motion_begin_timestamp, last_motion_timestamp, motion_timestamp,
       last_nomotion_notified, prev_buff_timestamp, cur_buff_timestamp;
   gint64 diff_timestamp, starttime;
@@ -112,7 +94,7 @@
 
 struct _GstMotioncellsClass
 {
-  GstElementClass parent_class;
+  GstOpencvVideoFilterClass parent_class;
 };
 
 GType gst_motion_cells_get_type (void);
diff --git a/ext/opencv/gstopencvutils.c b/ext/opencv/gstopencvutils.cpp
similarity index 65%
rename from ext/opencv/gstopencvutils.c
rename to ext/opencv/gstopencvutils.cpp
index 89901bf..da6eea9 100644
--- a/ext/opencv/gstopencvutils.c
+++ b/ext/opencv/gstopencvutils.cpp
@@ -26,78 +26,14 @@
 #include "gstopencvutils.h"
 #include <opencv2/core/types_c.h>
 
-static gboolean
-gst_opencv_get_ipl_depth_and_channels (GstStructure * structure,
-    gint * ipldepth, gint * channels, GError ** err)
-{
-  GstVideoFormat format = GST_VIDEO_FORMAT_UNKNOWN;
-  const GstVideoFormatInfo *info;
-  gint depth = 0, i;
-  const gchar *s;
-
-  if (gst_structure_has_name (structure, "video/x-raw")) {
-    if (!(s = gst_structure_get_string (structure, "format")))
-      return FALSE;
-    format = gst_video_format_from_string (s);
-    if (format == GST_VIDEO_FORMAT_UNKNOWN)
-      return FALSE;
-  }
-
-  info = gst_video_format_get_info (format);
-
-  if (GST_VIDEO_FORMAT_INFO_IS_RGB (info))
-    *channels = 3;
-  else if (GST_VIDEO_FORMAT_INFO_IS_GRAY (info))
-    *channels = 1;
-  else {
-    g_set_error (err, GST_CORE_ERROR, GST_CORE_ERROR_NEGOTIATION,
-        "Unsupported structure %s", gst_structure_get_name (structure));
-    return FALSE;
-  }
-
-  for (i = 0; i < GST_VIDEO_FORMAT_INFO_N_COMPONENTS (info); i++)
-    depth += GST_VIDEO_FORMAT_INFO_DEPTH (info, i);
-
-  if (depth / *channels == 8) {
-    /* TODO signdness? */
-    *ipldepth = IPL_DEPTH_8U;
-  } else if (depth / *channels == 16) {
-    *ipldepth = IPL_DEPTH_16U;
-  } else {
-    g_set_error (err, GST_CORE_ERROR, GST_CORE_ERROR_NEGOTIATION,
-        "Unsupported depth/channels %d/%d", depth, *channels);
-    return FALSE;
-  }
-
-  return TRUE;
-}
-
-gboolean
-gst_opencv_parse_iplimage_params_from_structure (GstStructure * structure,
-    gint * width, gint * height, gint * ipldepth, gint * channels,
-    GError ** err)
-{
-  if (!gst_opencv_get_ipl_depth_and_channels (structure, ipldepth, channels,
-          err)) {
-    return FALSE;
-  }
-
-  if (!gst_structure_get_int (structure, "width", width) ||
-      !gst_structure_get_int (structure, "height", height)) {
-    g_set_error (err, GST_CORE_ERROR, GST_CORE_ERROR_NEGOTIATION,
-        "No width/height in caps");
-    return FALSE;
-  }
-
-  return TRUE;
-}
 
 gboolean
 gst_opencv_parse_iplimage_params_from_caps (GstCaps * caps, gint * width,
     gint * height, gint * ipldepth, gint * channels, GError ** err)
 {
   GstVideoInfo info;
-  gint i, depth = 0;
+  gint depth = 0;
+  guint i;
 
   if (!gst_video_info_from_caps (&info, caps)) {
     GST_ERROR ("Failed to get the videoinfo from caps");
diff --git a/ext/opencv/gstopencvutils.h b/ext/opencv/gstopencvutils.h
index 84123f1..13dfd9e 100644
--- a/ext/opencv/gstopencvutils.h
+++ b/ext/opencv/gstopencvutils.h
@@ -30,17 +30,13 @@
 #include <gst/video/video.h>
 
 
-
-gboolean
-gst_opencv_get_ipldepth (gint depth, gint bpp, gint * ipldepth);
+G_BEGIN_DECLS
 
 gboolean gst_opencv_parse_iplimage_params_from_caps
     (GstCaps * caps, gint * width, gint * height, gint * depth,
     gint * channels, GError ** err);
-gboolean gst_opencv_parse_iplimage_params_from_structure
-    (GstStructure * structure, gint * width, gint * height, gint * depth,
-    gint * channels, GError ** err);
 
 GstCaps * gst_opencv_caps_from_cv_image_type (int cv_type);
+G_END_DECLS
 
 #endif /* __GST_OPENCV_UTILS__ */
diff --git a/ext/opencv/gstopencvvideofilter.c b/ext/opencv/gstopencvvideofilter.cpp
similarity index 98%
rename from ext/opencv/gstopencvvideofilter.c
rename to ext/opencv/gstopencvvideofilter.cpp
index c53c7f5..4b8e536 100644
--- a/ext/opencv/gstopencvvideofilter.c
+++ b/ext/opencv/gstopencvvideofilter.cpp
@@ -1,7 +1,7 @@
 /*
  * GStreamer
  * Copyright (C) 2010 Thiago Santos <thiago.sousa.santos@collabora.co.uk>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -47,8 +47,6 @@
 #  include <config.h>
 #endif
 
-#include <gst/gst.h>
-
 #include "gstopencvvideofilter.h"
 #include "gstopencvutils.h"
 
@@ -135,7 +133,7 @@
 
   gobject_class = (GObjectClass *) klass;
   basetrans_class = (GstBaseTransformClass *) klass;
-  parent_class = g_type_class_peek_parent (klass);
+  parent_class = (GstElementClass *) g_type_class_peek_parent (klass);
 
   GST_DEBUG_CATEGORY_INIT (gst_opencv_video_filter_debug,
       "opencvbasetransform", 0, "opencvbasetransform element");
@@ -217,7 +215,7 @@
   g_return_val_if_fail (fclass->cv_trans_ip_func != NULL, GST_FLOW_ERROR);
   g_return_val_if_fail (transform->cvImage != NULL, GST_FLOW_ERROR);
 
-  if (!gst_buffer_map (buffer, &info, GST_MAP_READWRITE))
+  if (!gst_buffer_map (buffer, &info, (GstMapFlags) (GST_MAP_READWRITE)))
     goto map_failed;
 
   transform->cvImage->imageData = (char *) info.data;
diff --git a/ext/opencv/gstpyramidsegment.c b/ext/opencv/gstpyramidsegment.cpp
similarity index 73%
rename from ext/opencv/gstpyramidsegment.c
rename to ext/opencv/gstpyramidsegment.cpp
index 618ffdf..0c9f1e9 100644
--- a/ext/opencv/gstpyramidsegment.c
+++ b/ext/opencv/gstpyramidsegment.cpp
@@ -3,7 +3,7 @@
  * Copyright (C) 2005 Thomas Vander Stichele <thomas@apestaart.org>
  * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
  * Copyright (C) 2008 Michael Sheldon <mike@mikeasoft.com>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -51,7 +51,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v -m fakesrc ! pyramidsegment ! fakesink silent=TRUE
+ * gst-launch-1.0 -v videotestsrc ! pyramidsegment ! videoconvert ! autovideosink
  * ]|
  * </refsect2>
  */
@@ -60,9 +60,6 @@
 #  include <config.h>
 #endif
 
-#include <gst/gst.h>
-
-#include "gstopencvutils.h"
 #include "gstpyramidsegment.h"
 
 #define BLOCK_SIZE 1000
@@ -70,6 +67,7 @@
 GST_DEBUG_CATEGORY_STATIC (gst_pyramid_segment_debug);
 #define GST_CAT_DEFAULT gst_pyramid_segment_debug
 
+using namespace cv;
 /* Filter signals and args */
 enum
 {
@@ -102,17 +100,16 @@
     GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("RGB"))
     );
 
-G_DEFINE_TYPE (GstPyramidSegment, gst_pyramid_segment, GST_TYPE_ELEMENT);
+G_DEFINE_TYPE (GstPyramidSegment, gst_pyramid_segment,
+    GST_TYPE_OPENCV_VIDEO_FILTER);
 
 static void gst_pyramid_segment_set_property (GObject * object, guint prop_id,
     const GValue * value, GParamSpec * pspec);
 static void gst_pyramid_segment_get_property (GObject * object, guint prop_id,
     GValue * value, GParamSpec * pspec);
 
-static gboolean gst_pyramid_segment_handle_sink_event (GstPad * pad,
-    GstObject * parent, GstEvent * event);
-static GstFlowReturn gst_pyramid_segment_chain (GstPad * pad,
-    GstObject * parent, GstBuffer * buf);
+static GstFlowReturn gst_pyramid_segment_transform (GstOpencvVideoFilter * base,
+    GstBuffer * buf, IplImage * img, GstBuffer * outbuf, IplImage * outimg);
 
 /* Clean up */
 static void
@@ -120,10 +117,6 @@
 {
   GstPyramidSegment *filter = GST_PYRAMID_SEGMENT (obj);
 
-  if (filter->cvImage != NULL) {
-    cvReleaseImage (&filter->cvImage);
-  }
-
   cvReleaseMemStorage (&filter->storage);
 
   G_OBJECT_CLASS (gst_pyramid_segment_parent_class)->finalize (obj);
@@ -134,32 +127,36 @@
 gst_pyramid_segment_class_init (GstPyramidSegmentClass * klass)
 {
   GObjectClass *gobject_class;
+  GstOpencvVideoFilterClass *gstopencvbasefilter_class;
 
   GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
   gobject_class = (GObjectClass *) klass;
+  gstopencvbasefilter_class = (GstOpencvVideoFilterClass *) klass;
 
   gobject_class->finalize = GST_DEBUG_FUNCPTR (gst_pyramid_segment_finalize);
   gobject_class->set_property = gst_pyramid_segment_set_property;
   gobject_class->get_property = gst_pyramid_segment_get_property;
 
+  gstopencvbasefilter_class->cv_trans_func = gst_pyramid_segment_transform;
+
   g_object_class_install_property (gobject_class, PROP_SILENT,
       g_param_spec_boolean ("silent", "Silent", "Produce verbose output ?",
-          FALSE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          FALSE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   g_object_class_install_property (gobject_class, PROP_THRESHOLD1,
       g_param_spec_double ("threshold1", "Threshold1",
           "Error threshold for establishing links", 0, 1000, 50,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   g_object_class_install_property (gobject_class, PROP_THRESHOLD2,
       g_param_spec_double ("threshold2", "Threshold2",
           "Error threshold for segment clustering", 0, 1000, 60,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   g_object_class_install_property (gobject_class, PROP_LEVEL,
       g_param_spec_int ("level", "Level",
           "Maximum level of the pyramid segmentation", 1, 4, 4,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   gst_element_class_set_static_metadata (element_class,
       "pyramidsegment",
@@ -181,19 +178,6 @@
 static void
 gst_pyramid_segment_init (GstPyramidSegment * filter)
 {
-  filter->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink");
-  GST_PAD_SET_PROXY_CAPS (filter->sinkpad);
-
-  gst_pad_set_event_function (filter->sinkpad,
-      GST_DEBUG_FUNCPTR (gst_pyramid_segment_handle_sink_event));
-  gst_pad_set_chain_function (filter->sinkpad,
-      GST_DEBUG_FUNCPTR (gst_pyramid_segment_chain));
-
-  filter->srcpad = gst_pad_new_from_static_template (&src_factory, "src");
-  GST_PAD_SET_PROXY_CAPS (filter->srcpad);
-
-  gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad);
-  gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad);
   filter->storage = cvCreateMemStorage (BLOCK_SIZE);
   filter->comp =
       cvCreateSeq (0, sizeof (CvSeq), sizeof (CvPoint), filter->storage);
@@ -201,6 +185,9 @@
   filter->threshold1 = 50.0;
   filter->threshold2 = 60.0;
   filter->level = 4;
+
+  gst_opencv_video_filter_set_in_place (GST_OPENCV_VIDEO_FILTER_CAST (filter),
+      FALSE);
 }
 
 static void
@@ -253,78 +240,32 @@
   }
 }
 
-/* GstElement vmethod implementations */
-
-/* this function handles the link with other elements */
-static gboolean
-gst_pyramid_segment_handle_sink_event (GstPad * pad, GstObject * parent,
-    GstEvent * event)
-{
-  GstPyramidSegment *filter;
-  GstVideoInfo info;
-  gboolean res = TRUE;
-  filter = GST_PYRAMID_SEGMENT (parent);
-
-  switch (GST_EVENT_TYPE (event)) {
-    case GST_EVENT_CAPS:
-    {
-      GstCaps *caps;
-      gst_event_parse_caps (event, &caps);
-      gst_video_info_from_caps (&info, caps);
-
-      if (filter->cvImage != NULL) {
-        cvReleaseImage (&filter->cvImage);
-      }
-      filter->cvImage =
-          cvCreateImage (cvSize (info.width, info.height), IPL_DEPTH_8U, 3);
-      break;
-    }
-    default:
-      break;
-  }
-
-  res = gst_pad_event_default (pad, parent, event);
-
-  return res;
-}
-
-/* chain function
+/* transform function
  * this function does the actual processing
  */
 static GstFlowReturn
-gst_pyramid_segment_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
+gst_pyramid_segment_transform (GstOpencvVideoFilter * base, GstBuffer * buf,
+    IplImage * img, GstBuffer * outbuf, IplImage * outimg)
 {
-  GstPyramidSegment *filter;
-  GstBuffer *outbuf;
-  GstMapInfo info;
+  GstPyramidSegment *filter = GST_PYRAMID_SEGMENT (base);
   GstMapInfo outinfo;
 
-  filter = GST_PYRAMID_SEGMENT (GST_OBJECT_PARENT (pad));
+  filter->cvSegmentedImage = cvCloneImage (img);
 
-  buf = gst_buffer_make_writable (buf);
-  gst_buffer_map (buf, &info, GST_MAP_READWRITE);
-  filter->cvImage->imageData = (char *) info.data;
-  filter->cvSegmentedImage = cvCloneImage (filter->cvImage);
-
-  cvPyrSegmentation (filter->cvImage, filter->cvSegmentedImage, filter->storage,
+  cvPyrSegmentation (img, filter->cvSegmentedImage, filter->storage,
       &(filter->comp), filter->level, filter->threshold1, filter->threshold2);
 
   /* TODO look if there is a way in opencv to reuse the image data and
    * delete only the struct headers. Would avoid a memcpy here */
 
-  outbuf = gst_buffer_new_and_alloc (filter->cvSegmentedImage->imageSize);
-  gst_buffer_copy_into (outbuf, buf, GST_BUFFER_COPY_METADATA, 0, -1);
   gst_buffer_map (outbuf, &outinfo, GST_MAP_WRITE);
   memcpy (outinfo.data, filter->cvSegmentedImage->imageData,
       gst_buffer_get_size (outbuf));
 
-  gst_buffer_unmap (buf, &info);
-  gst_buffer_unref (buf);
   cvReleaseImage (&filter->cvSegmentedImage);
   g_assert (filter->cvSegmentedImage == NULL);
 
-  gst_buffer_unmap (outbuf, &outinfo);
-  return gst_pad_push (filter->srcpad, outbuf);
+  return GST_FLOW_OK;
 }
 
 
diff --git a/ext/opencv/gstpyramidsegment.h b/ext/opencv/gstpyramidsegment.h
index 586ef2c..bb87253 100644
--- a/ext/opencv/gstpyramidsegment.h
+++ b/ext/opencv/gstpyramidsegment.h
@@ -3,7 +3,7 @@
  * Copyright (C) 2005 Thomas Vander Stichele <thomas@apestaart.org>
  * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
  * Copyright (C) 2008 Michael Sheldon <mike@mikeasoft.com>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -46,7 +46,7 @@
 #ifndef __GST_PYRAMID_SEGMENT_H__
 #define __GST_PYRAMID_SEGMENT_H__
 
-#include <gst/gst.h>
+#include <gstopencvvideofilter.h>
 #include <opencv2/core/version.hpp>
 
 #if CV_MAJOR_VERSION * 100 + CV_MINOR_VERSION >= 204
@@ -65,18 +65,19 @@
   (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PYRAMID_SEGMENT))
 #define GST_IS_PYRAMID_SEGMENT_CLASS(klass) \
   (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PYRAMID_SEGMENT))
+
 typedef struct _GstPyramidSegment GstPyramidSegment;
 typedef struct _GstPyramidSegmentClass GstPyramidSegmentClass;
 
 struct _GstPyramidSegment
 {
-  GstElement element;
+  GstOpencvVideoFilter element;
 
   GstPad *sinkpad, *srcpad;
 
   gboolean silent;
 
-  IplImage *cvImage, *cvSegmentedImage;
+  IplImage *cvSegmentedImage;
 
   CvMemStorage *storage;
 
@@ -89,7 +90,7 @@
 
 struct _GstPyramidSegmentClass
 {
-  GstElementClass parent_class;
+  GstOpencvVideoFilterClass parent_class;
 };
 
 GType gst_pyramid_segment_get_type (void);
diff --git a/ext/opencv/gstretinex.c b/ext/opencv/gstretinex.cpp
similarity index 94%
rename from ext/opencv/gstretinex.c
rename to ext/opencv/gstretinex.cpp
index 9a7c8dc..75842f8 100644
--- a/ext/opencv/gstretinex.c
+++ b/ext/opencv/gstretinex.cpp
@@ -1,7 +1,7 @@
 /*
  * GStreamer
  * Copyright (C) 2013 Miguel Casas-Sanchez <miguelecasassanchez@gmail.com>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -46,8 +46,8 @@
  *
  * Basic and multiscale retinex for colour image enhancement, see article:
  *
- * Rahman, Zia-ur, Daniel J. Jobson, and Glenn A. Woodell. "Multi-scale retinex for 
- * color image enhancement." Image Processing, 1996. Proceedings., International 
+ * Rahman, Zia-ur, Daniel J. Jobson, and Glenn A. Woodell. "Multi-scale retinex for
+ * color image enhancement." Image Processing, 1996. Proceedings., International
  * Conference on. Vol. 3. IEEE, 1996.
  *
  * <refsect2>
@@ -62,13 +62,14 @@
 #include <config.h>
 #endif
 
-#include <gst/gst.h>
 #include "gstretinex.h"
 #include <opencv2/imgproc/imgproc_c.h>
+#include <opencv2/imgproc/imgproc.hpp>
 
 GST_DEBUG_CATEGORY_STATIC (gst_retinex_debug);
 #define GST_CAT_DEFAULT gst_retinex_debug
 
+using namespace cv;
 /* Filter signals and args */
 enum
 {
@@ -153,12 +154,13 @@
           "Retinex method to use",
           "Retinex method to use",
           GST_TYPE_RETINEX_METHOD, DEFAULT_METHOD,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   g_object_class_install_property (gobject_class, PROP_SCALES,
       g_param_spec_int ("scales", "scales",
           "Amount of gaussian filters (scales) used in multiscale retinex", 1,
-          4, DEFAULT_SCALES, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          4, DEFAULT_SCALES,
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   gst_element_class_set_static_metadata (element_class,
       "Retinex image colour enhacement", "Filter/Effect/Video",
@@ -169,10 +171,8 @@
       gst_static_pad_template_get (&src_factory));
   gst_element_class_add_pad_template (element_class,
       gst_static_pad_template_get (&sink_factory));
-
 }
 
-
 /* initialize the new element
  * instantiate pads and add them to element
  * set pad calback functions
@@ -184,7 +184,8 @@
   filter->method = DEFAULT_METHOD;
   filter->scales = DEFAULT_SCALES;
   filter->current_scales = 0;
-  gst_base_transform_set_in_place (GST_BASE_TRANSFORM (filter), TRUE);
+  gst_opencv_video_filter_set_in_place (GST_OPENCV_VIDEO_FILTER_CAST (filter),
+      TRUE);
 }
 
 
@@ -293,15 +294,16 @@
   int gain = 128;
   int offset = 128;
   int filter_size;
+  Mat icvD (retinex->cvD, false);
 
-  if (!gst_buffer_map (buf, &info, GST_MAP_READWRITE)) {
+  if (!gst_buffer_map (buf, &info, (GstMapFlags) GST_MAP_READWRITE)) {
     return GST_FLOW_ERROR;
   }
   retinex->cvRGBin->imageData = (char *) info.data;
 
   /* Basic retinex restoration.  The image and a filtered image are converted
      to the log domain and subtracted.
-     O = Log(I) - Log(H(I))   
+     O = Log(I) - Log(H(I))
      where O is the output, H is a gaussian 2d filter and I is the input image. */
   if (METHOD_BASIC == retinex->method) {
     /*  Compute log image */
@@ -313,8 +315,7 @@
     filter_size = filter_size * 2 + 1;
 
     cvConvert (retinex->cvRGBin, retinex->cvD);
-    cvSmooth (retinex->cvD, retinex->cvD, CV_GAUSSIAN, filter_size, filter_size,
-        0.0, 0.0);
+    GaussianBlur (icvD, icvD, Size (filter_size, filter_size), 0.0, 0.0);
     cvLog (retinex->cvD, retinex->cvC);
 
     /*  Compute difference */
@@ -359,8 +360,7 @@
       filter_size = filter_size * 2 + 1;
 
       cvConvert (retinex->cvRGBin, retinex->cvD);
-      cvSmooth (retinex->cvD, retinex->cvD, CV_GAUSSIAN, filter_size,
-          filter_size, 0.0, 0.0);
+      GaussianBlur (icvD, icvD, Size (filter_size, filter_size), 0.0, 0.0);
       cvLog (retinex->cvD, retinex->cvC);
 
       /*  Compute weighted difference */
diff --git a/ext/opencv/gstretinex.h b/ext/opencv/gstretinex.h
index c53d230..d090a5b 100644
--- a/ext/opencv/gstretinex.h
+++ b/ext/opencv/gstretinex.h
@@ -1,7 +1,7 @@
 /*
  * GStreamer
  * Copyright (C) 2013 Miguel Casas-Sanchez <miguelecasassanchez@gmail.com>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -44,11 +44,9 @@
 #ifndef __GST_RETINEX_H__
 #define __GST_RETINEX_H__
 
-#include <gst/gst.h>
-#include <gst/video/video.h>
-#include <gst/video/gstvideofilter.h>
 #include <opencv2/core/core_c.h>
 
+#include <gstopencvvideofilter.h>
 
 G_BEGIN_DECLS
 /* #defines don't like whitespacey bits */
diff --git a/ext/opencv/gstsegmentation.cpp b/ext/opencv/gstsegmentation.cpp
index 79cbb49..e0aa821 100644
--- a/ext/opencv/gstsegmentation.cpp
+++ b/ext/opencv/gstsegmentation.cpp
@@ -1,15 +1,15 @@
 /*
  * GStreamer
  * Copyright (C) 2013 Miguel Casas-Sanchez <miguelecasassanchez@gmail.com>
- * Except: Parts of code inside the preprocessor define CODE_FROM_OREILLY_BOOK, 
- *  which are downloaded from O'Reilly website 
+ * Except: Parts of code inside the preprocessor define CODE_FROM_OREILLY_BOOK,
+ *  which are downloaded from O'Reilly website
  *  [http://examples.oreilly.com/9780596516130/]
  *  and adapted. Its license reads:
  *  "Oct. 3, 2008
- *   Right to use this code in any way you want without warrenty, support or 
+ *   Right to use this code in any way you want without warrenty, support or
  *   any guarentee of it working. "
  *
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -55,27 +55,27 @@
  *
  * This element creates and updates a fg/bg model using one of several approaches.
  * The one called "codebook" refers to the codebook approach following the opencv
- * O'Reilly book [1] implementation of the algorithm described in K. Kim, 
- * T. H. Chalidabhongse, D. Harwood and L. Davis [2]. BackgroundSubtractorMOG [3], 
- * or MOG for shorts, refers to a Gaussian Mixture-based Background/Foreground 
+ * O'Reilly book [1] implementation of the algorithm described in K. Kim,
+ * T. H. Chalidabhongse, D. Harwood and L. Davis [2]. BackgroundSubtractorMOG [3],
+ * or MOG for shorts, refers to a Gaussian Mixture-based Background/Foreground
  * Segmentation Algorithm. OpenCV MOG implements the algorithm described in [4].
- * BackgroundSubtractorMOG2 [5], refers to another Gaussian Mixture-based 
- * Background/Foreground segmentation algorithm. OpenCV MOG2 implements the 
+ * BackgroundSubtractorMOG2 [5], refers to another Gaussian Mixture-based
+ * Background/Foreground segmentation algorithm. OpenCV MOG2 implements the
  * algorithm described in [6] and [7].
  *
- * [1] Learning OpenCV: Computer Vision with the OpenCV Library by Gary Bradski 
+ * [1] Learning OpenCV: Computer Vision with the OpenCV Library by Gary Bradski
  * and Adrian Kaehler, Published by O'Reilly Media, October 3, 2008
- * [2] "Real-time Foreground-Background Segmentation using Codebook Model", 
+ * [2] "Real-time Foreground-Background Segmentation using Codebook Model",
  * Real-time Imaging, Volume 11, Issue 3, Pages 167-256, June 2005.
  * [3] http://opencv.itseez.com/modules/video/doc/motion_analysis_and_object_tracking.html#backgroundsubtractormog
- * [4] P. KadewTraKuPong and R. Bowden, "An improved adaptive background 
- * mixture model for real-time tracking with shadow detection", Proc. 2nd 
+ * [4] P. KadewTraKuPong and R. Bowden, "An improved adaptive background
+ * mixture model for real-time tracking with shadow detection", Proc. 2nd
  * European Workshop on Advanced Video-Based Surveillance Systems, 2001
  * [5] http://opencv.itseez.com/modules/video/doc/motion_analysis_and_object_tracking.html#backgroundsubtractormog2
- * [6] Z.Zivkovic, "Improved adaptive Gausian mixture model for background 
+ * [6] Z.Zivkovic, "Improved adaptive Gausian mixture model for background
  * subtraction", International Conference Pattern Recognition, UK, August, 2004.
- * [7] Z.Zivkovic, F. van der Heijden, "Efficient Adaptive Density Estimation 
- * per Image Pixel for the Task of Background Subtraction", Pattern Recognition 
+ * [7] Z.Zivkovic, F. van der Heijden, "Efficient Adaptive Density Estimation
+ * per Image Pixel for the Task of Background Subtraction", Pattern Recognition
  * Letters, vol. 27, no. 7, pages 773-780, 2006.
  *
  * <refsect2>
@@ -90,8 +90,6 @@
 #include <config.h>
 #endif
 
-#include <gst/gst.h>
-
 #include "gstsegmentation.h"
 #include <opencv2/video/background_segm.hpp>
 #include <opencv2/imgproc/imgproc_c.h>
@@ -382,12 +380,12 @@
   cvCvtColor (filter->cvRGBA, filter->cvRGB, CV_RGBA2RGB);
   cvCvtColor (filter->cvRGB, filter->cvYUV, CV_RGB2YCrCb);
 
-  /* Create and update a fg/bg model using a codebook approach following the 
+  /* Create and update a fg/bg model using a codebook approach following the
    * opencv O'Reilly book [1] implementation of the algo described in [2].
    *
-   * [1] Learning OpenCV: Computer Vision with the OpenCV Library by Gary 
+   * [1] Learning OpenCV: Computer Vision with the OpenCV Library by Gary
    * Bradski and Adrian Kaehler, Published by O'Reilly Media, October 3, 2008
-   * [2] "Real-time Foreground-Background Segmentation using Codebook Model", 
+   * [2] "Real-time Foreground-Background Segmentation using Codebook Model",
    * Real-time Imaging, Volume 11, Issue 3, Pages 167-256, June 2005. */
   if (METHOD_BOOK == filter->method) {
     unsigned cbBounds[3] = { 10, 5, 5 };
@@ -429,27 +427,27 @@
         filter->mem_storage, filter->contours);
 
   }
-  /* Create the foreground and background masks using BackgroundSubtractorMOG [1], 
-   *  Gaussian Mixture-based Background/Foreground segmentation algorithm. OpenCV 
+  /* Create the foreground and background masks using BackgroundSubtractorMOG [1],
+   *  Gaussian Mixture-based Background/Foreground segmentation algorithm. OpenCV
    * MOG implements the algorithm described in [2].
-   * 
+   *
    * [1] http://opencv.itseez.com/modules/video/doc/motion_analysis_and_object_tracking.html#backgroundsubtractormog
-   * [2] P. KadewTraKuPong and R. Bowden, "An improved adaptive background 
-   * mixture model for real-time tracking with shadow detection", Proc. 2nd 
+   * [2] P. KadewTraKuPong and R. Bowden, "An improved adaptive background
+   * mixture model for real-time tracking with shadow detection", Proc. 2nd
    * European Workshop on Advanced Video-Based Surveillance Systems, 2001
    */
   else if (METHOD_MOG == filter->method) {
     run_mog_iteration (filter);
   }
   /* Create the foreground and background masks using BackgroundSubtractorMOG2
-   * [1], Gaussian Mixture-based Background/Foreground segmentation algorithm. 
+   * [1], Gaussian Mixture-based Background/Foreground segmentation algorithm.
    * OpenCV MOG2 implements the algorithm described in [2] and [3].
-   * 
+   *
    * [1] http://opencv.itseez.com/modules/video/doc/motion_analysis_and_object_tracking.html#backgroundsubtractormog2
-   * [2] Z.Zivkovic, "Improved adaptive Gausian mixture model for background 
+   * [2] Z.Zivkovic, "Improved adaptive Gausian mixture model for background
    * subtraction", International Conference Pattern Recognition, UK, Aug 2004.
-   * [3] Z.Zivkovic, F. van der Heijden, "Efficient Adaptive Density Estimation 
-   * per Image Pixel for the Task of Background Subtraction", Pattern 
+   * [3] Z.Zivkovic, F. van der Heijden, "Efficient Adaptive Density Estimation
+   * per Image Pixel for the Task of Background Subtraction", Pattern
    * Recognition Letters, vol. 27, no. 7, pages 773-780, 2006.   */
   else if (METHOD_MOG2 == filter->method) {
     run_mog2_iteration (filter);
@@ -487,20 +485,20 @@
 
 
 #ifdef CODE_FROM_OREILLY_BOOK   /* See license at the beginning of the page */
-/* 
-  int update_codebook(uchar *p, codeBook &c, unsigned cbBounds) 
-  Updates the codebook entry with a new data point 
-  
-  p Pointer to a YUV or HSI pixel 
-  c Codebook for this pixel 
-  cbBounds Learning bounds for codebook (Rule of thumb: 10) 
-  numChannels Number of color channels we¡¯re learning 
-  
-  NOTES: 
-  cvBounds must be of length equal to numChannels 
-  
-  RETURN 
-  codebook index 
+/*
+  int update_codebook(uchar *p, codeBook &c, unsigned cbBounds)
+  Updates the codebook entry with a new data point
+
+  p Pointer to a YUV or HSI pixel
+  c Codebook for this pixel
+  cbBounds Learning bounds for codebook (Rule of thumb: 10)
+  numChannels Number of color channels we¡¯re learning
+
+  NOTES:
+  cvBounds must be of length equal to numChannels
+
+  RETURN
+  codebook index
 */
 int
 update_codebook (unsigned char *p, codeBook * c, unsigned *cbBounds,
@@ -589,14 +587,14 @@
 
 
 /*
- int clear_stale_entries(codeBook &c) 
-  During learning, after you've learned for some period of time, 
-  periodically call this to clear out stale codebook entries 
-  
-  c Codebook to clean up 
-  
-  Return 
-  number of entries cleared 
+ int clear_stale_entries(codeBook &c)
+  During learning, after you've learned for some period of time,
+  periodically call this to clear out stale codebook entries
+
+  c Codebook to clean up
+
+  Return
+  number of entries cleared
 */
 int
 clear_stale_entries (codeBook * c)
@@ -640,27 +638,27 @@
 
 
 /*
-  uchar background_diff( uchar *p, codeBook &c, 
-  int minMod, int maxMod) 
-  Given a pixel and a codebook, determine if the pixel is 
-  covered by the codebook 
-  
-  p Pixel pointer (YUV interleaved) 
-  c Codebook reference 
-  numChannels Number of channels we are testing 
-  maxMod Add this (possibly negative) number onto 
+  uchar background_diff( uchar *p, codeBook &c,
+  int minMod, int maxMod)
+  Given a pixel and a codebook, determine if the pixel is
+  covered by the codebook
 
-  max level when determining if new pixel is foreground 
-  minMod Subract this (possibly negative) number from 
-  min level when determining if new pixel is foreground 
-  
-  NOTES: 
-  minMod and maxMod must have length numChannels, 
-  e.g. 3 channels => minMod[3], maxMod[3]. There is one min and 
-  one max threshold per channel. 
-  
-  Return 
-  0 => background, 255 => foreground 
+  p Pixel pointer (YUV interleaved)
+  c Codebook reference
+  numChannels Number of channels we are testing
+  maxMod Add this (possibly negative) number onto
+
+  max level when determining if new pixel is foreground
+  minMod Subract this (possibly negative) number from
+  min level when determining if new pixel is foreground
+
+  NOTES:
+  minMod and maxMod must have length numChannels,
+  e.g. 3 channels => minMod[3], maxMod[3]. There is one min and
+  one max threshold per channel.
+
+  Return
+  0 => background, 255 => foreground
 */
 unsigned char
 background_diff (unsigned char *p, codeBook * c, int numChannels,
@@ -799,12 +797,12 @@
       (uchar *) filter->cvFG->imageData;
 
   /*
-     BackgroundSubtractorMOG [1], Gaussian Mixture-based Background/Foreground 
+     BackgroundSubtractorMOG [1], Gaussian Mixture-based Background/Foreground
      Segmentation Algorithm. OpenCV MOG implements the algorithm described in [2].
 
      [1] http://opencv.itseez.com/modules/video/doc/motion_analysis_and_object_tracking.html#backgroundsubtractormog
-     [2] P. KadewTraKuPong and R. Bowden, "An improved adaptive background 
-     mixture model for real-time tracking with shadow detection", Proc. 2nd 
+     [2] P. KadewTraKuPong and R. Bowden, "An improved adaptive background
+     mixture model for real-time tracking with shadow detection", Proc. 2nd
      European Workshop on Advanced Video-Based Surveillance Systems, 2001
    */
 
@@ -824,15 +822,15 @@
       (uchar *) filter->cvFG->imageData;
 
   /*
-     BackgroundSubtractorMOG2 [1], Gaussian Mixture-based Background/Foreground 
-     segmentation algorithm. OpenCV MOG2 implements the algorithm described in 
+     BackgroundSubtractorMOG2 [1], Gaussian Mixture-based Background/Foreground
+     segmentation algorithm. OpenCV MOG2 implements the algorithm described in
      [2] and [3].
 
      [1] http://opencv.itseez.com/modules/video/doc/motion_analysis_and_object_tracking.html#backgroundsubtractormog2
-     [2] Z.Zivkovic, "Improved adaptive Gausian mixture model for background 
+     [2] Z.Zivkovic, "Improved adaptive Gausian mixture model for background
      subtraction", International Conference Pattern Recognition, UK, August, 2004.
-     [3] Z.Zivkovic, F. van der Heijden, "Efficient Adaptive Density Estimation per 
-     Image Pixel for the Task of Background Subtraction", Pattern Recognition 
+     [3] Z.Zivkovic, F. van der Heijden, "Efficient Adaptive Density Estimation per
+     Image Pixel for the Task of Background Subtraction", Pattern Recognition
      Letters, vol. 27, no. 7, pages 773-780, 2006.
    */
 
diff --git a/ext/opencv/gstskindetect.c b/ext/opencv/gstskindetect.cpp
similarity index 98%
rename from ext/opencv/gstskindetect.c
rename to ext/opencv/gstskindetect.cpp
index caf38ec..8ecb044 100644
--- a/ext/opencv/gstskindetect.c
+++ b/ext/opencv/gstskindetect.cpp
@@ -1,7 +1,7 @@
 /*
  * GStreamer
  * Copyright (C) 2013 Miguel Casas-Sanchez <miguelecasassanchez@gmail.com>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -58,9 +58,6 @@
 #include <config.h>
 #endif
 
-#include <gst/gst.h>
-
-#include "gstopencvutils.h"
 #include "gstskindetect.h"
 #include <opencv2/imgproc/imgproc_c.h>
 #include <opencv2/legacy/compat.hpp>
@@ -158,7 +155,7 @@
           "Method to use",
           "Method to use",
           GST_TYPE_SKIN_DETECT_METHOD, HSV,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   gst_element_class_set_static_metadata (element_class,
       "skindetect",
@@ -186,7 +183,8 @@
   filter->postprocess = TRUE;
   filter->method = HSV;
 
-  gst_base_transform_set_in_place (GST_BASE_TRANSFORM (filter), FALSE);
+  gst_opencv_video_filter_set_in_place (GST_OPENCV_VIDEO_FILTER_CAST (filter),
+      FALSE);
 }
 
 
@@ -326,7 +324,7 @@
     cvCvtColor (filter->cvRGB, filter->cvHSV, CV_RGB2HSV);
     cvCvtPixToPlane (filter->cvHSV, filter->cvH, filter->cvS, filter->cvV, 0);  /*  Extract the 3 color components. */
 
-    /*  Detect which pixels in each of the H, S and V channels are probably skin pixels. 
+    /*  Detect which pixels in each of the H, S and V channels are probably skin pixels.
        Assume that skin has a Hue between 0 to 18 (out of 180), and Saturation above 50, and Brightness above 80. */
     cvThreshold (filter->cvH, filter->cvH2, 10, UCHAR_MAX, CV_THRESH_BINARY);   /* (hue > 10) */
     cvThreshold (filter->cvH, filter->cvH, 20, UCHAR_MAX, CV_THRESH_BINARY_INV);        /* (hue < 20) */
@@ -336,7 +334,7 @@
     /*  erode the HUE to get rid of noise. */
     cvErode (filter->cvH, filter->cvH, NULL, 1);
 
-    /*  Combine all 3 thresholded color components, so that an output pixel will only 
+    /*  Combine all 3 thresholded color components, so that an output pixel will only
        be white (255) if the H, S and V pixels were also white.
        imageSkin = (hue > 10) ^ (hue < 20) ^ (sat > 48) ^ (val > 80), where   ^ mean pixels-wise AND */
     cvAnd (filter->cvH, filter->cvS, filter->cvSkinPixels1, NULL);
@@ -374,7 +372,7 @@
     cvCvtColor (filter->cvdraft, filter->cvRGB, CV_GRAY2RGB);
   }
 
-  /* After this we have a RGB Black and white image with the skin, in 
+  /* After this we have a RGB Black and white image with the skin, in
      filter->cvRGB. We can postprocess by applying 1 erode-dilate and 1
      dilate-erode, or alternatively 1 opening-closing all together, with
      the goal of removing small (spurious) skin spots and creating large
diff --git a/ext/opencv/gstskindetect.h b/ext/opencv/gstskindetect.h
index 910d22e..a9c548d 100644
--- a/ext/opencv/gstskindetect.h
+++ b/ext/opencv/gstskindetect.h
@@ -3,7 +3,7 @@
  * Copyright (C) 2005 Thomas Vander Stichele <thomas@apestaart.org>
  * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
  * Copyright (C) 2008 Michael Sheldon <mike@mikeasoft.com>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -46,8 +46,6 @@
 #ifndef __GST_SKIN_DETECT_H__
 #define __GST_SKIN_DETECT_H__
 
-#include <gst/gst.h>
-
 #include <gstopencvvideofilter.h>
 
 G_BEGIN_DECLS
diff --git a/ext/opencv/gsttemplatematch.c b/ext/opencv/gsttemplatematch.cpp
similarity index 78%
rename from ext/opencv/gsttemplatematch.c
rename to ext/opencv/gsttemplatematch.cpp
index 21d8cd4..1223066 100644
--- a/ext/opencv/gsttemplatematch.c
+++ b/ext/opencv/gsttemplatematch.cpp
@@ -4,7 +4,7 @@
  * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
  * Copyright (C) 2008 Michael Sheldon <mike@mikeasoft.com>
  * Copyright (C) 2009 Noam Lewis <jones.noamle@gmail.com>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -52,7 +52,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch-0.10 videotestsrc ! decodebin ! videoconvert ! templatematch template=/path/to/file.jpg ! videoconvert ! xvimagesink
+ * gst-launch-1.0 videotestsrc ! decodebin ! videoconvert ! templatematch template=/path/to/file.jpg ! videoconvert ! xvimagesink
  * ]|
  * </refsect2>
  */
@@ -61,10 +61,7 @@
 #  include <config.h>
 #endif
 
-#include <gst/gst.h>
-
 #include "../../gst-libs/gst/gst-i18n-plugin.h"
-#include "gstopencvutils.h"
 #include "gsttemplatematch.h"
 #include <opencv2/imgproc/imgproc_c.h>
 
@@ -102,7 +99,8 @@
     GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("BGR"))
     );
 
-G_DEFINE_TYPE (GstTemplateMatch, gst_template_match, GST_TYPE_ELEMENT);
+G_DEFINE_TYPE (GstTemplateMatch, gst_template_match,
+    GST_TYPE_OPENCV_VIDEO_FILTER);
 
 static void gst_template_match_finalize (GObject * object);
 static void gst_template_match_set_property (GObject * object, guint prop_id,
@@ -110,42 +108,38 @@
 static void gst_template_match_get_property (GObject * object, guint prop_id,
     GValue * value, GParamSpec * pspec);
 
-static gboolean gst_template_match_handle_sink_event (GstPad * pad,
-    GstObject * parent, GstEvent * event);
-static GstFlowReturn gst_template_match_chain (GstPad * pad, GstObject * parent,
-    GstBuffer * buf);
-
-static void gst_template_match_load_template (GstTemplateMatch * filter,
-    gchar * template);
-static void gst_template_match_match (IplImage * input, IplImage * template,
-    IplImage * dist_image, double *best_res, CvPoint * best_pos, int method);
-
-
+static GstFlowReturn gst_template_match_transform_ip (GstOpencvVideoFilter *
+    filter, GstBuffer * buf, IplImage * img);
 
 /* initialize the templatematch's class */
 static void
 gst_template_match_class_init (GstTemplateMatchClass * klass)
 {
   GObjectClass *gobject_class;
+  GstOpencvVideoFilterClass *gstopencvbasefilter_class;
   GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
 
   gobject_class = (GObjectClass *) klass;
+  gstopencvbasefilter_class = (GstOpencvVideoFilterClass *) klass;
 
   gobject_class->finalize = gst_template_match_finalize;
   gobject_class->set_property = gst_template_match_set_property;
   gobject_class->get_property = gst_template_match_get_property;
 
+  gstopencvbasefilter_class->cv_trans_ip_func = gst_template_match_transform_ip;
+
   g_object_class_install_property (gobject_class, PROP_METHOD,
       g_param_spec_int ("method", "Method",
           "Specifies the way the template must be compared with image regions. 0=SQDIFF, 1=SQDIFF_NORMED, 2=CCOR, 3=CCOR_NORMED, 4=CCOEFF, 5=CCOEFF_NORMED.",
-          0, 5, DEFAULT_METHOD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          0, 5, DEFAULT_METHOD,
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_TEMPLATE,
       g_param_spec_string ("template", "Template", "Filename of template image",
-          NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          NULL, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
   g_object_class_install_property (gobject_class, PROP_DISPLAY,
       g_param_spec_boolean ("display", "Display",
           "Sets whether the detected template should be highlighted in the output",
-          TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          TRUE, (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   gst_element_class_set_static_metadata (element_class,
       "templatematch",
@@ -167,24 +161,50 @@
 static void
 gst_template_match_init (GstTemplateMatch * filter)
 {
-  filter->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink");
-  gst_pad_set_event_function (filter->sinkpad,
-      GST_DEBUG_FUNCPTR (gst_template_match_handle_sink_event));
-  gst_pad_set_chain_function (filter->sinkpad,
-      GST_DEBUG_FUNCPTR (gst_template_match_chain));
-  GST_PAD_SET_PROXY_CAPS (filter->sinkpad);
-
-  filter->srcpad = gst_pad_new_from_static_template (&src_factory, "src");
-  GST_PAD_SET_PROXY_CAPS (filter->srcpad);
-
-  gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad);
-  gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad);
   filter->templ = NULL;
   filter->display = TRUE;
   filter->cvTemplateImage = NULL;
   filter->cvDistImage = NULL;
-  filter->cvImage = NULL;
   filter->method = DEFAULT_METHOD;
+
+  gst_opencv_video_filter_set_in_place (GST_OPENCV_VIDEO_FILTER_CAST (filter),
+      TRUE);
+}
+
+/* We take ownership of template here */
+static void
+gst_template_match_load_template (GstTemplateMatch * filter, gchar * templ)
+{
+  gchar *oldTemplateFilename = NULL;
+  IplImage *oldTemplateImage = NULL, *newTemplateImage = NULL, *oldDistImage =
+      NULL;
+
+  if (templ) {
+    newTemplateImage = cvLoadImage (templ, CV_LOAD_IMAGE_COLOR);
+    if (!newTemplateImage) {
+      /* Unfortunately OpenCV doesn't seem to provide any way of finding out
+         why the image load failed, so we can't be more specific than FAILED: */
+      GST_ELEMENT_WARNING (filter, RESOURCE, FAILED,
+          (_("OpenCV failed to load template image")),
+          ("While attempting to load template '%s'", templ));
+      g_free (templ);
+      templ = NULL;
+    }
+  }
+
+  GST_OBJECT_LOCK (filter);
+  oldTemplateFilename = filter->templ;
+  filter->templ = templ;
+  oldTemplateImage = filter->cvTemplateImage;
+  filter->cvTemplateImage = newTemplateImage;
+  oldDistImage = filter->cvDistImage;
+  /* This will be recreated in the chain function as required: */
+  filter->cvDistImage = NULL;
+  GST_OBJECT_UNLOCK (filter);
+
+  cvReleaseImage (&oldDistImage);
+  cvReleaseImage (&oldTemplateImage);
+  g_free (oldTemplateFilename);
 }
 
 static void
@@ -256,42 +276,6 @@
 
 /* GstElement vmethod implementations */
 
-/* this function handles the link with other elements */
-static gboolean
-gst_template_match_handle_sink_event (GstPad * pad, GstObject * parent,
-    GstEvent * event)
-{
-  GstTemplateMatch *filter;
-  GstVideoInfo info;
-  gboolean res = TRUE;
-
-  filter = GST_TEMPLATE_MATCH (parent);
-  switch (GST_EVENT_TYPE (event)) {
-    case GST_EVENT_CAPS:
-    {
-      GstCaps *caps;
-      gst_event_parse_caps (event, &caps);
-      gst_video_info_from_caps (&info, caps);
-
-      if (filter->cvImage) {
-        cvReleaseImageHeader (&filter->cvImage);
-      }
-      filter->cvImage =
-          cvCreateImageHeader (cvSize (info.width, info.height), IPL_DEPTH_8U,
-          3);
-      break;
-    }
-    default:
-      break;
-  }
-
-  res = gst_pad_event_default (pad, parent, event);
-
-  return res;
-
-
-}
-
 static void
 gst_template_match_finalize (GObject * object)
 {
@@ -299,9 +283,7 @@
   filter = GST_TEMPLATE_MATCH (object);
 
   g_free (filter->templ);
-  if (filter->cvImage) {
-    cvReleaseImageHeader (&filter->cvImage);
-  }
+
   if (filter->cvDistImage) {
     cvReleaseImage (&filter->cvDistImage);
   }
@@ -312,45 +294,57 @@
   G_OBJECT_CLASS (gst_template_match_parent_class)->finalize (object);
 }
 
+static void
+gst_template_match_match (IplImage * input, IplImage * templ,
+    IplImage * dist_image, double *best_res, CvPoint * best_pos, int method)
+{
+  double dist_min = 0, dist_max = 0;
+  CvPoint min_pos, max_pos;
+  cvMatchTemplate (input, templ, dist_image, method);
+  cvMinMaxLoc (dist_image, &dist_min, &dist_max, &min_pos, &max_pos, NULL);
+  if ((CV_TM_SQDIFF_NORMED == method) || (CV_TM_SQDIFF == method)) {
+    *best_res = dist_min;
+    *best_pos = min_pos;
+    if (CV_TM_SQDIFF_NORMED == method) {
+      *best_res = 1 - *best_res;
+    }
+  } else {
+    *best_res = dist_max;
+    *best_pos = max_pos;
+  }
+}
+
 /* chain function
  * this function does the actual processing
  */
 static GstFlowReturn
-gst_template_match_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
+gst_template_match_transform_ip (GstOpencvVideoFilter * base, GstBuffer * buf,
+    IplImage * img)
 {
   GstTemplateMatch *filter;
   CvPoint best_pos;
   double best_res;
-  GstMapInfo info;
   GstMessage *m = NULL;
 
-  filter = GST_TEMPLATE_MATCH (parent);
+  filter = GST_TEMPLATE_MATCH (base);
 
-  if ((!filter) || (!buf)) {
-    return GST_FLOW_OK;
-  }
   GST_LOG_OBJECT (filter, "Buffer size %u", (guint) gst_buffer_get_size (buf));
 
-  buf = gst_buffer_make_writable (buf);
-  gst_buffer_map (buf, &info, GST_MAP_READWRITE);
-  filter->cvImage->imageData = (char *) info.data;
-
   GST_OBJECT_LOCK (filter);
   if (filter->cvTemplateImage && !filter->cvDistImage) {
-    if (filter->cvTemplateImage->width > filter->cvImage->width) {
+    if (filter->cvTemplateImage->width > img->width) {
       GST_WARNING ("Template Image is wider than input image");
-    } else if (filter->cvTemplateImage->height > filter->cvImage->height) {
+    } else if (filter->cvTemplateImage->height > img->height) {
       GST_WARNING ("Template Image is taller than input image");
     } else {
 
       GST_DEBUG_OBJECT (filter, "cvCreateImage (Size(%d-%d+1,%d) %d, %d)",
-          filter->cvImage->width, filter->cvTemplateImage->width,
-          filter->cvImage->height - filter->cvTemplateImage->height + 1,
-          IPL_DEPTH_32F, 1);
+          img->width, filter->cvTemplateImage->width,
+          img->height - filter->cvTemplateImage->height + 1, IPL_DEPTH_32F, 1);
       filter->cvDistImage =
-          cvCreateImage (cvSize (filter->cvImage->width -
+          cvCreateImage (cvSize (img->width -
               filter->cvTemplateImage->width + 1,
-              filter->cvImage->height - filter->cvTemplateImage->height + 1),
+              img->height - filter->cvTemplateImage->height + 1),
           IPL_DEPTH_32F, 1);
       if (!filter->cvDistImage) {
         GST_WARNING ("Couldn't create dist image.");
@@ -360,7 +354,7 @@
   if (filter->cvTemplateImage && filter->cvDistImage) {
     GstStructure *s;
 
-    gst_template_match_match (filter->cvImage, filter->cvTemplateImage,
+    gst_template_match_match (img, filter->cvTemplateImage,
         filter->cvDistImage, &best_res, &best_pos, filter->method);
 
     s = gst_structure_new ("template_match",
@@ -390,7 +384,7 @@
 
       corner.x += filter->cvTemplateImage->width;
       corner.y += filter->cvTemplateImage->height;
-      cvRectangle (filter->cvImage, best_pos, corner, color, 3, 8, 0);
+      cvRectangle (img, best_pos, corner, color, 3, 8, 0);
     }
 
   }
@@ -399,69 +393,9 @@
   if (m) {
     gst_element_post_message (GST_ELEMENT (filter), m);
   }
-  return gst_pad_push (filter->srcpad, buf);
+  return GST_FLOW_OK;
 }
 
-
-
-static void
-gst_template_match_match (IplImage * input, IplImage * templ,
-    IplImage * dist_image, double *best_res, CvPoint * best_pos, int method)
-{
-  double dist_min = 0, dist_max = 0;
-  CvPoint min_pos, max_pos;
-  cvMatchTemplate (input, templ, dist_image, method);
-  cvMinMaxLoc (dist_image, &dist_min, &dist_max, &min_pos, &max_pos, NULL);
-  if ((CV_TM_SQDIFF_NORMED == method) || (CV_TM_SQDIFF == method)) {
-    *best_res = dist_min;
-    *best_pos = min_pos;
-    if (CV_TM_SQDIFF_NORMED == method) {
-      *best_res = 1 - *best_res;
-    }
-  } else {
-    *best_res = dist_max;
-    *best_pos = max_pos;
-  }
-}
-
-
-/* We take ownership of template here */
-static void
-gst_template_match_load_template (GstTemplateMatch * filter, gchar * templ)
-{
-  gchar *oldTemplateFilename = NULL;
-  IplImage *oldTemplateImage = NULL, *newTemplateImage = NULL, *oldDistImage =
-      NULL;
-
-  if (templ) {
-    newTemplateImage = cvLoadImage (templ, CV_LOAD_IMAGE_COLOR);
-    if (!newTemplateImage) {
-      /* Unfortunately OpenCV doesn't seem to provide any way of finding out
-         why the image load failed, so we can't be more specific than FAILED: */
-      GST_ELEMENT_WARNING (filter, RESOURCE, FAILED,
-          (_("OpenCV failed to load template image")),
-          ("While attempting to load template '%s'", templ));
-      g_free (templ);
-      templ = NULL;
-    }
-  }
-
-  GST_OBJECT_LOCK (filter);
-  oldTemplateFilename = filter->templ;
-  filter->templ = templ;
-  oldTemplateImage = filter->cvTemplateImage;
-  filter->cvTemplateImage = newTemplateImage;
-  oldDistImage = filter->cvDistImage;
-  /* This will be recreated in the chain function as required: */
-  filter->cvDistImage = NULL;
-  GST_OBJECT_UNLOCK (filter);
-
-  cvReleaseImage (&oldDistImage);
-  cvReleaseImage (&oldTemplateImage);
-  g_free (oldTemplateFilename);
-}
-
-
 /* entry point to initialize the plug-in
  * initialize the plug-in itself
  * register the element factories and other features
diff --git a/ext/opencv/gsttemplatematch.h b/ext/opencv/gsttemplatematch.h
index b6c0426..e7c0202 100644
--- a/ext/opencv/gsttemplatematch.h
+++ b/ext/opencv/gsttemplatematch.h
@@ -3,7 +3,7 @@
  * Copyright (C) 2005 Thomas Vander Stichele <thomas@apestaart.org>
  * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
  * Copyright (C) 2008 Michael Sheldon <mike@mikeasoft.com>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -46,7 +46,7 @@
 #ifndef __GST_TEMPLATE_MATCH_H__
 #define __GST_TEMPLATE_MATCH_H__
 
-#include <gst/gst.h>
+#include <gstopencvvideofilter.h>
 
 #ifdef HAVE_HIGHGUI_H
 #include <highgui.h>            // includes highGUI definitions
@@ -72,21 +72,19 @@
 
 struct _GstTemplateMatch
 {
-  GstElement element;
-
-  GstPad *sinkpad, *srcpad;
+  GstOpencvVideoFilter element;
 
   gint method;
   gboolean display;
 
   gchar *templ;
 
-  IplImage *cvImage, *cvGray, *cvTemplateImage, *cvDistImage;
+  IplImage *cvGray, *cvTemplateImage, *cvDistImage;
 };
 
 struct _GstTemplateMatchClass
 {
-  GstElementClass parent_class;
+  GstOpencvVideoFilterClass parent_class;
 };
 
 GType gst_template_match_get_type (void);
diff --git a/ext/opencv/gsttextoverlay.c b/ext/opencv/gsttextoverlay.cpp
similarity index 76%
rename from ext/opencv/gsttextoverlay.c
rename to ext/opencv/gsttextoverlay.cpp
index 9f7e4b7..7025b36 100644
--- a/ext/opencv/gsttextoverlay.c
+++ b/ext/opencv/gsttextoverlay.cpp
@@ -3,7 +3,7 @@
  * Copyright (C) 2005 Thomas Vander Stichele <thomas@apestaart.org>
  * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
  * Copyright (C) 2010 Sreerenj Balachandran <bsreerenj@gmail.com>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -60,9 +60,6 @@
 #  include <config.h>
 #endif
 
-#include <gst/gst.h>
-
-#include "gstopencvutils.h"
 #include "gsttextoverlay.h"
 
 GST_DEBUG_CATEGORY_STATIC (gst_opencv_text_overlay_debug);
@@ -115,17 +112,16 @@
     GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("RGB"))
     );
 
-G_DEFINE_TYPE (GstOpencvTextOverlay, gst_opencv_text_overlay, GST_TYPE_ELEMENT);
+G_DEFINE_TYPE (GstOpencvTextOverlay, gst_opencv_text_overlay,
+    GST_TYPE_OPENCV_VIDEO_FILTER);
 
 static void gst_opencv_text_overlay_set_property (GObject * object,
     guint prop_id, const GValue * value, GParamSpec * pspec);
 static void gst_opencv_text_overlay_get_property (GObject * object,
     guint prop_id, GValue * value, GParamSpec * pspec);
 
-static gboolean gst_opencv_text_overlay_handle_sink_event (GstPad * pad,
-    GstObject * parent, GstEvent * event);
-static GstFlowReturn gst_opencv_text_overlay_chain (GstPad * pad,
-    GstObject * parent, GstBuffer * buf);
+static GstFlowReturn gst_opencv_text_overlay_transform_ip (GstOpencvVideoFilter
+    * filter, GstBuffer * buf, IplImage * img);
 
 /* Clean up */
 static void
@@ -133,10 +129,6 @@
 {
   GstOpencvTextOverlay *filter = GST_OPENCV_TEXT_OVERLAY (obj);
 
-  if (filter->cvImage) {
-    cvReleaseImage (&filter->cvImage);
-  }
-
   g_free (filter->textbuf);
 
   G_OBJECT_CLASS (gst_opencv_text_overlay_parent_class)->finalize (obj);
@@ -147,12 +139,16 @@
 gst_opencv_text_overlay_class_init (GstOpencvTextOverlayClass * klass)
 {
   GObjectClass *gobject_class;
-
+  GstOpencvVideoFilterClass *gstopencvbasefilter_class;
   GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
-  gobject_class = (GObjectClass *) klass;
 
+  gobject_class = (GObjectClass *) klass;
   gobject_class->finalize =
       GST_DEBUG_FUNCPTR (gst_opencv_text_overlay_finalize);
+  gstopencvbasefilter_class = (GstOpencvVideoFilterClass *) klass;
+
+  gstopencvbasefilter_class->cv_trans_ip_func =
+      gst_opencv_text_overlay_transform_ip;
 
   gobject_class->set_property = gst_opencv_text_overlay_set_property;
   gobject_class->get_property = gst_opencv_text_overlay_get_property;
@@ -160,47 +156,55 @@
   g_object_class_install_property (gobject_class, PROP_TEXT,
       g_param_spec_string ("text", "text",
           "Text to be display.", DEFAULT_PROP_TEXT,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   g_object_class_install_property (gobject_class, PROP_XPOS,
       g_param_spec_int ("xpos", "horizontal position",
           "Sets the Horizontal position", 0, G_MAXINT,
-          DEFAULT_PROP_XPOS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          DEFAULT_PROP_XPOS,
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   g_object_class_install_property (gobject_class, PROP_YPOS,
       g_param_spec_int ("ypos", "vertical position",
           "Sets the Vertical position", 0, G_MAXINT,
-          DEFAULT_PROP_YPOS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          DEFAULT_PROP_YPOS,
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   g_object_class_install_property (gobject_class, PROP_THICKNESS,
       g_param_spec_int ("thickness", "font thickness",
           "Sets the Thickness of Font", 0, G_MAXINT,
-          DEFAULT_PROP_THICKNESS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          DEFAULT_PROP_THICKNESS,
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   g_object_class_install_property (gobject_class, PROP_COLOR_R,
       g_param_spec_int ("colorR", "color -Red ",
           "Sets the color -R", 0, 255,
-          DEFAULT_PROP_COLOR, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          DEFAULT_PROP_COLOR,
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   g_object_class_install_property (gobject_class, PROP_COLOR_G,
       g_param_spec_int ("colorG", "color -Green",
           "Sets the color -G", 0, 255,
-          DEFAULT_PROP_COLOR, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          DEFAULT_PROP_COLOR,
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   g_object_class_install_property (gobject_class, PROP_COLOR_B,
       g_param_spec_int ("colorB", "color -Blue",
           "Sets the color -B", 0, 255,
-          DEFAULT_PROP_COLOR, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          DEFAULT_PROP_COLOR,
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   g_object_class_install_property (gobject_class, PROP_HEIGHT,
       g_param_spec_double ("height", "Height",
           "Sets the height of fonts", 1.0, 5.0,
-          DEFAULT_HEIGHT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          DEFAULT_HEIGHT,
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   g_object_class_install_property (gobject_class, PROP_WIDTH,
       g_param_spec_double ("width", "Width",
           "Sets the width of fonts", 1.0, 5.0,
-          DEFAULT_WIDTH, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+          DEFAULT_WIDTH,
+          (GParamFlags) (G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS)));
 
   gst_element_class_set_static_metadata (element_class,
       "opencvtextoverlay",
@@ -222,20 +226,6 @@
 static void
 gst_opencv_text_overlay_init (GstOpencvTextOverlay * filter)
 {
-  filter->sinkpad = gst_pad_new_from_static_template (&sink_factory, "sink");
-  GST_PAD_SET_PROXY_CAPS (filter->sinkpad);
-  gst_element_add_pad (GST_ELEMENT (filter), filter->sinkpad);
-
-  gst_pad_set_event_function (filter->sinkpad,
-      GST_DEBUG_FUNCPTR (gst_opencv_text_overlay_handle_sink_event));
-
-  gst_pad_set_chain_function (filter->sinkpad,
-      GST_DEBUG_FUNCPTR (gst_opencv_text_overlay_chain));
-
-  filter->srcpad = gst_pad_new_from_static_template (&src_factory, "src");
-  GST_PAD_SET_PROXY_CAPS (filter->srcpad);
-  gst_element_add_pad (GST_ELEMENT (filter), filter->srcpad);
-
   filter->textbuf = g_strdup (DEFAULT_PROP_TEXT);
   filter->width = DEFAULT_PROP_WIDTH;
   filter->height = DEFAULT_PROP_HEIGHT;
@@ -245,6 +235,9 @@
   filter->colorR = DEFAULT_PROP_COLOR;
   filter->colorG = DEFAULT_PROP_COLOR;
   filter->colorB = DEFAULT_PROP_COLOR;
+
+  gst_opencv_video_filter_set_in_place (GST_OPENCV_VIDEO_FILTER_CAST (filter),
+      TRUE);
 }
 
 static void
@@ -330,71 +323,22 @@
   }
 }
 
-static gboolean
-gst_opencv_text_overlay_handle_sink_event (GstPad * pad, GstObject * parent,
-    GstEvent * event)
-{
-  GstOpencvTextOverlay *filter;
-  gint width, height;
-  GstStructure *structure;
-  gboolean res = TRUE;
-
-  filter = GST_OPENCV_TEXT_OVERLAY (parent);
-
-  switch (GST_EVENT_TYPE (event)) {
-    case GST_EVENT_CAPS:
-    {
-      GstCaps *caps;
-      gst_event_parse_caps (event, &caps);
-
-      structure = gst_caps_get_structure (caps, 0);
-      gst_structure_get_int (structure, "width", &width);
-      gst_structure_get_int (structure, "height", &height);
-
-      if (filter->cvImage) {
-        cvReleaseImage (&filter->cvImage);
-      }
-      filter->cvImage = cvCreateImage (cvSize (width, height), IPL_DEPTH_8U, 3);
-
-      break;
-    }
-    default:
-      break;
-  }
-
-  res = gst_pad_event_default (pad, parent, event);
-  return res;
-}
-
-
 /* chain function
  * this function does the actual processing
  */
 static GstFlowReturn
-gst_opencv_text_overlay_chain (GstPad * pad, GstObject * parent,
-    GstBuffer * buf)
+gst_opencv_text_overlay_transform_ip (GstOpencvVideoFilter * base,
+    GstBuffer * buf, IplImage * img)
 {
-  GstOpencvTextOverlay *filter;
-  GstMapInfo map_info;
-  guint8 *data;
-
-  filter = GST_OPENCV_TEXT_OVERLAY (parent);
-
-  gst_buffer_map (buf, &map_info, GST_MAP_READ);
-  data = map_info.data;
-
-  filter->cvImage->imageData = (char *) data;
+  GstOpencvTextOverlay *filter = GST_OPENCV_TEXT_OVERLAY (base);
 
   cvInitFont (&(filter->font), CV_FONT_VECTOR0, filter->width, filter->height,
       0, filter->thickness, 0);
-
-  buf = gst_buffer_make_writable (buf);
-  cvPutText (filter->cvImage, filter->textbuf, cvPoint (filter->xpos,
+  cvPutText (img, filter->textbuf, cvPoint (filter->xpos,
           filter->ypos), &(filter->font), cvScalar (filter->colorR,
           filter->colorG, filter->colorB, 0));
 
-  gst_buffer_unmap (buf, &map_info);
-  return gst_pad_push (filter->srcpad, buf);
+  return GST_FLOW_OK;
 }
 
 
diff --git a/ext/opencv/gsttextoverlay.h b/ext/opencv/gsttextoverlay.h
index e92ab07..65a7d75 100644
--- a/ext/opencv/gsttextoverlay.h
+++ b/ext/opencv/gsttextoverlay.h
@@ -3,7 +3,7 @@
  * Copyright (C) 2005 Thomas Vander Stichele <thomas@apestaart.org>
  * Copyright (C) 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
  * Copyright (C) 2010 Sreerenj Balachandran <bsreerenj@gmail.com>
- * 
+ *
  * Permission is hereby granted, free of charge, to any person obtaining a
  * copy of this software and associated documentation files (the "Software"),
  * to deal in the Software without restriction, including without limitation
@@ -46,8 +46,7 @@
 #ifndef __GST_OPENCV_TEXT_OVERLAY_H__
 #define __GST_OPENCV_TEXT_OVERLAY_H__
 
-#include <gst/gst.h>
-#include "gstopencvutils.h"
+#include <gstopencvvideofilter.h>
 #include <opencv2/core/core_c.h>
 G_BEGIN_DECLS
 
@@ -68,12 +67,9 @@
 
 struct _GstOpencvTextOverlay
 {
-  GstElement element;
+  GstOpencvVideoFilter element;
 
-  GstPad *sinkpad, *srcpad;
-
-  IplImage *cvImage;
-  CvFont font;  
+  CvFont font;
 
   gint xpos;
   gint ypos;
@@ -85,9 +81,9 @@
 
 };
 
-struct _GstOpencvTextOverlayClass 
+struct _GstOpencvTextOverlayClass
 {
-  GstElementClass parent_class;
+  GstOpencvVideoFilterClass parent_class;
 };
 
 GType gst_opencv_text_overlay_get_type (void);
diff --git a/ext/opencv/motioncells_wrapper.cpp b/ext/opencv/motioncells_wrapper.cpp
index e9794cf..9bce838 100644
--- a/ext/opencv/motioncells_wrapper.cpp
+++ b/ext/opencv/motioncells_wrapper.cpp
@@ -56,6 +56,9 @@
 static int instanceCounter = 0;
 static bool element_id_was_max = false;
 
+vector < instanceOfMC > motioncellsvector;
+vector < int > motioncellsfreeids;
+
 MotionCells *mc;
 char p_str[] = "idx failed";
 
diff --git a/ext/opencv/motioncells_wrapper.h b/ext/opencv/motioncells_wrapper.h
index 1fe5dc3..b6869a1 100644
--- a/ext/opencv/motioncells_wrapper.h
+++ b/ext/opencv/motioncells_wrapper.h
@@ -54,8 +54,6 @@
   int id;
   MotionCells *mc;
 };
-vector < instanceOfMC > motioncellsvector;
-vector < int >motioncellsfreeids;
 
 int searchIdx (int p_id);
 extern "C"
diff --git a/ext/openexr/Makefile.in b/ext/openexr/Makefile.in
index a715b01..8b8d9fb 100644
--- a/ext/openexr/Makefile.in
+++ b/ext/openexr/Makefile.in
@@ -294,6 +294,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -331,6 +333,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -358,6 +362,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -376,6 +382,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -386,6 +394,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -411,6 +421,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -436,6 +448,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -567,6 +581,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -624,8 +640,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -695,6 +715,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/openh264/Makefile.in b/ext/openh264/Makefile.in
index ca7109c..c72ede9 100644
--- a/ext/openh264/Makefile.in
+++ b/ext/openh264/Makefile.in
@@ -294,6 +294,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -331,6 +333,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -358,6 +362,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -376,6 +382,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -386,6 +394,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -411,6 +421,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -436,6 +448,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -567,6 +581,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -624,8 +640,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -695,6 +715,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/openjpeg/Makefile.in b/ext/openjpeg/Makefile.in
index 7bf13a7..ccd7ade 100644
--- a/ext/openjpeg/Makefile.in
+++ b/ext/openjpeg/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/openjpeg/gstopenjpegdec.c b/ext/openjpeg/gstopenjpegdec.c
index 53dc5f6..112b3ab 100644
--- a/ext/openjpeg/gstopenjpegdec.c
+++ b/ext/openjpeg/gstopenjpegdec.c
@@ -1050,6 +1050,15 @@
     goto decode_error;
 #endif
 
+  {
+    gint i;
+
+    for (i = 0; i < image->numcomps; i++) {
+      if (image->comps[i].data == NULL)
+        goto decode_error;
+    }
+  }
+
   gst_buffer_unmap (frame->input_buffer, &map);
 
   ret = gst_openjpeg_dec_negotiate (self, image);
diff --git a/ext/openni2/Makefile.in b/ext/openni2/Makefile.in
index e82ac76..5a1f905 100644
--- a/ext/openni2/Makefile.in
+++ b/ext/openni2/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/opus/Makefile.am b/ext/opus/Makefile.am
index d22c664..c643692 100644
--- a/ext/opus/Makefile.am
+++ b/ext/opus/Makefile.am
@@ -10,6 +10,7 @@
 libgstopus_la_LIBADD = \
 	$(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_API_VERSION) \
 	-lgsttag-$(GST_API_VERSION) -lgstrtp-$(GST_API_VERSION) \
+	-lgstpbutils-$(GST_API_VERSION) \
 	$(GST_BASE_LIBS) \
 	$(GST_LIBS) \
 	$(OPUS_LIBS)
diff --git a/ext/opus/Makefile.in b/ext/opus/Makefile.in
index 8c255d2..50ffa36 100644
--- a/ext/opus/Makefile.in
+++ b/ext/opus/Makefile.in
@@ -279,6 +279,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -316,6 +318,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -343,6 +347,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -361,6 +367,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -371,6 +379,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -396,6 +406,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -421,6 +433,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -552,6 +566,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -609,8 +625,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -680,6 +700,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -778,6 +799,7 @@
 libgstopus_la_LIBADD = \
 	$(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_API_VERSION) \
 	-lgsttag-$(GST_API_VERSION) -lgstrtp-$(GST_API_VERSION) \
+	-lgstpbutils-$(GST_API_VERSION) \
 	$(GST_BASE_LIBS) \
 	$(GST_LIBS) \
 	$(OPUS_LIBS)
diff --git a/ext/opus/gstopusdec.c b/ext/opus/gstopusdec.c
index b081b99..f2512d1 100644
--- a/ext/opus/gstopusdec.c
+++ b/ext/opus/gstopusdec.c
@@ -33,7 +33,7 @@
  * <refsect2>
  * <title>Example pipelines</title>
  * |[
- * gst-launch -v filesrc location=opus.ogg ! oggdemux ! opusdec ! audioconvert ! audioresample ! alsasink
+ * gst-launch-1.0 -v filesrc location=opus.ogg ! oggdemux ! opusdec ! audioconvert ! audioresample ! alsasink
  * ]| Decode an Ogg/Opus file. To create an Ogg/Opus file refer to the documentation of opusenc.
  * </refsect2>
  */
@@ -47,6 +47,7 @@
 #include "gstopusheader.h"
 #include "gstopuscommon.h"
 #include "gstopusdec.h"
+#include <gst/pbutils/pbutils.h>
 
 GST_DEBUG_CATEGORY_STATIC (opusdec_debug);
 #define GST_CAT_DEFAULT opusdec_debug
@@ -63,10 +64,15 @@
     );
 
 static GstStaticPadTemplate opus_dec_sink_factory =
-GST_STATIC_PAD_TEMPLATE ("sink",
+    GST_STATIC_PAD_TEMPLATE ("sink",
     GST_PAD_SINK,
     GST_PAD_ALWAYS,
-    GST_STATIC_CAPS ("audio/x-opus")
+    GST_STATIC_CAPS ("audio/x-opus, "
+        "channel-mapping-family = (int) 0; "
+        "audio/x-opus, "
+        "channel-mapping-family = (int) [1, 255], "
+        "channels = (int) [1, 255], "
+        "stream-count = (int) [1, 255], " "coupled-count = (int) [0, 255]")
     );
 
 G_DEFINE_TYPE (GstOpusDec, gst_opus_dec, GST_TYPE_AUDIO_DECODER);
@@ -225,6 +231,8 @@
   GstAudioInfo info;
 
   if (caps) {
+    gint rate, channels;
+
     caps = gst_caps_truncate (caps);
     caps = gst_caps_make_writable (caps);
     s = gst_caps_get_structure (caps, 0);
@@ -233,13 +241,15 @@
       gst_structure_fixate_field_nearest_int (s, "rate", dec->sample_rate);
     else
       gst_structure_set (s, "rate", G_TYPE_INT, dec->sample_rate, NULL);
-    gst_structure_get_int (s, "rate", &dec->sample_rate);
+    gst_structure_get_int (s, "rate", &rate);
+    dec->sample_rate = rate;
 
     if (gst_structure_has_field (s, "channels"))
       gst_structure_fixate_field_nearest_int (s, "channels", dec->n_channels);
     else
       gst_structure_set (s, "channels", G_TYPE_INT, dec->n_channels, NULL);
-    gst_structure_get_int (s, "channels", &dec->n_channels);
+    gst_structure_get_int (s, "channels", &channels);
+    dec->n_channels = channels;
 
     gst_caps_unref (caps);
   }
@@ -273,7 +283,6 @@
   /* but we still need the opus order for later reordering */
   if (pos) {
     memcpy (dec->opus_pos, pos, sizeof (pos[0]) * dec->n_channels);
-    gst_audio_channel_positions_to_valid_order (dec->opus_pos, dec->n_channels);
   } else {
     dec->opus_pos[0] = GST_AUDIO_CHANNEL_POSITION_INVALID;
   }
@@ -284,79 +293,64 @@
 static GstFlowReturn
 gst_opus_dec_parse_header (GstOpusDec * dec, GstBuffer * buf)
 {
-  const guint8 *data;
   GstAudioChannelPosition pos[64];
   const GstAudioChannelPosition *posn = NULL;
-  GstMapInfo map;
 
   if (!gst_opus_header_is_id_header (buf)) {
     GST_ERROR_OBJECT (dec, "Header is not an Opus ID header");
     return GST_FLOW_ERROR;
   }
 
-  gst_buffer_map (buf, &map, GST_MAP_READ);
-  data = map.data;
-
-  dec->n_channels = data[9];
-  dec->sample_rate = GST_READ_UINT32_LE (data + 12);
-  if (dec->sample_rate == 0)
-    dec->sample_rate = 48000;
-  dec->pre_skip = GST_READ_UINT16_LE (data + 10);
-  dec->r128_gain = GST_READ_UINT16_LE (data + 16);
+  if (!gst_codec_utils_opus_parse_header (buf,
+          &dec->sample_rate,
+          &dec->n_channels,
+          &dec->channel_mapping_family,
+          &dec->n_streams,
+          &dec->n_stereo_streams,
+          dec->channel_mapping, &dec->pre_skip, &dec->r128_gain)) {
+    GST_ERROR_OBJECT (dec, "Failed to parse Opus ID header");
+    return GST_FLOW_ERROR;
+  }
   dec->r128_gain_volume = gst_opus_dec_get_r128_volume (dec->r128_gain);
+
   GST_INFO_OBJECT (dec,
       "Found pre-skip of %u samples, R128 gain %d (volume %f)",
       dec->pre_skip, dec->r128_gain, dec->r128_gain_volume);
 
-  dec->channel_mapping_family = data[18];
-  if (dec->channel_mapping_family == 0) {
-    /* implicit mapping */
-    GST_INFO_OBJECT (dec, "Channel mapping family 0, implicit mapping");
-    dec->n_streams = dec->n_stereo_streams = 1;
-    dec->channel_mapping[0] = 0;
-    dec->channel_mapping[1] = 1;
-  } else {
-    dec->n_streams = data[19];
-    dec->n_stereo_streams = data[20];
-    memcpy (dec->channel_mapping, data + 21, dec->n_channels);
+  if (dec->channel_mapping_family == 1) {
+    GST_INFO_OBJECT (dec, "Channel mapping family 1, Vorbis mapping");
+    switch (dec->n_channels) {
+      case 1:
+      case 2:
+        /* nothing */
+        break;
+      case 3:
+      case 4:
+      case 5:
+      case 6:
+      case 7:
+      case 8:
+        posn = gst_opus_channel_positions[dec->n_channels - 1];
+        break;
+      default:{
+        gint i;
 
-    if (dec->channel_mapping_family == 1) {
-      GST_INFO_OBJECT (dec, "Channel mapping family 1, Vorbis mapping");
-      switch (dec->n_channels) {
-        case 1:
-        case 2:
-          /* nothing */
-          break;
-        case 3:
-        case 4:
-        case 5:
-        case 6:
-        case 7:
-        case 8:
-          posn = gst_opus_channel_positions[dec->n_channels - 1];
-          break;
-        default:{
-          gint i;
+        GST_ELEMENT_WARNING (GST_ELEMENT (dec), STREAM, DECODE,
+            (NULL), ("Using NONE channel layout for more than 8 channels"));
 
-          GST_ELEMENT_WARNING (GST_ELEMENT (dec), STREAM, DECODE,
-              (NULL), ("Using NONE channel layout for more than 8 channels"));
+        for (i = 0; i < dec->n_channels; i++)
+          pos[i] = GST_AUDIO_CHANNEL_POSITION_NONE;
 
-          for (i = 0; i < dec->n_channels; i++)
-            pos[i] = GST_AUDIO_CHANNEL_POSITION_NONE;
-
-          posn = pos;
-        }
+        posn = pos;
       }
-    } else {
-      GST_INFO_OBJECT (dec, "Channel mapping family %d",
-          dec->channel_mapping_family);
     }
+  } else {
+    GST_INFO_OBJECT (dec, "Channel mapping family %d",
+        dec->channel_mapping_family);
   }
 
   gst_opus_dec_negotiate (dec, posn);
 
-  gst_buffer_unmap (buf, &map);
-
   return GST_FLOW_OK;
 }
 
@@ -380,6 +374,7 @@
   unsigned int packet_size;
   GstBuffer *buf;
   GstMapInfo map, omap;
+  GstAudioClippingMeta *cmeta = NULL;
 
   if (dec->state == NULL) {
     /* If we did not get any headers, default to 2 channels */
@@ -534,17 +529,41 @@
   GST_DEBUG_OBJECT (dec, "decoded %d samples", n);
   gst_buffer_set_size (outbuf, n * 2 * dec->n_channels);
 
+  cmeta = gst_buffer_get_audio_clipping_meta (buf);
+
+  g_assert (!cmeta || cmeta->format == GST_FORMAT_DEFAULT);
+
   /* Skip any samples that need skipping */
-  if (dec->pre_skip > 0) {
-    guint scaled_pre_skip = dec->pre_skip * dec->sample_rate / 48000;
+  if (cmeta && cmeta->start) {
+    guint pre_skip = cmeta->start;
+    guint scaled_pre_skip = pre_skip * dec->sample_rate / 48000;
     guint skip = scaled_pre_skip > n ? n : scaled_pre_skip;
     guint scaled_skip = skip * 48000 / dec->sample_rate;
 
     gst_buffer_resize (outbuf, skip * 2 * dec->n_channels, -1);
-    dec->pre_skip -= scaled_skip;
+
     GST_INFO_OBJECT (dec,
-        "Skipping %u samples (%u at 48000 Hz, %u left to skip)", skip,
-        scaled_skip, dec->pre_skip);
+        "Skipping %u samples at the beginning (%u at 48000 Hz)",
+        skip, scaled_skip);
+  }
+
+  if (cmeta && cmeta->end) {
+    guint post_skip = cmeta->end;
+    guint scaled_post_skip = post_skip * dec->sample_rate / 48000;
+    guint skip = scaled_post_skip > n ? n : scaled_post_skip;
+    guint scaled_skip = skip * 48000 / dec->sample_rate;
+    guint outsize = gst_buffer_get_size (outbuf);
+    guint skip_bytes = skip * 2 * dec->n_channels;
+
+    if (outsize > skip_bytes)
+      outsize -= skip_bytes;
+    else
+      outsize = 0;
+
+    gst_buffer_resize (outbuf, 0, outsize);
+
+    GST_INFO_OBJECT (dec,
+        "Skipping %u samples at the end (%u at 48000 Hz)", skip, scaled_skip);
   }
 
   if (gst_buffer_get_size (outbuf) == 0) {
@@ -635,8 +654,10 @@
     if (header && G_VALUE_HOLDS (header, GST_TYPE_BUFFER)) {
       buf = gst_value_get_buffer (header);
       res = gst_opus_dec_parse_header (dec, buf);
-      if (res != GST_FLOW_OK)
+      if (res != GST_FLOW_OK) {
+        ret = FALSE;
         goto done;
+      }
       gst_buffer_replace (&dec->streamheader, buf);
     }
 
@@ -644,26 +665,26 @@
     if (vorbiscomment && G_VALUE_HOLDS (vorbiscomment, GST_TYPE_BUFFER)) {
       buf = gst_value_get_buffer (vorbiscomment);
       res = gst_opus_dec_parse_comments (dec, buf);
-      if (res != GST_FLOW_OK)
+      if (res != GST_FLOW_OK) {
+        ret = FALSE;
         goto done;
+      }
       gst_buffer_replace (&dec->vorbiscomment, buf);
     }
   } else {
-    /* defaults if not in the caps */
-    dec->n_channels = 2;
-    dec->sample_rate = 48000;
+    const GstAudioChannelPosition *posn = NULL;
 
-    gst_structure_get_int (s, "channels", &dec->n_channels);
-    gst_structure_get_int (s, "rate", &dec->sample_rate);
+    if (!gst_codec_utils_opus_parse_caps (caps, &dec->sample_rate,
+            &dec->n_channels, &dec->channel_mapping_family, &dec->n_streams,
+            &dec->n_stereo_streams, dec->channel_mapping)) {
+      ret = FALSE;
+      goto done;
+    }
 
-    /* default stereo mapping */
-    dec->channel_mapping_family = 0;
-    dec->channel_mapping[0] = 0;
-    dec->channel_mapping[1] = 1;
-    dec->n_streams = 1;
-    dec->n_stereo_streams = 1;
+    if (dec->channel_mapping_family == 1 && dec->n_channels <= 8)
+      posn = gst_opus_channel_positions[dec->n_channels - 1];
 
-    gst_opus_dec_negotiate (dec, NULL);
+    gst_opus_dec_negotiate (dec, posn);
   }
 
 done:
diff --git a/ext/opus/gstopusdec.h b/ext/opus/gstopusdec.h
index f8d43a9..df52cfb 100644
--- a/ext/opus/gstopusdec.h
+++ b/ext/opus/gstopusdec.h
@@ -52,9 +52,9 @@
   GstBuffer            *streamheader;
   GstBuffer            *vorbiscomment;
 
-  int sample_rate;
-  int n_channels;
-  guint32 pre_skip;
+  guint32 sample_rate;
+  guint8 n_channels;
+  guint16 pre_skip;
   gint16 r128_gain;
 
   GstAudioChannelPosition opus_pos[64];
diff --git a/ext/opus/gstopusenc.c b/ext/opus/gstopusenc.c
index 7dfd441..7737bf5 100644
--- a/ext/opus/gstopusenc.c
+++ b/ext/opus/gstopusenc.c
@@ -32,7 +32,7 @@
  * <refsect2>
  * <title>Example pipelines</title>
  * |[
- * gst-launch -v audiotestsrc wave=sine num-buffers=100 ! audioconvert ! opusenc ! oggmux ! filesink location=sine.ogg
+ * gst-launch-1.0 -v audiotestsrc wave=sine num-buffers=100 ! audioconvert ! opusenc ! oggmux ! filesink location=sine.ogg
  * ]| Encode a test sine signal to Ogg/OPUS.
  * </refsect2>
  */
@@ -48,6 +48,8 @@
 
 #include <gst/gsttagsetter.h>
 #include <gst/audio/audio.h>
+#include <gst/pbutils/pbutils.h>
+#include <gst/tag/tag.h>
 #include <gst/glib-compat-private.h>
 #include "gstopusheader.h"
 #include "gstopuscommon.h"
@@ -167,12 +169,12 @@
         "format = (string) " FORMAT_STR ", "
         "layout = (string) interleaved, "
         "rate = (int) 48000, "
-        "channels = (int) [ 1, 2 ]; "
+        "channels = (int) [ 1, 8 ]; "
         "audio/x-raw, "
         "format = (string) " FORMAT_STR ", "
         "layout = (string) interleaved, "
         "rate = (int) { 8000, 12000, 16000, 24000 }, "
-        "channels = (int) [ 1, 2 ] ")
+        "channels = (int) [ 1, 8 ] ")
     );
 
 static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
@@ -377,8 +379,6 @@
 static void
 gst_opus_enc_init (GstOpusEnc * enc)
 {
-  GstAudioEncoder *benc = GST_AUDIO_ENCODER (enc);
-
   GST_DEBUG_OBJECT (enc, "init");
 
   GST_PAD_SET_ACCEPT_TEMPLATE (GST_AUDIO_ENCODER_SINK_PAD (enc));
@@ -399,10 +399,6 @@
   enc->packet_loss_percentage = DEFAULT_PACKET_LOSS_PERCENT;
   enc->max_payload_size = DEFAULT_MAX_PAYLOAD_SIZE;
   enc->audio_type = DEFAULT_AUDIO_TYPE;
-
-  /* arrange granulepos marking (and required perfect ts) */
-  gst_audio_encoder_set_mark_granule (benc, TRUE);
-  gst_audio_encoder_set_perfect_timestamp (benc, TRUE);
 }
 
 static gboolean
@@ -412,6 +408,7 @@
 
   GST_DEBUG_OBJECT (enc, "start");
   enc->encoded_samples = 0;
+  enc->consumed_samples = 0;
 
   return TRUE;
 }
@@ -550,27 +547,20 @@
   /* For two channels, use the basic RTP mapping if the channels are
      mapped as left/right. */
   if (enc->n_channels == 2) {
-    if (MAPS (0, FRONT_LEFT) && MAPS (1, FRONT_RIGHT)) {
-      GST_INFO_OBJECT (enc, "Stereo, canonical mapping");
-      enc->channel_mapping_family = 0;
-      enc->n_stereo_streams = 1;
-      /* The channel mapping is implicit for family 0, that's why we do not
-         attempt to create one for right/left - this will be mapped to the
-         Vorbis mapping below. */
-      return;
-    } else {
-      GST_DEBUG_OBJECT (enc, "Stereo, but not canonical mapping, continuing");
-    }
+    GST_INFO_OBJECT (enc, "Stereo, trivial RTP mapping");
+    enc->channel_mapping_family = 0;
+    enc->n_stereo_streams = 1;
+    /* implicit mapping for family 0 */
+    return;
   }
 
-  /* For channels between 1 and 8, we use the Vorbis mapping if we can
-     find a permutation that matches it. Mono will have been taken care
-     of earlier, but this code also handles it. Same for left/right stereo.
-     There are two mappings. One maps the input channels to an ordering
-     which has the natural pairs first so they can benefit from the Opus
-     stereo channel coupling, and the other maps this ordering to the
-     Vorbis ordering. */
-  if (enc->n_channels >= 1 && enc->n_channels <= 8) {
+  /* For channels between 3 and 8, we use the Vorbis mapping if we can
+     find a permutation that matches it. Mono and stereo will have been taken
+     care of earlier, but this code also handles it. There are two mappings.
+     One maps the input channels to an ordering which has the natural pairs
+     first so they can benefit from the Opus stereo channel coupling, and the
+     other maps this ordering to the Vorbis ordering. */
+  if (enc->n_channels >= 3 && enc->n_channels <= 8) {
     int c0, c1, c0v, c1v;
     int mapped;
     gboolean positions_done[256];
@@ -585,6 +575,8 @@
           GST_AUDIO_CHANNEL_POSITION_FRONT_RIGHT_OF_CENTER},
       {GST_AUDIO_CHANNEL_POSITION_SIDE_LEFT,
           GST_AUDIO_CHANNEL_POSITION_SIDE_RIGHT},
+      {GST_AUDIO_CHANNEL_POSITION_FRONT_CENTER,
+          GST_AUDIO_CHANNEL_POSITION_REAR_CENTER},
     };
     size_t pair;
 
@@ -638,13 +630,8 @@
         GST_DEBUG_OBJECT (enc, "Channel position %s is not mapped yet, adding",
             gst_opus_channel_names[position]);
         cv = gst_opus_enc_find_channel_position_in_vorbis_order (enc, position);
-        if (cv < 0) {
-          GST_WARNING_OBJECT (enc,
-              "Cannot map channel positions to Vorbis order, using unknown mapping");
-          enc->channel_mapping_family = 255;
-          enc->n_stereo_streams = 0;
-          return;
-        }
+        if (cv < 0)
+          g_assert_not_reached ();
         enc->encoding_channel_mapping[mapped] = n;
         enc->decoding_channel_mapping[cv] = mapped;
         mapped++;
@@ -722,6 +709,10 @@
   int error = OPUS_OK;
   GstCaps *caps;
   gboolean ret;
+  gint32 lookahead;
+  const GstTagList *tags;
+  GstTagList *empty_tags = NULL;
+  GstBuffer *header, *comments;
 
 #ifndef GST_DISABLE_GST_DEBUG
   GST_DEBUG_OBJECT (enc,
@@ -759,12 +750,30 @@
   opus_multistream_encoder_ctl (enc->state,
       OPUS_SET_PACKET_LOSS_PERC (enc->packet_loss_percentage), 0);
 
-  GST_LOG_OBJECT (enc, "we have frame size %d", enc->frame_size);
+  opus_multistream_encoder_ctl (enc->state, OPUS_GET_LOOKAHEAD (&lookahead), 0);
 
-  gst_opus_header_create_caps (&caps, NULL, enc->n_channels,
-      enc->n_stereo_streams, enc->sample_rate, enc->channel_mapping_family,
-      enc->decoding_channel_mapping,
-      gst_tag_setter_get_tag_list (GST_TAG_SETTER (enc)));
+  GST_LOG_OBJECT (enc, "we have frame size %d, lookahead %d", enc->frame_size,
+      lookahead);
+
+  /* lookahead is samples, the Opus header wants it in 48kHz samples */
+  lookahead = lookahead * 48000 / enc->sample_rate;
+  enc->lookahead = enc->pending_lookahead = lookahead;
+
+  header = gst_codec_utils_opus_create_header (enc->sample_rate,
+      enc->n_channels, enc->channel_mapping_family,
+      enc->n_channels - enc->n_stereo_streams, enc->n_stereo_streams,
+      enc->decoding_channel_mapping, lookahead, 0);
+  tags = gst_tag_setter_get_tag_list (GST_TAG_SETTER (enc));
+  if (!tags)
+    tags = empty_tags = gst_tag_list_new_empty ();
+  comments =
+      gst_tag_list_to_vorbiscomment_buffer (tags, (const guint8 *) "OpusTags",
+      8, "Encoded with GStreamer opusenc");
+  caps = gst_codec_utils_opus_create_caps_from_header (header, comments);
+  if (empty_tags)
+    gst_tag_list_unref (empty_tags);
+  gst_buffer_unref (header);
+  gst_buffer_unref (comments);
 
   /* negotiate with these caps */
   GST_DEBUG_OBJECT (enc, "here are the caps: %" GST_PTR_FORMAT, caps);
@@ -800,6 +809,7 @@
     }
     case GST_EVENT_SEGMENT:
       enc->encoded_samples = 0;
+      enc->consumed_samples = 0;
       break;
 
     default:
@@ -810,70 +820,95 @@
 }
 
 static GstCaps *
+gst_opus_enc_get_sink_template_caps (void)
+{
+  static volatile gsize init = 0;
+  static GstCaps *caps = NULL;
+
+  if (g_once_init_enter (&init)) {
+    GValue rate_array = G_VALUE_INIT;
+    GValue v = G_VALUE_INIT;
+    GstStructure *s1, *s2, *s;
+    gint i, c;
+
+    caps = gst_caps_new_empty ();
+
+    /* Generate our two template structures */
+    g_value_init (&rate_array, GST_TYPE_LIST);
+    g_value_init (&v, G_TYPE_INT);
+    g_value_set_int (&v, 8000);
+    gst_value_list_append_value (&rate_array, &v);
+    g_value_set_int (&v, 12000);
+    gst_value_list_append_value (&rate_array, &v);
+    g_value_set_int (&v, 16000);
+    gst_value_list_append_value (&rate_array, &v);
+    g_value_set_int (&v, 24000);
+    gst_value_list_append_value (&rate_array, &v);
+
+    s1 = gst_structure_new ("audio/x-raw",
+        "format", G_TYPE_STRING, GST_AUDIO_NE (S16),
+        "layout", G_TYPE_STRING, "interleaved",
+        "rate", G_TYPE_INT, 48000, NULL);
+    s2 = gst_structure_new ("audio/x-raw",
+        "format", G_TYPE_STRING, GST_AUDIO_NE (S16),
+        "layout", G_TYPE_STRING, "interleaved", NULL);
+    gst_structure_set_value (s2, "rate", &rate_array);
+    g_value_unset (&rate_array);
+    g_value_unset (&v);
+
+    /* Mono */
+    s = gst_structure_copy (s1);
+    gst_structure_set (s, "channels", G_TYPE_INT, 1, NULL);
+    gst_caps_append_structure (caps, s);
+
+    s = gst_structure_copy (s2);
+    gst_structure_set (s, "channels", G_TYPE_INT, 1, NULL);
+    gst_caps_append_structure (caps, s);
+
+    /* Stereo and further */
+    for (i = 2; i <= 8; i++) {
+      guint64 channel_mask = 0;
+      const GstAudioChannelPosition *pos = gst_opus_channel_positions[i - 1];
+
+      for (c = 0; c < i; c++) {
+        channel_mask |= G_GUINT64_CONSTANT (1) << pos[c];
+      }
+
+      s = gst_structure_copy (s1);
+      gst_structure_set (s, "channels", G_TYPE_INT, i, "channel-mask",
+          GST_TYPE_BITMASK, channel_mask, NULL);
+      gst_caps_append_structure (caps, s);
+
+      s = gst_structure_copy (s2);
+      gst_structure_set (s, "channels", G_TYPE_INT, i, "channel-mask",
+          GST_TYPE_BITMASK, channel_mask, NULL);
+      gst_caps_append_structure (caps, s);
+    }
+
+    gst_structure_free (s1);
+    gst_structure_free (s2);
+
+    g_once_init_leave (&init, 1);
+  }
+
+  return caps;
+}
+
+static GstCaps *
 gst_opus_enc_sink_getcaps (GstAudioEncoder * benc, GstCaps * filter)
 {
   GstOpusEnc *enc;
   GstCaps *caps;
-  GstCaps *tcaps;
-  GstCaps *peercaps = NULL;
-  GstCaps *intersect = NULL;
-  guint i;
-  gboolean allow_multistream;
 
   enc = GST_OPUS_ENC (benc);
 
   GST_DEBUG_OBJECT (enc, "sink getcaps");
 
-  peercaps = gst_pad_peer_query_caps (GST_AUDIO_ENCODER_SRC_PAD (benc), NULL);
-  if (!peercaps) {
-    GST_DEBUG_OBJECT (benc, "No peercaps, returning template sink caps");
-    return gst_pad_get_pad_template_caps (GST_AUDIO_ENCODER_SINK_PAD (benc));
-  }
-
-  tcaps = gst_pad_get_pad_template_caps (GST_AUDIO_ENCODER_SRC_PAD (benc));
-  intersect = gst_caps_intersect (peercaps, tcaps);
-  gst_caps_unref (tcaps);
-  gst_caps_unref (peercaps);
-
-  if (gst_caps_is_empty (intersect))
-    return intersect;
-
-  allow_multistream = FALSE;
-  for (i = 0; i < gst_caps_get_size (intersect); i++) {
-    GstStructure *s = gst_caps_get_structure (intersect, i);
-    gboolean multistream;
-    if (gst_structure_get_boolean (s, "multistream", &multistream)) {
-      if (multistream) {
-        allow_multistream = TRUE;
-      }
-    } else {
-      allow_multistream = TRUE;
-    }
-  }
-
-  gst_caps_unref (intersect);
-
-  caps = gst_pad_get_pad_template_caps (GST_AUDIO_ENCODER_SINK_PAD (benc));
-  caps = gst_caps_make_writable (caps);
-  if (!allow_multistream) {
-    GValue range = { 0 };
-    g_value_init (&range, GST_TYPE_INT_RANGE);
-    gst_value_set_int_range (&range, 1, 2);
-    for (i = 0; i < gst_caps_get_size (caps); i++) {
-      GstStructure *s = gst_caps_get_structure (caps, i);
-      gst_structure_set_value (s, "channels", &range);
-    }
-    g_value_unset (&range);
-  }
-
-  if (filter) {
-    GstCaps *tmp = gst_caps_intersect_full (caps, filter,
-        GST_CAPS_INTERSECT_FIRST);
-    gst_caps_unref (caps);
-    caps = tmp;
-  }
+  caps = gst_opus_enc_get_sink_template_caps ();
+  caps = gst_audio_encoder_proxy_getcaps (benc, caps, filter);
 
   GST_DEBUG_OBJECT (enc, "Returning caps: %" GST_PTR_FORMAT, caps);
+
   return caps;
 }
 
@@ -890,15 +925,16 @@
   GstBuffer *outbuf;
   GstSegment *segment;
   GstClockTime duration;
+  guint64 trim_start = 0, trim_end = 0;
 
   guint max_payload_size;
-  gint frame_samples;
+  gint frame_samples, input_samples, output_samples;
 
   g_mutex_lock (&enc->property_lock);
 
   bytes = enc->frame_samples * enc->n_channels * 2;
   max_payload_size = enc->max_payload_size;
-  frame_samples = enc->frame_samples;
+  frame_samples = input_samples = enc->frame_samples;
 
   g_mutex_unlock (&enc->property_lock);
 
@@ -908,20 +944,23 @@
     bsize = map.size;
 
     if (G_UNLIKELY (bsize % bytes)) {
+      gint64 diff;
+
       GST_DEBUG_OBJECT (enc, "draining; adding silence samples");
+      g_assert (bsize < bytes);
 
       /* If encoding part of a frame, and we have no set stop time on
        * the output segment, we update the segment stop time to reflect
        * the last sample. This will let oggmux set the last page's
        * granpos to tell a decoder the dummy samples should be clipped.
        */
+      input_samples = bsize / (enc->n_channels * 2);
       segment = &GST_AUDIO_ENCODER_OUTPUT_SEGMENT (enc);
       if (!GST_CLOCK_TIME_IS_VALID (segment->stop)) {
-        int input_samples = bsize / (enc->n_channels * 2);
         GST_DEBUG_OBJECT (enc,
             "No stop time and partial frame, updating segment");
         duration =
-            gst_util_uint64_scale (enc->encoded_samples + input_samples,
+            gst_util_uint64_scale_ceil (enc->consumed_samples + input_samples,
             GST_SECOND, enc->sample_rate);
         segment->stop = segment->start + duration;
         GST_DEBUG_OBJECT (enc, "new output segment %" GST_SEGMENT_FORMAT,
@@ -930,17 +969,72 @@
             gst_event_new_segment (segment));
       }
 
+      diff =
+          (enc->encoded_samples + frame_samples) - (enc->consumed_samples +
+          input_samples);
+      if (diff >= 0) {
+        GST_DEBUG_OBJECT (enc,
+            "%" G_GINT64_FORMAT " extra samples of padding in this frame",
+            diff);
+        output_samples = frame_samples - diff;
+        trim_end = diff * 48000 / enc->sample_rate;
+      } else {
+        GST_DEBUG_OBJECT (enc,
+            "Need to add %" G_GINT64_FORMAT " extra samples in the next frame",
+            -diff);
+        output_samples = frame_samples;
+      }
+
       size = ((bsize / bytes) + 1) * bytes;
       mdata = g_malloc0 (size);
+      /* FIXME: Instead of silence, use LPC with the last real samples.
+       * Otherwise we will create a discontinuity here, which will distort the
+       * last few encoded samples
+       */
       memcpy (mdata, bdata, bsize);
       data = mdata;
     } else {
       data = bdata;
       size = bsize;
+
+      /* Adjust for lookahead here */
+      if (enc->pending_lookahead) {
+        guint scaled_lookahead =
+            enc->pending_lookahead * enc->sample_rate / 48000;
+
+        if (input_samples > scaled_lookahead) {
+          output_samples = input_samples - scaled_lookahead;
+          trim_start = enc->pending_lookahead;
+          enc->pending_lookahead = 0;
+        } else {
+          trim_start = ((guint64) input_samples) * 48000 / enc->sample_rate;
+          enc->pending_lookahead -= trim_start;
+          output_samples = 0;
+        }
+      } else {
+        output_samples = input_samples;
+      }
     }
   } else {
-    GST_DEBUG_OBJECT (enc, "nothing to drain");
-    goto done;
+    if (enc->encoded_samples < enc->consumed_samples) {
+      /* FIXME: Instead of silence, use LPC with the last real samples.
+       * Otherwise we will create a discontinuity here, which will distort the
+       * last few encoded samples
+       */
+      data = mdata = g_malloc0 (bytes);
+      size = bytes;
+      output_samples = enc->consumed_samples - enc->encoded_samples;
+      input_samples = 0;
+      GST_DEBUG_OBJECT (enc, "draining %d samples", output_samples);
+      trim_end =
+          ((guint64) frame_samples - output_samples) * 48000 / enc->sample_rate;
+    } else if (enc->encoded_samples == enc->consumed_samples) {
+      GST_DEBUG_OBJECT (enc, "nothing to drain");
+      goto done;
+    } else {
+      g_assert_not_reached ();
+      goto done;
+    }
   }
 
   g_assert (size == bytes);
@@ -954,10 +1048,15 @@
   GST_DEBUG_OBJECT (enc, "encoding %d samples (%d bytes)",
       frame_samples, (int) bytes);
 
-  gst_buffer_map (outbuf, &omap, GST_MAP_WRITE);
+  if (trim_start || trim_end) {
+    GST_DEBUG_OBJECT (enc,
+        "Adding trim-start %" G_GUINT64_FORMAT " trim-end %" G_GUINT64_FORMAT,
+        trim_start, trim_end);
+    gst_buffer_add_audio_clipping_meta (outbuf, GST_FORMAT_DEFAULT, trim_start,
+        trim_end);
+  }
 
-  GST_DEBUG_OBJECT (enc, "encoding %d samples (%d bytes)",
-      frame_samples, (int) bytes);
+  gst_buffer_map (outbuf, &omap, GST_MAP_WRITE);
 
   outsize =
       opus_multistream_encode (enc->state, (const gint16 *) data,
@@ -980,18 +1079,19 @@
   GST_DEBUG_OBJECT (enc, "Output packet is %u bytes", outsize);
   gst_buffer_set_size (outbuf, outsize);
 
+
   ret =
       gst_audio_encoder_finish_frame (GST_AUDIO_ENCODER (enc), outbuf,
-      frame_samples);
-  enc->encoded_samples += frame_samples;
+      output_samples);
+  enc->encoded_samples += output_samples;
+  enc->consumed_samples += input_samples;
 
 done:
 
   if (bdata)
     gst_buffer_unmap (buf, &map);
 
-  if (mdata)
-    g_free (mdata);
+  g_free (mdata);
 
   return ret;
 }
diff --git a/ext/opus/gstopusenc.h b/ext/opus/gstopusenc.h
index 43eaac8..f447292 100644
--- a/ext/opus/gstopusenc.h
+++ b/ext/opus/gstopusenc.h
@@ -79,7 +79,8 @@
   gint                  n_channels;
   gint                  sample_rate;
 
-  guint64               encoded_samples;
+  guint64               encoded_samples, consumed_samples;
+  guint16               lookahead, pending_lookahead;
 
   guint8                channel_mapping_family;
   guint8                encoding_channel_mapping[256];
diff --git a/ext/opus/gstopusheader.c b/ext/opus/gstopusheader.c
index 1521c1c..dcc8589 100644
--- a/ext/opus/gstopusheader.c
+++ b/ext/opus/gstopusheader.c
@@ -26,219 +26,6 @@
 #include <gst/base/gstbytewriter.h>
 #include "gstopusheader.h"
 
-static GstBuffer *
-gst_opus_enc_create_id_buffer (gint nchannels, gint n_stereo_streams,
-    gint sample_rate, guint8 channel_mapping_family,
-    const guint8 * channel_mapping)
-{
-  GstBuffer *buffer;
-  GstByteWriter bw;
-  gboolean hdl = TRUE;
-
-  g_return_val_if_fail (nchannels > 0 && nchannels < 256, NULL);
-  g_return_val_if_fail (n_stereo_streams >= 0, NULL);
-  g_return_val_if_fail (n_stereo_streams <= nchannels - n_stereo_streams, NULL);
-
-  gst_byte_writer_init (&bw);
-
-  /* See http://wiki.xiph.org/OggOpus */
-  hdl &= gst_byte_writer_put_data (&bw, (const guint8 *) "OpusHead", 8);
-  hdl &= gst_byte_writer_put_uint8 (&bw, 0x01); /* version number */
-  hdl &= gst_byte_writer_put_uint8 (&bw, nchannels);
-  hdl &= gst_byte_writer_put_uint16_le (&bw, 0);        /* pre-skip */
-  hdl &= gst_byte_writer_put_uint32_le (&bw, sample_rate);
-  hdl &= gst_byte_writer_put_uint16_le (&bw, 0);        /* output gain */
-  hdl &= gst_byte_writer_put_uint8 (&bw, channel_mapping_family);
-  if (channel_mapping_family > 0) {
-    hdl &= gst_byte_writer_put_uint8 (&bw, nchannels - n_stereo_streams);
-    hdl &= gst_byte_writer_put_uint8 (&bw, n_stereo_streams);
-    hdl &= gst_byte_writer_put_data (&bw, channel_mapping, nchannels);
-  }
-
-  if (!hdl)
-    GST_WARNING ("Error creating header");
-
-  buffer = gst_byte_writer_reset_and_get_buffer (&bw);
-
-  GST_BUFFER_OFFSET (buffer) = 0;
-  GST_BUFFER_OFFSET_END (buffer) = 0;
-
-  return buffer;
-}
-
-static GstBuffer *
-gst_opus_enc_create_metadata_buffer (const GstTagList * tags)
-{
-  GstTagList *empty_tags = NULL;
-  GstBuffer *comments = NULL;
-
-  GST_DEBUG ("tags = %" GST_PTR_FORMAT, tags);
-
-  if (tags == NULL) {
-    /* FIXME: better fix chain of callers to not write metadata at all,
-     * if there is none */
-    empty_tags = gst_tag_list_new_empty ();
-    tags = empty_tags;
-  }
-  comments =
-      gst_tag_list_to_vorbiscomment_buffer (tags, (const guint8 *) "OpusTags",
-      8, "Encoded with GStreamer Opusenc");
-
-  GST_BUFFER_OFFSET (comments) = 0;
-  GST_BUFFER_OFFSET_END (comments) = 0;
-
-  if (empty_tags)
-    gst_tag_list_unref (empty_tags);
-
-  return comments;
-}
-
-/*
- * (really really) FIXME: move into core (dixit tpm)
- */
-/*
- * _gst_caps_set_buffer_array:
- * @caps: (transfer full): a #GstCaps
- * @field: field in caps to set
- * @buf: header buffers
- *
- * Adds given buffers to an array of buffers set as the given @field
- * on the given @caps.  List of buffer arguments must be NULL-terminated.
- *
- * Returns: (transfer full): input caps with a streamheader field added, or NULL
- *     if some error occurred
- */
-static GstCaps *
-_gst_caps_set_buffer_array (GstCaps * caps, const gchar * field,
-    GstBuffer * buf, ...)
-{
-  GstStructure *structure = NULL;
-  va_list va;
-  GValue array = { 0 };
-  GValue value = { 0 };
-
-  g_return_val_if_fail (caps != NULL, NULL);
-  g_return_val_if_fail (gst_caps_is_fixed (caps), NULL);
-  g_return_val_if_fail (field != NULL, NULL);
-
-  caps = gst_caps_make_writable (caps);
-  structure = gst_caps_get_structure (caps, 0);
-
-  g_value_init (&array, GST_TYPE_ARRAY);
-
-  va_start (va, buf);
-  /* put buffers in a fixed list */
-  while (buf) {
-    g_assert (gst_buffer_is_writable (buf));
-
-    /* mark buffer */
-    GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_HEADER);
-
-    g_value_init (&value, GST_TYPE_BUFFER);
-    buf = gst_buffer_copy (buf);
-    GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_HEADER);
-    gst_value_set_buffer (&value, buf);
-    gst_buffer_unref (buf);
-    gst_value_array_append_value (&array, &value);
-    g_value_unset (&value);
-
-    buf = va_arg (va, GstBuffer *);
-  }
-  va_end (va);
-
-  gst_structure_set_value (structure, field, &array);
-  g_value_unset (&array);
-
-  return caps;
-}
-
-void
-gst_opus_header_create_caps_from_headers (GstCaps ** caps, GSList ** headers,
-    GstBuffer * buf1, GstBuffer * buf2)
-{
-  int n_streams, family;
-  gint channels, rate;
-  gboolean multistream;
-  GstMapInfo map;
-  guint8 *data;
-
-  g_return_if_fail (caps);
-  g_return_if_fail (!headers || !*headers);
-  g_return_if_fail (gst_buffer_get_size (buf1) >= 19);
-
-  gst_buffer_map (buf1, &map, GST_MAP_READ);
-  data = map.data;
-
-  channels = data[9];
-  rate = GST_READ_UINT32_LE (data + 12);
-
-  /* work out the number of streams */
-  family = data[18];
-  if (family == 0) {
-    n_streams = 1;
-  } else {
-    /* only included in the header for family > 0 */
-    if (map.size >= 20)
-      n_streams = data[19];
-    else {
-      g_warning ("family > 0 but header buffer size < 20");
-      gst_buffer_unmap (buf1, &map);
-      return;
-    }
-  }
-
-  /* TODO: should probably also put the channel mapping into the caps too once
-   * we actually support multi channel, and pre-skip and other fields */
-
-  gst_buffer_unmap (buf1, &map);
-
-  /* mark and put on caps */
-  multistream = n_streams > 1;
-  *caps = gst_caps_new_simple ("audio/x-opus",
-      "multistream", G_TYPE_BOOLEAN, multistream,
-      "channels", G_TYPE_INT, channels, NULL);
-
-  if (rate > 0) {
-    gst_caps_set_simple (*caps, "rate", G_TYPE_INT, rate, NULL);
-  }
-
-  *caps = _gst_caps_set_buffer_array (*caps, "streamheader", buf1, buf2, NULL);
-
-  if (headers) {
-    *headers = g_slist_prepend (*headers, gst_buffer_ref (buf2));
-    *headers = g_slist_prepend (*headers, gst_buffer_ref (buf1));
-  }
-}
-
-void
-gst_opus_header_create_caps (GstCaps ** caps, GSList ** headers, gint nchannels,
-    gint n_stereo_streams, gint sample_rate, guint8 channel_mapping_family,
-    const guint8 * channel_mapping, const GstTagList * tags)
-{
-  GstBuffer *buf1, *buf2;
-
-  g_return_if_fail (caps);
-  g_return_if_fail (!headers || !*headers);
-  g_return_if_fail (nchannels > 0);
-  g_return_if_fail (sample_rate >= 0);  /* 0 -> unset */
-  g_return_if_fail (channel_mapping_family == 0 || channel_mapping);
-
-  /* Opus streams in Ogg begin with two headers; the initial header (with
-     most of the codec setup parameters) which is mandated by the Ogg
-     bitstream spec.  The second header holds any comment fields. */
-
-  /* create header buffers */
-  buf1 =
-      gst_opus_enc_create_id_buffer (nchannels, n_stereo_streams, sample_rate,
-      channel_mapping_family, channel_mapping);
-  buf2 = gst_opus_enc_create_metadata_buffer (tags);
-
-  gst_opus_header_create_caps_from_headers (caps, headers, buf1, buf2);
-
-  gst_buffer_unref (buf2);
-  gst_buffer_unref (buf1);
-}
-
 gboolean
 gst_opus_header_is_header (GstBuffer * buf, const char *magic, guint magic_size)
 {
diff --git a/ext/opus/gstopusheader.h b/ext/opus/gstopusheader.h
index 14c88c0..2a91c03 100644
--- a/ext/opus/gstopusheader.h
+++ b/ext/opus/gstopusheader.h
@@ -26,12 +26,6 @@
 
 G_BEGIN_DECLS
 
-extern void gst_opus_header_create_caps_from_headers (GstCaps **caps, GSList **headers,
-    GstBuffer *id_header, GstBuffer *comment_header);
-extern void gst_opus_header_create_caps (GstCaps **caps, GSList **headers,
-    gint nchannels, gint n_stereo_streams, gint sample_rate,
-    guint8 channel_mapping_family, const guint8 *channel_mapping,
-    const GstTagList *tags);
 extern gboolean gst_opus_header_is_header (GstBuffer * buf,
     const char *magic, guint magic_size);
 extern gboolean gst_opus_header_is_id_header (GstBuffer * buf);
diff --git a/ext/opus/gstopusparse.c b/ext/opus/gstopusparse.c
index 71f0639..ea3252e 100644
--- a/ext/opus/gstopusparse.c
+++ b/ext/opus/gstopusparse.c
@@ -29,7 +29,7 @@
  * <refsect2>
  * <title>Example pipelines</title>
  * |[
- * gst-launch -v filesrc location=opusdata ! opusparse ! opusdec ! audioconvert ! audioresample ! alsasink
+ * gst-launch-1.0 -v filesrc location=opusdata ! opusparse ! opusdec ! audioconvert ! audioresample ! alsasink
  * ]| Decode and plays an unmuxed Opus file.
  * </refsect2>
  */
@@ -43,6 +43,9 @@
 #include "gstopusheader.h"
 #include "gstopusparse.h"
 
+#include <gst/audio/audio.h>
+#include <gst/pbutils/pbutils.h>
+
 GST_DEBUG_CATEGORY_STATIC (opusparse_debug);
 #define GST_CAT_DEFAULT opusparse_debug
 
@@ -101,6 +104,8 @@
 gst_opus_parse_init (GstOpusParse * parse)
 {
   parse->header_sent = FALSE;
+  parse->got_headers = FALSE;
+  parse->pre_skip = 0;
 }
 
 static gboolean
@@ -109,6 +114,8 @@
   GstOpusParse *parse = GST_OPUS_PARSE (base);
 
   parse->header_sent = FALSE;
+  parse->got_headers = FALSE;
+  parse->pre_skip = 0;
   parse->next_ts = 0;
 
   return TRUE;
@@ -119,11 +126,9 @@
 {
   GstOpusParse *parse = GST_OPUS_PARSE (base);
 
-  g_slist_foreach (parse->headers, (GFunc) gst_buffer_unref, NULL);
-  g_slist_free (parse->headers);
-  parse->headers = NULL;
-
   parse->header_sent = FALSE;
+  parse->got_headers = FALSE;
+  parse->pre_skip = 0;
 
   return TRUE;
 }
@@ -195,7 +200,6 @@
       }
 
       packet_offset = 8;
-      data += packet_offset;
 
       /* for ad hoc framing, heed the framing, so we eat any padding */
       payload_offset = packet_size;
@@ -241,7 +245,7 @@
     return GST_FLOW_OK;
 
   /* FIXME some day ... should not mess with buffer itself */
-  if (!parse->header_sent) {
+  if (!parse->got_headers) {
     gst_buffer_replace (&frame->buffer,
         gst_buffer_copy_region (frame->buffer, GST_BUFFER_COPY_ALL, 0, size));
     gst_buffer_unref (frame->buffer);
@@ -322,15 +326,18 @@
   GstOpusParse *parse;
   gboolean is_idheader, is_commentheader;
   GstMapInfo map;
+  GstAudioClippingMeta *cmeta =
+      gst_buffer_get_audio_clipping_meta (frame->buffer);
 
   parse = GST_OPUS_PARSE (base);
 
+  g_assert (!cmeta || cmeta->format == GST_FORMAT_DEFAULT);
+
   is_idheader = gst_opus_header_is_id_header (frame->buffer);
   is_commentheader = gst_opus_header_is_comment_header (frame->buffer);
 
-  if (!parse->header_sent) {
+  if (!parse->got_headers || !parse->header_sent) {
     GstCaps *caps;
-    guint8 channels;
 
     /* Opus streams can decode to 1 or 2 channels, so use the header
        value if we have one, or 2 otherwise */
@@ -344,31 +351,77 @@
       return GST_BASE_PARSE_FLOW_DROPPED;
     }
 
-    g_slist_foreach (parse->headers, (GFunc) gst_buffer_unref, NULL);
-    g_slist_free (parse->headers);
-    parse->headers = NULL;
+    parse->got_headers = TRUE;
 
-    if (parse->id_header && parse->comment_header) {
-      gst_opus_header_create_caps_from_headers (&caps, &parse->headers,
-          parse->id_header, parse->comment_header);
-    } else {
-      guint8 channel_mapping_family, channel_mapping[256];
-      GST_INFO_OBJECT (parse,
-          "No headers, blindly setting up canonical stereo");
-      channels = 2;
-      channel_mapping_family = 0;
-      channel_mapping[0] = 0;
-      channel_mapping[1] = 1;
-      gst_opus_header_create_caps (&caps, &parse->headers, channels, 1, 48000,
-          channel_mapping_family, channel_mapping, NULL);
+    if (cmeta && cmeta->start) {
+      parse->pre_skip += cmeta->start;
+
+      gst_buffer_map (frame->buffer, &map, GST_MAP_READ);
+      duration = packet_duration_opus (map.data, map.size);
+      gst_buffer_unmap (frame->buffer, &map);
+
+      /* Queue frame for later once we know all initial padding */
+      if (duration == cmeta->start) {
+        frame->flags |= GST_BASE_PARSE_FRAME_FLAG_QUEUE;
+      }
     }
 
-    gst_buffer_replace (&parse->id_header, NULL);
-    gst_buffer_replace (&parse->comment_header, NULL);
+    if (!(frame->flags & GST_BASE_PARSE_FRAME_FLAG_QUEUE)) {
+      if (FALSE && parse->id_header && parse->comment_header) {
+        guint16 pre_skip;
 
-    gst_pad_set_caps (GST_BASE_PARSE_SRC_PAD (parse), caps);
-    gst_caps_unref (caps);
-    parse->header_sent = TRUE;
+        gst_buffer_map (parse->id_header, &map, GST_MAP_READWRITE);
+        pre_skip = GST_READ_UINT16_LE (map.data + 10);
+        if (pre_skip != parse->pre_skip) {
+          GST_DEBUG_OBJECT (parse,
+              "Fixing up pre-skip %u -> %" G_GUINT64_FORMAT, pre_skip,
+              parse->pre_skip);
+          GST_WRITE_UINT16_LE (map.data + 10, parse->pre_skip);
+        }
+        gst_buffer_unmap (parse->id_header, &map);
+
+        caps =
+            gst_codec_utils_opus_create_caps_from_header (parse->id_header,
+            parse->comment_header);
+      } else {
+        GstCaps *sink_caps;
+        guint32 sample_rate = 48000;
+        guint8 n_channels, n_streams, n_stereo_streams, channel_mapping_family;
+        guint8 channel_mapping[256];
+        GstBuffer *id_header;
+
+        sink_caps = gst_pad_get_current_caps (GST_BASE_PARSE_SINK_PAD (parse));
+        if (!sink_caps
+            || !gst_codec_utils_opus_parse_caps (sink_caps, &sample_rate,
+                &n_channels, &channel_mapping_family, &n_streams,
+                &n_stereo_streams, channel_mapping)) {
+          GST_INFO_OBJECT (parse,
+              "No headers and no caps, blindly setting up canonical stereo");
+          n_channels = 2;
+          n_streams = 1;
+          n_stereo_streams = 1;
+          channel_mapping_family = 0;
+          channel_mapping[0] = 0;
+          channel_mapping[1] = 1;
+        }
+        if (sink_caps)
+          gst_caps_unref (sink_caps);
+
+        id_header =
+            gst_codec_utils_opus_create_header (sample_rate, n_channels,
+            channel_mapping_family, n_streams, n_stereo_streams,
+            channel_mapping, parse->pre_skip, 0);
+        caps = gst_codec_utils_opus_create_caps_from_header (id_header, NULL);
+        gst_buffer_unref (id_header);
+      }
+
+      gst_buffer_replace (&parse->id_header, NULL);
+      gst_buffer_replace (&parse->comment_header, NULL);
+
+      gst_pad_set_caps (GST_BASE_PARSE_SRC_PAD (parse), caps);
+      gst_caps_unref (caps);
+      parse->header_sent = TRUE;
+    }
   }
 
   GST_BUFFER_TIMESTAMP (frame->buffer) = parse->next_ts;
diff --git a/ext/opus/gstopusparse.h b/ext/opus/gstopusparse.h
index 6d120cc..6379de0 100644
--- a/ext/opus/gstopusparse.h
+++ b/ext/opus/gstopusparse.h
@@ -44,8 +44,8 @@
 struct _GstOpusParse {
   GstBaseParse       element;
 
-  gboolean header_sent;
-  GSList *headers;
+  gboolean got_headers, header_sent;
+  guint64 pre_skip;
   GstClockTime next_ts;
   GstBuffer *id_header;
   GstBuffer *comment_header;
diff --git a/ext/opus/gstrtpopusdepay.c b/ext/opus/gstrtpopusdepay.c
index abb7218..8152cd5 100644
--- a/ext/opus/gstrtpopusdepay.c
+++ b/ext/opus/gstrtpopusdepay.c
@@ -47,7 +47,7 @@
 GST_STATIC_PAD_TEMPLATE ("src",
     GST_PAD_SRC,
     GST_PAD_ALWAYS,
-    GST_STATIC_CAPS ("audio/x-opus, multistream = (boolean) FALSE")
+    GST_STATIC_CAPS ("audio/x-opus, channel-mapping-family = (int) 0")
     );
 
 static GstBuffer *gst_rtp_opus_depay_process (GstRTPBaseDepayload * depayload,
@@ -98,8 +98,8 @@
   const gchar *sprop_stereo, *sprop_maxcapturerate;
 
   srccaps =
-      gst_caps_new_simple ("audio/x-opus", "multistream", G_TYPE_BOOLEAN, FALSE,
-      NULL);
+      gst_caps_new_simple ("audio/x-opus", "channel-mapping-family", G_TYPE_INT,
+      0, NULL);
 
   s = gst_caps_get_structure (caps, 0);
   if ((sprop_stereo = gst_structure_get_string (s, "sprop-stereo"))) {
diff --git a/ext/opus/gstrtpopuspay.c b/ext/opus/gstrtpopuspay.c
index ead49a5..5038028 100644
--- a/ext/opus/gstrtpopuspay.c
+++ b/ext/opus/gstrtpopuspay.c
@@ -38,7 +38,8 @@
 GST_STATIC_PAD_TEMPLATE ("sink",
     GST_PAD_SINK,
     GST_PAD_ALWAYS,
-    GST_STATIC_CAPS ("audio/x-opus, multistream = (boolean) FALSE")
+    GST_STATIC_CAPS
+    ("audio/x-opus, channels = (int) [1, 2], channel-mapping-family = (int) 0")
     );
 
 static GstStaticPadTemplate gst_rtp_opus_pay_src_template =
@@ -122,7 +123,7 @@
   if (gst_structure_get_int (s, "channels", &channels)) {
     if (channels > 2) {
       GST_ERROR_OBJECT (payload,
-          "More than 2 channels with multistream=FALSE is invalid");
+          "More than 2 channels with channel-mapping-family=0 is invalid");
       return FALSE;
     } else if (channels == 2) {
       sprop_stereo = "1";
diff --git a/ext/qt/Makefile.am b/ext/qt/Makefile.am
index 059ee7b..5fdd90a 100644
--- a/ext/qt/Makefile.am
+++ b/ext/qt/Makefile.am
@@ -1,4 +1,4 @@
-plugin_LTLIBRARIES = libqtsink.la
+plugin_LTLIBRARIES = libgstqtsink.la
 
 noinst_HEADERS = \
 	gstqsgtexture.h \
@@ -13,36 +13,38 @@
 BUILT_SOURCES = $(moc_generated)
 CLEANFILES = $(moc_generated)
 
-nodist_libqtsink_la_SOURCES = $(BUILT_SOURCES)
+nodist_libgstqtsink_la_SOURCES = $(BUILT_SOURCES)
 
-libqtsink_la_SOURCES = \
+libgstqtsink_la_SOURCES = \
 	gstqsgtexture.cc \
 	qtitem.cc \
 	gstqtsink.cc \
 	gstqtsink.h \
+	gstqtgl.h \
 	gstplugin.cc
 
-libqtsink_la_CXXFLAGS = \
+libgstqtsink_la_CXXFLAGS = \
 	-I$(top_srcdir)/gst-libs \
 	-I$(top_builddir)/gst-libs \
 	$(GST_CXXFLAGS) \
 	$(GST_BASE_CFLAGS) \
 	$(GST_PLUGINS_BASE_CFLAGS) \
-	$(QT_CFLAGS)
+	$(QT_CFLAGS) \
+	$(GL_CFLAGS)
 
-libqtsink_la_LIBADD = \
+libgstqtsink_la_LIBADD = \
 	$(GST_BASE_LIBS) \
 	$(GST_PLUGINS_BASE_LIBS) \
 	$(QT_LIBS) \
 	$(top_builddir)/gst-libs/gst/gl/libgstgl-$(GST_API_VERSION).la \
 	-lgstvideo-$(GST_API_VERSION)
 
-libqtsink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libqtsink_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
+libgstqtsink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstqtsink_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
 
 
 $(moc_generated): moc_%.cc: %.h
-	@MOC@ -o $@ $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(MOC_CPPFLAGS) $<
+	@MOC@ -o $@ $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(MOC_CPPFLAGS) $<
 
 ui-%.h: %.ui
 	@UIC@ -o $@ $<
diff --git a/ext/qt/Makefile.in b/ext/qt/Makefile.in
index 3d24c28..3d700c0 100644
--- a/ext/qt/Makefile.in
+++ b/ext/qt/Makefile.in
@@ -164,26 +164,26 @@
 am__installdirs = "$(DESTDIR)$(plugindir)"
 LTLIBRARIES = $(plugin_LTLIBRARIES)
 am__DEPENDENCIES_1 =
-libqtsink_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+libgstqtsink_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
 	$(top_builddir)/gst-libs/gst/gl/libgstgl-$(GST_API_VERSION).la
-am_libqtsink_la_OBJECTS = libqtsink_la-gstqsgtexture.lo \
-	libqtsink_la-qtitem.lo libqtsink_la-gstqtsink.lo \
-	libqtsink_la-gstplugin.lo
-am__objects_1 = libqtsink_la-moc_qtitem.lo \
-	libqtsink_la-moc_gstqsgtexture.lo
+am_libgstqtsink_la_OBJECTS = libgstqtsink_la-gstqsgtexture.lo \
+	libgstqtsink_la-qtitem.lo libgstqtsink_la-gstqtsink.lo \
+	libgstqtsink_la-gstplugin.lo
+am__objects_1 = libgstqtsink_la-moc_qtitem.lo \
+	libgstqtsink_la-moc_gstqsgtexture.lo
 am__objects_2 = $(am__objects_1)
-nodist_libqtsink_la_OBJECTS = $(am__objects_2)
-libqtsink_la_OBJECTS = $(am_libqtsink_la_OBJECTS) \
-	$(nodist_libqtsink_la_OBJECTS)
+nodist_libgstqtsink_la_OBJECTS = $(am__objects_2)
+libgstqtsink_la_OBJECTS = $(am_libgstqtsink_la_OBJECTS) \
+	$(nodist_libgstqtsink_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
-libqtsink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
-	$(libqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
-	$(CXXLD) $(libqtsink_la_CXXFLAGS) $(CXXFLAGS) \
-	$(libqtsink_la_LDFLAGS) $(LDFLAGS) -o $@
+libgstqtsink_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CXX \
+	$(libgstqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+	$(CXXLD) $(libgstqtsink_la_CXXFLAGS) $(CXXFLAGS) \
+	$(libgstqtsink_la_LDFLAGS) $(LDFLAGS) -o $@
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -236,8 +236,8 @@
 am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = $(libqtsink_la_SOURCES) $(nodist_libqtsink_la_SOURCES)
-DIST_SOURCES = $(libqtsink_la_SOURCES)
+SOURCES = $(libgstqtsink_la_SOURCES) $(nodist_libgstqtsink_la_SOURCES)
+DIST_SOURCES = $(libgstqtsink_la_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -300,6 +300,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -337,6 +339,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -364,6 +368,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -382,6 +388,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -392,6 +400,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -417,6 +427,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -442,6 +454,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -573,6 +587,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -630,8 +646,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -701,6 +721,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -787,7 +808,7 @@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 wayland_scanner = @wayland_scanner@
-plugin_LTLIBRARIES = libqtsink.la
+plugin_LTLIBRARIES = libgstqtsink.la
 noinst_HEADERS = \
 	gstqsgtexture.h \
 	gstqtsink.h \
@@ -801,31 +822,33 @@
 #anything generated by the Qt tools...
 BUILT_SOURCES = $(moc_generated)
 CLEANFILES = $(moc_generated)
-nodist_libqtsink_la_SOURCES = $(BUILT_SOURCES)
-libqtsink_la_SOURCES = \
+nodist_libgstqtsink_la_SOURCES = $(BUILT_SOURCES)
+libgstqtsink_la_SOURCES = \
 	gstqsgtexture.cc \
 	qtitem.cc \
 	gstqtsink.cc \
 	gstqtsink.h \
+	gstqtgl.h \
 	gstplugin.cc
 
-libqtsink_la_CXXFLAGS = \
+libgstqtsink_la_CXXFLAGS = \
 	-I$(top_srcdir)/gst-libs \
 	-I$(top_builddir)/gst-libs \
 	$(GST_CXXFLAGS) \
 	$(GST_BASE_CFLAGS) \
 	$(GST_PLUGINS_BASE_CFLAGS) \
-	$(QT_CFLAGS)
+	$(QT_CFLAGS) \
+	$(GL_CFLAGS)
 
-libqtsink_la_LIBADD = \
+libgstqtsink_la_LIBADD = \
 	$(GST_BASE_LIBS) \
 	$(GST_PLUGINS_BASE_LIBS) \
 	$(QT_LIBS) \
 	$(top_builddir)/gst-libs/gst/gl/libgstgl-$(GST_API_VERSION).la \
 	-lgstvideo-$(GST_API_VERSION)
 
-libqtsink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libqtsink_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
+libgstqtsink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstqtsink_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
 all: $(BUILT_SOURCES)
 	$(MAKE) $(AM_MAKEFLAGS) all-am
 
@@ -896,8 +919,8 @@
 	  rm -f $${locs}; \
 	}
 
-libqtsink.la: $(libqtsink_la_OBJECTS) $(libqtsink_la_DEPENDENCIES) $(EXTRA_libqtsink_la_DEPENDENCIES) 
-	$(AM_V_CXXLD)$(libqtsink_la_LINK) -rpath $(plugindir) $(libqtsink_la_OBJECTS) $(libqtsink_la_LIBADD) $(LIBS)
+libgstqtsink.la: $(libgstqtsink_la_OBJECTS) $(libgstqtsink_la_DEPENDENCIES) $(EXTRA_libgstqtsink_la_DEPENDENCIES) 
+	$(AM_V_CXXLD)$(libgstqtsink_la_LINK) -rpath $(plugindir) $(libgstqtsink_la_OBJECTS) $(libgstqtsink_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -905,12 +928,12 @@
 distclean-compile:
 	-rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqtsink_la-gstplugin.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqtsink_la-gstqsgtexture.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqtsink_la-gstqtsink.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqtsink_la-moc_gstqsgtexture.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqtsink_la-moc_qtitem.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libqtsink_la-qtitem.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstqtsink_la-gstplugin.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstqtsink_la-gstqsgtexture.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstqtsink_la-gstqtsink.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstqtsink_la-moc_gstqsgtexture.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstqtsink_la-moc_qtitem.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstqtsink_la-qtitem.Plo@am__quote@
 
 .cc.o:
 @am__fastdepCXX_TRUE@	$(AM_V_CXX)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@@ -936,47 +959,47 @@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LTCXXCOMPILE) -c -o $@ $<
 
-libqtsink_la-gstqsgtexture.lo: gstqsgtexture.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libqtsink_la_CXXFLAGS) $(CXXFLAGS) -MT libqtsink_la-gstqsgtexture.lo -MD -MP -MF $(DEPDIR)/libqtsink_la-gstqsgtexture.Tpo -c -o libqtsink_la-gstqsgtexture.lo `test -f 'gstqsgtexture.cc' || echo '$(srcdir)/'`gstqsgtexture.cc
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libqtsink_la-gstqsgtexture.Tpo $(DEPDIR)/libqtsink_la-gstqsgtexture.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gstqsgtexture.cc' object='libqtsink_la-gstqsgtexture.lo' libtool=yes @AMDEPBACKSLASH@
+libgstqtsink_la-gstqsgtexture.lo: gstqsgtexture.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstqtsink_la_CXXFLAGS) $(CXXFLAGS) -MT libgstqtsink_la-gstqsgtexture.lo -MD -MP -MF $(DEPDIR)/libgstqtsink_la-gstqsgtexture.Tpo -c -o libgstqtsink_la-gstqsgtexture.lo `test -f 'gstqsgtexture.cc' || echo '$(srcdir)/'`gstqsgtexture.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstqtsink_la-gstqsgtexture.Tpo $(DEPDIR)/libgstqtsink_la-gstqsgtexture.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gstqsgtexture.cc' object='libgstqtsink_la-gstqsgtexture.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libqtsink_la_CXXFLAGS) $(CXXFLAGS) -c -o libqtsink_la-gstqsgtexture.lo `test -f 'gstqsgtexture.cc' || echo '$(srcdir)/'`gstqsgtexture.cc
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstqtsink_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstqtsink_la-gstqsgtexture.lo `test -f 'gstqsgtexture.cc' || echo '$(srcdir)/'`gstqsgtexture.cc
 
-libqtsink_la-qtitem.lo: qtitem.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libqtsink_la_CXXFLAGS) $(CXXFLAGS) -MT libqtsink_la-qtitem.lo -MD -MP -MF $(DEPDIR)/libqtsink_la-qtitem.Tpo -c -o libqtsink_la-qtitem.lo `test -f 'qtitem.cc' || echo '$(srcdir)/'`qtitem.cc
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libqtsink_la-qtitem.Tpo $(DEPDIR)/libqtsink_la-qtitem.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='qtitem.cc' object='libqtsink_la-qtitem.lo' libtool=yes @AMDEPBACKSLASH@
+libgstqtsink_la-qtitem.lo: qtitem.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstqtsink_la_CXXFLAGS) $(CXXFLAGS) -MT libgstqtsink_la-qtitem.lo -MD -MP -MF $(DEPDIR)/libgstqtsink_la-qtitem.Tpo -c -o libgstqtsink_la-qtitem.lo `test -f 'qtitem.cc' || echo '$(srcdir)/'`qtitem.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstqtsink_la-qtitem.Tpo $(DEPDIR)/libgstqtsink_la-qtitem.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='qtitem.cc' object='libgstqtsink_la-qtitem.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libqtsink_la_CXXFLAGS) $(CXXFLAGS) -c -o libqtsink_la-qtitem.lo `test -f 'qtitem.cc' || echo '$(srcdir)/'`qtitem.cc
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstqtsink_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstqtsink_la-qtitem.lo `test -f 'qtitem.cc' || echo '$(srcdir)/'`qtitem.cc
 
-libqtsink_la-gstqtsink.lo: gstqtsink.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libqtsink_la_CXXFLAGS) $(CXXFLAGS) -MT libqtsink_la-gstqtsink.lo -MD -MP -MF $(DEPDIR)/libqtsink_la-gstqtsink.Tpo -c -o libqtsink_la-gstqtsink.lo `test -f 'gstqtsink.cc' || echo '$(srcdir)/'`gstqtsink.cc
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libqtsink_la-gstqtsink.Tpo $(DEPDIR)/libqtsink_la-gstqtsink.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gstqtsink.cc' object='libqtsink_la-gstqtsink.lo' libtool=yes @AMDEPBACKSLASH@
+libgstqtsink_la-gstqtsink.lo: gstqtsink.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstqtsink_la_CXXFLAGS) $(CXXFLAGS) -MT libgstqtsink_la-gstqtsink.lo -MD -MP -MF $(DEPDIR)/libgstqtsink_la-gstqtsink.Tpo -c -o libgstqtsink_la-gstqtsink.lo `test -f 'gstqtsink.cc' || echo '$(srcdir)/'`gstqtsink.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstqtsink_la-gstqtsink.Tpo $(DEPDIR)/libgstqtsink_la-gstqtsink.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gstqtsink.cc' object='libgstqtsink_la-gstqtsink.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libqtsink_la_CXXFLAGS) $(CXXFLAGS) -c -o libqtsink_la-gstqtsink.lo `test -f 'gstqtsink.cc' || echo '$(srcdir)/'`gstqtsink.cc
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstqtsink_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstqtsink_la-gstqtsink.lo `test -f 'gstqtsink.cc' || echo '$(srcdir)/'`gstqtsink.cc
 
-libqtsink_la-gstplugin.lo: gstplugin.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libqtsink_la_CXXFLAGS) $(CXXFLAGS) -MT libqtsink_la-gstplugin.lo -MD -MP -MF $(DEPDIR)/libqtsink_la-gstplugin.Tpo -c -o libqtsink_la-gstplugin.lo `test -f 'gstplugin.cc' || echo '$(srcdir)/'`gstplugin.cc
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libqtsink_la-gstplugin.Tpo $(DEPDIR)/libqtsink_la-gstplugin.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gstplugin.cc' object='libqtsink_la-gstplugin.lo' libtool=yes @AMDEPBACKSLASH@
+libgstqtsink_la-gstplugin.lo: gstplugin.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstqtsink_la_CXXFLAGS) $(CXXFLAGS) -MT libgstqtsink_la-gstplugin.lo -MD -MP -MF $(DEPDIR)/libgstqtsink_la-gstplugin.Tpo -c -o libgstqtsink_la-gstplugin.lo `test -f 'gstplugin.cc' || echo '$(srcdir)/'`gstplugin.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstqtsink_la-gstplugin.Tpo $(DEPDIR)/libgstqtsink_la-gstplugin.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='gstplugin.cc' object='libgstqtsink_la-gstplugin.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libqtsink_la_CXXFLAGS) $(CXXFLAGS) -c -o libqtsink_la-gstplugin.lo `test -f 'gstplugin.cc' || echo '$(srcdir)/'`gstplugin.cc
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstqtsink_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstqtsink_la-gstplugin.lo `test -f 'gstplugin.cc' || echo '$(srcdir)/'`gstplugin.cc
 
-libqtsink_la-moc_qtitem.lo: moc_qtitem.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libqtsink_la_CXXFLAGS) $(CXXFLAGS) -MT libqtsink_la-moc_qtitem.lo -MD -MP -MF $(DEPDIR)/libqtsink_la-moc_qtitem.Tpo -c -o libqtsink_la-moc_qtitem.lo `test -f 'moc_qtitem.cc' || echo '$(srcdir)/'`moc_qtitem.cc
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libqtsink_la-moc_qtitem.Tpo $(DEPDIR)/libqtsink_la-moc_qtitem.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='moc_qtitem.cc' object='libqtsink_la-moc_qtitem.lo' libtool=yes @AMDEPBACKSLASH@
+libgstqtsink_la-moc_qtitem.lo: moc_qtitem.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstqtsink_la_CXXFLAGS) $(CXXFLAGS) -MT libgstqtsink_la-moc_qtitem.lo -MD -MP -MF $(DEPDIR)/libgstqtsink_la-moc_qtitem.Tpo -c -o libgstqtsink_la-moc_qtitem.lo `test -f 'moc_qtitem.cc' || echo '$(srcdir)/'`moc_qtitem.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstqtsink_la-moc_qtitem.Tpo $(DEPDIR)/libgstqtsink_la-moc_qtitem.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='moc_qtitem.cc' object='libgstqtsink_la-moc_qtitem.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libqtsink_la_CXXFLAGS) $(CXXFLAGS) -c -o libqtsink_la-moc_qtitem.lo `test -f 'moc_qtitem.cc' || echo '$(srcdir)/'`moc_qtitem.cc
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstqtsink_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstqtsink_la-moc_qtitem.lo `test -f 'moc_qtitem.cc' || echo '$(srcdir)/'`moc_qtitem.cc
 
-libqtsink_la-moc_gstqsgtexture.lo: moc_gstqsgtexture.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libqtsink_la_CXXFLAGS) $(CXXFLAGS) -MT libqtsink_la-moc_gstqsgtexture.lo -MD -MP -MF $(DEPDIR)/libqtsink_la-moc_gstqsgtexture.Tpo -c -o libqtsink_la-moc_gstqsgtexture.lo `test -f 'moc_gstqsgtexture.cc' || echo '$(srcdir)/'`moc_gstqsgtexture.cc
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libqtsink_la-moc_gstqsgtexture.Tpo $(DEPDIR)/libqtsink_la-moc_gstqsgtexture.Plo
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='moc_gstqsgtexture.cc' object='libqtsink_la-moc_gstqsgtexture.lo' libtool=yes @AMDEPBACKSLASH@
+libgstqtsink_la-moc_gstqsgtexture.lo: moc_gstqsgtexture.cc
+@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstqtsink_la_CXXFLAGS) $(CXXFLAGS) -MT libgstqtsink_la-moc_gstqsgtexture.lo -MD -MP -MF $(DEPDIR)/libgstqtsink_la-moc_gstqsgtexture.Tpo -c -o libgstqtsink_la-moc_gstqsgtexture.lo `test -f 'moc_gstqsgtexture.cc' || echo '$(srcdir)/'`moc_gstqsgtexture.cc
+@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstqtsink_la-moc_gstqsgtexture.Tpo $(DEPDIR)/libgstqtsink_la-moc_gstqsgtexture.Plo
+@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='moc_gstqsgtexture.cc' object='libgstqtsink_la-moc_gstqsgtexture.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libqtsink_la_CXXFLAGS) $(CXXFLAGS) -c -o libqtsink_la-moc_gstqsgtexture.lo `test -f 'moc_gstqsgtexture.cc' || echo '$(srcdir)/'`moc_gstqsgtexture.cc
+@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CXX $(libgstqtsink_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstqtsink_la_CXXFLAGS) $(CXXFLAGS) -c -o libgstqtsink_la-moc_gstqsgtexture.lo `test -f 'moc_gstqsgtexture.cc' || echo '$(srcdir)/'`moc_gstqsgtexture.cc
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -1199,7 +1222,7 @@
 
 
 $(moc_generated): moc_%.cc: %.h
-	@MOC@ -o $@ $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(MOC_CPPFLAGS) $<
+	@MOC@ -o $@ $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(MOC_CPPFLAGS) $<
 
 ui-%.h: %.ui
 	@UIC@ -o $@ $<
diff --git a/ext/qt/gstplugin.cc b/ext/qt/gstplugin.cc
index 70b6310..2fa10f5 100644
--- a/ext/qt/gstplugin.cc
+++ b/ext/qt/gstplugin.cc
@@ -23,7 +23,7 @@
 #endif
 
 #include "gstqtsink.h"
-#include <QQmlApplicationEngine>
+#include <QtQml/QQmlApplicationEngine>
 
 static gboolean
 plugin_init (GstPlugin * plugin)
diff --git a/ext/qt/gstqsgtexture.cc b/ext/qt/gstqsgtexture.cc
index 0986a82..13208c0 100644
--- a/ext/qt/gstqsgtexture.cc
+++ b/ext/qt/gstqsgtexture.cc
@@ -111,7 +111,7 @@
   mem = gst_buffer_peek_memory (this->buffer_, 0);
   g_assert (gst_is_gl_memory (mem));
 
-  context = ((GstGLBaseBuffer *)mem)->context;
+  context = ((GstGLBaseMemory *)mem)->context;
 
   sync_meta = gst_buffer_get_gl_sync_meta (this->sync_buffer_);
   if (!sync_meta)
diff --git a/ext/qt/gstqsgtexture.h b/ext/qt/gstqsgtexture.h
index bf8f03f..a5a6f9f 100644
--- a/ext/qt/gstqsgtexture.h
+++ b/ext/qt/gstqsgtexture.h
@@ -22,11 +22,13 @@
 #define __GST_QSG_TEXTURE_H__
 
 #include <gst/gst.h>
-#include <QSGTexture>
-#include <QOpenGLFunctions>
 #include <gst/video/video.h>
 #include <gst/gl/gl.h>
 
+#include "gstqtgl.h"
+#include <QtQuick/QSGTexture>
+#include <QtGui/QOpenGLFunctions>
+
 class GstQSGTexture : public QSGTexture, protected QOpenGLFunctions
 {
     Q_OBJECT
diff --git a/ext/qt/gstqtgl.h b/ext/qt/gstqtgl.h
new file mode 100644
index 0000000..673ef22
--- /dev/null
+++ b/ext/qt/gstqtgl.h
@@ -0,0 +1,34 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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.
+ */
+
+/* qt uses the same trick as us to typedef GLsync on gles2 but to a different
+ * type which confuses the preprocessor.  As it's never actually used by qt
+ * public headers, define it to something else to avoid redefinition
+ * warnings/errors */
+
+#include <gst/gl/gstglconfig.h>
+#include <QtCore/qglobal.h>
+
+#if defined(QT_OPENGL_ES_2) && GST_GL_HAVE_WINDOW_ANDROID
+#define GLsync gst_qt_GLsync
+#include <QOpenGLContext>
+#include <QOpenGLFunctions>
+#undef GLsync
+#endif /* defined(QT_OPENGL_ES_2) */
diff --git a/ext/qt/gstqtsink.cc b/ext/qt/gstqtsink.cc
index 9ff13b0..6a25793 100644
--- a/ext/qt/gstqtsink.cc
+++ b/ext/qt/gstqtsink.cc
@@ -28,7 +28,7 @@
 #endif
 
 #include "gstqtsink.h"
-#include <QGuiApplication>
+#include <QtGui/QGuiApplication>
 
 #define GST_CAT_DEFAULT gst_debug_qt_gl_sink
 GST_DEBUG_CATEGORY (GST_CAT_DEFAULT);
@@ -271,6 +271,8 @@
 
       if (ret)
         return ret;
+
+      /* fallthrough */
     }
     default:
       res = GST_BASE_SINK_CLASS (parent_class)->query (bsink, query);
diff --git a/ext/qt/qtitem.cc b/ext/qt/qtitem.cc
index 5786c41..ca8e535 100644
--- a/ext/qt/qtitem.cc
+++ b/ext/qt/qtitem.cc
@@ -25,12 +25,13 @@
 #include <stdio.h>
 
 #include <gst/video/video.h>
-#include <QGuiApplication>
-#include <QQuickWindow>
-#include <QSGSimpleTextureNode>
 #include "qtitem.h"
 #include "gstqsgtexture.h"
 
+#include <QtGui/QGuiApplication>
+#include <QtQuick/QQuickWindow>
+#include <QtQuick/QSGSimpleTextureNode>
+
 #if GST_GL_HAVE_WINDOW_X11 && GST_GL_HAVE_PLATFORM_GLX && defined (HAVE_QT_X11)
 #include <QX11Info>
 #include <gst/gl/x11/gstgldisplay_x11.h>
@@ -41,6 +42,15 @@
 #include <gst/gl/wayland/gstgldisplay_wayland.h>
 #endif
 
+#if GST_GL_HAVE_WINDOW_ANDROID && GST_GL_HAVE_PLATFORM_EGL && defined (HAVE_QT_ANDROID)
+#include <gst/gl/egl/gstgldisplay_egl.h>
+#include <gst/gl/egl/gstglcontext_egl.h>
+#endif
+
+#if GST_GL_HAVE_WINDOW_COCOA && GST_GL_HAVE_PLATFORM_COCOA && defined (HAVE_QT_MAC)
+#include <gst/gl/coaoa/gstgldisplay_cocoa.h>
+#endif
+
 /**
  * SECTION:gtkgstglwidget
  * @short_description: a #GtkGLArea that renders GStreamer video #GstBuffers
@@ -116,6 +126,18 @@
     this->priv->display = (GstGLDisplay *)
         gst_gl_display_x11_new_with_display (QX11Info::display ());
 #endif
+#if GST_GL_HAVE_WINDOW_ANDROID && GST_GL_HAVE_PLATFORM_EGL && defined (HAVE_QT_ANDROID)
+  if (QString::fromUtf8 ("android") == app->platformName())
+    this->priv->display = (GstGLDisplay *) gst_gl_display_egl_new ();
+#endif
+#if GST_GL_HAVE_WINDOW_COCOA && GST_GL_HAVE_PLATFORM_COCOA && defined (HAVE_QT_MAC)
+  if (QString::fromUtf8 ("cocoa") == app->platformName())
+    this->priv->display = (GstGLDisplay *) gst_gl_display_cocoa_new ();
+#endif
+#if GST_GL_HAVE_WINDOW_EAGL && GST_GL_HAVE_PLATFORM_EAGL && defined (HAVE_QT_IOS)
+  if (QString::fromUtf8 ("ios") == app->platformName())
+    this->priv->display = gst_gl_display_new ();
+#endif
 
   if (!this->priv->display)
     this->priv->display = gst_gl_display_new ();
@@ -282,6 +304,39 @@
           platform, gl_api);
   }
 #endif
+#if GST_GL_HAVE_WINDOW_ANDROID && GST_GL_HAVE_PLATFORM_EGL && defined (HAVE_QT_ANDROID)
+  if (GST_IS_GL_DISPLAY_EGL (this->priv->display)) {
+    platform = GST_GL_PLATFORM_EGL;
+    gl_api = gst_gl_context_get_current_gl_api (platform, NULL, NULL);
+    gl_handle = gst_gl_context_get_current_gl_context (platform);
+    if (gl_handle)
+      this->priv->other_context =
+          gst_gl_context_new_wrapped (this->priv->display, gl_handle,
+          platform, gl_api);
+  }
+#endif
+#if GST_GL_HAVE_WINDOW_COCOA && GST_GL_HAVE_PLATFORM_COCOA && defined (HAVE_QT_MAC)
+  if (this->priv->display) {
+    platform = GST_GL_PLATFORM_CGL;
+    gl_api = gst_gl_context_get_current_gl_api (platform, NULL, NULL);
+    gl_handle = gst_gl_context_get_current_gl_context (platform);
+    if (gl_handle)
+      this->priv->other_context =
+          gst_gl_context_new_wrapped (this->priv->display, gl_handle,
+          platform, gl_api);
+  }
+#endif
+#if GST_GL_HAVE_WINDOW_EAGL && GST_GL_HAVE_PLATFORM_EAGL && defined (HAVE_QT_IOS)
+  if (this->priv->display) {
+    platform = GST_GL_PLATFORM_EAGL;
+    gl_api = gst_gl_context_get_current_gl_api (platform, NULL, NULL);
+    gl_handle = gst_gl_context_get_current_gl_context (platform);
+    if (gl_handle)
+      this->priv->other_context =
+          gst_gl_context_new_wrapped (this->priv->display, gl_handle,
+          platform, gl_api);
+  }
+#endif
 
   (void) platform;
   (void) gl_api;
@@ -332,7 +387,7 @@
     return FALSE;
   }
 
-  if (!GST_GL_IS_CONTEXT (widget->priv->other_context)) {
+  if (!GST_IS_GL_CONTEXT (widget->priv->other_context)) {
     GST_ERROR ("%p failed to retrieve wrapped context %" GST_PTR_FORMAT, widget,
         widget->priv->other_context);
     g_mutex_unlock (&widget->priv->lock);
diff --git a/ext/qt/qtitem.h b/ext/qt/qtitem.h
index afd2869..5a07634 100644
--- a/ext/qt/qtitem.h
+++ b/ext/qt/qtitem.h
@@ -23,9 +23,11 @@
 
 #include <gst/gst.h>
 #include <gst/gl/gl.h>
-#include <QQuickItem>
-#include <QOpenGLContext>
-#include <QOpenGLFunctions>
+
+#include "gstqtgl.h"
+#include <QtQuick/QQuickItem>
+#include <QtGui/QOpenGLContext>
+#include <QtGui/QOpenGLFunctions>
 
 typedef struct _QtGLVideoItemPrivate QtGLVideoItemPrivate;
 
diff --git a/ext/resindvd/Makefile.in b/ext/resindvd/Makefile.in
index 12dc062..9df265f 100644
--- a/ext/resindvd/Makefile.in
+++ b/ext/resindvd/Makefile.in
@@ -284,6 +284,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -321,6 +323,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -348,6 +352,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -366,6 +372,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -376,6 +384,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -401,6 +411,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -426,6 +438,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -557,6 +571,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -614,8 +630,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -685,6 +705,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/resindvd/resin-play b/ext/resindvd/resin-play
index 5066e5b..46b36cf 100755
--- a/ext/resindvd/resin-play
+++ b/ext/resindvd/resin-play
@@ -6,7 +6,7 @@
   DEVICE_OPT=""
 fi
 
-gst-launch rsndvdbin name=dvd "$DEVICE_OPT" \
+gst-launch-1.0 rsndvdbin name=dvd "$DEVICE_OPT" \
    dvdspu name=spu ! videoconvert ! videoscale ! ximagesink force-aspect-ratio=true \
    dvd. ! queue max-size-buffers=3 max-size-bytes=0 ! spu.video \
    dvd. ! spu.subpicture \
diff --git a/ext/resindvd/resin-play2 b/ext/resindvd/resin-play2
index e35a732..ed89a50 100755
--- a/ext/resindvd/resin-play2
+++ b/ext/resindvd/resin-play2
@@ -6,7 +6,7 @@
   DEVICE_OPT=""
 fi
 
-gst-launch rsndvdbin name=dvd "$DEVICE_OPT" \
+gst-launch-1.0 rsndvdbin name=dvd "$DEVICE_OPT" \
    dvdspu name=spu ! deinterlace ! xvimagesink force-aspect-ratio=false \
    dvd. ! queue max-size-buffers=3 max-size-bytes=0 ! spu.video \
    dvd. ! spu.subpicture \
diff --git a/ext/resindvd/resindvdbin.c b/ext/resindvd/resindvdbin.c
index f9cc5bd..bb33cd7 100644
--- a/ext/resindvd/resindvdbin.c
+++ b/ext/resindvd/resindvdbin.c
@@ -43,11 +43,11 @@
 GST_DEBUG_CATEGORY_EXTERN (resindvd_debug);
 #define GST_CAT_DEFAULT resindvd_debug
 
-#define DVDBIN_LOCK(d) g_mutex_lock((d)->dvd_lock)
-#define DVDBIN_UNLOCK(d) g_mutex_unlock((d)->dvd_lock)
+#define DVDBIN_LOCK(d) g_mutex_lock(&(d)->dvd_lock)
+#define DVDBIN_UNLOCK(d) g_mutex_unlock(&(d)->dvd_lock)
 
-#define DVDBIN_PREROLL_LOCK(d) g_mutex_lock((d)->preroll_lock)
-#define DVDBIN_PREROLL_UNLOCK(d) g_mutex_unlock((d)->preroll_lock)
+#define DVDBIN_PREROLL_LOCK(d) g_mutex_lock(&(d)->preroll_lock)
+#define DVDBIN_PREROLL_UNLOCK(d) g_mutex_unlock(&(d)->preroll_lock)
 
 #define DEFAULT_DEVICE "/dev/dvd"
 enum
@@ -135,8 +135,8 @@
 static void
 rsn_dvdbin_init (RsnDvdBin * dvdbin)
 {
-  dvdbin->dvd_lock = g_mutex_new ();
-  dvdbin->preroll_lock = g_mutex_new ();
+  g_mutex_init (&dvdbin->dvd_lock);
+  g_mutex_init (&dvdbin->preroll_lock);
 }
 
 static void
@@ -144,8 +144,8 @@
 {
   RsnDvdBin *dvdbin = RESINDVDBIN (object);
 
-  g_mutex_free (dvdbin->dvd_lock);
-  g_mutex_free (dvdbin->preroll_lock);
+  g_mutex_clear (&dvdbin->dvd_lock);
+  g_mutex_clear (&dvdbin->preroll_lock);
   g_free (dvdbin->last_uri);
   g_free (dvdbin->device);
 
diff --git a/ext/resindvd/resindvdbin.h b/ext/resindvd/resindvdbin.h
index f2434c1..2eab516 100644
--- a/ext/resindvd/resindvdbin.h
+++ b/ext/resindvd/resindvdbin.h
@@ -58,8 +58,8 @@
   GstBin element;
 
   /* Protects pieces list and properties */
-  GMutex *dvd_lock;
-  GMutex *preroll_lock;
+  GMutex dvd_lock;
+  GMutex preroll_lock;
 
   gchar *device;
   gchar *last_uri;
diff --git a/ext/resindvd/resindvdsrc.c b/ext/resindvd/resindvdsrc.c
index 95d3ca1..505302b 100644
--- a/ext/resindvd/resindvdsrc.c
+++ b/ext/resindvd/resindvdsrc.c
@@ -249,10 +249,10 @@
     rsndvdsrc->faststart = DEFAULT_FASTSTART;
 
   rsndvdsrc->device = g_strdup (DEFAULT_DEVICE);
-  rsndvdsrc->dvd_lock = g_mutex_new ();
-  rsndvdsrc->branch_lock = g_mutex_new ();
+  g_mutex_init (&rsndvdsrc->dvd_lock);
+  g_mutex_init (&rsndvdsrc->branch_lock);
   rsndvdsrc->branching = FALSE;
-  rsndvdsrc->still_cond = g_cond_new ();
+  g_cond_init (&rsndvdsrc->still_cond);
 
   gst_base_src_set_format (GST_BASE_SRC (rsndvdsrc), GST_FORMAT_TIME);
 }
@@ -262,9 +262,9 @@
 {
   resinDvdSrc *src = RESINDVDSRC (object);
 
-  g_mutex_free (src->dvd_lock);
-  g_mutex_free (src->branch_lock);
-  g_cond_free (src->still_cond);
+  g_mutex_clear (&src->dvd_lock);
+  g_mutex_clear (&src->branch_lock);
+  g_cond_clear (&src->still_cond);
   g_free (src->device);
 
   gst_buffer_replace (&src->alloc_buf, NULL);
@@ -278,10 +278,10 @@
 {
   resinDvdSrc *src = RESINDVDSRC (bsrc);
 
-  g_mutex_lock (src->branch_lock);
+  g_mutex_lock (&src->branch_lock);
   src->branching = TRUE;
-  g_cond_broadcast (src->still_cond);
-  g_mutex_unlock (src->branch_lock);
+  g_cond_broadcast (&src->still_cond);
+  g_mutex_unlock (&src->branch_lock);
 
   return TRUE;
 }
@@ -291,9 +291,9 @@
 {
   resinDvdSrc *src = RESINDVDSRC (bsrc);
 
-  g_mutex_lock (src->branch_lock);
+  g_mutex_lock (&src->branch_lock);
   src->branching = FALSE;
-  g_mutex_unlock (src->branch_lock);
+  g_mutex_unlock (&src->branch_lock);
 
   return TRUE;
 }
@@ -356,7 +356,7 @@
   const char *disc_name;
   gchar lang[8];
 
-  g_mutex_lock (src->dvd_lock);
+  g_mutex_lock (&src->dvd_lock);
   if (!read_vts_info (src)) {
     GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ,
         (_("Could not read title information for DVD.")), GST_ERROR_SYSTEM);
@@ -440,7 +440,7 @@
   memset (src->cur_clut, 0, sizeof (guint32) * 16);
   src->cur_audio_phys_stream = -1;
 
-  g_mutex_unlock (src->dvd_lock);
+  g_mutex_unlock (&src->dvd_lock);
 
   return TRUE;
 
@@ -449,7 +449,7 @@
     dvdnav_close (src->dvdnav);
     src->dvdnav = NULL;
   }
-  g_mutex_unlock (src->dvd_lock);
+  g_mutex_unlock (&src->dvd_lock);
   return FALSE;
 }
 
@@ -543,7 +543,7 @@
   gboolean ret = TRUE;
   GstMessage *mouse_over_msg = NULL;
 
-  g_mutex_lock (src->dvd_lock);
+  g_mutex_lock (&src->dvd_lock);
 
   if (src->nav_clock_id) {
     gst_clock_id_unschedule (src->nav_clock_id);
@@ -610,7 +610,7 @@
     src->dvdread = NULL;
   }
 
-  g_mutex_unlock (src->dvd_lock);
+  g_mutex_unlock (&src->dvd_lock);
 
   if (mouse_over_msg)
     gst_element_post_message (GST_ELEMENT_CAST (src), mouse_over_msg);
@@ -654,7 +654,7 @@
 
     /* Now, send the events. We need to drop the dvd lock while doing so,
      * and then check after if we got flushed */
-    g_mutex_unlock (src->dvd_lock);
+    g_mutex_unlock (&src->dvd_lock);
     gst_pad_push_event (GST_BASE_SRC_PAD (src), still_event);
     gst_pad_push_event (GST_BASE_SRC_PAD (src), seg_event);
     if (hl_event) {
@@ -664,21 +664,21 @@
     if (cmds_changed)
       rsn_dvdsrc_send_commands_changed (src);
 
-    g_mutex_lock (src->dvd_lock);
+    g_mutex_lock (&src->dvd_lock);
 
-    g_mutex_lock (src->branch_lock);
+    g_mutex_lock (&src->branch_lock);
 
     src->in_still_state = TRUE;
   } else {
     GST_DEBUG_OBJECT (src,
         "Re-entering still wait with %" GST_TIME_FORMAT " remaining",
         GST_TIME_ARGS (src->still_time_remaining));
-    g_mutex_lock (src->branch_lock);
+    g_mutex_lock (&src->branch_lock);
   }
 
   if (src->branching) {
     GST_INFO_OBJECT (src, "Branching - aborting still");
-    g_mutex_unlock (src->branch_lock);
+    g_mutex_unlock (&src->branch_lock);
     return TRUE;
   }
 
@@ -690,49 +690,48 @@
      */
     src->need_segment = TRUE;
 
-    g_mutex_unlock (src->dvd_lock);
+    g_mutex_unlock (&src->dvd_lock);
     GST_LOG_OBJECT (src, "Entering cond_wait still");
-    g_cond_wait (src->still_cond, src->branch_lock);
+    g_cond_wait (&src->still_cond, &src->branch_lock);
     GST_LOG_OBJECT (src, "cond_wait still over, branching = %d",
         src->branching);
 
     if (src->branching) {
-      g_mutex_unlock (src->branch_lock);
-      g_mutex_lock (src->dvd_lock);
+      g_mutex_unlock (&src->branch_lock);
+      g_mutex_lock (&src->dvd_lock);
       return TRUE;
     }
     src->in_still_state = FALSE;
 
-    g_mutex_unlock (src->branch_lock);
-    g_mutex_lock (src->dvd_lock);
+    g_mutex_unlock (&src->branch_lock);
+    g_mutex_lock (&src->dvd_lock);
   } else {
-    GTimeVal end_time;
     gboolean was_signalled;
 
     if (src->still_time_remaining > 0) {
-      g_get_current_time (&end_time);
-      g_time_val_add (&end_time, src->still_time_remaining / GST_USECOND);
+      gint64 end_time;
+
+      end_time =
+          g_get_monotonic_time () + src->still_time_remaining / GST_USECOND;
 
       /* Implement timed stills by sleeping, possibly
        * in multiple steps if we get paused/unpaused */
-      g_mutex_unlock (src->dvd_lock);
+      g_mutex_unlock (&src->dvd_lock);
       GST_LOG_OBJECT (src, "cond_timed_wait still for %d sec", duration);
       was_signalled =
-          g_cond_timed_wait (src->still_cond, src->branch_lock, &end_time);
+          g_cond_wait_until (&src->still_cond, &src->branch_lock, end_time);
       was_signalled |= src->branching;
 
-      g_mutex_unlock (src->branch_lock);
-      g_mutex_lock (src->dvd_lock);
+      g_mutex_unlock (&src->branch_lock);
+      g_mutex_lock (&src->dvd_lock);
 
       if (was_signalled) {
         /* Signalled - must be flushing */
-        GTimeVal cur_time;
+        gint64 cur_time;
         GstClockTimeDiff remain;
 
-        g_get_current_time (&cur_time);
-        remain =
-            (end_time.tv_sec - cur_time.tv_sec) * GST_SECOND +
-            (end_time.tv_usec - cur_time.tv_usec) * GST_USECOND;
+        cur_time = g_get_monotonic_time ();
+        remain = (end_time - cur_time) * GST_USECOND;
         if (remain < 0)
           src->still_time_remaining = 0;
         else
@@ -769,9 +768,9 @@
           GST_TIME_ARGS (segment->position));
     }
 
-    g_mutex_unlock (src->dvd_lock);
+    g_mutex_unlock (&src->dvd_lock);
     gst_pad_push_event (GST_BASE_SRC_PAD (src), still_event);
-    g_mutex_lock (src->dvd_lock);
+    g_mutex_lock (&src->dvd_lock);
   }
 
   return TRUE;
@@ -930,10 +929,10 @@
   dvdnav_ret = dvdnav_get_next_block (src->dvdnav, mmap.data, &event, &len);
   if (dvdnav_ret != DVDNAV_STATUS_OK)
     goto read_error;
-  g_mutex_lock (src->branch_lock);
+  g_mutex_lock (&src->branch_lock);
   if (src->branching)
     goto branching;
-  g_mutex_unlock (src->branch_lock);
+  g_mutex_unlock (&src->branch_lock);
 
   switch (event) {
     case DVDNAV_BLOCK_OK:
@@ -970,9 +969,9 @@
       }
 
       GST_LOG_OBJECT (src, "NAV packet start TS %" GST_TIME_FORMAT
-          " end TS %" GST_TIME_FORMAT " base %" G_GINT64_FORMAT " %s",
+          " end TS %" GST_TIME_FORMAT " base %" GST_STIME_FORMAT " %s",
           GST_TIME_ARGS (new_start_ptm), GST_TIME_ARGS (new_end_ptm),
-          new_base_time, discont ? "discont" : "");
+          GST_STIME_ARGS (new_base_time), discont ? "discont" : "");
 
 #if 0
       g_print ("NAV packet start TS %" GST_TIME_FORMAT
@@ -1033,10 +1032,10 @@
       if (!rsn_dvdsrc_do_still (src, info->length))
         goto internal_error;
 
-      g_mutex_lock (src->branch_lock);
+      g_mutex_lock (&src->branch_lock);
       if (src->branching)
         goto branching;
-      g_mutex_unlock (src->branch_lock);
+      g_mutex_unlock (&src->branch_lock);
       break;
     }
     case DVDNAV_WAIT:
@@ -1148,11 +1147,11 @@
     GstEvent *hl_event = src->highlight_event;
 
     src->highlight_event = NULL;
-    g_mutex_unlock (src->dvd_lock);
+    g_mutex_unlock (&src->dvd_lock);
     GST_DEBUG_OBJECT (src, "Sending highlight event - button %d",
         src->active_button);
     gst_pad_push_event (GST_BASE_SRC_PAD (src), hl_event);
-    g_mutex_lock (src->dvd_lock);
+    g_mutex_lock (&src->dvd_lock);
   }
 
   return ret;
@@ -1184,7 +1183,7 @@
   }
 branching:
   {
-    g_mutex_unlock (src->branch_lock);
+    g_mutex_unlock (&src->branch_lock);
     gst_buffer_unmap (src->alloc_buf, &mmap);
     return GST_FLOW_FLUSHING;
   }
@@ -1215,7 +1214,7 @@
   cmds[n_cmds++] = GST_NAVIGATION_COMMAND_DVD_ANGLE_MENU;
   cmds[n_cmds++] = GST_NAVIGATION_COMMAND_DVD_CHAPTER_MENU;
 
-  g_mutex_lock (src->dvd_lock);
+  g_mutex_lock (&src->dvd_lock);
 
   /* Multiple angles available? */
   if (src->n_angles > 1) {
@@ -1237,7 +1236,7 @@
     cmds[n_cmds++] = GST_NAVIGATION_COMMAND_UP;
   if (src->cur_btn_mask & RSN_BTN_DOWN)
     cmds[n_cmds++] = GST_NAVIGATION_COMMAND_DOWN;
-  g_mutex_unlock (src->dvd_lock);
+  g_mutex_unlock (&src->dvd_lock);
 
   gst_navigation_query_set_commandsv (query, n_cmds, cmds);
 
@@ -1250,13 +1249,13 @@
   gint cur_agl, n_angles;
   gboolean res = FALSE;
 
-  g_mutex_lock (src->dvd_lock);
+  g_mutex_lock (&src->dvd_lock);
   if (dvdnav_get_angle_info (src->dvdnav, &cur_agl,
           &n_angles) == DVDNAV_STATUS_OK) {
     gst_navigation_query_set_angles (query, cur_agl, n_angles);
     res = TRUE;
   }
-  g_mutex_unlock (src->dvd_lock);
+  g_mutex_unlock (&src->dvd_lock);
 
   return res;
 }
@@ -1321,10 +1320,10 @@
 
   *outbuf = NULL;
 
-  g_mutex_lock (src->dvd_lock);
+  g_mutex_lock (&src->dvd_lock);
   ret = rsn_dvdsrc_prepare_next_block (src, TRUE);
   if (ret != GST_FLOW_OK) {
-    g_mutex_unlock (src->dvd_lock);
+    g_mutex_unlock (&src->dvd_lock);
     return ret;
   }
 
@@ -1359,7 +1358,7 @@
     src->need_tag_update = FALSE;
   }
 
-  g_mutex_unlock (src->dvd_lock);
+  g_mutex_unlock (&src->dvd_lock);
 
   /* Push in-band events now that we've dropped the dvd_lock, before
    * we change segment */
@@ -1416,7 +1415,7 @@
     gst_pad_push_event (GST_BASE_SRC_PAD (src), tag_event);
     tags = NULL;
   }
-  g_mutex_lock (src->dvd_lock);
+  g_mutex_lock (&src->dvd_lock);
 
   if (src->next_buf != NULL) {
     /* Now that we're in the new segment, we can enqueue any nav packet
@@ -1446,7 +1445,7 @@
   /* Schedule a clock callback for the any pending nav packet */
   rsn_dvdsrc_check_nav_blocks (src);
 
-  g_mutex_unlock (src->dvd_lock);
+  g_mutex_unlock (&src->dvd_lock);
 
   if (highlight_event) {
     GST_LOG_OBJECT (src, "Pushing highlight event with TS %" GST_TIME_FORMAT,
@@ -1534,7 +1533,7 @@
   if (result == RSN_NAV_RESULT_HIGHLIGHT) {
     /* If we're *only* changing the highlight, wake up the still condition.
      * If we're branching, that will happen anyway */
-    g_cond_broadcast (src->still_cond);
+    g_cond_broadcast (&src->still_cond);
   }
 
   return result;
@@ -1645,7 +1644,7 @@
 
       GST_DEBUG ("dvdnavsrc got a keypress: %s", key);
 
-      g_mutex_lock (src->dvd_lock);
+      g_mutex_lock (&src->dvd_lock);
       have_lock = TRUE;
       if (!src->running)
         goto not_running;
@@ -1700,7 +1699,7 @@
       if (!gst_navigation_event_parse_mouse_move_event (event, &x, &y))
         return FALSE;
 
-      g_mutex_lock (src->dvd_lock);
+      g_mutex_lock (&src->dvd_lock);
       have_lock = TRUE;
       if (!src->running)
         goto not_running;
@@ -1735,7 +1734,7 @@
 
       GST_DEBUG_OBJECT (src, "Got click at %g, %g", x, y);
 
-      g_mutex_lock (src->dvd_lock);
+      g_mutex_lock (&src->dvd_lock);
       have_lock = TRUE;
       if (!src->running)
         goto not_running;
@@ -1754,7 +1753,7 @@
       if (command == GST_NAVIGATION_COMMAND_INVALID)
         return FALSE;
 
-      g_mutex_lock (src->dvd_lock);
+      g_mutex_lock (&src->dvd_lock);
       have_lock = TRUE;
       if (!src->running)
         goto not_running;
@@ -1786,16 +1785,16 @@
       GstEvent *seek;
 
       GST_DEBUG_OBJECT (src, "Processing flush and jump");
-      g_mutex_lock (src->branch_lock);
+      g_mutex_lock (&src->branch_lock);
       src->branching = TRUE;
-      g_cond_broadcast (src->still_cond);
-      g_mutex_unlock (src->branch_lock);
+      g_cond_broadcast (&src->still_cond);
+      g_mutex_unlock (&src->branch_lock);
 
       hl_event = src->highlight_event;
       src->highlight_event = NULL;
       src->active_highlight = FALSE;
 
-      g_mutex_unlock (src->dvd_lock);
+      g_mutex_unlock (&src->dvd_lock);
 
       if (hl_event) {
         GST_DEBUG_OBJECT (src, "Sending highlight change event - button: %d",
@@ -1809,7 +1808,7 @@
       src->flushing_seek = TRUE;
       gst_element_send_event (GST_ELEMENT (src), seek);
 
-      g_mutex_lock (src->dvd_lock);
+      g_mutex_lock (&src->dvd_lock);
 
       rsn_dvdsrc_update_highlight (src);
     }
@@ -1833,7 +1832,7 @@
     cmds_changed = src->commands_changed;
     src->commands_changed = FALSE;
 
-    g_mutex_unlock (src->dvd_lock);
+    g_mutex_unlock (&src->dvd_lock);
 
     if (hl_event) {
       GST_DEBUG_OBJECT (src, "Sending highlight change event - button: %d",
@@ -1856,7 +1855,7 @@
   return TRUE;
 not_running:
   if (have_lock)
-    g_mutex_unlock (src->dvd_lock);
+    g_mutex_unlock (&src->dvd_lock);
   GST_DEBUG_OBJECT (src, "Element not started. Ignoring navigation event");
   return FALSE;
 }
@@ -2289,7 +2288,7 @@
 
   if (src->highlight_event && src->in_still_state) {
     GST_LOG_OBJECT (src, "Signalling still condition due to highlight change");
-    g_cond_broadcast (src->still_cond);
+    g_cond_broadcast (&src->still_cond);
   }
 }
 
@@ -2323,7 +2322,7 @@
       GST_TIME_FORMAT, GST_TIME_ARGS (time),
       GST_TIME_ARGS (gst_clock_get_time (clock) - base_time));
 
-  g_mutex_lock (src->dvd_lock);
+  g_mutex_lock (&src->dvd_lock);
 
   /* Destroy the clock id that caused this callback */
   if (src->nav_clock_id) {
@@ -2358,7 +2357,7 @@
     rsn_dvdsrc_schedule_nav_cb (src, next_nav);
   }
 
-  g_mutex_unlock (src->dvd_lock);
+  g_mutex_unlock (&src->dvd_lock);
 
   return TRUE;
 }
@@ -2394,11 +2393,11 @@
   GST_LOG_OBJECT (src, "Schedule nav pack for running TS %" GST_TIME_FORMAT,
       GST_TIME_ARGS (next_nav->running_ts));
 
-  g_mutex_unlock (src->dvd_lock);
+  g_mutex_unlock (&src->dvd_lock);
   gst_clock_id_wait_async (src->nav_clock_id, rsn_dvdsrc_nav_clock_cb, src,
       NULL);
   gst_object_unref (clock);
-  g_mutex_lock (src->dvd_lock);
+  g_mutex_lock (&src->dvd_lock);
 }
 
 /* Called with dvd_lock held */
@@ -2514,14 +2513,14 @@
     case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
       GST_DEBUG_OBJECT (element, "Switching to PAUSED");
       /* Unschedule any NAV packet callback */
-      g_mutex_lock (src->dvd_lock);
+      g_mutex_lock (&src->dvd_lock);
       src->in_playing = FALSE;
       if (src->nav_clock_id) {
         gst_clock_id_unschedule (src->nav_clock_id);
         gst_clock_id_unref (src->nav_clock_id);
         src->nav_clock_id = NULL;
       }
-      g_mutex_unlock (src->dvd_lock);
+      g_mutex_unlock (&src->dvd_lock);
       break;
     default:
       break;
@@ -2535,10 +2534,10 @@
     case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
       GST_DEBUG_OBJECT (element, "Switching to PLAYING");
       /* Kick off the NAV packet callback if needed */
-      g_mutex_lock (src->dvd_lock);
+      g_mutex_lock (&src->dvd_lock);
       src->in_playing = TRUE;
       rsn_dvdsrc_check_nav_blocks (src);
-      g_mutex_unlock (src->dvd_lock);
+      g_mutex_unlock (&src->dvd_lock);
       break;
     case GST_STATE_CHANGE_READY_TO_PAUSED:
       rsn_dvdsrc_post_title_info (element);
@@ -2561,9 +2560,9 @@
   switch (GST_QUERY_TYPE (query)) {
     case GST_QUERY_DURATION:
       gst_query_parse_duration (query, &format, NULL);
-      g_mutex_lock (src->dvd_lock);
+      g_mutex_lock (&src->dvd_lock);
       if (!src->running) {
-        g_mutex_unlock (src->dvd_lock);
+        g_mutex_unlock (&src->dvd_lock);
         break;
       }
 
@@ -2598,14 +2597,14 @@
           }
         }
       }
-      g_mutex_unlock (src->dvd_lock);
+      g_mutex_unlock (&src->dvd_lock);
       break;
     case GST_QUERY_POSITION:
       gst_query_parse_position (query, &format, NULL);
 
-      g_mutex_lock (src->dvd_lock);
+      g_mutex_lock (&src->dvd_lock);
       if (!src->running) {
-        g_mutex_unlock (src->dvd_lock);
+        g_mutex_unlock (&src->dvd_lock);
         break;
       }
       if (format == title_format) {
@@ -2627,7 +2626,7 @@
           res = TRUE;
         }
       }
-      g_mutex_unlock (src->dvd_lock);
+      g_mutex_unlock (&src->dvd_lock);
       break;
     case GST_QUERY_CUSTOM:
     {
@@ -2837,14 +2836,14 @@
   } else {
     /* Handle other formats: Time, title, chapter, angle */
     if (segment->format == GST_FORMAT_TIME) {
-      g_mutex_lock (src->dvd_lock);
+      g_mutex_lock (&src->dvd_lock);
       src->discont = TRUE;
       ret = rsn_dvdsrc_seek_to_time (src, segment->start);
-      g_mutex_unlock (src->dvd_lock);
+      g_mutex_unlock (&src->dvd_lock);
     } else if (segment->format == title_format) {
       gint titles;
 
-      g_mutex_lock (src->dvd_lock);
+      g_mutex_lock (&src->dvd_lock);
       if (src->running &&
           dvdnav_get_number_of_titles (src->dvdnav,
               &titles) == DVDNAV_STATUS_OK) {
@@ -2854,9 +2853,9 @@
           src->discont = TRUE;
         }
       }
-      g_mutex_unlock (src->dvd_lock);
+      g_mutex_unlock (&src->dvd_lock);
     } else if (segment->format == chapter_format) {
-      g_mutex_lock (src->dvd_lock);
+      g_mutex_lock (&src->dvd_lock);
       if (src->running) {
         gint32 title, chapters, x;
         if (dvdnav_current_title_info (src->dvdnav, &title, &x) ==
@@ -2884,7 +2883,7 @@
           }
         }
       }
-      g_mutex_unlock (src->dvd_lock);
+      g_mutex_unlock (&src->dvd_lock);
     }
   }
 
@@ -2894,7 +2893,7 @@
 
     if (src->flushing_seek) {
       GstMessage *mouse_over_msg = NULL;
-      g_mutex_lock (src->dvd_lock);
+      g_mutex_lock (&src->dvd_lock);
       src->flushing_seek = FALSE;
 
       gst_buffer_replace (&src->next_buf, NULL);
@@ -2913,7 +2912,7 @@
             gst_navigation_message_new_mouse_over ((GstObject *) src, FALSE);
         src->was_mouse_over = FALSE;
       }
-      g_mutex_unlock (src->dvd_lock);
+      g_mutex_unlock (&src->dvd_lock);
 
       if (mouse_over_msg)
         gst_element_post_message (GST_ELEMENT_CAST (src), mouse_over_msg);
diff --git a/ext/resindvd/resindvdsrc.h b/ext/resindvd/resindvdsrc.h
index 5804c07..cc2bb04 100644
--- a/ext/resindvd/resindvdsrc.h
+++ b/ext/resindvd/resindvdsrc.h
@@ -50,9 +50,9 @@
 
   gboolean	faststart;
 
-  GMutex	*dvd_lock;
-  GCond		*still_cond;
-  GMutex	*branch_lock;
+  GMutex	dvd_lock;
+  GCond		still_cond;
+  GMutex	branch_lock;
   gboolean	branching;
 
   gchar		*device;
diff --git a/ext/rsvg/Makefile.in b/ext/rsvg/Makefile.in
index 95b9d99..3154ef9 100644
--- a/ext/rsvg/Makefile.in
+++ b/ext/rsvg/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/rsvg/gstrsvgdec.c b/ext/rsvg/gstrsvgdec.c
index 17ebcb1..d87c6ca 100644
--- a/ext/rsvg/gstrsvgdec.c
+++ b/ext/rsvg/gstrsvgdec.c
@@ -25,7 +25,7 @@
  * <refsect2>
  * <title>Example launch lines</title>
  * |[
- * gst-launch filesrc location=image.svg ! rsvgdec ! imagefreeze ! videoconvert ! autovideosink
+ * gst-launch-1.0 filesrc location=image.svg ! rsvgdec ! imagefreeze ! videoconvert ! autovideosink
  * ]| render and show a svg image.
  * </refsect2>
  */
diff --git a/ext/rsvg/gstrsvgoverlay.c b/ext/rsvg/gstrsvgoverlay.c
index 6c68113..69f99ad 100644
--- a/ext/rsvg/gstrsvgoverlay.c
+++ b/ext/rsvg/gstrsvgoverlay.c
@@ -47,13 +47,13 @@
  * <refsect2>
  * <title>Example launch lines</title>
  * |[
- * gst-launch -v videotestsrc ! videoconvert ! rsvgoverlay location=foo.svg ! videoconvert ! autovideosink
+ * gst-launch-1.0 -v videotestsrc ! videoconvert ! rsvgoverlay location=foo.svg ! videoconvert ! autovideosink
  * ]| specifies the SVG location through the filename property.
  * |[
- * gst-launch -v videotestsrc ! videoconvert ! rsvgoverlay name=overlay ! videoconvert ! autovideosink filesrc location=foo.svg ! image/svg ! overlay.data_sink
+ * gst-launch-1.0 -v videotestsrc ! videoconvert ! rsvgoverlay name=overlay ! videoconvert ! autovideosink filesrc location=foo.svg ! image/svg ! overlay.data_sink
  * ]| does the same by feeding data through the data_sink pad. You can also specify the SVG data itself as parameter:
  * |[
- * gst-launch -v videotestsrc ! videoconvert ! rsvgoverlay data='&lt;svg viewBox="0 0 800 600"&gt;&lt;image x="80%" y="80%" width="10%" height="10%" xlink:href="foo.jpg" /&gt;&lt;/svg&gt;' ! videoconvert ! autovideosink
+ * gst-launch-1.0 -v videotestsrc ! videoconvert ! rsvgoverlay data='&lt;svg viewBox="0 0 800 600"&gt;&lt;image x="80%" y="80%" width="10%" height="10%" xlink:href="foo.jpg" /&gt;&lt;/svg&gt;' ! videoconvert ! autovideosink
  * ]|
  * </refsect2>
  */
diff --git a/ext/rtmp/Makefile.in b/ext/rtmp/Makefile.in
index ec8d861..43cdb8b 100644
--- a/ext/rtmp/Makefile.in
+++ b/ext/rtmp/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/rtmp/gstrtmpsink.c b/ext/rtmp/gstrtmpsink.c
index d2e7dbf..095c6ef 100644
--- a/ext/rtmp/gstrtmpsink.c
+++ b/ext/rtmp/gstrtmpsink.c
@@ -30,7 +30,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v videotestsrc ! ffenc_flv ! flvmux ! rtmpsink location='rtmp://localhost/path/to/stream live=1'
+ * gst-launch-1.0 -v videotestsrc ! ffenc_flv ! flvmux ! rtmpsink location='rtmp://localhost/path/to/stream live=1'
  * ]| Encode a test video stream to FLV video format and stream it via RTMP.
  * </refsect2>
  */
diff --git a/ext/rtmp/gstrtmpsrc.c b/ext/rtmp/gstrtmpsrc.c
index bbed8b0..46918e7 100644
--- a/ext/rtmp/gstrtmpsrc.c
+++ b/ext/rtmp/gstrtmpsrc.c
@@ -34,7 +34,7 @@
  * <refsect2>
  * <title>Example launch lines</title>
  * |[
- * gst-launch -v rtmpsrc location=rtmp://somehost/someurl ! fakesink
+ * gst-launch-1.0 -v rtmpsrc location=rtmp://somehost/someurl ! fakesink
  * ]| Open an RTMP location and pass its content to fakesink.
  * </refsect2>
  */
@@ -440,8 +440,8 @@
     }
     case GST_QUERY_SCHEDULING:{
       gst_query_set_scheduling (query,
-          GST_SCHEDULING_FLAG_SEQUENTIAL | GST_SCHEDULING_FLAG_BANDWIDTH_LIMITED,
-          1, -1, 0);
+          GST_SCHEDULING_FLAG_SEQUENTIAL |
+          GST_SCHEDULING_FLAG_BANDWIDTH_LIMITED, 1, -1, 0);
       gst_query_add_scheduling_mode (query, GST_PAD_MODE_PUSH);
 
       ret = TRUE;
diff --git a/ext/sbc/Makefile.in b/ext/sbc/Makefile.in
index da67127..b691b3e 100644
--- a/ext/sbc/Makefile.in
+++ b/ext/sbc/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/schroedinger/Makefile.in b/ext/schroedinger/Makefile.in
index 9f4fbc9..f8f6d6c 100644
--- a/ext/schroedinger/Makefile.in
+++ b/ext/schroedinger/Makefile.in
@@ -277,6 +277,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -314,6 +316,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -341,6 +345,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -359,6 +365,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -369,6 +377,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -394,6 +404,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -419,6 +431,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -550,6 +564,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -607,8 +623,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -678,6 +698,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/sdl/Makefile.in b/ext/sdl/Makefile.in
index 38426ec..25072e8 100644
--- a/ext/sdl/Makefile.in
+++ b/ext/sdl/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/smoothstreaming/Makefile.in b/ext/smoothstreaming/Makefile.in
index d1265bf..5932334 100644
--- a/ext/smoothstreaming/Makefile.in
+++ b/ext/smoothstreaming/Makefile.in
@@ -281,6 +281,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -318,6 +320,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -345,6 +349,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -363,6 +369,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -373,6 +381,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -398,6 +408,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -423,6 +435,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -554,6 +568,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -611,8 +627,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -682,6 +702,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/smoothstreaming/gstmssdemux.c b/ext/smoothstreaming/gstmssdemux.c
index 196ce41..c6fbd1a 100644
--- a/ext/smoothstreaming/gstmssdemux.c
+++ b/ext/smoothstreaming/gstmssdemux.c
@@ -367,13 +367,35 @@
   return srcpad;
 }
 
+static void
+gst_mss_demux_apply_protection_system (GstCaps * caps,
+    const gchar * selected_system)
+{
+  GstStructure *s;
+
+  g_return_if_fail (selected_system);
+  s = gst_caps_get_structure (caps, 0);
+  gst_structure_set (s,
+      "original-media-type", G_TYPE_STRING, gst_structure_get_name (s),
+      GST_PROTECTION_SYSTEM_ID_CAPS_FIELD, G_TYPE_STRING, selected_system,
+      NULL);
+  gst_structure_set_name (s, "application/x-cenc");
+
+}
+
 static gboolean
 gst_mss_demux_setup_streams (GstAdaptiveDemux * demux)
 {
   GstMssDemux *mssdemux = GST_MSS_DEMUX_CAST (demux);
   GSList *streams = gst_mss_manifest_get_streams (mssdemux->manifest);
-  GSList *iter;
   GSList *active_streams = NULL;
+  GSList *iter;
+  const gchar *protection_system_id =
+      gst_mss_manifest_get_protection_system_id (mssdemux->manifest);
+  const gchar *protection_data =
+      gst_mss_manifest_get_protection_data (mssdemux->manifest);
+  gboolean protected = protection_system_id && protection_data;
+  const gchar *selected_system = NULL;
 
   if (streams == NULL) {
     GST_INFO_OBJECT (mssdemux, "No streams found in the manifest");
@@ -383,7 +405,23 @@
     return FALSE;
   }
 
+  if (protected) {
+    const gchar *sys_ids[2] = { protection_system_id, NULL };
+
+    selected_system = gst_protection_select_system (sys_ids);
+    if (!selected_system) {
+      GST_ERROR_OBJECT (mssdemux, "stream is protected, but no "
+          "suitable decryptor element has been found");
+      return FALSE;
+    }
+  }
+
+  GST_INFO_OBJECT (mssdemux, "Changing max bitrate to %u",
+      demux->connection_speed);
+  gst_mss_manifest_change_bitrate (mssdemux->manifest, demux->connection_speed);
+
   GST_INFO_OBJECT (mssdemux, "Activating streams");
+
   for (iter = streams; iter; iter = g_slist_next (iter)) {
     GstPad *srcpad = NULL;
     GstMssDemuxStream *stream = NULL;
@@ -413,6 +451,11 @@
     const gchar *lang;
 
     caps = gst_mss_stream_get_caps (stream->manifest_stream);
+
+    if (protected) {
+      gst_mss_demux_apply_protection_system (caps, selected_system);
+    }
+
     gst_adaptive_demux_stream_set_caps (GST_ADAPTIVE_DEMUX_STREAM_CAST (stream),
         create_mss_caps (stream, caps));
     gst_caps_unref (caps);
@@ -425,6 +468,22 @@
       gst_adaptive_demux_stream_set_tags (GST_ADAPTIVE_DEMUX_STREAM_CAST
           (stream), tags);
     }
+
+    if (protected) {
+      gsize protection_data_len;
+      guchar *decoded_data =
+          g_base64_decode (protection_data, &protection_data_len);
+      GstBuffer *protection_buffer =
+          gst_buffer_new_wrapped (decoded_data, protection_data_len);
+      GstEvent *event =
+          gst_event_new_protection (protection_system_id, protection_buffer,
+          "smooth-streaming");
+
+      GST_LOG_OBJECT (stream, "Queuing Protection event on source pad");
+      gst_adaptive_demux_stream_queue_event ((GstAdaptiveDemuxStream *) stream,
+          event);
+      gst_buffer_unref (protection_buffer);
+    }
   }
 
   g_slist_free (active_streams);
@@ -485,10 +544,31 @@
   if (gst_mss_stream_select_bitrate (mssstream->manifest_stream, bitrate)) {
     GstCaps *caps;
     GstCaps *msscaps;
+    GstMssDemux *mssdemux = GST_MSS_DEMUX_CAST (stream->demux);
+    const gchar *protection_system_id =
+        gst_mss_manifest_get_protection_system_id (mssdemux->manifest);
+    const gchar *protection_data =
+        gst_mss_manifest_get_protection_data (mssdemux->manifest);
+    gboolean protected = protection_system_id && protection_data;
+
     caps = gst_mss_stream_get_caps (mssstream->manifest_stream);
 
     GST_DEBUG_OBJECT (stream->pad,
         "Starting streams reconfiguration due to bitrate changes");
+
+    if (protected) {
+      const gchar *sys_ids[2] = { protection_system_id, NULL };
+      const gchar *selected_system = gst_protection_select_system (sys_ids);
+
+      if (!selected_system) {
+        GST_ERROR_OBJECT (mssdemux, "stream is protected, but no "
+            "suitable decryptor element has been found");
+        return FALSE;
+      }
+
+      gst_mss_demux_apply_protection_system (caps, selected_system);
+    }
+
     msscaps = create_mss_caps (mssstream, caps);
 
     GST_DEBUG_OBJECT (stream->pad,
diff --git a/ext/smoothstreaming/gstmssdemux.h b/ext/smoothstreaming/gstmssdemux.h
index cc5ff7f..5c56e23 100644
--- a/ext/smoothstreaming/gstmssdemux.h
+++ b/ext/smoothstreaming/gstmssdemux.h
@@ -27,6 +27,7 @@
 #include <gst/adaptivedemux/gstadaptivedemux.h>
 #include <gst/base/gstadapter.h>
 #include <gst/base/gstdataqueue.h>
+#include <gst/gstprotection.h>
 #include "gstmssmanifest.h"
 #include <gst/uridownloader/gsturidownloader.h>
 
diff --git a/ext/smoothstreaming/gstmssmanifest.c b/ext/smoothstreaming/gstmssmanifest.c
index 6559c2e..09a076b 100644
--- a/ext/smoothstreaming/gstmssmanifest.c
+++ b/ext/smoothstreaming/gstmssmanifest.c
@@ -95,6 +95,9 @@
 
   gboolean is_live;
 
+  GString *protection_system_id;
+  gchar *protection_data;
+
   GSList *streams;
 };
 
@@ -267,6 +270,41 @@
   stream->regex_position = g_regex_new ("\\{start[ _]time\\}", 0, 0, NULL);
 }
 
+
+static void
+_gst_mss_parse_protection (GstMssManifest * manifest,
+    xmlNodePtr protection_node)
+{
+  xmlNodePtr nodeiter;
+
+  for (nodeiter = protection_node->children; nodeiter;
+      nodeiter = nodeiter->next) {
+    if (nodeiter->type == XML_ELEMENT_NODE
+        && (strcmp ((const char *) nodeiter->name, "ProtectionHeader") == 0)) {
+      xmlChar *system_id_attribute =
+          xmlGetProp (nodeiter, (xmlChar *) "SystemID");
+      gchar *value = (gchar *) system_id_attribute;
+      int id_len = strlen (value);
+      GString *system_id;
+
+      if (value[0] == '{') {
+        value++;
+        id_len--;
+      }
+
+      system_id = g_string_new (value);
+      system_id = g_string_ascii_down (system_id);
+      if (value[id_len - 1] == '}')
+        system_id = g_string_truncate (system_id, id_len - 1);
+
+      manifest->protection_system_id = system_id;
+      manifest->protection_data = (gchar *) xmlNodeGetContent (nodeiter);
+      xmlFree (system_id_attribute);
+      break;
+    }
+  }
+}
+
 GstMssManifest *
 gst_mss_manifest_new (GstBuffer * data)
 {
@@ -300,6 +338,11 @@
       manifest->streams = g_slist_append (manifest->streams, stream);
       _gst_mss_stream_init (stream, nodeiter);
     }
+
+    if (nodeiter->type == XML_ELEMENT_NODE
+        && (strcmp ((const char *) nodeiter->name, "Protection") == 0)) {
+      _gst_mss_parse_protection (manifest, nodeiter);
+    }
   }
 
   gst_buffer_unmap (data, &mapinfo);
@@ -327,10 +370,28 @@
 
   g_slist_free_full (manifest->streams, (GDestroyNotify) gst_mss_stream_free);
 
+  if (manifest->protection_system_id != NULL)
+    g_string_free (manifest->protection_system_id, TRUE);
+  xmlFree (manifest->protection_data);
+
   xmlFreeDoc (manifest->xml);
   g_free (manifest);
 }
 
+const gchar *
+gst_mss_manifest_get_protection_system_id (GstMssManifest * manifest)
+{
+  if (manifest->protection_system_id != NULL)
+    return manifest->protection_system_id->str;
+  return NULL;
+}
+
+const gchar *
+gst_mss_manifest_get_protection_data (GstMssManifest * manifest)
+{
+  return manifest->protection_data;
+}
+
 GSList *
 gst_mss_manifest_get_streams (GstMssManifest * manifest)
 {
@@ -639,11 +700,13 @@
   gchar *audiotag = (gchar *) xmlGetProp (node, (xmlChar *) "AudioTag");
   gchar *channels_str = (gchar *) xmlGetProp (node, (xmlChar *) "Channels");
   gchar *rate_str = (gchar *) xmlGetProp (node, (xmlChar *) "SamplingRate");
+  gchar *depth_str = (gchar *) xmlGetProp (node, (xmlChar *) "BitsPerSample");
   gchar *block_align_str =
       (gchar *) xmlGetProp (node, (xmlChar *) "PacketSize");
   gchar *codec_data_str =
       (gchar *) xmlGetProp (node, (xmlChar *) "CodecPrivateData");
   GstBuffer *codec_data = NULL;
+  gint depth = 0;
   gint block_align = 0;
   gint rate = 0;
   gint channels = 0;
@@ -671,6 +734,8 @@
     rate = (gint) g_ascii_strtoull (rate_str, NULL, 10);
   if (channels_str)
     channels = (int) g_ascii_strtoull (channels_str, NULL, 10);
+  if (depth_str)
+    depth = (gint) g_ascii_strtoull (depth_str, NULL, 10);
   if (block_align_str)
     block_align = (int) g_ascii_strtoull (block_align_str, NULL, 10);
 
@@ -697,6 +762,9 @@
         if (!block_align) {
           block_align = GST_READ_UINT16_LE (mapinfo.data + 12);
         }
+        if (!depth) {
+          depth = GST_READ_UINT16_LE (mapinfo.data + 14);
+        }
         gst_buffer_unmap (codec_data, &mapinfo);
 
         /* Consume all the WAVEFORMATEX structure, and pass only the rest of
@@ -723,6 +791,9 @@
   if (rate)
     gst_structure_set (structure, "rate", G_TYPE_INT, rate, NULL);
 
+  if (depth)
+    gst_structure_set (structure, "depth", G_TYPE_INT, depth, NULL);
+
   if (q->bitrate)
     gst_structure_set (structure, "bitrate", G_TYPE_INT, (int) q->bitrate,
         NULL);
@@ -738,6 +809,7 @@
   xmlFree (audiotag);
   xmlFree (channels_str);
   xmlFree (rate_str);
+  xmlFree (depth_str);
   xmlFree (block_align_str);
   xmlFree (codec_data_str);
 
@@ -915,7 +987,9 @@
     time = fragment->time + (fragment->duration * fragment->repetitions);
   } else {
     fragment = stream->current_fragment->data;
-    time = fragment->time + (fragment->duration * stream->fragment_repetition_index);
+    time =
+        fragment->time +
+        (fragment->duration * stream->fragment_repetition_index);
   }
 
   timescale = gst_mss_stream_get_timescale (stream);
diff --git a/ext/smoothstreaming/gstmssmanifest.h b/ext/smoothstreaming/gstmssmanifest.h
index 364f6d1..65330b4 100644
--- a/ext/smoothstreaming/gstmssmanifest.h
+++ b/ext/smoothstreaming/gstmssmanifest.h
@@ -52,6 +52,8 @@
 gint gst_mss_manifest_get_look_ahead_fragments_count (GstMssManifest * manifest);
 void gst_mss_manifest_reload_fragments (GstMssManifest * manifest, GstBuffer * data);
 GstClockTime gst_mss_manifest_get_min_fragment_duration (GstMssManifest * manifest);
+const gchar * gst_mss_manifest_get_protection_system_id (GstMssManifest * manifest);
+const gchar * gst_mss_manifest_get_protection_data (GstMssManifest * manifest);
 
 GstMssStreamType gst_mss_stream_get_type (GstMssStream *stream);
 GstCaps * gst_mss_stream_get_caps (GstMssStream * stream);
diff --git a/ext/sndfile/Makefile.in b/ext/sndfile/Makefile.in
index a630097..14b417a 100644
--- a/ext/sndfile/Makefile.in
+++ b/ext/sndfile/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/sndfile/gstsfdec.c b/ext/sndfile/gstsfdec.c
index b67a743..d854dba 100644
--- a/ext/sndfile/gstsfdec.c
+++ b/ext/sndfile/gstsfdec.c
@@ -206,7 +206,7 @@
 
   /* FIXME: we should be using GstSegment for all this */
   if (cur_type != GST_SEEK_TYPE_SET || stop_type != GST_SEEK_TYPE_NONE)
-    goto unsuported_type;
+    goto unsupported_type;
 
   if (stop_type == GST_SEEK_TYPE_NONE)
     stop = GST_CLOCK_TIME_NONE;
@@ -270,7 +270,7 @@
     GST_DEBUG_OBJECT (self, "seeking is only supported in TIME format");
     return FALSE;
   }
-unsuported_type:
+unsupported_type:
   {
     GST_DEBUG_OBJECT (self, "unsupported seek type");
     return FALSE;
diff --git a/ext/sndio/Makefile.in b/ext/sndio/Makefile.in
index bedcd8d..e2d7ab7 100644
--- a/ext/sndio/Makefile.in
+++ b/ext/sndio/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/sndio/sndiosink.c b/ext/sndio/sndiosink.c
index d2680a5..1eab800 100644
--- a/ext/sndio/sndiosink.c
+++ b/ext/sndio/sndiosink.c
@@ -25,7 +25,7 @@
  * <para>
  * Simple example pipeline that plays an Ogg/Vorbis file via sndio:
  * <programlisting>
- * gst-launch -v filesrc location=foo.ogg ! decodebin ! audioconvert ! audioresample ! sndiosink
+ * gst-launch-1.0 -v filesrc location=foo.ogg ! decodebin ! audioconvert ! audioresample ! sndiosink
  * </programlisting>
  * </para>
  * </refsect2>
diff --git a/ext/sndio/sndiosrc.c b/ext/sndio/sndiosrc.c
index 19776c2..6800c7d 100644
--- a/ext/sndio/sndiosrc.c
+++ b/ext/sndio/sndiosrc.c
@@ -25,7 +25,7 @@
  * <para>
  * Simple example pipeline that records an Ogg/Vorbis file via sndio:
  * <programlisting>
- * gst-launch -v sndiosrc ! audioconvert ! vorbisenc ! oggmux ! filesink location=foo.ogg 
+ * gst-launch-1.0 -v sndiosrc ! audioconvert ! vorbisenc ! oggmux ! filesink location=foo.ogg
  * </programlisting>
  * </para>
  * </refsect2>
diff --git a/ext/soundtouch/Makefile.in b/ext/soundtouch/Makefile.in
index 7c2a018..7807ac1 100644
--- a/ext/soundtouch/Makefile.in
+++ b/ext/soundtouch/Makefile.in
@@ -295,6 +295,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -332,6 +334,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -359,6 +363,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -377,6 +383,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -387,6 +395,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -412,6 +422,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -437,6 +449,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -568,6 +582,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -625,8 +641,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -696,6 +716,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/spandsp/Makefile.in b/ext/spandsp/Makefile.in
index a12f263..137bb22 100644
--- a/ext/spandsp/Makefile.in
+++ b/ext/spandsp/Makefile.in
@@ -277,6 +277,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -314,6 +316,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -341,6 +345,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -359,6 +365,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -369,6 +377,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -394,6 +404,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -419,6 +431,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -550,6 +564,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -607,8 +623,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -678,6 +698,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/spc/Makefile.in b/ext/spc/Makefile.in
index 03b70d1..00818f3 100644
--- a/ext/spc/Makefile.in
+++ b/ext/spc/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/spc/tag.c b/ext/spc/tag.c
index 61e59d5..bc13ecb 100644
--- a/ext/spc/tag.c
+++ b/ext/spc/tag.c
@@ -328,20 +328,13 @@
 void
 spc_tag_free (spc_tag_info * info)
 {
-  if (info->title)
-    g_free (info->title);
-  if (info->game)
-    g_free (info->game);
-  if (info->artist)
-    g_free (info->artist);
-  if (info->album)
-    g_free (info->album);
-  if (info->publisher)
-    g_free (info->publisher);
-  if (info->comment)
-    g_free (info->comment);
-  if (info->dumper)
-    g_free (info->dumper);
+  g_free (info->title);
+  g_free (info->game);
+  g_free (info->artist);
+  g_free (info->album);
+  g_free (info->publisher);
+  g_free (info->comment);
+  g_free (info->dumper);
   if (info->dump_date)
     g_date_free (info->dump_date);
 }
diff --git a/ext/srtp/Makefile.in b/ext/srtp/Makefile.in
index cd07766..5366451 100644
--- a/ext/srtp/Makefile.in
+++ b/ext/srtp/Makefile.in
@@ -284,6 +284,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -321,6 +323,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -348,6 +352,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -366,6 +372,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -376,6 +384,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -401,6 +411,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -426,6 +438,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -557,6 +571,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -614,8 +630,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -685,6 +705,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/teletextdec/Makefile.am b/ext/teletextdec/Makefile.am
index 838eb5f..5aa8ab5 100644
--- a/ext/teletextdec/Makefile.am
+++ b/ext/teletextdec/Makefile.am
@@ -1,6 +1,6 @@
 plugin_LTLIBRARIES = libgstteletextdec.la
 
-libgstteletextdec_la_SOURCES = gstteletextdec.c teletext.c
+libgstteletextdec_la_SOURCES = gstteletextdec.c
 
 libgstteletextdec_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(TELETEXTDEC_CFLAGS)
 libgstteletextdec_la_LIBADD = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_LIBS) $(TELETEXTDEC_LIBS)
diff --git a/ext/teletextdec/Makefile.in b/ext/teletextdec/Makefile.in
index 9e06484..c43f58a 100644
--- a/ext/teletextdec/Makefile.in
+++ b/ext/teletextdec/Makefile.in
@@ -167,8 +167,7 @@
 libgstteletextdec_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
 am_libgstteletextdec_la_OBJECTS =  \
-	libgstteletextdec_la-gstteletextdec.lo \
-	libgstteletextdec_la-teletext.lo
+	libgstteletextdec_la-gstteletextdec.lo
 libgstteletextdec_la_OBJECTS = $(am_libgstteletextdec_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
@@ -276,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -764,7 +784,7 @@
 top_srcdir = @top_srcdir@
 wayland_scanner = @wayland_scanner@
 plugin_LTLIBRARIES = libgstteletextdec.la
-libgstteletextdec_la_SOURCES = gstteletextdec.c teletext.c
+libgstteletextdec_la_SOURCES = gstteletextdec.c
 libgstteletextdec_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(TELETEXTDEC_CFLAGS)
 libgstteletextdec_la_LIBADD = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_LIBS) $(TELETEXTDEC_LIBS)
 libgstteletextdec_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
@@ -849,7 +869,6 @@
 	-rm -f *.tab.c
 
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstteletextdec_la-gstteletextdec.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstteletextdec_la-teletext.Plo@am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@@ -882,13 +901,6 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstteletextdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstteletextdec_la_CFLAGS) $(CFLAGS) -c -o libgstteletextdec_la-gstteletextdec.lo `test -f 'gstteletextdec.c' || echo '$(srcdir)/'`gstteletextdec.c
 
-libgstteletextdec_la-teletext.lo: teletext.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstteletextdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstteletextdec_la_CFLAGS) $(CFLAGS) -MT libgstteletextdec_la-teletext.lo -MD -MP -MF $(DEPDIR)/libgstteletextdec_la-teletext.Tpo -c -o libgstteletextdec_la-teletext.lo `test -f 'teletext.c' || echo '$(srcdir)/'`teletext.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstteletextdec_la-teletext.Tpo $(DEPDIR)/libgstteletextdec_la-teletext.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='teletext.c' object='libgstteletextdec_la-teletext.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstteletextdec_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstteletextdec_la_CFLAGS) $(CFLAGS) -c -o libgstteletextdec_la-teletext.lo `test -f 'teletext.c' || echo '$(srcdir)/'`teletext.c
-
 mostlyclean-libtool:
 	-rm -f *.lo
 
diff --git a/ext/teletextdec/gstteletextdec.c b/ext/teletextdec/gstteletextdec.c
index 622b972..91b73c2 100644
--- a/ext/teletextdec/gstteletextdec.c
+++ b/ext/teletextdec/gstteletextdec.c
@@ -22,12 +22,13 @@
 /**
  * SECTION:element-teletextdec
  *
- * Decode PES stream containing teletext information to RGBA stream
+ * Decode a stream of raw VBI packets containing teletext information to a RGBA
+ * stream.
  *
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v -m filesrc location=recording.mpeg ! mpegtsdemux ! private/teletext ! teletextdec ! videoconvert ! ximagesink
+ * gst-launch-1.0 -v -m filesrc location=recording.mpeg ! tsdemux ! teletextdec ! videoconvert ! ximagesink
  * ]|
  * </refsect2>
  */
@@ -39,12 +40,15 @@
 #include <gst/gst.h>
 #include <gst/video/video.h>
 #include <string.h>
+#include <stdlib.h>
 
 #include "gstteletextdec.h"
 
 GST_DEBUG_CATEGORY_STATIC (gst_teletextdec_debug);
 #define GST_CAT_DEFAULT gst_teletextdec_debug
 
+#define parent_class gst_teletextdec_parent_class
+
 #define SUBTITLES_PAGE 888
 #define MAX_SLICES 32
 #define DEFAULT_FONT_DESCRIPTION "verdana 12"
@@ -120,26 +124,25 @@
   "#FF00FF", "#00FFFF", "#EEEEEE"
 };
 
+/* in RGBA mode, one character occupies 12 x 10 pixels. */
+#define COLUMNS_TO_WIDTH(cols) ((cols) * 12)
+#define ROWS_TO_HEIGHT(rows) ((rows) * 10)
+
 static GstStaticPadTemplate sink_template = GST_STATIC_PAD_TEMPLATE ("sink",
     GST_PAD_SINK,
     GST_PAD_ALWAYS,
-    GST_STATIC_CAPS
-    ("video/mpeg,mpegversion=2,systemstream=TRUE ; private/teletext")
+    GST_STATIC_CAPS ("application/x-teletext;")
     );
 
 static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
     GST_PAD_SRC,
     GST_PAD_ALWAYS,
     GST_STATIC_CAPS
-    (GST_VIDEO_CAPS_RGBA "; text/plain ; text/html ; text/x-pango-markup")
+    (GST_VIDEO_CAPS_MAKE ("RGBA") ";"
+        "text/x-raw, format={utf-8,pango-markup} ;")
     );
 
-/* debug category for filtering log messages */
-#define DEBUG_INIT(bla) \
-  GST_DEBUG_CATEGORY_INIT (gst_teletextdec_debug, "teletext", 0, "Teletext decoder");
-
-GST_BOILERPLATE_FULL (GstTeletextDec, gst_teletextdec, GstElement,
-    GST_TYPE_ELEMENT, DEBUG_INIT);
+G_DEFINE_TYPE (GstTeletextDec, gst_teletextdec, GST_TYPE_ELEMENT);
 
 static void gst_teletextdec_set_property (GObject * object, guint prop_id,
     const GValue * value, GParamSpec * pspec);
@@ -147,60 +150,35 @@
     GValue * value, GParamSpec * pspec);
 static void gst_teletextdec_finalize (GObject * object);
 
-static GstStateChangeReturn gst_teletextdec_change_state (GstElement * element,
-    GstStateChange transition);
+static GstStateChangeReturn gst_teletextdec_change_state (GstElement *
+    element, GstStateChange transition);
 
-static GstFlowReturn gst_teletextdec_chain (GstPad * pad, GstBuffer * buf);
-static gboolean gst_teletextdec_sink_setcaps (GstPad * pad, GstCaps * caps);
-static gboolean gst_teletextdec_sink_event (GstPad * pad, GstEvent * event);
-static GstPadLinkReturn gst_teletextdec_src_set_caps (GstPad * pad,
-    GstCaps * caps);
+static GstFlowReturn gst_teletextdec_chain (GstPad * pad, GstObject * parent,
+    GstBuffer * buffer);
+static gboolean gst_teletextdec_sink_event (GstPad * pad, GstObject * parent,
+    GstEvent * event);
+static gboolean gst_teletextdec_src_event (GstPad * pad, GstObject * parent,
+    GstEvent * event);
 
-static vbi_bool gst_teletextdec_convert (vbi_dvb_demux * dx, gpointer user_data,
-    const vbi_sliced * sliced, guint n_lines, gint64 pts);
 static void gst_teletextdec_event_handler (vbi_event * ev, void *user_data);
 
 static GstFlowReturn gst_teletextdec_push_page (GstTeletextDec * teletext);
 static GstFlowReturn gst_teletextdec_export_text_page (GstTeletextDec *
     teletext, vbi_page * page, GstBuffer ** buf);
-static GstFlowReturn gst_teletextdec_export_html_page (GstTeletextDec *
-    teletext, vbi_page * page, GstBuffer ** buf);
 static GstFlowReturn gst_teletextdec_export_rgba_page (GstTeletextDec *
     teletext, vbi_page * page, GstBuffer ** buf);
 static GstFlowReturn gst_teletextdec_export_pango_page (GstTeletextDec *
     teletext, vbi_page * page, GstBuffer ** buf);
 
-
-static gboolean gst_teletextdec_push_preroll_buffer (GstTeletextDec * teletext);
 static void gst_teletextdec_process_telx_buffer (GstTeletextDec * teletext,
     GstBuffer * buf);
-static void gst_teletextdec_process_pes_buffer (GstTeletextDec * teletext,
-    GstBuffer * buf);
-static gboolean gst_teletextdec_extract_data_units (GstTeletextDec * teletext,
-    GstTeletextFrame * f, guint8 * packet, guint * offset, gint size);
+static gboolean gst_teletextdec_extract_data_units (GstTeletextDec *
+    teletext, GstTeletextFrame * f, const guint8 * packet, guint * offset,
+    gsize size);
 
 static void gst_teletextdec_zvbi_init (GstTeletextDec * teletext);
 static void gst_teletextdec_zvbi_clear (GstTeletextDec * teletext);
-
-/* GObject vmethod implementations */
-
-static void
-gst_teletextdec_base_init (gpointer klass)
-{
-  GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
-
-  gst_element_class_set_static_metadata (element_class,
-      "Teletext decoder",
-      "Decoder",
-      "Decode PES or raw VBI stream containing teletext information to RGBA, HTML and text",
-      "Sebastian Pölsterl <sebp@k-d-w.org>, "
-      "Andoni Morales Alastruey <ylatuya@gmail.com>");
-
-  gst_element_class_add_pad_template (element_class,
-      gst_static_pad_template_get (&src_template));
-  gst_element_class_add_pad_template (element_class,
-      gst_static_pad_template_get (&sink_template));
-}
+static void gst_teletextdec_reset_frame (GstTeletextDec * teletext);
 
 /* initialize the gstteletext's class */
 static void
@@ -245,18 +223,28 @@
           "Font description used for the pango output.",
           DEFAULT_FONT_DESCRIPTION,
           G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  gst_element_class_set_static_metadata (gstelement_class,
+      "Teletext decoder",
+      "Decoder",
+      "Decode a raw VBI stream containing teletext information to RGBA and text",
+      "Sebastian Pölsterl <sebp@k-d-w.org>, "
+      "Andoni Morales Alastruey <ylatuya@gmail.com>");
+
+  gst_element_class_add_pad_template (gstelement_class,
+      gst_static_pad_template_get (&src_template));
+  gst_element_class_add_pad_template (gstelement_class,
+      gst_static_pad_template_get (&sink_template));
 }
 
 /* initialize the new element
  * initialize instance structure
  */
 static void
-gst_teletextdec_init (GstTeletextDec * teletext, GstTeletextDecClass * klass)
+gst_teletextdec_init (GstTeletextDec * teletext)
 {
   /* Create sink pad */
   teletext->sinkpad = gst_pad_new_from_static_template (&sink_template, "sink");
-  gst_pad_set_setcaps_function (teletext->sinkpad,
-      GST_DEBUG_FUNCPTR (gst_teletextdec_sink_setcaps));
   gst_pad_set_chain_function (teletext->sinkpad,
       GST_DEBUG_FUNCPTR (gst_teletextdec_chain));
   gst_pad_set_event_function (teletext->sinkpad,
@@ -265,11 +253,11 @@
 
   /* Create src pad */
   teletext->srcpad = gst_pad_new_from_static_template (&src_template, "src");
-  gst_pad_set_setcaps_function (teletext->srcpad,
-      GST_DEBUG_FUNCPTR (gst_teletextdec_src_set_caps));
+  gst_pad_set_event_function (teletext->srcpad,
+      GST_DEBUG_FUNCPTR (gst_teletextdec_src_event));
   gst_element_add_pad (GST_ELEMENT (teletext), teletext->srcpad);
 
-  teletext->demux = NULL;
+  teletext->segment = NULL;
   teletext->decoder = NULL;
   teletext->pageno = 0x100;
   teletext->subno = -1;
@@ -284,16 +272,14 @@
   teletext->rate_denominator = 1;
 
   teletext->queue = NULL;
-  teletext->queue_lock = g_mutex_new ();
+  g_mutex_init (&teletext->queue_lock);
 
-  teletext->frame = g_new0 (GstTeletextFrame, 1);
-  teletext->frame->sliced_begin = g_new (vbi_sliced, MAX_SLICES);
-  teletext->frame->current_slice = teletext->frame->sliced_begin;
-  teletext->frame->sliced_end = teletext->frame->sliced_begin + MAX_SLICES;
+  gst_teletextdec_reset_frame (teletext);
 
   teletext->last_ts = 0;
 
-  teletext->process_buf_func = NULL;
+  teletext->export_func = NULL;
+  teletext->buf_pool = NULL;
 }
 
 static void
@@ -301,7 +287,7 @@
 {
   GstTeletextDec *teletext = GST_TELETEXTDEC (object);
 
-  g_mutex_free (teletext->queue_lock);
+  g_mutex_clear (&teletext->queue_lock);
 
   g_free (teletext->frame);
 
@@ -321,9 +307,9 @@
       VBI_EVENT_TTX_PAGE | VBI_EVENT_CAPTION,
       gst_teletextdec_event_handler, teletext);
 
-  g_mutex_lock (teletext->queue_lock);
+  g_mutex_lock (&teletext->queue_lock);
   teletext->queue = g_queue_new ();
-  g_mutex_unlock (teletext->queue_lock);
+  g_mutex_unlock (&teletext->queue_lock);
 }
 
 static void
@@ -333,25 +319,23 @@
 
   GST_LOG_OBJECT (teletext, "Clearing structures");
 
-  if (teletext->demux != NULL) {
-    vbi_dvb_demux_delete (teletext->demux);
-    teletext->demux = NULL;
-  }
   if (teletext->decoder != NULL) {
     vbi_decoder_delete (teletext->decoder);
     teletext->decoder = NULL;
   }
   if (teletext->frame != NULL) {
+    if (teletext->frame->sliced_begin)
+      g_free (teletext->frame->sliced_begin);
     g_free (teletext->frame);
     teletext->frame = NULL;
   }
 
-  g_mutex_lock (teletext->queue_lock);
+  g_mutex_lock (&teletext->queue_lock);
   if (teletext->queue != NULL) {
     g_queue_free (teletext->queue);
     teletext->queue = NULL;
   }
-  g_mutex_unlock (teletext->queue_lock);
+  g_mutex_unlock (&teletext->queue_lock);
 
   teletext->in_timestamp = GST_CLOCK_TIME_NONE;
   teletext->in_duration = GST_CLOCK_TIME_NONE;
@@ -417,21 +401,31 @@
 }
 
 static gboolean
-gst_teletextdec_sink_event (GstPad * pad, GstEvent * event)
+gst_teletextdec_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
 {
   gboolean ret;
-  GstTeletextDec *teletext = GST_TELETEXTDEC (gst_pad_get_parent (pad));
+  GstTeletextDec *teletext = GST_TELETEXTDEC (parent);
 
   GST_DEBUG_OBJECT (teletext, "got event %s",
       gst_event_type_get_name (GST_EVENT_TYPE (event)));
 
   switch (GST_EVENT_TYPE (event)) {
-    case GST_EVENT_NEWSEGMENT:
+    case GST_EVENT_SEGMENT:
       /* maybe save and/or update the current segment (e.g. for output
        * clipping) or convert the event into one in a different format
        * (e.g. BYTES to TIME) or drop it and set a flag to send a newsegment
        * event in a different format later */
-      ret = gst_pad_push_event (teletext->srcpad, event);
+      if (NULL == teletext->export_func) {
+        /* save the segment event and send it after sending caps. replace the
+         * old event if present. */
+        if (teletext->segment) {
+          gst_event_unref (teletext->segment);
+        }
+        teletext->segment = event;
+        ret = TRUE;
+      } else {
+        ret = gst_pad_push_event (teletext->srcpad, event);
+      }
       break;
     case GST_EVENT_EOS:
       /* end-of-stream, we should close down all stream leftovers here */
@@ -444,12 +438,31 @@
       ret = gst_pad_push_event (teletext->srcpad, event);
       break;
     default:
-      ret = gst_pad_event_default (pad, event);
+      ret = gst_pad_event_default (pad, parent, event);
       break;
   }
 
-  gst_object_unref (teletext);
+  return ret;
+}
 
+static gboolean
+gst_teletextdec_src_event (GstPad * pad, GstObject * parent, GstEvent * event)
+{
+  gboolean ret;
+  GstTeletextDec *teletext = GST_TELETEXTDEC (parent);
+
+  switch (GST_EVENT_TYPE (event)) {
+    case GST_EVENT_RECONFIGURE:
+      /* setting export_func to NULL will cause the element to renegotiate caps
+       * before pushing a buffer. */
+      teletext->export_func = NULL;
+      ret = TRUE;
+      break;
+
+    default:
+      ret = gst_pad_event_default (pad, parent, event);
+      break;
+  }
   return ret;
 }
 
@@ -484,109 +497,13 @@
   return ret;
 }
 
-static gboolean
-gst_teletextdec_sink_setcaps (GstPad * pad, GstCaps * caps)
-{
-  GstTeletextDec *teletext = GST_TELETEXTDEC (gst_pad_get_parent (pad));
-  GstStructure *structure = gst_caps_get_structure (caps, 0);
-  const gchar *mimetype = gst_structure_get_name (structure);
-
-  GST_DEBUG_OBJECT (teletext, "%s:%s, caps=%" GST_PTR_FORMAT,
-      GST_DEBUG_PAD_NAME (pad), caps);
-
-  if (g_strcmp0 (mimetype, "private/teletext") == 0) {
-    teletext->process_buf_func = gst_teletextdec_process_telx_buffer;
-    goto accept_caps;
-  } else if (g_strcmp0 (mimetype, "video/mpeg") == 0) {
-    gint version;
-    gboolean is_systemstream;
-
-    if (!gst_structure_get_int (structure, "mpegversion", &version) ||
-        !gst_structure_get_boolean (structure, "systemstream",
-            &is_systemstream))
-      goto refuse_caps;
-
-    if (version != 2 || !is_systemstream)
-      goto refuse_caps;
-
-    teletext->process_buf_func = gst_teletextdec_process_pes_buffer;
-    teletext->demux = vbi_dvb_pes_demux_new (gst_teletextdec_convert, teletext);
-    goto accept_caps;
-  } else
-    goto refuse_caps;
-
-accept_caps:
-  {
-    gst_object_unref (teletext);
-    return gst_teletextdec_push_preroll_buffer (teletext);
-  }
-
-refuse_caps:
-  {
-    GST_ERROR_OBJECT (teletext,
-        "pad %s refused renegotiation to %" GST_PTR_FORMAT,
-        GST_PAD_NAME (pad), caps);
-    gst_object_unref (teletext);
-    return FALSE;
-  }
-}
-
-static gboolean
-gst_teletextdec_src_set_caps (GstPad * pad, GstCaps * caps)
-{
-  GstTeletextDec *teletext;
-  GstStructure *structure = NULL;
-  const gchar *mimetype;
-  GstPad *peer;
-
-  teletext = GST_TELETEXTDEC (gst_pad_get_parent (pad));
-  GST_DEBUG_OBJECT (teletext, "Linking teletext source pad");
-
-  if (gst_caps_is_empty (caps)) {
-    GST_ERROR_OBJECT (teletext,
-        "pad %s refused renegotiation to %" GST_PTR_FORMAT,
-        GST_PAD_NAME (pad), caps);
-    goto refuse_caps;
-  }
-
-  peer = gst_pad_get_peer (pad);
-  if (peer) {
-    gst_pad_set_caps (peer, caps);
-    gst_object_unref (peer);
-  }
-
-  structure = gst_caps_get_structure (caps, 0);
-  mimetype = gst_structure_get_name (structure);
-
-  if (g_strcmp0 (mimetype, "video/x-raw-rgb") == 0) {
-    teletext->output_format = GST_TELETEXTDEC_OUTPUT_FORMAT_RGBA;
-    GST_DEBUG_OBJECT (teletext, "Selected RGBA output format");
-  } else if (g_strcmp0 (mimetype, "text/html") == 0) {
-    teletext->output_format = GST_TELETEXTDEC_OUTPUT_FORMAT_HTML;
-    GST_DEBUG_OBJECT (teletext, "Selected HTML output format");
-  } else if (g_strcmp0 (mimetype, "text/plain") == 0) {
-    teletext->output_format = GST_TELETEXTDEC_OUTPUT_FORMAT_TEXT;
-    GST_DEBUG_OBJECT (teletext, "Selected text output format");
-  } else if (g_strcmp0 (mimetype, "text/x-pango-markup") == 0) {
-    teletext->output_format = GST_TELETEXTDEC_OUTPUT_FORMAT_PANGO;
-    GST_DEBUG_OBJECT (teletext, "Selected pango markup output format");
-  } else
-    goto refuse_caps;
-
-  gst_object_unref (teletext);
-  return TRUE;
-
-
-refuse_caps:
-  {
-    gst_object_unref (teletext);
-    return FALSE;
-  }
-}
-
 static void
 gst_teletextdec_reset_frame (GstTeletextDec * teletext)
 {
+  if (teletext->frame == NULL)
+    teletext->frame = g_new0 (GstTeletextFrame, 1);
+  if (teletext->frame->sliced_begin == NULL)
+    teletext->frame->sliced_begin = g_new (vbi_sliced, MAX_SLICES);
   teletext->frame->current_slice = teletext->frame->sliced_begin;
   teletext->frame->sliced_end = teletext->frame->sliced_begin + MAX_SLICES;
   teletext->frame->last_field = 0;
@@ -595,32 +512,23 @@
 }
 
 static void
-gst_teletextdec_process_pes_buffer (GstTeletextDec * teletext, GstBuffer * buf)
-{
-  vbi_dvb_demux_feed (teletext->demux, GST_BUFFER_DATA (buf),
-      GST_BUFFER_SIZE (buf));
-  return;
-}
-
-static void
 gst_teletextdec_process_telx_buffer (GstTeletextDec * teletext, GstBuffer * buf)
 {
-  guint8 *data = GST_BUFFER_DATA (buf);
-  const gint size = GST_BUFFER_SIZE (buf);
+  GstMapInfo buf_map;
   guint offset = 0;
   gint res;
+  gst_buffer_map (buf, &buf_map, GST_MAP_READ);
 
   teletext->in_timestamp = GST_BUFFER_TIMESTAMP (buf);
   teletext->in_duration = GST_BUFFER_DURATION (buf);
 
-  if (teletext->frame == NULL) {
+  if (teletext->frame == NULL)
     gst_teletextdec_reset_frame (teletext);
-  }
 
-  while (offset < size) {
+  while (offset < buf_map.size) {
     res =
-        gst_teletextdec_extract_data_units (teletext, teletext->frame, data,
-        &offset, size);
+        gst_teletextdec_extract_data_units (teletext, teletext->frame,
+        buf_map.data, &offset, buf_map.size);
 
     if (res == VBI_NEW_FRAME) {
       /* We have a new frame, it's time to feed the decoder */
@@ -646,32 +554,14 @@
       gst_teletextdec_reset_frame (teletext);
     } else if (res == VBI_ERROR) {
       gst_teletextdec_reset_frame (teletext);
-      return;
+      goto beach;
     }
   }
+beach:
+  gst_buffer_unmap (buf, &buf_map);
   return;
 }
 
-static vbi_bool
-gst_teletextdec_convert (vbi_dvb_demux * dx,
-    gpointer user_data, const vbi_sliced * sliced, guint n_lines, gint64 pts)
-{
-  gdouble sample_time;
-  vbi_sliced *s;
-
-  GstTeletextDec *teletext = GST_TELETEXTDEC (user_data);
-
-  GST_DEBUG_OBJECT (teletext, "Converting %u lines to decode", n_lines);
-
-  sample_time = pts * (1 / 90000.0);
-
-  s = g_memdup (sliced, n_lines * sizeof (vbi_sliced));
-  vbi_decode (teletext->decoder, s, n_lines, sample_time);
-  g_free (s);
-
-  return GST_FLOW_OK;
-}
-
 static void
 gst_teletextdec_event_handler (vbi_event * ev, void *user_data)
 {
@@ -697,9 +587,9 @@
       pi->pgno = pgno;
       pi->subno = subno;
 
-      g_mutex_lock (teletext->queue_lock);
+      g_mutex_lock (&teletext->queue_lock);
       g_queue_push_tail (teletext->queue, pi);
-      g_mutex_unlock (teletext->queue_lock);
+      g_mutex_unlock (&teletext->queue_lock);
       break;
     case VBI_EVENT_CAPTION:
       /* TODO: Handle subtitles in caption teletext pages */
@@ -711,29 +601,148 @@
   return;
 }
 
+static void
+gst_teletextdec_try_get_buffer_pool (GstTeletextDec * teletext, GstCaps * caps,
+    gssize size)
+{
+  guint pool_bufsize, min_bufs, max_bufs;
+  GstStructure *poolcfg;
+  GstBufferPool *new_pool;
+  GstQuery *alloc = gst_query_new_allocation (caps, TRUE);
+
+  if (teletext->buf_pool) {
+    /* this function is called only on a caps/size change, so it's practically
+     * impossible that we'll be able to reuse the old pool. */
+    gst_buffer_pool_set_active (teletext->buf_pool, FALSE);
+    gst_object_unref (teletext->buf_pool);
+  }
+
+  if (!gst_pad_peer_query (teletext->srcpad, alloc)) {
+    GST_DEBUG_OBJECT (teletext, "Failed to query peer pad for allocation "
+        "parameters");
+    teletext->buf_pool = NULL;
+    goto beach;
+  }
+
+  if (gst_query_get_n_allocation_pools (alloc) > 0) {
+    gst_query_parse_nth_allocation_pool (alloc, 0, &new_pool, &pool_bufsize,
+        &min_bufs, &max_bufs);
+  } else {
+    new_pool = gst_buffer_pool_new ();
+    max_bufs = 0;
+    min_bufs = 1;
+  }
+
+  poolcfg = gst_buffer_pool_get_config (new_pool);
+  gst_buffer_pool_config_set_params (poolcfg, gst_caps_copy (caps), size,
+      min_bufs, max_bufs);
+  if (!gst_buffer_pool_set_config (new_pool, poolcfg)) {
+    GST_DEBUG_OBJECT (teletext, "Failed to configure the buffer pool");
+    gst_object_unref (new_pool);
+    teletext->buf_pool = NULL;
+    goto beach;
+  }
+  if (!gst_buffer_pool_set_active (new_pool, TRUE)) {
+    GST_DEBUG_OBJECT (teletext, "Failed to make the buffer pool active");
+    gst_object_unref (new_pool);
+    teletext->buf_pool = NULL;
+    goto beach;
+  }
+
+  teletext->buf_pool = new_pool;
+
+beach:
+  gst_query_unref (alloc);
+}
+
+static gboolean
+gst_teletextdec_negotiate_caps (GstTeletextDec * teletext, guint width,
+    guint height)
+{
+  guint i, caps_size;
+  gboolean rv = FALSE;
+
+  /* get the peer's caps filtered by our own ones. */
+  GstCaps *ourcaps = gst_pad_query_caps (teletext->srcpad, NULL);
+  GstCaps *peercaps = gst_pad_peer_query_caps (teletext->srcpad, ourcaps);
+  gst_caps_unref (ourcaps);
+
+  if (gst_caps_is_empty (peercaps)) {
+    goto beach;
+  }
+
+  /* make them writable in case we need to fixate them (video/x-raw). */
+  peercaps = gst_caps_make_writable (peercaps);
+  caps_size = gst_caps_get_size (peercaps);
+
+  for (i = 0; i < caps_size; i++) {
+    GstStructure *caps_struct = gst_caps_get_structure (peercaps, i);
+    const gchar *caps_name = gst_structure_get_name (caps_struct);
+    const gchar *caps_fmt = gst_structure_get_string (caps_struct, "format");
+
+    if (g_strcmp0 (caps_name, "video/x-raw") == 0) {
+      teletext->width = width;
+      teletext->height = height;
+      teletext->export_func = gst_teletextdec_export_rgba_page;
+      gst_structure_set (caps_struct,
+          "width", G_TYPE_INT, width,
+          "height", G_TYPE_INT, height,
+          "framerate", GST_TYPE_FRACTION, 0, 1, NULL);
+      break;
+    } else if ((g_strcmp0 (caps_name, "text/x-raw") == 0) &&
+        (g_strcmp0 (caps_fmt, "utf-8") == 0)) {
+      teletext->export_func = gst_teletextdec_export_text_page;
+      break;
+    } else if ((g_strcmp0 (caps_name, "text/x-raw") == 0) &&
+        (g_strcmp0 (caps_fmt, "pango-markup") == 0)) {
+      teletext->export_func = gst_teletextdec_export_pango_page;
+      break;
+    } else {
+      goto beach;
+    }
+  }
+
+  if (!gst_pad_push_event (teletext->srcpad, gst_event_new_caps (peercaps))) {
+    goto beach;
+  }
+
+  /* try to get a bufferpool from the peer pad in case of RGBA output. */
+  if (gst_teletextdec_export_rgba_page == teletext->export_func) {
+    gst_teletextdec_try_get_buffer_pool (teletext, peercaps,
+        width * height * sizeof (vbi_rgba));
+  }
+
+  /* we can happily return a success now. */
+  rv = TRUE;
+
+beach:
+  gst_caps_unref (peercaps);
+  return rv;
+}
+
 /* this function does the actual processing
  */
 static GstFlowReturn
-gst_teletextdec_chain (GstPad * pad, GstBuffer * buf)
+gst_teletextdec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
 {
-  GstTeletextDec *teletext = GST_TELETEXTDEC (GST_PAD_PARENT (pad));
+  GstTeletextDec *teletext = GST_TELETEXTDEC (parent);
   GstFlowReturn ret = GST_FLOW_OK;
 
   teletext->in_timestamp = GST_BUFFER_TIMESTAMP (buf);
   teletext->in_duration = GST_BUFFER_DURATION (buf);
 
-  teletext->process_buf_func (teletext, buf);
+  gst_teletextdec_process_telx_buffer (teletext, buf);
   gst_buffer_unref (buf);
 
-  g_mutex_lock (teletext->queue_lock);
+  g_mutex_lock (&teletext->queue_lock);
   if (!g_queue_is_empty (teletext->queue)) {
     ret = gst_teletextdec_push_page (teletext);
     if (ret != GST_FLOW_OK) {
-      g_mutex_unlock (teletext->queue_lock);
+      g_mutex_unlock (&teletext->queue_lock);
       goto error;
     }
   }
-  g_mutex_unlock (teletext->queue_lock);
+  g_mutex_unlock (&teletext->queue_lock);
 
   return ret;
 
@@ -760,9 +769,9 @@
   page_info *pi;
   gint pgno, subno;
   gboolean success;
+  guint width, height;
 
-  pi = (page_info *) g_queue_pop_head (teletext->queue);
-
+  pi = g_queue_pop_head (teletext->queue);
   pgno = vbi_bcd2dec (pi->pgno);
   subno = vbi_bcd2dec (pi->subno);
 
@@ -770,37 +779,37 @@
 
   success = vbi_fetch_vt_page (teletext->decoder, &page, pi->pgno, pi->subno,
       VBI_WST_LEVEL_3p5, 25, FALSE);
+  g_free (pi);
   if (G_UNLIKELY (!success))
     goto fetch_page_failed;
 
-  switch (teletext->output_format) {
-    case GST_TELETEXTDEC_OUTPUT_FORMAT_TEXT:
-      ret = gst_teletextdec_export_text_page (teletext, &page, &buf);
-      break;
-    case GST_TELETEXTDEC_OUTPUT_FORMAT_HTML:
-      ret = gst_teletextdec_export_html_page (teletext, &page, &buf);
-      break;
-    case GST_TELETEXTDEC_OUTPUT_FORMAT_RGBA:
-      ret = gst_teletextdec_export_rgba_page (teletext, &page, &buf);
-      break;
-    case GST_TELETEXTDEC_OUTPUT_FORMAT_PANGO:
-      ret = gst_teletextdec_export_pango_page (teletext, &page, &buf);
-      break;
-    default:
-      g_assert_not_reached ();
-      break;
-  }
-  vbi_unref_page (&page);
-  g_free (pi);
+  width = COLUMNS_TO_WIDTH (page.columns);
+  height = ROWS_TO_HEIGHT (page.rows);
 
-  if (ret != GST_FLOW_OK)
-    goto alloc_failed;
+  /* if output_func is NULL, we need to (re-)negotiate. also, it is possible
+   * (though unlikely) that we received a page of a different size. */
+  if (G_UNLIKELY (NULL == teletext->export_func ||
+          teletext->width != width || teletext->height != height)) {
+    /* if negotiate_caps returns FALSE, that means we weren't able to
+     * negotiate. */
+    if (G_UNLIKELY (!gst_teletextdec_negotiate_caps (teletext, width, height))) {
+      ret = GST_FLOW_NOT_NEGOTIATED;
+      goto push_failed;
+    }
+    if (G_UNLIKELY (teletext->segment)) {
+      gst_pad_push_event (teletext->srcpad, teletext->segment);
+      teletext->segment = NULL;
+    }
+  }
+
+  teletext->export_func (teletext, &page, &buf);
+  vbi_unref_page (&page);
 
   GST_BUFFER_TIMESTAMP (buf) = teletext->in_timestamp;
   GST_BUFFER_DURATION (buf) = teletext->in_duration;
 
-  GST_INFO_OBJECT (teletext, "Pushing buffer of size %d",
-      GST_BUFFER_SIZE (buf));
+  GST_INFO_OBJECT (teletext, "Pushing buffer of size %" G_GSIZE_FORMAT,
+      gst_buffer_get_size (buf));
 
   ret = gst_pad_push (teletext->srcpad, buf);
   if (ret != GST_FLOW_OK)
@@ -814,13 +823,6 @@
     return GST_FLOW_ERROR;
   }
 
-alloc_failed:
-  {
-    GST_ERROR_OBJECT (teletext, "Error allocating output buffer, reason %s",
-        gst_flow_get_name (ret));
-    return ret;
-  }
-
 push_failed:
   {
     GST_ERROR_OBJECT (teletext, "Pushing buffer failed, reason %s",
@@ -830,17 +832,17 @@
 }
 
 static gchar **
-gst_teletextdec_vbi_page_to_text_lines (GstTeletextDec * teletext,
-    guint start, guint stop, vbi_page * page)
+gst_teletextdec_vbi_page_to_text_lines (guint start, guint stop, vbi_page *
+    page)
 {
   const guint lines_count = stop - start + 1;
   const guint line_length = page->columns;
   gchar **lines;
-  gint i;
+  guint i;
 
   /* allocate a new NULL-terminated array of strings */
   lines = (gchar **) g_malloc (sizeof (gchar *) * (lines_count + 1));
-  lines[lines_count] = g_strdup ('\0');
+  lines[lines_count] = NULL;
 
   /* export each line in the range of the teletext page in text format */
   for (i = start; i <= stop; i++) {
@@ -858,8 +860,6 @@
 gst_teletextdec_export_text_page (GstTeletextDec * teletext, vbi_page * page,
     GstBuffer ** buf)
 {
-  GstCaps *caps;
-  GstFlowReturn ret;
   gchar *text;
   guint size;
 
@@ -868,7 +868,7 @@
     GString *subs;
     guint i;
 
-    lines = gst_teletextdec_vbi_page_to_text_lines (teletext, 1, 23, page);
+    lines = gst_teletextdec_vbi_page_to_text_lines (1, 23, page);
     subs = g_string_new ("");
     /* Strip white spaces and squash blank lines */
     for (i = 0; i < 23; i++) {
@@ -892,52 +892,9 @@
   }
 
   /* Allocate new buffer */
-  caps = gst_caps_new_simple ("text/plain", NULL);
-  ret = gst_pad_alloc_buffer (teletext->srcpad, GST_BUFFER_OFFSET_NONE,
-      size, caps, &(*buf));
-  if (G_LIKELY (ret == GST_FLOW_OK))
-    GST_BUFFER_DATA (*buf) = GST_BUFFER_MALLOCDATA (*buf) = (guint8 *) text;
-  else
-    gst_buffer_unref (*buf);
+  *buf = gst_buffer_new_wrapped (text, size);
 
-  gst_caps_unref (caps);
-  return ret;
-}
-
-static GstFlowReturn
-gst_teletextdec_export_html_page (GstTeletextDec * teletext, vbi_page * page,
-    GstBuffer ** buf)
-{
-  GstCaps *caps;
-  GstFlowReturn ret;
-  gchar *html;
-  gssize size;
-  vbi_export *ex;
-  gchar *err;
-
-  if (!(ex = vbi_export_new ("html", &err))) {
-    GST_ELEMENT_ERROR (teletext, LIBRARY, SETTINGS,
-        ("Can't open the HTML export module: %s", err), (NULL));
-    g_free (err);
-    return GST_FLOW_ERROR;
-  }
-
-  /* export to NULL to get size of the memory needed to allocate the page */
-  size = vbi_export_mem (ex, NULL, 0, page);
-  if (size < 0)
-    return GST_FLOW_ERROR;
-  html = g_malloc (size);
-  vbi_export_mem (ex, html, size, page);
-
-  /* Allocate new buffer */
-  caps = gst_caps_new_simple ("text/html", NULL);
-  ret = gst_pad_alloc_buffer (teletext->srcpad, GST_BUFFER_OFFSET_NONE,
-      size, caps, &(*buf));
-  if (G_LIKELY (ret == GST_FLOW_OK))
-    GST_BUFFER_DATA (*buf) = GST_BUFFER_MALLOCDATA (*buf) = (guint8 *) html;
-
-  gst_caps_unref (caps);
-  return ret;
+  return GST_FLOW_OK;
 }
 
 static GstFlowReturn
@@ -945,40 +902,34 @@
     GstBuffer ** buf)
 {
   guint size;
-  GstCaps *caps, *out_caps;
-  GstFlowReturn ret;
-  gint width, height;
-  GstPadTemplate *templ;
+  GstBuffer *lbuf;
+  GstMapInfo buf_map;
 
-  /* one character occupies 12 x 10 pixels */
-  width = page->columns * 12;
-  height = page->rows * 10;
+  size = teletext->width * teletext->height * sizeof (vbi_rgba);
 
-  caps = gst_caps_new_simple ("video/x-raw-rgb",
-      "width", G_TYPE_INT, width,
-      "height", G_TYPE_INT, height,
-      "framerate", GST_TYPE_FRACTION, teletext->rate_numerator,
-      teletext->rate_denominator, NULL);
-
-  templ = gst_static_pad_template_get (&src_template);
-  out_caps = gst_caps_intersect (caps, gst_pad_template_get_caps (templ));
-  gst_caps_unref (caps);
-  gst_object_unref (templ);
-
-  size = (guint) width *(guint) height *sizeof (vbi_rgba);
-
-  ret = gst_pad_alloc_buffer_and_set_caps (teletext->srcpad,
-      GST_BUFFER_OFFSET_NONE, size, out_caps, &(*buf));
-
-  if (ret == GST_FLOW_OK) {
-    GST_DEBUG_OBJECT (teletext, "Creating image with %d rows and %d cols",
-        page->rows, page->columns);
-    vbi_draw_vt_page (page, VBI_PIXFMT_RGBA32_LE,
-        (vbi_rgba *) GST_BUFFER_DATA (*buf), FALSE, TRUE);
+  /* Allocate new buffer, using the negotiated pool if available. */
+  if (teletext->buf_pool) {
+    GstFlowReturn acquire_rv =
+        gst_buffer_pool_acquire_buffer (teletext->buf_pool, &lbuf, NULL);
+    if (acquire_rv != GST_FLOW_OK) {
+      return acquire_rv;
+    }
+  } else {
+    lbuf = gst_buffer_new_allocate (NULL, size, NULL);
+    if (NULL == lbuf)
+      return GST_FLOW_ERROR;
   }
 
-  gst_caps_unref (out_caps);
-  return ret;
+  if (!gst_buffer_map (lbuf, &buf_map, GST_MAP_WRITE)) {
+    gst_buffer_unref (lbuf);
+    return GST_FLOW_ERROR;
+  }
+
+  vbi_draw_vt_page (page, VBI_PIXFMT_RGBA32_LE, buf_map.data, FALSE, TRUE);
+  gst_buffer_unmap (lbuf, &buf_map);
+  *buf = lbuf;
+
+  return GST_FLOW_OK;
 }
 
 static GstFlowReturn
@@ -990,13 +941,11 @@
   gchar **colors;
   gchar **lines;
   GString *subs;
-  GstCaps *caps;
-  GstFlowReturn ret;
-  guint start, stop;
-  guint i, j;
+  guint start, stop, k;
+  gint i, j;
 
   colors = (gchar **) g_malloc (sizeof (gchar *) * (rows + 1));
-  colors[rows] = g_strdup ('\0');
+  colors[rows] = NULL;
 
   /* parse all the lines and approximate it's foreground color using the first
    * non null character */
@@ -1013,77 +962,24 @@
   /* get an array of strings with each line of the telext page */
   start = teletext->subtitles_mode ? 1 : 0;
   stop = teletext->subtitles_mode ? rows - 2 : rows - 1;
-  lines = gst_teletextdec_vbi_page_to_text_lines (teletext, start, stop, page);
+  lines = gst_teletextdec_vbi_page_to_text_lines (start, stop, page);
 
   /* format each line in pango markup */
   subs = g_string_new ("");
-  for (i = start; i <= stop; i++) {
+  for (k = start; k <= stop; k++) {
     g_string_append_printf (subs, PANGO_TEMPLATE,
-        teletext->font_description, colors[i], lines[i - start]);
+        teletext->font_description, colors[k], lines[k - start]);
   }
 
   /* Allocate new buffer */
-  caps = gst_caps_new_simple ("text/x-pango-markup", NULL);
-  ret = gst_pad_alloc_buffer (teletext->srcpad, GST_BUFFER_OFFSET_NONE,
-      subs->len + 1, caps, &(*buf));
-  if (G_LIKELY (ret == GST_FLOW_OK))
-    GST_BUFFER_DATA (*buf) = GST_BUFFER_MALLOCDATA (*buf) =
-        (guint8 *) subs->str;
-  else
-    gst_buffer_unref (*buf);
+  *buf = gst_buffer_new_wrapped (subs->str, subs->len + 1);
 
   g_strfreev (lines);
   g_strfreev (colors);
   g_string_free (subs, FALSE);
-  gst_caps_unref (caps);
-  return ret;
+  return GST_FLOW_OK;
 }
 
-static gboolean
-gst_teletextdec_push_preroll_buffer (GstTeletextDec * teletext)
-{
-  GstFlowReturn ret;
-  GstBuffer *buf;
-  gboolean res = TRUE;
-  GstStructure *structure;
-  const gchar *mimetype;
-  GstCaps *out_caps, *peer_caps, *pad_caps;
-
-  /* the stream is sparse, we send a dummy buffer for preroll */
-  peer_caps = gst_pad_peer_get_caps (teletext->srcpad);
-  pad_caps = gst_pad_get_caps (teletext->srcpad);
-  out_caps = gst_caps_intersect (pad_caps, peer_caps);
-
-  if (gst_caps_is_empty (out_caps)) {
-    res = FALSE;
-    goto beach;
-  }
-
-  gst_caps_truncate (out_caps);
-  structure = gst_caps_get_structure (out_caps, 0);
-  mimetype = gst_structure_get_name (structure);
-  if (g_strcmp0 (mimetype, "video/x-raw-rgb") == 0) {
-    /* omit preroll buffer for this format */
-    goto beach;
-  }
-
-  buf = gst_buffer_new_and_alloc (1);
-  GST_BUFFER_DATA (buf)[0] = 0;
-  gst_buffer_set_caps (buf, out_caps);
-  ret = gst_pad_push (teletext->srcpad, buf);
-  if (ret != GST_FLOW_OK)
-    res = FALSE;
-
-beach:
-  {
-    gst_caps_unref (out_caps);
-    gst_caps_unref (pad_caps);
-    gst_caps_unref (peer_caps);
-    return res;
-  }
-}
-
-
 /* Converts the line_offset / field_parity byte of a VBI data unit. */
 static void
 gst_teletextdec_lofp_to_line (guint * field, guint * field_line,
@@ -1160,9 +1056,9 @@
 
 static gboolean
 gst_teletextdec_extract_data_units (GstTeletextDec * teletext,
-    GstTeletextFrame * f, guint8 * packet, guint * offset, gint size)
+    GstTeletextFrame * f, const guint8 * packet, guint * offset, gsize size)
 {
-  guint8 *data_unit;
+  const guint8 *data_unit;
   guint i;
 
   while (*offset < size) {
@@ -1243,3 +1139,18 @@
   }
   return VBI_SUCCESS;
 }
+
+static gboolean
+teletext_init (GstPlugin * teletext)
+{
+  GST_DEBUG_CATEGORY_INIT (gst_teletextdec_debug, "teletext", 0,
+      "Teletext decoder");
+  return gst_element_register (teletext, "teletextdec", GST_RANK_NONE,
+      GST_TYPE_TELETEXTDEC);
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+    GST_VERSION_MINOR,
+    teletext,
+    "Teletext plugin",
+    teletext_init, VERSION, "LGPL", "GStreamer", "http://gstreamer.net/")
diff --git a/ext/teletextdec/gstteletextdec.h b/ext/teletextdec/gstteletextdec.h
index 460793d..7c544ba 100644
--- a/ext/teletextdec/gstteletextdec.h
+++ b/ext/teletextdec/gstteletextdec.h
@@ -41,16 +41,8 @@
 typedef struct _GstTeletextFrame GstTeletextFrame;
 typedef enum _GstTeletextOutputFormat GstTeletextOutputFormat;
 
-enum _GstTeletextOutputFormat
-{
-  GST_TELETEXTDEC_OUTPUT_FORMAT_RGBA,
-  GST_TELETEXTDEC_OUTPUT_FORMAT_TEXT,
-  GST_TELETEXTDEC_OUTPUT_FORMAT_HTML,
-  GST_TELETEXTDEC_OUTPUT_FORMAT_PANGO
-};
-
-typedef void (*GstTeletextProcessBufferFunc) (GstTeletextDec *
-    teletext, GstBuffer * buf);
+typedef GstFlowReturn (*GstTeletextExportFunc) (GstTeletextDec * teletext,
+    vbi_page * page, GstBuffer ** buf);
 
 struct _GstTeletextDec
 {
@@ -58,6 +50,7 @@
 
   GstPad *sinkpad;
   GstPad *srcpad;
+  GstEvent *segment;
 
   GstClockTime in_timestamp;
   GstClockTime in_duration;
@@ -71,17 +64,22 @@
   gchar *subtitles_template;
   gchar *font_description;
 
-  vbi_dvb_demux *demux;
   vbi_decoder *decoder;
-  vbi_export *exporter;
+
   GQueue *queue;
-  GMutex *queue_lock;
+  GMutex queue_lock;
 
   GstTeletextFrame *frame;
   float last_ts;
-  GstTeletextOutputFormat output_format;
 
-  GstTeletextProcessBufferFunc process_buf_func;
+  GstTeletextExportFunc export_func;
+
+  /* negotiated size of the output image in RGBA mode. */
+  guint width;
+  guint height;
+
+  /* buffer pool received from the peer pad - used in RGBA output only. */
+  GstBufferPool *buf_pool;
 };
 
 struct _GstTeletextFrame
diff --git a/ext/teletextdec/teletext.c b/ext/teletextdec/teletext.c
deleted file mode 100644
index 5d3f13e..0000000
--- a/ext/teletextdec/teletext.c
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * GStreamer
- * Copyright (C) 2009 Sebastian Pölsterl <sebp@k-d-w.org>
- *
- * This library is free software; you can redistribute it and/or
- * mod1ify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor,
- * Boston, MA  02110-1301  USA
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <gst/gst.h>
-#include "gstteletextdec.h"
-
-/* entry point to initialize the plug-in
- * initialize the plug-in itself
- * register the element factories and other features
- */
-static gboolean
-teletext_init (GstPlugin * teletext)
-{
-  return gst_element_register (teletext, "teletextdec", GST_RANK_NONE,
-      GST_TYPE_TELETEXTDEC);
-}
-
-GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
-    GST_VERSION_MINOR,
-    teletext,
-    "Teletext plugin",
-    teletext_init, VERSION, "LGPL", "GStreamer", "http://gstreamer.net/")
diff --git a/ext/timidity/Makefile.in b/ext/timidity/Makefile.in
index bd67165..4c4c8bc 100644
--- a/ext/timidity/Makefile.in
+++ b/ext/timidity/Makefile.in
@@ -293,6 +293,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -330,6 +332,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -357,6 +361,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -375,6 +381,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -385,6 +393,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -410,6 +420,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -435,6 +447,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -566,6 +580,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -623,8 +639,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -694,6 +714,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/timidity/gsttimidity.c b/ext/timidity/gsttimidity.c
index 0867795..418a5fe 100644
--- a/ext/timidity/gsttimidity.c
+++ b/ext/timidity/gsttimidity.c
@@ -588,8 +588,7 @@
       goto paused;
     }
 
-    if (timidity->mididata)
-      g_free (timidity->mididata);
+    g_free (timidity->mididata);
 
     timidity->mididata = g_malloc (timidity->mididata_size);
     timidity->mididata_offset = 0;
diff --git a/ext/voaacenc/Makefile.in b/ext/voaacenc/Makefile.in
index 259775a..47a57c5 100644
--- a/ext/voaacenc/Makefile.in
+++ b/ext/voaacenc/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/voamrwbenc/Makefile.in b/ext/voamrwbenc/Makefile.in
index 62c4b4e..553b2d4 100644
--- a/ext/voamrwbenc/Makefile.in
+++ b/ext/voamrwbenc/Makefile.in
@@ -277,6 +277,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -314,6 +316,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -341,6 +345,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -359,6 +365,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -369,6 +377,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -394,6 +404,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -419,6 +431,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -550,6 +564,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -607,8 +623,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -678,6 +698,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/wayland/Makefile.am b/ext/wayland/Makefile.am
index e12d99a..c742bfc 100644
--- a/ext/wayland/Makefile.am
+++ b/ext/wayland/Makefile.am
@@ -14,6 +14,7 @@
 libgstwaylandsink_la_LIBADD = \
 	$(GST_PLUGINS_BASE_LIBS) \
 	-lgstvideo-$(GST_API_VERSION) \
+	-lgstallocators-$(GST_API_VERSION) \
 	$(WAYLAND_LIBS) \
 	$(top_builddir)/gst-libs/gst/wayland/libgstwayland-$(GST_API_VERSION).la
 libgstwaylandsink_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
diff --git a/ext/wayland/Makefile.in b/ext/wayland/Makefile.in
index 55e3762..2cad82a 100644
--- a/ext/wayland/Makefile.in
+++ b/ext/wayland/Makefile.in
@@ -282,6 +282,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -319,6 +321,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -346,6 +350,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -364,6 +370,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -374,6 +382,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -399,6 +409,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -424,6 +436,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -555,6 +569,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -612,8 +628,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -683,6 +703,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -785,6 +806,7 @@
 libgstwaylandsink_la_LIBADD = \
 	$(GST_PLUGINS_BASE_LIBS) \
 	-lgstvideo-$(GST_API_VERSION) \
+	-lgstallocators-$(GST_API_VERSION) \
 	$(WAYLAND_LIBS) \
 	$(top_builddir)/gst-libs/gst/wayland/libgstwayland-$(GST_API_VERSION).la
 
diff --git a/ext/wayland/gstwaylandsink.c b/ext/wayland/gstwaylandsink.c
index 7cc4bba..f4f34a8 100644
--- a/ext/wayland/gstwaylandsink.c
+++ b/ext/wayland/gstwaylandsink.c
@@ -32,7 +32,7 @@
  * <refsect2>
  * <title>Example pipelines</title>
  * |[
- * gst-launch -v videotestsrc ! waylandsink
+ * gst-launch-1.0 -v videotestsrc ! waylandsink
  * ]| test the video rendering in wayland
  * </refsect2>
  */
@@ -219,8 +219,7 @@
   if (sink->pool)
     gst_object_unref (sink->pool);
 
-  if (sink->display_name)
-    g_free (sink->display_name);
+  g_free (sink->display_name);
 
   g_mutex_clear (&sink->display_lock);
   g_mutex_clear (&sink->render_lock);
@@ -364,10 +363,13 @@
   if (gst_context_has_context_type (context,
           GST_WAYLAND_DISPLAY_HANDLE_CONTEXT_TYPE)) {
     g_mutex_lock (&sink->display_lock);
-    if (G_LIKELY (!sink->display))
+    if (G_LIKELY (!sink->display)) {
       gst_wayland_sink_set_display_from_context (sink, context);
-    else
+    } else {
       GST_WARNING_OBJECT (element, "changing display handle is not supported");
+      g_mutex_unlock (&sink->display_lock);
+      return;
+    }
     g_mutex_unlock (&sink->display_lock);
   }
 
@@ -397,7 +399,7 @@
     g_value_init (&list, GST_TYPE_LIST);
     g_value_init (&value, G_TYPE_STRING);
 
-    formats = sink->display->formats;
+    formats = sink->display->shm_formats;
     for (i = 0; i < formats->len; i++) {
       fmt = g_array_index (formats, uint32_t, i);
       g_value_set_string (&value, gst_wl_shm_format_to_string (fmt));
@@ -448,7 +450,7 @@
     goto invalid_format;
 
   /* verify we support the requested format */
-  formats = sink->display->formats;
+  formats = sink->display->shm_formats;
   for (i = 0; i < formats->len; i++) {
     if (g_array_index (formats, uint32_t, i) == format)
       break;
@@ -646,7 +648,7 @@
 
       /* the first time we acquire a buffer,
        * we need to attach a wl_buffer on it */
-      wlbuffer = gst_buffer_get_wl_buffer (buffer);
+      wlbuffer = gst_buffer_get_wl_buffer (to_render);
       if (G_UNLIKELY (!wlbuffer)) {
         mem = gst_buffer_peek_memory (to_render, 0);
         wbuf = gst_wl_shm_memory_construct_wl_buffer (mem, sink->display,
@@ -654,7 +656,7 @@
         if (G_UNLIKELY (!wbuf))
           goto no_wl_buffer;
 
-        gst_buffer_add_wl_buffer (buffer, wbuf, sink->display);
+        gst_buffer_add_wl_buffer (to_render, wbuf, sink->display);
       }
 
       gst_buffer_map (buffer, &src, GST_MAP_READ);
@@ -724,6 +726,11 @@
 
   g_return_if_fail (sink != NULL);
 
+  if (sink->window != NULL) {
+    GST_WARNING_OBJECT (sink, "changing window handle is not supported");
+    return;
+  }
+
   g_mutex_lock (&sink->render_lock);
 
   GST_DEBUG_OBJECT (sink, "Setting window handle %" GST_PTR_FORMAT,
diff --git a/ext/wayland/wldisplay.c b/ext/wayland/wldisplay.c
index 8c5eeaf..616ded3 100644
--- a/ext/wayland/wldisplay.c
+++ b/ext/wayland/wldisplay.c
@@ -44,7 +44,7 @@
 static void
 gst_wl_display_init (GstWlDisplay * self)
 {
-  self->formats = g_array_new (FALSE, FALSE, sizeof (uint32_t));
+  self->shm_formats = g_array_new (FALSE, FALSE, sizeof (uint32_t));
   self->wl_fd_poll = gst_poll_new (TRUE);
   self->buffers = g_hash_table_new (g_direct_hash, g_direct_equal);
   g_mutex_init (&self->buffers_mutex);
@@ -69,7 +69,7 @@
       (GHFunc) gst_wl_buffer_force_release_and_unref, NULL);
   g_hash_table_remove_all (self->buffers);
 
-  g_array_unref (self->formats);
+  g_array_unref (self->shm_formats);
   gst_poll_free (self->wl_fd_poll);
   g_hash_table_unref (self->buffers);
   g_mutex_clear (&self->buffers_mutex);
@@ -136,7 +136,7 @@
 {
   GstWlDisplay *self = data;
 
-  g_array_append_val (self->formats, format);
+  g_array_append_val (self->shm_formats, format);
 }
 
 static const struct wl_shm_listener shm_listener = {
diff --git a/ext/wayland/wldisplay.h b/ext/wayland/wldisplay.h
index 5505d60..e9df749 100644
--- a/ext/wayland/wldisplay.h
+++ b/ext/wayland/wldisplay.h
@@ -52,7 +52,7 @@
   struct wl_shell *shell;
   struct wl_shm *shm;
   struct wl_scaler *scaler;
-  GArray *formats;
+  GArray *shm_formats;
 
   /* private */
   gboolean own_display;
diff --git a/ext/wayland/wlshmallocator.c b/ext/wayland/wlshmallocator.c
index 6d82b23..94fbbf1 100644
--- a/ext/wayland/wlshmallocator.c
+++ b/ext/wayland/wlshmallocator.c
@@ -34,7 +34,7 @@
 GST_DEBUG_CATEGORY_EXTERN (gstwayland_debug);
 #define GST_CAT_DEFAULT gstwayland_debug
 
-G_DEFINE_TYPE (GstWlShmAllocator, gst_wl_shm_allocator, GST_TYPE_ALLOCATOR);
+G_DEFINE_TYPE (GstWlShmAllocator, gst_wl_shm_allocator, GST_TYPE_FD_ALLOCATOR);
 
 static GstMemory *
 gst_wl_shm_allocator_alloc (GstAllocator * allocator, gsize size,
@@ -44,8 +44,8 @@
   char filename[1024];
   static int init = 0;
   int fd;
-  gpointer data;
-  GstWlShmMemory *mem;
+  GstMemory *mem;
+  GstMapInfo info;
 
   /* TODO: make use of the allocation params, if necessary */
 
@@ -65,45 +65,28 @@
     return NULL;
   }
 
-  data = mmap (NULL, size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
-  if (data == MAP_FAILED) {
-    GST_ERROR_OBJECT (self, "mmap failed: %s", strerror (errno));
+  mem = gst_fd_allocator_alloc (allocator, fd, size,
+      GST_FD_MEMORY_FLAG_KEEP_MAPPED);
+  if (G_UNLIKELY (!mem)) {
+    GST_ERROR_OBJECT (self, "GstFdMemory allocation failed");
     close (fd);
     return NULL;
   }
 
+  /* we need to map the memory in order to unlink the file without losing it */
+  if (!gst_memory_map (mem, &info, GST_MAP_READWRITE)) {
+    GST_ERROR_OBJECT (self, "GstFdMemory map failed");
+    close (fd);
+    return NULL;
+  }
+
+  /* unmap will not really munmap(), we just
+   * need it to release the miniobject lock */
+  gst_memory_unmap (mem, &info);
+
   unlink (filename);
 
-  mem = g_slice_new0 (GstWlShmMemory);
-  gst_memory_init ((GstMemory *) mem, GST_MEMORY_FLAG_NO_SHARE, allocator, NULL,
-      size, 0, 0, size);
-  mem->data = data;
-  mem->fd = fd;
-
-  return (GstMemory *) mem;
-}
-
-static void
-gst_wl_shm_allocator_free (GstAllocator * allocator, GstMemory * memory)
-{
-  GstWlShmMemory *shm_mem = (GstWlShmMemory *) memory;
-
-  if (shm_mem->fd != -1)
-    close (shm_mem->fd);
-  munmap (shm_mem->data, memory->maxsize);
-
-  g_slice_free (GstWlShmMemory, shm_mem);
-}
-
-static gpointer
-gst_wl_shm_mem_map (GstMemory * mem, gsize maxsize, GstMapFlags flags)
-{
-  return ((GstWlShmMemory *) mem)->data;
-}
-
-static void
-gst_wl_shm_mem_unmap (GstMemory * mem)
-{
+  return mem;
 }
 
 static void
@@ -112,17 +95,16 @@
   GstAllocatorClass *alloc_class = (GstAllocatorClass *) klass;
 
   alloc_class->alloc = GST_DEBUG_FUNCPTR (gst_wl_shm_allocator_alloc);
-  alloc_class->free = GST_DEBUG_FUNCPTR (gst_wl_shm_allocator_free);
 }
 
 static void
 gst_wl_shm_allocator_init (GstWlShmAllocator * self)
 {
-  self->parent_instance.mem_type = GST_ALLOCATOR_WL_SHM;
-  self->parent_instance.mem_map = gst_wl_shm_mem_map;
-  self->parent_instance.mem_unmap = gst_wl_shm_mem_unmap;
+  GstAllocator *alloc = GST_ALLOCATOR_CAST (self);
 
-  GST_OBJECT_FLAG_SET (self, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC);
+  alloc->mem_type = GST_ALLOCATOR_WL_SHM;
+
+  GST_OBJECT_FLAG_UNSET (self, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC);
 }
 
 void
@@ -148,7 +130,6 @@
 gst_wl_shm_memory_construct_wl_buffer (GstMemory * mem, GstWlDisplay * display,
     const GstVideoInfo * info)
 {
-  GstWlShmMemory *shm_mem = (GstWlShmMemory *) mem;
   gint width, height, stride;
   gsize size;
   enum wl_shm_format format;
@@ -163,18 +144,15 @@
 
   g_return_val_if_fail (gst_is_wl_shm_memory (mem), NULL);
   g_return_val_if_fail (size <= mem->size, NULL);
-  g_return_val_if_fail (shm_mem->fd != -1, NULL);
 
   GST_DEBUG_OBJECT (mem->allocator, "Creating wl_buffer of size %"
       G_GSSIZE_FORMAT " (%d x %d, stride %d), format %s", size, width, height,
       stride, gst_wl_shm_format_to_string (format));
 
-  wl_pool = wl_shm_create_pool (display->shm, shm_mem->fd, mem->size);
+  wl_pool = wl_shm_create_pool (display->shm, gst_fd_memory_get_fd (mem),
+      mem->size);
   wbuffer = wl_shm_pool_create_buffer (wl_pool, 0, width, height, stride,
       format);
-
-  close (shm_mem->fd);
-  shm_mem->fd = -1;
   wl_shm_pool_destroy (wl_pool);
 
   return wbuffer;
diff --git a/ext/wayland/wlshmallocator.h b/ext/wayland/wlshmallocator.h
index f12882c..07ae17f 100644
--- a/ext/wayland/wlshmallocator.h
+++ b/ext/wayland/wlshmallocator.h
@@ -24,6 +24,7 @@
 #define __GST_WL_SHM_ALLOCATOR_H__
 
 #include <gst/video/video.h>
+#include <gst/allocators/allocators.h>
 #include <wayland-client-protocol.h>
 #include "wldisplay.h"
 
@@ -38,26 +39,17 @@
 
 #define GST_ALLOCATOR_WL_SHM "wl_shm"
 
-typedef struct _GstWlShmMemory GstWlShmMemory;
 typedef struct _GstWlShmAllocator GstWlShmAllocator;
 typedef struct _GstWlShmAllocatorClass GstWlShmAllocatorClass;
 
-struct _GstWlShmMemory
-{
-  GstMemory parent;
-
-  gpointer data;
-  gint fd;
-};
-
 struct _GstWlShmAllocator
 {
-  GstAllocator parent_instance;
+  GstFdAllocator parent_instance;
 };
 
 struct _GstWlShmAllocatorClass
 {
-  GstAllocatorClass parent_class;
+  GstFdAllocatorClass parent_class;
 };
 
 GType gst_wl_shm_allocator_get_type (void);
diff --git a/ext/wayland/wlwindow.c b/ext/wayland/wlwindow.c
index a964335..79000ae 100644
--- a/ext/wayland/wlwindow.c
+++ b/ext/wayland/wlwindow.c
@@ -238,12 +238,15 @@
 gst_wl_window_resize_video_surface (GstWlWindow * window, gboolean commit)
 {
   GstVideoRectangle src = { 0, };
+  GstVideoRectangle dst = { 0, };
   GstVideoRectangle res;
 
   /* center the video_subsurface inside area_subsurface */
   src.w = window->video_width;
   src.h = window->video_height;
-  gst_video_sink_center_rect (src, window->render_rectangle, &res, TRUE);
+  dst.w = window->render_rectangle.w;
+  dst.h = window->render_rectangle.h;
+  gst_video_sink_center_rect (src, dst, &res, TRUE);
 
   wl_subsurface_set_position (window->video_subsurface, res.x, res.y);
   wl_viewport_set_destination (window->video_viewport, res.w, res.h);
diff --git a/ext/webp/Makefile.in b/ext/webp/Makefile.in
index 259988d..4d27523 100644
--- a/ext/webp/Makefile.in
+++ b/ext/webp/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/x265/Makefile.in b/ext/x265/Makefile.in
index 3bffdd3..ddf5c1b 100644
--- a/ext/x265/Makefile.in
+++ b/ext/x265/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/xvid/Makefile.in b/ext/xvid/Makefile.in
index 011619e..1c6f118 100644
--- a/ext/xvid/Makefile.in
+++ b/ext/xvid/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/zbar/Makefile.in b/ext/zbar/Makefile.in
index 61081f8..591c6e3 100644
--- a/ext/zbar/Makefile.in
+++ b/ext/zbar/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/ext/zbar/gstzbar.c b/ext/zbar/gstzbar.c
index 2bb0a7d..62fb106 100644
--- a/ext/zbar/gstzbar.c
+++ b/ext/zbar/gstzbar.c
@@ -71,10 +71,10 @@
  * <refsect2>
  * <title>Example launch lines</title>
  * |[
- * gst-launch -m v4l2src ! videoconvert ! zbar ! videoconvert ! xvimagesink
+ * gst-launch-1.0 -m v4l2src ! videoconvert ! zbar ! videoconvert ! xvimagesink
  * ]| This pipeline will detect barcodes and send them as messages.
  * |[
- * gst-launch -m v4l2src ! tee name=t ! queue ! videoconvert ! zbar ! fakesink t. ! queue ! xvimagesink
+ * gst-launch-1.0 -m v4l2src ! tee name=t ! queue ! videoconvert ! zbar ! fakesink t. ! queue ! xvimagesink
  * ]| Same as above, but running the filter on a branch to keep the display in color
  * </refsect2>
  */
diff --git a/gst-libs/Makefile.in b/gst-libs/Makefile.in
index c5e573b..032e32e 100644
--- a/gst-libs/Makefile.in
+++ b/gst-libs/Makefile.in
@@ -248,6 +248,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -285,6 +287,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -312,6 +316,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -330,6 +336,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -340,6 +348,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -365,6 +375,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -390,6 +402,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -521,6 +535,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -578,8 +594,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -649,6 +669,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst-libs/gst/Makefile.am b/gst-libs/gst/Makefile.am
index a7380f8..732978d 100644
--- a/gst-libs/gst/Makefile.am
+++ b/gst-libs/gst/Makefile.am
@@ -11,11 +11,11 @@
 endif
 
 SUBDIRS = uridownloader adaptivedemux interfaces basecamerabinsrc codecparsers \
-	 insertbin mpegts base video $(GL_DIR) $(WAYLAND_DIR)
+	 insertbin mpegts base video player $(GL_DIR) $(WAYLAND_DIR)
 
 noinst_HEADERS = gst-i18n-plugin.h gettext.h glib-compat-private.h
 DIST_SUBDIRS = uridownloader adaptivedemux interfaces gl basecamerabinsrc \
-	codecparsers insertbin mpegts wayland base video
+	codecparsers insertbin mpegts wayland base video player
 
 #dependencies
 video: base
@@ -24,7 +24,7 @@
 
 INDEPENDENT_SUBDIRS = \
 	interfaces basecamerabinsrc codecparsers insertbin uridownloader \
-	mpegts base $(GL_DIR) $(WAYLAND_DIR)
+	mpegts base player $(GL_DIR) $(WAYLAND_DIR)
 
 .PHONY: independent-subdirs $(INDEPENDENT_SUBDIRS)
 
diff --git a/gst-libs/gst/Makefile.in b/gst-libs/gst/Makefile.in
index 1d8a7ae..b0f15e3 100644
--- a/gst-libs/gst/Makefile.in
+++ b/gst-libs/gst/Makefile.in
@@ -250,6 +250,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -287,6 +289,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -314,6 +318,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -332,6 +338,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -342,6 +350,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -367,6 +377,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -392,6 +404,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -523,6 +537,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -580,8 +596,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -651,6 +671,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -741,15 +762,15 @@
 @USE_OPENGL_TRUE@GL_DIR = gl
 @USE_WAYLAND_TRUE@WAYLAND_DIR = wayland
 SUBDIRS = uridownloader adaptivedemux interfaces basecamerabinsrc codecparsers \
-	 insertbin mpegts base video $(GL_DIR) $(WAYLAND_DIR)
+	 insertbin mpegts base video player $(GL_DIR) $(WAYLAND_DIR)
 
 noinst_HEADERS = gst-i18n-plugin.h gettext.h glib-compat-private.h
 DIST_SUBDIRS = uridownloader adaptivedemux interfaces gl basecamerabinsrc \
-	codecparsers insertbin mpegts wayland base video
+	codecparsers insertbin mpegts wayland base video player
 
 INDEPENDENT_SUBDIRS = \
 	interfaces basecamerabinsrc codecparsers insertbin uridownloader \
-	mpegts base $(GL_DIR) $(WAYLAND_DIR)
+	mpegts base player $(GL_DIR) $(WAYLAND_DIR)
 
 all: all-recursive
 
diff --git a/gst-libs/gst/adaptivedemux/Makefile.in b/gst-libs/gst/adaptivedemux/Makefile.in
index 001d8b5..4007d4a 100644
--- a/gst-libs/gst/adaptivedemux/Makefile.in
+++ b/gst-libs/gst/adaptivedemux/Makefile.in
@@ -278,6 +278,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -315,6 +317,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -342,6 +346,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -360,6 +366,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -370,6 +378,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -395,6 +405,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -420,6 +432,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -551,6 +565,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -608,8 +624,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -679,6 +699,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c
index 9f74c65..cb5e4a1 100644
--- a/gst-libs/gst/adaptivedemux/gstadaptivedemux.c
+++ b/gst-libs/gst/adaptivedemux/gstadaptivedemux.c
@@ -68,6 +68,53 @@
  * information.
  */
 
+/*
+MT safety.
+The following rules were observed while implementing MT safety in adaptive demux:
+1. If a variable is accessed from multiple threads and at least one thread
+writes to it, then all the accesses needs to be done from inside a critical section.
+2. If thread A wants to join thread B then at the moment it calls gst_task_join
+it must not hold any mutexes that thread B might take.
+
+Adaptive demux API can be called from several threads. More, adaptive demux
+starts some threads to monitor the download of fragments. In order to protect
+accesses to shared variables (demux and streams) all the API functions that
+can be run in different threads will need to get a mutex (manifest_lock)
+when they start and release it when they end. Because some of those functions
+can indirectly call other API functions (eg they can generate events or messages
+that are processed in the same thread) the manifest_lock must be recursive.
+
+The manifest_lock will serialize the public API making access to shared
+variables safe. But some of these functions will try at some moment to join
+threads created by adaptive demux, or to change the state of src elements
+(which will block trying to join the src element streaming thread). Because
+of rule 2, those functions will need to release the manifest_lock during the
+call of gst_task_join. During this time they can be interrupted by other API calls.
+For example, during the precessing of a seek event, gst_adaptive_demux_stop_tasks
+is called and this will join all threads. In order to prevent interruptions
+during such period, all the API functions will also use a second lock: api_lock.
+This will be taken at the beginning of the function and released at the end,
+but this time this lock will not be temporarily released during join.
+This lock will be used only by API calls (not by gst_adaptive_demux_stream_download_loop
+or gst_adaptive_demux_updates_loop or _src_chain or _src_event) so it is safe
+to hold it while joining the threads or changing the src element state. The
+api_lock will serialise all external requests to adaptive demux. In order to
+avoid deadlocks, if a function needs to acquire both manifest and api locks,
+the api_lock will be taken first and the manifest_lock second.
+
+By using the api_lock a thread is protected against other API calls. But when
+temporarily dropping the manifest_lock, it will be vulnerable to changes from
+threads that use only the manifest_lock and not the api_lock. These threads run
+one of the following functions: gst_adaptive_demux_stream_download_loop,
+gst_adaptive_demux_updates_loop, _src_chain, _src_event. In order to guarantee
+that all operations during an API call are not impacted by other writes, the
+above mentioned functions must check a cancelled flag every time they reacquire
+the manifest_lock. If the flag is set, they must exit immediately, without
+performing any changes on the shared data. In this way, an API call (eg seek
+request) can set the cancel flag before releasing the manifest_lock and be sure
+that the demux object and its streams are not changed by anybody else.
+*/
+
 #ifdef HAVE_CONFIG_H
 #include "config.h"
 #endif
@@ -85,14 +132,21 @@
 
 #define MAX_DOWNLOAD_ERROR_COUNT 3
 #define DEFAULT_FAILED_COUNT 3
-#define DEFAULT_LOOKBACK_FRAGMENTS 3
 #define DEFAULT_CONNECTION_SPEED 0
 #define DEFAULT_BITRATE_LIMIT 0.8
+#define SRC_QUEUE_MAX_BYTES 20 * 1024 * 1024    /* For safety. Large enough to hold a segment. */
+
+#define GST_MANIFEST_GET_LOCK(d) (&(GST_ADAPTIVE_DEMUX_CAST(d)->priv->manifest_lock))
+#define GST_MANIFEST_LOCK(d) g_rec_mutex_lock (GST_MANIFEST_GET_LOCK (d));
+#define GST_MANIFEST_UNLOCK(d) g_rec_mutex_unlock (GST_MANIFEST_GET_LOCK (d));
+
+#define GST_API_GET_LOCK(d) (&(GST_ADAPTIVE_DEMUX_CAST(d)->priv->api_lock))
+#define GST_API_LOCK(d)   g_mutex_lock (GST_API_GET_LOCK (d));
+#define GST_API_UNLOCK(d) g_mutex_unlock (GST_API_GET_LOCK (d));
 
 enum
 {
   PROP_0,
-  PROP_LOOKBACK_FRAGMENTS,
   PROP_CONNECTION_SPEED,
   PROP_BITRATE_LIMIT,
   PROP_LAST
@@ -105,24 +159,35 @@
 
 struct _GstAdaptiveDemuxPrivate
 {
-  GstAdapter *input_adapter;
-  gboolean have_manifest;
+  GstAdapter *input_adapter;    /* protected by manifest_lock */
+  gboolean have_manifest;       /* protected by manifest_lock */
 
-  GstUriDownloader *downloader;
+  GList *old_streams;           /* protected by manifest_lock */
 
-  GList *old_streams;
-
-  GstTask *updates_task;
+  GstTask *updates_task;        /* MT safe */
   GRecMutex updates_lock;
   GMutex updates_timed_lock;
-  GCond updates_timed_cond;
-  gboolean stop_updates_task;
+  GCond updates_timed_cond;     /* protected by updates_timed_lock */
+  gboolean stop_updates_task;   /* protected by updates_timed_lock */
+
+  /* used only from updates_task, no need to protect it */
   gint update_failed_count;
 
-  gint64 next_update;
+  guint32 segment_seqnum;       /* protected by manifest_lock */
 
-  gboolean exposing;
-  guint32 segment_seqnum;
+  /* main lock used to protect adaptive demux and all its streams.
+   * It serializes the adaptive demux public API.
+   */
+  GRecMutex manifest_lock;
+
+  /* condition to wait for manifest updates on a live stream.
+   * In order to signal the manifest_cond, the caller needs to hold both
+   * manifest_lock and manifest_update_lock (taken in this order)
+   */
+  GCond manifest_cond;
+  GMutex manifest_update_lock;
+
+  GMutex api_lock;
 };
 
 static GstBinClass *parent_class = NULL;
@@ -177,8 +242,6 @@
 static GstFlowReturn
 gst_adaptive_demux_stream_push_event (GstAdaptiveDemuxStream * stream,
     GstEvent * event);
-static void gst_adaptive_demux_stream_download_wait (GstAdaptiveDemuxStream *
-    stream, GstClockTime time_diff);
 
 static void gst_adaptive_demux_start_tasks (GstAdaptiveDemux * demux);
 static void gst_adaptive_demux_stop_tasks (GstAdaptiveDemux * demux);
@@ -193,6 +256,9 @@
 static GstFlowReturn
 gst_adaptive_demux_stream_finish_fragment_default (GstAdaptiveDemux * demux,
     GstAdaptiveDemuxStream * stream);
+static GstFlowReturn
+gst_adaptive_demux_stream_advance_fragment_unlocked (GstAdaptiveDemux * demux,
+    GstAdaptiveDemuxStream * stream, GstClockTime duration);
 
 
 /* we can't use G_DEFINE_ABSTRACT_TYPE because we need the klass in the _init
@@ -229,10 +295,10 @@
 {
   GstAdaptiveDemux *demux = GST_ADAPTIVE_DEMUX (object);
 
+  GST_API_LOCK (demux);
+  GST_MANIFEST_LOCK (demux);
+
   switch (prop_id) {
-    case PROP_LOOKBACK_FRAGMENTS:
-      demux->num_lookback_fragments = g_value_get_uint (value);
-      break;
     case PROP_CONNECTION_SPEED:
       demux->connection_speed = g_value_get_uint (value) * 1000;
       GST_DEBUG_OBJECT (demux, "Connection speed set to %u",
@@ -245,6 +311,9 @@
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
   }
+
+  GST_MANIFEST_UNLOCK (demux);
+  GST_API_UNLOCK (demux);
 }
 
 static void
@@ -253,10 +322,9 @@
 {
   GstAdaptiveDemux *demux = GST_ADAPTIVE_DEMUX (object);
 
+  GST_MANIFEST_LOCK (demux);
+
   switch (prop_id) {
-    case PROP_LOOKBACK_FRAGMENTS:
-      g_value_set_uint (value, demux->num_lookback_fragments);
-      break;
     case PROP_CONNECTION_SPEED:
       g_value_set_uint (value, demux->connection_speed / 1000);
       break;
@@ -267,6 +335,8 @@
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
   }
+
+  GST_MANIFEST_UNLOCK (demux);
 }
 
 static void
@@ -290,13 +360,6 @@
   gobject_class->get_property = gst_adaptive_demux_get_property;
   gobject_class->finalize = gst_adaptive_demux_finalize;
 
-  g_object_class_install_property (gobject_class, PROP_LOOKBACK_FRAGMENTS,
-      g_param_spec_uint ("num-lookback-fragments",
-          "Number of fragments to look back",
-          "The number of fragments the demuxer will look back to calculate an average bitrate",
-          1, G_MAXUINT, DEFAULT_LOOKBACK_FRAGMENTS,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT_ONLY));
-
   g_object_class_install_property (gobject_class, PROP_CONNECTION_SPEED,
       g_param_spec_uint ("connection-speed", "Connection Speed",
           "Network connection speed in kbps (0 = calculate from downloaded"
@@ -325,7 +388,6 @@
     GstAdaptiveDemuxClass * klass)
 {
   GstPadTemplate *pad_template;
-  GstPad *pad;
 
   GST_DEBUG_OBJECT (demux, "gst_adaptive_demux_init");
 
@@ -348,21 +410,23 @@
   g_mutex_init (&demux->priv->updates_timed_lock);
   g_cond_init (&demux->priv->updates_timed_cond);
 
-  g_cond_init (&demux->manifest_cond);
-  g_mutex_init (&demux->manifest_lock);
+  g_cond_init (&demux->priv->manifest_cond);
+  g_mutex_init (&demux->priv->manifest_update_lock);
+
+  g_rec_mutex_init (&demux->priv->manifest_lock);
+  g_mutex_init (&demux->priv->api_lock);
 
   pad_template =
       gst_element_class_get_pad_template (GST_ELEMENT_CLASS (klass), "sink");
   g_return_if_fail (pad_template != NULL);
 
-  demux->sinkpad = pad = gst_pad_new_from_template (pad_template, "sink");
+  demux->sinkpad = gst_pad_new_from_template (pad_template, "sink");
   gst_pad_set_event_function (demux->sinkpad,
       GST_DEBUG_FUNCPTR (gst_adaptive_demux_sink_event));
   gst_pad_set_chain_function (demux->sinkpad,
       GST_DEBUG_FUNCPTR (gst_adaptive_demux_sink_chain));
 
   /* Properties */
-  demux->num_lookback_fragments = DEFAULT_LOOKBACK_FRAGMENTS;
   demux->bitrate_limit = DEFAULT_BITRATE_LIMIT;
   demux->connection_speed = DEFAULT_CONNECTION_SPEED;
 
@@ -382,10 +446,12 @@
 
   g_mutex_clear (&priv->updates_timed_lock);
   g_cond_clear (&priv->updates_timed_cond);
-  g_cond_clear (&demux->manifest_cond);
+  g_mutex_clear (&demux->priv->manifest_update_lock);
+  g_cond_clear (&demux->priv->manifest_cond);
   g_object_unref (priv->updates_task);
   g_rec_mutex_clear (&priv->updates_lock);
-  g_mutex_clear (&demux->manifest_lock);
+  g_rec_mutex_clear (&demux->priv->manifest_lock);
+  g_mutex_clear (&demux->priv->api_lock);
 
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
@@ -397,16 +463,26 @@
   GstAdaptiveDemux *demux = GST_ADAPTIVE_DEMUX_CAST (element);
   GstStateChangeReturn result = GST_STATE_CHANGE_FAILURE;
 
+  GST_API_LOCK (demux);
+
   switch (transition) {
     case GST_STATE_CHANGE_PAUSED_TO_READY:
+      GST_MANIFEST_LOCK (demux);
       gst_adaptive_demux_reset (demux);
+      GST_MANIFEST_UNLOCK (demux);
       break;
     default:
       break;
   }
 
+  /* this must be run without MANIFEST_LOCK taken.
+   * For PLAYING to PLAYING state changes, it will want to take a lock in
+   * src element and that lock is held while the streaming thread is running.
+   * The streaming thread will take the MANIFEST_LOCK, leading to a deadlock.
+   */
   result = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
 
+  GST_API_UNLOCK (demux);
   return result;
 }
 
@@ -416,11 +492,21 @@
 {
   GstAdaptiveDemux *demux = GST_ADAPTIVE_DEMUX_CAST (parent);
   GstAdaptiveDemuxClass *demux_class;
+  gboolean ret;
 
   switch (event->type) {
     case GST_EVENT_FLUSH_STOP:
+      GST_API_LOCK (demux);
+      GST_MANIFEST_LOCK (demux);
+
       gst_adaptive_demux_reset (demux);
-      break;
+
+      ret = gst_pad_event_default (pad, parent, event);
+
+      GST_MANIFEST_UNLOCK (demux);
+      GST_API_UNLOCK (demux);
+
+      return ret;
     case GST_EVENT_EOS:{
       GstQuery *query;
       gboolean query_res;
@@ -428,12 +514,21 @@
       gsize available;
       GstBuffer *manifest_buffer;
 
+      GST_API_LOCK (demux);
+      GST_MANIFEST_LOCK (demux);
+
       demux_class = GST_ADAPTIVE_DEMUX_GET_CLASS (demux);
+
       available = gst_adapter_available (demux->priv->input_adapter);
 
       if (available == 0) {
         GST_WARNING_OBJECT (demux, "Received EOS without a manifest.");
-        break;
+        ret = gst_pad_event_default (pad, parent, event);
+
+        GST_MANIFEST_UNLOCK (demux);
+        GST_API_UNLOCK (demux);
+
+        return ret;
       }
 
       GST_DEBUG_OBJECT (demux, "Got EOS on the sink pad: manifest fetched");
@@ -442,7 +537,6 @@
        * uris */
       query = gst_query_new_uri ();
       query_res = gst_pad_peer_query (pad, query);
-      GST_MANIFEST_LOCK (demux);
       if (query_res) {
         gchar *uri, *redirect_uri;
         gboolean permanent;
@@ -529,6 +623,7 @@
 
       }
       GST_MANIFEST_UNLOCK (demux);
+      GST_API_UNLOCK (demux);
 
       gst_event_unref (event);
       return ret;
@@ -549,19 +644,32 @@
     GstBuffer * buffer)
 {
   GstAdaptiveDemux *demux = GST_ADAPTIVE_DEMUX_CAST (parent);
+
+  GST_MANIFEST_LOCK (demux);
+
   gst_adapter_push (demux->priv->input_adapter, buffer);
 
   GST_INFO_OBJECT (demux, "Received manifest buffer, total size is %i bytes",
       (gint) gst_adapter_available (demux->priv->input_adapter));
 
+  GST_MANIFEST_UNLOCK (demux);
   return GST_FLOW_OK;
 }
 
+/* must be called with manifest_lock taken */
 static void
 gst_adaptive_demux_reset (GstAdaptiveDemux * demux)
 {
   GstAdaptiveDemuxClass *klass = GST_ADAPTIVE_DEMUX_GET_CLASS (demux);
   GList *iter;
+  GList *old_streams;
+  GstEvent *eos;
+
+  /* take ownership of old_streams before releasing the manifest_lock in
+   * gst_adaptive_demux_stop_tasks
+   */
+  old_streams = demux->priv->old_streams;
+  demux->priv->old_streams = NULL;
 
   gst_adaptive_demux_stop_tasks (demux);
   gst_uri_downloader_reset (demux->downloader);
@@ -569,19 +677,24 @@
   if (klass->reset)
     klass->reset (demux);
 
+  eos = gst_event_new_eos ();
   for (iter = demux->streams; iter; iter = g_list_next (iter)) {
     GstAdaptiveDemuxStream *stream = iter->data;
-    if (stream->pad)
+    if (stream->pad) {
+      gst_pad_push_event (stream->pad, gst_event_ref (eos));
+      gst_pad_set_active (stream->pad, FALSE);
+
       gst_element_remove_pad (GST_ELEMENT_CAST (demux), stream->pad);
+    }
     gst_adaptive_demux_stream_free (stream);
   }
+  gst_event_unref (eos);
   g_list_free (demux->streams);
   demux->streams = NULL;
 
-  if (demux->priv->old_streams) {
-    g_list_free_full (demux->priv->old_streams,
+  if (old_streams) {
+    g_list_free_full (old_streams,
         (GDestroyNotify) gst_adaptive_demux_stream_free);
-    demux->priv->old_streams = NULL;
   }
 
   g_free (demux->manifest_uri);
@@ -596,7 +709,6 @@
 
   demux->have_group_id = FALSE;
   demux->group_id = G_MAXUINT;
-  demux->priv->exposing = FALSE;
   demux->priv->segment_seqnum = gst_util_seqnum_next ();
 }
 
@@ -613,9 +725,12 @@
       gchar *debug = NULL;
       gchar *new_error = NULL;
 
+      GST_MANIFEST_LOCK (demux);
+
       for (iter = demux->streams; iter; iter = g_list_next (iter)) {
         stream = iter->data;
-        if (GST_OBJECT_CAST (stream->src) == GST_MESSAGE_SRC (msg)) {
+        if (gst_object_has_as_ancestor (GST_MESSAGE_SRC (msg),
+                GST_OBJECT_CAST (stream->src))) {
           gst_message_parse_error (msg, &err, &debug);
 
           GST_WARNING_OBJECT (GST_ADAPTIVE_DEMUX_STREAM_PAD (stream),
@@ -639,6 +754,8 @@
         }
       }
 
+      GST_MANIFEST_UNLOCK (demux);
+
       gst_message_unref (msg);
       msg = NULL;
     }
@@ -655,9 +772,14 @@
 gst_adaptive_demux_set_stream_struct_size (GstAdaptiveDemux * demux,
     gsize struct_size)
 {
+  GST_API_LOCK (demux);
+  GST_MANIFEST_LOCK (demux);
   demux->stream_struct_size = struct_size;
+  GST_MANIFEST_UNLOCK (demux);
+  GST_API_UNLOCK (demux);
 }
 
+/* must be called with manifest_lock taken */
 static gboolean
 gst_adaptive_demux_expose_stream (GstAdaptiveDemux * demux,
     GstAdaptiveDemuxStream * stream)
@@ -702,7 +824,6 @@
     stream->pending_caps = NULL;
   }
 
-  stream->download_finished = FALSE;
   stream->discont = FALSE;
 
   gst_object_ref (pad);
@@ -710,6 +831,7 @@
   return gst_element_add_pad (GST_ELEMENT_CAST (demux), pad);
 }
 
+/* must be called with manifest_lock taken */
 static GstClockTime
 gst_adaptive_demux_stream_get_presentation_offset (GstAdaptiveDemux * demux,
     GstAdaptiveDemuxStream * stream)
@@ -724,6 +846,7 @@
   return klass->get_presentation_offset (demux, stream);
 }
 
+/* must be called with manifest_lock taken */
 static GstClockTime
 gst_adaptive_demux_get_period_start_time (GstAdaptiveDemux * demux)
 {
@@ -737,6 +860,7 @@
   return klass->get_period_start_time (demux);
 }
 
+/* must be called with manifest_lock taken */
 static gboolean
 gst_adaptive_demux_expose_streams (GstAdaptiveDemux * demux,
     gboolean first_and_live)
@@ -747,7 +871,6 @@
 
   g_return_val_if_fail (demux->next_streams != NULL, FALSE);
 
-  demux->priv->exposing = TRUE;
   old_streams = demux->streams;
   demux->streams = demux->next_streams;
   demux->next_streams = NULL;
@@ -863,11 +986,14 @@
   }
 
   gst_element_no_more_pads (GST_ELEMENT_CAST (demux));
-  demux->priv->exposing = FALSE;
 
   if (old_streams) {
     GstEvent *eos = gst_event_new_eos ();
 
+    /* before we put streams in the demux->priv->old_streams list,
+     * we ask the download task to stop. In this way, it will no longer be
+     * allowed to change the demux object.
+     */
     for (iter = old_streams; iter; iter = g_list_next (iter)) {
       GstAdaptiveDemuxStream *stream = iter->data;
 
@@ -875,20 +1001,37 @@
       gst_pad_push_event (stream->pad, gst_event_ref (eos));
       gst_pad_set_active (stream->pad, FALSE);
       gst_element_remove_pad (GST_ELEMENT (demux), stream->pad);
+
+      /* ask the download task to stop.
+       * We will not join it now, because our thread can be one of these tasks.
+       * We will do the joining later, from another stream download task or
+       * from gst_adaptive_demux_stop_tasks.
+       * We also cannot change the state of the stream->src element, because
+       * that will wait on the streaming thread (which could be this thread)
+       * to stop first.
+       * Because we sent an EOS to the downstream element, the stream->src
+       * element should detect this in its streaming task and stop.
+       * Even if it doesn't do that, we will change its state later in
+       * gst_adaptive_demux_stop_tasks.
+       */
+      gst_task_stop (stream->download_task);
+      g_mutex_lock (&stream->fragment_download_lock);
+      stream->cancelled = TRUE;
+      g_cond_signal (&stream->fragment_download_cond);
+      g_mutex_unlock (&stream->fragment_download_lock);
     }
     gst_event_unref (eos);
 
     /* The list should be freed from another thread as we can't properly
      * cleanup a GstTask from itself */
-    GST_OBJECT_LOCK (demux);
     demux->priv->old_streams =
         g_list_concat (demux->priv->old_streams, old_streams);
-    GST_OBJECT_UNLOCK (demux);
   }
 
   return TRUE;
 }
 
+/* must be called with manifest_lock taken */
 GstAdaptiveDemuxStream *
 gst_adaptive_demux_stream_new (GstAdaptiveDemux * demux, GstPad * pad)
 {
@@ -905,8 +1048,6 @@
 
   stream->pad = pad;
   stream->demux = demux;
-  stream->fragment_bitrates =
-      g_malloc0 (sizeof (guint64) * demux->num_lookback_fragments);
   gst_pad_set_element_private (pad, stream);
 
   gst_pad_set_query_function (pad,
@@ -924,6 +1065,12 @@
   return stream;
 }
 
+/* must be called with manifest_lock taken.
+ * It will temporarily drop the manifest_lock in order to join the task.
+ * It will join only the old_streams (the demux->streams are joined by
+ * gst_adaptive_demux_stop_tasks before gst_adaptive_demux_stream_free is
+ * called)
+ */
 static void
 gst_adaptive_demux_stream_free (GstAdaptiveDemuxStream * stream)
 {
@@ -939,11 +1086,22 @@
       GST_DEBUG_OBJECT (demux, "Leaving streaming task %s:%s",
           GST_DEBUG_PAD_NAME (stream->pad));
 
-      g_cond_signal (&stream->fragment_download_cond);
       gst_task_stop (stream->download_task);
+
+      g_mutex_lock (&stream->fragment_download_lock);
+      stream->cancelled = TRUE;
+      g_cond_signal (&stream->fragment_download_cond);
+      g_mutex_unlock (&stream->fragment_download_lock);
     }
     GST_LOG_OBJECT (demux, "Waiting for task to finish");
+
+    /* temporarily drop the manifest lock to join the task */
+    GST_MANIFEST_UNLOCK (demux);
+
     gst_task_join (stream->download_task);
+
+    GST_MANIFEST_LOCK (demux);
+
     GST_LOG_OBJECT (demux, "Finished");
     gst_object_unref (stream->download_task);
     g_rec_mutex_clear (&stream->download_lock);
@@ -976,8 +1134,6 @@
   g_cond_clear (&stream->fragment_download_cond);
   g_mutex_clear (&stream->fragment_download_lock);
 
-  g_free (stream->fragment_bitrates);
-
   if (stream->pad) {
     gst_object_unref (stream->pad);
     stream->pad = NULL;
@@ -990,6 +1146,7 @@
   g_free (stream);
 }
 
+/* must be called with manifest_lock taken */
 static gboolean
 gst_adaptive_demux_get_live_seek_range (GstAdaptiveDemux * demux,
     gint64 * range_start, gint64 * range_stop)
@@ -1003,6 +1160,7 @@
   return klass->get_live_seek_range (demux, range_start, range_stop);
 }
 
+/* must be called with manifest_lock taken */
 static gboolean
 gst_adaptive_demux_can_seek (GstAdaptiveDemux * demux)
 {
@@ -1041,18 +1199,22 @@
 
       GST_INFO_OBJECT (demux, "Received seek event");
 
+      GST_API_LOCK (demux);
       GST_MANIFEST_LOCK (demux);
+
       if (!gst_adaptive_demux_can_seek (demux)) {
         GST_MANIFEST_UNLOCK (demux);
+        GST_API_UNLOCK (demux);
         gst_event_unref (event);
         return FALSE;
       }
-      GST_MANIFEST_UNLOCK (demux);
 
       gst_event_parse_seek (event, &rate, &format, &flags, &start_type, &start,
           &stop_type, &stop);
 
       if (format != GST_FORMAT_TIME) {
+        GST_MANIFEST_UNLOCK (demux);
+        GST_API_UNLOCK (demux);
         gst_event_unref (event);
         return FALSE;
       }
@@ -1061,10 +1223,14 @@
         gint64 range_start, range_stop;
         if (!gst_adaptive_demux_get_live_seek_range (demux, &range_start,
                 &range_stop)) {
+          GST_MANIFEST_UNLOCK (demux);
+          GST_API_UNLOCK (demux);
           gst_event_unref (event);
           return FALSE;
         }
         if (start < range_start || start >= range_stop) {
+          GST_MANIFEST_UNLOCK (demux);
+          GST_API_UNLOCK (demux);
           GST_WARNING_OBJECT (demux, "Seek to invalid position");
           gst_event_unref (event);
           return FALSE;
@@ -1096,7 +1262,6 @@
       GST_DEBUG_OBJECT (demux, "Seeking to segment %" GST_SEGMENT_FORMAT,
           &demux->segment);
 
-      GST_MANIFEST_LOCK (demux);
       ret = demux_class->seek (demux, event);
 
       if (!ret) {
@@ -1144,6 +1309,7 @@
       /* Restart the demux */
       gst_adaptive_demux_start_tasks (demux);
       GST_MANIFEST_UNLOCK (demux);
+      GST_API_UNLOCK (demux);
 
       gst_event_unref (event);
       return ret;
@@ -1151,19 +1317,12 @@
     case GST_EVENT_RECONFIGURE:{
       GList *iter;
 
-      /* When exposing pads reconfigure events are received as result
-       * of the linking of the pads. The exposing and reconfigure happens
-       * from the same thread. This prevents a deadlock and, although
-       * not beautiful, makes this safe by avoiding that the demux->streams
-       * list gets modified while this loop is running */
-      if (!demux->priv->exposing)
-        GST_MANIFEST_LOCK (demux);
+      GST_MANIFEST_LOCK (demux);
 
       for (iter = demux->streams; iter; iter = g_list_next (iter)) {
         GstAdaptiveDemuxStream *stream = iter->data;
 
         if (stream->pad == pad) {
-          g_mutex_lock (&stream->fragment_download_lock);
           if (stream->last_ret == GST_FLOW_NOT_LINKED) {
             stream->last_ret = GST_FLOW_OK;
             stream->restart_download = TRUE;
@@ -1172,15 +1331,12 @@
             GST_DEBUG_OBJECT (stream->pad, "Restarting download loop");
             gst_task_start (stream->download_task);
           }
-          g_mutex_unlock (&stream->fragment_download_lock);
           gst_event_unref (event);
-          if (!demux->priv->exposing)
-            GST_MANIFEST_UNLOCK (demux);
+          GST_MANIFEST_UNLOCK (demux);
           return TRUE;
         }
       }
-      if (!demux->priv->exposing)
-        GST_MANIFEST_UNLOCK (demux);
+      GST_MANIFEST_UNLOCK (demux);
     }
       break;
     case GST_EVENT_LATENCY:{
@@ -1216,8 +1372,10 @@
       GstClockTime duration = -1;
       GstFormat fmt;
 
-      GST_MANIFEST_LOCK (demux);
       gst_query_parse_duration (query, &fmt, NULL);
+
+      GST_MANIFEST_LOCK (demux);
+
       if (fmt == GST_FORMAT_TIME && demux->priv->have_manifest
           && !gst_adaptive_demux_is_live (demux)) {
         duration = demux_class->get_duration (demux);
@@ -1227,7 +1385,9 @@
           ret = TRUE;
         }
       }
+
       GST_MANIFEST_UNLOCK (demux);
+
       GST_LOG_OBJECT (demux, "GST_QUERY_DURATION returns %s with duration %"
           GST_TIME_FORMAT, ret ? "TRUE" : "FALSE", GST_TIME_ARGS (duration));
       break;
@@ -1243,6 +1403,7 @@
       gint64 start = 0;
 
       GST_MANIFEST_LOCK (demux);
+
       if (!demux->priv->have_manifest) {
         GST_MANIFEST_UNLOCK (demux);
         GST_INFO_OBJECT (demux,
@@ -1275,14 +1436,17 @@
       break;
     }
     case GST_QUERY_URI:
-      /* TODO HLS can answer this differently it seems */
+
       GST_MANIFEST_LOCK (demux);
+
+      /* TODO HLS can answer this differently it seems */
       if (demux->manifest_uri) {
         /* FIXME: (hls) Do we answer with the variant playlist, with the current
          * playlist or the the uri of the last downlowaded fragment? */
         gst_query_set_uri (query, demux->manifest_uri);
         ret = TRUE;
       }
+
       GST_MANIFEST_UNLOCK (demux);
       break;
     default:
@@ -1296,59 +1460,101 @@
   return ret;
 }
 
+/* must be called with manifest_lock taken */
 static void
 gst_adaptive_demux_start_tasks (GstAdaptiveDemux * demux)
 {
   GList *iter;
 
   GST_INFO_OBJECT (demux, "Starting streams' tasks");
-  demux->cancelled = FALSE;
   for (iter = demux->streams; iter; iter = g_list_next (iter)) {
     GstAdaptiveDemuxStream *stream = iter->data;
+
+    g_mutex_lock (&stream->fragment_download_lock);
+    stream->cancelled = FALSE;
+    g_mutex_unlock (&stream->fragment_download_lock);
+
     stream->last_ret = GST_FLOW_OK;
     gst_task_start (stream->download_task);
   }
 }
 
+/* must be called with manifest_lock taken
+ * This function will temporarily release manifest_lock in order to join the
+ * download threads.
+ * The api_lock will still protect it against other threads trying to modify
+ * the demux element.
+ */
 static void
 gst_adaptive_demux_stop_tasks (GstAdaptiveDemux * demux)
 {
   GList *iter;
 
-  demux->cancelled = TRUE;
-
-  demux->priv->stop_updates_task = TRUE;
   gst_task_stop (demux->priv->updates_task);
-  g_cond_signal (&demux->priv->updates_timed_cond);
 
-  GST_MANIFEST_LOCK (demux);
-  g_cond_broadcast (&demux->manifest_cond);
-  GST_MANIFEST_UNLOCK (demux);
+  g_mutex_lock (&demux->priv->updates_timed_lock);
+  demux->priv->stop_updates_task = TRUE;
+  g_cond_signal (&demux->priv->updates_timed_cond);
+  g_mutex_unlock (&demux->priv->updates_timed_lock);
 
   gst_uri_downloader_cancel (demux->downloader);
+
   for (iter = demux->streams; iter; iter = g_list_next (iter)) {
     GstAdaptiveDemuxStream *stream = iter->data;
 
-    gst_task_stop (stream->download_task);
-    if (stream->src)
-      gst_element_set_state (stream->src, GST_STATE_READY);
     g_mutex_lock (&stream->fragment_download_lock);
-    stream->download_finished = TRUE;
+    stream->cancelled = TRUE;
+    gst_task_stop (stream->download_task);
     g_cond_signal (&stream->fragment_download_cond);
     g_mutex_unlock (&stream->fragment_download_lock);
   }
 
+  g_mutex_lock (&demux->priv->manifest_update_lock);
+  g_cond_broadcast (&demux->priv->manifest_cond);
+  g_mutex_unlock (&demux->priv->manifest_update_lock);
+
+  /* need to release manifest_lock before stopping the src element.
+   * The streams were asked to cancel, so they will not make any writes to demux
+   * object. Even if we temporarily release manifest_lock, the demux->streams
+   * cannot change and iter cannot be invalidated.
+   */
+  for (iter = demux->streams; iter; iter = g_list_next (iter)) {
+    GstAdaptiveDemuxStream *stream = iter->data;
+    GstElement *src = stream->src;
+
+    GST_MANIFEST_UNLOCK (demux);
+
+    if (src) {
+      gst_element_set_state (src, GST_STATE_READY);
+    }
+
+    /* stream->download_task value never changes, so it is safe to read it
+     * outside critical section
+     */
+    gst_task_join (stream->download_task);
+
+    GST_MANIFEST_LOCK (demux);
+  }
+
+  GST_MANIFEST_UNLOCK (demux);
+
+  /* demux->priv->updates_task value never changes, so it is safe to read it
+   * outside critical section
+   */
+  gst_task_join (demux->priv->updates_task);
+
+  GST_MANIFEST_LOCK (demux);
+
   for (iter = demux->streams; iter; iter = g_list_next (iter)) {
     GstAdaptiveDemuxStream *stream = iter->data;
 
-    gst_task_join (stream->download_task);
     stream->download_error_count = 0;
     stream->need_header = TRUE;
     gst_adapter_clear (stream->adapter);
   }
-  gst_task_join (demux->priv->updates_task);
 }
 
+/* must be called with manifest_lock taken */
 static gboolean
 gst_adaptive_demux_push_src_event (GstAdaptiveDemux * demux, GstEvent * event)
 {
@@ -1364,6 +1570,7 @@
   return ret;
 }
 
+/* must be called with manifest_lock taken */
 void
 gst_adaptive_demux_stream_set_caps (GstAdaptiveDemuxStream * stream,
     GstCaps * caps)
@@ -1374,6 +1581,7 @@
   gst_caps_unref (caps);
 }
 
+/* must be called with manifest_lock taken */
 void
 gst_adaptive_demux_stream_set_tags (GstAdaptiveDemuxStream * stream,
     GstTagList * tags)
@@ -1386,6 +1594,7 @@
   stream->pending_tags = tags;
 }
 
+/* must be called with manifest_lock taken */
 void
 gst_adaptive_demux_stream_queue_event (GstAdaptiveDemuxStream * stream,
     GstEvent * event)
@@ -1393,46 +1602,12 @@
   stream->pending_events = g_list_append (stream->pending_events, event);
 }
 
-static guint64
-_update_average_bitrate (GstAdaptiveDemux * demux,
-    GstAdaptiveDemuxStream * stream, guint64 new_bitrate)
-{
-  gint index = stream->moving_index % demux->num_lookback_fragments;
-
-  stream->moving_bitrate -= stream->fragment_bitrates[index];
-  stream->fragment_bitrates[index] = new_bitrate;
-  stream->moving_bitrate += new_bitrate;
-
-  stream->moving_index += 1;
-
-  if (stream->moving_index > demux->num_lookback_fragments)
-    return stream->moving_bitrate / demux->num_lookback_fragments;
-  return stream->moving_bitrate / stream->moving_index;
-}
-
+/* must be called with manifest_lock taken */
 static guint64
 gst_adaptive_demux_stream_update_current_bitrate (GstAdaptiveDemux * demux,
     GstAdaptiveDemuxStream * stream)
 {
-  guint64 average_bitrate;
-  guint64 fragment_bitrate;
-
-  fragment_bitrate =
-      (stream->fragment_total_size * 8) /
-      ((double) stream->fragment_total_time / G_GUINT64_CONSTANT (1000000));
-  stream->fragment_total_size = 0;
-  stream->fragment_total_time = 0;
-
-  average_bitrate = _update_average_bitrate (demux, stream, fragment_bitrate);
-
-  GST_INFO_OBJECT (stream, "last fragment bitrate was %" G_GUINT64_FORMAT,
-      fragment_bitrate);
-  GST_INFO_OBJECT (stream,
-      "Last %u fragments average bitrate is %" G_GUINT64_FORMAT,
-      demux->num_lookback_fragments, average_bitrate);
-
-  /* Conservative approach, make sure we don't upgrade too fast */
-  stream->current_download_rate = MIN (average_bitrate, fragment_bitrate);
+  guint64 bitrate;
 
   if (demux->connection_speed) {
     GST_LOG_OBJECT (demux, "Connection-speed is set to %u kbps, using it",
@@ -1440,13 +1615,15 @@
     return demux->connection_speed;
   }
 
-  stream->current_download_rate *= demux->bitrate_limit;
-  GST_DEBUG_OBJECT (demux, "Bitrate after bitrate limit (%0.2f): %"
-      G_GUINT64_FORMAT, demux->bitrate_limit, stream->current_download_rate);
-
-  return stream->current_download_rate;
+  g_object_get (stream->queue, "avg-in-rate", &bitrate, NULL);
+  bitrate *= 8;
+  GST_DEBUG_OBJECT (demux, "Download bitrate is : %" G_GUINT64_FORMAT " bps",
+      bitrate);
+  stream->current_download_rate = bitrate;
+  return bitrate;
 }
 
+/* must be called with manifest_lock taken */
 static GstFlowReturn
 gst_adaptive_demux_combine_flows (GstAdaptiveDemux * demux)
 {
@@ -1457,7 +1634,6 @@
   for (iter = demux->streams; iter; iter = g_list_next (iter)) {
     GstAdaptiveDemuxStream *stream = iter->data;
 
-    g_mutex_lock (&stream->fragment_download_lock);
     if (stream->last_ret != GST_FLOW_NOT_LINKED) {
       all_notlinked = FALSE;
       if (stream->last_ret != GST_FLOW_EOS)
@@ -1466,10 +1642,8 @@
 
     if (stream->last_ret <= GST_FLOW_NOT_NEGOTIATED
         || stream->last_ret == GST_FLOW_FLUSHING) {
-      g_mutex_unlock (&stream->fragment_download_lock);
       return stream->last_ret;
     }
-    g_mutex_unlock (&stream->fragment_download_lock);
   }
   if (all_notlinked)
     return GST_FLOW_NOT_LINKED;
@@ -1478,6 +1652,9 @@
   return GST_FLOW_OK;
 }
 
+/* must be called with manifest_lock taken.
+ * Temporarily releases manifest_lock
+ */
 GstFlowReturn
 gst_adaptive_demux_stream_push_buffer (GstAdaptiveDemuxStream * stream,
     GstBuffer * buffer)
@@ -1485,6 +1662,9 @@
   GstAdaptiveDemux *demux = stream->demux;
   GstFlowReturn ret = GST_FLOW_OK;
   gboolean discont = FALSE;
+  /* Pending events */
+  GstEvent *pending_caps = NULL, *pending_segment = NULL, *pending_tags = NULL;
+  GList *pending_events = NULL;
 
   if (stream->first_fragment_buffer) {
     GstClockTime offset =
@@ -1511,6 +1691,9 @@
         demux->segment.position =
             stream->segment.position - offset + period_start;
     }
+    GST_LOG_OBJECT (stream->pad,
+        "Going to push buffer with PTS %" GST_TIME_FORMAT,
+        GST_TIME_ARGS (GST_BUFFER_PTS (buffer)));
   } else {
     GST_BUFFER_PTS (buffer) = GST_CLOCK_TIME_NONE;
   }
@@ -1531,43 +1714,83 @@
 
   GST_BUFFER_DURATION (buffer) = GST_CLOCK_TIME_NONE;
   GST_BUFFER_DTS (buffer) = GST_CLOCK_TIME_NONE;
-
   if (G_UNLIKELY (stream->pending_caps)) {
-    GST_DEBUG_OBJECT (stream->pad, "Setting pending caps: %" GST_PTR_FORMAT,
-        stream->pending_caps);
-    gst_pad_set_caps (stream->pad, stream->pending_caps);
+    pending_caps = gst_event_new_caps (stream->pending_caps);
     gst_caps_unref (stream->pending_caps);
     stream->pending_caps = NULL;
   }
   if (G_UNLIKELY (stream->pending_segment)) {
-    GST_DEBUG_OBJECT (stream->pad, "Sending pending seg: %" GST_PTR_FORMAT,
-        stream->pending_segment);
-    gst_pad_push_event (stream->pad, stream->pending_segment);
+    pending_segment = stream->pending_segment;
     stream->pending_segment = NULL;
   }
-  if (G_UNLIKELY (stream->pending_tags)) {
-    GST_DEBUG_OBJECT (stream->pad, "Sending pending tags: %" GST_PTR_FORMAT,
-        stream->pending_tags);
-    gst_pad_push_event (stream->pad, gst_event_new_tag (stream->pending_tags));
+  if (G_UNLIKELY (stream->pending_tags || stream->bitrate_changed)) {
+    GstTagList *tags = stream->pending_tags;
+
     stream->pending_tags = NULL;
+    stream->bitrate_changed = 0;
+
+    if (stream->fragment.bitrate != 0) {
+      if (tags)
+        tags = gst_tag_list_make_writable (tags);
+      else
+        tags = gst_tag_list_new_empty ();
+
+      gst_tag_list_add (tags, GST_TAG_MERGE_KEEP,
+          GST_TAG_NOMINAL_BITRATE, stream->fragment.bitrate, NULL);
+    }
+    pending_tags = gst_event_new_tag (tags);
   }
-  while (stream->pending_events != NULL) {
-    GstEvent *event = stream->pending_events->data;
+  if (G_UNLIKELY (stream->pending_events)) {
+    pending_events = stream->pending_events;
+    stream->pending_events = NULL;
+  }
+
+  GST_MANIFEST_UNLOCK (demux);
+
+  /* Do not push events or buffers holding the manifest lock */
+  if (G_UNLIKELY (pending_caps)) {
+    GST_DEBUG_OBJECT (stream->pad, "Setting pending caps: %" GST_PTR_FORMAT,
+        pending_caps);
+    gst_pad_push_event (stream->pad, pending_caps);
+  }
+  if (G_UNLIKELY (pending_segment)) {
+    GST_DEBUG_OBJECT (stream->pad, "Sending pending seg: %" GST_PTR_FORMAT,
+        pending_segment);
+    gst_pad_push_event (stream->pad, pending_segment);
+  }
+  if (G_UNLIKELY (pending_tags)) {
+    GST_DEBUG_OBJECT (stream->pad, "Sending pending tags: %" GST_PTR_FORMAT,
+        pending_tags);
+    gst_pad_push_event (stream->pad, pending_tags);
+  }
+  while (pending_events != NULL) {
+    GstEvent *event = pending_events->data;
 
     if (!gst_pad_push_event (stream->pad, event))
       GST_ERROR_OBJECT (stream->pad, "Failed to send pending event");
 
-    stream->pending_events =
-        g_list_delete_link (stream->pending_events, stream->pending_events);
+    pending_events = g_list_delete_link (pending_events, pending_events);
   }
 
   ret = gst_pad_push (stream->pad, buffer);
+
+  GST_MANIFEST_LOCK (demux);
+
+  g_mutex_lock (&stream->fragment_download_lock);
+  if (G_UNLIKELY (stream->cancelled)) {
+    ret = stream->last_ret = GST_FLOW_FLUSHING;
+    g_mutex_unlock (&stream->fragment_download_lock);
+    return ret;
+  }
+  g_mutex_unlock (&stream->fragment_download_lock);
+
   GST_LOG_OBJECT (stream->pad, "Push result: %d %s", ret,
       gst_flow_get_name (ret));
 
   return ret;
 }
 
+/* must be called with manifest_lock taken */
 static GstFlowReturn
 gst_adaptive_demux_stream_finish_fragment_default (GstAdaptiveDemux * demux,
     GstAdaptiveDemuxStream * stream)
@@ -1580,6 +1803,9 @@
       stream->fragment.duration);
 }
 
+/* must be called with manifest_lock taken.
+ * Can temporarily release manifest_lock
+ */
 static GstFlowReturn
 gst_adaptive_demux_stream_data_received_default (GstAdaptiveDemux * demux,
     GstAdaptiveDemuxStream * stream)
@@ -1600,6 +1826,19 @@
   GstAdaptiveDemuxClass *klass = GST_ADAPTIVE_DEMUX_GET_CLASS (demux);
   GstFlowReturn ret = GST_FLOW_OK;
 
+  GST_MANIFEST_LOCK (demux);
+
+  /* do not make any changes if the stream is cancelled */
+  g_mutex_lock (&stream->fragment_download_lock);
+  if (G_UNLIKELY (stream->cancelled)) {
+    g_mutex_unlock (&stream->fragment_download_lock);
+    gst_buffer_unref (buffer);
+    ret = stream->last_ret = GST_FLOW_FLUSHING;
+    GST_MANIFEST_UNLOCK (demux);
+    return ret;
+  }
+  g_mutex_unlock (&stream->fragment_download_lock);
+
   if (stream->starting_fragment) {
     GstClockTime offset =
         gst_adaptive_demux_stream_get_presentation_offset (demux, stream);
@@ -1608,7 +1847,10 @@
 
     stream->starting_fragment = FALSE;
     if (klass->start_fragment) {
-      klass->start_fragment (demux, stream);
+      if (!klass->start_fragment (demux, stream)) {
+        ret = GST_FLOW_ERROR;
+        goto error;
+      }
     }
 
     GST_BUFFER_PTS (buffer) = stream->fragment.timestamp;
@@ -1632,20 +1874,57 @@
   } else {
     GST_BUFFER_PTS (buffer) = GST_CLOCK_TIME_NONE;
   }
+  if (stream->downloading_first_buffer) {
+    gint64 chunk_size = 0;
+
+    stream->downloading_first_buffer = FALSE;
+
+    if (!stream->downloading_header && !stream->downloading_index) {
+      /* If this is the first buffer of a fragment (not the headers or index)
+       * and we don't have a birate from the sub-class, then see if we
+       * can work it out from the fragment size and duration */
+      if (stream->fragment.bitrate == 0 &&
+          stream->fragment.duration != 0 &&
+          gst_element_query_duration (stream->uri_handler, GST_FORMAT_BYTES,
+              &chunk_size)) {
+        guint bitrate = MIN (G_MAXUINT, gst_util_uint64_scale (chunk_size,
+                8 * GST_SECOND, stream->fragment.duration));
+        GST_LOG_OBJECT (demux,
+            "Fragment has size %" G_GUINT64_FORMAT " duration %" GST_TIME_FORMAT
+            " = bitrate %u", chunk_size,
+            GST_TIME_ARGS (stream->fragment.duration), bitrate);
+        stream->fragment.bitrate = bitrate;
+      }
+      if (stream->fragment.bitrate) {
+        stream->bitrate_changed = TRUE;
+      } else {
+        GST_WARNING_OBJECT (demux, "Bitrate for fragment not available");
+      }
+    }
+  }
 
   stream->download_total_time +=
       g_get_monotonic_time () - stream->download_chunk_start_time;
   stream->download_total_bytes += gst_buffer_get_size (buffer);
 
-  stream->fragment_total_size += gst_buffer_get_size (buffer);
-  stream->fragment_total_time +=
-      g_get_monotonic_time () - stream->download_chunk_start_time;
-
   gst_adapter_push (stream->adapter, buffer);
   GST_DEBUG_OBJECT (stream->pad, "Received buffer of size %" G_GSIZE_FORMAT
       ". Now %" G_GSIZE_FORMAT " on adapter", gst_buffer_get_size (buffer),
       gst_adapter_available (stream->adapter));
+
   ret = klass->data_received (demux, stream);
+
+  if (ret == GST_FLOW_FLUSHING) {
+    /* do not make any changes if the stream is cancelled */
+    g_mutex_lock (&stream->fragment_download_lock);
+    if (G_UNLIKELY (stream->cancelled)) {
+      g_mutex_unlock (&stream->fragment_download_lock);
+      GST_MANIFEST_UNLOCK (demux);
+      return ret;
+    }
+    g_mutex_unlock (&stream->fragment_download_lock);
+  }
+
   stream->download_chunk_start_time = g_get_monotonic_time ();
 
   if (ret != GST_FLOW_OK) {
@@ -1665,16 +1944,18 @@
       ret = GST_FLOW_EOS;       /* return EOS to make the source stop */
   }
 
+error:
+
+  GST_MANIFEST_UNLOCK (demux);
+
   return ret;
 }
 
+/* must be called with manifest_lock taken */
 static void
 gst_adaptive_demux_stream_fragment_download_finish (GstAdaptiveDemuxStream *
     stream, GstFlowReturn ret, GError * err)
 {
-  g_mutex_lock (&stream->fragment_download_lock);
-  stream->download_finished = TRUE;
-
   GST_DEBUG_OBJECT (stream->pad, "Download finish: %d %s - err: %p", ret,
       gst_flow_get_name (ret), err);
 
@@ -1687,6 +1968,8 @@
       stream->last_error = g_error_copy (err);
     }
   }
+  g_mutex_lock (&stream->fragment_download_lock);
+  stream->download_finished = TRUE;
   g_cond_signal (&stream->fragment_download_cond);
   g_mutex_unlock (&stream->fragment_download_lock);
 }
@@ -1696,15 +1979,20 @@
 {
   GstPad *srcpad = GST_PAD_CAST (parent);
   GstAdaptiveDemuxStream *stream = gst_pad_get_element_private (srcpad);
+  GstAdaptiveDemux *demux = stream->demux;
 
   switch (GST_EVENT_TYPE (event)) {
     case GST_EVENT_EOS:{
       GstAdaptiveDemuxClass *klass;
       GstFlowReturn ret;
 
-      klass = GST_ADAPTIVE_DEMUX_GET_CLASS (stream->demux);
-      ret = klass->finish_fragment (stream->demux, stream);
+      GST_MANIFEST_LOCK (demux);
+
+      klass = GST_ADAPTIVE_DEMUX_GET_CLASS (demux);
+      ret = klass->finish_fragment (demux, stream);
       gst_adaptive_demux_stream_fragment_download_finish (stream, ret, NULL);
+
+      GST_MANIFEST_UNLOCK (demux);
       break;
     }
     default:
@@ -1730,6 +2018,9 @@
   return gst_pad_query_default (pad, parent, query);
 }
 
+/* must be called with manifest_lock taken.
+ * Can temporarily release manifest_lock
+ */
 static gboolean
 gst_adaptive_demux_stream_wait_manifest_update (GstAdaptiveDemux * demux,
     GstAdaptiveDemuxStream * stream)
@@ -1740,13 +2031,33 @@
    * us to download in the playlist or the playlist
    * became non-live */
   while (TRUE) {
-    if (demux->cancelled) {
+    GST_DEBUG_OBJECT (demux, "No fragment left but live playlist, wait a bit");
+
+    /* get the manifest_update_lock while still holding the manifest_lock.
+     * This will prevent other threads to signal the condition (they will need
+     * both manifest_lock and manifest_update_lock in order to signal).
+     * It cannot deadlock because all threads always get the manifest_lock first
+     * and manifest_update_lock second.
+     */
+    g_mutex_lock (&demux->priv->manifest_update_lock);
+
+    GST_MANIFEST_UNLOCK (demux);
+
+    g_cond_wait (&demux->priv->manifest_cond,
+        &demux->priv->manifest_update_lock);
+    g_mutex_unlock (&demux->priv->manifest_update_lock);
+
+    GST_MANIFEST_LOCK (demux);
+
+    /* check for cancelled every time we get the manifest_lock */
+    g_mutex_lock (&stream->fragment_download_lock);
+    if (G_UNLIKELY (stream->cancelled)) {
       ret = FALSE;
+      stream->last_ret = GST_FLOW_FLUSHING;
+      g_mutex_unlock (&stream->fragment_download_lock);
       break;
     }
-
-    GST_DEBUG_OBJECT (demux, "No fragment left but live playlist, wait a bit");
-    g_cond_wait (&demux->manifest_cond, GST_MANIFEST_GET_LOCK (demux));
+    g_mutex_unlock (&stream->fragment_download_lock);
 
     /* Got a new fragment or not live anymore? */
     if (gst_adaptive_demux_stream_has_next_fragment (demux, stream)) {
@@ -1778,6 +2089,7 @@
   return TRUE;
 }
 
+/* must be called with manifest_lock taken */
 static void
 gst_adaptive_demux_stream_clear_eos_and_flush_state (GstAdaptiveDemuxStream *
     stream)
@@ -1797,6 +2109,15 @@
   gst_object_unref (internal_pad);
 }
 
+static void
+gst_adaptive_demux_stream_queue_overrun (GstElement * queue, gpointer user_data)
+{
+  GstAdaptiveDemuxStream *stream = (GstAdaptiveDemuxStream *) user_data;
+  GST_WARNING_OBJECT (stream->pad,
+      "Queue overrun! The fragment to download is too big according to the current queue size limit");
+}
+
+/* must be called with manifest_lock taken */
 static gboolean
 gst_adaptive_demux_stream_update_source (GstAdaptiveDemuxStream * stream,
     const gchar * uri, const gchar * referer, gboolean refresh,
@@ -1813,7 +2134,7 @@
     gchar *old_protocol, *new_protocol;
     gchar *old_uri;
 
-    old_uri = gst_uri_handler_get_uri (GST_URI_HANDLER (stream->src));
+    old_uri = gst_uri_handler_get_uri (GST_URI_HANDLER (stream->uri_handler));
     old_protocol = gst_uri_get_protocol (old_uri);
     new_protocol = gst_uri_get_protocol (uri);
 
@@ -1828,7 +2149,8 @@
       GError *err = NULL;
 
       GST_DEBUG_OBJECT (demux, "Re-using old source element");
-      if (!gst_uri_handler_set_uri (GST_URI_HANDLER (stream->src), uri, &err)) {
+      if (!gst_uri_handler_set_uri (GST_URI_HANDLER (stream->uri_handler), uri,
+              &err)) {
         GST_DEBUG_OBJECT (demux, "Failed to re-use old source element: %s",
             err->message);
         g_clear_error (&err);
@@ -1845,22 +2167,44 @@
   }
 
   if (stream->src == NULL) {
+    GstPad *uri_handler_src;
+    GstPad *queue_sink;
+    GstPad *queue_src;
+    GstElement *uri_handler;
+    GstElement *queue;
+    GstPadLinkReturn pad_link_ret;
     GObjectClass *gobject_class;
     GstPad *internal_pad;
 
-    stream->src = gst_element_make_from_uri (GST_URI_SRC, uri, NULL, NULL);
-    if (stream->src == NULL) {
+    /* Our src consists of a bin containing uri_handler -> queue2 . The
+     * purpose of the queue2 is to allow the uri_handler to download an
+     * entire fragment without blocking, so we can accurately measure the
+     * download bitrate. */
+
+    queue = gst_element_factory_make ("queue2", NULL);
+    if (queue == NULL)
+      return FALSE;
+
+    g_object_set (queue, "max-size-bytes", (guint) SRC_QUEUE_MAX_BYTES, NULL);
+    g_object_set (queue, "max-size-buffers", (guint) 0, NULL);
+    g_object_set (queue, "max-size-time", (guint64) 0, NULL);
+    g_signal_connect (queue, "overrun",
+        G_CALLBACK (gst_adaptive_demux_stream_queue_overrun), stream);
+
+    uri_handler = gst_element_make_from_uri (GST_URI_SRC, uri, NULL, NULL);
+    if (uri_handler == NULL) {
       GST_ELEMENT_ERROR (demux, CORE, MISSING_PLUGIN,
           ("Missing plugin to handle URI: '%s'", uri), (NULL));
+      gst_object_unref (queue);
       return FALSE;
     }
 
-    gobject_class = G_OBJECT_GET_CLASS (stream->src);
+    gobject_class = G_OBJECT_GET_CLASS (uri_handler);
 
     if (g_object_class_find_property (gobject_class, "compress"))
-      g_object_set (stream->src, "compress", FALSE, NULL);
+      g_object_set (uri_handler, "compress", FALSE, NULL);
     if (g_object_class_find_property (gobject_class, "keep-alive"))
-      g_object_set (stream->src, "keep-alive", TRUE, NULL);
+      g_object_set (uri_handler, "keep-alive", TRUE, NULL);
     if (g_object_class_find_property (gobject_class, "extra-headers")) {
       if (referer || refresh || !allow_cache) {
         GstStructure *extra_headers = gst_structure_new_empty ("headers");
@@ -1876,14 +2220,50 @@
           gst_structure_set (extra_headers, "Cache-Control", G_TYPE_STRING,
               "max-age=0", NULL);
 
-        g_object_set (stream->src, "extra-headers", extra_headers, NULL);
+        g_object_set (uri_handler, "extra-headers", extra_headers, NULL);
 
         gst_structure_free (extra_headers);
       } else {
-        g_object_set (stream->src, "extra-headers", NULL, NULL);
+        g_object_set (uri_handler, "extra-headers", NULL, NULL);
       }
     }
 
+    /* Source bin creation */
+    stream->src = gst_bin_new (NULL);
+    if (stream->src == NULL) {
+      gst_object_unref (queue);
+      gst_object_unref (uri_handler);
+      return FALSE;
+    }
+
+    gst_bin_add (GST_BIN_CAST (stream->src), queue);
+    gst_bin_add (GST_BIN_CAST (stream->src), uri_handler);
+
+    uri_handler_src = gst_element_get_static_pad (uri_handler, "src");
+    queue_sink = gst_element_get_static_pad (queue, "sink");
+
+    pad_link_ret =
+        gst_pad_link_full (uri_handler_src, queue_sink,
+        GST_PAD_LINK_CHECK_NOTHING);
+    if (GST_PAD_LINK_FAILED (pad_link_ret)) {
+      GST_WARNING_OBJECT (demux,
+          "Could not link pads %s:%s to %s:%s for reason %d",
+          GST_DEBUG_PAD_NAME (uri_handler_src), GST_DEBUG_PAD_NAME (queue_sink),
+          pad_link_ret);
+      g_object_unref (queue_sink);
+      g_object_unref (uri_handler_src);
+      gst_object_unref (stream->src);
+      stream->src = NULL;
+      return FALSE;
+    }
+
+    g_object_unref (queue_sink);
+    g_object_unref (uri_handler_src);
+    queue_src = gst_element_get_static_pad (queue, "src");
+    stream->src_srcpad = gst_ghost_pad_new ("src", queue_src);
+    g_object_unref (queue_src);
+    gst_element_add_pad (stream->src, stream->src_srcpad);
+
     gst_element_set_locked_state (stream->src, TRUE);
     gst_bin_add (GST_BIN_CAST (demux), stream->src);
     stream->src_srcpad = gst_element_get_static_pad (stream->src, "src");
@@ -1902,11 +2282,15 @@
     /* need to set query otherwise deadlocks happen with allocation queries */
     gst_pad_set_query_function (GST_PAD_CAST (internal_pad), _src_query);
     gst_object_unref (internal_pad);
+    stream->uri_handler = uri_handler;
+    stream->queue = queue;
   }
   return TRUE;
 }
 
-/* must be called with the stream's fragment_download_lock */
+/* must be called with manifest_lock taken.
+ * Can temporarily release manifest_lock
+ */
 static GstFlowReturn
 gst_adaptive_demux_stream_download_uri (GstAdaptiveDemux * demux,
     GstAdaptiveDemuxStream * stream, const gchar * uri, gint64 start,
@@ -1916,19 +2300,21 @@
   GST_DEBUG_OBJECT (stream->pad, "Downloading uri: %s, range:%" G_GINT64_FORMAT
       " - %" G_GINT64_FORMAT, uri, start, end);
 
-  stream->download_finished = FALSE;
-
   if (!gst_adaptive_demux_stream_update_source (stream, uri, NULL, FALSE, TRUE)) {
-    g_mutex_lock (&stream->fragment_download_lock);
     ret = stream->last_ret = GST_FLOW_ERROR;
-    g_mutex_unlock (&stream->fragment_download_lock);
     return ret;
   }
 
   if (gst_element_set_state (stream->src,
           GST_STATE_READY) != GST_STATE_CHANGE_FAILURE) {
     if (start != 0 || end != -1) {
-      if (!gst_element_send_event (stream->src, gst_event_new_seek (1.0,
+      /* HTTP ranges are inclusive, GStreamer segments are exclusive for the
+       * stop position */
+      if (end != -1)
+        end += 1;
+      /* Send the seek event to the uri_handler, as the other pipeline elements
+       * can't handle it when READY. */
+      if (!gst_element_send_event (stream->uri_handler, gst_event_new_seek (1.0,
                   GST_FORMAT_BYTES, (GstSeekFlags) GST_SEEK_FLAG_FLUSH,
                   GST_SEEK_TYPE_SET, start, GST_SEEK_TYPE_SET, end))) {
 
@@ -1941,45 +2327,101 @@
       }
     }
 
-    g_mutex_lock (&stream->fragment_download_lock);
     if (G_LIKELY (stream->last_ret == GST_FLOW_OK)) {
       stream->download_start_time = g_get_monotonic_time ();
       stream->download_chunk_start_time = g_get_monotonic_time ();
-      g_mutex_unlock (&stream->fragment_download_lock);
-      gst_element_sync_state_with_parent (stream->src);
+
+      /* src element is in state READY. Before we start it, we reset
+       * download_finished
+       */
       g_mutex_lock (&stream->fragment_download_lock);
+      stream->download_finished = FALSE;
+      stream->downloading_first_buffer = TRUE;
+      g_mutex_unlock (&stream->fragment_download_lock);
+
+      GST_MANIFEST_UNLOCK (demux);
+
+      if (!gst_element_sync_state_with_parent (stream->src)) {
+        GST_WARNING_OBJECT (demux, "Could not sync state for src element");
+        GST_MANIFEST_LOCK (demux);
+        ret = stream->last_ret = GST_FLOW_ERROR;
+        return ret;
+      }
 
       /* wait for the fragment to be completely downloaded */
       GST_DEBUG_OBJECT (stream->pad,
           "Waiting for fragment download to finish: %s", uri);
-      while (!stream->demux->cancelled && !stream->download_finished) {
+
+      g_mutex_lock (&stream->fragment_download_lock);
+      if (G_UNLIKELY (stream->cancelled)) {
+        g_mutex_unlock (&stream->fragment_download_lock);
+        GST_MANIFEST_LOCK (demux);
+        ret = stream->last_ret = GST_FLOW_FLUSHING;
+        return ret;
+      }
+      while (!stream->cancelled && !stream->download_finished) {
         g_cond_wait (&stream->fragment_download_cond,
             &stream->fragment_download_lock);
       }
+      g_mutex_unlock (&stream->fragment_download_lock);
+
+      GST_MANIFEST_LOCK (demux);
+      g_mutex_lock (&stream->fragment_download_lock);
+      if (G_UNLIKELY (stream->cancelled)) {
+        ret = stream->last_ret = GST_FLOW_FLUSHING;
+        g_mutex_unlock (&stream->fragment_download_lock);
+        return ret;
+      }
+      g_mutex_unlock (&stream->fragment_download_lock);
+
       ret = stream->last_ret;
 
       GST_DEBUG_OBJECT (stream->pad, "Fragment download finished: %s %d %s",
           uri, stream->last_ret, gst_flow_get_name (stream->last_ret));
     }
-    g_mutex_unlock (&stream->fragment_download_lock);
   } else {
-    g_mutex_lock (&stream->fragment_download_lock);
     if (stream->last_ret == GST_FLOW_OK)
       stream->last_ret = GST_FLOW_CUSTOM_ERROR;
     ret = GST_FLOW_CUSTOM_ERROR;
-    g_mutex_unlock (&stream->fragment_download_lock);
   }
 
   /* flush the proxypads so that the EOS state is reset */
   gst_pad_push_event (stream->src_srcpad, gst_event_new_flush_start ());
+
+  /* sending flush stop event will serialiase on stream->src_srcpad.
+   * But the _src_chain function will first get the pad lock and then the
+   * manifest lock, so we cannot hold the manifest lock here while
+   * we will try to get the pad lock (taking locks in reversing order
+   * will lead to deadlock)
+   *
+   * In conclusion, we need to release the manifest lock before flushing
+   */
+  GST_MANIFEST_UNLOCK (demux);
+
   gst_pad_push_event (stream->src_srcpad, gst_event_new_flush_stop (TRUE));
 
+  /* changing src element state might try to join the streaming thread, so
+   * we must not hold the manifest lock.
+   */
   gst_element_set_state (stream->src, GST_STATE_READY);
+
+  GST_MANIFEST_LOCK (demux);
+  g_mutex_lock (&stream->fragment_download_lock);
+  if (G_UNLIKELY (stream->cancelled)) {
+    ret = stream->last_ret = GST_FLOW_FLUSHING;
+    g_mutex_unlock (&stream->fragment_download_lock);
+    return ret;
+  }
+  g_mutex_unlock (&stream->fragment_download_lock);
+
   gst_adaptive_demux_stream_clear_eos_and_flush_state (stream);
 
   return ret;
 }
 
+/* must be called with manifest_lock taken.
+ * Can temporarily release manifest_lock
+ */
 static GstFlowReturn
 gst_adaptive_demux_stream_download_header_fragment (GstAdaptiveDemuxStream *
     stream)
@@ -2000,7 +2442,7 @@
   }
 
   /* check if we have an index */
-  if (!demux->cancelled && ret == GST_FLOW_OK) {        /* TODO check for other valid types */
+  if (ret == GST_FLOW_OK) {     /* TODO check for other valid types */
 
     if (stream->fragment.index_uri != NULL) {
       GST_DEBUG_OBJECT (demux,
@@ -2018,6 +2460,9 @@
   return ret;
 }
 
+/* must be called with manifest_lock taken.
+ * Can temporarily release manifest_lock
+ */
 static GstFlowReturn
 gst_adaptive_demux_stream_download_fragment (GstAdaptiveDemuxStream * stream)
 {
@@ -2025,11 +2470,9 @@
   gchar *url = NULL;
   GstFlowReturn ret = GST_FLOW_OK;
 
-  g_mutex_lock (&stream->fragment_download_lock);
   stream->starting_fragment = TRUE;
   stream->last_ret = GST_FLOW_OK;
   stream->first_fragment_buffer = TRUE;
-  g_mutex_unlock (&stream->fragment_download_lock);
 
   if (stream->fragment.uri == NULL && stream->fragment.header_uri == NULL &&
       stream->fragment.index_uri == NULL)
@@ -2037,10 +2480,10 @@
 
   if (stream->need_header) {
     ret = gst_adaptive_demux_stream_download_header_fragment (stream);
-    stream->need_header = FALSE;
     if (ret != GST_FLOW_OK) {
       return ret;
     }
+    stream->need_header = FALSE;
   }
 
   url = stream->fragment.uri;
@@ -2052,7 +2495,14 @@
     GST_DEBUG_OBJECT (stream->pad, "Fragment download result: %d %s",
         stream->last_ret, gst_flow_get_name (stream->last_ret));
     if (ret != GST_FLOW_OK) {
-      /* TODO check if we are truly stoping */
+      g_mutex_lock (&stream->fragment_download_lock);
+      if (G_UNLIKELY (stream->cancelled)) {
+        g_mutex_unlock (&stream->fragment_download_lock);
+        return ret;
+      }
+      g_mutex_unlock (&stream->fragment_download_lock);
+
+      /* TODO check if we are truly stopping */
       if (ret == GST_FLOW_CUSTOM_ERROR && gst_adaptive_demux_is_live (demux)) {
         if (++stream->download_error_count <= MAX_DOWNLOAD_ERROR_COUNT) {
           /* looks like there is no way of knowing when a live stream has ended
@@ -2085,16 +2535,30 @@
   }
 }
 
+/* this function will take the manifest_lock and will keep it until the end.
+ * It will release it temporarily only when going to sleep.
+ * Every time it takes the manifest_lock, it will check for cancelled condition
+ */
 static void
 gst_adaptive_demux_stream_download_loop (GstAdaptiveDemuxStream * stream)
 {
   GstAdaptiveDemux *demux = stream->demux;
-  guint64 next_download = 0;
+  guint64 next_download = g_get_monotonic_time ();
   GstFlowReturn ret;
   gboolean live;
 
   GST_LOG_OBJECT (stream->pad, "download loop start");
 
+  GST_MANIFEST_LOCK (demux);
+
+  g_mutex_lock (&stream->fragment_download_lock);
+  if (G_UNLIKELY (stream->cancelled)) {
+    stream->last_ret = GST_FLOW_FLUSHING;
+    g_mutex_unlock (&stream->fragment_download_lock);
+    goto cancelled;
+  }
+  g_mutex_unlock (&stream->fragment_download_lock);
+
   /* Check if we're done with our segment */
   if (demux->segment.rate > 0) {
     if (GST_CLOCK_TIME_IS_VALID (demux->segment.stop)
@@ -2112,28 +2576,28 @@
     }
   }
 
-  GST_OBJECT_LOCK (demux);
-  if (demux->cancelled) {
-    stream->last_ret = GST_FLOW_FLUSHING;
-    goto cancelled;
-  }
-
   /* Cleanup old streams if any */
   if (G_UNLIKELY (demux->priv->old_streams != NULL)) {
     GList *old_streams = demux->priv->old_streams;
     demux->priv->old_streams = NULL;
-    GST_OBJECT_UNLOCK (demux);
 
-    /* Need to unlock as it might post messages to the bus */
     GST_DEBUG_OBJECT (stream->pad, "Cleaning up old streams");
     g_list_free_full (old_streams,
         (GDestroyNotify) gst_adaptive_demux_stream_free);
     GST_DEBUG_OBJECT (stream->pad, "Cleaning up old streams (done)");
-  } else {
-    GST_OBJECT_UNLOCK (demux);
+
+    /* gst_adaptive_demux_stream_free had temporarily released the manifest_lock.
+     * Recheck the cancelled flag.
+     */
+    g_mutex_lock (&stream->fragment_download_lock);
+    if (G_UNLIKELY (stream->cancelled)) {
+      stream->last_ret = GST_FLOW_FLUSHING;
+      g_mutex_unlock (&stream->fragment_download_lock);
+      goto cancelled;
+    }
+    g_mutex_unlock (&stream->fragment_download_lock);
   }
 
-  GST_MANIFEST_LOCK (demux);
   if (G_UNLIKELY (stream->restart_download)) {
     GstSegment segment;
     GstEvent *seg_event;
@@ -2176,6 +2640,7 @@
 
     GST_DEBUG_OBJECT (stream->pad, "Restarting stream at "
         "position %" GST_TIME_FORMAT, GST_TIME_ARGS (ts));
+
     gst_segment_copy_into (&demux->segment, &segment);
 
     if (GST_CLOCK_TIME_IS_VALID (ts)) {
@@ -2202,13 +2667,6 @@
 
     stream->restart_download = FALSE;
   }
-  GST_OBJECT_LOCK (demux);
-  if (demux->cancelled) {
-    stream->last_ret = GST_FLOW_FLUSHING;
-    GST_MANIFEST_UNLOCK (demux);
-    goto cancelled;
-  }
-  GST_OBJECT_UNLOCK (demux);
 
   live = gst_adaptive_demux_is_live (demux);
 
@@ -2221,32 +2679,54 @@
     if (live) {
       gint64 wait_time =
           gst_adaptive_demux_stream_get_fragment_waiting_time (demux, stream);
-      GST_MANIFEST_UNLOCK (demux);
-      if (wait_time > 0)
-        gst_adaptive_demux_stream_download_wait (stream, wait_time);
-    } else {
-      GST_MANIFEST_UNLOCK (demux);
-    }
+      if (wait_time > 0) {
+        gint64 end_time = g_get_monotonic_time () + wait_time / GST_USECOND;
 
-    GST_OBJECT_LOCK (demux);
-    if (demux->cancelled) {
-      stream->last_ret = GST_FLOW_FLUSHING;
-      goto cancelled;
+        GST_DEBUG_OBJECT (stream->pad, "Download waiting for %" GST_TIME_FORMAT,
+            GST_TIME_ARGS (wait_time));
+
+        GST_MANIFEST_UNLOCK (demux);
+
+        g_mutex_lock (&stream->fragment_download_lock);
+        if (G_UNLIKELY (stream->cancelled)) {
+          g_mutex_unlock (&stream->fragment_download_lock);
+          GST_MANIFEST_LOCK (demux);
+          stream->last_ret = GST_FLOW_FLUSHING;
+          goto cancelled;
+        }
+        g_cond_wait_until (&stream->fragment_download_cond,
+            &stream->fragment_download_lock, end_time);
+        g_mutex_unlock (&stream->fragment_download_lock);
+
+        GST_DEBUG_OBJECT (stream->pad, "Download finished waiting");
+
+        GST_MANIFEST_LOCK (demux);
+
+        g_mutex_lock (&stream->fragment_download_lock);
+        if (G_UNLIKELY (stream->cancelled)) {
+          stream->last_ret = GST_FLOW_FLUSHING;
+          g_mutex_unlock (&stream->fragment_download_lock);
+          goto cancelled;
+        }
+        g_mutex_unlock (&stream->fragment_download_lock);
+      }
     }
-    GST_OBJECT_UNLOCK (demux);
 
     stream->last_ret = GST_FLOW_OK;
+
     next_download = g_get_monotonic_time ();
     ret = gst_adaptive_demux_stream_download_fragment (stream);
 
-    GST_OBJECT_LOCK (demux);
-    if (demux->cancelled) {
-      stream->last_ret = GST_FLOW_FLUSHING;
-      goto cancelled;
+    if (ret == GST_FLOW_FLUSHING) {
+      g_mutex_lock (&stream->fragment_download_lock);
+      if (G_UNLIKELY (stream->cancelled)) {
+        stream->last_ret = GST_FLOW_FLUSHING;
+        g_mutex_unlock (&stream->fragment_download_lock);
+        goto cancelled;
+      }
+      g_mutex_unlock (&stream->fragment_download_lock);
     }
-    GST_OBJECT_UNLOCK (demux);
 
-    GST_MANIFEST_LOCK (demux);
   } else {
     stream->last_ret = ret;
   }
@@ -2259,8 +2739,7 @@
       /* we push the EOS after releasing the object lock */
       if (gst_adaptive_demux_is_live (demux)) {
         if (gst_adaptive_demux_stream_wait_manifest_update (demux, stream)) {
-          GST_MANIFEST_UNLOCK (demux);
-          return;
+          goto end;
         }
         gst_task_stop (stream->download_task);
       } else {
@@ -2301,7 +2780,6 @@
         gboolean is_live = gst_adaptive_demux_is_live (demux);
         GST_WARNING_OBJECT (demux, "Error while downloading fragment");
         if (++stream->download_error_count > MAX_DOWNLOAD_ERROR_COUNT) {
-          GST_MANIFEST_UNLOCK (demux);
           goto download_error;
         }
 
@@ -2313,13 +2791,12 @@
          * a bit to not flood the server */
         if (stream->download_error_count == 1 && !is_live) {
           /* TODO hlsdemux had more options to this function (boolean and err) */
-          GST_MANIFEST_UNLOCK (demux);
+
           if (gst_adaptive_demux_update_manifest (demux) == GST_FLOW_OK) {
             /* Retry immediately, the playlist actually has changed */
             GST_DEBUG_OBJECT (demux, "Updated the playlist");
-            return;
+            goto end;
           }
-          GST_MANIFEST_LOCK (demux);
         }
 
         /* Wait half the fragment duration before retrying */
@@ -2328,40 +2805,53 @@
             (stream->fragment.duration, G_USEC_PER_SEC, 2 * GST_SECOND);
 
         GST_MANIFEST_UNLOCK (demux);
+
         g_mutex_lock (&stream->fragment_download_lock);
-        if (demux->cancelled) {
+        if (G_UNLIKELY (stream->cancelled)) {
           g_mutex_unlock (&stream->fragment_download_lock);
-          return;
+          GST_MANIFEST_LOCK (demux);
+          stream->last_ret = GST_FLOW_FLUSHING;
+          goto cancelled;
         }
         g_cond_wait_until (&stream->fragment_download_cond,
             &stream->fragment_download_lock, next_download);
         g_mutex_unlock (&stream->fragment_download_lock);
+
         GST_DEBUG_OBJECT (demux, "Retrying now");
 
+        GST_MANIFEST_LOCK (demux);
+
+        g_mutex_lock (&stream->fragment_download_lock);
+        if (G_UNLIKELY (stream->cancelled)) {
+          stream->last_ret = GST_FLOW_FLUSHING;
+          g_mutex_unlock (&stream->fragment_download_lock);
+          goto cancelled;
+        }
+        g_mutex_unlock (&stream->fragment_download_lock);
+
         /* Refetch the playlist now after we waited */
         if (!is_live
             && gst_adaptive_demux_update_manifest (demux) == GST_FLOW_OK) {
           GST_DEBUG_OBJECT (demux, "Updated the playlist");
         }
-        return;
+        goto end;
       }
       break;
   }
 
-  GST_MANIFEST_UNLOCK (demux);
 end_of_manifest:
   if (G_UNLIKELY (ret == GST_FLOW_EOS)) {
     gst_adaptive_demux_stream_push_event (stream, gst_event_new_eos ());
   }
 
 end:
+  GST_MANIFEST_UNLOCK (demux);
   GST_LOG_OBJECT (stream->pad, "download loop end");
   return;
 
 cancelled:
   {
     GST_DEBUG_OBJECT (stream->pad, "Stream has been cancelled");
-    GST_OBJECT_UNLOCK (demux);
     goto end;
   }
 download_error:
@@ -2389,7 +2879,15 @@
           "Download error: Couldn't download fragments, too many failures");
     }
 
+    gst_task_stop (stream->download_task);
+    if (stream->src) {
+      gst_element_set_state (stream->src, GST_STATE_NULL);
+      gst_bin_remove (GST_BIN_CAST (demux), stream->src);
+      stream->src = NULL;
+    }
+
     gst_element_post_message (GST_ELEMENT_CAST (demux), msg);
+
     goto end;
   }
 }
@@ -2397,6 +2895,7 @@
 static void
 gst_adaptive_demux_updates_loop (GstAdaptiveDemux * demux)
 {
+  gint64 next_update;
   GstAdaptiveDemuxClass *klass = GST_ADAPTIVE_DEMUX_GET_CLASS (demux);
 
   /* Loop for updating of the playlist. This periodically checks if
@@ -2406,8 +2905,10 @@
   /* block until the next scheduled update or the signal to quit this thread */
   GST_DEBUG_OBJECT (demux, "Started updates task");
 
-  demux->priv->next_update =
-      g_get_monotonic_time () + klass->get_manifest_update_interval (demux);
+  GST_MANIFEST_LOCK (demux);
+
+  next_update = g_get_monotonic_time () +
+      klass->get_manifest_update_interval (demux);
 
   /* Updating playlist only needed for live playlists */
   while (gst_adaptive_demux_is_live (demux)) {
@@ -2416,62 +2917,73 @@
     /* Wait here until we should do the next update or we're cancelled */
     GST_DEBUG_OBJECT (demux, "Wait for next playlist update");
 
+    GST_MANIFEST_UNLOCK (demux);
+
     g_mutex_lock (&demux->priv->updates_timed_lock);
     if (demux->priv->stop_updates_task) {
       g_mutex_unlock (&demux->priv->updates_timed_lock);
       goto quit;
     }
     g_cond_wait_until (&demux->priv->updates_timed_cond,
-        &demux->priv->updates_timed_lock, demux->priv->next_update);
+        &demux->priv->updates_timed_lock, next_update);
+    g_mutex_unlock (&demux->priv->updates_timed_lock);
+
+    GST_MANIFEST_LOCK (demux);
+
+    g_mutex_lock (&demux->priv->updates_timed_lock);
     if (demux->priv->stop_updates_task) {
       g_mutex_unlock (&demux->priv->updates_timed_lock);
+      GST_MANIFEST_UNLOCK (demux);
       goto quit;
     }
     g_mutex_unlock (&demux->priv->updates_timed_lock);
 
     GST_DEBUG_OBJECT (demux, "Updating playlist");
+
     ret = gst_adaptive_demux_update_manifest (demux);
+
     if (ret == GST_FLOW_EOS) {
     } else if (ret != GST_FLOW_OK) {
-      if (demux->priv->stop_updates_task)
-        goto quit;
+      /* update_failed_count is used only here, no need to protect it */
       demux->priv->update_failed_count++;
       if (demux->priv->update_failed_count <= DEFAULT_FAILED_COUNT) {
         GST_WARNING_OBJECT (demux, "Could not update the playlist");
-        demux->priv->next_update =
-            g_get_monotonic_time () +
+        next_update = g_get_monotonic_time () +
             klass->get_manifest_update_interval (demux);
       } else {
         GST_ELEMENT_ERROR (demux, STREAM, FAILED,
             (_("Internal data stream error.")), ("Could not update playlist"));
-        goto error;
+        GST_DEBUG_OBJECT (demux, "Stopped updates task because of error");
+        gst_task_stop (demux->priv->updates_task);
+        GST_MANIFEST_UNLOCK (demux);
+        goto end;
       }
     } else {
       GST_DEBUG_OBJECT (demux, "Updated playlist successfully");
-      GST_MANIFEST_LOCK (demux);
-      demux->priv->next_update =
-          g_get_monotonic_time () + klass->get_manifest_update_interval (demux);
-      /* Wake up download task */
-      g_cond_broadcast (&demux->manifest_cond);
-      GST_MANIFEST_UNLOCK (demux);
+      next_update = g_get_monotonic_time () +
+          klass->get_manifest_update_interval (demux);
+
+      /* Wake up download tasks */
+      g_mutex_lock (&demux->priv->manifest_update_lock);
+      g_cond_broadcast (&demux->priv->manifest_cond);
+      g_mutex_unlock (&demux->priv->manifest_update_lock);
     }
   }
 
+  GST_MANIFEST_UNLOCK (demux);
+
 quit:
   {
-    GST_DEBUG_OBJECT (demux, "Stopped updates task");
-    gst_task_stop (demux->priv->updates_task);
-    return;
+    GST_DEBUG_OBJECT (demux, "Stop updates task request detected.");
   }
 
-error:
+end:
   {
-    GST_DEBUG_OBJECT (demux, "Stopped updates task because of error");
-    gst_task_stop (demux->priv->updates_task);
+    return;
   }
 }
 
-
+/* must be called with manifest_lock taken */
 static gboolean
 gst_adaptive_demux_stream_push_event (GstAdaptiveDemuxStream * stream,
     GstEvent * event)
@@ -2487,6 +2999,7 @@
   return ret;
 }
 
+/* must be called with manifest_lock taken */
 static gboolean
 gst_adaptive_demux_is_live (GstAdaptiveDemux * demux)
 {
@@ -2497,6 +3010,7 @@
   return FALSE;
 }
 
+/* must be called with manifest_lock taken */
 static GstFlowReturn
 gst_adaptive_demux_stream_seek (GstAdaptiveDemux * demux,
     GstAdaptiveDemuxStream * stream, GstClockTime ts)
@@ -2508,6 +3022,7 @@
   return GST_FLOW_ERROR;
 }
 
+/* must be called with manifest_lock taken */
 static gboolean
 gst_adaptive_demux_stream_has_next_fragment (GstAdaptiveDemux * demux,
     GstAdaptiveDemuxStream * stream)
@@ -2521,24 +3036,24 @@
   return ret;
 }
 
+/* must be called with manifest_lock taken */
 GstFlowReturn
 gst_adaptive_demux_stream_advance_fragment (GstAdaptiveDemux * demux,
     GstAdaptiveDemuxStream * stream, GstClockTime duration)
 {
   GstFlowReturn ret;
 
-  GST_MANIFEST_LOCK (demux);
   if (stream->last_ret == GST_FLOW_OK) {
     stream->last_ret =
         gst_adaptive_demux_stream_advance_fragment_unlocked (demux, stream,
         duration);
   }
   ret = stream->last_ret;
-  GST_MANIFEST_UNLOCK (demux);
 
   return ret;
 }
 
+/* must be called with manifest_lock taken */
 GstFlowReturn
 gst_adaptive_demux_stream_advance_fragment_unlocked (GstAdaptiveDemux * demux,
     GstAdaptiveDemuxStream * stream, GstClockTime duration)
@@ -2550,10 +3065,6 @@
 
   stream->download_error_count = 0;
   g_clear_error (&stream->last_error);
-  stream->download_total_time +=
-      g_get_monotonic_time () - stream->download_chunk_start_time;
-  stream->fragment_total_time +=
-      g_get_monotonic_time () - stream->download_chunk_start_time;
 
   /* FIXME - url has no indication of byte ranges for subsegments */
   gst_element_post_message (GST_ELEMENT_CAST (demux),
@@ -2618,6 +3129,7 @@
   return ret;
 }
 
+/* must be called with manifest_lock taken */
 static gboolean
 gst_adaptive_demux_stream_select_bitrate (GstAdaptiveDemux *
     demux, GstAdaptiveDemuxStream * stream, guint64 bitrate)
@@ -2635,6 +3147,7 @@
   return FALSE;
 }
 
+/* must be called with manifest_lock taken */
 static GstFlowReturn
 gst_adaptive_demux_stream_update_fragment_info (GstAdaptiveDemux * demux,
     GstAdaptiveDemuxStream * stream)
@@ -2644,9 +3157,14 @@
   g_return_val_if_fail (klass->stream_update_fragment_info != NULL,
       GST_FLOW_ERROR);
 
+  /* Make sure the sub-class will update bitrate, or else
+   * we will later */
+  stream->fragment.bitrate = 0;
+
   return klass->stream_update_fragment_info (stream);
 }
 
+/* must be called with manifest_lock taken */
 static gint64
 gst_adaptive_demux_stream_get_fragment_waiting_time (GstAdaptiveDemux *
     demux, GstAdaptiveDemuxStream * stream)
@@ -2658,6 +3176,7 @@
   return 0;
 }
 
+/* must be called with manifest_lock taken */
 static GstFlowReturn
 gst_adaptive_demux_update_manifest_default (GstAdaptiveDemux * demux)
 {
@@ -2669,7 +3188,6 @@
   download = gst_uri_downloader_fetch_uri (demux->downloader,
       demux->manifest_uri, NULL, TRUE, TRUE, TRUE, NULL);
   if (download) {
-    GST_MANIFEST_LOCK (demux);
     g_free (demux->manifest_uri);
     g_free (demux->manifest_base_uri);
     if (download->redirect_permanent && download->redirect_uri) {
@@ -2684,7 +3202,6 @@
     g_object_unref (download);
     ret = klass->update_manifest_data (demux, buffer);
     gst_buffer_unref (buffer);
-    GST_MANIFEST_UNLOCK (demux);
     /* FIXME: Should the manifest uri vars be reverted to original
      * values if updating fails? */
   } else {
@@ -2694,6 +3211,7 @@
   return ret;
 }
 
+/* must be called with manifest_lock taken */
 static GstFlowReturn
 gst_adaptive_demux_update_manifest (GstAdaptiveDemux * demux)
 {
@@ -2704,10 +3222,8 @@
 
   if (ret == GST_FLOW_OK) {
     GstClockTime duration;
-    GST_MANIFEST_LOCK (demux);
     /* Send an updated duration message */
     duration = klass->get_duration (demux);
-    GST_MANIFEST_UNLOCK (demux);
     if (duration != GST_CLOCK_TIME_NONE) {
       GST_DEBUG_OBJECT (demux,
           "Sending duration message : %" GST_TIME_FORMAT,
@@ -2742,6 +3258,7 @@
   f->index_range_end = -1;
 }
 
+/* must be called with manifest_lock taken */
 static gboolean
 gst_adaptive_demux_has_next_period (GstAdaptiveDemux * demux)
 {
@@ -2754,6 +3271,7 @@
   return ret;
 }
 
+/* must be called with manifest_lock taken */
 static void
 gst_adaptive_demux_advance_period (GstAdaptiveDemux * demux)
 {
@@ -2766,18 +3284,3 @@
   gst_adaptive_demux_expose_streams (demux, FALSE);
   gst_adaptive_demux_start_tasks (demux);
 }
-
-static void
-gst_adaptive_demux_stream_download_wait (GstAdaptiveDemuxStream * stream,
-    GstClockTime time_diff)
-{
-  gint64 end_time = g_get_monotonic_time () + time_diff / GST_USECOND;
-
-  GST_DEBUG_OBJECT (stream->pad, "Download waiting for %" GST_TIME_FORMAT,
-      GST_TIME_ARGS (time_diff));
-  g_mutex_lock (&stream->fragment_download_lock);
-  g_cond_wait_until (&stream->fragment_download_cond,
-      &stream->fragment_download_lock, end_time);
-  g_mutex_unlock (&stream->fragment_download_lock);
-  GST_DEBUG_OBJECT (stream->pad, "Download finished waiting");
-}
diff --git a/gst-libs/gst/adaptivedemux/gstadaptivedemux.h b/gst-libs/gst/adaptivedemux/gstadaptivedemux.h
index b65b6d6..b95af59 100644
--- a/gst-libs/gst/adaptivedemux/gstadaptivedemux.h
+++ b/gst-libs/gst/adaptivedemux/gstadaptivedemux.h
@@ -72,10 +72,6 @@
  */
 #define GST_ADAPTIVE_DEMUX_STATISTICS_MESSAGE_NAME "adaptive-streaming-statistics"
 
-#define GST_MANIFEST_GET_LOCK(d) (&(GST_ADAPTIVE_DEMUX_CAST(d)->manifest_lock))
-#define GST_MANIFEST_LOCK(d) (g_mutex_lock (GST_MANIFEST_GET_LOCK (d)))
-#define GST_MANIFEST_UNLOCK(d) (g_mutex_unlock (GST_MANIFEST_GET_LOCK (d)))
-
 #define GST_ELEMENT_ERROR_FROM_ERROR(el, msg, err) G_STMT_START { \
   gchar *__dbg = g_strdup_printf ("%s: %s", msg, err->message);         \
   GST_WARNING_OBJECT (el, "error: %s", __dbg);                          \
@@ -109,6 +105,10 @@
   gchar *index_uri;
   gint64 index_range_start;
   gint64 index_range_end;
+
+  /* Nominal bitrate as provided by
+   * sub-class or calculated by base-class */
+  guint bitrate;
 };
 
 struct _GstAdaptiveDemuxStream
@@ -136,15 +136,21 @@
   gboolean restart_download;
   gboolean discont;
 
+  gboolean downloading_first_buffer;
   gboolean downloading_header;
   gboolean downloading_index;
 
+  gboolean bitrate_changed;
+
   /* download tooling */
   GstElement *src;
   GstPad *src_srcpad;
+  GstElement *uri_handler;
+  GstElement *queue;
   GMutex fragment_download_lock;
   GCond fragment_download_cond;
-  gboolean download_finished;
+  gboolean download_finished;   /* protected by fragment_download_lock */
+  gboolean cancelled;           /* protected by fragment_download_lock */
   gboolean starting_fragment;
   gboolean first_fragment_buffer;
   gint64 download_start_time;
@@ -153,15 +159,6 @@
   gint64 download_total_bytes;
   guint64 current_download_rate;
 
-  /* Per fragment download information */
-  guint64 fragment_total_time;
-  guint64 fragment_total_size;
-
-  /* Average for the last fragments */
-  guint64 moving_bitrate;
-  guint moving_index;
-  guint64 *fragment_bitrates;
-
   GstAdaptiveDemuxStreamFragment fragment;
 
   guint download_error_count;
@@ -192,16 +189,10 @@
 
   GstSegment segment;
 
-  gboolean cancelled;
-
-  GMutex manifest_lock;
-  GCond manifest_cond;
-
   gchar *manifest_uri;
   gchar *manifest_base_uri;
 
   /* Properties */
-  guint num_lookback_fragments;
   gfloat bitrate_limit;         /* limit of the available bitrate to use */
   guint connection_speed;
 
@@ -451,10 +442,6 @@
 void gst_adaptive_demux_stream_queue_event (GstAdaptiveDemuxStream * stream,
     GstEvent * event);
 
-GstFlowReturn
-gst_adaptive_demux_stream_advance_fragment_unlocked (GstAdaptiveDemux * demux,
-    GstAdaptiveDemuxStream * stream, GstClockTime duration);
-
 G_END_DECLS
 
 #endif
diff --git a/gst-libs/gst/base/Makefile.in b/gst-libs/gst/base/Makefile.in
index ad5b62e..d73b45a 100644
--- a/gst-libs/gst/base/Makefile.in
+++ b/gst-libs/gst/base/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst-libs/gst/base/gstaggregator.c b/gst-libs/gst/base/gstaggregator.c
index 1416f6c..ec297df 100644
--- a/gst-libs/gst/base/gstaggregator.c
+++ b/gst-libs/gst/base/gstaggregator.c
@@ -215,6 +215,8 @@
   gboolean pending_flush_stop;
   gboolean pending_eos;
 
+  gboolean first_buffer;
+
   GQueue buffers;
   guint num_buffers;
   GstClockTime head_position;
@@ -288,7 +290,7 @@
   gboolean peer_latency_live;   /* protected by src_lock */
   GstClockTime peer_latency_min;        /* protected by src_lock */
   GstClockTime peer_latency_max;        /* protected by src_lock */
-  gboolean has_peer_latency;
+  gboolean has_peer_latency;    /* protected by src_lock */
 
   GstClockTime sub_latency_min; /* protected by src_lock */
   GstClockTime sub_latency_max; /* protected by src_lock */
@@ -298,7 +300,7 @@
   GMutex src_lock;
   GCond src_cond;
 
-  gboolean first_buffer;
+  gboolean first_buffer;        /* protected by object lock */
   GstAggregatorStartTimeSelection start_time_selection;
   GstClockTime start_time;
 
@@ -311,6 +313,7 @@
   GstEvent *event;
   gboolean result;
   gboolean flush;
+  gboolean only_to_active_pads;
 
   gboolean one_actually_seeked;
 } EventData;
@@ -698,9 +701,8 @@
     }
 
     GST_DEBUG_OBJECT (self,
-        "clock returned %d (jitter: %s%" GST_TIME_FORMAT ")",
-        status, (jitter < 0 ? "-" : " "),
-        GST_TIME_ARGS ((jitter < 0 ? -jitter : jitter)));
+        "clock returned %d (jitter: %" GST_STIME_FORMAT ")",
+        status, GST_STIME_ARGS (jitter));
 
     /* we timed out */
     if (status == GST_CLOCK_OK || status == GST_CLOCK_EARLY) {
@@ -858,7 +860,6 @@
   GstAggregatorClass *klass;
   gboolean result;
 
-  self->priv->running = TRUE;
   self->priv->send_stream_start = TRUE;
   self->priv->send_segment = TRUE;
   self->priv->send_eos = TRUE;
@@ -1086,6 +1087,8 @@
         GST_OBJECT_UNLOCK (self);
       }
 
+      aggpad->priv->first_buffer = TRUE;
+
       /* We never forward the event */
       goto eat;
     }
@@ -1303,42 +1306,62 @@
   SRC_UNLOCK (self);
 }
 
+static GstAggregatorPad *
+gst_aggregator_default_create_new_pad (GstAggregator * self,
+    GstPadTemplate * templ, const gchar * req_name, const GstCaps * caps)
+{
+  GstAggregatorPad *agg_pad;
+  GstAggregatorPrivate *priv = self->priv;
+  gint serial = 0;
+  gchar *name = NULL;
+
+  if (templ->direction != GST_PAD_SINK ||
+      g_strcmp0 (templ->name_template, "sink_%u"))
+    goto not_sink;
+
+  GST_OBJECT_LOCK (self);
+  if (req_name == NULL || strlen (req_name) < 6
+      || !g_str_has_prefix (req_name, "sink_")) {
+    /* no name given when requesting the pad, use next available int */
+    priv->padcount++;
+  } else {
+    /* parse serial number from requested padname */
+    serial = g_ascii_strtoull (&req_name[5], NULL, 10);
+    if (serial >= priv->padcount)
+      priv->padcount = serial;
+  }
+
+  name = g_strdup_printf ("sink_%u", priv->padcount);
+  agg_pad = g_object_new (GST_AGGREGATOR_GET_CLASS (self)->sinkpads_type,
+      "name", name, "direction", GST_PAD_SINK, "template", templ, NULL);
+  g_free (name);
+
+  GST_OBJECT_UNLOCK (self);
+
+  return agg_pad;
+
+  /* errors */
+not_sink:
+  {
+    GST_WARNING_OBJECT (self, "request new pad that is not a SINK pad\n");
+    return NULL;
+  }
+}
+
 static GstPad *
 gst_aggregator_request_new_pad (GstElement * element,
     GstPadTemplate * templ, const gchar * req_name, const GstCaps * caps)
 {
   GstAggregator *self;
   GstAggregatorPad *agg_pad;
-
-  GstElementClass *klass = GST_ELEMENT_GET_CLASS (element);
+  GstAggregatorClass *klass = GST_AGGREGATOR_GET_CLASS (element);
   GstAggregatorPrivate *priv = GST_AGGREGATOR (element)->priv;
 
   self = GST_AGGREGATOR (element);
 
-  if (templ == gst_element_class_get_pad_template (klass, "sink_%u")) {
-    gint serial = 0;
-    gchar *name = NULL;
-
-    GST_OBJECT_LOCK (element);
-    if (req_name == NULL || strlen (req_name) < 6
-        || !g_str_has_prefix (req_name, "sink_")) {
-      /* no name given when requesting the pad, use next available int */
-      priv->padcount++;
-    } else {
-      /* parse serial number from requested padname */
-      serial = g_ascii_strtoull (&req_name[5], NULL, 10);
-      if (serial >= priv->padcount)
-        priv->padcount = serial;
-    }
-
-    name = g_strdup_printf ("sink_%u", priv->padcount);
-    agg_pad = g_object_new (GST_AGGREGATOR_GET_CLASS (self)->sinkpads_type,
-        "name", name, "direction", GST_PAD_SINK, "template", templ, NULL);
-    g_free (name);
-
-    GST_OBJECT_UNLOCK (element);
-
-  } else {
+  agg_pad = klass->create_new_pad (self, templ, req_name, caps);
+  if (!agg_pad) {
+    GST_ERROR_OBJECT (element, "Couldn't create new pad");
     return NULL;
   }
 
@@ -1401,18 +1424,6 @@
   else
     max = GST_CLOCK_TIME_NONE;
 
-  if (live && min > max) {
-    GST_ELEMENT_WARNING (self, CORE, NEGOTIATION,
-        ("%s", "Latency too big"),
-        ("The requested latency value is too big for the current pipeline. "
-            "Limiting to %" G_GINT64_FORMAT, max));
-    min = max;
-    /* FIXME: This could in theory become negative, but in
-     * that case all is lost anyway */
-    self->priv->latency -= min - max;
-    /* FIXME: shouldn't we g_object_notify() the change here? */
-  }
-
   SRC_BROADCAST (self);
 
   GST_DEBUG_OBJECT (self, "configured latency live:%s min:%" G_GINT64_FORMAT
@@ -1554,9 +1565,14 @@
   GstAggregatorPad *aggpad = GST_AGGREGATOR_PAD (pad);
 
   if (peer) {
-    ret = gst_pad_send_event (peer, gst_event_ref (evdata->event));
-    GST_DEBUG_OBJECT (pad, "return of event push is %d", ret);
-    gst_object_unref (peer);
+    if (evdata->only_to_active_pads && aggpad->priv->first_buffer) {
+      GST_DEBUG_OBJECT (pad, "not sending event to inactive pad");
+      ret = TRUE;
+    } else {
+      ret = gst_pad_send_event (peer, gst_event_ref (evdata->event));
+      GST_DEBUG_OBJECT (pad, "return of event push is %d", ret);
+      gst_object_unref (peer);
+    }
   }
 
   if (ret == FALSE) {
@@ -1601,7 +1617,7 @@
 
 static EventData
 gst_aggregator_forward_event_to_all_sinkpads (GstAggregator * self,
-    GstEvent * event, gboolean flush)
+    GstEvent * event, gboolean flush, gboolean only_to_active_pads)
 {
   EventData evdata;
 
@@ -1609,6 +1625,7 @@
   evdata.result = TRUE;
   evdata.flush = flush;
   evdata.one_actually_seeked = FALSE;
+  evdata.only_to_active_pads = only_to_active_pads;
 
   /* We first need to set all pads as flushing in a first pass
    * as flush_start flush_stop is sometimes sent synchronously
@@ -1668,7 +1685,8 @@
   GST_OBJECT_UNLOCK (self);
 
   /* forward the seek upstream */
-  evdata = gst_aggregator_forward_event_to_all_sinkpads (self, event, flush);
+  evdata =
+      gst_aggregator_forward_event_to_all_sinkpads (self, event, flush, FALSE);
   event = NULL;
 
   if (!evdata.result || !evdata.one_actually_seeked) {
@@ -1711,7 +1729,12 @@
     }
   }
 
-  evdata = gst_aggregator_forward_event_to_all_sinkpads (self, event, FALSE);
+  /* Don't forward QOS events to pads that had no active buffer yet. Otherwise
+   * they will receive a QOS event that has earliest_time=0 (because we can't
+   * have negative timestamps), and consider their buffer as too late */
+  evdata =
+      gst_aggregator_forward_event_to_all_sinkpads (self, event, FALSE,
+      GST_EVENT_TYPE (event) == GST_EVENT_QOS);
   res = evdata.result;
 
 done:
@@ -1849,7 +1872,7 @@
  * Gets the latency value. See gst_aggregator_set_latency for
  * more details.
  *
- * Returns: The time in nanoseconds to wait for data to arrive on a sink pad 
+ * Returns: The time in nanoseconds to wait for data to arrive on a sink pad
  * before a pad is deemed unresponsive. A value of -1 means an
  * unlimited time.
  */
@@ -1932,6 +1955,8 @@
   klass->src_event = gst_aggregator_default_src_event;
   klass->src_query = gst_aggregator_default_src_query;
 
+  klass->create_new_pad = gst_aggregator_default_create_new_pad;
+
   gstelement_class->request_new_pad =
       GST_DEBUG_FUNCPTR (gst_aggregator_request_new_pad);
   gstelement_class->send_event = GST_DEBUG_FUNCPTR (gst_aggregator_send_event);
@@ -2131,8 +2156,11 @@
 
   buf_pts = GST_BUFFER_PTS (actual_buf);
 
+  aggpad->priv->first_buffer = FALSE;
+
   for (;;) {
     SRC_LOCK (self);
+    GST_OBJECT_LOCK (self);
     PAD_LOCK (aggpad);
     if (gst_aggregator_pad_has_space (self, aggpad)
         && aggpad->priv->flow_return == GST_FLOW_OK) {
@@ -2149,10 +2177,12 @@
 
     flow_return = aggpad->priv->flow_return;
     if (flow_return != GST_FLOW_OK) {
+      GST_OBJECT_UNLOCK (self);
       SRC_UNLOCK (self);
       goto flushing;
     }
     GST_DEBUG_OBJECT (aggpad, "Waiting for buffer to be consumed");
+    GST_OBJECT_UNLOCK (self);
     SRC_UNLOCK (self);
     PAD_WAIT_EVENT (aggpad);
 
@@ -2168,6 +2198,7 @@
         start_time = 0;
         break;
       case GST_AGGREGATOR_START_TIME_SELECTION_FIRST:
+        GST_OBJECT_LOCK (aggpad);
         if (aggpad->segment.format == GST_FORMAT_TIME) {
           start_time = buf_pts;
           if (start_time != -1) {
@@ -2183,6 +2214,7 @@
               "as the segment is a %s segment instead of a time segment",
               gst_format_get_name (aggpad->segment.format));
         }
+        GST_OBJECT_UNLOCK (aggpad);
         break;
       case GST_AGGREGATOR_START_TIME_SELECTION_SET:
         start_time = self->priv->start_time;
@@ -2203,6 +2235,7 @@
   }
 
   PAD_UNLOCK (aggpad);
+  GST_OBJECT_UNLOCK (self);
   SRC_UNLOCK (self);
 
 done:
@@ -2414,6 +2447,8 @@
 
   g_mutex_init (&pad->priv->flush_lock);
   g_mutex_init (&pad->priv->lock);
+
+  pad->priv->first_buffer = TRUE;
 }
 
 /**
diff --git a/gst-libs/gst/base/gstaggregator.h b/gst-libs/gst/base/gstaggregator.h
index 8eda7dc..e1afea4 100644
--- a/gst-libs/gst/base/gstaggregator.h
+++ b/gst-libs/gst/base/gstaggregator.h
@@ -245,6 +245,11 @@
 
   GstClockTime      (*get_next_time)  (GstAggregator    *  aggregator);
 
+  GstAggregatorPad * (*create_new_pad) (GstAggregator  * self,
+                                        GstPadTemplate * templ,
+                                        const gchar    * req_name,
+                                        const GstCaps  * caps);
+
   /*< private >*/
   gpointer          _gst_reserved[GST_PADDING_LARGE];
 };
diff --git a/gst-libs/gst/basecamerabinsrc/Makefile.in b/gst-libs/gst/basecamerabinsrc/Makefile.in
index 66daa27..6bf6b54 100644
--- a/gst-libs/gst/basecamerabinsrc/Makefile.in
+++ b/gst-libs/gst/basecamerabinsrc/Makefile.in
@@ -265,6 +265,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -302,6 +304,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -329,6 +333,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -347,6 +353,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -357,6 +365,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -382,6 +392,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -407,6 +419,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -538,6 +552,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -595,8 +611,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -666,6 +686,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst-libs/gst/codecparsers/Makefile.in b/gst-libs/gst/codecparsers/Makefile.in
index 7abad77..9e44209 100644
--- a/gst-libs/gst/codecparsers/Makefile.in
+++ b/gst-libs/gst/codecparsers/Makefile.in
@@ -293,6 +293,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -330,6 +332,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -357,6 +361,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -375,6 +381,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -385,6 +393,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -410,6 +420,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -435,6 +447,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -566,6 +580,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -623,8 +639,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -694,6 +714,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst-libs/gst/codecparsers/gsth264parser.c b/gst-libs/gst/codecparsers/gsth264parser.c
index 4092acb..9dc9822 100644
--- a/gst-libs/gst/codecparsers/gsth264parser.c
+++ b/gst-libs/gst/codecparsers/gsth264parser.c
@@ -428,17 +428,10 @@
 
   /* set default values for fields that might not be present in the bitstream
      and have valid defaults */
-  vui->aspect_ratio_idc = 0;
   vui->video_format = 5;
-  vui->video_full_range_flag = 0;
   vui->colour_primaries = 2;
   vui->transfer_characteristics = 2;
   vui->matrix_coefficients = 2;
-  vui->chroma_sample_loc_type_top_field = 0;
-  vui->chroma_sample_loc_type_bottom_field = 0;
-  vui->low_delay_hrd_flag = 0;
-  vui->par_n = 0;
-  vui->par_d = 0;
 
   READ_UINT8 (nr, vui->aspect_ratio_info_present_flag, 1);
   if (vui->aspect_ratio_info_present_flag) {
@@ -780,11 +773,9 @@
   default_luma_weight = 1 << p->luma_log2_weight_denom;
   for (i = 0; i < G_N_ELEMENTS (p->luma_weight_l0); i++)
     p->luma_weight_l0[i] = default_luma_weight;
-  memset (p->luma_offset_l0, 0, sizeof (p->luma_offset_l0));
   if (GST_H264_IS_B_SLICE (slice)) {
     for (i = 0; i < G_N_ELEMENTS (p->luma_weight_l1); i++)
       p->luma_weight_l1[i] = default_luma_weight;
-    memset (p->luma_offset_l1, 0, sizeof (p->luma_offset_l1));
   }
 
   if (chroma_array_type != 0) {
@@ -795,13 +786,11 @@
       p->chroma_weight_l0[i][0] = default_chroma_weight;
       p->chroma_weight_l0[i][1] = default_chroma_weight;
     }
-    memset (p->chroma_offset_l0, 0, sizeof (p->chroma_offset_l0));
     if (GST_H264_IS_B_SLICE (slice)) {
       for (i = 0; i < G_N_ELEMENTS (p->chroma_weight_l1); i++) {
         p->chroma_weight_l1[i][0] = default_chroma_weight;
         p->chroma_weight_l1[i][1] = default_chroma_weight;
       }
-      memset (p->chroma_offset_l1, 0, sizeof (p->chroma_offset_l1));
     }
   }
 
@@ -985,12 +974,6 @@
     goto error;
   }
 
-  /* default values */
-  tim->cpb_removal_delay = 0;
-  tim->dpb_output_delay = 0;
-  tim->pic_struct_present_flag = FALSE;
-  memset (tim->clock_timestamp_flag, 0, 3);
-
   if (nalparser->last_sps->vui_parameters_present_flag) {
     GstH264VUIParams *vui = &nalparser->last_sps->vui_parameters;
 
@@ -1154,7 +1137,8 @@
 
   GST_DEBUG ("parsing \"Sei message\"");
 
-  sei->payloadType = 0;
+  memset (sei, 0, sizeof (*sei));
+
   do {
     READ_UINT8 (nr, payload_type_byte, 8);
     sei->payloadType += payload_type_byte;
@@ -1294,6 +1278,8 @@
 {
   gint off1;
 
+  memset (nalu, 0, sizeof (*nalu));
+
   if (size < offset + 4) {
     GST_DEBUG ("Can't parse, buffer has too small size %" G_GSIZE_FORMAT
         ", offset %u", size, offset);
@@ -1414,6 +1400,8 @@
 {
   GstBitReader br;
 
+  memset (nalu, 0, sizeof (*nalu));
+
   if (size < offset + nal_length_size) {
     GST_DEBUG ("Can't parse, buffer has too small size %" G_GSIZE_FORMAT
         ", offset %u", size, offset);
@@ -1512,22 +1500,14 @@
   guint subhc[] = { 1, 2, 1, 1 };
   GstH264VUIParams *vui = NULL;
 
+  memset (sps, 0, sizeof (*sps));
+
   /* set default values for fields that might not be present in the bitstream
      and have valid defaults */
   sps->extension_type = GST_H264_NAL_EXTENSION_NONE;
   sps->chroma_format_idc = 1;
-  sps->separate_colour_plane_flag = 0;
-  sps->bit_depth_luma_minus8 = 0;
-  sps->bit_depth_chroma_minus8 = 0;
   memset (sps->scaling_lists_4x4, 16, 96);
   memset (sps->scaling_lists_8x8, 16, 384);
-  memset (&sps->vui_parameters, 0, sizeof (sps->vui_parameters));
-  sps->mb_adaptive_frame_field_flag = 0;
-  sps->frame_crop_left_offset = 0;
-  sps->frame_crop_right_offset = 0;
-  sps->frame_crop_top_offset = 0;
-  sps->frame_crop_bottom_offset = 0;
-  sps->delta_pic_order_always_zero_flag = 0;
 
   READ_UINT8 (nr, sps->profile_idc, 8);
   READ_UINT8 (nr, sps->constraint_set0_flag, 1);
@@ -1616,9 +1596,7 @@
   }
 
   /* calculate ChromaArrayType */
-  if (sps->separate_colour_plane_flag)
-    sps->chroma_array_type = 0;
-  else
+  if (!sps->separate_colour_plane_flag)
     sps->chroma_array_type = sps->chroma_format_idc;
 
   /* Calculate  width and height */
@@ -1936,6 +1914,8 @@
   nal_reader_init (&nr, nalu->data + nalu->offset + nalu->header_bytes,
       nalu->size - nalu->header_bytes);
 
+  memset (pps, 0, sizeof (*pps));
+
   READ_UE_MAX (&nr, pps->id, GST_H264_MAX_PPS_COUNT - 1);
   READ_UE_MAX (&nr, sps_id, GST_H264_MAX_SPS_COUNT - 1);
 
@@ -1951,8 +1931,6 @@
 
   /* set default values for fields that might not be present in the bitstream
      and have valid defaults */
-  pps->slice_group_id = NULL;
-  pps->transform_8x8_mode_flag = 0;
   memcpy (&pps->scaling_lists_4x4, &sps->scaling_lists_4x4, 96);
   memcpy (&pps->scaling_lists_8x8, &sps->scaling_lists_8x8, 384);
 
@@ -2113,12 +2091,13 @@
   GstH264PPS *pps;
   GstH264SPS *sps;
 
+  memset (slice, 0, sizeof (*slice));
+
   if (!nalu->size) {
     GST_DEBUG ("Invalid Nal Unit");
     return GST_H264_PARSER_ERROR;
   }
 
-
   nal_reader_init (&nr, nalu->data + nalu->offset + nalu->header_bytes,
       nalu->size - nalu->header_bytes);
 
@@ -2153,17 +2132,8 @@
 
   /* set default values for fields that might not be present in the bitstream
      and have valid defaults */
-  slice->field_pic_flag = 0;
-  slice->bottom_field_flag = 0;
-  slice->delta_pic_order_cnt_bottom = 0;
-  slice->delta_pic_order_cnt[0] = 0;
-  slice->delta_pic_order_cnt[1] = 0;
-  slice->redundant_pic_cnt = 0;
   slice->num_ref_idx_l0_active_minus1 = pps->num_ref_idx_l0_active_minus1;
   slice->num_ref_idx_l1_active_minus1 = pps->num_ref_idx_l1_active_minus1;
-  slice->disable_deblocking_filter_idc = 0;
-  slice->slice_alpha_c0_offset_div2 = 0;
-  slice->slice_beta_offset_div2 = 0;
 
   if (sps->separate_colour_plane_flag)
     READ_UINT8 (&nr, slice->colour_plane_id, 2);
diff --git a/gst-libs/gst/codecparsers/gsth265parser.c b/gst-libs/gst/codecparsers/gsth265parser.c
index 77a4610..0984225 100644
--- a/gst-libs/gst/codecparsers/gsth265parser.c
+++ b/gst-libs/gst/codecparsers/gsth265parser.c
@@ -266,11 +266,6 @@
   guint i, j;
   GST_DEBUG ("parsing \"ProfileTierLevel parameters\"");
 
-  /* set default values for fields that might not be present in the
-   * bitstream and have valid defaults */
-  for (i = 0; i < maxNumSubLayersMinus1; i++)
-    ptl->sub_layer_tier_flag[i] = 0;
-
   READ_UINT8 (nr, ptl->profile_space, 2);
   READ_UINT8 (nr, ptl->tier_flag, 1);
   READ_UINT8 (nr, ptl->profile_idc, 5);
@@ -336,11 +331,6 @@
 
   GST_DEBUG ("parsing \"SubLayer HRD Parameters\"");
 
-  /* set default values for fields that might not be present in the bitstream
-     and have valid defaults */
-  for (i = 0; i <= CpbCnt; i++)
-    sub_hrd->cbr_flag[i] = 0;
-
   for (i = 0; i <= CpbCnt; i++) {
     READ_UE_MAX (nr, sub_hrd->bit_rate_value_minus1[i], G_MAXUINT32 - 1);
     READ_UE_MAX (nr, sub_hrd->cpb_size_value_minus1[i], G_MAXUINT32 - 1);
@@ -370,16 +360,9 @@
 
   /* set default values for fields that might not be present in the bitstream
      and have valid defaults */
-  hrd->sub_pic_hrd_params_present_flag = 0;
-  hrd->sub_pic_cpb_params_in_pic_timing_sei_flag = 0;
   hrd->initial_cpb_removal_delay_length_minus1 = 23;
   hrd->au_cpb_removal_delay_length_minus1 = 23;
   hrd->dpb_output_delay_length_minus1 = 23;
-  for (i = 0; i <= maxNumSubLayersMinus1; i++) {
-    hrd->fixed_pic_rate_general_flag[i] = 0;
-    hrd->low_delay_hrd_flag[i] = 0;
-    hrd->cpb_cnt_minus1[i] = 0;
-  }
 
   if (commonInfPresentFlag) {
     READ_UINT8 (nr, hrd->nal_hrd_parameters_present_flag, 1);
@@ -454,35 +437,19 @@
 
   /* set default values for fields that might not be present in the bitstream
      and have valid defaults */
-  vui->aspect_ratio_idc = 0;
   vui->video_format = 5;
-  vui->video_full_range_flag = 0;
   vui->colour_primaries = 2;
   vui->transfer_characteristics = 2;
   vui->matrix_coefficients = 2;
-  vui->chroma_sample_loc_type_top_field = 0;
-  vui->chroma_sample_loc_type_bottom_field = 0;
-  vui->neutral_chroma_indication_flag = 0;
-  vui->field_seq_flag = 0;
-  vui->def_disp_win_left_offset = 0;
-  vui->def_disp_win_right_offset = 0;
-  vui->def_disp_win_top_offset = 0;
-  vui->def_disp_win_bottom_offset = 0;
-  vui->tiles_fixed_structure_flag = 0;
   vui->motion_vectors_over_pic_boundaries_flag = 1;
-  vui->min_spatial_segmentation_idc = 0;
   vui->max_bytes_per_pic_denom = 2;
   vui->max_bits_per_min_cu_denom = 1;
   vui->log2_max_mv_length_horizontal = 15;
   vui->log2_max_mv_length_vertical = 15;
-  vui->par_n = 0;
-  vui->par_d = 0;
 
   if (sps && sps->profile_tier_level.progressive_source_flag
       && sps->profile_tier_level.interlaced_source_flag)
     vui->frame_field_info_present_flag = 1;
-  else
-    vui->frame_field_info_present_flag = 0;
 
   READ_UINT8 (nr, vui->aspect_ratio_info_present_flag, 1);
   if (vui->aspect_ratio_info_present_flag) {
@@ -755,8 +722,6 @@
 
   /* set default values for fields that might not be present in the bitstream
      and have valid defaults */
-  stRPS->inter_ref_pic_set_prediction_flag = 0;
-  stRPS->delta_idx_minus1 = 0;
   for (j = 0; j < 16; j++)
     use_delta_flag[j] = 1;
 
@@ -892,14 +857,6 @@
   GstH265RefPicListModification *rpl_mod = &slice->ref_pic_list_modification;
   const guint n = ceil_log2 (NumPocTotalCurr);
 
-  /* set default values */
-  rpl_mod->ref_pic_list_modification_flag_l0 = 0;
-  rpl_mod->ref_pic_list_modification_flag_l1 = 0;
-  for (i = 0; i < slice->num_ref_idx_l0_active_minus1; i++)
-    rpl_mod->list_entry_l0[i] = 0;
-  for (i = 0; i <= slice->num_ref_idx_l1_active_minus1; i++)
-    rpl_mod->list_entry_l1[i] = 0;
-
   READ_UINT8 (nr, rpl_mod->ref_pic_list_modification_flag_l0, 1);
 
   if (rpl_mod->ref_pic_list_modification_flag_l0) {
@@ -938,19 +895,6 @@
 
   READ_UE_MAX (nr, p->luma_log2_weight_denom, 7);
 
-  /* set default values */
-  for (i = 0; i < G_N_ELEMENTS (p->chroma_weight_l0_flag); i++) {
-    p->chroma_weight_l0_flag[i] = 0;
-    p->luma_offset_l0[i] = 0;
-  }
-
-  if (GST_H265_IS_B_SLICE (slice)) {
-    for (i = 0; i < G_N_ELEMENTS (p->luma_weight_l1_flag); i++) {
-      p->chroma_weight_l1_flag[i] = 0;
-      p->luma_offset_l1[i] = 0;
-    }
-  }
-
   if (sps->chroma_format_idc != 0) {
     READ_SE_ALLOWED (nr, p->delta_chroma_log2_weight_denom,
         (0 - p->luma_log2_weight_denom), (7 - p->luma_log2_weight_denom));
@@ -1022,11 +966,6 @@
   }
   per->sps = sps;
 
-  /* set default values if not present */
-  per->irap_cpb_params_present_flag = 0;
-  per->cpb_delay_offset = 0;
-  per->dpb_delay_offset = 0;
-
   if (sps->vui_parameters_present_flag) {
     GstH265VUIParams *vui = &sps->vui_params;
     GstH265HRDParams *hrd = &vui->hrd_params;
@@ -1096,7 +1035,6 @@
   profile_tier_level = &parser->last_sps->profile_tier_level;
 
   /* set default values */
-  tim->pic_struct = 0;
   if (!profile_tier_level->progressive_source_flag
       && profile_tier_level->interlaced_source_flag)
     tim->source_scan_type = 0;
@@ -1220,6 +1158,8 @@
 {
   gint off1;
 
+  memset (nalu, 0, sizeof (*nalu));
+
   if (size < offset + 4) {
     GST_DEBUG ("Can't parse, buffer has too small size %" G_GSIZE_FORMAT
         ", offset %u", size, offset);
@@ -1335,6 +1275,8 @@
 {
   GstBitReader br;
 
+  memset (nalu, 0, sizeof (*nalu));
+
   if (size < offset + nal_length_size) {
     GST_DEBUG ("Can't parse, buffer has too small size %" G_GSIZE_FORMAT
         ", offset %u", size, offset);
@@ -1450,8 +1392,8 @@
   nal_reader_init (&nr, nalu->data + nalu->offset + nalu->header_bytes,
       nalu->size - nalu->header_bytes);
 
-  memset (&vps->profile_tier_level, 0, sizeof (vps->profile_tier_level));
-  memset (&vps->hrd_params, 0, sizeof (vps->hrd_params));
+  memset (vps, 0, sizeof (*vps));
+
   vps->cprms_present_flag = 1;
 
   READ_UINT8 (&nr, vps->id, 4);
@@ -1594,17 +1536,7 @@
   nal_reader_init (&nr, nalu->data + nalu->offset + nalu->header_bytes,
       nalu->size - nalu->header_bytes);
 
-  /* set default values for fields that might not be present in the bitstream
-     and have valid defaults */
-  memset (&sps->profile_tier_level, 0, sizeof (sps->profile_tier_level));
-  memset (sps->short_term_ref_pic_set, 0, sizeof (sps->short_term_ref_pic_set));
-  sps->scaling_list_data_present_flag = 0;
-  sps->separate_colour_plane_flag = 0;
-  sps->conf_win_left_offset = 0;
-  sps->conf_win_right_offset = 0;
-  sps->conf_win_top_offset = 0;
-  sps->conf_win_bottom_offset = 0;
-  sps->pcm_loop_filter_disabled_flag = 0;
+  memset (sps, 0, sizeof (*sps));
 
   READ_UINT8 (&nr, vps_id, 4);
   vps = gst_h265_parser_get_vps (parser, vps_id);
@@ -1722,9 +1654,7 @@
   READ_UINT8 (&nr, sps->sps_extension_flag, 1);
 
   /* calculate ChromaArrayType */
-  if (sps->separate_colour_plane_flag)
-    sps->chroma_array_type = 0;
-  else
+  if (!sps->separate_colour_plane_flag)
     sps->chroma_array_type = sps->chroma_format_idc;
 
   /* Calculate  width and height */
@@ -1804,6 +1734,8 @@
   nal_reader_init (&nr, nalu->data + nalu->offset + nalu->header_bytes,
       nalu->size - nalu->header_bytes);
 
+  memset (pps, 0, sizeof (*pps));
+
   READ_UE_MAX (&nr, pps->id, GST_H265_MAX_PPS_COUNT - 1);
   READ_UE_MAX (&nr, sps_id, GST_H265_MAX_SPS_COUNT - 1);
 
@@ -1826,15 +1758,8 @@
 
   /* set default values for fields that might not be present in the bitstream
      and have valid defaults */
-  pps->diff_cu_qp_delta_depth = 0;
-  pps->num_tile_columns_minus1 = 0;
-  pps->num_tile_rows_minus1 = 0;
   pps->uniform_spacing_flag = 1;
   pps->loop_filter_across_tiles_enabled_flag = 1;
-  pps->deblocking_filter_override_enabled_flag = 0;
-  pps->deblocking_filter_disabled_flag = 0;
-  pps->beta_offset_div2 = 0;
-  pps->tc_offset_div2 = 0;
 
   READ_UINT8 (&nr, pps->dependent_slice_segments_enabled_flag, 1);
   READ_UINT8 (&nr, pps->output_flag_present_flag, 1);
@@ -1990,6 +1915,8 @@
   guint32 PicSizeInCtbsY;
   gint NumPocTotalCurr = 0;
 
+  memset (slice, 0, sizeof (*slice));
+
   if (!nalu->size) {
     GST_DEBUG ("Invalid Nal Unit");
     return GST_H265_PARSER_ERROR;
@@ -2026,32 +1953,12 @@
   PicSizeInCtbsY = pps->PicWidthInCtbsY * pps->PicHeightInCtbsY;
   /* set default values for fields that might not be present in the bitstream
    * and have valid defaults */
-  slice->dependent_slice_segment_flag = 0;
-  slice->segment_address = 0;
   slice->pic_output_flag = 1;
-  slice->pic_order_cnt_lsb = 0;
-  slice->short_term_ref_pic_set_idx = 0;
-  slice->num_long_term_sps = 0;
-  slice->num_long_term_pics = 0;
-  for (i = 0; i < 16; i++) {
-    slice->lt_idx_sps[i] = 0;
-    slice->delta_poc_msb_cycle_lt[i] = 0;
-  }
-  slice->temporal_mvp_enabled_flag = 0;
-  slice->sao_luma_flag = 0;
-  slice->sao_chroma_flag = 0;
-  slice->cabac_init_flag = 0;
   slice->collocated_from_l0_flag = 1;
-  slice->cb_qp_offset = 0;
-  slice->cr_qp_offset = 0;
-  slice->deblocking_filter_override_flag = 0;
-  slice->deblocking_filter_disabled_flag = 0;
   slice->beta_offset_div2 = pps->beta_offset_div2;
   slice->tc_offset_div2 = pps->tc_offset_div2;
   slice->loop_filter_across_slices_enabled_flag =
       pps->loop_filter_across_slices_enabled_flag;
-  slice->num_entry_point_offsets = 0;
-  slice->entry_point_offset_minus1 = NULL;
 
   if (!slice->first_slice_segment_in_pic_flag) {
     const guint n = ceil_log2 (PicSizeInCtbsY);
@@ -2303,7 +2210,8 @@
 
   GST_DEBUG ("parsing \"Sei message\"");
 
-  sei->payloadType = 0;
+  memset (sei, 0, sizeof (*sei));
+
   do {
     READ_UINT8 (nr, payload_type_byte, 8);
     sei->payloadType += payload_type_byte;
diff --git a/gst-libs/gst/gl/Makefile.am b/gst-libs/gst/gl/Makefile.am
index f968357..edc1370 100644
--- a/gst-libs/gst/gl/Makefile.am
+++ b/gst-libs/gst/gl/Makefile.am
@@ -11,17 +11,21 @@
 libgstgl_@GST_API_VERSION@_la_SOURCES = \
 	gstgldisplay.c \
 	gstglcontext.c \
-	gstglbasebuffer.c \
+	gstgldebug.c \
+	gstglbasememory.c \
+	gstglbuffer.c \
 	gstglmemory.c \
+	gstglmemorypbo.c \
 	gstglbufferpool.c \
 	gstglfilter.c \
+	gstglformat.c \
 	gstglbasefilter.c \
 	gstglshader.c \
-	gstglshadervariables.c \
+	gstglshaderstrings.c \
+	gstglsl.c \
+	gstglslstage.c \
 	gstglcolorconvert.c \
-	gstgldownload.c \
 	gstglupload.c \
-	gstgluploadmeta.c \
 	gstglwindow.c \
 	gstglapi.c \
 	gstglfeature.c \
@@ -30,6 +34,7 @@
 	gstglsyncmeta.c \
 	gstglviewconvert.c \
 	gstgloverlaycompositor.c \
+	gstglsl_private.h \
 	utils/opengl_versions.h
 
 libgstgl_@GST_API_VERSION@includedir = $(includedir)/gstreamer-@GST_API_VERSION@/gst/gl
@@ -37,16 +42,20 @@
 	gstglwindow.h \
 	gstgldisplay.h \
 	gstglcontext.h \
-	gstglbasebuffer.h \
+	gstgldebug.h \
+	gstglbasememory.h \
+	gstglbuffer.h \
 	gstglmemory.h \
+	gstglmemorypbo.h \
 	gstglbufferpool.h \
 	gstglfilter.h \
+	gstglformat.h \
 	gstglbasefilter.h \
-	gstglshadervariables.h \
 	gstglshader.h \
+	gstglshaderstrings.h \
+	gstglsl.h \
+	gstglslstage.h \
 	gstglcolorconvert.h \
-	gstgldownload.h \
-	gstgluploadmeta.h \
 	gstglupload.h \
 	gstglapi.h \
 	gstglfeature.h \
@@ -56,6 +65,7 @@
 	gstglviewconvert.h \
 	gstgloverlaycompositor.h \
 	gstgl_fwd.h \
+	gstgl_enums.h \
 	gl.h
 
 libgstgl_@GST_API_VERSION@_la_LIBADD = \
@@ -104,6 +114,7 @@
 if USE_EGL
 SUBDIRS += egl
 libgstgl_@GST_API_VERSION@_la_LIBADD += egl/libgstgl-egl.la
+libgstgl_@GST_API_VERSION@_la_LIBADD += -lgstallocators-$(GST_API_VERSION)
 endif
 
 configexecincludedir = $(libdir)/gstreamer-@GST_API_VERSION@/include/gst/gl
@@ -137,7 +148,8 @@
 		GST_PLUGIN_SYSTEM_PATH_1_0="" GST_PLUGIN_PATH_1_0="" GST_REGISTRY_UPDATE=no \
 		$(INTROSPECTION_SCANNER) -v --namespace GstGL \
 		--nsversion=@GST_API_VERSION@ \
-		--strip-prefix=Gst \
+		--identifier-prefix=Gst \
+		--symbol-prefix=gst \
 		--warn-all \
 		--c-include "gst/gl/gl.h" \
 		-I$(top_srcdir)/gst-libs \
diff --git a/gst-libs/gst/gl/Makefile.in b/gst-libs/gst/gl/Makefile.in
index 75df518..64779ea 100644
--- a/gst-libs/gst/gl/Makefile.in
+++ b/gst-libs/gst/gl/Makefile.in
@@ -106,7 +106,8 @@
 @HAVE_WINDOW_EAGL_TRUE@am__append_13 = eagl
 @HAVE_WINDOW_EAGL_TRUE@am__append_14 = eagl/libgstgl-eagl.la
 @USE_EGL_TRUE@am__append_15 = egl
-@USE_EGL_TRUE@am__append_16 = egl/libgstgl-egl.la
+@USE_EGL_TRUE@am__append_16 = egl/libgstgl-egl.la \
+@USE_EGL_TRUE@	-lgstallocators-$(GST_API_VERSION)
 subdir = gst-libs/gst/gl
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
@@ -185,26 +186,31 @@
 	"$(DESTDIR)$(configexecincludedir)"
 LTLIBRARIES = $(lib_LTLIBRARIES)
 am__DEPENDENCIES_1 =
+@USE_EGL_TRUE@am__DEPENDENCIES_2 = egl/libgstgl-egl.la
 libgstgl_@GST_API_VERSION@_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) $(am__append_2) \
 	$(am__append_4) $(am__append_6) $(am__append_8) \
 	$(am__append_10) $(am__append_12) $(am__append_14) \
-	$(am__append_16)
+	$(am__DEPENDENCIES_2)
 am_libgstgl_@GST_API_VERSION@_la_OBJECTS =  \
 	libgstgl_@GST_API_VERSION@_la-gstgldisplay.lo \
 	libgstgl_@GST_API_VERSION@_la-gstglcontext.lo \
-	libgstgl_@GST_API_VERSION@_la-gstglbasebuffer.lo \
+	libgstgl_@GST_API_VERSION@_la-gstgldebug.lo \
+	libgstgl_@GST_API_VERSION@_la-gstglbasememory.lo \
+	libgstgl_@GST_API_VERSION@_la-gstglbuffer.lo \
 	libgstgl_@GST_API_VERSION@_la-gstglmemory.lo \
+	libgstgl_@GST_API_VERSION@_la-gstglmemorypbo.lo \
 	libgstgl_@GST_API_VERSION@_la-gstglbufferpool.lo \
 	libgstgl_@GST_API_VERSION@_la-gstglfilter.lo \
+	libgstgl_@GST_API_VERSION@_la-gstglformat.lo \
 	libgstgl_@GST_API_VERSION@_la-gstglbasefilter.lo \
 	libgstgl_@GST_API_VERSION@_la-gstglshader.lo \
-	libgstgl_@GST_API_VERSION@_la-gstglshadervariables.lo \
+	libgstgl_@GST_API_VERSION@_la-gstglshaderstrings.lo \
+	libgstgl_@GST_API_VERSION@_la-gstglsl.lo \
+	libgstgl_@GST_API_VERSION@_la-gstglslstage.lo \
 	libgstgl_@GST_API_VERSION@_la-gstglcolorconvert.lo \
-	libgstgl_@GST_API_VERSION@_la-gstgldownload.lo \
 	libgstgl_@GST_API_VERSION@_la-gstglupload.lo \
-	libgstgl_@GST_API_VERSION@_la-gstgluploadmeta.lo \
 	libgstgl_@GST_API_VERSION@_la-gstglwindow.lo \
 	libgstgl_@GST_API_VERSION@_la-gstglapi.lo \
 	libgstgl_@GST_API_VERSION@_la-gstglfeature.lo \
@@ -364,6 +370,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -401,6 +409,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -428,6 +438,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -446,6 +458,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -456,6 +470,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -481,6 +497,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -506,6 +524,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -637,6 +657,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -694,8 +716,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -765,6 +791,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -861,17 +888,21 @@
 libgstgl_@GST_API_VERSION@_la_SOURCES = \
 	gstgldisplay.c \
 	gstglcontext.c \
-	gstglbasebuffer.c \
+	gstgldebug.c \
+	gstglbasememory.c \
+	gstglbuffer.c \
 	gstglmemory.c \
+	gstglmemorypbo.c \
 	gstglbufferpool.c \
 	gstglfilter.c \
+	gstglformat.c \
 	gstglbasefilter.c \
 	gstglshader.c \
-	gstglshadervariables.c \
+	gstglshaderstrings.c \
+	gstglsl.c \
+	gstglslstage.c \
 	gstglcolorconvert.c \
-	gstgldownload.c \
 	gstglupload.c \
-	gstgluploadmeta.c \
 	gstglwindow.c \
 	gstglapi.c \
 	gstglfeature.c \
@@ -880,6 +911,7 @@
 	gstglsyncmeta.c \
 	gstglviewconvert.c \
 	gstgloverlaycompositor.c \
+	gstglsl_private.h \
 	utils/opengl_versions.h
 
 libgstgl_@GST_API_VERSION@includedir = $(includedir)/gstreamer-@GST_API_VERSION@/gst/gl
@@ -887,16 +919,20 @@
 	gstglwindow.h \
 	gstgldisplay.h \
 	gstglcontext.h \
-	gstglbasebuffer.h \
+	gstgldebug.h \
+	gstglbasememory.h \
+	gstglbuffer.h \
 	gstglmemory.h \
+	gstglmemorypbo.h \
 	gstglbufferpool.h \
 	gstglfilter.h \
+	gstglformat.h \
 	gstglbasefilter.h \
-	gstglshadervariables.h \
 	gstglshader.h \
+	gstglshaderstrings.h \
+	gstglsl.h \
+	gstglslstage.h \
 	gstglcolorconvert.h \
-	gstgldownload.h \
-	gstgluploadmeta.h \
 	gstglupload.h \
 	gstglapi.h \
 	gstglfeature.h \
@@ -906,6 +942,7 @@
 	gstglviewconvert.h \
 	gstgloverlaycompositor.h \
 	gstgl_fwd.h \
+	gstgl_enums.h \
 	gl.h
 
 libgstgl_@GST_API_VERSION@_la_LIBADD = $(GMODULE_NO_EXPORT_LIBS) \
@@ -1023,23 +1060,27 @@
 	-rm -f *.tab.c
 
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglapi.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglbasebuffer.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglbasefilter.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglbasememory.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglbuffer.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglbufferpool.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglcolorconvert.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglcontext.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstgldebug.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstgldisplay.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstgldownload.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglfeature.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglfilter.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglformat.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglframebuffer.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglmemory.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglmemorypbo.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstgloverlaycompositor.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglshader.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglshadervariables.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglshaderstrings.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglsl.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglslstage.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglsyncmeta.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglupload.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstgluploadmeta.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglutils.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglviewconvert.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglwindow.Plo@am__quote@
@@ -1082,12 +1123,26 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstgl_@GST_API_VERSION@_la-gstglcontext.lo `test -f 'gstglcontext.c' || echo '$(srcdir)/'`gstglcontext.c
 
-libgstgl_@GST_API_VERSION@_la-gstglbasebuffer.lo: gstglbasebuffer.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstgl_@GST_API_VERSION@_la-gstglbasebuffer.lo -MD -MP -MF $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglbasebuffer.Tpo -c -o libgstgl_@GST_API_VERSION@_la-gstglbasebuffer.lo `test -f 'gstglbasebuffer.c' || echo '$(srcdir)/'`gstglbasebuffer.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglbasebuffer.Tpo $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglbasebuffer.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstglbasebuffer.c' object='libgstgl_@GST_API_VERSION@_la-gstglbasebuffer.lo' libtool=yes @AMDEPBACKSLASH@
+libgstgl_@GST_API_VERSION@_la-gstgldebug.lo: gstgldebug.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstgl_@GST_API_VERSION@_la-gstgldebug.lo -MD -MP -MF $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstgldebug.Tpo -c -o libgstgl_@GST_API_VERSION@_la-gstgldebug.lo `test -f 'gstgldebug.c' || echo '$(srcdir)/'`gstgldebug.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstgldebug.Tpo $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstgldebug.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstgldebug.c' object='libgstgl_@GST_API_VERSION@_la-gstgldebug.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstgl_@GST_API_VERSION@_la-gstglbasebuffer.lo `test -f 'gstglbasebuffer.c' || echo '$(srcdir)/'`gstglbasebuffer.c
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstgl_@GST_API_VERSION@_la-gstgldebug.lo `test -f 'gstgldebug.c' || echo '$(srcdir)/'`gstgldebug.c
+
+libgstgl_@GST_API_VERSION@_la-gstglbasememory.lo: gstglbasememory.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstgl_@GST_API_VERSION@_la-gstglbasememory.lo -MD -MP -MF $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglbasememory.Tpo -c -o libgstgl_@GST_API_VERSION@_la-gstglbasememory.lo `test -f 'gstglbasememory.c' || echo '$(srcdir)/'`gstglbasememory.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglbasememory.Tpo $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglbasememory.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstglbasememory.c' object='libgstgl_@GST_API_VERSION@_la-gstglbasememory.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstgl_@GST_API_VERSION@_la-gstglbasememory.lo `test -f 'gstglbasememory.c' || echo '$(srcdir)/'`gstglbasememory.c
+
+libgstgl_@GST_API_VERSION@_la-gstglbuffer.lo: gstglbuffer.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstgl_@GST_API_VERSION@_la-gstglbuffer.lo -MD -MP -MF $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglbuffer.Tpo -c -o libgstgl_@GST_API_VERSION@_la-gstglbuffer.lo `test -f 'gstglbuffer.c' || echo '$(srcdir)/'`gstglbuffer.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglbuffer.Tpo $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglbuffer.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstglbuffer.c' object='libgstgl_@GST_API_VERSION@_la-gstglbuffer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstgl_@GST_API_VERSION@_la-gstglbuffer.lo `test -f 'gstglbuffer.c' || echo '$(srcdir)/'`gstglbuffer.c
 
 libgstgl_@GST_API_VERSION@_la-gstglmemory.lo: gstglmemory.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstgl_@GST_API_VERSION@_la-gstglmemory.lo -MD -MP -MF $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglmemory.Tpo -c -o libgstgl_@GST_API_VERSION@_la-gstglmemory.lo `test -f 'gstglmemory.c' || echo '$(srcdir)/'`gstglmemory.c
@@ -1096,6 +1151,13 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstgl_@GST_API_VERSION@_la-gstglmemory.lo `test -f 'gstglmemory.c' || echo '$(srcdir)/'`gstglmemory.c
 
+libgstgl_@GST_API_VERSION@_la-gstglmemorypbo.lo: gstglmemorypbo.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstgl_@GST_API_VERSION@_la-gstglmemorypbo.lo -MD -MP -MF $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglmemorypbo.Tpo -c -o libgstgl_@GST_API_VERSION@_la-gstglmemorypbo.lo `test -f 'gstglmemorypbo.c' || echo '$(srcdir)/'`gstglmemorypbo.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglmemorypbo.Tpo $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglmemorypbo.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstglmemorypbo.c' object='libgstgl_@GST_API_VERSION@_la-gstglmemorypbo.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstgl_@GST_API_VERSION@_la-gstglmemorypbo.lo `test -f 'gstglmemorypbo.c' || echo '$(srcdir)/'`gstglmemorypbo.c
+
 libgstgl_@GST_API_VERSION@_la-gstglbufferpool.lo: gstglbufferpool.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstgl_@GST_API_VERSION@_la-gstglbufferpool.lo -MD -MP -MF $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglbufferpool.Tpo -c -o libgstgl_@GST_API_VERSION@_la-gstglbufferpool.lo `test -f 'gstglbufferpool.c' || echo '$(srcdir)/'`gstglbufferpool.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglbufferpool.Tpo $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglbufferpool.Plo
@@ -1110,6 +1172,13 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstgl_@GST_API_VERSION@_la-gstglfilter.lo `test -f 'gstglfilter.c' || echo '$(srcdir)/'`gstglfilter.c
 
+libgstgl_@GST_API_VERSION@_la-gstglformat.lo: gstglformat.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstgl_@GST_API_VERSION@_la-gstglformat.lo -MD -MP -MF $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglformat.Tpo -c -o libgstgl_@GST_API_VERSION@_la-gstglformat.lo `test -f 'gstglformat.c' || echo '$(srcdir)/'`gstglformat.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglformat.Tpo $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglformat.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstglformat.c' object='libgstgl_@GST_API_VERSION@_la-gstglformat.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstgl_@GST_API_VERSION@_la-gstglformat.lo `test -f 'gstglformat.c' || echo '$(srcdir)/'`gstglformat.c
+
 libgstgl_@GST_API_VERSION@_la-gstglbasefilter.lo: gstglbasefilter.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstgl_@GST_API_VERSION@_la-gstglbasefilter.lo -MD -MP -MF $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglbasefilter.Tpo -c -o libgstgl_@GST_API_VERSION@_la-gstglbasefilter.lo `test -f 'gstglbasefilter.c' || echo '$(srcdir)/'`gstglbasefilter.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglbasefilter.Tpo $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglbasefilter.Plo
@@ -1124,12 +1193,26 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstgl_@GST_API_VERSION@_la-gstglshader.lo `test -f 'gstglshader.c' || echo '$(srcdir)/'`gstglshader.c
 
-libgstgl_@GST_API_VERSION@_la-gstglshadervariables.lo: gstglshadervariables.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstgl_@GST_API_VERSION@_la-gstglshadervariables.lo -MD -MP -MF $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglshadervariables.Tpo -c -o libgstgl_@GST_API_VERSION@_la-gstglshadervariables.lo `test -f 'gstglshadervariables.c' || echo '$(srcdir)/'`gstglshadervariables.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglshadervariables.Tpo $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglshadervariables.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstglshadervariables.c' object='libgstgl_@GST_API_VERSION@_la-gstglshadervariables.lo' libtool=yes @AMDEPBACKSLASH@
+libgstgl_@GST_API_VERSION@_la-gstglshaderstrings.lo: gstglshaderstrings.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstgl_@GST_API_VERSION@_la-gstglshaderstrings.lo -MD -MP -MF $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglshaderstrings.Tpo -c -o libgstgl_@GST_API_VERSION@_la-gstglshaderstrings.lo `test -f 'gstglshaderstrings.c' || echo '$(srcdir)/'`gstglshaderstrings.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglshaderstrings.Tpo $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglshaderstrings.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstglshaderstrings.c' object='libgstgl_@GST_API_VERSION@_la-gstglshaderstrings.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstgl_@GST_API_VERSION@_la-gstglshadervariables.lo `test -f 'gstglshadervariables.c' || echo '$(srcdir)/'`gstglshadervariables.c
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstgl_@GST_API_VERSION@_la-gstglshaderstrings.lo `test -f 'gstglshaderstrings.c' || echo '$(srcdir)/'`gstglshaderstrings.c
+
+libgstgl_@GST_API_VERSION@_la-gstglsl.lo: gstglsl.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstgl_@GST_API_VERSION@_la-gstglsl.lo -MD -MP -MF $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglsl.Tpo -c -o libgstgl_@GST_API_VERSION@_la-gstglsl.lo `test -f 'gstglsl.c' || echo '$(srcdir)/'`gstglsl.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglsl.Tpo $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglsl.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstglsl.c' object='libgstgl_@GST_API_VERSION@_la-gstglsl.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstgl_@GST_API_VERSION@_la-gstglsl.lo `test -f 'gstglsl.c' || echo '$(srcdir)/'`gstglsl.c
+
+libgstgl_@GST_API_VERSION@_la-gstglslstage.lo: gstglslstage.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstgl_@GST_API_VERSION@_la-gstglslstage.lo -MD -MP -MF $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglslstage.Tpo -c -o libgstgl_@GST_API_VERSION@_la-gstglslstage.lo `test -f 'gstglslstage.c' || echo '$(srcdir)/'`gstglslstage.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglslstage.Tpo $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglslstage.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstglslstage.c' object='libgstgl_@GST_API_VERSION@_la-gstglslstage.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstgl_@GST_API_VERSION@_la-gstglslstage.lo `test -f 'gstglslstage.c' || echo '$(srcdir)/'`gstglslstage.c
 
 libgstgl_@GST_API_VERSION@_la-gstglcolorconvert.lo: gstglcolorconvert.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstgl_@GST_API_VERSION@_la-gstglcolorconvert.lo -MD -MP -MF $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglcolorconvert.Tpo -c -o libgstgl_@GST_API_VERSION@_la-gstglcolorconvert.lo `test -f 'gstglcolorconvert.c' || echo '$(srcdir)/'`gstglcolorconvert.c
@@ -1138,13 +1221,6 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstgl_@GST_API_VERSION@_la-gstglcolorconvert.lo `test -f 'gstglcolorconvert.c' || echo '$(srcdir)/'`gstglcolorconvert.c
 
-libgstgl_@GST_API_VERSION@_la-gstgldownload.lo: gstgldownload.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstgl_@GST_API_VERSION@_la-gstgldownload.lo -MD -MP -MF $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstgldownload.Tpo -c -o libgstgl_@GST_API_VERSION@_la-gstgldownload.lo `test -f 'gstgldownload.c' || echo '$(srcdir)/'`gstgldownload.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstgldownload.Tpo $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstgldownload.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstgldownload.c' object='libgstgl_@GST_API_VERSION@_la-gstgldownload.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstgl_@GST_API_VERSION@_la-gstgldownload.lo `test -f 'gstgldownload.c' || echo '$(srcdir)/'`gstgldownload.c
-
 libgstgl_@GST_API_VERSION@_la-gstglupload.lo: gstglupload.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstgl_@GST_API_VERSION@_la-gstglupload.lo -MD -MP -MF $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglupload.Tpo -c -o libgstgl_@GST_API_VERSION@_la-gstglupload.lo `test -f 'gstglupload.c' || echo '$(srcdir)/'`gstglupload.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglupload.Tpo $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglupload.Plo
@@ -1152,13 +1228,6 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstgl_@GST_API_VERSION@_la-gstglupload.lo `test -f 'gstglupload.c' || echo '$(srcdir)/'`gstglupload.c
 
-libgstgl_@GST_API_VERSION@_la-gstgluploadmeta.lo: gstgluploadmeta.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstgl_@GST_API_VERSION@_la-gstgluploadmeta.lo -MD -MP -MF $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstgluploadmeta.Tpo -c -o libgstgl_@GST_API_VERSION@_la-gstgluploadmeta.lo `test -f 'gstgluploadmeta.c' || echo '$(srcdir)/'`gstgluploadmeta.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstgluploadmeta.Tpo $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstgluploadmeta.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstgluploadmeta.c' object='libgstgl_@GST_API_VERSION@_la-gstgluploadmeta.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstgl_@GST_API_VERSION@_la-gstgluploadmeta.lo `test -f 'gstgluploadmeta.c' || echo '$(srcdir)/'`gstgluploadmeta.c
-
 libgstgl_@GST_API_VERSION@_la-gstglwindow.lo: gstglwindow.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstgl_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstgl_@GST_API_VERSION@_la-gstglwindow.lo -MD -MP -MF $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglwindow.Tpo -c -o libgstgl_@GST_API_VERSION@_la-gstglwindow.lo `test -f 'gstglwindow.c' || echo '$(srcdir)/'`gstglwindow.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglwindow.Tpo $(DEPDIR)/libgstgl_@GST_API_VERSION@_la-gstglwindow.Plo
@@ -1607,7 +1676,8 @@
 @HAVE_INTROSPECTION_TRUE@		GST_PLUGIN_SYSTEM_PATH_1_0="" GST_PLUGIN_PATH_1_0="" GST_REGISTRY_UPDATE=no \
 @HAVE_INTROSPECTION_TRUE@		$(INTROSPECTION_SCANNER) -v --namespace GstGL \
 @HAVE_INTROSPECTION_TRUE@		--nsversion=@GST_API_VERSION@ \
-@HAVE_INTROSPECTION_TRUE@		--strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@		--identifier-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@		--symbol-prefix=gst \
 @HAVE_INTROSPECTION_TRUE@		--warn-all \
 @HAVE_INTROSPECTION_TRUE@		--c-include "gst/gl/gl.h" \
 @HAVE_INTROSPECTION_TRUE@		-I$(top_srcdir)/gst-libs \
diff --git a/gst-libs/gst/gl/android/Makefile.in b/gst-libs/gst/gl/android/Makefile.in
index 2af0f10..e7fe150 100644
--- a/gst-libs/gst/gl/android/Makefile.in
+++ b/gst-libs/gst/gl/android/Makefile.in
@@ -273,6 +273,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -310,6 +312,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -337,6 +341,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -355,6 +361,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -365,6 +373,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -390,6 +400,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -415,6 +427,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -546,6 +560,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -603,8 +619,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -674,6 +694,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst-libs/gst/gl/android/gstglwindow_android_egl.c b/gst-libs/gst/gl/android/gstglwindow_android_egl.c
index 9837756..798a800 100644
--- a/gst-libs/gst/gl/android/gstglwindow_android_egl.c
+++ b/gst-libs/gst/gl/android/gstglwindow_android_egl.c
@@ -57,8 +57,6 @@
       GST_DEBUG_FUNCPTR (gst_gl_window_android_egl_get_window_handle);
   window_class->set_window_handle =
       GST_DEBUG_FUNCPTR (gst_gl_window_android_egl_set_window_handle);
-  window_class->draw_unlocked =
-      GST_DEBUG_FUNCPTR (gst_gl_window_android_egl_draw);
   window_class->draw = GST_DEBUG_FUNCPTR (gst_gl_window_android_egl_draw);
 }
 
diff --git a/gst-libs/gst/gl/android/gstglwindow_android_egl.h b/gst-libs/gst/gl/android/gstglwindow_android_egl.h
index eaada44..b8dc66d 100644
--- a/gst-libs/gst/gl/android/gstglwindow_android_egl.h
+++ b/gst-libs/gst/gl/android/gstglwindow_android_egl.h
@@ -30,8 +30,8 @@
 #define GST_GL_TYPE_WINDOW_ANDROID_EGL         (gst_gl_window_android_egl_get_type())
 #define GST_GL_WINDOW_ANDROID_EGL(o)           (G_TYPE_CHECK_INSTANCE_CAST((o), GST_GL_TYPE_WINDOW_ANDROID_EGL, GstGLWindowAndroidEGL))
 #define GST_GL_WINDOW_ANDROID_EGL_CLASS(k)     (G_TYPE_CHECK_CLASS((k), GST_GL_TYPE_WINDOW_ANDROID_EGL, GstGLWindowAndroidEGLClass))
-#define GST_GL_IS_WINDOW_ANDROID_EGL(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_WINDOW_ANDROID_EGL))
-#define GST_GL_IS_WINDOW_ANDROID_EGL_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_WINDOW_ANDROID_EGL))
+#define GST_IS_GL_WINDOW_ANDROID_EGL(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_WINDOW_ANDROID_EGL))
+#define GST_IS_GL_WINDOW_ANDROID_EGL_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_WINDOW_ANDROID_EGL))
 #define GST_GL_WINDOW_ANDROID_EGL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_GL_TYPE_WINDOW_ANDROID_EGL, GstGLWindowAndroidEGL_Class))
 
 typedef struct _GstGLWindowAndroidEGL        GstGLWindowAndroidEGL;
diff --git a/gst-libs/gst/gl/cocoa/Makefile.in b/gst-libs/gst/gl/cocoa/Makefile.in
index e61ddd5..20141a2 100644
--- a/gst-libs/gst/gl/cocoa/Makefile.in
+++ b/gst-libs/gst/gl/cocoa/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst-libs/gst/gl/cocoa/gstglcontext_cocoa.h b/gst-libs/gst/gl/cocoa/gstglcontext_cocoa.h
index 22069ee..8e4d1ac 100644
--- a/gst-libs/gst/gl/cocoa/gstglcontext_cocoa.h
+++ b/gst-libs/gst/gl/cocoa/gstglcontext_cocoa.h
@@ -30,8 +30,8 @@
 #define GST_GL_TYPE_CONTEXT_COCOA         (gst_gl_context_cocoa_get_type())
 #define GST_GL_CONTEXT_COCOA(o)           (G_TYPE_CHECK_INSTANCE_CAST((o), GST_GL_TYPE_CONTEXT_COCOA, GstGLContextCocoa))
 #define GST_GL_CONTEXT_COCOA_CLASS(k)     (G_TYPE_CHECK_CLASS((k), GST_GL_TYPE_CONTEXT_COCOA, GstGLContextCocoaClass))
-#define GST_GL_IS_CONTEXT_COCOA(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_CONTEXT_COCOA))
-#define GST_GL_IS_CONTEXT_COCOA_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_CONTEXT_COCOA))
+#define GST_IS_GL_CONTEXT_COCOA(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_CONTEXT_COCOA))
+#define GST_IS_GL_CONTEXT_COCOA_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_CONTEXT_COCOA))
 #define GST_GL_CONTEXT_COCOA_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_GL_TYPE_CONTEXT_COCOA, GstGLContextCocoaClass))
 
 typedef struct _GstGLContextCocoa        GstGLContextCocoa;
diff --git a/gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m b/gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m
index bde90f1..ac1e0d6 100644
--- a/gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m
+++ b/gst-libs/gst/gl/cocoa/gstglcontext_cocoa.m
@@ -90,7 +90,6 @@
 static struct pixel_attr pixel_attrs[] = {
   {kCGLPFAAllRenderers, "All Renderers"},
   {kCGLPFADoubleBuffer, "Double Buffered"},
-  {kCGLPFAStereo, "Stereo"},
   {kCGLPFAAuxBuffers, "Aux Buffers"},
   {kCGLPFAColorSize, "Color Size"},
   {kCGLPFAAlphaSize, "Alpha Size"},
@@ -115,20 +114,23 @@
   {kCGLPFAAcceleratedCompute, "Accelerated Compute"},
   {kCGLPFAOpenGLProfile, "OpenGL Profile"},
   {kCGLPFAVirtualScreenCount, "Virtual Screen Count"},
-#if MAC_OS_X_VERSION_MAX_ALLOWED < 1090
+#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_11
+  {kCGLPFAStereo, "Stereo"},
+#endif
+#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_9
   {kCGLPFACompliant, "Compliant"},
   {kCGLPFARemotePBuffer, "Remote PBuffer"},
   {kCGLPFASingleRenderer, "Single Renderer"},
   {kCGLPFAWindow, "Window"},
 #endif
-#if MAC_OS_X_VERSION_MAX_ALLOWED < 1070
+#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_7
 //  {kCGLPFAOffScreen, "Off Screen"},
 //  {kCGLPFAPBuffer, "PBuffer"},
 #endif
-#if MAC_OS_X_VERSION_MAX_ALLOWED < 1060
+#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_6
 //  {kCGLPFAFullScreen, "Full Screen"},
 #endif
-#if MAC_OS_X_VERSION_MAX_ALLOWED < 1050
+#if MAC_OS_X_VERSION_MAX_ALLOWED < MAC_OS_X_VERSION_10_5
 //  {kCGLPFAMPSafe, "MP Safe"},
 //  {kCGLPFAMultiScreen, "Multi Screen"},
 //  {kCGLPFARobust, "Robust"},
diff --git a/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h b/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h
index 21c5917..6d1404b 100644
--- a/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h
+++ b/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.h
@@ -30,8 +30,8 @@
 #define GST_GL_TYPE_WINDOW_COCOA         (gst_gl_window_cocoa_get_type())
 #define GST_GL_WINDOW_COCOA(o)           (G_TYPE_CHECK_INSTANCE_CAST((o), GST_GL_TYPE_WINDOW_COCOA, GstGLWindowCocoa))
 #define GST_GL_WINDOW_COCOA_CLASS(k)     (G_TYPE_CHECK_CLASS((k), GST_GL_TYPE_WINDOW_COCOA, GstGLWindowCocoaClass))
-#define GST_GL_IS_WINDOW_COCOA(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_WINDOW_COCOA))
-#define GST_GL_IS_WINDOW_COCOA_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_WINDOW_COCOA))
+#define GST_IS_GL_WINDOW_COCOA(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_WINDOW_COCOA))
+#define GST_IS_GL_WINDOW_COCOA_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_WINDOW_COCOA))
 #define GST_GL_WINDOW_COCOA_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_GL_TYPE_WINDOW_COCOA, GstGLWindowCocoaClass))
 
 typedef struct _GstGLWindowCocoa        GstGLWindowCocoa;
diff --git a/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m b/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m
index 9c37e6c..0d027c5 100644
--- a/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m
+++ b/gst-libs/gst/gl/cocoa/gstglwindow_cocoa.m
@@ -106,7 +106,6 @@
       GST_DEBUG_FUNCPTR (gst_gl_window_cocoa_get_window_handle);
   window_class->set_window_handle =
       GST_DEBUG_FUNCPTR (gst_gl_window_cocoa_set_window_handle);
-  window_class->draw_unlocked = GST_DEBUG_FUNCPTR (gst_gl_window_cocoa_draw);
   window_class->draw = GST_DEBUG_FUNCPTR (gst_gl_window_cocoa_draw);
   window_class->set_preferred_size =
       GST_DEBUG_FUNCPTR (gst_gl_window_cocoa_set_preferred_size);
diff --git a/gst-libs/gst/gl/dispmanx/Makefile.in b/gst-libs/gst/gl/dispmanx/Makefile.in
index a3eadda..1f40452 100644
--- a/gst-libs/gst/gl/dispmanx/Makefile.in
+++ b/gst-libs/gst/gl/dispmanx/Makefile.in
@@ -245,6 +245,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -282,6 +284,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -309,6 +313,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -327,6 +333,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -337,6 +345,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -362,6 +372,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -387,6 +399,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -518,6 +532,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -575,8 +591,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -646,6 +666,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h b/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h
index df23eb5..3130a6c 100644
--- a/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h
+++ b/gst-libs/gst/gl/dispmanx/gstglwindow_dispmanx_egl.h
@@ -47,8 +47,8 @@
 #define GST_GL_TYPE_WINDOW_DISPMANX_EGL         (gst_gl_window_dispmanx_egl_get_type())
 #define GST_GL_WINDOW_DISPMANX_EGL(o)           (G_TYPE_CHECK_INSTANCE_CAST((o), GST_GL_TYPE_WINDOW_DISPMANX_EGL, GstGLWindowDispmanxEGL))
 #define GST_GL_WINDOW_DISPMANX_EGL_CLASS(k)     (G_TYPE_CHECK_CLASS((k), GST_GL_TYPE_WINDOW_DISPMANX_EGL, GstGLWindowDispmanxEGLClass))
-#define GST_GL_IS_WINDOW_DISPMANX_EGL(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_WINDOW_DISPMANX_EGL))
-#define GST_GL_IS_WINDOW_DISPMANX_EGL_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_WINDOW_DISPMANX_EGL))
+#define GST_IS_GL_WINDOW_DISPMANX_EGL(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_WINDOW_DISPMANX_EGL))
+#define GST_IS_GL_WINDOW_DISPMANX_EGL_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_WINDOW_DISPMANX_EGL))
 #define GST_GL_WINDOW_DISPMANX_EGL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_GL_TYPE_WINDOW_DISPMANX_EGL, GstGLWindowDispmanxEGL_Class))
 
 typedef struct _GstGLWindowDispmanxEGL        GstGLWindowDispmanxEGL;
diff --git a/gst-libs/gst/gl/eagl/Makefile.in b/gst-libs/gst/gl/eagl/Makefile.in
index 28645fc..4c38a4d 100644
--- a/gst-libs/gst/gl/eagl/Makefile.in
+++ b/gst-libs/gst/gl/eagl/Makefile.in
@@ -245,6 +245,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -282,6 +284,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -309,6 +313,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -327,6 +333,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -337,6 +345,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -362,6 +372,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -387,6 +399,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -518,6 +532,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -575,8 +591,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -646,6 +666,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst-libs/gst/gl/eagl/gstglcontext_eagl.h b/gst-libs/gst/gl/eagl/gstglcontext_eagl.h
index bd6cd20..2622810 100644
--- a/gst-libs/gst/gl/eagl/gstglcontext_eagl.h
+++ b/gst-libs/gst/gl/eagl/gstglcontext_eagl.h
@@ -29,8 +29,8 @@
 #define GST_GL_TYPE_CONTEXT_EAGL         (gst_gl_context_eagl_get_type())
 #define GST_GL_CONTEXT_EAGL(o)           (G_TYPE_CHECK_INSTANCE_CAST((o), GST_GL_TYPE_CONTEXT_EAGL, GstGLContextEagl))
 #define GST_GL_CONTEXT_EAGL_CLASS(k)     (G_TYPE_CHECK_CLASS((k), GST_GL_TYPE_CONTEXT_EAGL, GstGLContextEaglClass))
-#define GST_GL_IS_CONTEXT_EAGL(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_CONTEXT_EAGL))
-#define GST_GL_IS_CONTEXT_EAGL_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_CONTEXT_EAGL))
+#define GST_IS_GL_CONTEXT_EAGL(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_CONTEXT_EAGL))
+#define GST_IS_GL_CONTEXT_EAGL_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_CONTEXT_EAGL))
 #define GST_GL_CONTEXT_EAGL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_GL_TYPE_CONTEXT_EAGL, GstGLContextEaglClass))
 
 typedef struct _GstGLContextEagl        GstGLContextEagl;
diff --git a/gst-libs/gst/gl/eagl/gstglwindow_eagl.h b/gst-libs/gst/gl/eagl/gstglwindow_eagl.h
index ce3d0b3..001c97c 100644
--- a/gst-libs/gst/gl/eagl/gstglwindow_eagl.h
+++ b/gst-libs/gst/gl/eagl/gstglwindow_eagl.h
@@ -29,8 +29,8 @@
 #define GST_GL_TYPE_WINDOW_EAGL         (gst_gl_window_eagl_get_type())
 #define GST_GL_WINDOW_EAGL(o)           (G_TYPE_CHECK_INSTANCE_CAST((o), GST_GL_TYPE_WINDOW_EAGL, GstGLWindowEagl))
 #define GST_GL_WINDOW_EAGL_CLASS(k)     (G_TYPE_CHECK_CLASS((k), GST_GL_TYPE_WINDOW_EAGL, GstGLWindowEaglClass))
-#define GST_GL_IS_WINDOW_EAGL(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_WINDOW_EAGL))
-#define GST_GL_IS_WINDOW_EAGL_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_WINDOW_EAGL))
+#define GST_IS_GL_WINDOW_EAGL(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_WINDOW_EAGL))
+#define GST_IS_GL_WINDOW_EAGL_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_WINDOW_EAGL))
 #define GST_GL_WINDOW_EAGL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_GL_TYPE_WINDOW_EAGL, GstGLWindowEaglClass))
 
 typedef struct _GstGLWindowEagl        GstGLWindowEagl;
diff --git a/gst-libs/gst/gl/eagl/gstglwindow_eagl.m b/gst-libs/gst/gl/eagl/gstglwindow_eagl.m
index dfd889f..eb9d4f7 100644
--- a/gst-libs/gst/gl/eagl/gstglwindow_eagl.m
+++ b/gst-libs/gst/gl/eagl/gstglwindow_eagl.m
@@ -69,7 +69,6 @@
       GST_DEBUG_FUNCPTR (gst_gl_window_eagl_get_window_handle);
   window_class->set_window_handle =
       GST_DEBUG_FUNCPTR (gst_gl_window_eagl_set_window_handle);
-  window_class->draw_unlocked = GST_DEBUG_FUNCPTR (gst_gl_window_eagl_draw);
   window_class->draw = GST_DEBUG_FUNCPTR (gst_gl_window_eagl_draw);
   window_class->set_preferred_size =
       GST_DEBUG_FUNCPTR (gst_gl_window_eagl_set_preferred_size);
diff --git a/gst-libs/gst/gl/egl/Makefile.in b/gst-libs/gst/gl/egl/Makefile.in
index 788a1da..776836e 100644
--- a/gst-libs/gst/gl/egl/Makefile.in
+++ b/gst-libs/gst/gl/egl/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst-libs/gst/gl/egl/gsteglimagememory.c b/gst-libs/gst/gl/egl/gsteglimagememory.c
index eb45830..7005e47 100644
--- a/gst-libs/gst/gl/egl/gsteglimagememory.c
+++ b/gst-libs/gst/gl/egl/gsteglimagememory.c
@@ -25,6 +25,24 @@
 #endif
 
 #include "gsteglimagememory.h"
+#include <string.h>
+
+#if GST_GL_HAVE_DMABUF
+#include <gst/allocators/gstdmabuf.h>
+#include <libdrm/drm_fourcc.h>
+
+#ifndef DRM_FORMAT_R8
+#define DRM_FORMAT_R8 fourcc_code('R', '8', ' ', ' ')
+#endif
+
+#ifndef DRM_FORMAT_RG88
+#define DRM_FORMAT_RG88 fourcc_code('R', 'G', '8', '8')
+#endif
+
+#ifndef DRM_FORMAT_GR88
+#define DRM_FORMAT_GR88 fourcc_code('G', 'R', '8', '8')
+#endif
+#endif
 
 GST_DEBUG_CATEGORY_STATIC (GST_CAT_EGL_IMAGE_MEMORY);
 #define GST_CAT_DEFAULT GST_CAT_EGL_IMAGE_MEMORY
@@ -310,9 +328,137 @@
     gst_gl_buffer_pool_replace_last_buffer (GST_GL_BUFFER_POOL (meta->
             buffer->pool), meta->buffer);
 
+
   return TRUE;
 }
 
+#if GST_GL_HAVE_DMABUF
+/*
+ * GStreamer format descriptions differ from DRM formats as the representation
+ * is relative to a register, hence in native endianness. To reduce the driver
+ * requirement, we only import with a subset of texture formats and use
+ * shaders to convert. This way we avoid having to use external texture
+ * target.
+ */
+static int
+_drm_fourcc_from_info (GstVideoInfo * info, int plane)
+{
+  GstVideoFormat format = GST_VIDEO_INFO_FORMAT (info);
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+  const gint rgba_fourcc = DRM_FORMAT_ABGR8888;
+  const gint rgb_fourcc = DRM_FORMAT_BGR888;
+  const gint rg_fourcc = DRM_FORMAT_GR88;
+#else
+  const gint rgba_fourcc = DRM_FORMAT_RGBA8888;
+  const gint rgb_fourcc = DRM_FORMAT_RGB888;
+  const gint rg_fourcc = DRM_FORMAT_RG88;
+#endif
+
+  GST_DEBUG ("Getting DRM fourcc for %s plane %i",
+      gst_video_format_to_string (format), plane);
+
+  switch (format) {
+    case GST_VIDEO_FORMAT_RGB16:
+    case GST_VIDEO_FORMAT_BGR16:
+      return DRM_FORMAT_RGB565;
+
+    case GST_VIDEO_FORMAT_RGB:
+    case GST_VIDEO_FORMAT_BGR:
+      return rgb_fourcc;
+
+    case GST_VIDEO_FORMAT_RGBA:
+    case GST_VIDEO_FORMAT_RGBx:
+    case GST_VIDEO_FORMAT_BGRA:
+    case GST_VIDEO_FORMAT_BGRx:
+    case GST_VIDEO_FORMAT_ARGB:
+    case GST_VIDEO_FORMAT_xRGB:
+    case GST_VIDEO_FORMAT_ABGR:
+    case GST_VIDEO_FORMAT_xBGR:
+    case GST_VIDEO_FORMAT_AYUV:
+      return rgba_fourcc;
+
+    case GST_VIDEO_FORMAT_GRAY8:
+      return DRM_FORMAT_R8;
+
+    case GST_VIDEO_FORMAT_YUY2:
+    case GST_VIDEO_FORMAT_UYVY:
+    case GST_VIDEO_FORMAT_GRAY16_LE:
+    case GST_VIDEO_FORMAT_GRAY16_BE:
+      return rg_fourcc;
+
+    case GST_VIDEO_FORMAT_NV12:
+    case GST_VIDEO_FORMAT_NV21:
+      return plane == 0 ? DRM_FORMAT_R8 : rg_fourcc;
+
+    case GST_VIDEO_FORMAT_I420:
+    case GST_VIDEO_FORMAT_YV12:
+    case GST_VIDEO_FORMAT_Y41B:
+    case GST_VIDEO_FORMAT_Y42B:
+    case GST_VIDEO_FORMAT_Y444:
+      return DRM_FORMAT_R8;
+
+    default:
+      GST_ERROR ("Unsupported format for DMABuf.");
+      return -1;
+  }
+}
+
+GstMemory *
+gst_egl_image_memory_from_dmabuf (GstGLContext * context,
+    gint dmabuf, GstVideoInfo * in_info, gint plane, gsize offset)
+{
+  GstGLContextEGL *ctx_egl = GST_GL_CONTEXT_EGL (context);
+  GstEGLImageAllocator *allocator;
+  gint fourcc;
+  gint atti = 0;
+  EGLint attribs[13];
+  EGLImageKHR img = EGL_NO_IMAGE_KHR;
+
+  allocator = gst_egl_image_allocator_obtain ();
+  fourcc = _drm_fourcc_from_info (in_info, plane);
+
+  GST_DEBUG ("fourcc %.4s (%d) plane %d (%dx%d)",
+      (char *) &fourcc, fourcc, plane,
+      GST_VIDEO_INFO_COMP_WIDTH (in_info, plane),
+      GST_VIDEO_INFO_COMP_HEIGHT (in_info, plane));
+
+  attribs[atti++] = EGL_WIDTH;
+  attribs[atti++] = GST_VIDEO_INFO_COMP_WIDTH (in_info, plane);
+  attribs[atti++] = EGL_HEIGHT;
+  attribs[atti++] = GST_VIDEO_INFO_COMP_HEIGHT (in_info, plane);
+
+  attribs[atti++] = EGL_LINUX_DRM_FOURCC_EXT;
+  attribs[atti++] = fourcc;
+
+  attribs[atti++] = EGL_DMA_BUF_PLANE0_FD_EXT;
+  attribs[atti++] = dmabuf;
+
+  attribs[atti++] = EGL_DMA_BUF_PLANE0_OFFSET_EXT;
+  attribs[atti++] = offset;
+  attribs[atti++] = EGL_DMA_BUF_PLANE0_PITCH_EXT;
+  attribs[atti++] = GST_VIDEO_INFO_PLANE_STRIDE (in_info, plane);
+
+  attribs[atti] = EGL_NONE;
+
+  for (int i = 0; i < atti; i++)
+    GST_LOG ("attr %i: %08X", i, attribs[i]);
+
+  g_assert (atti == 12);
+
+  img = ctx_egl->eglCreateImage (ctx_egl->egl_display, EGL_NO_CONTEXT,
+      EGL_LINUX_DMA_BUF_EXT, NULL, attribs);
+
+  if (!img) {
+    GST_WARNING_OBJECT (allocator, "eglCreateImage failed: %s",
+        gst_gl_context_egl_get_error_string ());
+    return NULL;
+  }
+
+  return gst_egl_image_allocator_wrap (allocator, ctx_egl, img, 0, 0,
+      in_info->size, NULL, NULL);
+}
+#endif /* GST_GL_HAVE_DMABUF */
+
 gboolean
 gst_egl_image_memory_setup_buffer (GstGLContext * ctx, GstVideoInfo * info,
     GstBuffer * buffer)
diff --git a/gst-libs/gst/gl/egl/gsteglimagememory.h b/gst-libs/gst/gl/egl/gsteglimagememory.h
index ce1fd44..aced247 100644
--- a/gst-libs/gst/gl/egl/gsteglimagememory.h
+++ b/gst-libs/gst/gl/egl/gsteglimagememory.h
@@ -64,6 +64,11 @@
 void gst_egl_image_memory_set_orientation (GstMemory * mem,
     GstVideoGLTextureOrientation orientation);
 
+#if GST_GL_HAVE_DMABUF
+GstMemory * gst_egl_image_memory_from_dmabuf (GstGLContext * context,
+    gint dmabuf, GstVideoInfo * in_info, gint plane, gsize offset);
+#endif
+
 G_END_DECLS
 
 #endif /* _GST_GL_MEMORY_H_ */
diff --git a/gst-libs/gst/gl/egl/gstglcontext_egl.c b/gst-libs/gst/gl/egl/gstglcontext_egl.c
index 3a4aa35..7911fc5 100644
--- a/gst-libs/gst/gl/egl/gstglcontext_egl.c
+++ b/gst-libs/gst/gl/egl/gstglcontext_egl.c
@@ -107,7 +107,7 @@
   return g_object_new (GST_GL_TYPE_CONTEXT_EGL, NULL);
 }
 
-static const gchar *
+const gchar *
 gst_gl_context_egl_get_error_string (void)
 {
   EGLint nErr = eglGetError ();
@@ -150,7 +150,7 @@
 gst_gl_context_egl_choose_format (GstGLContext * context, GError ** error)
 {
 #if GST_GL_HAVE_WINDOW_X11
-  if (GST_GL_IS_WINDOW_X11 (context->window)) {
+  if (GST_IS_GL_WINDOW_X11 (context->window)) {
     GstGLWindow *window = gst_gl_context_get_window (context);
     GstGLWindowX11 *window_x11 = GST_GL_WINDOW_X11 (window);
     gint ret;
@@ -391,25 +391,25 @@
   }
   /* FIXME do we want a window vfunc ? */
 #if GST_GL_HAVE_WINDOW_X11
-  if (GST_GL_IS_WINDOW_X11 (context->window)) {
+  if (GST_IS_GL_WINDOW_X11 (context->window)) {
     gst_gl_window_x11_create_window ((GstGLWindowX11 *) context->window);
   }
 #endif
 
   if (other_context == NULL) {
 #if GST_GL_HAVE_WINDOW_WAYLAND
-    if (GST_GL_IS_WINDOW_WAYLAND_EGL (context->window)) {
+    if (GST_IS_GL_WINDOW_WAYLAND_EGL (context->window)) {
       gst_gl_window_wayland_egl_create_window ((GstGLWindowWaylandEGL *)
           context->window);
     }
 #endif
 #if GST_GL_HAVE_WINDOW_WIN32
-    if (GST_GL_IS_WINDOW_WIN32 (context->window)) {
+    if (GST_IS_GL_WINDOW_WIN32 (context->window)) {
       gst_gl_window_win32_create_window ((GstGLWindowWin32 *) context->window);
     }
 #endif
 #if GST_GL_HAVE_WINDOW_DISPMANX
-    if (GST_GL_IS_WINDOW_DISPMANX_EGL (context->window)) {
+    if (GST_IS_GL_WINDOW_DISPMANX_EGL (context->window)) {
       gst_gl_window_dispmanx_egl_create_window ((GstGLWindowDispmanxEGL *)
           context->window);
     }
@@ -610,7 +610,7 @@
 #else
   /* On Linux the .so is only in -dev packages, try with a real soname
    * Proper compilers will optimize away the strcmp */
-  if (strcmp (G_MODULE_SUFFIX, "so") == 0)
+  if (g_strcmp0 (G_MODULE_SUFFIX, "so") == 0)
     module_egl = g_module_open ("libEGL.so.1", G_MODULE_BIND_LAZY);
 
   /* This automatically handles the suffix and even .la files */
diff --git a/gst-libs/gst/gl/egl/gstglcontext_egl.h b/gst-libs/gst/gl/egl/gstglcontext_egl.h
index 88b8bd7..8339e5a 100644
--- a/gst-libs/gst/gl/egl/gstglcontext_egl.h
+++ b/gst-libs/gst/gl/egl/gstglcontext_egl.h
@@ -34,8 +34,8 @@
 #define GST_GL_TYPE_CONTEXT_EGL         (gst_gl_context_egl_get_type())
 #define GST_GL_CONTEXT_EGL(o)           (G_TYPE_CHECK_INSTANCE_CAST((o), GST_GL_TYPE_CONTEXT_EGL, GstGLContextEGL))
 #define GST_GL_CONTEXT_EGL_CLASS(k)     (G_TYPE_CHECK_CLASS((k), GST_GL_TYPE_CONTEXT_EGL, GstGLContextEGLClass))
-#define GST_GL_IS_CONTEXT_EGL(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_CONTEXT_EGL))
-#define GST_GL_IS_CONTEXT_EGL_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_CONTEXT_EGL))
+#define GST_IS_GL_CONTEXT_EGL(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_CONTEXT_EGL))
+#define GST_IS_GL_CONTEXT_EGL_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_CONTEXT_EGL))
 #define GST_GL_CONTEXT_EGL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_GL_TYPE_CONTEXT_EGL, GstGLContextEGLClass))
 
 struct _GstGLContextEGL {
@@ -64,6 +64,9 @@
 guintptr            gst_gl_context_egl_get_current_context  (void);
 gpointer            gst_gl_context_egl_get_proc_address     (GstGLAPI gl_api, const gchar * name);
 
+const gchar * gst_gl_context_egl_get_error_string (void);
+
+
 /* TODO:
  * add support for EGL_NO_CONTEXT
  * add gst_gl_context_egl_new_gl_no_context that only manages the display
diff --git a/gst-libs/gst/gl/gl.h b/gst-libs/gst/gl/gl.h
index 4b1e8ef..dd54565 100644
--- a/gst-libs/gst/gl/gl.h
+++ b/gst-libs/gst/gl/gl.h
@@ -31,22 +31,25 @@
 #include <gst/gl/gstglapi.h>
 #include <gst/gl/gstgldisplay.h>
 #include <gst/gl/gstglcontext.h>
+#include <gst/gl/gstgldebug.h>
 #include <gst/gl/gstglfeature.h>
+#include <gst/gl/gstglformat.h>
 #include <gst/gl/gstglutils.h>
 #include <gst/gl/gstglwindow.h>
+#include <gst/gl/gstglslstage.h>
 #include <gst/gl/gstglshader.h>
+#include <gst/gl/gstglshaderstrings.h>
 #include <gst/gl/gstglcolorconvert.h>
 #include <gst/gl/gstglupload.h>
-#include <gst/gl/gstgluploadmeta.h>
-#include <gst/gl/gstgldownload.h>
-#include <gst/gl/gstglbasebuffer.h>
+#include <gst/gl/gstglbasememory.h>
+#include <gst/gl/gstglbuffer.h>
 #include <gst/gl/gstglmemory.h>
+#include <gst/gl/gstglmemorypbo.h>
 #include <gst/gl/gstglbufferpool.h>
 #include <gst/gl/gstglframebuffer.h>
 #include <gst/gl/gstglbasefilter.h>
 #include <gst/gl/gstglviewconvert.h>
 #include <gst/gl/gstglfilter.h>
-#include <gst/gl/gstglshadervariables.h>
 #include <gst/gl/gstglsyncmeta.h>
 #include <gst/gl/gstgloverlaycompositor.h>
 
diff --git a/gst-libs/gst/gl/glprototypes/Makefile.in b/gst-libs/gst/gl/glprototypes/Makefile.in
index 1958ba9..8937e4e 100644
--- a/gst-libs/gst/gl/glprototypes/Makefile.in
+++ b/gst-libs/gst/gl/glprototypes/Makefile.in
@@ -237,6 +237,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -274,6 +276,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -301,6 +305,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -319,6 +325,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -329,6 +337,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -354,6 +364,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -379,6 +391,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -510,6 +524,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -567,8 +583,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -638,6 +658,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst-libs/gst/gl/glprototypes/debug.h b/gst-libs/gst/gl/glprototypes/debug.h
index 6c53ea2..135d4e6 100644
--- a/gst-libs/gst/gl/glprototypes/debug.h
+++ b/gst-libs/gst/gl/glprototypes/debug.h
@@ -34,6 +34,7 @@
 GST_GL_EXT_FUNCTION (void, DebugMessageInsert,
                      (GLenum source,
                       GLenum type,
+                      GLuint id,
                       GLenum severity,
                       GLsizei length,
                       const gchar *message))
@@ -52,7 +53,7 @@
 GST_GL_EXT_FUNCTION (void, GetPointerv,
                      (GLenum pname,
                       gpointer * params))
-GST_GL_EXT_END ()                      
+GST_GL_EXT_END ()
 
 GST_GL_EXT_BEGIN (khr_debug,
                   GST_GL_API_OPENGL3,
@@ -88,3 +89,29 @@
                       gchar *label))
 GST_GL_EXT_END ()
 
+GST_GL_EXT_BEGIN (ext_debug_marker,
+                  GST_GL_API_NONE,
+                  255, 255,
+                  255, 255,
+                  "EXT\0",
+                  "debug_marker\0")
+GST_GL_EXT_FUNCTION (void, InsertEventMarker,
+                     (GLsizei length,
+                      const gchar * message))
+GST_GL_EXT_FUNCTION (void, PushGroupMarker,
+                     (GLsizei length,
+                      const gchar * message))
+GST_GL_EXT_FUNCTION (void, PopGroupMarker,
+                     (void))
+GST_GL_EXT_END ()
+
+GST_GL_EXT_BEGIN (gremedy_string_marker,
+                  GST_GL_API_NONE,
+                  255, 255,
+                  255, 255,
+                  "GREMEDY\0",
+                  "string_marker\0")
+GST_GL_EXT_FUNCTION (void, StringMarker,
+                     (GLsizei length,
+                      const gchar * message))
+GST_GL_EXT_END ()
diff --git a/gst-libs/gst/gl/gstgl_enums.h b/gst-libs/gst/gl/gstgl_enums.h
new file mode 100644
index 0000000..c4578e4
--- /dev/null
+++ b/gst-libs/gst/gl/gstgl_enums.h
@@ -0,0 +1,32 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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_ENUMS_H_
+#define _GST_GL_ENUMS_H_
+
+typedef enum
+{
+  GST_GL_TEXTURE_TARGET_NONE,
+  GST_GL_TEXTURE_TARGET_2D,
+  GST_GL_TEXTURE_TARGET_RECTANGLE,
+  GST_GL_TEXTURE_TARGET_EXTERNAL_OES,
+} GstGLTextureTarget;
+
+#endif /* _GST_GL_ENUMS_H_ */
diff --git a/gst-libs/gst/gl/gstgl_fwd.h b/gst-libs/gst/gl/gstgl_fwd.h
index cb29c6d..2a8a798 100644
--- a/gst-libs/gst/gl/gstgl_fwd.h
+++ b/gst-libs/gst/gl/gstgl_fwd.h
@@ -39,29 +39,37 @@
 typedef struct _GstGLWindowPrivate GstGLWindowPrivate;
 typedef struct _GstGLWindowClass   GstGLWindowClass;
 
-typedef struct _GstGLBaseBuffer GstGLBaseBuffer;
-typedef struct _GstGLBaseBufferAllocator GstGLBaseBufferAllocator;
-typedef struct _GstGLBaseBufferAllocatorClass GstGLBaseBufferAllocatorClass;
+typedef struct _GstGLBaseMemory GstGLBaseMemory;
+typedef struct _GstGLBaseMemoryAllocator GstGLBaseMemoryAllocator;
+typedef struct _GstGLBaseMemoryAllocatorClass GstGLBaseMemoryAllocatorClass;
+
+typedef struct _GstGLBuffer GstGLBuffer;
+typedef struct _GstGLBufferAllocator GstGLBufferAllocator;
+typedef struct _GstGLBufferAllocatorClass GstGLBufferAllocatorClass;
 
 typedef struct _GstGLMemory GstGLMemory;
-typedef struct _GstGLAllocator GstGLAllocator;
-typedef struct _GstGLAllocatorClass GstGLAllocatorClass;
+typedef struct _GstGLMemoryAllocator GstGLMemoryAllocator;
+typedef struct _GstGLMemoryAllocatorClass GstGLMemoryAllocatorClass;
+
+typedef struct _GstGLMemoryPBO GstGLMemoryPBO;
+typedef struct _GstGLMemoryPBOAllocator GstGLMemoryPBOAllocator;
+typedef struct _GstGLMemoryPBOAllocatorClass GstGLMemoryPBOAllocatorClass;
+
+typedef struct _GstGLSLStage        GstGLSLStage;
+typedef struct _GstGLSLStagePrivate GstGLSLStagePrivate;
+typedef struct _GstGLSLStageClass   GstGLSLStageClass;
 
 typedef struct _GstGLShader        GstGLShader;
 typedef struct _GstGLShaderPrivate GstGLShaderPrivate;
 typedef struct _GstGLShaderClass   GstGLShaderClass;
 
-typedef struct _GstGLDownload GstGLDownload;
-typedef struct _GstGLDownloadClass GstGLDownloadClass;
-typedef struct _GstGLDownloadPrivate GstGLDownloadPrivate;
-
 typedef struct _GstGLUpload GstGLUpload;
 typedef struct _GstGLUploadClass GstGLUploadClass;
 typedef struct _GstGLUploadPrivate GstGLUploadPrivate;
 
-typedef struct _GstGLUploadMeta GstGLUploadMeta;
-typedef struct _GstGLUploadMetaClass GstGLUploadMetaClass;
-typedef struct _GstGLUploadMetaPrivate GstGLUploadMetaPrivate;
+typedef struct _GstGLBufferPool GstGLBufferPool;
+typedef struct _GstGLBufferPoolClass GstGLBufferPoolClass;
+typedef struct _GstGLBufferPoolPrivate GstGLBufferPoolPrivate;
 
 typedef struct _GstGLColorConvert GstGLColorConvert;
 typedef struct _GstGLColorConvertClass GstGLColorConvertClass;
@@ -81,6 +89,72 @@
 typedef struct _GstGLOverlayCompositor GstGLOverlayCompositor;
 typedef struct _GstGLOverlayCompositorClass GstGLOverlayCompositorClass;
 
+#include <gst/gl/gstgl_enums.h>
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstGLBaseFilter, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstGLBaseMemoryAllocator, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstGLBufferAllocator, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstGLBufferPool, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstGLColorConvert, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstGLContext, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstGLDisplay, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstGLFilter, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstGLMemoryAllocator, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstGLMemoryPBOAllocator, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstGLOverlayCompositor, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstGLSLStage, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstGLShader, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstGLUpload, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstGLViewConvert, gst_object_unref)
+#endif
+
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstGLWindow, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif /* __GST_GL_FWD_H__ */
diff --git a/gst-libs/gst/gl/gstglapi.h b/gst-libs/gst/gl/gstglapi.h
index dd44b45..ab1a203 100644
--- a/gst-libs/gst/gl/gstglapi.h
+++ b/gst-libs/gst/gl/gstglapi.h
@@ -23,6 +23,13 @@
 
 #include <gst/gl/gstglconfig.h>
 
+/* This mimic GCC behaviour with system headers files even if GL headers may
+ * not be in the system header path. */
+#ifdef __GNUC__
+#pragma GCC diagnostic push
+#pragma GCC diagnostic ignored "-Wredundant-decls"
+#endif
+
 /* OpenGL 2.0 for Embedded Systems */
 #if GST_GL_HAVE_GLES2
 #ifndef GL_GLEXT_PROTOTYPES
@@ -57,6 +64,10 @@
 # endif
 #endif
 
+#ifdef __GNUC__
+#pragma GCC diagnostic pop
+#endif
+
 #ifdef WINAPI
 #define GSTGLAPI WINAPI
 #else
diff --git a/gst-libs/gst/gl/gstglbasebuffer.c b/gst-libs/gst/gl/gstglbasebuffer.c
deleted file mode 100644
index 495e104..0000000
--- a/gst-libs/gst/gl/gstglbasebuffer.c
+++ /dev/null
@@ -1,666 +0,0 @@
-/*
- * GStreamer
- * Copyright (C) 2015 Matthew Waters <matthew@centricular.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 <string.h>
-
-#include "gstglbasebuffer.h"
-#include "gstglutils.h"
-
-/**
- * SECTION:gstglbuffer
- * @short_description: memory subclass for GL buffers
- * @see_also: #GstMemory, #GstAllocator
- *
- * GstGLBaseBuffer is a #GstMemory subclass providing support for the mapping of
- * GL buffers.  
- *
- * Data is uploaded or downloaded from the GPU as is necessary.
- */
-
-/* Implementation notes:
- *
- * Currently does not take into account GLES2 differences (no mapbuffer)
- */
-
-#define USING_OPENGL(context) (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL, 1, 0))
-#define USING_OPENGL3(context) (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL3, 3, 1))
-#define USING_GLES(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES, 1, 0))
-#define USING_GLES2(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 2, 0))
-#define USING_GLES3(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 3, 0))
-
-/* compatibility definitions... */
-#ifndef GL_MAP_READ_BIT
-#define GL_MAP_READ_BIT 0x0001
-#endif
-#ifndef GL_MAP_WRITE_BIT
-#define GL_MAP_WRITE_BIT 0x0002
-#endif
-#ifndef GL_COPY_READ_BUFFER
-#define GL_COPY_READ_BUFFER 0x8F36
-#endif
-#ifndef GL_COPY_WRITE_BUFFER
-#define GL_COPY_WRITE_BUFFER 0x8F37
-#endif
-
-GST_DEBUG_CATEGORY_STATIC (GST_CAT_GL_BASE_BUFFER);
-#define GST_CAT_DEFUALT GST_CAT_GL_BASE_BUFFER
-
-static GstAllocator *_gl_base_buffer_allocator;
-
-GQuark
-gst_gl_base_buffer_error_quark (void)
-{
-  return g_quark_from_static_string ("gst-gl-base-buffer-error-quark");
-}
-
-static gboolean
-_default_create (GstGLBaseBuffer * mem, GError ** error)
-{
-  g_set_error (error, GST_GL_BASE_BUFFER_ERROR, GST_GL_BASE_BUFFER_ERROR_FAILED,
-      "subclass should define create() vfunc");
-
-  g_critical ("subclass should override "
-      "GstGLBaseBufferAllocatorClass::create() function");
-
-  return FALSE;
-}
-
-struct create_data
-{
-  GstGLBaseBuffer *mem;
-  gboolean result;
-};
-
-static void
-_mem_create_gl (GstGLContext * context, struct create_data *transfer)
-{
-  GstGLBaseBufferAllocatorClass *alloc_class;
-  GError *error = NULL;
-
-  alloc_class =
-      GST_GL_BASE_BUFFER_ALLOCATOR_GET_CLASS (transfer->mem->mem.allocator);
-
-  g_return_if_fail (alloc_class->create != NULL);
-
-  if ((transfer->result = alloc_class->create (transfer->mem, &error)))
-    return;
-
-  g_assert (error != NULL);
-
-  GST_CAT_ERROR (GST_CAT_GL_BASE_BUFFER, "Failed to create GL buffer: %s",
-      error->message);
-  g_clear_error (&error);
-}
-
-void
-gst_gl_base_buffer_init (GstGLBaseBuffer * mem, GstAllocator * allocator,
-    GstMemory * parent, GstGLContext * context, GstAllocationParams * params,
-    gsize size)
-{
-  gsize align = gst_memory_alignment, offset = 0, maxsize = size;
-  GstMemoryFlags flags = 0;
-  struct create_data data;
-
-  if (params) {
-    flags = params->flags;
-    align |= params->align;
-    offset = params->prefix;
-    maxsize += params->prefix + params->padding + align;
-  }
-
-  gst_memory_init (GST_MEMORY_CAST (mem), flags, allocator, parent, maxsize,
-      align, offset, size);
-
-  mem->context = gst_object_ref (context);
-  mem->data = NULL;
-  mem->alloc_data = NULL;
-
-  g_mutex_init (&mem->lock);
-
-  data.mem = mem;
-
-  gst_gl_context_thread_add (context,
-      (GstGLContextThreadFunc) _mem_create_gl, &data);
-  if (!data.result) {
-    GST_CAT_ERROR (GST_CAT_GL_BASE_BUFFER,
-        "Could not create GL buffer with context:%p", context);
-  }
-
-  GST_CAT_DEBUG (GST_CAT_GL_BASE_BUFFER, "new GL buffer memory:%p size:%"
-      G_GSIZE_FORMAT, mem, maxsize);
-}
-
-static gpointer
-_align_data (gpointer data, gsize align, gsize * maxsize)
-{
-  guint8 *ret = data;
-  gsize aoffset;
-
-  /* do alignment */
-  if ((aoffset = ((guintptr) ret & align))) {
-    aoffset = (align + 1) - aoffset;
-    ret += aoffset;
-    *maxsize -= aoffset;
-  }
-
-  return ret;
-}
-
-/* subclass usage only */
-GstGLBaseBuffer *
-gst_gl_base_buffer_alloc_data (GstGLBaseBuffer * gl_mem)
-{
-  GstMemory *mem = (GstMemory *) gl_mem;
-
-  if (gl_mem->data)
-    return gl_mem;
-
-  GST_CAT_LOG (GST_CAT_GL_BASE_BUFFER, "%p attempting allocation of data "
-      "pointer of size %" G_GSIZE_FORMAT, gl_mem, mem->maxsize);
-  gl_mem->alloc_data = g_try_malloc (mem->maxsize);
-
-  if (gl_mem->alloc_data == NULL) {
-    gst_memory_unref (mem);
-    return NULL;
-  }
-
-  gl_mem->data = _align_data (gl_mem->alloc_data, mem->align, &mem->maxsize);
-
-  GST_CAT_DEBUG (GST_CAT_GL_BASE_BUFFER, "%p allocated data pointer alloc %p, "
-      "data %p", gl_mem, gl_mem->alloc_data, gl_mem->data);
-
-  return gl_mem;
-}
-
-/* XXX: add as API? */
-static gpointer
-gst_gl_base_buffer_cpu_access (GstGLBaseBuffer * mem,
-    GstMapInfo * info, gsize size)
-{
-  const GstGLFuncs *gl = mem->context->gl_vtable;
-  gpointer data, ret;
-
-  gst_gl_base_buffer_alloc_data (mem);
-  ret = mem->data;
-
-  GST_CAT_LOG (GST_CAT_GL_BASE_BUFFER, "mapping id %d size %" G_GSIZE_FORMAT,
-      mem->id, size);
-
-  /* The extra data pointer indirection/memcpy is needed for coherent across
-   * concurrent map()'s in both GL and CPU */
-  if (GST_MEMORY_FLAG_IS_SET (mem, GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD)
-      && (info->flags & GST_MAP_GL) == 0 && (info->flags & GST_MAP_READ) != 0) {
-    gl->BindBuffer (mem->target, mem->id);
-
-    if (gl->MapBufferRange) {
-      /* FIXME: optionally remove this with a flag and return the
-       * glMapBufferRange pointer (requires
-       * GL_ARB_buffer_storage/GL4/GL_COHERENT_BIT) */
-      guint gl_map_flags = GL_MAP_READ_BIT;
-
-      data = gl->MapBufferRange (mem->target, 0, size, gl_map_flags);
-
-      if (data)
-        memcpy (mem->data, data, size);
-
-      gl->UnmapBuffer (mem->target);
-      ret = mem->data;
-    } else if (gl->GetBufferSubData) {
-      gl->GetBufferSubData (mem->target, 0, size, mem->data);
-      ret = mem->data;
-    } else {
-      ret = NULL;
-    }
-    gl->BindBuffer (mem->target, 0);
-  }
-
-  return ret;
-}
-
-/* XXX: add as API? */
-static void
-gst_gl_base_buffer_upload_cpu_write (GstGLBaseBuffer * mem, GstMapInfo * info,
-    gsize size)
-{
-  const GstGLFuncs *gl = mem->context->gl_vtable;
-  gpointer data;
-
-  if (!mem->data)
-    /* no data pointer has been written */
-    return;
-
-  /* The extra data pointer indirection/memcpy is needed for coherent across
-   * concurrent map()'s in both GL and CPU */
-  /* FIXME: uploading potentially half-written data for libav pushing READWRITE
-   * mapped buffers */
-  if (GST_MEMORY_FLAG_IS_SET (mem, GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD)
-      || (mem->map_flags & GST_MAP_WRITE) != 0) {
-    gl->BindBuffer (mem->target, mem->id);
-
-    if (gl->MapBufferRange) {
-      /* FIXME: optionally remove this with a flag and return the
-       * glMapBufferRange pointer (requires
-       * GL_ARB_buffer_storage/GL4/GL_COHERENT_BIT) */
-      guint gl_map_flags = GL_MAP_WRITE_BIT;
-
-      data = gl->MapBufferRange (mem->target, 0, size, gl_map_flags);
-
-      if (data)
-        memcpy (data, mem->data, size);
-
-      gl->UnmapBuffer (mem->target);
-    } else if (gl->BufferSubData) {
-      gl->BufferSubData (mem->target, 0, size, mem->data);
-    }
-    gl->BindBuffer (mem->target, 0);
-  }
-}
-
-static gpointer
-_default_map_buffer (GstGLBaseBuffer * mem, GstMapInfo * info, gsize size)
-{
-  if ((info->flags & GST_MAP_GL) != 0) {
-    if (info->flags & GST_MAP_READ) {
-      gst_gl_base_buffer_upload_cpu_write (mem, info, size);
-    }
-    return &mem->id;
-  } else {
-    return gst_gl_base_buffer_cpu_access (mem, info, size);
-  }
-
-  return NULL;
-}
-
-struct map_data
-{
-  GstGLBaseBuffer *mem;
-  GstMapInfo *info;
-  gsize size;
-  gpointer data;
-};
-
-static void
-_map_data_gl (GstGLContext * context, struct map_data *transfer)
-{
-  GstGLBaseBufferAllocatorClass *alloc_class;
-  GstGLBaseBuffer *mem = transfer->mem;
-  GstMapInfo *info = transfer->info;
-
-  alloc_class =
-      GST_GL_BASE_BUFFER_ALLOCATOR_GET_CLASS (transfer->mem->mem.allocator);
-
-  g_return_if_fail (alloc_class->map_buffer != NULL);
-
-  g_mutex_lock (&mem->lock);
-
-  GST_CAT_LOG (GST_CAT_GL_BASE_BUFFER, "mapping mem %p id %d flags %04x", mem,
-      mem->id, info->flags);
-
-  /* FIXME: validate map flags based on the memory domain */
-  if (mem->map_count++ == 0)
-    mem->map_flags = info->flags;
-  else {
-    /* assert that the flags are a subset of the first map flags */
-    g_assert ((((GST_MAP_GL - 1) & info->flags) & mem->map_flags) != 0);
-    GST_CAT_LOG (GST_CAT_GL_BASE_BUFFER, "multiple map no %d flags %04x "
-        "all flags %04x", mem->map_count, info->flags, mem->map_flags);
-  }
-
-  if ((info->flags & GST_MAP_GL) != (mem->map_flags & GST_MAP_GL))
-    mem->map_flags |= GST_MAP_GL;
-
-  if (info->flags & GST_MAP_GL)
-    mem->gl_map_count++;
-
-  transfer->data = alloc_class->map_buffer (transfer->mem, transfer->info,
-      transfer->size);
-
-  if (transfer->data) {
-    if (info->flags & GST_MAP_GL) {
-      if (info->flags & GST_MAP_WRITE)
-        GST_MINI_OBJECT_FLAG_SET (mem, GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD);
-      GST_MEMORY_FLAG_UNSET (mem, GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD);
-    } else {
-      if (info->flags & GST_MAP_WRITE)
-        GST_MINI_OBJECT_FLAG_SET (mem, GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD);
-      GST_MEMORY_FLAG_UNSET (mem, GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD);
-    }
-  }
-
-  g_mutex_unlock (&mem->lock);
-}
-
-static gpointer
-_mem_map_full (GstGLBaseBuffer * mem, GstMapInfo * info, gsize size)
-{
-  struct map_data transfer;
-
-  transfer.mem = mem;
-  transfer.info = info;
-  transfer.size = size;
-  transfer.data = NULL;
-
-  gst_gl_context_thread_add (mem->context,
-      (GstGLContextThreadFunc) _map_data_gl, &transfer);
-
-  return transfer.data;
-}
-
-static void
-_default_unmap_buffer (GstGLBaseBuffer * mem, GstMapInfo * info)
-{
-  /* XXX: optimistically transfer data */
-}
-
-struct unmap_data
-{
-  GstGLBaseBuffer *mem;
-  GstMapInfo *info;
-};
-
-static void
-_unmap_data_gl (GstGLContext * context, struct unmap_data *transfer)
-{
-  GstGLBaseBufferAllocatorClass *alloc_class;
-  GstGLBaseBuffer *mem = transfer->mem;
-  GstMapInfo *info = transfer->info;
-
-  alloc_class =
-      GST_GL_BASE_BUFFER_ALLOCATOR_GET_CLASS (transfer->mem->mem.allocator);
-
-  g_return_if_fail (alloc_class->unmap_buffer != NULL);
-
-  g_mutex_lock (&mem->lock);
-
-  GST_CAT_LOG (GST_CAT_GL_BASE_BUFFER, "unmapping mem %p id %d flags %04x", mem,
-      mem->id, info->flags);
-
-  alloc_class->unmap_buffer (transfer->mem, transfer->info);
-
-  if (info->flags & GST_MAP_GL && --mem->gl_map_count)
-    /* unset the gl flag */
-    mem->map_flags &= ~GST_MAP_GL;
-
-  if (--mem->map_count <= 0) {
-    mem->map_flags = 0;
-  }
-
-  if (info->flags & GST_MAP_GL) {
-    if (info->flags & GST_MAP_WRITE)
-      GST_MINI_OBJECT_FLAG_SET (mem, GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD);
-  } else {
-    if (info->flags & GST_MAP_WRITE)
-      GST_MINI_OBJECT_FLAG_SET (mem, GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD);
-  }
-
-  g_mutex_unlock (&mem->lock);
-}
-
-static void
-_mem_unmap_full (GstGLBaseBuffer * mem, GstMapInfo * info)
-{
-  struct unmap_data transfer;
-
-  transfer.mem = mem;
-  transfer.info = info;
-
-  gst_gl_context_thread_add (mem->context,
-      (GstGLContextThreadFunc) _unmap_data_gl, &transfer);
-}
-
-gboolean
-gst_gl_base_buffer_copy_buffer_sub_data (GstGLBaseBuffer * src,
-    GstGLBaseBuffer * dest, gssize offset, gssize size)
-{
-  const GstGLFuncs *gl = src->context->gl_vtable;
-  GstMapInfo sinfo, dinfo;
-
-  if (!gl->CopyBufferSubData)
-    /* This is GL(ES) 3.0+ only */
-    return FALSE;
-
-  if (!gst_memory_map ((GstMemory *) src, &sinfo, GST_MAP_READ | GST_MAP_GL)) {
-    GST_CAT_WARNING (GST_CAT_GL_BASE_BUFFER,
-        "failed to read map source memory %p", src);
-    return FALSE;
-  }
-
-  if (!gst_memory_map ((GstMemory *) dest, &dinfo, GST_MAP_WRITE | GST_MAP_GL)) {
-    GST_CAT_WARNING (GST_CAT_GL_BASE_BUFFER,
-        "failed to write map destination memory %p", dest);
-    gst_memory_unmap ((GstMemory *) src, &sinfo);
-    return FALSE;
-  }
-
-  gl->BindBuffer (GL_COPY_READ_BUFFER, src->id);
-  gl->BindBuffer (GL_COPY_WRITE_BUFFER, dest->id);
-  gl->CopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER,
-      offset, 0, size);
-
-  gst_memory_unmap ((GstMemory *) src, &sinfo);
-  gst_memory_unmap ((GstMemory *) dest, &dinfo);
-
-  return TRUE;
-}
-
-gboolean
-gst_gl_base_buffer_memcpy (GstGLBaseBuffer * src, GstGLBaseBuffer * dest,
-    gssize offset, gssize size)
-{
-  GstMapInfo sinfo, dinfo;
-
-  if (!gst_memory_map ((GstMemory *) src, &sinfo, GST_MAP_READ)) {
-    GST_CAT_WARNING (GST_CAT_GL_BASE_BUFFER,
-        "could not read map source memory %p", src);
-    return FALSE;
-  }
-
-  if (!gst_memory_map ((GstMemory *) dest, &dinfo, GST_MAP_WRITE)) {
-    GST_CAT_WARNING (GST_CAT_GL_BASE_BUFFER,
-        "could not write map dest memory %p", dest);
-    gst_memory_unmap ((GstMemory *) src, &sinfo);
-    return FALSE;
-  }
-
-  GST_CAT_DEBUG (GST_CAT_GL_BASE_BUFFER,
-      "memcpy %" G_GSSIZE_FORMAT " memory %p -> %p", size, src, dest);
-  memcpy (dinfo.data, sinfo.data + offset, size);
-  gst_memory_unmap ((GstMemory *) dest, &dinfo);
-  gst_memory_unmap ((GstMemory *) src, &sinfo);
-
-  return TRUE;
-}
-
-static GstGLBaseBuffer *
-_default_copy (GstGLBaseBuffer * src, gssize offset, gssize size)
-{
-  return NULL;
-}
-
-struct copy_params
-{
-  GstGLBaseBuffer *src;
-  GstGLBaseBuffer *dest;
-  gssize offset;
-  gssize size;
-  gboolean result;
-};
-
-static void
-_mem_copy_gl (GstGLContext * context, struct copy_params *transfer)
-{
-  GstGLBaseBufferAllocatorClass *alloc_class;
-
-  alloc_class =
-      GST_GL_BASE_BUFFER_ALLOCATOR_GET_CLASS (transfer->src->mem.allocator);
-
-  g_return_if_fail (alloc_class->copy != NULL);
-
-  transfer->dest =
-      alloc_class->copy (transfer->src, transfer->offset, transfer->size);
-}
-
-static GstMemory *
-_mem_copy (GstGLBaseBuffer * src, gssize offset, gssize size)
-{
-  struct copy_params transfer;
-
-  transfer.dest = NULL;
-  transfer.src = src;
-  transfer.offset = offset;
-  transfer.size = size;
-  if (size == -1 || size > 0)
-    gst_gl_context_thread_add (src->context,
-        (GstGLContextThreadFunc) _mem_copy_gl, &transfer);
-
-  return (GstMemory *) transfer.dest;
-}
-
-static GstMemory *
-_mem_share (GstGLBaseBuffer * mem, gssize offset, gssize size)
-{
-  return NULL;
-}
-
-static gboolean
-_mem_is_span (GstGLBaseBuffer * mem1, GstGLBaseBuffer * mem2, gsize * offset)
-{
-  return FALSE;
-}
-
-static GstMemory *
-_mem_alloc (GstAllocator * allocator, gsize size, GstAllocationParams * params)
-{
-  g_critical ("Subclass should override GstAllocatorClass::alloc() function");
-
-  return NULL;
-}
-
-static void
-_default_destroy (GstGLBaseBuffer * mem)
-{
-}
-
-static void
-_destroy_gl_objects (GstGLContext * context, GstGLBaseBuffer * mem)
-{
-  GstGLBaseBufferAllocatorClass *alloc_class;
-
-  alloc_class = GST_GL_BASE_BUFFER_ALLOCATOR_GET_CLASS (mem->mem.allocator);
-
-  g_return_if_fail (alloc_class->destroy != NULL);
-
-  alloc_class->destroy (mem);
-}
-
-static void
-_mem_free (GstAllocator * allocator, GstMemory * memory)
-{
-  GstGLBaseBuffer *mem = (GstGLBaseBuffer *) memory;
-
-  GST_CAT_TRACE (GST_CAT_GL_BASE_BUFFER, "freeing buffer memory:%p id:%u", mem,
-      mem->id);
-
-  gst_gl_context_thread_add (mem->context,
-      (GstGLContextThreadFunc) _destroy_gl_objects, mem);
-
-  g_mutex_clear (&mem->lock);
-
-  if (mem->alloc_data) {
-    g_free (mem->alloc_data);
-    mem->alloc_data = NULL;
-  }
-  mem->data = NULL;
-
-  gst_object_unref (mem->context);
-}
-
-G_DEFINE_TYPE (GstGLBaseBufferAllocator, gst_gl_base_buffer_allocator,
-    GST_TYPE_ALLOCATOR);
-
-static void
-gst_gl_base_buffer_allocator_class_init (GstGLBaseBufferAllocatorClass * klass)
-{
-  GstAllocatorClass *allocator_class = (GstAllocatorClass *) klass;
-
-  allocator_class->alloc = _mem_alloc;
-  allocator_class->free = _mem_free;
-
-  klass->create = _default_create;
-  klass->map_buffer = _default_map_buffer;
-  klass->unmap_buffer = _default_unmap_buffer;
-  klass->copy = _default_copy;
-  klass->destroy = _default_destroy;
-}
-
-static void
-gst_gl_base_buffer_allocator_init (GstGLBaseBufferAllocator * allocator)
-{
-  GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator);
-
-  alloc->mem_type = GST_GL_MEMORY_ALLOCATOR;
-  alloc->mem_map_full = (GstMemoryMapFullFunction) _mem_map_full;
-  alloc->mem_unmap_full = (GstMemoryUnmapFullFunction) _mem_unmap_full;
-  alloc->mem_copy = (GstMemoryCopyFunction) _mem_copy;
-  alloc->mem_share = (GstMemoryShareFunction) _mem_share;
-  alloc->mem_is_span = (GstMemoryIsSpanFunction) _mem_is_span;
-}
-
-/**
- * gst_gl_base_buffer_init_once:
- *
- * Initializes the GL Buffer allocator. It is safe to call this function
- * multiple times.  This must be called before any other GstGLBaseBuffer operation.
- */
-void
-gst_gl_base_buffer_init_once (void)
-{
-  static volatile gsize _init = 0;
-
-  if (g_once_init_enter (&_init)) {
-    GST_DEBUG_CATEGORY_INIT (GST_CAT_GL_BASE_BUFFER, "glbuffer", 0,
-        "OpenGL Buffer");
-
-    _gl_base_buffer_allocator =
-        g_object_new (gst_gl_base_buffer_allocator_get_type (), NULL);
-
-    gst_allocator_register (GST_GL_BASE_BUFFER_ALLOCATOR_NAME,
-        gst_object_ref (_gl_base_buffer_allocator));
-    g_once_init_leave (&_init, 1);
-  }
-}
-
-/**
- * gst_is_gl_base_buffer:
- * @mem:a #GstMemory
- * 
- * Returns: whether the memory at @mem is a #GstGLBaseBuffer
- */
-gboolean
-gst_is_gl_base_buffer (GstMemory * mem)
-{
-  return mem != NULL && mem->allocator != NULL &&
-      g_type_is_a (G_OBJECT_TYPE (mem->allocator),
-      GST_TYPE_GL_BASE_BUFFER_ALLOCATOR);
-}
diff --git a/gst-libs/gst/gl/gstglbasebuffer.h b/gst-libs/gst/gl/gstglbasebuffer.h
deleted file mode 100644
index 87c688d..0000000
--- a/gst-libs/gst/gl/gstglbasebuffer.h
+++ /dev/null
@@ -1,164 +0,0 @@
-/*
- * GStreamer
- * Copyright (C) 2015 Matthew Waters <matthew@centricular.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_BASE_BUFFER_H_
-#define _GST_GL_BASE_BUFFER_H_
-
-#include <gst/gst.h>
-#include <gst/gstallocator.h>
-#include <gst/gstmemory.h>
-
-#include <gst/gl/gstgl_fwd.h>
-
-G_BEGIN_DECLS
-
-#define GST_TYPE_GL_BASE_BUFFER_ALLOCATOR (gst_gl_base_buffer_allocator_get_type())
-GType gst_gl_base_buffer_allocator_get_type(void);
-
-#define GST_IS_GL_BASE_BUFFER_ALLOCATOR(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GL_ALLOCATOR))
-#define GST_IS_GL_BASE_BUFFER_ALLOCATOR_CLASS(klass)      (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GL_BASE_BUFFER_ALLOCATOR))
-#define GST_GL_BASE_BUFFER_ALLOCATOR_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_GL_BASE_BUFFER_ALLOCATOR, GstGLBaseBufferAllocatorClass))
-#define GST_GL_BASE_BUFFER_ALLOCATOR(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GL_BASE_BUFFER_ALLOCATOR, GstGLBaseBufferAllocator))
-#define GST_GL_BASE_BUFFER_ALLOCATOR_CLASS(klass)         (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GL_BASE_BUFFER_ALLOCATOR, GstGLBaseBufferAllocatorClass))
-#define GST_GL_BASE_BUFFER_ALLOCATOR_CAST(obj)            ((GstGLBaseBufferAllocator *)(obj))
-
-GQuark gst_gl_base_buffer_error_quark (void);
-#define GST_GL_BASE_BUFFER_ERROR (gst_gl_base_buffer_error_quark ())
-
-typedef enum
-{
-  GST_GL_BASE_BUFFER_ERROR_FAILED,
-  GST_GL_BASE_BUFFER_ERROR_OLD_LIBS,
-  GST_GL_BASE_BUFFER_ERROR_RESOURCE_UNAVAILABLE,
-} GstGLBufferError;
-
-typedef enum
-{
-  GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD   = (GST_MEMORY_FLAG_LAST << 0),
-  GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD     = (GST_MEMORY_FLAG_LAST << 1)
-} GstGLBaseBufferFlags;
-
-/**
- * GST_MAP_GL:
- *
- * Flag indicating that we should map the GL object instead of to system memory.
- *
- * Combining #GST_MAP_GL with #GST_MAP_WRITE has the same semantics as though
- * you are writing to OpenGL. Conversely, combining #GST_MAP_GL with
- * #GST_MAP_READ has the same semantics as though you are reading from OpenGL.
- */
-#define GST_MAP_GL (GST_MAP_FLAG_LAST << 1)
-
-/**
- * GstGLBaseBuffer:
- * @mem: the parent object
- * @context: the #GstGLContext to use for GL operations
- * @id: the buffer id for this memory
- * @target: the GL target of this texture for binding purposes
- *
- * Represents information about a GL buffer
- */
-struct _GstGLBaseBuffer
-{
-  GstMemory             mem;
-
-  GstGLContext         *context;
-  guint                 id;
-  guint                 target;
-
-  /* <protected> */
-  GMutex                lock;
-
-  GstMapFlags           map_flags;       /* cumulative map flags */
-  gint                  map_count;
-  gint                  gl_map_count;
-
-  gpointer              data;
-  /* <private> */
-  gpointer              alloc_data;
-};
-
-typedef gboolean          (*GstGLBaseBufferAllocatorCreateFunction)      (GstGLBaseBuffer * buffer, GError ** error);
-typedef gpointer          (*GstGLBaseBufferAllocatorMapBufferFunction)   (GstGLBaseBuffer * buffer, GstMapInfo * info, gsize maxsize);
-typedef void              (*GstGLBaseBufferAllocatorUnmapBufferFunction) (GstGLBaseBuffer * buffer, GstMapInfo * info);
-typedef GstGLBaseBuffer * (*GstGLBaseBufferAllocatorCopyFunction)        (GstGLBaseBuffer * buffer, gssize offset, gssize size);
-typedef void              (*GstGLBaseBufferAllocatorDestroyFunction)     (GstGLBaseBuffer * buffer);
-
-/**
- * GstGLBaseBufferAllocator
- *
- * Opaque #GstGLAllocator struct
- */
-struct _GstGLBaseBufferAllocator
-{
-  GstAllocator parent;
-};
-
-/**
- * GstGLBaseBufferAllocatorClass:
- *
- * The #GstGLBaseBufferAllocatorClass only contains private data
- */
-struct _GstGLBaseBufferAllocatorClass
-{
-  GstAllocatorClass parent_class;
-
-  GstGLBaseBufferAllocatorCreateFunction      create;
-  GstGLBaseBufferAllocatorMapBufferFunction   map_buffer;
-  GstGLBaseBufferAllocatorUnmapBufferFunction unmap_buffer;
-  GstGLBaseBufferAllocatorCopyFunction        copy;
-  GstGLBaseBufferAllocatorDestroyFunction     destroy;
-};
-
-#include <gst/gl/gl.h>
-
-#define GST_CAPS_FEATURE_MEMORY_GL_BUFFER "memory:GLBuffer"
-
-/**
- * GST_GL_BASE_BUFFER_ALLOCATOR_NAME:
- *
- * The name of the GL buffer allocator
- */
-#define GST_GL_BASE_BUFFER_ALLOCATOR_NAME   "GLBuffer"
-
-void          gst_gl_base_buffer_init_once (void);
-gboolean      gst_is_gl_base_buffer        (GstMemory * mem);
-
-void          gst_gl_base_buffer_init      (GstGLBaseBuffer * mem,
-                                            GstAllocator * allocator,
-                                            GstMemory * parent,
-                                            GstGLContext * context,
-                                            GstAllocationParams * params,
-                                            gsize maxsize);
-
-GstGLBaseBuffer * gst_gl_base_buffer_alloc_data  (GstGLBaseBuffer * gl_mem);
-
-gboolean gst_gl_base_buffer_copy_buffer_sub_data (GstGLBaseBuffer * src,
-                                                  GstGLBaseBuffer * dest,
-                                                  gssize offset,
-                                                  gssize size);
-gboolean gst_gl_base_buffer_memcpy               (GstGLBaseBuffer * src,
-                                                  GstGLBaseBuffer * dest,
-                                                  gssize offset,
-                                                  gssize size);
-
-G_END_DECLS
-
-#endif /* _GST_GL_BUFFER_H_ */
diff --git a/gst-libs/gst/gl/gstglbasefilter.c b/gst-libs/gst/gl/gstglbasefilter.c
index e7b2e23..c5d330e 100644
--- a/gst-libs/gst/gl/gstglbasefilter.c
+++ b/gst-libs/gst/gl/gstglbasefilter.c
@@ -150,6 +150,8 @@
   if (filter->display)
     gst_gl_display_filter_gl_api (filter->display,
         filter_class->supported_gl_api);
+
+  GST_ELEMENT_CLASS (parent_class)->set_context (element, context);
 }
 
 static gboolean
@@ -294,6 +296,9 @@
   GstGLBaseFilter *filter = GST_GL_BASE_FILTER (data);
   GstGLBaseFilterClass *filter_class = GST_GL_BASE_FILTER_GET_CLASS (filter);
 
+  gst_gl_insert_debug_marker (filter->context,
+      "starting element %s", GST_OBJECT_NAME (filter));
+
   if (filter_class->gl_start) {
     filter->priv->gl_result = filter_class->gl_start (filter);
   } else {
@@ -309,6 +314,9 @@
   GstGLBaseFilter *filter = GST_GL_BASE_FILTER (data);
   GstGLBaseFilterClass *filter_class = GST_GL_BASE_FILTER_GET_CLASS (filter);
 
+  gst_gl_insert_debug_marker (filter->context,
+      "stopping element %s", GST_OBJECT_NAME (filter));
+
   if (filter->priv->gl_started) {
     if (filter_class->gl_stop)
       filter_class->gl_stop (filter);
diff --git a/gst-libs/gst/gl/gstglbasememory.c b/gst-libs/gst/gl/gstglbasememory.c
new file mode 100644
index 0000000..a55603a
--- /dev/null
+++ b/gst-libs/gst/gl/gstglbasememory.c
@@ -0,0 +1,694 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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 <string.h>
+
+#include <gst/gl/gstglbasememory.h>
+
+/**
+ * SECTION:gstglbasememory
+ * @short_description: memory subclass for GL buffers
+ * @see_also: #GstMemory, #GstAllocator
+ *
+ * GstGLBaseMemory is a #GstMemory subclass providing the basis of support
+ * for the mapping of GL buffers.
+ *
+ * Data is uploaded or downloaded from the GPU as is necessary.
+ */
+
+#define USING_OPENGL(context) (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL, 1, 0))
+#define USING_OPENGL3(context) (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL3, 3, 1))
+#define USING_GLES(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES, 1, 0))
+#define USING_GLES2(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 2, 0))
+#define USING_GLES3(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 3, 0))
+
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_GL_BASE_MEMORY);
+#define GST_CAT_DEFUALT GST_CAT_GL_BASE_MEMORY
+
+GQuark
+gst_gl_base_memory_error_quark (void)
+{
+  return g_quark_from_static_string ("gst-gl-base-buffer-error-quark");
+}
+
+static gboolean
+_default_create (GstGLBaseMemory * mem, GError ** error)
+{
+  g_set_error (error, GST_GL_BASE_MEMORY_ERROR, GST_GL_BASE_MEMORY_ERROR_FAILED,
+      "subclass should define create() vfunc");
+
+  g_critical ("subclass should override "
+      "GstGLBaseMemoryAllocatorClass::create() function");
+
+  return FALSE;
+}
+
+struct create_data
+{
+  GstGLBaseMemory *mem;
+  gboolean result;
+};
+
+static void
+_mem_create_gl (GstGLContext * context, struct create_data *transfer)
+{
+  GstGLBaseMemoryAllocatorClass *alloc_class;
+  GError *error = NULL;
+
+  alloc_class =
+      GST_GL_BASE_MEMORY_ALLOCATOR_GET_CLASS (transfer->mem->mem.allocator);
+
+  g_return_if_fail (alloc_class->create != NULL);
+
+  if ((transfer->result = alloc_class->create (transfer->mem, &error)))
+    return;
+
+  g_assert (error != NULL);
+
+  GST_CAT_ERROR (GST_CAT_GL_BASE_MEMORY, "Failed to create GL buffer: %s",
+      error->message);
+  g_clear_error (&error);
+}
+
+/**
+ * gst_gl_base_memory_init:
+ * @mem: the #GstGLBaseMemory to initialize
+ * @allocator: the #GstAllocator to initialize with
+ * @parent: (allow-none): the parent #GstMemory to initialize with
+ * @context: the #GstGLContext to initialize with
+ * @params: (allow-none): the @GstAllocationParams to initialize with
+ * @size: the number of bytes to be allocated
+ * @user_data: (allow-none): user data to call @notify with
+ * @notify: (allow-none): a #GDestroyNotify
+ *
+ * Initializes @mem with the required parameters
+ */
+void
+gst_gl_base_memory_init (GstGLBaseMemory * mem, GstAllocator * allocator,
+    GstMemory * parent, GstGLContext * context, GstAllocationParams * params,
+    gsize size, gpointer user_data, GDestroyNotify notify)
+{
+  gsize align = gst_memory_alignment, offset = 0, maxsize;
+  GstMemoryFlags flags = 0;
+  struct create_data data;
+
+  /* A note on sizes.
+   * gl_mem->alloc_size: the size to allocate when we control the allocation.
+   *                     Size of the unaligned allocation.
+   * mem->maxsize: the size that is used by GstMemory for mapping, to map the
+   *               entire memory. The size of the aligned allocation
+   * mem->size: represents the size of the valid data. Can be reduced with
+   *            gst_memory_resize()
+   *
+   * It holds that:
+   * mem->size + mem->offset <= mem->maxsize
+   * and
+   * mem->maxsize + alignment offset <= gl_mem->alloc_size
+   *
+   * We need to add the alignment mask to the allocated size in order to have
+   * the freedom to align the gl_mem->data pointer correctly which may be offset
+   * by at most align bytes in the alloc_data pointer.
+   *
+   * maxsize is not suitable for this as it is used by GstMemory as the size
+   * to map with.
+   */
+  mem->alloc_size = maxsize = size;
+  if (params) {
+    flags = params->flags;
+    align |= params->align;
+    offset = params->prefix;
+    maxsize += params->prefix + params->padding;
+
+    /* deals with any alignment */
+    mem->alloc_size = maxsize + align;
+  }
+
+  gst_memory_init (GST_MEMORY_CAST (mem), flags, allocator, parent, maxsize,
+      align, offset, size);
+
+  mem->context = gst_object_ref (context);
+  mem->notify = notify;
+  mem->user_data = user_data;
+
+  g_mutex_init (&mem->lock);
+
+  data.mem = mem;
+
+  gst_gl_context_thread_add (context,
+      (GstGLContextThreadFunc) _mem_create_gl, &data);
+  if (!data.result) {
+    GST_CAT_ERROR (GST_CAT_GL_BASE_MEMORY,
+        "Could not create GL buffer with context:%p", context);
+  }
+
+  GST_CAT_DEBUG (GST_CAT_GL_BASE_MEMORY, "new GL buffer memory:%p size:%"
+      G_GSIZE_FORMAT, mem, maxsize);
+}
+
+static gpointer
+_align_data (gpointer data, gsize align, gsize * maxsize)
+{
+  guint8 *ret = data;
+  gsize aoffset;
+
+  /* do alignment */
+  if ((aoffset = ((guintptr) ret & align))) {
+    aoffset = (align + 1) - aoffset;
+    ret += aoffset;
+    *maxsize -= aoffset;
+  }
+
+  return ret;
+}
+
+/* subclass usage only */
+gboolean
+gst_gl_base_memory_alloc_data (GstGLBaseMemory * gl_mem)
+{
+  GstMemory *mem = (GstMemory *) gl_mem;
+
+  if (gl_mem->data)
+    return TRUE;
+
+  GST_CAT_LOG (GST_CAT_GL_BASE_MEMORY, "%p attempting allocation of data "
+      "pointer of size %" G_GSIZE_FORMAT, gl_mem, gl_mem->alloc_size);
+  gl_mem->alloc_data = g_try_malloc (gl_mem->alloc_size);
+
+  if (gl_mem->alloc_data == NULL)
+    return FALSE;
+
+  gl_mem->data = _align_data (gl_mem->alloc_data, mem->align, &mem->maxsize);
+
+  GST_CAT_DEBUG (GST_CAT_GL_BASE_MEMORY, "%p allocated data pointer alloc %p, "
+      "data %p", gl_mem, gl_mem->alloc_data, gl_mem->data);
+
+  return TRUE;
+}
+
+struct map_data
+{
+  GstGLBaseMemory *mem;
+  GstMapInfo *info;
+  gsize size;
+  gpointer data;
+};
+
+static void
+_map_data_gl (GstGLContext * context, struct map_data *transfer)
+{
+  GstGLBaseMemoryAllocatorClass *alloc_class;
+  GstGLBaseMemory *mem = transfer->mem;
+  GstMapInfo *info = transfer->info;
+
+  alloc_class =
+      GST_GL_BASE_MEMORY_ALLOCATOR_GET_CLASS (transfer->mem->mem.allocator);
+
+  g_return_if_fail (alloc_class->map != NULL);
+
+  g_mutex_lock (&mem->lock);
+
+  GST_CAT_LOG (GST_CAT_GL_BASE_MEMORY, "mapping mem %p flags %04x", mem,
+      info->flags);
+
+  /* FIXME: validate map flags based on the memory domain */
+  if (mem->map_count++ == 0)
+    mem->map_flags = info->flags;
+  else {
+    /* assert that the flags are a subset of the first map flags */
+    g_assert ((((GST_MAP_GL - 1) & info->flags) & mem->map_flags) != 0);
+    GST_CAT_LOG (GST_CAT_GL_BASE_MEMORY, "multiple map no %d flags %04x "
+        "all flags %04x", mem->map_count, info->flags, mem->map_flags);
+  }
+
+  if ((info->flags & GST_MAP_GL) != (mem->map_flags & GST_MAP_GL))
+    mem->map_flags |= GST_MAP_GL;
+
+  if (info->flags & GST_MAP_GL)
+    mem->gl_map_count++;
+
+  transfer->data = alloc_class->map (transfer->mem, transfer->info,
+      transfer->size);
+
+  if (transfer->data) {
+    if (info->flags & GST_MAP_GL) {
+      if (info->flags & GST_MAP_WRITE)
+        GST_MINI_OBJECT_FLAG_SET (mem,
+            GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD);
+      GST_MEMORY_FLAG_UNSET (mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD);
+    } else {
+      if (info->flags & GST_MAP_WRITE)
+        GST_MINI_OBJECT_FLAG_SET (mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD);
+      GST_MEMORY_FLAG_UNSET (mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD);
+    }
+  }
+
+  g_mutex_unlock (&mem->lock);
+}
+
+static gpointer
+_mem_map_full (GstGLBaseMemory * mem, GstMapInfo * info, gsize size)
+{
+  struct map_data transfer;
+
+  transfer.mem = mem;
+  transfer.info = info;
+  transfer.size = size;
+  transfer.data = NULL;
+
+  gst_gl_context_thread_add (mem->context,
+      (GstGLContextThreadFunc) _map_data_gl, &transfer);
+
+  return transfer.data;
+}
+
+struct unmap_data
+{
+  GstGLBaseMemory *mem;
+  GstMapInfo *info;
+};
+
+static void
+_unmap_data_gl (GstGLContext * context, struct unmap_data *transfer)
+{
+  GstGLBaseMemoryAllocatorClass *alloc_class;
+  GstGLBaseMemory *mem = transfer->mem;
+  GstMapInfo *info = transfer->info;
+
+  alloc_class =
+      GST_GL_BASE_MEMORY_ALLOCATOR_GET_CLASS (transfer->mem->mem.allocator);
+
+  g_return_if_fail (alloc_class->unmap != NULL);
+
+  g_mutex_lock (&mem->lock);
+
+  GST_CAT_LOG (GST_CAT_GL_BASE_MEMORY, "unmapping mem %p flags %04x", mem,
+      info->flags);
+
+  alloc_class->unmap (transfer->mem, transfer->info);
+
+  if (info->flags & GST_MAP_GL && --mem->gl_map_count)
+    /* unset the gl flag */
+    mem->map_flags &= ~GST_MAP_GL;
+
+  if (--mem->map_count <= 0) {
+    mem->map_flags = 0;
+  }
+
+  if (info->flags & GST_MAP_GL) {
+    if (info->flags & GST_MAP_WRITE)
+      GST_MINI_OBJECT_FLAG_SET (mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD);
+  } else {
+    if (info->flags & GST_MAP_WRITE)
+      GST_MINI_OBJECT_FLAG_SET (mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD);
+  }
+
+  g_mutex_unlock (&mem->lock);
+}
+
+static void
+_mem_unmap_full (GstGLBaseMemory * mem, GstMapInfo * info)
+{
+  struct unmap_data transfer;
+
+  transfer.mem = mem;
+  transfer.info = info;
+
+  gst_gl_context_thread_add (mem->context,
+      (GstGLContextThreadFunc) _unmap_data_gl, &transfer);
+}
+
+static GstGLBaseMemory *
+_default_copy (GstGLBaseMemory * src, gssize offset, gssize size)
+{
+  return NULL;
+}
+
+struct copy_params
+{
+  GstGLBaseMemory *src;
+  GstGLBaseMemory *dest;
+  gssize offset;
+  gssize size;
+  gboolean result;
+};
+
+static void
+_mem_copy_gl (GstGLContext * context, struct copy_params *transfer)
+{
+  GstGLBaseMemoryAllocatorClass *alloc_class;
+
+  alloc_class =
+      GST_GL_BASE_MEMORY_ALLOCATOR_GET_CLASS (transfer->src->mem.allocator);
+
+  g_return_if_fail (alloc_class->copy != NULL);
+
+  transfer->dest =
+      alloc_class->copy (transfer->src, transfer->offset, transfer->size);
+}
+
+static GstMemory *
+_mem_copy (GstGLBaseMemory * src, gssize offset, gssize size)
+{
+  struct copy_params transfer;
+
+  transfer.dest = NULL;
+  transfer.src = src;
+  transfer.offset = offset;
+  transfer.size = size;
+  if (size == -1 || size > 0)
+    gst_gl_context_thread_add (src->context,
+        (GstGLContextThreadFunc) _mem_copy_gl, &transfer);
+
+  return (GstMemory *) transfer.dest;
+}
+
+static GstMemory *
+_mem_share (GstGLBaseMemory * mem, gssize offset, gssize size)
+{
+  return NULL;
+}
+
+static gboolean
+_mem_is_span (GstGLBaseMemory * mem1, GstGLBaseMemory * mem2, gsize * offset)
+{
+  return FALSE;
+}
+
+static GstMemory *
+_mem_alloc (GstAllocator * allocator, gsize size, GstAllocationParams * params)
+{
+  g_critical ("Subclass should override GstAllocatorClass::alloc() function");
+
+  return NULL;
+}
+
+static void
+_default_destroy (GstGLBaseMemory * mem)
+{
+}
+
+static void
+_destroy_gl_objects (GstGLContext * context, GstGLBaseMemory * mem)
+{
+  GstGLBaseMemoryAllocatorClass *alloc_class;
+
+  alloc_class = GST_GL_BASE_MEMORY_ALLOCATOR_GET_CLASS (mem->mem.allocator);
+
+  g_return_if_fail (alloc_class->destroy != NULL);
+
+  alloc_class->destroy (mem);
+}
+
+static void
+_mem_free (GstAllocator * allocator, GstMemory * memory)
+{
+  GstGLBaseMemory *mem = (GstGLBaseMemory *) memory;
+
+  GST_CAT_TRACE (GST_CAT_GL_BASE_MEMORY, "freeing buffer memory:%p", mem);
+
+  gst_gl_context_thread_add (mem->context,
+      (GstGLContextThreadFunc) _destroy_gl_objects, mem);
+
+  g_mutex_clear (&mem->lock);
+
+  if (mem->alloc_data) {
+    g_free (mem->alloc_data);
+    mem->alloc_data = NULL;
+  }
+  mem->data = NULL;
+
+  if (mem->notify)
+    mem->notify (mem->user_data);
+
+  gst_object_unref (mem->context);
+}
+
+/**
+ * gst_gl_base_memory_init_once:
+ *
+ * Initializes the GL Base Memory allocator. It is safe to call this function
+ * multiple times.  This must be called before any other GstGLBaseMemory operation.
+ */
+void
+gst_gl_base_memory_init_once (void)
+{
+  static volatile gsize _init = 0;
+
+  if (g_once_init_enter (&_init)) {
+    GST_DEBUG_CATEGORY_INIT (GST_CAT_GL_BASE_MEMORY, "glbasememory", 0,
+        "OpenGL BaseMemory");
+
+    g_once_init_leave (&_init, 1);
+  }
+}
+
+G_DEFINE_ABSTRACT_TYPE (GstGLBaseMemoryAllocator, gst_gl_base_memory_allocator,
+    GST_TYPE_ALLOCATOR);
+
+static void
+gst_gl_base_memory_allocator_class_init (GstGLBaseMemoryAllocatorClass * klass)
+{
+  GstAllocatorClass *allocator_class = (GstAllocatorClass *) klass;
+
+  allocator_class->alloc = _mem_alloc;
+  allocator_class->free = _mem_free;
+
+  klass->create = _default_create;
+  klass->copy = _default_copy;
+  klass->destroy = _default_destroy;
+}
+
+static void
+gst_gl_base_memory_allocator_init (GstGLBaseMemoryAllocator * allocator)
+{
+  GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator);
+
+  /* Keep the fallback copy function around, we will need it when copying with
+   * at an offset or smaller size */
+  allocator->fallback_mem_copy = alloc->mem_copy;
+
+  alloc->mem_map_full = (GstMemoryMapFullFunction) _mem_map_full;
+  alloc->mem_unmap_full = (GstMemoryUnmapFullFunction) _mem_unmap_full;
+  alloc->mem_copy = (GstMemoryCopyFunction) _mem_copy;
+  alloc->mem_share = (GstMemoryShareFunction) _mem_share;
+  alloc->mem_is_span = (GstMemoryIsSpanFunction) _mem_is_span;
+}
+
+/**
+ * gst_is_gl_base_memory:
+ * @mem:a #GstMemory
+ * 
+ * Returns: whether the memory at @mem is a #GstGLBaseMemory
+ */
+gboolean
+gst_is_gl_base_memory (GstMemory * mem)
+{
+  return mem != NULL && mem->allocator != NULL &&
+      g_type_is_a (G_OBJECT_TYPE (mem->allocator),
+      GST_TYPE_GL_BASE_MEMORY_ALLOCATOR);
+}
+
+/**
+ * gst_gl_base_memory_memcpy:
+ * @src: the source #GstGLBaseMemory
+ * @dest: the destination #GstGLBaseMemory
+ * @offset: the offset to start at
+ * @size: the number of bytes to copy
+ *
+ * Returns: whether the copy suceeded.
+ */
+gboolean
+gst_gl_base_memory_memcpy (GstGLBaseMemory * src, GstGLBaseMemory * dest,
+    gssize offset, gssize size)
+{
+  GstMapInfo sinfo, dinfo;
+
+  if (!gst_gl_base_memory_alloc_data (GST_GL_BASE_MEMORY_CAST (dest)))
+    return FALSE;
+
+  if (dest == NULL) {
+    GST_CAT_WARNING (GST_CAT_GL_BASE_MEMORY, "Could not copy GL Buffer");
+    return FALSE;
+  }
+
+  if (!gst_memory_map ((GstMemory *) src, &sinfo, GST_MAP_READ)) {
+    GST_CAT_WARNING (GST_CAT_GL_BASE_MEMORY,
+        "could not read map source memory %p", src);
+    return FALSE;
+  }
+
+  if (!gst_memory_map ((GstMemory *) dest, &dinfo, GST_MAP_WRITE)) {
+    GST_CAT_WARNING (GST_CAT_GL_BASE_MEMORY,
+        "could not write map dest memory %p", dest);
+    gst_memory_unmap ((GstMemory *) src, &sinfo);
+    return FALSE;
+  }
+
+  if (size == -1)
+    size = sinfo.size > offset ? sinfo.size - offset : 0;
+
+  GST_CAT_DEBUG (GST_CAT_GL_BASE_MEMORY,
+      "memcpy %" G_GSSIZE_FORMAT " memory %p -> %p", size, src, dest);
+  memcpy (dinfo.data, sinfo.data + offset, size);
+  gst_memory_unmap ((GstMemory *) dest, &dinfo);
+  gst_memory_unmap ((GstMemory *) src, &sinfo);
+
+  return TRUE;
+}
+
+/**
+ * gst_gl_allocation_params_init:
+ * @params: the #GstGLAllocationParams to initialize
+ * @struct_size: the struct size of the implementation
+ * @alloc: some alloc flags
+ * @copy: a copy function
+ * @free: a free function
+ * @context: (transfer none): a #GstGLContext
+ * @alloc_size: the number of bytes to allocate.
+ * @alloc_params: (transfer none) (allow-none): a #GstAllocationParams to apply
+ * @wrapped_data: (transfer none) (allow-none): a sysmem data pointer to initialize the allocation with
+ * @gl_handle: (transfer none): a GL handle to initialize the allocation with
+ * @user_data: (transfer none) (allow-none): user data to call @notify with
+ * @notify: (allow-none): a #GDestroyNotify
+ *
+ * @notify will be called once for each allocated memory using these @params
+ * when freeing the memory.
+ *
+ * Returns: whether the paramaters could be initialized
+ */
+gboolean
+gst_gl_allocation_params_init (GstGLAllocationParams * params,
+    gsize struct_size, guint alloc_flags, GstGLAllocationParamsCopyFunc copy,
+    GstGLAllocationParamsFreeFunc free, GstGLContext * context,
+    gsize alloc_size, GstAllocationParams * alloc_params,
+    gpointer wrapped_data, guint gl_handle, gpointer user_data,
+    GDestroyNotify notify)
+{
+  memset (params, 0, sizeof (*params));
+
+  g_return_val_if_fail (struct_size > 0, FALSE);
+  g_return_val_if_fail (copy != NULL, FALSE);
+  g_return_val_if_fail (free != NULL, FALSE);
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), FALSE);
+
+  params->struct_size = struct_size;
+  params->alloc_size = alloc_size;
+  params->copy = copy;
+  params->free = free;
+  params->alloc_flags = alloc_flags;
+  params->context = gst_object_ref (context);
+  if (alloc_params)
+    params->alloc_params = gst_allocation_params_copy (alloc_params);
+  params->notify = notify;
+  params->user_data = user_data;
+  params->wrapped_data = wrapped_data;
+  params->gl_handle = gl_handle;
+
+  return TRUE;
+}
+
+/**
+ * gst_gl_allocation_params_copy:
+ * @src: the #GstGLAllocationParams to initialize
+ *
+ * Returns: a copy of the #GstGLAllocationParams specified by @src or %NULL on
+ *          failure
+ */
+GstGLAllocationParams *
+gst_gl_allocation_params_copy (GstGLAllocationParams * src)
+{
+  GstGLAllocationParams *dest;
+
+  g_return_val_if_fail (src != NULL, NULL);
+
+  dest = g_malloc0 (src->struct_size);
+
+  if (src->copy)
+    src->copy (src, dest);
+
+  return dest;
+}
+
+/**
+ * gst_gl_allocation_params_free:
+ * @params: the #GstGLAllocationParams to initialize
+ *
+ * Frees the #GstGLAllocationParams and all associated data.
+ */
+void
+gst_gl_allocation_params_free (GstGLAllocationParams * params)
+{
+  if (params->free)
+    params->free (params);
+
+  g_free (params);
+}
+
+void
+gst_gl_allocation_params_free_data (GstGLAllocationParams * params)
+{
+  if (params->context)
+    gst_object_unref (params->context);
+  if (params->alloc_params)
+    gst_allocation_params_free (params->alloc_params);
+}
+
+void
+gst_gl_allocation_params_copy_data (GstGLAllocationParams * src,
+    GstGLAllocationParams * dest)
+{
+  gst_gl_allocation_params_init (dest, src->struct_size, src->alloc_flags,
+      src->copy, src->free, NULL, src->alloc_size, NULL, src->wrapped_data,
+      src->gl_handle, src->user_data, src->notify);
+
+  if (src->context)
+    dest->context = gst_object_ref (src->context);
+  if (src->alloc_params)
+    dest->alloc_params = gst_allocation_params_copy (src->alloc_params);
+}
+
+G_DEFINE_BOXED_TYPE (GstGLAllocationParams, gst_gl_allocation_params,
+    (GBoxedCopyFunc) gst_gl_allocation_params_copy,
+    (GBoxedFreeFunc) gst_gl_allocation_params_free);
+
+/**
+ * gst_gl_base_memory_alloc:
+ * @allocator: a #GstGLBaseMemoryAllocator
+ * @params: the #GstGLAllocationParams to allocate the memory with
+ *
+ * Returns: a new #GstGLBaseMemory from @allocator with the requested @params.
+ */
+GstGLBaseMemory *
+gst_gl_base_memory_alloc (GstGLBaseMemoryAllocator * allocator,
+    GstGLAllocationParams * params)
+{
+  GstGLBaseMemoryAllocatorClass *alloc_class;
+
+  alloc_class = GST_GL_BASE_MEMORY_ALLOCATOR_GET_CLASS (allocator);
+
+  g_return_val_if_fail (alloc_class != NULL, NULL);
+  g_return_val_if_fail (alloc_class->alloc != NULL, NULL);
+
+  return alloc_class->alloc (allocator, params);
+}
diff --git a/gst-libs/gst/gl/gstglbasememory.h b/gst-libs/gst/gl/gstglbasememory.h
new file mode 100644
index 0000000..ad9f68f
--- /dev/null
+++ b/gst-libs/gst/gl/gstglbasememory.h
@@ -0,0 +1,238 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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_BASE_MEMORY_H_
+#define _GST_GL_BASE_MEMORY_H_
+
+#include <gst/gst.h>
+#include <gst/gstallocator.h>
+#include <gst/gstmemory.h>
+
+#include <gst/gl/gstgl_fwd.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_GL_BASE_MEMORY_ALLOCATOR (gst_gl_base_memory_allocator_get_type())
+GType gst_gl_base_memory_allocator_get_type(void);
+
+#define GST_IS_GL_BASE_MEMORY_ALLOCATOR(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GL_ALLOCATOR))
+#define GST_IS_GL_BASE_MEMORY_ALLOCATOR_CLASS(klass)      (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GL_BASE_MEMORY_ALLOCATOR))
+#define GST_GL_BASE_MEMORY_ALLOCATOR_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_GL_BASE_MEMORY_ALLOCATOR, GstGLBaseMemoryAllocatorClass))
+#define GST_GL_BASE_MEMORY_ALLOCATOR(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GL_BASE_MEMORY_ALLOCATOR, GstGLBaseMemoryAllocator))
+#define GST_GL_BASE_MEMORY_ALLOCATOR_CLASS(klass)         (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GL_BASE_MEMORY_ALLOCATOR, GstGLBaseMemoryAllocatorClass))
+#define GST_GL_BASE_MEMORY_ALLOCATOR_CAST(obj)            ((GstGLBaseMemoryAllocator *)(obj))
+
+#define GST_GL_BASE_MEMORY_CAST(mem) ((GstGLBaseMemory *)mem)
+
+GQuark gst_gl_base_memory_error_quark (void);
+#define GST_GL_BASE_MEMORY_ERROR (gst_gl_base_memory_error_quark ())
+
+typedef enum
+{
+  GST_GL_BASE_MEMORY_ERROR_FAILED,
+  GST_GL_BASE_MEMORY_ERROR_OLD_LIBS,
+  GST_GL_BASE_MEMORY_ERROR_RESOURCE_UNAVAILABLE,
+} GstGLBaseMemoryError;
+
+typedef enum
+{
+  GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD   = (GST_MEMORY_FLAG_LAST << 0),
+  GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD     = (GST_MEMORY_FLAG_LAST << 1)
+} GstGLBaseMemoryTransfer;
+
+/**
+ * GST_MAP_GL:
+ *
+ * Flag indicating that we should map the GL object instead of to system memory.
+ *
+ * Combining #GST_MAP_GL with #GST_MAP_WRITE has the same semantics as though
+ * you are writing to OpenGL. Conversely, combining #GST_MAP_GL with
+ * #GST_MAP_READ has the same semantics as though you are reading from OpenGL.
+ */
+#define GST_MAP_GL (GST_MAP_FLAG_LAST << 1)
+
+/**
+ * GstGLBaseMemory:
+ * @mem: the parent object
+ * @context: the #GstGLContext to use for GL operations
+ *
+ * Represents information about a GL memory object
+ */
+struct _GstGLBaseMemory
+{
+  GstMemory             mem;
+
+  GstGLContext         *context;
+
+  /* <protected> */
+  GMutex                lock;
+
+  GstMapFlags           map_flags;       /* cumulative map flags */
+  gint                  map_count;
+  gint                  gl_map_count;
+
+  gpointer              data;
+
+  /* <private> */
+  gsize                 alloc_size;     /* because maxsize is used for mapping */
+  gpointer              alloc_data;
+
+  GDestroyNotify        notify;
+  gpointer              user_data;
+};
+
+typedef struct _GstGLAllocationParams GstGLAllocationParams;
+/* subclass has to compose with the parent class */
+typedef void    (*GstGLAllocationParamsCopyFunc)    (GstGLAllocationParams * src, GstGLAllocationParams * dest);
+/* subclass has to compose with the parent class */
+typedef void    (*GstGLAllocationParamsFreeFunc)    (gpointer params);
+
+#define GST_TYPE_GL_ALLOCATION_PARAMS (gst_gl_allocation_params_get_type())
+GType gst_gl_allocation_params_get_type (void);
+
+#define GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_ALLOC (1 << 0)
+#define GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_SYSMEM (1 << 1)
+#define GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE (1 << 2)
+#define GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_USER (1 << 16)
+
+/* Because GstAllocationParams is not subclassable, start our own subclass
+ * chain.  FIXME: 2.0 make GstAllocationParams subclassable */
+struct _GstGLAllocationParams
+{
+  gsize                             struct_size;
+  GstGLAllocationParamsCopyFunc     copy;
+  GstGLAllocationParamsFreeFunc     free;
+
+  guint                             alloc_flags;
+  gsize                             alloc_size;
+  GstAllocationParams              *alloc_params;
+  GstGLContext                     *context;
+  GDestroyNotify                    notify;
+  gpointer                          user_data;
+
+  /* GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_SYSMEM only */
+  gpointer                          wrapped_data;
+  /* GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE only */
+  guint                             gl_handle;
+};
+
+gboolean                gst_gl_allocation_params_init       (GstGLAllocationParams * params,
+                                                             gsize struct_size,
+                                                             guint alloc_flags,
+                                                             GstGLAllocationParamsCopyFunc copy,
+                                                             GstGLAllocationParamsFreeFunc free,
+                                                             GstGLContext * context,
+                                                             gsize alloc_size,
+                                                             GstAllocationParams * alloc_params,
+                                                             gpointer wrapped_data,
+                                                             guint gl_handle,
+                                                             gpointer user_data,
+                                                             GDestroyNotify notify);
+
+/* free with gst_gl_allocation_params_free */
+GstGLAllocationParams * gst_gl_allocation_params_copy       (GstGLAllocationParams * src);
+void                    gst_gl_allocation_params_free       (GstGLAllocationParams * params);
+
+/* subclass usage */
+void                    gst_gl_allocation_params_free_data  (GstGLAllocationParams * params);
+/* subclass usage */
+void                    gst_gl_allocation_params_copy_data  (GstGLAllocationParams * src,
+                                                             GstGLAllocationParams * dest);
+
+typedef GstGLBaseMemory *   (*GstGLBaseMemoryAllocatorAllocFunction)        (GstGLBaseMemoryAllocator * allocator,
+                                                                             GstGLAllocationParams * params);
+typedef gboolean            (*GstGLBaseMemoryAllocatorCreateFunction)       (GstGLBaseMemory * mem,
+                                                                             GError ** error);
+typedef gpointer            (*GstGLBaseMemoryAllocatorMapFunction)          (GstGLBaseMemory * mem,
+                                                                             GstMapInfo * info,
+                                                                             gsize maxsize);
+typedef void                (*GstGLBaseMemoryAllocatorUnmapFunction)        (GstGLBaseMemory * mem,
+                                                                             GstMapInfo * info);
+typedef GstGLBaseMemory *   (*GstGLBaseMemoryAllocatorCopyFunction)         (GstGLBaseMemory * mem,
+                                                                             gssize offset,
+                                                                             gssize size);
+typedef void                (*GstGLBaseMemoryAllocatorDestroyFunction)      (GstGLBaseMemory * mem);
+
+/**
+ * GstGLBaseMemoryAllocator
+ *
+ * Opaque #GstGLAllocator struct
+ */
+struct _GstGLBaseMemoryAllocator
+{
+  GstAllocator parent;
+  GstMemoryCopyFunction fallback_mem_copy;
+};
+
+/**
+ * GstGLBaseMemoryAllocatorClass:
+ *
+ * The #GstGLBaseMemoryAllocatorClass only contains private data
+ */
+struct _GstGLBaseMemoryAllocatorClass
+{
+  GstAllocatorClass parent_class;
+
+  GstGLBaseMemoryAllocatorAllocFunction         alloc;
+
+  GstGLBaseMemoryAllocatorCreateFunction        create;
+  GstGLBaseMemoryAllocatorMapFunction           map;
+#if 0
+  GstGLBaseMemoryAllocatorFlushFunction         flush;        /* make CPU writes visible to the GPU */
+  GstGLBaseMemoryAllocatorInvalidateFunction    invalidate;   /* make GPU writes visible to the CPU */
+#endif
+  GstGLBaseMemoryAllocatorUnmapFunction         unmap;
+  GstGLBaseMemoryAllocatorCopyFunction          copy;
+  GstGLBaseMemoryAllocatorDestroyFunction       destroy;
+};
+
+#include <gst/gl/gl.h>
+
+/**
+ * GST_GL_BASE_MEMORY_ALLOCATOR_NAME:
+ *
+ * The name of the GL buffer allocator
+ */
+#define GST_GL_BASE_MEMORY_ALLOCATOR_NAME   "GLBaseMemory"
+
+void          gst_gl_base_memory_init_once (void);
+gboolean      gst_is_gl_base_memory        (GstMemory * mem);
+
+void          gst_gl_base_memory_init      (GstGLBaseMemory * mem,
+                                            GstAllocator * allocator,
+                                            GstMemory * parent,
+                                            GstGLContext * context,
+                                            GstAllocationParams * params,
+                                            gsize maxsize,
+                                            gpointer user_data,
+                                            GDestroyNotify notify);
+
+gboolean      gst_gl_base_memory_alloc_data (GstGLBaseMemory * gl_mem);
+gboolean      gst_gl_base_memory_memcpy     (GstGLBaseMemory * src,
+                                             GstGLBaseMemory * dest,
+                                             gssize offset,
+                                             gssize size);
+
+GstGLBaseMemory *   gst_gl_base_memory_alloc    (GstGLBaseMemoryAllocator * allocator,
+                                                 GstGLAllocationParams * params);
+
+G_END_DECLS
+
+#endif /* _GST_GL_BUFFER_H_ */
diff --git a/gst-libs/gst/gl/gstglbuffer.c b/gst-libs/gst/gl/gstglbuffer.c
new file mode 100644
index 0000000..4b01000
--- /dev/null
+++ b/gst-libs/gst/gl/gstglbuffer.c
@@ -0,0 +1,449 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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 <string.h>
+
+#include "gstglbuffer.h"
+#include "gstglutils.h"
+
+/**
+ * SECTION:gstglbuffer
+ * @short_description: memory subclass for GL buffers
+ * @see_also: #GstMemory, #GstAllocator
+ *
+ * GstGLBuffer is a #GstMemory subclass providing support for the mapping of
+ * GL buffers.  
+ *
+ * Data is uploaded or downloaded from the GPU as is necessary.
+ */
+
+/* Implementation notes:
+ *
+ * Currently does not take into account GLES2 differences (no mapbuffer)
+ */
+
+#define USING_OPENGL(context) (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL, 1, 0))
+#define USING_OPENGL3(context) (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL3, 3, 1))
+#define USING_GLES(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES, 1, 0))
+#define USING_GLES2(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 2, 0))
+#define USING_GLES3(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 3, 0))
+
+/* compatibility definitions... */
+#ifndef GL_MAP_READ_BIT
+#define GL_MAP_READ_BIT 0x0001
+#endif
+#ifndef GL_MAP_WRITE_BIT
+#define GL_MAP_WRITE_BIT 0x0002
+#endif
+#ifndef GL_COPY_READ_BUFFER
+#define GL_COPY_READ_BUFFER 0x8F36
+#endif
+#ifndef GL_COPY_WRITE_BUFFER
+#define GL_COPY_WRITE_BUFFER 0x8F37
+#endif
+
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_GL_BUFFER);
+#define GST_CAT_DEFUALT GST_CAT_GL_BUFFER
+
+static GstAllocator *_gl_buffer_allocator;
+
+static gboolean
+_gl_buffer_create (GstGLBuffer * gl_mem, GError ** error)
+{
+  const GstGLFuncs *gl = gl_mem->mem.context->gl_vtable;
+
+  gl->GenBuffers (1, &gl_mem->id);
+  gl->BindBuffer (gl_mem->target, gl_mem->id);
+  gl->BufferData (gl_mem->target, gl_mem->mem.mem.maxsize, NULL,
+      gl_mem->usage_hints);
+  gl->BindBuffer (gl_mem->target, 0);
+
+  return TRUE;
+}
+
+struct create_data
+{
+  GstGLBuffer *mem;
+  gboolean result;
+};
+
+static void
+_gl_buffer_init (GstGLBuffer * mem, GstAllocator * allocator,
+    GstMemory * parent, GstGLContext * context, guint gl_target, guint gl_usage,
+    GstAllocationParams * params, gsize size)
+{
+  mem->target = gl_target;
+  mem->usage_hints = gl_usage;
+
+  gst_gl_base_memory_init ((GstGLBaseMemory *) mem, allocator, parent, context,
+      params, size, NULL, NULL);
+
+  GST_CAT_DEBUG (GST_CAT_GL_BUFFER, "new GL buffer memory:%p size:%"
+      G_GSIZE_FORMAT, mem, mem->mem.mem.maxsize);
+}
+
+static GstGLBuffer *
+_gl_buffer_new (GstAllocator * allocator, GstMemory * parent,
+    GstGLContext * context, guint gl_target, guint gl_usage,
+    GstAllocationParams * params, gsize size)
+{
+  GstGLBuffer *ret = g_new0 (GstGLBuffer, 1);
+  _gl_buffer_init (ret, allocator, parent, context, gl_target, gl_usage,
+      params, size);
+
+  return ret;
+}
+
+static gpointer
+gst_gl_buffer_cpu_access (GstGLBuffer * mem, GstMapInfo * info, gsize size)
+{
+  const GstGLFuncs *gl = mem->mem.context->gl_vtable;
+  gpointer data, ret;
+
+  if (!gst_gl_base_memory_alloc_data (GST_GL_BASE_MEMORY_CAST (mem)))
+    return NULL;
+
+  ret = mem->mem.data;
+
+  GST_CAT_LOG (GST_CAT_GL_BUFFER, "mapping id %d size %" G_GSIZE_FORMAT,
+      mem->id, size);
+
+  /* The extra data pointer indirection/memcpy is needed for coherent across
+   * concurrent map()'s in both GL and CPU */
+  if (GST_MEMORY_FLAG_IS_SET (mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD)
+      && (info->flags & GST_MAP_GL) == 0 && (info->flags & GST_MAP_READ) != 0) {
+    gl->BindBuffer (mem->target, mem->id);
+
+    if (gl->MapBufferRange) {
+      /* FIXME: optionally remove this with a flag and return the
+       * glMapBufferRange pointer (requires
+       * GL_ARB_buffer_storage/GL4/GL_COHERENT_BIT) */
+      guint gl_map_flags = GL_MAP_READ_BIT;
+
+      data = gl->MapBufferRange (mem->target, 0, size, gl_map_flags);
+
+      if (data)
+        memcpy (mem->mem.data, data, size);
+
+      gl->UnmapBuffer (mem->target);
+      ret = mem->mem.data;
+    } else if (gl->GetBufferSubData) {
+      gl->GetBufferSubData (mem->target, 0, size, mem->mem.data);
+      ret = mem->mem.data;
+    } else {
+      ret = NULL;
+    }
+    gl->BindBuffer (mem->target, 0);
+  }
+
+  return ret;
+}
+
+static void
+gst_gl_buffer_upload_cpu_write (GstGLBuffer * mem, GstMapInfo * info,
+    gsize size)
+{
+  const GstGLFuncs *gl = mem->mem.context->gl_vtable;
+  gpointer data;
+
+  if (!mem->mem.data)
+    /* no data pointer has been written */
+    return;
+
+  /* The extra data pointer indirection/memcpy is needed for coherent across
+   * concurrent map()'s in both GL and CPU */
+  /* FIXME: uploading potentially half-written data for libav pushing READWRITE
+   * mapped buffers */
+  if (GST_MEMORY_FLAG_IS_SET (mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD)
+      || (mem->mem.map_flags & GST_MAP_WRITE) != 0) {
+    gl->BindBuffer (mem->target, mem->id);
+
+    if (gl->MapBufferRange) {
+      /* FIXME: optionally remove this with a flag and return the
+       * glMapBufferRange pointer (requires
+       * GL_ARB_buffer_storage/GL4/GL_COHERENT_BIT) */
+      guint gl_map_flags = GL_MAP_WRITE_BIT;
+
+      data = gl->MapBufferRange (mem->target, 0, size, gl_map_flags);
+
+      if (data)
+        memcpy (data, mem->mem.data, size);
+
+      gl->UnmapBuffer (mem->target);
+    } else if (gl->BufferSubData) {
+      gl->BufferSubData (mem->target, 0, size, mem->mem.data);
+    }
+    gl->BindBuffer (mem->target, 0);
+  }
+}
+
+static gpointer
+_gl_buffer_map (GstGLBuffer * mem, GstMapInfo * info, gsize size)
+{
+  const GstGLFuncs *gl = mem->mem.context->gl_vtable;
+
+  if ((info->flags & GST_MAP_GL) != 0) {
+    if (info->flags & GST_MAP_READ) {
+      gst_gl_buffer_upload_cpu_write (mem, info, size);
+    }
+    gl->BindBuffer (mem->target, mem->id);
+    return &mem->id;
+  } else {
+    return gst_gl_buffer_cpu_access (mem, info, size);
+  }
+
+  return NULL;
+}
+
+static void
+_gl_buffer_unmap (GstGLBuffer * mem, GstMapInfo * info)
+{
+  const GstGLFuncs *gl = mem->mem.context->gl_vtable;
+
+  if ((info->flags & GST_MAP_GL) != 0) {
+    gl->BindBuffer (mem->target, 0);
+  }
+  /* XXX: optimistically transfer data */
+}
+
+static gboolean
+gst_gl_buffer_copy_buffer_sub_data (GstGLBuffer * src,
+    GstGLBuffer * dest, gssize offset, gssize size)
+{
+  const GstGLFuncs *gl = src->mem.context->gl_vtable;
+  GstMapInfo sinfo, dinfo;
+
+  if (!gl->CopyBufferSubData)
+    /* This is GL(ES) 3.0+ only */
+    return FALSE;
+
+  if (!gst_memory_map ((GstMemory *) src, &sinfo, GST_MAP_READ | GST_MAP_GL)) {
+    GST_CAT_WARNING (GST_CAT_GL_BUFFER,
+        "failed to read map source memory %p", src);
+    return FALSE;
+  }
+
+  if (!gst_memory_map ((GstMemory *) dest, &dinfo, GST_MAP_WRITE | GST_MAP_GL)) {
+    GST_CAT_WARNING (GST_CAT_GL_BUFFER,
+        "failed to write map destination memory %p", dest);
+    gst_memory_unmap ((GstMemory *) src, &sinfo);
+    return FALSE;
+  }
+
+  gl->BindBuffer (GL_COPY_READ_BUFFER, src->id);
+  gl->BindBuffer (GL_COPY_WRITE_BUFFER, dest->id);
+  gl->CopyBufferSubData (GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER,
+      offset, 0, size);
+
+  gst_memory_unmap ((GstMemory *) src, &sinfo);
+  gst_memory_unmap ((GstMemory *) dest, &dinfo);
+
+  return TRUE;
+}
+
+static GstGLBuffer *
+_gl_buffer_copy (GstGLBuffer * src, gssize offset, gssize size)
+{
+  GstAllocator *allocator = src->mem.mem.allocator;
+  GstAllocationParams params = { 0, src->mem.mem.align, 0, 0 };
+  GstGLBuffer *dest = NULL;
+
+  dest = _gl_buffer_new (allocator, NULL, src->mem.context,
+      src->target, src->usage_hints, &params, src->mem.mem.maxsize);
+
+  /* If not doing a full copy, then copy to sysmem, the 2D represention of the
+   * texture would become wrong */
+  if (GST_MEMORY_FLAG_IS_SET (src, GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD)) {
+    if (!gst_gl_base_memory_memcpy (GST_GL_BASE_MEMORY_CAST (src),
+            GST_GL_BASE_MEMORY_CAST (dest), offset, size)) {
+      GST_CAT_WARNING (GST_CAT_GL_BUFFER, "Could not copy GL Buffer");
+      gst_memory_unref (GST_MEMORY_CAST (dest));
+      dest = NULL;
+    }
+  } else {
+    if (!gst_gl_buffer_copy_buffer_sub_data (src, dest, offset, size)) {
+      if (!gst_gl_base_memory_memcpy (GST_GL_BASE_MEMORY_CAST (src),
+              GST_GL_BASE_MEMORY_CAST (dest), offset, size)) {
+        GST_CAT_WARNING (GST_CAT_GL_BUFFER, "Could not copy GL Buffer");
+        gst_memory_unref (GST_MEMORY_CAST (dest));
+        dest = NULL;
+      }
+    }
+  }
+
+  return dest;
+}
+
+static GstMemory *
+_gl_buffer_alloc (GstAllocator * allocator, gsize size,
+    GstAllocationParams * params)
+{
+  g_critical ("Need to use gst_gl_base_memory_alloc() to allocate from "
+      "this allocator");
+
+  return NULL;
+}
+
+static void
+_gl_buffer_destroy (GstGLBuffer * mem)
+{
+  const GstGLFuncs *gl = mem->mem.context->gl_vtable;
+
+  gl->DeleteBuffers (1, &mem->id);
+}
+
+static void
+_gst_gl_buffer_allocation_params_copy_data (GstGLBufferAllocationParams * src,
+    GstGLBufferAllocationParams * dest)
+{
+  memset (dest, 0, sizeof (*dest));
+
+  gst_gl_allocation_params_copy_data (&src->parent, &dest->parent);
+
+  dest->gl_target = src->gl_target;
+  dest->gl_usage = src->gl_usage;
+}
+
+static void
+_gst_gl_buffer_allocation_params_free_data (GstGLBufferAllocationParams *
+    params)
+{
+  gst_gl_allocation_params_free_data (&params->parent);
+}
+
+GstGLBufferAllocationParams *
+gst_gl_buffer_allocation_params_new (GstGLContext * context, gsize alloc_size,
+    GstAllocationParams * alloc_params, guint gl_target, guint gl_usage)
+{
+  GstGLBufferAllocationParams *params;
+
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), NULL);
+  g_return_val_if_fail (alloc_size > 0, NULL);
+
+  params = g_new0 (GstGLBufferAllocationParams, 1);
+
+  if (!gst_gl_allocation_params_init (&params->parent, sizeof (*params),
+          GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_BUFFER |
+          GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_ALLOC,
+          (GstGLAllocationParamsCopyFunc)
+          _gst_gl_buffer_allocation_params_copy_data,
+          (GstGLAllocationParamsFreeFunc)
+          _gst_gl_buffer_allocation_params_free_data, context, alloc_size,
+          alloc_params, NULL, 0, NULL, NULL)) {
+    g_free (params);
+    return NULL;
+  }
+
+  params->gl_target = gl_target;
+  params->gl_usage = gl_usage;
+
+  return params;
+}
+
+static GstGLBuffer *
+_gl_buffer_alloc_mem (GstGLBufferAllocator * allocator,
+    GstGLBufferAllocationParams * params)
+{
+  guint alloc_flags = params->parent.alloc_flags;
+
+  g_return_val_if_fail (alloc_flags &
+      GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_BUFFER, NULL);
+  g_return_val_if_fail (alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_ALLOC,
+      NULL);
+
+  return _gl_buffer_new (GST_ALLOCATOR (allocator), NULL,
+      params->parent.context, params->gl_target, params->gl_usage,
+      params->parent.alloc_params, params->parent.alloc_size);
+}
+
+G_DEFINE_TYPE (GstGLBufferAllocator, gst_gl_buffer_allocator,
+    GST_TYPE_GL_BASE_MEMORY_ALLOCATOR);
+
+static void
+gst_gl_buffer_allocator_class_init (GstGLBufferAllocatorClass * klass)
+{
+  GstAllocatorClass *allocator_class = (GstAllocatorClass *) klass;
+  GstGLBaseMemoryAllocatorClass *gl_base;
+
+  gl_base = (GstGLBaseMemoryAllocatorClass *) klass;
+
+  gl_base->alloc = (GstGLBaseMemoryAllocatorAllocFunction) _gl_buffer_alloc_mem;
+  gl_base->create = (GstGLBaseMemoryAllocatorCreateFunction) _gl_buffer_create;
+  gl_base->map = (GstGLBaseMemoryAllocatorMapFunction) _gl_buffer_map;
+  gl_base->unmap = (GstGLBaseMemoryAllocatorUnmapFunction) _gl_buffer_unmap;
+  gl_base->copy = (GstGLBaseMemoryAllocatorCopyFunction) _gl_buffer_copy;
+  gl_base->destroy =
+      (GstGLBaseMemoryAllocatorDestroyFunction) _gl_buffer_destroy;
+
+  allocator_class->alloc = _gl_buffer_alloc;
+}
+
+static void
+gst_gl_buffer_allocator_init (GstGLBufferAllocator * allocator)
+{
+  GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator);
+
+  alloc->mem_type = GST_GL_BUFFER_ALLOCATOR_NAME;
+
+  GST_OBJECT_FLAG_SET (allocator, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC);
+}
+
+/**
+ * gst_gl_buffer_init_once:
+ *
+ * Initializes the GL Buffer allocator. It is safe to call this function
+ * multiple times.  This must be called before any other GstGLBuffer operation.
+ */
+void
+gst_gl_buffer_init_once (void)
+{
+  static volatile gsize _init = 0;
+
+  if (g_once_init_enter (&_init)) {
+    gst_gl_base_memory_init_once ();
+
+    GST_DEBUG_CATEGORY_INIT (GST_CAT_GL_BUFFER, "glbuffer", 0, "OpenGL Buffer");
+
+    _gl_buffer_allocator =
+        g_object_new (gst_gl_buffer_allocator_get_type (), NULL);
+
+    gst_allocator_register (GST_GL_BUFFER_ALLOCATOR_NAME,
+        gst_object_ref (_gl_buffer_allocator));
+    g_once_init_leave (&_init, 1);
+  }
+}
+
+/**
+ * gst_is_gl_buffer:
+ * @mem:a #GstMemory
+ * 
+ * Returns: whether the memory at @mem is a #GstGLBuffer
+ */
+gboolean
+gst_is_gl_buffer (GstMemory * mem)
+{
+  return mem != NULL && mem->allocator != NULL &&
+      g_type_is_a (G_OBJECT_TYPE (mem->allocator),
+      GST_TYPE_GL_BUFFER_ALLOCATOR);
+}
diff --git a/gst-libs/gst/gl/gstglbuffer.h b/gst-libs/gst/gl/gstglbuffer.h
new file mode 100644
index 0000000..306ac38
--- /dev/null
+++ b/gst-libs/gst/gl/gstglbuffer.h
@@ -0,0 +1,118 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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_BUFFER_H_
+#define _GST_GL_BUFFER_H_
+
+#include <gst/gst.h>
+#include <gst/gstallocator.h>
+#include <gst/gstmemory.h>
+
+#include <gst/gl/gstglbasememory.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_GL_BUFFER_ALLOCATOR (gst_gl_buffer_allocator_get_type())
+GType gst_gl_buffer_allocator_get_type(void);
+
+#define GST_IS_GL_BUFFER_ALLOCATOR(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GL_ALLOCATOR))
+#define GST_IS_GL_BUFFER_ALLOCATOR_CLASS(klass)      (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GL_BUFFER_ALLOCATOR))
+#define GST_GL_BUFFER_ALLOCATOR_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_GL_BUFFER_ALLOCATOR, GstGLBufferAllocatorClass))
+#define GST_GL_BUFFER_ALLOCATOR(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GL_BUFFER_ALLOCATOR, GstGLBufferAllocator))
+#define GST_GL_BUFFER_ALLOCATOR_CLASS(klass)         (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GL_BUFFER_ALLOCATOR, GstGLBufferAllocatorClass))
+#define GST_GL_BUFFER_ALLOCATOR_CAST(obj)            ((GstGLBufferAllocator *)(obj))
+
+/**
+ * GstGLBuffer:
+ * @mem: the parent object
+ * @context: the #GstGLContext to use for GL operations
+ * @id: the buffer id for this memory
+ * @target: the GL target of this texture for binding purposes
+ *
+ * Represents information about a GL buffer
+ */
+struct _GstGLBuffer
+{
+  GstGLBaseMemory       mem;
+
+  guint                 id;
+  guint                 target;         /* XXX: put this in the allocator? */
+  guint                 usage_hints;     /* XXX: put this in the allocator? */
+};
+
+typedef struct _GstGLBufferAllocationParams GstGLBufferAllocationParams;
+
+#define GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_BUFFER (1 << 4)
+
+struct _GstGLBufferAllocationParams
+{
+  GstGLAllocationParams     parent;
+
+  guint                     gl_target;
+  guint                     gl_usage;
+};
+
+GstGLBufferAllocationParams *   gst_gl_buffer_allocation_params_new     (GstGLContext * context,
+                                                                         gsize alloc_size,
+                                                                         GstAllocationParams * alloc_params,
+                                                                         guint gl_target,
+                                                                         guint gl_usage);
+
+/**
+ * GstGLBufferAllocator
+ *
+ * Opaque #GstGLAllocator struct
+ */
+struct _GstGLBufferAllocator
+{
+  GstGLBaseMemoryAllocator parent;
+};
+
+/**
+ * GstGLBufferAllocatorClass:
+ *
+ * The #GstGLBufferAllocatorClass only contains private data
+ */
+struct _GstGLBufferAllocatorClass
+{
+  GstGLBaseMemoryAllocatorClass parent_class;
+};
+
+#define GST_CAPS_FEATURE_MEMORY_GL_BUFFER "memory:GLBuffer"
+
+/**
+ * GST_GL_BUFFER_ALLOCATOR_NAME:
+ *
+ * The name of the GL buffer allocator
+ */
+#define GST_GL_BUFFER_ALLOCATOR_NAME   "GLBuffer"
+
+void          gst_gl_buffer_init_once (void);
+gboolean      gst_is_gl_buffer        (GstMemory * mem);
+
+GstGLBuffer * gst_gl_buffer_alloc     (GstGLContext * context,
+                                       guint gl_target,
+                                       guint gl_usage,
+                                       GstAllocationParams * params,
+                                       gsize maxsize);
+
+G_END_DECLS
+
+#endif /* _GST_GL_BUFFER_H_ */
diff --git a/gst-libs/gst/gl/gstglbufferpool.c b/gst-libs/gst/gl/gstglbufferpool.c
index 69ac2d8..16b5c9e 100644
--- a/gst-libs/gst/gl/gstglbufferpool.c
+++ b/gst-libs/gst/gl/gstglbufferpool.c
@@ -47,13 +47,9 @@
 struct _GstGLBufferPoolPrivate
 {
   GstAllocator *allocator;
-  GstAllocationParams params;
+  GstGLVideoAllocationParams *gl_params;
   GstCaps *caps;
-  gint im_format;
-  GstVideoInfo info;
-  GstVideoAlignment valign;
   gboolean add_videometa;
-  gboolean add_uploadmeta;
   gboolean add_glsyncmeta;
   gboolean want_eglimage;
   GstBuffer *last_buffer;
@@ -76,9 +72,10 @@
 gst_gl_buffer_pool_get_options (GstBufferPool * pool)
 {
   static const gchar *options[] = { GST_BUFFER_POOL_OPTION_VIDEO_META,
-    GST_BUFFER_POOL_OPTION_VIDEO_GL_TEXTURE_UPLOAD_META,
     GST_BUFFER_POOL_OPTION_GL_SYNC_META,
     GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT,
+    GST_BUFFER_POOL_OPTION_GL_TEXTURE_TARGET_2D,
+    GST_BUFFER_POOL_OPTION_GL_TEXTURE_TARGET_RECTANGLE,
     NULL
   };
 
@@ -96,7 +93,8 @@
   guint max_align, n;
   GstAllocator *allocator = NULL;
   GstAllocationParams alloc_params;
-  gboolean reset = TRUE;
+  GstGLTextureTarget tex_target;
+  gboolean ret = TRUE;
   gint p;
 
   if (!gst_buffer_pool_config_get_params (config, &caps, NULL, &min_buffers,
@@ -116,63 +114,61 @@
   if (!gst_buffer_pool_config_get_allocator (config, &allocator, &alloc_params))
     goto wrong_config;
 
+  gst_caps_replace (&priv->caps, caps);
+
   if (priv->allocator)
     gst_object_unref (priv->allocator);
 
-  if (!allocator) {
-    gst_gl_memory_init ();
-    priv->allocator = gst_allocator_find (GST_GL_MEMORY_ALLOCATOR);
-  } else {
+  if (allocator /* && GST_IS_GL_MEMORY_ALLOCATOR (allocator) FIXME EGLImage */ ) {
     priv->allocator = gst_object_ref (allocator);
+  } else {
+    priv->allocator =
+        GST_ALLOCATOR (gst_gl_memory_allocator_get_default (glpool->context));
+    g_assert (priv->allocator);
   }
 
-  priv->params = alloc_params;
-
-  priv->im_format = GST_VIDEO_INFO_FORMAT (&info);
-  if (priv->im_format == -1)
-    goto unknown_format;
-
-  if (priv->caps)
-    reset = !gst_caps_is_equal (priv->caps, caps);
-
-  gst_caps_replace (&priv->caps, caps);
-  priv->info = info;
-
   priv->add_videometa = gst_buffer_pool_config_has_option (config,
       GST_BUFFER_POOL_OPTION_VIDEO_META);
-  priv->add_uploadmeta = gst_buffer_pool_config_has_option (config,
-      GST_BUFFER_POOL_OPTION_VIDEO_GL_TEXTURE_UPLOAD_META);
   priv->add_glsyncmeta = gst_buffer_pool_config_has_option (config,
       GST_BUFFER_POOL_OPTION_GL_SYNC_META);
 
 #if GST_GL_HAVE_PLATFORM_EGL
-  g_assert (priv->allocator != NULL);
-  priv->want_eglimage =
-      (g_strcmp0 (priv->allocator->mem_type, GST_EGL_IMAGE_MEMORY_TYPE) == 0);
-#else
-  priv->want_eglimage = FALSE;
+  if (priv->allocator) {
+    priv->want_eglimage =
+        (g_strcmp0 (priv->allocator->mem_type, GST_EGL_IMAGE_MEMORY_TYPE) == 0);
+  } else
 #endif
+  {
+    priv->want_eglimage = FALSE;
+  }
+
+  if (priv->gl_params)
+    gst_gl_allocation_params_free ((GstGLAllocationParams *) priv->gl_params);
+  priv->gl_params = (GstGLVideoAllocationParams *)
+      gst_buffer_pool_config_get_gl_allocation_params (config);
+  if (!priv->gl_params)
+    priv->gl_params = gst_gl_video_allocation_params_new (glpool->context,
+        &alloc_params, &info, -1, NULL, 0);
 
   max_align = alloc_params.align;
 
   if (gst_buffer_pool_config_has_option (config,
           GST_BUFFER_POOL_OPTION_VIDEO_ALIGNMENT)) {
-
     priv->add_videometa = TRUE;
 
-    gst_buffer_pool_config_get_video_alignment (config, &priv->valign);
+    gst_buffer_pool_config_get_video_alignment (config,
+        priv->gl_params->valign);
 
     for (n = 0; n < GST_VIDEO_MAX_PLANES; ++n)
-      max_align |= priv->valign.stride_align[n];
+      max_align |= priv->gl_params->valign->stride_align[n];
 
     for (n = 0; n < GST_VIDEO_MAX_PLANES; ++n)
-      priv->valign.stride_align[n] = max_align;
+      priv->gl_params->valign->stride_align[n] = max_align;
 
-    gst_video_info_align (&priv->info, &priv->valign);
+    gst_video_info_align (priv->gl_params->v_info, priv->gl_params->valign);
 
-    gst_buffer_pool_config_set_video_alignment (config, &priv->valign);
-  } else {
-    gst_video_alignment_reset (&priv->valign);
+    gst_buffer_pool_config_set_video_alignment (config,
+        priv->gl_params->valign);
   }
 
   if (alloc_params.align < max_align) {
@@ -182,28 +178,65 @@
 
     alloc_params.align = max_align;
     gst_buffer_pool_config_set_allocator (config, allocator, &alloc_params);
-    priv->params = alloc_params;
+    if (priv->gl_params->parent.alloc_params)
+      gst_allocation_params_free (priv->gl_params->parent.alloc_params);
+    priv->gl_params->parent.alloc_params =
+        gst_allocation_params_copy (&alloc_params);
   }
 
-  if (reset) {
-    if (glpool->upload)
-      gst_object_unref (glpool->upload);
+  {
+    GstStructure *s = gst_caps_get_structure (caps, 0);
+    const gchar *target_str = gst_structure_get_string (s, "texture-target");
+    gboolean multiple_texture_targets = FALSE;
 
-    glpool->upload = gst_gl_upload_meta_new (glpool->context);
+    tex_target = priv->gl_params->target;
+    if (target_str)
+      tex_target = gst_gl_texture_target_from_string (target_str);
+
+    if (gst_buffer_pool_config_has_option (config,
+            GST_BUFFER_POOL_OPTION_GL_TEXTURE_TARGET_2D)) {
+      if (tex_target && tex_target != GST_GL_TEXTURE_TARGET_2D)
+        multiple_texture_targets = TRUE;
+      tex_target = GST_GL_TEXTURE_TARGET_2D;
+    }
+    if (gst_buffer_pool_config_has_option (config,
+            GST_BUFFER_POOL_OPTION_GL_TEXTURE_TARGET_RECTANGLE)) {
+      if (tex_target && tex_target != GST_GL_TEXTURE_TARGET_RECTANGLE)
+        multiple_texture_targets = TRUE;
+      tex_target = GST_GL_TEXTURE_TARGET_RECTANGLE;
+    }
+    if (gst_buffer_pool_config_has_option (config,
+            GST_BUFFER_POOL_OPTION_GL_TEXTURE_TARGET_EXTERNAL_OES)) {
+      if (tex_target && tex_target != GST_GL_TEXTURE_TARGET_EXTERNAL_OES)
+        multiple_texture_targets = TRUE;
+      tex_target = GST_GL_TEXTURE_TARGET_EXTERNAL_OES;
+    }
+
+    if (!tex_target)
+      tex_target = GST_GL_TEXTURE_TARGET_2D;
+
+    if (multiple_texture_targets) {
+      GST_WARNING_OBJECT (pool, "Multiple texture targets configured either "
+          "through caps or buffer pool options");
+      ret = FALSE;
+    }
+
+    priv->gl_params->target = tex_target;
   }
 
   /* Recalulate the size and offset as we don't add padding between planes. */
-  priv->info.size = 0;
-  for (p = 0; p < GST_VIDEO_INFO_N_PLANES (&priv->info); p++) {
-    priv->info.offset[p] = priv->info.size;
-    priv->info.size +=
-        gst_gl_get_plane_data_size (&priv->info, &priv->valign, p);
+  priv->gl_params->v_info->size = 0;
+  for (p = 0; p < GST_VIDEO_INFO_N_PLANES (priv->gl_params->v_info); p++) {
+    priv->gl_params->v_info->offset[p] = priv->gl_params->v_info->size;
+    priv->gl_params->v_info->size +=
+        gst_gl_get_plane_data_size (priv->gl_params->v_info,
+        priv->gl_params->valign, p);
   }
 
-  gst_buffer_pool_config_set_params (config, caps, priv->info.size,
-      min_buffers, max_buffers);
+  gst_buffer_pool_config_set_params (config, caps,
+      priv->gl_params->v_info->size, min_buffers, max_buffers);
 
-  return GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config);
+  return GST_BUFFER_POOL_CLASS (parent_class)->set_config (pool, config) && ret;
 
   /* ERRORS */
 wrong_config:
@@ -222,26 +255,11 @@
         "failed getting geometry from caps %" GST_PTR_FORMAT, caps);
     return FALSE;
   }
-unknown_format:
-  {
-    GST_WARNING_OBJECT (glpool, "failed to get format from caps %"
-        GST_PTR_FORMAT, caps);
-    GST_ELEMENT_ERROR (glpool, RESOURCE, WRITE,
-        ("Failed to create output image buffer of %dx%d pixels",
-            priv->info.width, priv->info.height),
-        ("Invalid input caps %" GST_PTR_FORMAT, caps));
-    return FALSE;
-  }
 }
 
 static gboolean
 gst_gl_buffer_pool_start (GstBufferPool * pool)
 {
-  GstGLBufferPool *glpool = GST_GL_BUFFER_POOL_CAST (pool);
-  GstGLBufferPoolPrivate *priv = glpool->priv;
-
-  gst_gl_upload_meta_set_format (glpool->upload, &priv->info);
-
   return GST_BUFFER_POOL_CLASS (parent_class)->start (pool);
 }
 
@@ -250,14 +268,13 @@
 gst_gl_buffer_pool_alloc (GstBufferPool * pool, GstBuffer ** buffer,
     GstBufferPoolAcquireParams * params)
 {
+  GstGLMemoryAllocator *alloc;
   GstGLBufferPool *glpool = GST_GL_BUFFER_POOL_CAST (pool);
   GstGLBufferPoolPrivate *priv = glpool->priv;
   GstVideoInfo *info;
-  GstVideoAlignment *valign;
   GstBuffer *buf;
 
-  info = &priv->info;
-  valign = &priv->valign;
+  info = priv->gl_params->v_info;
 
   if (!(buf = gst_buffer_new ())) {
     goto no_buffer;
@@ -275,13 +292,10 @@
   }
 #endif
 
-  if (!gst_gl_memory_setup_buffer (glpool->context, &priv->params, info,
-          valign, buf))
+  alloc = GST_GL_MEMORY_ALLOCATOR (priv->allocator);
+  if (!gst_gl_memory_setup_buffer (alloc, buf, priv->gl_params))
     goto mem_create_failed;
 
-  if (priv->add_uploadmeta)
-    gst_gl_upload_meta_add_to_buffer (glpool->upload, buf);
-
   if (priv->add_glsyncmeta)
     gst_buffer_add_gl_sync_meta (glpool->context, buf);
 
@@ -409,14 +423,10 @@
 
   priv->allocator = NULL;
   priv->caps = NULL;
-  priv->im_format = GST_VIDEO_FORMAT_UNKNOWN;
   priv->add_videometa = TRUE;
   priv->add_glsyncmeta = FALSE;
   priv->want_eglimage = FALSE;
   priv->last_buffer = FALSE;
-
-  gst_video_info_init (&priv->info);
-  gst_allocation_params_init (&priv->params);
 }
 
 static void
@@ -432,9 +442,6 @@
   if (priv->caps)
     gst_caps_unref (priv->caps);
 
-  if (pool->upload)
-    gst_object_unref (pool->upload);
-
   G_OBJECT_CLASS (gst_gl_buffer_pool_parent_class)->finalize (object);
 
   /* only release the context once all our memory have been deleted */
@@ -447,4 +454,31 @@
     gst_object_unref (priv->allocator);
     priv->allocator = NULL;
   }
+
+  if (priv->gl_params)
+    gst_gl_allocation_params_free ((GstGLAllocationParams *) priv->gl_params);
+  priv->gl_params = NULL;
+}
+
+GstGLAllocationParams *
+gst_buffer_pool_config_get_gl_allocation_params (GstStructure * config)
+{
+  GstGLAllocationParams *ret;
+
+  if (!gst_structure_get (config, "gl-allocation-params",
+          GST_TYPE_GL_ALLOCATION_PARAMS, &ret, NULL))
+    ret = NULL;
+
+  return ret;
+}
+
+void
+gst_buffer_pool_config_set_gl_allocation_params (GstStructure * config,
+    GstGLAllocationParams * params)
+{
+  g_return_if_fail (config != NULL);
+  g_return_if_fail (params != NULL);
+
+  gst_structure_set (config, "gl-allocation-params",
+      GST_TYPE_GL_ALLOCATION_PARAMS, params, NULL);
 }
diff --git a/gst-libs/gst/gl/gstglbufferpool.h b/gst-libs/gst/gl/gstglbufferpool.h
index cea1175..ee13366 100644
--- a/gst-libs/gst/gl/gstglbufferpool.h
+++ b/gst-libs/gst/gl/gstglbufferpool.h
@@ -25,14 +25,10 @@
 #include <gst/video/gstvideometa.h>
 #include <gst/video/gstvideopool.h>
 
-#include <gst/gl/gstgl_fwd.h>
+#include <gst/gl/gl.h>
 
 G_BEGIN_DECLS
 
-typedef struct _GstGLBufferPool GstGLBufferPool;
-typedef struct _GstGLBufferPoolClass GstGLBufferPoolClass;
-typedef struct _GstGLBufferPoolPrivate GstGLBufferPoolPrivate;
-
 /* buffer pool functions */
 GType gst_gl_buffer_pool_get_type (void);
 #define GST_TYPE_GL_BUFFER_POOL      (gst_gl_buffer_pool_get_type())
@@ -50,7 +46,6 @@
   GstBufferPool bufferpool;
 
   GstGLContext *context;
-  GstGLUploadMeta *upload;
 
   GstGLBufferPoolPrivate *priv;
 };
@@ -69,6 +64,10 @@
 void gst_gl_buffer_pool_replace_last_buffer (GstGLBufferPool * pool,
     GstBuffer * buffer);
 
+GstGLAllocationParams * gst_buffer_pool_config_get_gl_allocation_params    (GstStructure * config);
+void                    gst_buffer_pool_config_set_gl_allocation_params    (GstStructure * config,
+                                                                            GstGLAllocationParams * params);
+
 G_END_DECLS
 
 #endif /* _GST_GL_BUFFER_POOL_H_ */
diff --git a/gst-libs/gst/gl/gstglcolorconvert.c b/gst-libs/gst/gl/gstglcolorconvert.c
index 5915a39..ae0557a 100644
--- a/gst-libs/gst/gl/gstglcolorconvert.c
+++ b/gst-libs/gst/gl/gstglcolorconvert.c
@@ -22,6 +22,7 @@
 #include "config.h"
 #endif
 
+#include <string.h>
 #include <stdio.h>
 
 #include "gl.h"
@@ -109,7 +110,6 @@
 static const gfloat from_rgb_bt709_ucoeff[] = { -0.100640, -0.338688, 0.439327 };
 static const gfloat from_rgb_bt709_vcoeff[] = { 0.440654, -0.400285, -0.040370 };
 
-
 /* GRAY16 to RGB conversion
  *  data transfered as GL_LUMINANCE_ALPHA then convert back to GRAY16 
  *  high byte weight as : 255*256/65535 
@@ -119,39 +119,60 @@
 #define COMPOSE_WEIGHT \
     "const vec2 compose_weight = vec2(0.996109, 0.003891);\n"
 
-/* Channel reordering for XYZ <-> ZYX conversion */
-static const gchar frag_REORDER[] =
-      "#ifdef GL_ES\n"
-      "precision mediump float;\n"
-      "#endif\n"
-      "varying vec2 v_texcoord;\n"
-      "uniform sampler2D tex;\n"
-      "uniform vec2 tex_scale0;\n"
-      "uniform vec2 tex_scale1;\n"
-      "uniform vec2 tex_scale2;\n"
-      "void main(void)\n"
-      "{\n"
-      " vec4 t = texture2D(tex, v_texcoord * tex_scale0);\n"
-      " %s\n" /* clobber alpha channel? */
-      " gl_FragColor = vec4(t.%c, t.%c, t.%c, t.%c);\n"
-      "}";
+#define DEFAULT_UNIFORMS         \
+    "#ifdef GL_ES\n"             \
+    "precision mediump float;\n" \
+    "#endif\n"                   \
+    "uniform vec2 tex_scale0;\n" \
+    "uniform vec2 tex_scale1;\n" \
+    "uniform vec2 tex_scale2;\n" \
+    "uniform float width;\n"     \
+    "uniform float height;\n"
 
-static const gchar frag_APPLE_YUV_TO_RGB[] =
-      "#ifdef GL_ES\n"
-      "precision mediump float;\n"
-      "#endif\n"
-      "varying vec2 v_texcoord;\n"
-      "uniform float width;\n"
-      "uniform float height;\n"
-      "uniform sampler2DRect tex;\n"
-      "uniform vec2 tex_scale0;\n"
-      "uniform vec2 tex_scale1;\n"
-      "uniform vec2 tex_scale2;\n"
-      "void main(void)\n"
-      "{\n"
-      " vec4 t = texture2DRect(tex, v_texcoord * vec2(width, height) * tex_scale0);\n"
-      " gl_FragColor = vec4(t.%c, t.%c, t.%c, t.%c);\n"
-      "}";
+#define MAX_FUNCTIONS 4
+
+#define glsl_OES_extension_string "#extension GL_OES_EGL_image_external : require \n"
+
+struct shader_templ
+{
+  const gchar *extensions;
+  const gchar *uniforms;
+  const gchar *functions[MAX_FUNCTIONS];
+  const gchar *body;
+
+  GstGLTextureTarget target;
+};
+
+#define glsl_func_yuv_to_rgb \
+    "vec3 yuv_to_rgb (vec3 val, vec3 offset, vec3 ycoeff, vec3 ucoeff, vec3 vcoeff) {\n" \
+    "  vec3 rgb;\n"                 \
+    "  val += offset;\n"            \
+    "  rgb.r = dot(val, ycoeff);\n" \
+    "  rgb.g = dot(val, ucoeff);\n" \
+    "  rgb.b = dot(val, vcoeff);\n" \
+    "  return rgb;\n"               \
+    "}\n"
+
+#define glsl_func_rgb_to_yuv \
+    "vec3 rgb_to_yuv (vec3 val, vec3 offset, vec3 rcoeff, vec3 gcoeff, vec3 bcoeff) {\n" \
+    "  vec3 yuv;\n"                         \
+    "  yuv.r = dot(val.rgb, rcoeff);\n"     \
+    "  yuv.g = dot(val.rgb, gcoeff);\n"     \
+    "  yuv.b = dot(val.rgb, bcoeff);\n"     \
+    "  yuv += offset;\n"                    \
+    "  return yuv;\n"                       \
+    "}\n"
+
+/* Channel reordering for XYZ <-> ZYX conversion */
+static const struct shader_templ templ_REORDER =
+  { NULL,
+    DEFAULT_UNIFORMS "uniform sampler2D tex;\n",
+    { NULL, },
+    "vec4 t = texture2D(tex, texcoord * tex_scale0);\n"
+    "%s\n" /* clobber alpha channel? */
+    "gl_FragColor = vec4(t.%c, t.%c, t.%c, t.%c);\n",
+    GST_GL_TEXTURE_TARGET_2D
+  };
 
 /* GRAY16 to RGB conversion
  *  data transfered as GL_LUMINANCE_ALPHA then convert back to GRAY16 
@@ -159,274 +180,186 @@
  *  ([0~1] denormalize to [0~255],shift to high byte,normalize to [0~1])
  *  low byte weight as : 255/65535 (similar)
  * */
-static const gchar frag_COMPOSE[] =
-      "#ifdef GL_ES\n"
-      "precision mediump float;\n"
-      "#endif\n"
-      "varying vec2 v_texcoord;\n"
-      "uniform sampler2D tex;\n"
-      "uniform vec2 tex_scale0;\n"
-      "uniform vec2 tex_scale1;\n"
-      "uniform vec2 tex_scale2;\n"
-      COMPOSE_WEIGHT
-      "void main(void)\n"
-      "{\n"
-      " float r, g, b, a;\n"
-      " vec4 t = texture2D(tex, v_texcoord * tex_scale0);\n"
-      " r = dot(t.%c%c, compose_weight);"
-      " g = r;\n"
-      " b = r;\n"
-      " a = 1.0;\n"
-      " gl_FragColor = vec4(%c, %c, %c, %c);\n"
-      "}";
+static const struct shader_templ templ_COMPOSE =
+  { NULL,
+    DEFAULT_UNIFORMS COMPOSE_WEIGHT "uniform sampler2D tex;\n",
+    { NULL, },
+    "vec4 rgba;\n"
+    "vec4 t = texture2D(tex, texcoord * tex_scale0);\n"
+    "rgba.rgb = vec3 (dot(t.%c%c, compose_weight));"
+    "rgba.a = 1.0;\n"
+    "gl_FragColor = vec4(rgba.%c, rgba.%c, rgba.%c, rgba.%c);\n",
+    GST_GL_TEXTURE_TARGET_2D
+  };
 
-static const char frag_AYUV_to_RGB[] =
-    "#ifdef GL_ES\n"
-    "precision mediump float;\n"
-    "#endif\n"
-    "varying vec2 v_texcoord;\n"
-    "uniform sampler2D tex;\n"
-    "uniform vec2 tex_scale0;\n"
-    "uniform vec2 tex_scale1;\n"
-    "uniform vec2 tex_scale2;\n"
-    YUV_TO_RGB_COEFFICIENTS
-    "void main(void) {\n"
-    "  float r,g,b,a;\n"
-    "  vec4 texel;\n"
-    "  texel = texture2D(tex, v_texcoord * tex_scale0);\n"
-    "  texel.gba += offset;\n"
-    "  r = dot(texel.gba, coeff1);\n"
-    "  g = dot(texel.gba, coeff2);\n"
-    "  b = dot(texel.gba, coeff3);\n"
-    "  a = texel.r;\n"
-    "  gl_FragColor=vec4(%c,%c,%c,%c);\n"
-    "}";
+static const struct shader_templ templ_AYUV_to_RGB =
+  { NULL,
+    DEFAULT_UNIFORMS YUV_TO_RGB_COEFFICIENTS "uniform sampler2D tex;\n",
+    { glsl_func_yuv_to_rgb, NULL, },
+    "vec4 texel, rgba;\n"
+    "texel = texture2D(tex, texcoord * tex_scale0);\n"
+    "rgba.rgb = yuv_to_rgb (texel.yzw, offset, coeff1, coeff2, coeff3);\n"
+    "rgba.a = texel.r;\n"
+    "gl_FragColor=vec4(rgba.%c,rgba.%c,rgba.%c,rgba.%c);\n",
+    GST_GL_TEXTURE_TARGET_2D
+  };
 
-static const gchar frag_RGB_to_AYUV[] =
-    "#ifdef GL_ES\n"
-    "precision mediump float;\n"
-    "#endif\n"
-    "varying vec2 v_texcoord;\n"
-    "uniform sampler2D tex;\n"
-    RGB_TO_YUV_COEFFICIENTS
-    "void main(void) {\n"
-    "  vec4 texel;\n"
-    "  float y, u, v, a;\n"
-    "  texel = texture2D(tex, v_texcoord).%c%c%c%c;\n"
-    "  y = dot(texel.rgb, coeff1);\n"
-    "  u = dot(texel.rgb, coeff2);\n"
-    "  v = dot(texel.rgb, coeff3);\n"
-    "  y += offset.x;\n"
-    "  u += offset.y;\n"
-    "  v += offset.z;\n"
-    "  a = %s;\n"
-    "  gl_FragColor = vec4(a,y,u,v);\n"
-    "}\n";
+static const struct shader_templ templ_RGB_to_AYUV =
+  { NULL,
+    DEFAULT_UNIFORMS RGB_TO_YUV_COEFFICIENTS "uniform sampler2D tex;\n",
+    { glsl_func_rgb_to_yuv, NULL, },
+    "vec4 texel, ayuv;\n"
+    "texel = texture2D(tex, texcoord).%c%c%c%c;\n"
+    "ayuv.yzw = rgb_to_yuv (texel.rgb, offset, coeff1, coeff2, coeff3);\n"
+    "ayuv.x = %s;\n"
+    "gl_FragColor = ayuv;\n",
+    GST_GL_TEXTURE_TARGET_2D
+  };
 
 /* YUV to RGB conversion */
-static const char frag_PLANAR_YUV_to_RGB[] =
-    "#ifdef GL_ES\n"
-    "precision mediump float;\n"
-    "#endif\n"
-    "varying vec2 v_texcoord;\n"
-    "uniform sampler2D Ytex, Utex, Vtex;\n"
-    "uniform vec2 tex_scale0;\n"
-    "uniform vec2 tex_scale1;\n"
-    "uniform vec2 tex_scale2;\n"
-    YUV_TO_RGB_COEFFICIENTS
-    "void main(void) {\n"
-    "  float r, g, b, a;\n"
-    "  vec3 yuv;\n"
-    "  yuv.x = texture2D(Ytex,v_texcoord * tex_scale0).r;\n"
-    "  yuv.y = texture2D(Utex,v_texcoord * tex_scale1).r;\n"
-    "  yuv.z = texture2D(Vtex,v_texcoord * tex_scale2).r;\n"
-    "  yuv += offset;\n"
-    "  r = dot(yuv, coeff1);\n"
-    "  g = dot(yuv, coeff2);\n"
-    "  b = dot(yuv, coeff3);\n"
-    "  a = 1.0;\n"
-    "  gl_FragColor = vec4(%c, %c, %c, %c);\n"
-    "}\n";
+static const struct shader_templ templ_PLANAR_YUV_to_RGB =
+  { NULL,
+    DEFAULT_UNIFORMS YUV_TO_RGB_COEFFICIENTS "uniform sampler2D Ytex, Utex, Vtex;\n",
+    { glsl_func_yuv_to_rgb, NULL, },
+    "vec4 texel, rgba;\n"
+    /* FIXME: should get the sampling right... */
+    "texel.x = texture2D(Ytex, texcoord * tex_scale0).r;\n"
+    "texel.y = texture2D(Utex, texcoord * tex_scale1).r;\n"
+    "texel.z = texture2D(Vtex, texcoord * tex_scale2).r;\n"
+    "rgba.rgb = yuv_to_rgb (texel.xyz, offset, coeff1, coeff2, coeff3);\n"
+    "rgba.a = 1.0;\n"
+    "gl_FragColor=vec4(rgba.%c,rgba.%c,rgba.%c,rgba.%c);\n",
+    GST_GL_TEXTURE_TARGET_2D
+  };
 
-static const gchar frag_RGB_to_PLANAR_YUV[] =
-    "#ifdef GL_ES\n"
-    "precision mediump float;\n"
-    "#endif\n"
-    "varying vec2 v_texcoord;\n"
-    "uniform sampler2D tex;\n"
-    "uniform float width;\n"
-    "uniform float height;\n"
-    "uniform vec2 chroma_sampling;\n"
-    RGB_TO_YUV_COEFFICIENTS
-    "void main(void) {\n"
-    "  float y, u, v;\n"
-    "  vec4 uv_texel;\n"
-    "  vec4 texel = texture2D(tex, v_texcoord).%c%c%c%c;\n"
+static const struct shader_templ templ_RGB_to_PLANAR_YUV =
+  { NULL,
+    DEFAULT_UNIFORMS RGB_TO_YUV_COEFFICIENTS "uniform sampler2D tex;\n"
+    "uniform vec2 chroma_sampling;\n",
+    { glsl_func_rgb_to_yuv, NULL, },
+    "vec4 texel;\n"
+    "vec3 yuv;\n"
+    "texel = texture2D(tex, texcoord).%c%c%c%c;\n"
+    /* FIXME: this is not quite correct yet */
+    "vec4 uv_texel = vec4(0.0);\n"
     /* One u and v sample can be generated by a nxm sized block given by
      * @chroma_sampling.  The result is the average of all the values in the
      * block computed with a rolling average.
      */
-    "  vec2 size = vec2(width, height);\n"
-    "  vec2 pos = v_texcoord * size;\n"
-       /* scale for chroma size */
-    "  vec2 chroma_pos = v_texcoord * chroma_sampling * size;\n"
-       /* offset chroma to the center of the first texel in the block */
-    "  chroma_pos -= clamp(chroma_sampling * 0.5 - 0.5, vec2(0.0), chroma_sampling);\n"
-    "  if (chroma_pos.x < width && chroma_pos.y < height) {\n"
-    "    for (int i = 0; i < int(chroma_sampling.x); i++) {\n"
-    "      vec2 delta = vec2 (float(i), 0.0);\n"
-    "      for (int j = 0; j < int(chroma_sampling.y); j++) {\n"
-    "        int n = (i+1)*(j+1);\n"
-    "        delta.y = float(j);\n"
-    "        vec4 sample = texture2D(tex, (chroma_pos + delta) / size).%c%c%c%c;\n"
-             /* rolling average */
-    "        uv_texel = (float(n-1) * uv_texel + sample) / float(n);\n"
-    "      }\n"
+    "vec2 size = vec2(width, height);\n"
+    "vec2 pos = texcoord * size;\n"
+     /* scale for chroma size */
+    "vec2 chroma_pos = texcoord * chroma_sampling * size;\n"
+     /* offset chroma to the center of the first texel in the block */
+    "chroma_pos -= clamp(chroma_sampling * 0.5 - 0.5, vec2(0.0), chroma_sampling);\n"
+    "if (chroma_pos.x < width && chroma_pos.y < height) {\n"
+    "  for (int i = 0; i < int(chroma_sampling.x); i++) {\n"
+    "    vec2 delta = vec2 (float(i), 0.0);\n"
+    "    for (int j = 0; j < int(chroma_sampling.y); j++) {\n"
+    "      int n = (i+1)*(j+1);\n"
+    "      delta.y = float(j);\n"
+    "      vec4 sample = texture2D(tex, (chroma_pos + delta) / size).%c%c%c%c;\n"
+           /* rolling average */
+    "      uv_texel = (float(n-1) * uv_texel + sample) / float(n);\n"
     "    }\n"
     "  }\n"
-    "  y = dot(texel.rgb, coeff1);\n"
-    "  u = dot(uv_texel.rgb, coeff2);\n"
-    "  v = dot(uv_texel.rgb, coeff3);\n"
-    "  y += offset.x;\n"
-    "  u += offset.y;\n"
-    "  v += offset.z;\n"
-    "  gl_FragData[0] = vec4(y, 0.0, 0.0, 1.0);\n"
-    "  gl_FragData[1] = vec4(u, 0.0, 0.0, 1.0);\n"
-    "  gl_FragData[2] = vec4(v, 0.0, 0.0, 1.0);\n"
-    "}\n";
+    "}\n"
+
+    "yuv.x = rgb_to_yuv (texel.rgb, offset, coeff1, coeff2, coeff3).x;\n"
+    "yuv.yz = rgb_to_yuv (uv_texel.rgb, offset, coeff1, coeff2, coeff3).yz;\n"
+    "gl_FragData[0] = vec4(yuv.x, 0.0, 0.0, 1.0);\n"
+    "gl_FragData[1] = vec4(yuv.y, 0.0, 0.0, 1.0);\n"
+    "gl_FragData[2] = vec4(yuv.z, 0.0, 0.0, 1.0);\n",
+    GST_GL_TEXTURE_TARGET_2D
+  };
 
 /* NV12/NV21 to RGB conversion */
-static const char frag_NV12_NV21_to_RGB[] = {
-      "#ifdef GL_ES\n"
-      "precision mediump float;\n"
-      "#endif\n"
-      "varying vec2 v_texcoord;\n"
-      "uniform sampler2D Ytex,UVtex;\n"
-      "uniform vec2 tex_scale0;\n"
-      "uniform vec2 tex_scale1;\n"
-      "uniform vec2 tex_scale2;\n"
-      YUV_TO_RGB_COEFFICIENTS
-      "void main(void) {\n"
-      "  float r, g, b, a;\n"
-      "  vec3 yuv;\n"
-      "  yuv.x=texture2D(Ytex, v_texcoord * tex_scale0).r;\n"
-      "  yuv.yz=texture2D(UVtex, v_texcoord * tex_scale1).%c%c;\n"
-      "  yuv += offset;\n"
-      "  r = dot(yuv, coeff1);\n"
-      "  g = dot(yuv, coeff2);\n"
-      "  b = dot(yuv, coeff3);\n"
-      "  a = 1.0;\n"
-      "  gl_FragColor=vec4(%c, %c, %c, %c);\n"
-      "}"
-};
+static const struct shader_templ templ_NV12_NV21_to_RGB =
+  { NULL,
+    DEFAULT_UNIFORMS YUV_TO_RGB_COEFFICIENTS "uniform sampler2D Ytex, UVtex;\n",
+    { glsl_func_yuv_to_rgb, NULL, },
+    "vec4 rgba;\n"
+    "vec3 yuv;\n"
+    /* FIXME: should get the sampling right... */
+    "yuv.x=texture2D(Ytex, texcoord * tex_scale0).r;\n"
+    "yuv.yz=texture2D(UVtex, texcoord * tex_scale1).%c%c;\n"
+    "rgba.rgb = yuv_to_rgb (yuv, offset, coeff1, coeff2, coeff3);\n"
+    "rgba.a = 1.0;\n"
+    "gl_FragColor=vec4(rgba.%c,rgba.%c,rgba.%c,rgba.%c);\n",
+    GST_GL_TEXTURE_TARGET_2D
+  };
 
 /* RGB to NV12/NV21 conversion */
 /* NV12: u, v
    NV21: v, u */
-static const char frag_RGB_to_NV12_NV21[] = {
-    "#ifdef GL_ES\n"
-    "precision mediump float;\n"
-    "#endif\n"
-    "varying vec2 v_texcoord;\n"
-    "uniform sampler2D tex;\n"
-    "uniform vec2 tex_scale0;\n"
-    "uniform vec2 tex_scale1;\n"
-    "uniform vec2 tex_scale2;\n"
-    RGB_TO_YUV_COEFFICIENTS
-    "void main(void) {\n"
-    "  float y, u, v;\n"
-    "  vec4 texel, uv_texel;\n"
-    "  texel = texture2D(tex, v_texcoord * tex_scale0).%c%c%c%c;\n"
-    "  uv_texel = texture2D(tex, v_texcoord * tex_scale0 * 2.0).%c%c%c%c;\n"
-    "  y = dot(texel.rgb, coeff1);\n"
-    "  u = dot(uv_texel.rgb, coeff2);\n"
-    "  v = dot(uv_texel.rgb, coeff3);\n"
-    "  y += offset.x;\n"
-    "  u += offset.y;\n"
-    "  v += offset.z;\n"
-    "  gl_FragData[0] = vec4(y, 0.0, 0.0, 1.0);\n"
-    "  gl_FragData[1] = vec4(%c, %c, 0.0, 1.0);\n"
-    "}"
-};
+static const struct shader_templ templ_RGB_to_NV12_NV21 =
+  { NULL,
+    DEFAULT_UNIFORMS RGB_TO_YUV_COEFFICIENTS "uniform sampler2D tex;\n",
+    { glsl_func_rgb_to_yuv, NULL, },
+    "vec4 texel, uv_texel;\n"
+    "vec3 yuv;\n"
+    "texel = texture2D(tex, texcoord).%c%c%c%c;\n"
+    "uv_texel = texture2D(tex, texcoord * tex_scale0 * 2.0).%c%c%c%c;\n"
+    "yuv.x = rgb_to_yuv (texel.rgb, offset, coeff1, coeff2, coeff3).x;\n"
+    "yuv.yz = rgb_to_yuv (uv_texel.rgb, offset, coeff1, coeff2, coeff3).yz;\n"
+    "gl_FragData[0] = vec4(yuv.x, 0.0, 0.0, 1.0);\n"
+    "gl_FragData[1] = vec4(yuv.%c, yuv.%c, 0.0, 1.0);\n",
+    GST_GL_TEXTURE_TARGET_2D
+  };
 
 /* YUY2:r,g,a
    UYVY:a,b,r */
-static const gchar frag_YUY2_UYVY_to_RGB[] =
-    "#ifdef GL_ES\n"
-    "precision mediump float;\n"
-    "#endif\n"
-    "varying vec2 v_texcoord;\n"
-    "uniform sampler2D Ytex, UVtex;\n"
-    "uniform vec2 tex_scale0;\n"
-    "uniform vec2 tex_scale1;\n"
-    "uniform vec2 tex_scale2;\n"
-    "uniform float width;\n"
-    YUV_TO_RGB_COEFFICIENTS
-    "void main(void) {\n"
-    "  vec3 yuv;\n"
-    "  vec4 uv_texel;\n"
-    "  float r, g, b, a;\n"
-    "  float dx1 = -1.0 / width;\n"
-    "  float dx2 = 0.0;\n"
-    "  yuv.x = texture2D(Ytex, v_texcoord * tex_scale0).%c;\n"
-    "  float inorder = mod (v_texcoord.x * width, 2.0);\n"
-    "  if (inorder < 1.0) {\n"
-    "    dx2 = -dx1;\n"
-    "    dx1 = 0.0;\n"
-    "  }\n"
-    "  uv_texel.rg = texture2D(Ytex, v_texcoord * tex_scale0 + dx1).r%c;\n"
-    "  uv_texel.ba = texture2D(Ytex, v_texcoord * tex_scale0 + dx2).r%c;\n"
-    "  yuv.yz = uv_texel.%c%c;\n"
-    "  yuv += offset;\n"
-    "  r = dot(yuv, coeff1);\n"
-    "  g = dot(yuv, coeff2);\n"
-    "  b = dot(yuv, coeff3);\n"
-    "  a = 1.0;\n"
-    "  gl_FragColor = vec4(%c, %c, %c, %c);\n"
-    "}\n";
+static const struct shader_templ templ_YUY2_UYVY_to_RGB =
+  { NULL,
+    DEFAULT_UNIFORMS YUV_TO_RGB_COEFFICIENTS "uniform sampler2D Ytex;\n",
+    { glsl_func_yuv_to_rgb, NULL, },
+    "vec4 rgba, uv_texel;\n"
+    "vec3 yuv;\n"
+    /* FIXME: should get the sampling right... */
+    "float dx1 = -1.0 / width;\n"
+    "float dx2 = 0.0;\n"
+    "yuv.x = texture2D(Ytex, texcoord * tex_scale0).%c;\n"
+    "float inorder = mod (texcoord.x * width, 2.0);\n"
+    "if (inorder < 1.0) {\n"
+    "  dx2 = -dx1;\n"
+    "  dx1 = 0.0;\n"
+    "}\n"
+    "uv_texel.rg = texture2D(Ytex, texcoord * tex_scale0 + vec2(dx1, 0.0)).r%c;\n"
+    "uv_texel.ba = texture2D(Ytex, texcoord * tex_scale0 + vec2(dx2, 0.0)).r%c;\n"
+    "yuv.yz = uv_texel.%c%c;\n"
+    "rgba.rgb = yuv_to_rgb (yuv, offset, coeff1, coeff2, coeff3);\n"
+    "rgba.a = 1.0;\n"
+    "gl_FragColor = vec4(rgba.%c,rgba.%c,rgba.%c,rgba.%c);\n",
+    GST_GL_TEXTURE_TARGET_2D
+  };
 
-static const gchar frag_RGB_to_YUY2_UYVY[] =
-    "#ifdef GL_ES\n"
-    "precision mediump float;\n"
-    "#endif\n"
-    "varying vec2 v_texcoord;\n"
-    "uniform sampler2D tex;\n"
-    "uniform float width;\n"
-    RGB_TO_YUV_COEFFICIENTS
-    "void main(void) {\n"
-    "  vec4 texel1, texel2;\n"
-    "  vec2 texel3;\n"
-    "  float fx, dx, fy, y, u, u1, u2, v, v1, v2;\n"
-    "  float inorder = mod (v_texcoord.x * width, 2.0);\n"
-    "  fx = v_texcoord.x;\n"
-    "  dx = 1.0 / width;\n"
-    "  if (v_texcoord.x >= (1.0 - 0.5 * dx) || (v_texcoord.x > 0.5 * dx && inorder < 1.0)) {\n"
-    "    dx = -dx;\n"
-    "  }\n"
-    "  fy = v_texcoord.y;\n"
-    "  texel1 = texture2D(tex, vec2(fx, fy)).%c%c%c%c;\n"
-    "  texel2 = texture2D(tex, vec2(fx + dx, fy)).%c%c%c%c;\n"
-    "  y = dot(texel1.rgb, coeff1);\n"
-    "  u1 = dot(texel1.rgb, coeff2);\n"
-    "  u2 = dot(texel2.rgb, coeff2);\n"
-    "  v1 = dot(texel1.rgb, coeff3);\n"
-    "  v2 = dot(texel2.rgb, coeff3);\n"
-    "  y += offset.x;\n"
-    "  u1 += offset.y;\n"
-    "  u2 += offset.y;\n"
-    "  v1 += offset.z;\n"
-    "  v2 += offset.z;\n"
-    "  u = (u1 + u2) / 2.0;\n"
-    "  v = (v1 + v2) / 2.0;\n"
-    "  if (inorder < 1.0) {\n"
-    "    texel3.r =%s;\n"
-    "    texel3.g = %s;\n"
-    "  } else {\n"
-    "    texel3.r =%s;\n"
-    "    texel3.g = %s;\n"
-    "  }\n"
-    "  gl_FragColor = vec4(texel3.r, texel3.g, 0.0, 0.0);\n"
-    "}\n";
+static const struct shader_templ templ_RGB_to_YUY2_UYVY =
+  { NULL,
+    DEFAULT_UNIFORMS RGB_TO_YUV_COEFFICIENTS "uniform sampler2D tex;\n",
+    { glsl_func_rgb_to_yuv, NULL, },
+    "vec4 texel1, texel2;\n"
+    "vec3 yuv, yuv1, yuv2;\n"
+    "float fx, dx, fy;\n"
+    "float inorder = mod (texcoord.x * width, 2.0);\n"
+    "fx = texcoord.x;\n"
+    "dx = 1.0 / width;\n"
+    "if (inorder > 1.0) {\n"
+    "  dx = -dx;\n"
+    "}\n"
+    "fy = texcoord.y;\n"
+    "texel1 = texture2D(tex, vec2(fx, fy)).%c%c%c%c;\n"
+    "texel2 = texture2D(tex, vec2(fx + dx, fy)).%c%c%c%c;\n"
+    "yuv1 = rgb_to_yuv (texel1.rgb, offset, coeff1, coeff2, coeff3);\n"
+    "yuv2 = rgb_to_yuv (texel2.rgb, offset, coeff1, coeff2, coeff3);\n"
+    "yuv.x = yuv1.x;\n"
+    "yuv.yz = (yuv1.yz + yuv2.yz) * 0.5;\n"
+    "if (inorder < 1.0) {\n"
+    "  gl_FragColor = vec4(yuv.%c, yuv.%c, 0.0, 0.0);\n"
+    "} else {\n"
+    "  gl_FragColor = vec4(yuv.%c, yuv.%c, 0.0, 0.0);\n"
+    "}\n",
+    GST_GL_TEXTURE_TARGET_2D
+  };
 
 static const gchar text_vertex_shader[] =
     "attribute vec4 a_position;   \n"
@@ -434,8 +367,8 @@
     "varying vec2 v_texcoord;     \n"
     "void main()                  \n"
     "{                            \n"
-    "   gl_Position = a_position; \n"
-    "   v_texcoord = a_texcoord;  \n"
+    "  gl_Position = a_position; \n"
+    "  v_texcoord = a_texcoord;  \n"
     "}                            \n";
 
 static const GLfloat vertices[] = {
@@ -453,6 +386,8 @@
 {
   gint in_n_textures;
   gint out_n_textures;
+  const struct shader_templ *templ;
+  gchar *frag_body;
   gchar *frag_prog;
   const gchar *shader_tex_names[GST_VIDEO_MAX_PLANES];
   gfloat *cms_offset;
@@ -468,6 +403,9 @@
 
   struct ConvertInfo convert_info;
 
+  GstGLTextureTarget from_texture_target;
+  GstGLTextureTarget to_texture_target;
+
   GstGLMemory *in_tex[GST_VIDEO_MAX_PLANES];
   GstGLMemory *out_tex[GST_VIDEO_MAX_PLANES];
 
@@ -592,6 +530,14 @@
   convert->priv->convert_info.chroma_sampling[0] = 1.0f;
   convert->priv->convert_info.chroma_sampling[1] = 1.0f;
 
+  if (convert->priv->convert_info.frag_prog) {
+    g_free (convert->priv->convert_info.frag_prog);
+    convert->priv->convert_info.frag_prog = NULL;
+  }
+  if (convert->priv->convert_info.frag_body) {
+    g_free (convert->priv->convert_info.frag_body);
+    convert->priv->convert_info.frag_body = NULL;
+  }
   if (convert->shader) {
     gst_object_unref (convert->shader);
     convert->shader = NULL;
@@ -604,7 +550,8 @@
 }
 
 static gboolean
-_gst_gl_color_convert_can_passthrough (GstVideoInfo * in, GstVideoInfo * out)
+_gst_gl_color_convert_can_passthrough_info (GstVideoInfo * in,
+    GstVideoInfo * out)
 {
   gint i;
 
@@ -638,6 +585,8 @@
 {
   GstVideoInfo in_info, out_info;
   GstCapsFeatures *in_features, *out_features;
+  GstGLTextureTarget from_target, to_target;
+  gboolean passthrough;
 
   g_return_val_if_fail (convert != NULL, FALSE);
   g_return_val_if_fail (in_caps, FALSE);
@@ -671,18 +620,53 @@
     return FALSE;
   }
 
+  {
+    GstStructure *in_s = gst_caps_get_structure (in_caps, 0);
+    GstStructure *out_s = gst_caps_get_structure (out_caps, 0);
+
+    if (gst_structure_has_field_typed (in_s, "texture-target", G_TYPE_STRING))
+      from_target =
+          gst_gl_texture_target_from_string (gst_structure_get_string (in_s,
+              "texture-target"));
+    else
+      from_target = GST_GL_TEXTURE_TARGET_2D;
+
+    if (gst_structure_has_field_typed (out_s, "texture-target", G_TYPE_STRING))
+      to_target =
+          gst_gl_texture_target_from_string (gst_structure_get_string (out_s,
+              "texture-target"));
+    else
+      to_target = GST_GL_TEXTURE_TARGET_2D;
+
+    if (to_target == GST_GL_TEXTURE_TARGET_NONE
+        || from_target == GST_GL_TEXTURE_TARGET_NONE)
+      /* invalid caps */
+      return FALSE;
+  }
+
   if (gst_video_info_is_equal (&convert->in_info, &in_info) &&
-      gst_video_info_is_equal (&convert->out_info, &out_info))
+      gst_video_info_is_equal (&convert->out_info, &out_info) &&
+      convert->priv->from_texture_target == from_target &&
+      convert->priv->to_texture_target == to_target)
     return TRUE;
 
+  /* If input and output are identical, pass through directly */
+  passthrough =
+      _gst_gl_color_convert_can_passthrough_info (&in_info, &out_info) &&
+      from_target == to_target;
+
+  if (!passthrough && to_target != GST_GL_TEXTURE_TARGET_2D
+      && to_target != GST_GL_TEXTURE_TARGET_RECTANGLE)
+    return FALSE;
+
   gst_gl_color_convert_reset (convert);
   convert->in_info = in_info;
   convert->out_info = out_info;
+  convert->priv->from_texture_target = from_target;
+  convert->priv->to_texture_target = to_target;
   convert->initted = FALSE;
 
-  /* If input and output are identical, pass through directly */
-  convert->passthrough =
-      _gst_gl_color_convert_can_passthrough (&in_info, &out_info);
+  convert->passthrough = passthrough;
 #ifndef GST_DISABLE_GST_DEBUG
   if (G_UNLIKELY (convert->passthrough))
     GST_DEBUG_OBJECT (convert,
@@ -717,6 +701,41 @@
   return ret;
 }
 
+static guint
+_get_target_bitmask_from_g_value (const GValue * targets)
+{
+  guint new_targets = 0;
+
+  if (targets == NULL) {
+    new_targets = 1 << GST_GL_TEXTURE_TARGET_2D;
+  } else if (G_TYPE_CHECK_VALUE_TYPE (targets, G_TYPE_STRING)) {
+    GstGLTextureTarget target;
+    const gchar *str;
+
+    str = g_value_get_string (targets);
+    target = gst_gl_texture_target_from_string (str);
+
+    if (target)
+      new_targets |= 1 << target;
+  } else if (G_TYPE_CHECK_VALUE_TYPE (targets, GST_TYPE_LIST)) {
+    gint j, m;
+
+    m = gst_value_list_get_size (targets);
+    for (j = 0; j < m; j++) {
+      const GValue *val = gst_value_list_get_value (targets, j);
+      GstGLTextureTarget target;
+      const gchar *str;
+
+      str = g_value_get_string (val);
+      target = gst_gl_texture_target_from_string (str);
+      if (target)
+        new_targets |= 1 << target;
+    }
+  }
+
+  return new_targets;
+}
+
 /* copies the given caps */
 static GstCaps *
 gst_gl_color_convert_caps_remove_format_info (GstCaps * caps)
@@ -740,10 +759,9 @@
 
     st = gst_structure_copy (st);
     gst_structure_remove_fields (st, "format", "colorimetry", "chroma-site",
-        NULL);
+        "texture-target", NULL);
 
-    gst_caps_append_structure_full (res, st,
-        gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, NULL));
+    gst_caps_append_structure_full (res, st, gst_caps_features_copy (f));
   }
 
   return res;
@@ -755,9 +773,7 @@
 {
   GstCaps *templ, *result;
 
-  templ =
-      gst_caps_from_string (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
-      (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, GST_GL_COLOR_CONVERT_FORMATS));
+  templ = gst_caps_from_string (GST_GL_COLOR_CONVERT_VIDEO_CAPS);
 
   caps = gst_gl_color_convert_caps_remove_format_info (caps);
 
@@ -765,8 +781,6 @@
   gst_caps_unref (caps);
   gst_caps_unref (templ);
 
-  result = gst_gl_overlay_compositor_add_caps (result);
-
   if (filter) {
     GstCaps *tmp;
 
@@ -778,6 +792,75 @@
   return result;
 }
 
+GstCaps *
+gst_gl_color_convert_fixate_caps (GstGLContext * convert,
+    GstPadDirection direction, GstCaps * caps, GstCaps * other)
+{
+  GValue item = G_VALUE_INIT;
+  const GValue *targets, *other_targets;
+  guint targets_mask = 0, other_targets_mask = 0, result_mask;
+  GstVideoInfo info, other_info;
+  GstStructure *s, *s_other;
+
+  other = gst_caps_make_writable (other);
+  s = gst_caps_get_structure (caps, 0);
+  s_other = gst_caps_get_structure (other, 0);
+
+  targets = gst_structure_get_value (s, "texture-target");
+  other_targets = gst_structure_get_value (s_other, "texture-target");
+
+  targets_mask = _get_target_bitmask_from_g_value (targets);
+  other_targets_mask = _get_target_bitmask_from_g_value (other_targets);
+
+  /* XXX: attempt to fixate the format/colorimetry/etc */
+  other = gst_caps_fixate (other);
+
+  result_mask = targets_mask & other_targets_mask;
+  if (result_mask == 0) {
+    /* nothing we can do here */
+    return other;
+  }
+
+  caps = gst_caps_copy (caps);
+  caps = gst_caps_fixate (caps);
+
+  gst_video_info_from_caps (&info, caps);
+  gst_video_info_from_caps (&other_info, other);
+
+  if (!_gst_gl_color_convert_can_passthrough_info (&info, &other_info)) {
+    if (direction == GST_PAD_SINK) {
+      /* this effectively limits us to 2D | RECTANGLE for case where we
+       * have to convert */
+      result_mask &=
+          (1 << GST_GL_TEXTURE_TARGET_2D | 1 <<
+          GST_GL_TEXTURE_TARGET_RECTANGLE);
+    } else {
+      /* if the src caps has 2D support we can 'convert' to anything */
+      if (targets_mask & (1 << GST_GL_TEXTURE_TARGET_2D | 1 <<
+              GST_GL_TEXTURE_TARGET_RECTANGLE))
+        result_mask = -1;
+      else
+        result_mask = other_targets_mask;
+    }
+  }
+
+  g_value_init (&item, G_TYPE_STRING);
+  if (result_mask & (1 << GST_GL_TEXTURE_TARGET_2D)) {
+    g_value_set_static_string (&item, GST_GL_TEXTURE_TARGET_2D_STR);
+  } else if (result_mask & (1 << GST_GL_TEXTURE_TARGET_RECTANGLE)) {
+    g_value_set_static_string (&item, GST_GL_TEXTURE_TARGET_RECTANGLE_STR);
+  } else if (result_mask & (1 << GST_GL_TEXTURE_TARGET_EXTERNAL_OES)) {
+    g_value_set_static_string (&item, GST_GL_TEXTURE_TARGET_EXTERNAL_OES_STR);
+  }
+
+  gst_structure_set_value (s_other, "texture-target", &item);
+
+  g_value_unset (&item);
+  gst_caps_unref (caps);
+
+  return other;
+}
+
 /**
  * gst_gl_color_convert_perform:
  * @convert: a #GstGLColorConvert
@@ -961,7 +1044,8 @@
     }
     alpha = g_strdup_printf ("t.%c = 1.0;", input_alpha_channel);
   }
-  info->frag_prog = g_strdup_printf (frag_REORDER, alpha ? alpha : "",
+  info->templ = &templ_REORDER;
+  info->frag_body = g_strdup_printf (info->templ->body, alpha ? alpha : "",
       pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3]);
   info->shader_tex_names[0] = "tex";
 
@@ -992,7 +1076,7 @@
   if (gst_is_gl_memory (memory) && (USING_OPENGL (convert->context)
           || USING_OPENGL3 (convert->context))) {
     in_tex_rectangular =
-        ((GstGLMemory *) memory)->tex_target == GL_TEXTURE_RECTANGLE;
+        convert->priv->from_texture_target == GST_GL_TEXTURE_TARGET_RECTANGLE;
   }
 #endif
 
@@ -1004,15 +1088,19 @@
      * the Apple YCbCr422 extension. It could also be a normal UYVY texture
      * with RB or Lum/Alpha
      */
-    info->frag_prog =
-        g_strdup_printf (frag_APPLE_YUV_TO_RGB, pixel_order[0], pixel_order[1],
+    /* The mangling will change this to the correct texture2DRect, sampler2DRect
+     * for us */
+    info->templ = &templ_REORDER;
+    info->frag_body =
+        g_strdup_printf (info->templ->body, pixel_order[0], pixel_order[1],
         pixel_order[2], pixel_order[3]);
     info->in_n_textures = 1;
     info->shader_tex_names[0] = "tex";
   } else {
     switch (GST_VIDEO_INFO_FORMAT (&convert->in_info)) {
       case GST_VIDEO_FORMAT_AYUV:
-        info->frag_prog = g_strdup_printf (frag_AYUV_to_RGB, pixel_order[0],
+        info->templ = &templ_AYUV_to_RGB;
+        info->frag_body = g_strdup_printf (info->templ->body, pixel_order[0],
             pixel_order[1], pixel_order[2], pixel_order[3]);
         info->in_n_textures = 1;
         info->shader_tex_names[0] = "tex";
@@ -1021,8 +1109,9 @@
       case GST_VIDEO_FORMAT_Y444:
       case GST_VIDEO_FORMAT_Y42B:
       case GST_VIDEO_FORMAT_Y41B:
-        info->frag_prog =
-            g_strdup_printf (frag_PLANAR_YUV_to_RGB, pixel_order[0],
+        info->templ = &templ_PLANAR_YUV_to_RGB;
+        info->frag_body =
+            g_strdup_printf (info->templ->body, pixel_order[0],
             pixel_order[1], pixel_order[2], pixel_order[3]);
         info->in_n_textures = 3;
         info->shader_tex_names[0] = "Ytex";
@@ -1030,8 +1119,9 @@
         info->shader_tex_names[2] = "Vtex";
         break;
       case GST_VIDEO_FORMAT_YV12:
-        info->frag_prog =
-            g_strdup_printf (frag_PLANAR_YUV_to_RGB, pixel_order[0],
+        info->templ = &templ_PLANAR_YUV_to_RGB;
+        info->frag_body =
+            g_strdup_printf (info->templ->body, pixel_order[0],
             pixel_order[1], pixel_order[2], pixel_order[3]);
         info->in_n_textures = 3;
         info->shader_tex_names[0] = "Ytex";
@@ -1041,17 +1131,30 @@
       case GST_VIDEO_FORMAT_YUY2:
       {
         char uv_val = texture_rg ? 'g' : 'a';
-        info->frag_prog = g_strdup_printf (frag_YUY2_UYVY_to_RGB, 'r', uv_val,
+        info->templ = &templ_YUY2_UYVY_to_RGB;
+        info->frag_body = g_strdup_printf (info->templ->body, 'r', uv_val,
             uv_val, 'g', 'a', pixel_order[0], pixel_order[1], pixel_order[2],
             pixel_order[3]);
         info->in_n_textures = 1;
         info->shader_tex_names[0] = "Ytex";
         break;
       }
+      case GST_VIDEO_FORMAT_UYVY:
+      {
+        char y_val = texture_rg ? 'g' : 'a';
+        info->templ = &templ_YUY2_UYVY_to_RGB;
+        info->frag_body = g_strdup_printf (info->templ->body, y_val, 'g',
+            'g', 'r', 'b', pixel_order[0], pixel_order[1], pixel_order[2],
+            pixel_order[3]);
+        info->in_n_textures = 1;
+        info->shader_tex_names[0] = "Ytex";
+        break;
+      }
       case GST_VIDEO_FORMAT_NV12:
       {
         char val2 = texture_rg ? 'g' : 'a';
-        info->frag_prog = g_strdup_printf (frag_NV12_NV21_to_RGB, 'r', val2,
+        info->templ = &templ_NV12_NV21_to_RGB;
+        info->frag_body = g_strdup_printf (info->templ->body, 'r', val2,
             pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3]);
         info->in_n_textures = 2;
         info->shader_tex_names[0] = "Ytex";
@@ -1061,23 +1164,14 @@
       case GST_VIDEO_FORMAT_NV21:
       {
         char val2 = texture_rg ? 'g' : 'a';
-        info->frag_prog = g_strdup_printf (frag_NV12_NV21_to_RGB, val2, 'r',
+        info->templ = &templ_NV12_NV21_to_RGB;
+        info->frag_body = g_strdup_printf (info->templ->body, val2, 'r',
             pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3]);
         info->in_n_textures = 2;
         info->shader_tex_names[0] = "Ytex";
         info->shader_tex_names[1] = "UVtex";
         break;
       }
-      case GST_VIDEO_FORMAT_UYVY:
-      {
-        char y_val = texture_rg ? 'g' : 'a';
-        info->frag_prog = g_strdup_printf (frag_YUY2_UYVY_to_RGB, y_val, 'g',
-            'g', 'r', 'b', pixel_order[0], pixel_order[1], pixel_order[2],
-            pixel_order[3]);
-        info->in_n_textures = 1;
-        info->shader_tex_names[0] = "Ytex";
-        break;
-      }
       default:
         break;
     }
@@ -1118,7 +1212,8 @@
   switch (out_format) {
     case GST_VIDEO_FORMAT_AYUV:
       alpha = _is_RGBx (in_format) ? "1.0" : "texel.a";
-      info->frag_prog = g_strdup_printf (frag_RGB_to_AYUV, pixel_order[0],
+      info->templ = &templ_RGB_to_AYUV;
+      info->frag_body = g_strdup_printf (info->templ->body, pixel_order[0],
           pixel_order[1], pixel_order[2], pixel_order[3], alpha);
       info->out_n_textures = 1;
       break;
@@ -1127,7 +1222,8 @@
     case GST_VIDEO_FORMAT_Y444:
     case GST_VIDEO_FORMAT_Y42B:
     case GST_VIDEO_FORMAT_Y41B:
-      info->frag_prog = g_strdup_printf (frag_RGB_to_PLANAR_YUV,
+      info->templ = &templ_RGB_to_PLANAR_YUV;
+      info->frag_body = g_strdup_printf (info->templ->body,
           pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3],
           pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3]);
       info->out_n_textures = 3;
@@ -1144,31 +1240,35 @@
       }
       break;
     case GST_VIDEO_FORMAT_YUY2:
-      info->frag_prog = g_strdup_printf (frag_RGB_to_YUY2_UYVY,
+      info->templ = &templ_RGB_to_YUY2_UYVY;
+      info->frag_body = g_strdup_printf (info->templ->body,
           pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3],
           pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3],
-          "y", "u", "y", "v");
+          'x', 'y', 'x', 'z');
       info->out_n_textures = 1;
       break;
     case GST_VIDEO_FORMAT_UYVY:
-      info->frag_prog = g_strdup_printf (frag_RGB_to_YUY2_UYVY,
+      info->templ = &templ_RGB_to_YUY2_UYVY,
+          info->frag_body = g_strdup_printf (info->templ->body,
           pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3],
           pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3],
-          "u", "y", "v", "y");
+          'y', 'x', 'z', 'x');
       info->out_n_textures = 1;
       break;
     case GST_VIDEO_FORMAT_NV12:
-      info->frag_prog = g_strdup_printf (frag_RGB_to_NV12_NV21,
+      info->templ = &templ_RGB_to_NV12_NV21,
+          info->frag_body = g_strdup_printf (info->templ->body,
           pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3],
           pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3],
-          'u', 'v');
+          'y', 'z');
       info->out_n_textures = 2;
       break;
     case GST_VIDEO_FORMAT_NV21:
-      info->frag_prog = g_strdup_printf (frag_RGB_to_NV12_NV21,
+      info->templ = &templ_RGB_to_NV12_NV21,
+          info->frag_body = g_strdup_printf (info->templ->body,
           pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3],
           pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3],
-          'v', 'u');
+          'z', 'y');
       info->out_n_textures = 2;
       break;
     default:
@@ -1210,7 +1310,8 @@
 
   switch (GST_VIDEO_INFO_FORMAT (&convert->out_info)) {
     case GST_VIDEO_FORMAT_GRAY8:
-      info->frag_prog = g_strdup_printf (frag_REORDER, alpha ? alpha : "",
+      info->templ = &templ_REORDER;
+      info->frag_body = g_strdup_printf (info->templ->body, alpha ? alpha : "",
           pixel_order[0], pixel_order[0], pixel_order[0], pixel_order[3]);
       break;
     default:
@@ -1242,20 +1343,23 @@
 
   switch (GST_VIDEO_INFO_FORMAT (&convert->in_info)) {
     case GST_VIDEO_FORMAT_GRAY8:
-      info->frag_prog = g_strdup_printf (frag_REORDER, "", pixel_order[0],
+      info->templ = &templ_REORDER;
+      info->frag_body = g_strdup_printf (info->templ->body, "", pixel_order[0],
           pixel_order[0], pixel_order[0], pixel_order[3]);
       break;
     case GST_VIDEO_FORMAT_GRAY16_LE:
     {
       char val2 = texture_rg ? 'g' : 'a';
-      info->frag_prog = g_strdup_printf (frag_COMPOSE, val2, 'r',
+      info->templ = &templ_COMPOSE;
+      info->frag_body = g_strdup_printf (info->templ->body, val2, 'r',
           pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3]);
       break;
     }
     case GST_VIDEO_FORMAT_GRAY16_BE:
     {
       char val2 = texture_rg ? 'g' : 'a';
-      info->frag_prog = g_strdup_printf (frag_COMPOSE, 'r', val2,
+      info->templ = &templ_COMPOSE;
+      info->frag_body = g_strdup_printf (info->templ->body, 'r', val2,
           pixel_order[0], pixel_order[1], pixel_order[2], pixel_order[3]);
       break;
     }
@@ -1298,12 +1402,309 @@
   gl->DisableVertexAttribArray (convert->priv->attr_texture);
 }
 
+static gchar *
+_mangle_texture_access (const gchar * str, GstGLTextureTarget from,
+    GstGLTextureTarget to, GstGLAPI gl_api)
+{
+  const gchar *from_str = NULL, *to_str = NULL;
+  gchar *ret, *tmp;
+  gchar *regex_find;
+  GRegex *regex;
+
+  if (from == GST_GL_TEXTURE_TARGET_2D)
+    from_str = "texture2D";
+  if (from == GST_GL_TEXTURE_TARGET_RECTANGLE)
+    from_str = "texture2DRect";
+  if (from == GST_GL_TEXTURE_TARGET_EXTERNAL_OES)
+    from_str = "texture2D";
+
+  if (gl_api & GST_GL_API_OPENGL3) {
+    to_str = "texture";
+  } else {
+    if (to == GST_GL_TEXTURE_TARGET_2D)
+      to_str = "texture2D";
+    if (to == GST_GL_TEXTURE_TARGET_RECTANGLE)
+      to_str = "texture2DRect";
+    if (to == GST_GL_TEXTURE_TARGET_EXTERNAL_OES)
+      to_str = "texture2D";
+  }
+
+  /* followed by any amount of whitespace then a bracket */
+  regex_find = g_strdup_printf ("%s(?=\\s*\\()", from_str);
+  regex = g_regex_new (regex_find, 0, 0, NULL);
+  tmp = g_regex_replace_literal (regex, str, -1, 0, to_str, 0, NULL);
+  g_free (regex_find);
+  g_regex_unref (regex);
+
+  if (tmp) {
+    ret = tmp;
+  } else {
+    GST_FIXME ("Couldn't mangle texture access successfully from %s to %s",
+        from_str, to_str);
+    ret = g_strdup (str);
+  }
+
+  return ret;
+}
+
+static gchar *
+_mangle_sampler_type (const gchar * str, GstGLTextureTarget from,
+    GstGLTextureTarget to)
+{
+  const gchar *from_str = NULL, *to_str = NULL;
+  gchar *ret, *tmp;
+  gchar *regex_find;
+  GRegex *regex;
+
+  if (from == GST_GL_TEXTURE_TARGET_2D)
+    from_str = "sampler2D";
+  if (from == GST_GL_TEXTURE_TARGET_RECTANGLE)
+    from_str = "sampler2DRect";
+  if (from == GST_GL_TEXTURE_TARGET_EXTERNAL_OES)
+    from_str = "samplerExternalOES";
+
+  if (to == GST_GL_TEXTURE_TARGET_2D)
+    to_str = "sampler2D";
+  if (to == GST_GL_TEXTURE_TARGET_RECTANGLE)
+    to_str = "sampler2DRect";
+  if (to == GST_GL_TEXTURE_TARGET_EXTERNAL_OES)
+    to_str = "samplerExternalOES";
+
+  /* followed by some whitespace  */
+  regex_find = g_strdup_printf ("%s(?=\\s)", from_str);
+  regex = g_regex_new (regex_find, 0, 0, NULL);
+  tmp = g_regex_replace_literal (regex, str, -1, 0, to_str, 0, NULL);
+  g_free (regex_find);
+  g_regex_unref (regex);
+
+  if (tmp) {
+    ret = tmp;
+  } else {
+    GST_FIXME ("Couldn't mangle sampler type successfully from %s to %s",
+        from_str, to_str);
+    ret = g_strdup (str);
+  }
+
+  return ret;
+}
+
+static gchar *
+_mangle_varying_attribute (const gchar * str, guint shader_type,
+    GstGLAPI gl_api)
+{
+  if (gl_api & GST_GL_API_OPENGL3) {
+    if (shader_type == GL_VERTEX_SHADER) {
+      gchar *tmp, *tmp2;
+      GRegex *regex;
+
+      /* followed by some whitespace  */
+      regex = g_regex_new ("varying(?=\\s)", 0, 0, NULL);
+      tmp = g_regex_replace_literal (regex, str, -1, 0, "out", 0, NULL);
+      g_regex_unref (regex);
+
+      /* followed by some whitespace  */
+      regex = g_regex_new ("attribute(?=\\s)", 0, 0, NULL);
+      tmp2 = g_regex_replace_literal (regex, tmp, -1, 0, "in", 0, NULL);
+      g_regex_unref (regex);
+
+      g_free (tmp);
+      return tmp2;
+    } else if (shader_type == GL_FRAGMENT_SHADER) {
+      gchar *tmp;
+      GRegex *regex;
+
+      /* followed by some whitespace  */
+      regex = g_regex_new ("varying(?=\\s)", 0, 0, NULL);
+      tmp = g_regex_replace_literal (regex, str, -1, 0, "in", 0, NULL);
+      g_regex_unref (regex);
+
+      return tmp;
+    }
+  }
+  return g_strdup (str);
+}
+
+static gchar *
+_mangle_frag_color (const gchar * str)
+{
+  GRegex *regex;
+  gchar *ret;
+
+  regex = g_regex_new ("gl_FragColor", 0, 0, NULL);
+  ret = g_regex_replace_literal (regex, str, -1, 0, "fragColor", 0, NULL);
+  g_regex_unref (regex);
+
+  return ret;
+}
+
+static void
+_mangle_version_profile_from_gl_api (GstGLAPI gl_api, GstGLSLVersion * version,
+    GstGLSLProfile * profile)
+{
+  if (gl_api & GST_GL_API_OPENGL3) {
+    *version = GST_GLSL_VERSION_150;
+    *profile = GST_GLSL_PROFILE_NONE;
+  } else if (gl_api & GST_GL_API_GLES2) {
+    *version = GST_GLSL_VERSION_100;
+    *profile = GST_GLSL_PROFILE_ES;
+  } else if (gl_api & GST_GL_API_OPENGL) {
+    *version = GST_GLSL_VERSION_110;
+    *profile = GST_GLSL_PROFILE_COMPATIBILITY;
+  }
+}
+
+static gchar *
+_mangle_shader (const gchar * str, guint shader_type, GstGLTextureTarget from,
+    GstGLTextureTarget to, GstGLAPI gl_api, GstGLSLVersion * version,
+    GstGLSLProfile * profile)
+{
+  gchar *tmp, *tmp2;
+
+  tmp = _mangle_texture_access (str, from, to, gl_api);
+  tmp2 = _mangle_sampler_type (tmp, from, to);
+  g_free (tmp);
+  tmp = _mangle_varying_attribute (tmp2, shader_type, gl_api);
+  g_free (tmp2);
+  if (shader_type == GL_FRAGMENT_SHADER && gl_api & GST_GL_API_OPENGL3) {
+    tmp2 = _mangle_frag_color (tmp);
+    g_free (tmp);
+    tmp = tmp2;
+  }
+  _mangle_version_profile_from_gl_api (gl_api, version, profile);
+  return tmp;
+}
+
+static GstGLShader *
+_create_shader (GstGLColorConvert * convert)
+{
+  struct ConvertInfo *info = &convert->priv->convert_info;
+  GString *str = g_string_new (NULL);
+  GstGLShader *ret = NULL;
+  GstGLSLStage *stage;
+  GstGLSLVersion version;
+  GstGLSLProfile profile;
+  gchar *version_str, *tmp, *tmp1;
+  const gchar *strings[2];
+  GError *error = NULL;
+  GstGLAPI gl_api;
+  int i;
+
+  gl_api = gst_gl_context_get_gl_api (convert->context);
+
+  ret = gst_gl_shader_new (convert->context);
+
+  tmp =
+      _mangle_shader (text_vertex_shader, GL_VERTEX_SHADER, info->templ->target,
+      convert->priv->from_texture_target, gl_api, &version, &profile);
+
+  tmp1 = gst_glsl_version_profile_to_string (version, profile);
+  version_str = g_strdup_printf ("#version %s\n", tmp1);
+  g_free (tmp1);
+
+  strings[0] = version_str;
+  strings[1] = tmp;
+  if (!(stage = gst_glsl_stage_new_with_strings (convert->context,
+              GL_VERTEX_SHADER, version, profile, 2, strings))) {
+    GST_ERROR_OBJECT (convert, "Failed to create vertex stage");
+    g_free (version_str);
+    g_free (tmp);
+    gst_object_unref (ret);
+    return NULL;
+  }
+  g_free (tmp);
+
+  if (!gst_gl_shader_compile_attach_stage (ret, stage, &error)) {
+    GST_ERROR_OBJECT (convert, "Failed to compile vertex shader %s",
+        error->message);
+    g_clear_error (&error);
+    g_free (version_str);
+    gst_object_unref (stage);
+    gst_object_unref (ret);
+    return NULL;
+  }
+
+  if (info->templ->extensions)
+    g_string_append (str, info->templ->extensions);
+
+  if (convert->priv->from_texture_target == GST_GL_TEXTURE_TARGET_EXTERNAL_OES
+      && info->templ->target != GST_GL_TEXTURE_TARGET_EXTERNAL_OES)
+    g_string_append (str, glsl_OES_extension_string);
+
+  if (info->templ->uniforms)
+    g_string_append (str, info->templ->uniforms);
+
+  if (gl_api & GST_GL_API_OPENGL3) {
+    g_string_append_c (str, '\n');
+    g_string_append (str, "out vec4 fragColor;\n");
+  }
+
+  for (i = 0; i < MAX_FUNCTIONS; i++) {
+    if (info->templ->functions[i] == NULL)
+      break;
+
+    g_string_append_c (str, '\n');
+    g_string_append (str, info->templ->functions[i]);
+    g_string_append_c (str, '\n');
+  }
+
+  g_string_append (str, "\nvarying vec2 v_texcoord;\nvoid main (void) {\n");
+  if (info->frag_body) {
+    g_string_append (str, "vec2 texcoord;\n");
+    if (convert->priv->from_texture_target == GST_GL_TEXTURE_TARGET_RECTANGLE
+        && info->templ->target != GST_GL_TEXTURE_TARGET_RECTANGLE) {
+      g_string_append (str, "texcoord = v_texcoord * vec2 (width, height);\n");
+    } else {
+      g_string_append (str, "texcoord = v_texcoord;\n");
+    }
+
+    g_string_append (str, info->frag_body);
+  }
+  g_string_append (str, "\n}");
+  tmp = g_string_free (str, FALSE);
+  info->frag_prog = _mangle_shader (tmp, GL_FRAGMENT_SHADER,
+      info->templ->target, convert->priv->from_texture_target, gl_api,
+      &version, &profile);
+  g_free (tmp);
+
+  strings[1] = info->frag_prog;
+  if (!(stage = gst_glsl_stage_new_with_strings (convert->context,
+              GL_FRAGMENT_SHADER, version, profile, 2, strings))) {
+    GST_ERROR_OBJECT (convert, "Failed to create fragment stage");
+    g_free (info->frag_prog);
+    info->frag_prog = NULL;
+    g_free (version_str);
+    gst_object_unref (ret);
+    return NULL;
+  }
+  g_free (version_str);
+  if (!gst_gl_shader_compile_attach_stage (ret, stage, &error)) {
+    GST_ERROR_OBJECT (convert, "Failed to compile fragment shader %s",
+        error->message);
+    g_clear_error (&error);
+    g_free (info->frag_prog);
+    info->frag_prog = NULL;
+    gst_object_unref (stage);
+    gst_object_unref (ret);
+    return NULL;
+  }
+
+  if (!gst_gl_shader_link (ret, &error)) {
+    GST_ERROR_OBJECT (convert, "Failed to link shader %s", error->message);
+    g_clear_error (&error);
+    g_free (info->frag_prog);
+    info->frag_prog = NULL;
+    gst_object_unref (ret);
+    return NULL;
+  }
+
+  return ret;
+}
+
 /* Called in the gl thread */
 static gboolean
 _init_convert (GstGLColorConvert * convert)
 {
   GstGLFuncs *gl;
-  gboolean res;
   struct ConvertInfo *info = &convert->priv->convert_info;
   gint i;
 
@@ -1352,13 +1753,11 @@
     }
   }
 
-  if (!info->frag_prog || info->in_n_textures == 0 || info->out_n_textures == 0)
+  if (!info->frag_body || info->in_n_textures == 0 || info->out_n_textures == 0)
     goto unhandled_format;
 
-  /* multiple draw targets not supported on GLES2...yet */
-  if (info->out_n_textures > 1 && (!gl->DrawBuffers ||
-          USING_GLES2 (convert->context))) {
-    g_free (info->frag_prog);
+  /* multiple draw targets not supported on GLES2... */
+  if (info->out_n_textures > 1 && !gl->DrawBuffers) {
     GST_ERROR ("Conversion requires output to multiple draw buffers");
     goto incompatible_api;
   }
@@ -1368,16 +1767,11 @@
       (GST_VIDEO_INFO_FORMAT (&convert->out_info) == GST_VIDEO_FORMAT_YUY2 ||
           GST_VIDEO_INFO_FORMAT (&convert->out_info) ==
           GST_VIDEO_FORMAT_UYVY)) {
-    g_free (info->frag_prog);
     GST_ERROR ("Conversion requires reading with an unsupported format");
     goto incompatible_api;
   }
 
-  res =
-      gst_gl_context_gen_shader (convert->context, text_vertex_shader,
-      info->frag_prog, &convert->shader);
-  g_free (info->frag_prog);
-  if (!res)
+  if (!(convert->shader = _create_shader (convert)))
     goto error;
 
   convert->priv->attr_position =
@@ -1612,15 +2006,27 @@
       /* Luminance formats are not color renderable */
       /* renderering to a framebuffer only renders the intersection of all
        * the attachments i.e. the smallest attachment size */
-      GstVideoInfo temp_info;
+      if (!convert->priv->out_tex[j]) {
+        GstGLVideoAllocationParams *params;
+        GstGLBaseMemoryAllocator *base_mem_allocator;
+        GstAllocator *allocator;
+        GstVideoInfo temp_info;
 
-      gst_video_info_set_format (&temp_info, GST_VIDEO_FORMAT_RGBA, out_width,
-          out_height);
+        gst_video_info_set_format (&temp_info, GST_VIDEO_FORMAT_RGBA, out_width,
+            out_height);
 
-      if (!convert->priv->out_tex[j])
+        allocator = gst_allocator_find (GST_GL_MEMORY_ALLOCATOR_NAME);
+        base_mem_allocator = GST_GL_BASE_MEMORY_ALLOCATOR (allocator);
+        params = gst_gl_video_allocation_params_new (context, NULL, &temp_info,
+            0, NULL, convert->priv->to_texture_target);
+
         convert->priv->out_tex[j] =
-            (GstGLMemory *) gst_gl_memory_alloc (context, NULL, &temp_info, 0,
-            NULL);
+            (GstGLMemory *) gst_gl_base_memory_alloc (base_mem_allocator,
+            (GstGLAllocationParams *) params);
+
+        gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
+        gst_object_unref (allocator);
+      }
     } else {
       convert->priv->out_tex[j] = out_tex;
     }
@@ -1675,9 +2081,9 @@
         res = FALSE;
         continue;
       }
-      gst_gl_memory_copy_into_texture (convert->priv->out_tex[j],
-          out_tex->tex_id, out_tex->tex_type, mem_width, mem_height,
-          GST_VIDEO_INFO_PLANE_STRIDE (&out_tex->info, out_tex->plane), FALSE);
+      gst_gl_memory_copy_into (convert->priv->out_tex[j],
+          out_tex->tex_id, convert->priv->to_texture_target, out_tex->tex_type,
+          mem_width, mem_height);
       gst_memory_unmap ((GstMemory *) convert->priv->out_tex[j], &from_info);
       gst_memory_unmap ((GstMemory *) out_tex, &to_info);
     } else {
@@ -1711,6 +2117,10 @@
   gboolean res = TRUE;
   gint views, v;
   GstVideoOverlayCompositionMeta *composition_meta;
+  GstGLSyncMeta *sync_meta;
+  GstGLVideoAllocationParams *params;
+  GstGLMemoryAllocator *mem_allocator;
+  GstAllocator *allocator;
 
   convert->outbuf = NULL;
 
@@ -1719,12 +2129,26 @@
     return;
   }
 
+  sync_meta = gst_buffer_get_gl_sync_meta (convert->inbuf);
+  if (sync_meta)
+    gst_gl_sync_meta_wait (sync_meta, convert->context);
+
   convert->outbuf = gst_buffer_new ();
-  if (!gst_gl_memory_setup_buffer (convert->context, NULL, &convert->out_info,
-          NULL, convert->outbuf)) {
+
+  allocator = gst_allocator_find (GST_GL_MEMORY_ALLOCATOR_NAME);
+  mem_allocator = GST_GL_MEMORY_ALLOCATOR (allocator);
+  params =
+      gst_gl_video_allocation_params_new (context, NULL, &convert->out_info, 0,
+      NULL, convert->priv->to_texture_target);
+
+  if (!gst_gl_memory_setup_buffer (mem_allocator, convert->outbuf, params)) {
+    gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
+    gst_object_unref (allocator);
     convert->priv->result = FALSE;
     return;
   }
+  gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
+  gst_object_unref (allocator);
 
   if (GST_VIDEO_INFO_MULTIVIEW_MODE (in_info) ==
       GST_VIDEO_MULTIVIEW_MODE_SEPARATED)
@@ -1732,6 +2156,10 @@
   else
     views = 1;
 
+  gst_gl_insert_debug_marker (context, "%s converting from %s to %s",
+      GST_OBJECT_NAME (convert),
+      gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (in_info)),
+      gst_video_format_to_string (GST_VIDEO_INFO_FORMAT (&convert->out_info)));
   /* Handle all views on input and output one at a time */
   for (v = 0; res && v < views; v++)
     res = _do_convert_one_view (context, convert, v);
@@ -1786,11 +2214,14 @@
 
   /* attach the texture to the FBO to renderer to */
   for (i = 0; i < c_info->out_n_textures; i++) {
+    guint gl_target =
+        gst_gl_texture_target_to_gl (convert->priv->to_texture_target);
+
     /* needed? */
-    gl->BindTexture (GL_TEXTURE_2D, convert->priv->out_tex[i]->tex_id);
+    gl->BindTexture (gl_target, convert->priv->out_tex[i]->tex_id);
 
     gl->FramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i,
-        GL_TEXTURE_2D, convert->priv->out_tex[i]->tex_id, 0);
+        gl_target, convert->priv->out_tex[i]->tex_id, 0);
   }
 
   if (gl->DrawBuffers)
@@ -1811,15 +2242,15 @@
 
   for (i = c_info->in_n_textures - 1; i >= 0; i--) {
     gchar *scale_name = g_strdup_printf ("tex_scale%u", i);
-    GstGLMemory *m = convert->priv->in_tex[i];
-    guint tex_target = m->tex_target;
+    guint gl_target =
+        gst_gl_texture_target_to_gl (convert->priv->from_texture_target);
 
     gl->ActiveTexture (GL_TEXTURE0 + i);
-    gl->BindTexture (tex_target, convert->priv->in_tex[i]->tex_id);
-    gl->TexParameteri (tex_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
-    gl->TexParameteri (tex_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
-    gl->TexParameteri (tex_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
-    gl->TexParameteri (tex_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+    gl->BindTexture (gl_target, convert->priv->in_tex[i]->tex_id);
+    gl->TexParameteri (gl_target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+    gl->TexParameteri (gl_target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+    gl->TexParameteri (gl_target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+    gl->TexParameteri (gl_target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 
     gst_gl_shader_set_uniform_2fv (convert->shader, scale_name, 1,
         convert->priv->in_tex[i]->tex_scaling);
diff --git a/gst-libs/gst/gl/gstglcolorconvert.h b/gst-libs/gst/gl/gstglcolorconvert.h
index 8e66be4..f06bb5c 100644
--- a/gst-libs/gst/gl/gstglcolorconvert.h
+++ b/gst-libs/gst/gl/gstglcolorconvert.h
@@ -84,7 +84,7 @@
  *
  * The currently supported formats that can be converted
  */
-#define GST_GL_COLOR_CONVERT_FORMATS "{ RGB, RGBx, RGBA, BGR, BGRx, BGRA, xRGB, " \
+#define GST_GL_COLOR_CONVERT_FORMATS "{ RGBA, RGB, RGBx, BGR, BGRx, BGRA, xRGB, " \
                                "xBGR, ARGB, ABGR, Y444, I420, YV12, Y42B, " \
                                "Y41B, NV12, NV21, YUY2, UYVY, AYUV, " \
                                "GRAY8, GRAY16_LE, GRAY16_BE, RGB16, BGR16 }"
@@ -95,13 +95,20 @@
  * The currently supported #GstCaps that can be converted
  */
 #define GST_GL_COLOR_CONVERT_VIDEO_CAPS \
-    GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, \
-        GST_GL_COLOR_CONVERT_FORMATS)
-
-#define GST_GL_COLOR_CONVERT_VIDEO_OVERLAY_COMPOSITION_CAPS \
-    GST_VIDEO_CAPS_MAKE_WITH_FEATURES (GST_CAPS_FEATURE_MEMORY_GL_MEMORY \
-        "," GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION, \
-        GST_GL_COLOR_CONVERT_FORMATS)
+    "video/x-raw(" GST_CAPS_FEATURE_MEMORY_GL_MEMORY "), "              \
+    "format = (string) " GST_GL_COLOR_CONVERT_FORMATS ", "              \
+    "width = " GST_VIDEO_SIZE_RANGE ", "                                \
+    "height = " GST_VIDEO_SIZE_RANGE ", "                               \
+    "framerate = " GST_VIDEO_FPS_RANGE ", "                             \
+    "texture-target = (string) { 2D, rectangle, external-oes } "        \
+    " ; "                                                               \
+    "video/x-raw(" GST_CAPS_FEATURE_MEMORY_GL_MEMORY ","                \
+    GST_CAPS_FEATURE_META_GST_VIDEO_OVERLAY_COMPOSITION "), "           \
+    "format = (string) " GST_GL_COLOR_CONVERT_FORMATS ", "              \
+    "width = " GST_VIDEO_SIZE_RANGE ", "                                \
+    "height = " GST_VIDEO_SIZE_RANGE ", "                               \
+    "framerate = " GST_VIDEO_FPS_RANGE ", "                             \
+    "texture-target = (string) { 2D, rectangle, external-oes }"
 
 GstGLColorConvert * gst_gl_color_convert_new (GstGLContext * context);
 
@@ -109,6 +116,10 @@
                                                  GstPadDirection direction,
                                                  GstCaps * caps,
                                                  GstCaps * filter);
+GstCaps *   gst_gl_color_convert_fixate_caps    (GstGLContext * convert,
+                                                 GstPadDirection direction,
+                                                 GstCaps * caps,
+                                                 GstCaps * other);
 gboolean    gst_gl_color_convert_set_caps    (GstGLColorConvert * convert,
                                               GstCaps           * in_caps,
                                               GstCaps           * out_caps);
diff --git a/gst-libs/gst/gl/gstglcontext.c b/gst-libs/gst/gl/gstglcontext.c
index d177df8..f84e78b 100644
--- a/gst-libs/gst/gl/gstglcontext.c
+++ b/gst-libs/gst/gl/gstglcontext.c
@@ -41,6 +41,8 @@
 #endif
 
 #include <gmodule.h>
+#include <string.h>
+#include <stdio.h>
 
 #include "gl.h"
 #include "gstglcontext.h"
@@ -65,7 +67,10 @@
 #include "eagl/gstglcontext_eagl.h"
 #endif
 
-GST_DEBUG_CATEGORY_STATIC (gst_performance);
+extern void GSTGLAPI _gst_gl_debug_callback (GLenum source, GLenum type,
+    GLuint id, GLenum severity, GLsizei length, const gchar * message,
+    gpointer user_data);
+
 static GPrivate current_context_key;
 
 static GModule *module_self;
@@ -83,7 +88,7 @@
 #else
   /* On Linux the .so is only in -dev packages, try with a real soname
    * Proper compilers will optimize away the strcmp */
-  if (strcmp (G_MODULE_SUFFIX, "so") == 0)
+  if (g_strcmp0 (G_MODULE_SUFFIX, "so") == 0)
     module_opengl = g_module_open ("libGL.so.1", G_MODULE_BIND_LAZY);
 
   /* This automatically handles the suffix and even .la files */
@@ -108,7 +113,7 @@
 #else
   /* On Linux the .so is only in -dev packages, try with a real soname
    * Proper compilers will optimize away the strcmp */
-  if (strcmp (G_MODULE_SUFFIX, "so") == 0)
+  if (g_strcmp0 (G_MODULE_SUFFIX, "so") == 0)
     module_gles2 = g_module_open ("libGLESv2.so.2", G_MODULE_BIND_LAZY);
 
   /* This automatically handles the suffix and even .la files */
@@ -184,7 +189,6 @@
   /* conditions */
   GMutex render_lock;
   GCond create_cond;
-  GCond destroy_cond;
 
   gboolean created;
   gboolean alive;
@@ -220,8 +224,8 @@
 
 #define GST_GL_WRAPPED_CONTEXT(o)           (G_TYPE_CHECK_INSTANCE_CAST((o), GST_GL_TYPE_WRAPPED_CONTEXT, GstGLWrappedContext))
 #define GST_GL_WRAPPED_CONTEXT_CLASS(k)     (G_TYPE_CHECK_CLASS((k), GST_GL_TYPE_CONTEXT, GstGLContextClass))
-#define GST_GL_IS_WRAPPED_CONTEXT(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_WRAPPED_CONTEXT))
-#define GST_GL_IS_WRAPPED_CONTEXT_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_WRAPPED_CONTEXT))
+#define GST_IS_GL_WRAPPED_CONTEXT(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_WRAPPED_CONTEXT))
+#define GST_IS_GL_WRAPPED_CONTEXT_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_WRAPPED_CONTEXT))
 #define GST_GL_WRAPPED_CONTEXT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_GL_TYPE_WRAPPED_CONTEXT, GstGLWrappedContextClass))
 
 GQuark
@@ -256,7 +260,6 @@
   g_mutex_init (&context->priv->render_lock);
 
   g_cond_init (&context->priv->create_cond);
-  g_cond_init (&context->priv->destroy_cond);
   context->priv->created = FALSE;
 
   g_weak_ref_init (&context->priv->other_context_ref, NULL);
@@ -283,7 +286,6 @@
   if (g_once_init_enter (&_init)) {
     GST_DEBUG_CATEGORY_INIT (gst_gl_context_debug, "glcontext", 0,
         "glcontext element");
-    GST_DEBUG_CATEGORY_GET (gst_performance, "GST_PERFORMANCE");
     g_once_init_leave (&_init, 1);
   }
 }
@@ -310,7 +312,7 @@
   GST_INFO ("creating a context for display %" GST_PTR_FORMAT
       ", user choice:%s", display, user_choice);
 #if GST_GL_HAVE_PLATFORM_CGL
-  if (!context && (!user_choice || g_strstr_len (user_choice, 5, "cgl")))
+  if (!context && (!user_choice || g_strstr_len (user_choice, 3, "cgl")))
     context = GST_GL_CONTEXT (gst_gl_context_cocoa_new (display));
 #endif
 #if GST_GL_HAVE_PLATFORM_GLX
@@ -318,16 +320,15 @@
     context = GST_GL_CONTEXT (gst_gl_context_glx_new (display));
 #endif
 #if GST_GL_HAVE_PLATFORM_EGL
-  if (!context && (!user_choice || g_strstr_len (user_choice, 7, "egl")))
+  if (!context && (!user_choice || g_strstr_len (user_choice, 3, "egl")))
     context = GST_GL_CONTEXT (gst_gl_context_egl_new (display));
 #endif
 #if GST_GL_HAVE_PLATFORM_WGL
-  if (!context && (!user_choice || g_strstr_len (user_choice, 3, "wgl"))) {
+  if (!context && (!user_choice || g_strstr_len (user_choice, 3, "wgl")))
     context = GST_GL_CONTEXT (gst_gl_context_wgl_new (display));
-  }
 #endif
 #if GST_GL_HAVE_PLATFORM_EAGL
-  if (!context && (!user_choice || g_strstr_len (user_choice, 5, "eagl")))
+  if (!context && (!user_choice || g_strstr_len (user_choice, 4, "eagl")))
     context = GST_GL_CONTEXT (gst_gl_context_eagl_new (display));
 #endif
 
@@ -624,25 +625,16 @@
     gst_gl_window_set_draw_callback (context->window, NULL, NULL, NULL);
 
     if (context->priv->alive) {
-      g_mutex_lock (&context->priv->render_lock);
       GST_INFO_OBJECT (context, "send quit gl window loop");
       gst_gl_window_quit (context->window);
-      while (context->priv->alive) {
-        g_cond_wait (&context->priv->destroy_cond, &context->priv->render_lock);
-      }
-      g_mutex_unlock (&context->priv->render_lock);
-    }
 
-    gst_gl_window_set_close_callback (context->window, NULL, NULL, NULL);
-
-    if (context->priv->gl_thread) {
-      gpointer ret = g_thread_join (context->priv->gl_thread);
+      GST_INFO_OBJECT (context, "joining gl thread");
+      g_thread_join (context->priv->gl_thread);
       GST_INFO_OBJECT (context, "gl thread joined");
-      if (ret != NULL)
-        GST_ERROR_OBJECT (context, "gl thread returned a non-null pointer");
       context->priv->gl_thread = NULL;
     }
 
+    gst_gl_window_set_close_callback (context->window, NULL, NULL, NULL);
     gst_object_unref (context->window);
   }
 
@@ -655,7 +647,6 @@
 
   g_mutex_clear (&context->priv->render_lock);
 
-  g_cond_clear (&context->priv->destroy_cond);
   g_cond_clear (&context->priv->create_cond);
 
   g_free (context->priv->gl_exts);
@@ -685,7 +676,7 @@
   GstGLContextClass *context_class;
   gboolean result;
 
-  g_return_val_if_fail (GST_GL_IS_CONTEXT (context), FALSE);
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), FALSE);
   context_class = GST_GL_CONTEXT_GET_CLASS (context);
   g_return_val_if_fail (context_class->activate != NULL, FALSE);
 
@@ -746,7 +737,7 @@
 {
   GstGLContextClass *context_class;
 
-  g_return_val_if_fail (GST_GL_IS_CONTEXT (context), GST_GL_API_NONE);
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), GST_GL_API_NONE);
   context_class = GST_GL_CONTEXT_GET_CLASS (context);
   g_return_val_if_fail (context_class->get_gl_api != NULL, GST_GL_API_NONE);
 
@@ -775,7 +766,7 @@
   GstGLContextClass *context_class;
   GstGLAPI gl_api;
 
-  g_return_val_if_fail (GST_GL_IS_CONTEXT (context), NULL);
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), NULL);
   context_class = GST_GL_CONTEXT_GET_CLASS (context);
   g_return_val_if_fail (context_class->get_proc_address != NULL, NULL);
 
@@ -831,7 +822,7 @@
 gboolean
 gst_gl_context_set_window (GstGLContext * context, GstGLWindow * window)
 {
-  g_return_val_if_fail (!GST_GL_IS_WRAPPED_CONTEXT (context), FALSE);
+  g_return_val_if_fail (!GST_IS_GL_WRAPPED_CONTEXT (context), FALSE);
 
   GST_DEBUG_OBJECT (context, "window:%" GST_PTR_FORMAT, window);
 
@@ -865,9 +856,9 @@
 GstGLWindow *
 gst_gl_context_get_window (GstGLContext * context)
 {
-  g_return_val_if_fail (GST_GL_IS_CONTEXT (context), NULL);
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), NULL);
 
-  if (GST_GL_IS_WRAPPED_CONTEXT (context)) {
+  if (GST_IS_GL_WRAPPED_CONTEXT (context)) {
     GST_WARNING_OBJECT (context, "context is not toplevel, returning NULL");
     return NULL;
   }
@@ -892,8 +883,8 @@
 gboolean
 gst_gl_context_can_share (GstGLContext * context, GstGLContext * other_context)
 {
-  g_return_val_if_fail (GST_GL_IS_CONTEXT (context), FALSE);
-  g_return_val_if_fail (GST_GL_IS_CONTEXT (other_context), FALSE);
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), FALSE);
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (other_context), FALSE);
 
   /* check if the contexts are descendants or the root nodes are the same */
   return context->priv->sharegroup_id != 0
@@ -925,8 +916,8 @@
 {
   gboolean alive = FALSE;
 
-  g_return_val_if_fail (GST_GL_IS_CONTEXT (context), FALSE);
-  g_return_val_if_fail (!GST_GL_IS_WRAPPED_CONTEXT (context), FALSE);
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), FALSE);
+  g_return_val_if_fail (!GST_IS_GL_WRAPPED_CONTEXT (context), FALSE);
 
   GST_DEBUG_OBJECT (context, " other_context:%" GST_PTR_FORMAT, other_context);
 
@@ -945,9 +936,8 @@
     context->priv->gl_thread = g_thread_new ("gstglcontext",
         (GThreadFunc) gst_gl_context_create_thread, context);
 
-    g_cond_wait (&context->priv->create_cond, &context->priv->render_lock);
-
-    context->priv->created = TRUE;
+    while (!context->priv->created)
+      g_cond_wait (&context->priv->create_cond, &context->priv->render_lock);
 
     GST_INFO_OBJECT (context, "gl thread created");
   }
@@ -959,154 +949,6 @@
   return alive;
 }
 
-#ifndef GL_DEBUG_TYPE_ERROR
-#define GL_DEBUG_TYPE_ERROR 0x824C
-#endif
-#ifndef GL_DEBUG_TYPE_DEPRECATED_BEHAVIOUR
-#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOUR 0x824D
-#endif
-#ifndef GL_DEBUG_TYPE_UNDEFINED_BEHAVIOUR
-#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOUR 0x824E
-#endif
-#ifndef GL_DEBUG_TYPE_PORTABILITY
-#define GL_DEBUG_TYPE_PORTABILITY 0x824F
-#endif
-#ifndef GL_DEBUG_TYPE_PERFORMANCE
-#define GL_DEBUG_TYPE_PERFORMANCE 0x8250
-#endif
-#ifndef GL_DEBUG_TYPE_MARKER
-#define GL_DEBUG_TYPE_MARKER 0x8268
-#endif
-#ifndef GL_DEBUG_TYPE_OTHER
-#define GL_DEBUG_TYPE_OTHER 0x8251
-#endif
-
-#ifndef GL_DEBUG_SEVERITY_HIGH
-#define GL_DEBUG_SEVERITY_HIGH 0x9146
-#endif
-#ifndef GL_DEBUG_SEVERITY_MEDIUM
-#define GL_DEBUG_SEVERITY_MEDIUM 0x9147
-#endif
-#ifndef GL_DEBUG_SEVERITY_LOW
-#define GL_DEBUG_SEVERITY_LOW 0x9148
-#endif
-#ifndef GL_DEBUG_SEVERITY_NOTIFICATION
-#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B
-#endif
-
-#ifndef GL_DEBUG_SOURCE_API
-#define GL_DEBUG_SOURCE_API 0x8246
-#endif
-#ifndef GL_DEBUG_SOURCE_WINDOW_SYSTEM
-#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247
-#endif
-#ifndef GL_DEBUG_SOURCE_SHADER_COMPILER
-#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248
-#endif
-#ifndef GL_DEBUG_SOURCE_THIRD_PARTY
-#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249
-#endif
-#ifndef GL_DEBUG_SOURCE_APPLICATION
-#define GL_DEBUG_SOURCE_APPLICATION 0x824A
-#endif
-#ifndef GL_DEBUG_SOURCE_OTHER
-#define GL_DEBUG_SOURCE_OTHER 0x824B
-#endif
-
-#if !defined(GST_DISABLE_GST_DEBUG)
-static inline const gchar *
-_debug_severity_to_string (GLenum severity)
-{
-  switch (severity) {
-    case GL_DEBUG_SEVERITY_HIGH:
-      return "high";
-    case GL_DEBUG_SEVERITY_MEDIUM:
-      return "medium";
-    case GL_DEBUG_SEVERITY_LOW:
-      return "low";
-    case GL_DEBUG_SEVERITY_NOTIFICATION:
-      return "notification";
-    default:
-      return "invalid";
-  }
-}
-
-static inline const gchar *
-_debug_source_to_string (GLenum source)
-{
-  switch (source) {
-    case GL_DEBUG_SOURCE_API:
-      return "API";
-    case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
-      return "winsys";
-    case GL_DEBUG_SOURCE_SHADER_COMPILER:
-      return "shader compiler";
-    case GL_DEBUG_SOURCE_THIRD_PARTY:
-      return "third party";
-    case GL_DEBUG_SOURCE_APPLICATION:
-      return "application";
-    case GL_DEBUG_SOURCE_OTHER:
-      return "other";
-    default:
-      return "invalid";
-  }
-}
-
-static inline const gchar *
-_debug_type_to_string (GLenum type)
-{
-  switch (type) {
-    case GL_DEBUG_TYPE_ERROR:
-      return "error";
-    case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOUR:
-      return "deprecated";
-    case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOUR:
-      return "undefined";
-    case GL_DEBUG_TYPE_PORTABILITY:
-      return "portability";
-    case GL_DEBUG_TYPE_PERFORMANCE:
-      return "performance";
-    case GL_DEBUG_TYPE_MARKER:
-      return "debug marker";
-    case GL_DEBUG_TYPE_OTHER:
-      return "other";
-    default:
-      return "invalid";
-  }
-}
-
-static void GSTGLAPI
-_gst_gl_debug_callback (GLenum source, GLenum type, GLuint id, GLenum severity,
-    GLsizei length, const gchar * message, gpointer user_data)
-{
-  GstGLContext *context = user_data;
-  const gchar *severity_str = _debug_severity_to_string (severity);
-  const gchar *source_str = _debug_source_to_string (source);
-  const gchar *type_str = _debug_type_to_string (type);
-
-  switch (type) {
-    case GL_DEBUG_TYPE_ERROR:
-    case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOUR:
-      GST_ERROR_OBJECT (context, "%s: GL %s from %s id:%u, %s", severity_str,
-          type_str, source_str, id, message);
-      break;
-    case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOUR:
-    case GL_DEBUG_TYPE_PORTABILITY:
-      GST_FIXME_OBJECT (context, "%s: GL %s from %s id:%u, %s", severity_str,
-          type_str, source_str, id, message);
-      break;
-    case GL_DEBUG_TYPE_PERFORMANCE:
-      GST_CAT_DEBUG_OBJECT (gst_performance, context, "%s: GL %s from %s id:%u,"
-          " %s", severity_str, type_str, source_str, id, message);
-      break;
-    default:
-      GST_DEBUG_OBJECT (context, "%s: GL %s from %s id:%u, %s", severity_str,
-          type_str, source_str, id, message);
-      break;
-  }
-}
-#endif
-
 static gboolean
 _create_context_info (GstGLContext * context, GstGLAPI gl_api, gint * gl_major,
     gint * gl_minor, GError ** error)
@@ -1190,6 +1032,8 @@
 static void
 _unlock_create_thread (GstGLContext * context)
 {
+  context->priv->created = TRUE;
+  g_cond_signal (&context->priv->create_cond);
   g_mutex_unlock (&context->priv->render_lock);
 }
 
@@ -1360,9 +1204,8 @@
     gst_object_unref (other_context);
   }
 
-  g_cond_signal (&context->priv->create_cond);
-
-//  g_mutex_unlock (&context->priv->render_lock);
+  /* unlocking of the render_lock happens when the
+   * context's loop is running from inside that loop */
   gst_gl_window_send_message_async (context->window,
       (GstGLWindowCB) _unlock_create_thread, context, NULL);
 
@@ -1371,7 +1214,6 @@
   GST_INFO_OBJECT (context, "loop exited");
 
   g_mutex_lock (&context->priv->render_lock);
-
   context->priv->alive = FALSE;
 
   gst_gl_context_activate (context, FALSE);
@@ -1387,8 +1229,7 @@
     window_class->close (context->window);
   }
 
-  g_cond_signal (&context->priv->destroy_cond);
-
+  context->priv->created = FALSE;
   g_mutex_unlock (&context->priv->render_lock);
 
   return NULL;
@@ -1398,6 +1239,9 @@
     if (other_context)
       gst_object_unref (other_context);
 
+    /* A context that fails to be created is considered created but not alive
+     * and will never be able to be alive as creation can't happen */
+    context->priv->created = TRUE;
     g_cond_signal (&context->priv->create_cond);
     g_mutex_unlock (&context->priv->render_lock);
     return NULL;
@@ -1420,7 +1264,7 @@
 {
   GstGLContextClass *context_class;
 
-  g_return_if_fail (GST_GL_IS_CONTEXT (context));
+  g_return_if_fail (GST_IS_GL_CONTEXT (context));
   context_class = GST_GL_CONTEXT_GET_CLASS (context);
   g_return_if_fail (context_class->destroy_context != NULL);
 
@@ -1446,7 +1290,7 @@
   GstGLAPI gl_api;
   gboolean ret;
 
-  g_return_val_if_fail (GST_GL_IS_CONTEXT (context), FALSE);
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), FALSE);
   g_return_val_if_fail (context->priv->active_thread == g_thread_self (),
       FALSE);
 
@@ -1538,7 +1382,7 @@
   GstGLContextClass *context_class;
   guintptr result;
 
-  g_return_val_if_fail (GST_GL_IS_CONTEXT (context), 0);
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), 0);
   context_class = GST_GL_CONTEXT_GET_CLASS (context);
   g_return_val_if_fail (context_class->get_gl_context != NULL, 0);
 
@@ -1562,7 +1406,7 @@
 {
   GstGLContextClass *context_class;
 
-  g_return_val_if_fail (GST_GL_IS_CONTEXT (context), 0);
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), 0);
   context_class = GST_GL_CONTEXT_GET_CLASS (context);
   g_return_val_if_fail (context_class->get_gl_platform != NULL, 0);
 
@@ -1580,7 +1424,7 @@
 GstGLDisplay *
 gst_gl_context_get_display (GstGLContext * context)
 {
-  g_return_val_if_fail (GST_GL_IS_CONTEXT (context), NULL);
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), NULL);
 
   return gst_object_ref (context->display);
 }
@@ -1620,10 +1464,10 @@
   GstGLWindow *window;
   RunGenericData rdata;
 
-  g_return_if_fail (GST_GL_IS_CONTEXT (context));
+  g_return_if_fail (GST_IS_GL_CONTEXT (context));
   g_return_if_fail (func != NULL);
 
-  if (GST_GL_IS_WRAPPED_CONTEXT (context)) {
+  if (GST_IS_GL_WRAPPED_CONTEXT (context)) {
     g_return_if_fail (context->priv->active_thread == g_thread_self ());
     func (context, data);
     return;
@@ -1656,7 +1500,7 @@
 void
 gst_gl_context_get_gl_version (GstGLContext * context, gint * maj, gint * min)
 {
-  g_return_if_fail (GST_GL_IS_CONTEXT (context));
+  g_return_if_fail (GST_IS_GL_CONTEXT (context));
   g_return_if_fail (maj != NULL && min != NULL);
 
   if (maj)
@@ -1682,7 +1526,7 @@
 gst_gl_context_check_gl_version (GstGLContext * context, GstGLAPI api,
     gint maj, gint min)
 {
-  g_return_val_if_fail (GST_GL_IS_CONTEXT (context), FALSE);
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), FALSE);
 
   if (maj > context->priv->gl_major)
     return FALSE;
@@ -1716,7 +1560,7 @@
 {
   GstGLContextClass *context_class;
 
-  g_return_val_if_fail (GST_GL_IS_CONTEXT (context), FALSE);
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), FALSE);
   g_return_val_if_fail (feature != NULL, FALSE);
 
   context_class = GST_GL_CONTEXT_GET_CLASS (context);
diff --git a/gst-libs/gst/gl/gstglcontext.h b/gst-libs/gst/gl/gstglcontext.h
index 16b9d11..04cf3a5 100644
--- a/gst-libs/gst/gl/gstglcontext.h
+++ b/gst-libs/gst/gl/gstglcontext.h
@@ -30,8 +30,8 @@
 #define GST_GL_TYPE_CONTEXT         (gst_gl_context_get_type())
 #define GST_GL_CONTEXT(o)           (G_TYPE_CHECK_INSTANCE_CAST((o), GST_GL_TYPE_CONTEXT, GstGLContext))
 #define GST_GL_CONTEXT_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), GST_GL_TYPE_CONTEXT, GstGLContextClass))
-#define GST_GL_IS_CONTEXT(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_CONTEXT))
-#define GST_GL_IS_CONTEXT_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_CONTEXT))
+#define GST_IS_GL_CONTEXT(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_CONTEXT))
+#define GST_IS_GL_CONTEXT_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_CONTEXT))
 #define GST_GL_CONTEXT_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_GL_TYPE_CONTEXT, GstGLContextClass))
 GType gst_gl_context_get_type     (void);
 
diff --git a/gst-libs/gst/gl/gstgldebug.c b/gst-libs/gst/gl/gstgldebug.c
new file mode 100644
index 0000000..77bfcd8
--- /dev/null
+++ b/gst-libs/gst/gl/gstgldebug.c
@@ -0,0 +1,217 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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 "gl.h"
+#include "gstgldebug.h"
+#include <glib/gprintf.h>
+
+#ifndef GL_DEBUG_TYPE_ERROR
+#define GL_DEBUG_TYPE_ERROR 0x824C
+#endif
+#ifndef GL_DEBUG_TYPE_DEPRECATED_BEHAVIOUR
+#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOUR 0x824D
+#endif
+#ifndef GL_DEBUG_TYPE_UNDEFINED_BEHAVIOUR
+#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOUR 0x824E
+#endif
+#ifndef GL_DEBUG_TYPE_PORTABILITY
+#define GL_DEBUG_TYPE_PORTABILITY 0x824F
+#endif
+#ifndef GL_DEBUG_TYPE_PERFORMANCE
+#define GL_DEBUG_TYPE_PERFORMANCE 0x8250
+#endif
+#ifndef GL_DEBUG_TYPE_MARKER
+#define GL_DEBUG_TYPE_MARKER 0x8268
+#endif
+#ifndef GL_DEBUG_TYPE_OTHER
+#define GL_DEBUG_TYPE_OTHER 0x8251
+#endif
+
+#ifndef GL_DEBUG_SEVERITY_HIGH
+#define GL_DEBUG_SEVERITY_HIGH 0x9146
+#endif
+#ifndef GL_DEBUG_SEVERITY_MEDIUM
+#define GL_DEBUG_SEVERITY_MEDIUM 0x9147
+#endif
+#ifndef GL_DEBUG_SEVERITY_LOW
+#define GL_DEBUG_SEVERITY_LOW 0x9148
+#endif
+#ifndef GL_DEBUG_SEVERITY_NOTIFICATION
+#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B
+#endif
+
+#ifndef GL_DEBUG_SOURCE_API
+#define GL_DEBUG_SOURCE_API 0x8246
+#endif
+#ifndef GL_DEBUG_SOURCE_WINDOW_SYSTEM
+#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247
+#endif
+#ifndef GL_DEBUG_SOURCE_SHADER_COMPILER
+#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248
+#endif
+#ifndef GL_DEBUG_SOURCE_THIRD_PARTY
+#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249
+#endif
+#ifndef GL_DEBUG_SOURCE_APPLICATION
+#define GL_DEBUG_SOURCE_APPLICATION 0x824A
+#endif
+#ifndef GL_DEBUG_SOURCE_OTHER
+#define GL_DEBUG_SOURCE_OTHER 0x824B
+#endif
+
+#if !defined(GST_DISABLE_GST_DEBUG)
+GST_DEBUG_CATEGORY_STATIC (gst_performance);
+
+static void
+_init_debug (void)
+{
+  static volatile gsize _init = 0;
+
+  if (g_once_init_enter (&_init)) {
+    GST_DEBUG_CATEGORY_GET (gst_performance, "GST_PERFORMANCE");
+    g_once_init_leave (&_init, 1);
+  }
+}
+
+static inline const gchar *
+_debug_severity_to_string (GLenum severity)
+{
+  switch (severity) {
+    case GL_DEBUG_SEVERITY_HIGH:
+      return "high";
+    case GL_DEBUG_SEVERITY_MEDIUM:
+      return "medium";
+    case GL_DEBUG_SEVERITY_LOW:
+      return "low";
+    case GL_DEBUG_SEVERITY_NOTIFICATION:
+      return "notification";
+    default:
+      return "invalid";
+  }
+}
+
+static inline const gchar *
+_debug_source_to_string (GLenum source)
+{
+  switch (source) {
+    case GL_DEBUG_SOURCE_API:
+      return "API";
+    case GL_DEBUG_SOURCE_WINDOW_SYSTEM:
+      return "winsys";
+    case GL_DEBUG_SOURCE_SHADER_COMPILER:
+      return "shader compiler";
+    case GL_DEBUG_SOURCE_THIRD_PARTY:
+      return "third party";
+    case GL_DEBUG_SOURCE_APPLICATION:
+      return "application";
+    case GL_DEBUG_SOURCE_OTHER:
+      return "other";
+    default:
+      return "invalid";
+  }
+}
+
+static inline const gchar *
+_debug_type_to_string (GLenum type)
+{
+  switch (type) {
+    case GL_DEBUG_TYPE_ERROR:
+      return "error";
+    case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOUR:
+      return "deprecated";
+    case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOUR:
+      return "undefined";
+    case GL_DEBUG_TYPE_PORTABILITY:
+      return "portability";
+    case GL_DEBUG_TYPE_PERFORMANCE:
+      return "performance";
+    case GL_DEBUG_TYPE_MARKER:
+      return "debug marker";
+    case GL_DEBUG_TYPE_OTHER:
+      return "other";
+    default:
+      return "invalid";
+  }
+}
+
+/* silence the compiler... */
+void GSTGLAPI _gst_gl_debug_callback (GLenum source, GLenum type, GLuint id,
+    GLenum severity, GLsizei length, const gchar * message, gpointer user_data);
+
+void GSTGLAPI
+_gst_gl_debug_callback (GLenum source, GLenum type, GLuint id, GLenum severity,
+    GLsizei length, const gchar * message, gpointer user_data)
+{
+  GstGLContext *context = user_data;
+  const gchar *severity_str = _debug_severity_to_string (severity);
+  const gchar *source_str = _debug_source_to_string (source);
+  const gchar *type_str = _debug_type_to_string (type);
+
+  _init_debug ();
+
+  switch (type) {
+    case GL_DEBUG_TYPE_ERROR:
+    case GL_DEBUG_TYPE_UNDEFINED_BEHAVIOUR:
+      GST_ERROR_OBJECT (context, "%s: GL %s from %s id:%u, %s", severity_str,
+          type_str, source_str, id, message);
+      break;
+    case GL_DEBUG_TYPE_DEPRECATED_BEHAVIOUR:
+    case GL_DEBUG_TYPE_PORTABILITY:
+      GST_FIXME_OBJECT (context, "%s: GL %s from %s id:%u, %s", severity_str,
+          type_str, source_str, id, message);
+      break;
+    case GL_DEBUG_TYPE_PERFORMANCE:
+      GST_CAT_DEBUG_OBJECT (gst_performance, context, "%s: GL %s from %s id:%u,"
+          " %s", severity_str, type_str, source_str, id, message);
+      break;
+    default:
+      GST_DEBUG_OBJECT (context, "%s: GL %s from %s id:%u, %s", severity_str,
+          type_str, source_str, id, message);
+      break;
+  }
+}
+
+void
+gst_gl_insert_debug_marker (GstGLContext * context, const gchar * format, ...)
+{
+  const GstGLFuncs *gl = context->gl_vtable;
+  gchar *string;
+  gint len;
+  va_list args;
+
+  va_start (args, format);
+  len = g_vasprintf (&string, format, args);
+  va_end (args);
+
+  if (gl->DebugMessageInsert)
+    gl->DebugMessageInsert (GL_DEBUG_SOURCE_THIRD_PARTY, GL_DEBUG_TYPE_MARKER,
+        0, GL_DEBUG_SEVERITY_LOW, (gsize) len, string);
+  else if (gl->InsertEventMarker)
+    gl->InsertEventMarker (len, string);
+  else if (gl->StringMarker)
+    gl->StringMarker (len, string);
+
+  g_free (string);
+}
+#endif
diff --git a/gst-libs/gst/gl/gstgldebug.h b/gst-libs/gst/gl/gstgldebug.h
new file mode 100644
index 0000000..c277825
--- /dev/null
+++ b/gst-libs/gst/gl/gstgldebug.h
@@ -0,0 +1,48 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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_DEBUG_H__
+#define __GST_GL_DEBUG_H__
+
+#include <gst/gl/gl.h>
+
+G_BEGIN_DECLS
+
+#if !defined(GST_DISABLE_GST_DEBUG)
+void gst_gl_insert_debug_marker (GstGLContext * context,
+                                 const gchar * format, ...) G_GNUC_PRINTF (2, 3);
+#else /* GST_DISABLE_GST_DEBUG */
+#if G_HAVE_ISO_VARARGS
+#define gst_gl_insert_debug_marker(...) G_STMT_START{ }G_STMT_END
+#else /* G_HAVE_ISO_VARARGS */
+#if G_HAVE_GNUC_VARARGS
+#define gst_gl_insert_debug_marker(args...) G_STMT_START{ }G_STMT_END
+#else /* G_HAVE_GNUC_VARARGS */
+static inline void
+gst_gl_insert_debug_marker (GstGLContext * context, const gchar * format, ...)
+{
+}
+#endif /* G_HAVE_GNUC_VARARGS */
+#endif /* G_HAVE_ISO_VARARGS */
+#endif /* GST_DISABLE_GST_DEBUG */
+
+G_END_DECLS
+
+#endif /* __GST_GL_DEBUG_H__ */
diff --git a/gst-libs/gst/gl/gstgldisplay.c b/gst-libs/gst/gl/gstgldisplay.c
index 51c1df5..60dec6a 100644
--- a/gst-libs/gst/gl/gstgldisplay.c
+++ b/gst-libs/gst/gl/gstgldisplay.c
@@ -139,8 +139,8 @@
 
   GST_TRACE ("init %p", display);
 
-  gst_gl_base_buffer_init_once ();
-  gst_gl_memory_init ();
+  gst_gl_buffer_init_once ();
+  gst_gl_memory_pbo_init_once ();
 
 #if GST_GL_HAVE_PLATFORM_EGL
   gst_egl_image_memory_init ();
@@ -533,7 +533,7 @@
   GWeakRef *ref;
 
   g_return_val_if_fail (GST_IS_GL_DISPLAY (display), FALSE);
-  g_return_val_if_fail (GST_GL_IS_CONTEXT (context), FALSE);
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), FALSE);
 
   context_display = gst_gl_context_get_display (context);
   g_assert (context_display == display);
diff --git a/gst-libs/gst/gl/gstgldownload.c b/gst-libs/gst/gl/gstgldownload.c
deleted file mode 100644
index 8f045c7..0000000
--- a/gst-libs/gst/gl/gstgldownload.c
+++ /dev/null
@@ -1,504 +0,0 @@
-/*
- * GStreamer
- * Copyright (C) 2012 Matthew Waters <ystree00@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 <stdio.h>
-
-#include "gl.h"
-#include "gstgldownload.h"
-
-/**
- * SECTION:gstgldownload
- * @short_description: an object that downloads GL textures
- * @see_also: #GstGLUpload, #GstGLMemory
- *
- * #GstGLDownload is an object that downloads GL textures into system memory.
- *
- * A #GstGLDownload can be created with gst_gl_download_new()
- */
-
-#define USING_OPENGL(context) (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL, 1, 0))
-#define USING_OPENGL3(context) (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL3, 3, 1))
-#define USING_GLES(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES, 1, 0))
-#define USING_GLES2(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 2, 0))
-#define USING_GLES3(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 3, 0))
-
-static gboolean _do_download (GstGLDownload * download, GstBuffer * inbuf);
-static gboolean _init_download (GstGLDownload * download);
-static gboolean _gst_gl_download_perform_with_data_unlocked (GstGLDownload *
-    download, GLuint texture_id, GLuint texture_target,
-    gpointer data[GST_VIDEO_MAX_PLANES]);
-static void gst_gl_download_reset (GstGLDownload * download);
-
-/* *INDENT-ON* */
-/* Define the maximum number of planes we can handle - max 2 views per buffer */
-#define GST_GL_DOWNLOAD_MAX_VIEWS 2
-#define GST_GL_DOWNLOAD_MAX_PLANES (GST_VIDEO_MAX_PLANES * GST_GL_DOWNLOAD_MAX_VIEWS)
-
-struct _GstGLDownloadPrivate
-{
-  const gchar *YUY2_UYVY;
-  const gchar *I420_YV12;
-  const gchar *AYUV;
-  const gchar *ARGB;
-  const gchar *vert_shader;
-
-  GstBuffer *inbuf;
-  /* Temporary wrapped texture for perform_with_data download */
-  GstGLMemory *in_tex;
-
-  /* Output data planes */
-  gpointer out_data[GST_GL_DOWNLOAD_MAX_PLANES];
-};
-
-GST_DEBUG_CATEGORY_STATIC (gst_gl_download_debug);
-#define GST_CAT_DEFAULT gst_gl_download_debug
-
-#define DEBUG_INIT \
-  GST_DEBUG_CATEGORY_INIT (gst_gl_download_debug, "gldownload", 0, "download");
-
-G_DEFINE_TYPE_WITH_CODE (GstGLDownload, gst_gl_download, GST_TYPE_OBJECT,
-    DEBUG_INIT);
-static void gst_gl_download_finalize (GObject * object);
-
-#define GST_GL_DOWNLOAD_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
-    GST_TYPE_GL_DOWNLOAD, GstGLDownloadPrivate))
-
-static void
-gst_gl_download_class_init (GstGLDownloadClass * klass)
-{
-  g_type_class_add_private (klass, sizeof (GstGLDownloadPrivate));
-
-  G_OBJECT_CLASS (klass)->finalize = gst_gl_download_finalize;
-}
-
-static void
-gst_gl_download_init (GstGLDownload * download)
-{
-
-  download->priv = GST_GL_DOWNLOAD_GET_PRIVATE (download);
-
-  gst_video_info_init (&download->info);
-}
-
-/**
- * gst_gl_download_new:
- * @context: a #GstGLContext
- *
- * Returns: a new #GstGLDownload object
- */
-GstGLDownload *
-gst_gl_download_new (GstGLContext * context)
-{
-  GstGLDownload *download;
-
-  download = g_object_new (GST_TYPE_GL_DOWNLOAD, NULL);
-
-  download->context = gst_object_ref (context);
-  download->convert = gst_gl_color_convert_new (context);
-
-  return download;
-}
-
-static void
-gst_gl_download_finalize (GObject * object)
-{
-  GstGLDownload *download;
-
-  download = GST_GL_DOWNLOAD (object);
-
-  gst_gl_download_reset (download);
-
-  if (download->convert) {
-    gst_object_unref (download->convert);
-    download->convert = NULL;
-  }
-
-  if (download->context) {
-    gst_object_unref (download->context);
-    download->context = NULL;
-  }
-
-  G_OBJECT_CLASS (gst_gl_download_parent_class)->finalize (object);
-}
-
-static void
-gst_gl_download_reset (GstGLDownload * download)
-{
-  if (download->priv->in_tex) {
-    gst_memory_unref ((GstMemory *) download->priv->in_tex);
-    download->priv->in_tex = NULL;
-  }
-}
-
-/**
- * gst_gl_download_set_format:
- * @download: a #GstGLDownload
- * @out_info: a #GstVideoInfo
- *
- * Initializes @download with the information required for download.
- */
-void
-gst_gl_download_set_format (GstGLDownload * download, GstVideoInfo * out_info)
-{
-  g_return_if_fail (download != NULL);
-  g_return_if_fail (GST_VIDEO_INFO_FORMAT (out_info) !=
-      GST_VIDEO_FORMAT_UNKNOWN);
-  g_return_if_fail (GST_VIDEO_INFO_FORMAT (out_info) !=
-      GST_VIDEO_FORMAT_ENCODED);
-
-  GST_OBJECT_LOCK (download);
-
-  if (gst_video_info_is_equal (&download->info, out_info)) {
-    GST_OBJECT_UNLOCK (download);
-    return;
-  }
-
-  gst_gl_download_reset (download);
-  download->initted = FALSE;
-  download->info = *out_info;
-
-  GST_OBJECT_UNLOCK (download);
-}
-
-static GstCaps *
-_set_caps_features (const GstCaps * caps, const gchar * feature_name)
-{
-  GstCaps *tmp = gst_caps_copy (caps);
-  guint n = gst_caps_get_size (tmp);
-  guint i = 0;
-
-  for (i = 0; i < n; i++) {
-    GstCapsFeatures *features;
-
-    features = gst_caps_features_new (feature_name, NULL);
-    gst_caps_set_features (tmp, i, features);
-  }
-
-  return tmp;
-}
-
-GstCaps *
-gst_gl_download_transform_caps (GstGLContext * context,
-    GstPadDirection direction, GstCaps * caps, GstCaps * filter)
-{
-  GstCaps *gl_templ, *templ, *result, *tmp;
-
-  templ =
-      gst_caps_from_string (GST_VIDEO_CAPS_MAKE (GST_GL_COLOR_CONVERT_FORMATS));
-  gl_templ =
-      gst_caps_from_string (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
-      (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, GST_GL_COLOR_CONVERT_FORMATS));
-
-  if (direction == GST_PAD_SRC) {
-    tmp = gst_caps_intersect_full (caps, templ, GST_CAPS_INTERSECT_FIRST);
-    result = _set_caps_features (tmp, GST_CAPS_FEATURE_MEMORY_GL_MEMORY);
-    gst_caps_unref (tmp);
-    tmp = result;
-  } else {
-    tmp = gst_caps_ref (caps);
-  }
-
-  result =
-      gst_gl_color_convert_transform_caps (context, direction, tmp, filter);
-  gst_caps_unref (tmp);
-  tmp = result;
-
-  if (direction == GST_PAD_SINK) {
-    result = _set_caps_features (tmp, GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY);
-    gst_caps_unref (tmp);
-    tmp = result;
-    result = gst_caps_intersect_full (tmp, templ, GST_CAPS_INTERSECT_FIRST);
-    gst_caps_unref (tmp);
-    tmp = result;
-  }
-
-  if (filter) {
-    result = gst_caps_intersect_full (filter, tmp, GST_CAPS_INTERSECT_FIRST);
-    gst_caps_unref (tmp);
-  } else {
-    result = tmp;
-  }
-  gst_caps_unref (templ);
-  gst_caps_unref (gl_templ);
-
-  return result;
-}
-
-/**
- * gst_gl_download_perform_with_data:
- * @download: a #GstGLDownload
- * @texture_id: the texture id to download
- * @texture_target: the GL texture target
- * @data: (out): where the downloaded data should go
- *
- * Downloads @texture_id into @data. @data size and format is specified by
- * the #GstVideoFormat passed to gst_gl_download_set_format()
- *
- * This method can only be used for download a single view.
- *
- * Returns: whether the download was successful
- */
-gboolean
-gst_gl_download_perform_with_data (GstGLDownload * download,
-    GLuint texture_id, GLuint texture_target,
-    gpointer data[GST_VIDEO_MAX_PLANES])
-{
-  gboolean ret;
-
-  g_return_val_if_fail (download != NULL, FALSE);
-
-  GST_OBJECT_LOCK (download);
-  ret =
-      _gst_gl_download_perform_with_data_unlocked (download,
-      texture_id, texture_target, data);
-  GST_OBJECT_UNLOCK (download);
-
-  return ret;
-}
-
-/* This method only supports one input texture */
-static gboolean
-_gst_gl_download_perform_with_data_unlocked (GstGLDownload * download,
-    GLuint texture_id, GLuint texture_target,
-    gpointer data[GST_VIDEO_MAX_PLANES])
-{
-  guint i;
-  gboolean res;
-  GstBuffer *inbuf;
-  guint out_width, out_height;
-
-  g_return_val_if_fail (download != NULL, FALSE);
-  g_return_val_if_fail (texture_id > 0, FALSE);
-  g_return_val_if_fail (GST_VIDEO_INFO_FORMAT (&download->info) !=
-      GST_VIDEO_FORMAT_UNKNOWN
-      && GST_VIDEO_INFO_FORMAT (&download->info) != GST_VIDEO_FORMAT_ENCODED,
-      FALSE);
-
-  for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&download->info); i++) {
-    g_return_val_if_fail (data[i] != NULL, FALSE);
-  }
-
-  if (!download->priv->in_tex) {
-    GstVideoInfo temp_info;
-
-    gst_video_info_set_format (&temp_info, GST_VIDEO_FORMAT_RGBA,
-        GST_VIDEO_INFO_WIDTH (&download->info),
-        GST_VIDEO_INFO_HEIGHT (&download->info));
-
-    download->priv->in_tex =
-        gst_gl_memory_wrapped_texture (download->context,
-        texture_id, texture_target, &temp_info, 0, NULL, NULL, NULL);
-  }
-
-
-  out_width = GST_VIDEO_INFO_WIDTH (&download->info);
-  out_height = GST_VIDEO_INFO_HEIGHT (&download->info);
-
-  GST_TRACE ("doing download of texture:%u (%ux%u)",
-      download->priv->in_tex->tex_id, out_width, out_height);
-
-  download->priv->in_tex->tex_id = texture_id;
-
-  inbuf = gst_buffer_new ();
-  gst_buffer_append_memory (inbuf,
-      gst_memory_ref ((GstMemory *) download->priv->in_tex));
-
-  for (i = 0; i < GST_VIDEO_MAX_PLANES; i++)
-    download->priv->out_data[i] = data[i];
-  /* Clear remaining planes for safety */
-  while (i < GST_GL_DOWNLOAD_MAX_PLANES)
-    download->priv->out_data[i++] = NULL;
-
-  res = _do_download (download, inbuf);
-
-  download->priv->inbuf = NULL;
-  gst_buffer_unref (inbuf);
-
-  return res;
-}
-
-static gboolean
-_init_download (GstGLDownload * download)
-{
-  GstVideoFormat v_format;
-  GstCaps *in_caps, *out_caps;
-  GstCapsFeatures *out_gl_features;
-  gboolean res;
-
-  v_format = GST_VIDEO_INFO_FORMAT (&download->info);
-
-  if (download->initted)
-    return TRUE;
-
-  GST_TRACE ("initializing texture download for format %s",
-      gst_video_format_to_string (v_format));
-
-  if (USING_GLES2 (download->context) && !USING_GLES3 (download->context)) {
-    /* GL_RGBA is the only officially supported texture format in GLES2 */
-    if (v_format == GST_VIDEO_FORMAT_RGB || v_format == GST_VIDEO_FORMAT_BGR) {
-      gst_gl_context_set_error (download->context, "Cannot download RGB "
-          "textures in GLES2");
-      return FALSE;
-    }
-  }
-
-  out_gl_features =
-      gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_GL_MEMORY);
-  out_caps = gst_video_info_to_caps (&download->info);
-  gst_caps_set_features (out_caps, 0, out_gl_features);
-
-  in_caps = gst_caps_copy (out_caps);
-  gst_caps_set_simple (in_caps, "format", G_TYPE_STRING, "RGBA", NULL);
-
-  res = gst_gl_color_convert_set_caps (download->convert, in_caps, out_caps);
-
-  gst_caps_unref (in_caps);
-  gst_caps_unref (out_caps);
-
-  return res;
-}
-
-static gboolean
-_do_download (GstGLDownload * download, GstBuffer * inbuf)
-{
-  GstBuffer *outbuf;
-  GstMapInfo map_info;
-  gboolean ret = TRUE;
-  gint i;
-  GstVideoInfo *info;
-  guint views, out_planes;
-  gpointer *data = download->priv->out_data;
-
-  if (!download->initted) {
-    if (!_init_download (download)) {
-      GST_DEBUG_OBJECT (download, "Failed to initialise");
-      return FALSE;
-    }
-  }
-
-  outbuf = gst_gl_color_convert_perform (download->convert, inbuf);
-  if (!outbuf) {
-    GST_DEBUG_OBJECT (download, "Failed to colour convert for output");
-    return FALSE;
-  }
-
-  info = &download->info;
-  if (GST_VIDEO_INFO_MULTIVIEW_MODE (info) ==
-      GST_VIDEO_MULTIVIEW_MODE_SEPARATED)
-    views = GST_VIDEO_INFO_VIEWS (info);
-  else
-    views = 1;
-  out_planes = GST_VIDEO_INFO_N_PLANES (info) * views;
-
-  for (i = 0; i < out_planes; i++) {
-    GstMemory *out_mem = gst_buffer_peek_memory (outbuf, i);
-    gpointer temp_data = ((GstGLBaseBuffer *) out_mem)->data;
-    ((GstGLBaseBuffer *) out_mem)->data = data[i];
-
-    if (!gst_memory_map (out_mem, &map_info, GST_MAP_READ)) {
-      GST_ERROR_OBJECT (download, "Failed to map memory");
-      ret = FALSE;
-    }
-    gst_memory_unmap (out_mem, &map_info);
-    ((GstGLBaseBuffer *) out_mem)->data = temp_data;
-    GST_MINI_OBJECT_FLAG_SET (out_mem, GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD);
-  }
-
-  gst_buffer_unref (outbuf);
-
-  return ret;
-}
-
-static gboolean
-_gst_gl_download_perform_unlocked (GstGLDownload * download,
-    GstBuffer * inbuf, GstBuffer * outbuf)
-{
-  guint i;
-  gboolean res = FALSE;
-  guint out_width, out_height;
-  GstVideoFrame out_frame;
-
-  g_return_val_if_fail (download != NULL, FALSE);
-  g_return_val_if_fail (GST_VIDEO_INFO_FORMAT (&download->info) !=
-      GST_VIDEO_FORMAT_UNKNOWN
-      && GST_VIDEO_INFO_FORMAT (&download->info) != GST_VIDEO_FORMAT_ENCODED,
-      FALSE);
-
-  out_width = GST_VIDEO_INFO_WIDTH (&download->info);
-  out_height = GST_VIDEO_INFO_HEIGHT (&download->info);
-
-  GST_TRACE_OBJECT (download, "doing download of buffer %" GST_PTR_FORMAT
-      " (%ux%u)", inbuf, out_width, out_height);
-
-  /* FIXME: Map multiple views */
-  if (!gst_video_frame_map (&out_frame, &download->info, outbuf, GST_MAP_WRITE))
-    return FALSE;
-
-  for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&download->info); i++) {
-    if (out_frame.data[i] == NULL)
-      goto fail;
-    download->priv->out_data[i] = out_frame.data[i];
-  }
-  while (i < GST_GL_DOWNLOAD_MAX_PLANES)
-    download->priv->out_data[i++] = NULL;
-
-  res = _do_download (download, inbuf);
-
-fail:
-  gst_video_frame_unmap (&out_frame);
-  download->priv->inbuf = NULL;
-
-  return res;
-}
-
-/**
- * gst_gl_download_perform:
- * @download: a #GstGLDownload
- * @inbuf: (transfer none): a #GstBuffer input buffer
- * @outbuf: (transfer none) (out): a #GstBuffer output buffer
- *
- * Downloads the contents of @inbuf into @outbuf.
- *
- * The output buffer contents must match the #GstVideoFormat passed
- * to gst_gl_download_set_format(), and the input buffer must
- * contain #GstGLMemory memory items.
- *
- * This method supports downloading multiple views.
- *
- * Returns: whether the download was successful
- */
-gboolean
-gst_gl_download_perform (GstGLDownload * download,
-    GstBuffer * inbuf, GstBuffer * outbuf)
-{
-  gboolean ret;
-
-  g_return_val_if_fail (download != NULL, FALSE);
-
-  GST_OBJECT_LOCK (download);
-  ret = _gst_gl_download_perform_unlocked (download, inbuf, outbuf);
-  GST_OBJECT_UNLOCK (download);
-
-  return ret;
-}
diff --git a/gst-libs/gst/gl/gstgldownload.h b/gst-libs/gst/gl/gstgldownload.h
deleted file mode 100644
index d476854..0000000
--- a/gst-libs/gst/gl/gstgldownload.h
+++ /dev/null
@@ -1,89 +0,0 @@
-/*
- * GStreamer
- * Copyright (C) 2012 Matthew Waters <ystree00@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_DOWNLOAD_H__
-#define __GST_GL_DOWNLOAD_H__
-
-#include <gst/video/video.h>
-#include <gst/gstmemory.h>
-
-#include <gst/gl/gl.h>
-
-G_BEGIN_DECLS
-
-GType gst_gl_download_get_type (void);
-#define GST_TYPE_GL_DOWNLOAD (gst_gl_download_get_type())
-#define GST_GL_DOWNLOAD(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GL_DOWNLOAD,GstGLDownload))
-#define GST_GL_DOWNLOAD_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GL_DISPLAY,GstGLDownloadClass))
-#define GST_IS_GL_DOWNLOAD(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GL_DOWNLOAD))
-#define GST_IS_GL_DOWNLOAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GL_DOWNLOAD))
-#define GST_GL_DOWNLOAD_CAST(obj) ((GstGLDownload*)(obj))
-
-/**
- * GstGLDownload:
- *
- * Opaque #GstGLDownload object
- */
-struct _GstGLDownload
-{
-  /* <private> */
-  GstObject        parent;
-
-  GstGLContext     *context;
-  GstGLColorConvert *convert;
-
-  /* output data */
-  GstVideoInfo     info;
-
-  gboolean         initted;
-
-  GstGLDownloadPrivate *priv;
-
-  gpointer _reserved[GST_PADDING];
-};
-
-/**
- * GstGLDownloadClass:
- *
- * The #GstGLDownloadClass struct only contains private data
- */
-struct _GstGLDownloadClass
-{
-  /* <private> */
-  GstObjectClass object_class;
-};
-
-GstGLDownload * gst_gl_download_new          (GstGLContext * context);
-
-void gst_gl_download_set_format                (GstGLDownload * download, GstVideoInfo * out_info);
-GstCaps * gst_gl_download_transform_caps       (GstGLContext * convert,
-                                                GstPadDirection direction,
-                                                GstCaps * caps,
-                                                GstCaps * filter);
-
-gboolean gst_gl_download_perform_with_data          (GstGLDownload * download,
-                                                     GLuint texture_id, GLuint texture_target,
-                                                     gpointer data[GST_VIDEO_MAX_PLANES]);
-gboolean gst_gl_download_perform (GstGLDownload * download,
-                                  GstBuffer *inbuf, GstBuffer *outbuf);
-
-G_END_DECLS
-
-#endif /* __GST_GL_DOWNLOAD_H__ */
diff --git a/gst-libs/gst/gl/gstglfeature.c b/gst-libs/gst/gl/gstglfeature.c
index 4a5d876..862fadc 100644
--- a/gst-libs/gst/gl/gstglfeature.c
+++ b/gst-libs/gst/gl/gstglfeature.c
@@ -189,8 +189,7 @@
   for (func_num = 0; data->functions[func_num].name; func_num++) {
     void *func;
 
-    if (full_function_name)
-      g_free (full_function_name);
+    g_free (full_function_name);
 
     full_function_name = g_strconcat ("gl", data->functions[func_num].name,
         suffix, NULL);
diff --git a/gst-libs/gst/gl/gstglfilter.c b/gst-libs/gst/gl/gstglfilter.c
index 78bcbc9..ab96766 100644
--- a/gst-libs/gst/gl/gstglfilter.c
+++ b/gst-libs/gst/gl/gstglfilter.c
@@ -35,24 +35,31 @@
 #define GST_CAT_DEFAULT gst_gl_filter_debug
 GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
 
-
+/* *INDENT-OFF* */
 static GstStaticPadTemplate gst_gl_filter_src_pad_template =
 GST_STATIC_PAD_TEMPLATE ("src",
     GST_PAD_SRC,
     GST_PAD_ALWAYS,
-    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
-        (GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
-            "RGBA"))
-    );
+    GST_STATIC_CAPS ("video/x-raw(" GST_CAPS_FEATURE_MEMORY_GL_MEMORY "), "
+      "format = (string) RGBA, "
+      "width = " GST_VIDEO_SIZE_RANGE ", "
+      "height = " GST_VIDEO_SIZE_RANGE ", "
+      "framerate = " GST_VIDEO_FPS_RANGE ","
+      "texture-target = (string) 2D"
+    ));
 
 static GstStaticPadTemplate gst_gl_filter_sink_pad_template =
 GST_STATIC_PAD_TEMPLATE ("sink",
     GST_PAD_SINK,
     GST_PAD_ALWAYS,
-    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
-        (GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
-            "RGBA"))
-    );
+    GST_STATIC_CAPS ("video/x-raw(" GST_CAPS_FEATURE_MEMORY_GL_MEMORY "), "
+      "format = (string) RGBA, "
+      "width = " GST_VIDEO_SIZE_RANGE ", "
+      "height = " GST_VIDEO_SIZE_RANGE ", "
+      "framerate = " GST_VIDEO_FPS_RANGE ","
+      "texture-target = (string) 2D"
+    ));
+/* *INDENT-ON* */
 
 /* Properties */
 enum
@@ -914,6 +921,8 @@
   if (in_sync_meta)
     gst_gl_sync_meta_wait (in_sync_meta, context);
 
+  gst_gl_insert_debug_marker (context,
+      "processing in element %s", GST_OBJECT_NAME (filter));
   if (filter_class->filter)
     ret = filter_class->filter (filter, inbuf, outbuf);
   else
diff --git a/gst-libs/gst/gl/gstglformat.c b/gst-libs/gst/gl/gstglformat.c
new file mode 100644
index 0000000..e8e5e46
--- /dev/null
+++ b/gst-libs/gst/gl/gstglformat.c
@@ -0,0 +1,365 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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/gstglformat.h>
+#include <gst/gl/gstglcontext.h>
+
+#define USING_OPENGL(context) (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL, 1, 0))
+#define USING_OPENGL3(context) (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL3, 3, 1))
+#define USING_GLES(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES, 1, 0))
+#define USING_GLES2(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 2, 0))
+#define USING_GLES3(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 3, 0))
+
+#ifndef GL_RGBA8
+#define GL_RGBA8 0x8058
+#endif
+#ifndef GL_RED
+#define GL_RED 0x1903
+#endif
+#ifndef GL_RG
+#define GL_RG 0x8227
+#endif
+#ifndef GL_R8
+#define GL_R8 0x8229
+#endif
+#ifndef GL_RG8
+#define GL_RG8 0x822B
+#endif
+
+#ifndef GL_TEXTURE_RECTANGLE
+#define GL_TEXTURE_RECTANGLE 0x84F5
+#endif
+#ifndef GL_TEXTURE_EXTERNAL_OES
+#define GL_TEXTURE_EXTERNAL_OES 0x8D65
+#endif
+
+static inline guint
+_gl_format_n_components (guint format)
+{
+  switch (format) {
+    case GST_VIDEO_GL_TEXTURE_TYPE_RGBA:
+    case GL_RGBA:
+      return 4;
+    case GST_VIDEO_GL_TEXTURE_TYPE_RGB:
+    case GST_VIDEO_GL_TEXTURE_TYPE_RGB16:
+    case GL_RGB:
+      return 3;
+    case GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA:
+    case GST_VIDEO_GL_TEXTURE_TYPE_RG:
+    case GL_LUMINANCE_ALPHA:
+    case GL_RG:
+      return 2;
+    case GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE:
+    case GST_VIDEO_GL_TEXTURE_TYPE_R:
+    case GL_LUMINANCE:
+    case GL_RED:
+      return 1;
+    default:
+      return 0;
+  }
+}
+
+static inline guint
+_gl_type_n_components (guint type)
+{
+  switch (type) {
+    case GL_UNSIGNED_BYTE:
+      return 1;
+    case GL_UNSIGNED_SHORT_5_6_5:
+      return 3;
+    default:
+      g_assert_not_reached ();
+      return 0;
+  }
+}
+
+static inline guint
+_gl_type_n_bytes (guint type)
+{
+  switch (type) {
+    case GL_UNSIGNED_BYTE:
+      return 1;
+    case GL_UNSIGNED_SHORT_5_6_5:
+      return 2;
+    default:
+      g_assert_not_reached ();
+      return 0;
+  }
+}
+
+guint
+gst_gl_format_type_n_bytes (guint format, guint type)
+{
+  return _gl_format_n_components (format) / _gl_type_n_components (type) *
+      _gl_type_n_bytes (type);
+}
+
+guint
+gst_gl_texture_type_n_bytes (GstVideoGLTextureType tex_format)
+{
+  guint format, type;
+
+  format = gst_gl_format_from_gl_texture_type (tex_format);
+  type = GL_UNSIGNED_BYTE;
+  if (tex_format == GST_VIDEO_GL_TEXTURE_TYPE_RGB16)
+    type = GL_UNSIGNED_SHORT_5_6_5;
+
+  return gst_gl_format_type_n_bytes (format, type);
+}
+
+guint
+gst_gl_format_from_gl_texture_type (GstVideoGLTextureType tex_format)
+{
+  switch (tex_format) {
+    case GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA:
+      return GL_LUMINANCE_ALPHA;
+    case GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE:
+      return GL_LUMINANCE;
+    case GST_VIDEO_GL_TEXTURE_TYPE_RGBA:
+      return GL_RGBA;
+    case GST_VIDEO_GL_TEXTURE_TYPE_RGB:
+    case GST_VIDEO_GL_TEXTURE_TYPE_RGB16:
+      return GL_RGB;
+    case GST_VIDEO_GL_TEXTURE_TYPE_RG:
+      return GL_RG;
+    case GST_VIDEO_GL_TEXTURE_TYPE_R:
+      return GL_RED;
+    default:
+      return GST_VIDEO_GL_TEXTURE_TYPE_RGBA;
+  }
+}
+
+GstVideoGLTextureType
+gst_gl_texture_type_from_format (GstGLContext * context,
+    GstVideoFormat v_format, guint plane)
+{
+  gboolean texture_rg =
+      gst_gl_context_check_feature (context, "GL_EXT_texture_rg")
+      || gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 3, 0)
+      || gst_gl_context_check_feature (context, "GL_ARB_texture_rg")
+      || gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL3, 3, 0);
+  guint n_plane_components;
+
+  switch (v_format) {
+    case GST_VIDEO_FORMAT_RGBx:
+    case GST_VIDEO_FORMAT_BGRx:
+    case GST_VIDEO_FORMAT_xRGB:
+    case GST_VIDEO_FORMAT_xBGR:
+    case GST_VIDEO_FORMAT_RGBA:
+    case GST_VIDEO_FORMAT_BGRA:
+    case GST_VIDEO_FORMAT_ARGB:
+    case GST_VIDEO_FORMAT_ABGR:
+    case GST_VIDEO_FORMAT_AYUV:
+      n_plane_components = 4;
+      break;
+    case GST_VIDEO_FORMAT_RGB:
+    case GST_VIDEO_FORMAT_BGR:
+      n_plane_components = 3;
+      break;
+    case GST_VIDEO_FORMAT_RGB16:
+    case GST_VIDEO_FORMAT_BGR16:
+      return GST_VIDEO_GL_TEXTURE_TYPE_RGB16;
+    case GST_VIDEO_FORMAT_GRAY16_BE:
+    case GST_VIDEO_FORMAT_GRAY16_LE:
+    case GST_VIDEO_FORMAT_YUY2:
+    case GST_VIDEO_FORMAT_UYVY:
+      n_plane_components = 2;
+      break;
+    case GST_VIDEO_FORMAT_NV12:
+    case GST_VIDEO_FORMAT_NV21:
+      n_plane_components = plane == 0 ? 1 : 2;
+      break;
+    case GST_VIDEO_FORMAT_GRAY8:
+    case GST_VIDEO_FORMAT_Y444:
+    case GST_VIDEO_FORMAT_Y42B:
+    case GST_VIDEO_FORMAT_Y41B:
+    case GST_VIDEO_FORMAT_I420:
+    case GST_VIDEO_FORMAT_YV12:
+      n_plane_components = 1;
+      break;
+    default:
+      n_plane_components = 4;
+      g_assert_not_reached ();
+      break;
+  }
+
+  switch (n_plane_components) {
+    case 4:
+      return GST_VIDEO_GL_TEXTURE_TYPE_RGBA;
+      break;
+    case 3:
+      return GST_VIDEO_GL_TEXTURE_TYPE_RGB;
+      break;
+    case 2:
+      return texture_rg ? GST_VIDEO_GL_TEXTURE_TYPE_RG :
+          GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA;
+      break;
+    case 1:
+      return texture_rg ? GST_VIDEO_GL_TEXTURE_TYPE_R :
+          GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE;
+      break;
+    default:
+      g_assert_not_reached ();
+      break;
+  }
+
+  return GST_VIDEO_GL_TEXTURE_TYPE_RGBA;
+}
+
+guint
+gst_gl_sized_gl_format_from_gl_format_type (GstGLContext * context,
+    guint format, guint type)
+{
+  gboolean ext_texture_rg =
+      gst_gl_context_check_feature (context, "GL_EXT_texture_rg");
+
+  switch (format) {
+    case GL_RGBA:
+      switch (type) {
+        case GL_UNSIGNED_BYTE:
+          return USING_GLES2 (context)
+              && !USING_GLES3 (context) ? GL_RGBA : GL_RGBA8;
+          break;
+      }
+      break;
+    case GL_RGB:
+      switch (type) {
+        case GL_UNSIGNED_BYTE:
+          return GL_RGB8;
+          break;
+        case GL_UNSIGNED_SHORT_5_6_5:
+          return GL_RGB;
+          break;
+      }
+      break;
+    case GL_RG:
+      switch (type) {
+        case GL_UNSIGNED_BYTE:
+          if (!USING_GLES3 (context) && USING_GLES2 (context) && ext_texture_rg)
+            return GL_RG;
+          return GL_RG8;
+          break;
+      }
+      break;
+    case GL_RED:
+      switch (type) {
+        case GL_UNSIGNED_BYTE:
+          if (!USING_GLES3 (context) && USING_GLES2 (context) && ext_texture_rg)
+            return GL_RED;
+          return GL_R8;
+          break;
+      }
+      break;
+    case GL_LUMINANCE:
+      return GL_LUMINANCE;
+      break;
+    case GL_LUMINANCE_ALPHA:
+      return GL_LUMINANCE_ALPHA;
+      break;
+    case GL_ALPHA:
+      return GL_ALPHA;
+      break;
+    default:
+      break;
+  }
+
+  g_assert_not_reached ();
+  return 0;
+}
+
+const gchar *
+gst_gl_texture_target_to_string (GstGLTextureTarget target)
+{
+  switch (target) {
+    case GST_GL_TEXTURE_TARGET_2D:
+      return GST_GL_TEXTURE_TARGET_2D_STR;
+    case GST_GL_TEXTURE_TARGET_RECTANGLE:
+      return GST_GL_TEXTURE_TARGET_RECTANGLE_STR;
+    case GST_GL_TEXTURE_TARGET_EXTERNAL_OES:
+      return GST_GL_TEXTURE_TARGET_EXTERNAL_OES_STR;
+    default:
+      return NULL;
+  }
+}
+
+GstGLTextureTarget
+gst_gl_texture_target_from_string (const gchar * str)
+{
+  if (!str)
+    return GST_GL_TEXTURE_TARGET_NONE;
+
+  if (g_strcmp0 (str, GST_GL_TEXTURE_TARGET_2D_STR) == 0)
+    return GST_GL_TEXTURE_TARGET_2D;
+  if (g_strcmp0 (str, GST_GL_TEXTURE_TARGET_RECTANGLE_STR) == 0)
+    return GST_GL_TEXTURE_TARGET_RECTANGLE;
+  if (g_strcmp0 (str, GST_GL_TEXTURE_TARGET_EXTERNAL_OES_STR) == 0)
+    return GST_GL_TEXTURE_TARGET_EXTERNAL_OES;
+
+  return GST_GL_TEXTURE_TARGET_NONE;
+}
+
+guint
+gst_gl_texture_target_to_gl (GstGLTextureTarget target)
+{
+  switch (target) {
+    case GST_GL_TEXTURE_TARGET_2D:
+      return GL_TEXTURE_2D;
+    case GST_GL_TEXTURE_TARGET_RECTANGLE:
+      return GL_TEXTURE_RECTANGLE;
+    case GST_GL_TEXTURE_TARGET_EXTERNAL_OES:
+      return GL_TEXTURE_EXTERNAL_OES;
+    default:
+      return 0;
+  }
+}
+
+GstGLTextureTarget
+gst_gl_texture_target_from_gl (guint target)
+{
+  switch (target) {
+    case GL_TEXTURE_2D:
+      return GST_GL_TEXTURE_TARGET_2D;
+    case GL_TEXTURE_RECTANGLE:
+      return GST_GL_TEXTURE_TARGET_RECTANGLE;
+    case GL_TEXTURE_EXTERNAL_OES:
+      return GST_GL_TEXTURE_TARGET_EXTERNAL_OES;
+    default:
+      return GST_GL_TEXTURE_TARGET_NONE;
+  }
+}
+
+const gchar *
+gst_gl_texture_target_to_buffer_pool_option (GstGLTextureTarget target)
+{
+  switch (target) {
+    case GST_GL_TEXTURE_TARGET_2D:
+      return GST_BUFFER_POOL_OPTION_GL_TEXTURE_TARGET_2D;
+    case GST_GL_TEXTURE_TARGET_RECTANGLE:
+      return GST_BUFFER_POOL_OPTION_GL_TEXTURE_TARGET_RECTANGLE;
+    case GST_GL_TEXTURE_TARGET_EXTERNAL_OES:
+      return GST_BUFFER_POOL_OPTION_GL_TEXTURE_TARGET_EXTERNAL_OES;
+    default:
+      return NULL;
+  }
+}
diff --git a/gst-libs/gst/gl/gstglformat.h b/gst-libs/gst/gl/gstglformat.h
new file mode 100644
index 0000000..c8e6764
--- /dev/null
+++ b/gst-libs/gst/gl/gstglformat.h
@@ -0,0 +1,58 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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_FORMAT_H_
+#define _GST_GL_FORMAT_H_
+
+#include <gst/gst.h>
+
+#include <gst/gl/gstgl_fwd.h>
+#include <gst/video/video.h>
+
+#define GST_GL_TEXTURE_TARGET_2D_STR "2D"
+#define GST_GL_TEXTURE_TARGET_RECTANGLE_STR "rectangle"
+#define GST_GL_TEXTURE_TARGET_EXTERNAL_OES_STR "external-oes"
+
+#define GST_BUFFER_POOL_OPTION_GL_TEXTURE_TARGET_2D "GstBufferPoolOptionGLTextureTarget2D"
+#define GST_BUFFER_POOL_OPTION_GL_TEXTURE_TARGET_RECTANGLE "GstBufferPoolOptionGLTextureTargetRectangle"
+#define GST_BUFFER_POOL_OPTION_GL_TEXTURE_TARGET_EXTERNAL_OES "GstBufferPoolOptionGLTextureTargetExternalOES"
+
+G_BEGIN_DECLS
+
+guint                   gst_gl_format_type_n_bytes                  (guint format,
+                                                                     guint type);
+guint                   gst_gl_texture_type_n_bytes                 (GstVideoGLTextureType tex_format);
+guint                   gst_gl_format_from_gl_texture_type          (GstVideoGLTextureType tex_format);
+GstVideoGLTextureType   gst_gl_texture_type_from_format             (GstGLContext * context,
+                                                                     GstVideoFormat v_format,
+                                                                     guint plane);
+guint                   gst_gl_sized_gl_format_from_gl_format_type  (GstGLContext * context,
+                                                                     guint format,
+                                                                     guint type);
+
+GstGLTextureTarget      gst_gl_texture_target_from_string           (const gchar * str);
+const gchar *           gst_gl_texture_target_to_string             (GstGLTextureTarget target);
+guint                   gst_gl_texture_target_to_gl                 (GstGLTextureTarget target);
+GstGLTextureTarget      gst_gl_texture_target_from_gl               (guint target);
+const gchar *           gst_gl_texture_target_to_buffer_pool_option (GstGLTextureTarget target);
+
+G_END_DECLS
+
+#endif /* _GST_GL_FORMAT_H_ */
diff --git a/gst-libs/gst/gl/gstglframebuffer.h b/gst-libs/gst/gl/gstglframebuffer.h
index 1fc9222..4768afb 100644
--- a/gst-libs/gst/gl/gstglframebuffer.h
+++ b/gst-libs/gst/gl/gstglframebuffer.h
@@ -64,6 +64,10 @@
 
 void gst_gl_framebuffer_delete (GstGLFramebuffer *frame, guint fbo, guint depth);
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstGLFramebuffer, gst_object_unref)
+#endif
+
 G_END_DECLS
 
 #endif
diff --git a/gst-libs/gst/gl/gstglmemory.c b/gst-libs/gst/gl/gstglmemory.c
index 0a528ec..229b5a2 100644
--- a/gst-libs/gst/gl/gstglmemory.c
+++ b/gst-libs/gst/gl/gstglmemory.c
@@ -1,6 +1,6 @@
 /*
  * GStreamer
- * Copyright (C) 2012 Matthew Waters <ystreet00@gmail.com>
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -26,8 +26,8 @@
 
 #include <gst/video/video.h>
 
-#include "gstglmemory.h"
-#include "gstglutils.h"
+#include <gst/gl/gstglbasememory.h>
+#include <gst/gl/gstglmemory.h>
 
 /**
  * SECTION:gstglmemory
@@ -60,56 +60,25 @@
 #define GL_MEM_HEIGHT(gl_mem) _get_plane_height (&gl_mem->info, gl_mem->plane)
 #define GL_MEM_STRIDE(gl_mem) GST_VIDEO_INFO_PLANE_STRIDE (&gl_mem->info, gl_mem->plane)
 
-#define CONTEXT_SUPPORTS_PBO_UPLOAD(context) \
-    (gst_gl_context_check_gl_version (context, \
-        GST_GL_API_OPENGL | GST_GL_API_OPENGL3, 2, 1) \
-        || gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 3, 0))
-#define CONTEXT_SUPPORTS_PBO_DOWNLOAD(context) \
-    (gst_gl_context_check_gl_version (context, \
-        GST_GL_API_OPENGL | GST_GL_API_OPENGL3 | GST_GL_API_GLES2, 3, 0))
+static GstAllocator *_gl_memory_allocator;
 
 GST_DEBUG_CATEGORY_STATIC (GST_CAT_GL_MEMORY);
 #define GST_CAT_DEFAULT GST_CAT_GL_MEMORY
 
-static GstAllocator *_gl_allocator;
-
 /* compatability definitions... */
-#ifndef GL_RGBA8
-#define GL_RGBA8 0x8058
-#endif
-#ifndef GL_RED
-#define GL_RED 0x1903
-#endif
-#ifndef GL_RG
-#define GL_RG 0x8227
-#endif
-#ifndef GL_R8
-#define GL_R8 0x8229
-#endif
-#ifndef GL_RG8
-#define GL_RG8 0x822B
-#endif
-#ifndef GL_PIXEL_PACK_BUFFER
-#define GL_PIXEL_PACK_BUFFER 0x88EB
-#endif
-#ifndef GL_PIXEL_UNPACK_BUFFER
-#define GL_PIXEL_UNPACK_BUFFER 0x88EC
-#endif
-#ifndef GL_STREAM_READ
-#define GL_STREAM_READ 0x88E1
-#endif
-#ifndef GL_STREAM_DRAW
-#define GL_STREAM_DRAW 0x88E0
-#endif
-#ifndef GL_STREAM_COPY
-#define GL_STREAM_COPY 0x88E2
-#endif
 #ifndef GL_UNPACK_ROW_LENGTH
 #define GL_UNPACK_ROW_LENGTH 0x0CF2
 #endif
 
-G_DEFINE_TYPE (GstGLAllocator, gst_gl_allocator,
-    GST_TYPE_GL_BASE_BUFFER_ALLOCATOR);
+#ifndef GL_TEXTURE_RECTANGLE
+#define GL_TEXTURE_RECTANGLE 0x84F5
+#endif
+#ifndef GL_TEXTURE_EXTERNAL_OES
+#define GL_TEXTURE_EXTERNAL_OES 0x8D65
+#endif
+
+G_DEFINE_TYPE (GstGLMemoryAllocator, gst_gl_memory_allocator,
+    GST_TYPE_GL_BASE_MEMORY_ALLOCATOR);
 
 typedef struct
 {
@@ -117,9 +86,8 @@
   GstGLMemory *src;
   GstVideoGLTextureType out_format;
   guint out_width, out_height;
-  guint out_stride;
-  gboolean respecify;
-  guint tex_target;
+  GstGLTextureTarget tex_target;
+  GstVideoGLTextureType tex_type;
   /* inout */
   guint tex_id;
   /* out */
@@ -127,240 +95,6 @@
 } GstGLMemoryCopyParams;
 
 static inline guint
-_gl_format_n_components (guint format)
-{
-  switch (format) {
-    case GST_VIDEO_GL_TEXTURE_TYPE_RGBA:
-    case GL_RGBA:
-      return 4;
-    case GST_VIDEO_GL_TEXTURE_TYPE_RGB:
-    case GST_VIDEO_GL_TEXTURE_TYPE_RGB16:
-    case GL_RGB:
-      return 3;
-    case GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA:
-    case GST_VIDEO_GL_TEXTURE_TYPE_RG:
-    case GL_LUMINANCE_ALPHA:
-    case GL_RG:
-      return 2;
-    case GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE:
-    case GST_VIDEO_GL_TEXTURE_TYPE_R:
-    case GL_LUMINANCE:
-    case GL_RED:
-      return 1;
-    default:
-      return 0;
-  }
-}
-
-static inline guint
-_gl_type_n_components (guint type)
-{
-  switch (type) {
-    case GL_UNSIGNED_BYTE:
-      return 1;
-    case GL_UNSIGNED_SHORT_5_6_5:
-      return 3;
-    default:
-      g_assert_not_reached ();
-      return 0;
-  }
-}
-
-static inline guint
-_gl_type_n_bytes (guint type)
-{
-  switch (type) {
-    case GL_UNSIGNED_BYTE:
-      return 1;
-    case GL_UNSIGNED_SHORT_5_6_5:
-      return 2;
-    default:
-      g_assert_not_reached ();
-      return 0;
-  }
-}
-
-static inline guint
-_gl_format_type_n_bytes (guint format, guint type)
-{
-  return _gl_format_n_components (format) / _gl_type_n_components (type) *
-      _gl_type_n_bytes (type);
-}
-
-static inline guint
-_gl_texture_type_n_bytes (GstVideoGLTextureType tex_format)
-{
-  guint format, type;
-
-  format = gst_gl_format_from_gl_texture_type (tex_format);
-  type = GL_UNSIGNED_BYTE;
-  if (tex_format == GST_VIDEO_GL_TEXTURE_TYPE_RGB16)
-    type = GL_UNSIGNED_SHORT_5_6_5;
-
-  return _gl_format_type_n_bytes (format, type);
-}
-
-guint
-gst_gl_format_from_gl_texture_type (GstVideoGLTextureType tex_format)
-{
-  switch (tex_format) {
-    case GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA:
-      return GL_LUMINANCE_ALPHA;
-    case GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE:
-      return GL_LUMINANCE;
-    case GST_VIDEO_GL_TEXTURE_TYPE_RGBA:
-      return GL_RGBA;
-    case GST_VIDEO_GL_TEXTURE_TYPE_RGB:
-    case GST_VIDEO_GL_TEXTURE_TYPE_RGB16:
-      return GL_RGB;
-    case GST_VIDEO_GL_TEXTURE_TYPE_RG:
-      return GL_RG;
-    case GST_VIDEO_GL_TEXTURE_TYPE_R:
-      return GL_RED;
-    default:
-      return GST_VIDEO_GL_TEXTURE_TYPE_RGBA;
-  }
-}
-
-GstVideoGLTextureType
-gst_gl_texture_type_from_format (GstGLContext * context,
-    GstVideoFormat v_format, guint plane)
-{
-  gboolean texture_rg =
-      gst_gl_context_check_feature (context, "GL_EXT_texture_rg")
-      || gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 3, 0)
-      || gst_gl_context_check_feature (context, "GL_ARB_texture_rg")
-      || gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL3, 3, 0);
-  guint n_plane_components;
-
-  switch (v_format) {
-    case GST_VIDEO_FORMAT_RGBx:
-    case GST_VIDEO_FORMAT_BGRx:
-    case GST_VIDEO_FORMAT_xRGB:
-    case GST_VIDEO_FORMAT_xBGR:
-    case GST_VIDEO_FORMAT_RGBA:
-    case GST_VIDEO_FORMAT_BGRA:
-    case GST_VIDEO_FORMAT_ARGB:
-    case GST_VIDEO_FORMAT_ABGR:
-    case GST_VIDEO_FORMAT_AYUV:
-      n_plane_components = 4;
-      break;
-    case GST_VIDEO_FORMAT_RGB:
-    case GST_VIDEO_FORMAT_BGR:
-      n_plane_components = 3;
-      break;
-    case GST_VIDEO_FORMAT_RGB16:
-    case GST_VIDEO_FORMAT_BGR16:
-      return GST_VIDEO_GL_TEXTURE_TYPE_RGB16;
-    case GST_VIDEO_FORMAT_GRAY16_BE:
-    case GST_VIDEO_FORMAT_GRAY16_LE:
-    case GST_VIDEO_FORMAT_YUY2:
-    case GST_VIDEO_FORMAT_UYVY:
-      n_plane_components = 2;
-      break;
-    case GST_VIDEO_FORMAT_NV12:
-    case GST_VIDEO_FORMAT_NV21:
-      n_plane_components = plane == 0 ? 1 : 2;
-      break;
-    case GST_VIDEO_FORMAT_GRAY8:
-    case GST_VIDEO_FORMAT_Y444:
-    case GST_VIDEO_FORMAT_Y42B:
-    case GST_VIDEO_FORMAT_Y41B:
-    case GST_VIDEO_FORMAT_I420:
-    case GST_VIDEO_FORMAT_YV12:
-      n_plane_components = 1;
-      break;
-    default:
-      n_plane_components = 4;
-      g_assert_not_reached ();
-      break;
-  }
-
-  switch (n_plane_components) {
-    case 4:
-      return GST_VIDEO_GL_TEXTURE_TYPE_RGBA;
-      break;
-    case 3:
-      return GST_VIDEO_GL_TEXTURE_TYPE_RGB;
-      break;
-    case 2:
-      return texture_rg ? GST_VIDEO_GL_TEXTURE_TYPE_RG :
-          GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA;
-      break;
-    case 1:
-      return texture_rg ? GST_VIDEO_GL_TEXTURE_TYPE_R :
-          GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE;
-      break;
-    default:
-      g_assert_not_reached ();
-      break;
-  }
-
-  return GST_VIDEO_GL_TEXTURE_TYPE_RGBA;
-}
-
-guint
-gst_gl_sized_gl_format_from_gl_format_type (GstGLContext * context,
-    guint format, guint type)
-{
-  gboolean ext_texture_rg =
-      gst_gl_context_check_feature (context, "GL_EXT_texture_rg");
-
-  switch (format) {
-    case GL_RGBA:
-      switch (type) {
-        case GL_UNSIGNED_BYTE:
-          return USING_GLES2 (context)
-              && !USING_GLES3 (context) ? GL_RGBA : GL_RGBA8;
-          break;
-      }
-      break;
-    case GL_RGB:
-      switch (type) {
-        case GL_UNSIGNED_BYTE:
-          return GL_RGB8;
-          break;
-        case GL_UNSIGNED_SHORT_5_6_5:
-          return GL_RGB;
-          break;
-      }
-      break;
-    case GL_RG:
-      switch (type) {
-        case GL_UNSIGNED_BYTE:
-          if (!USING_GLES3 (context) && USING_GLES2 (context) && ext_texture_rg)
-            return GL_RG;
-          return GL_RG8;
-          break;
-      }
-      break;
-    case GL_RED:
-      switch (type) {
-        case GL_UNSIGNED_BYTE:
-          if (!USING_GLES3 (context) && USING_GLES2 (context) && ext_texture_rg)
-            return GL_RED;
-          return GL_R8;
-          break;
-      }
-      break;
-    case GL_LUMINANCE:
-      return GL_LUMINANCE;
-      break;
-    case GL_LUMINANCE_ALPHA:
-      return GL_LUMINANCE_ALPHA;
-      break;
-    case GL_ALPHA:
-      return GL_ALPHA;
-      break;
-    default:
-      break;
-  }
-
-  g_assert_not_reached ();
-  return 0;
-}
-
-static inline guint
 _get_plane_width (GstVideoInfo * info, guint plane)
 {
   if (GST_VIDEO_INFO_IS_YUV (info))
@@ -384,96 +118,6 @@
     return GST_VIDEO_INFO_HEIGHT (info);
 }
 
-typedef struct _GenTexture
-{
-  guint width, height;
-  GLenum gl_target;
-  GLenum gl_format;
-  GLenum gl_type;
-  guint result;
-} GenTexture;
-
-/* find the difference between the start of the plane and where the video
- * data starts in the plane */
-static gsize
-_find_plane_frame_start (GstGLMemory * gl_mem)
-{
-  gsize plane_start;
-  gint i;
-
-  /* find the start of the plane data including padding */
-  plane_start = 0;
-  for (i = 0; i < gl_mem->plane; i++) {
-    plane_start +=
-        gst_gl_get_plane_data_size (&gl_mem->info, &gl_mem->valign, i);
-  }
-
-  /* offset between the plane data start and where the video frame starts */
-  return (GST_VIDEO_INFO_PLANE_OFFSET (&gl_mem->info,
-          gl_mem->plane)) - plane_start + gl_mem->mem.mem.offset;
-}
-
-static void
-_upload_memory (GstGLMemory * gl_mem, GstMapInfo * info, gsize maxsize)
-{
-  GstGLContext *context = gl_mem->mem.context;
-  const GstGLFuncs *gl;
-  GLenum gl_format, gl_type, gl_target;
-  gpointer data;
-  gsize plane_start;
-
-  if ((gl_mem->transfer_state & GST_GL_MEMORY_TRANSFER_NEED_UPLOAD) == 0)
-    return;
-
-  gl = context->gl_vtable;
-
-  gl_type = GL_UNSIGNED_BYTE;
-  if (gl_mem->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_RGB16)
-    gl_type = GL_UNSIGNED_SHORT_5_6_5;
-
-  gl_format = gst_gl_format_from_gl_texture_type (gl_mem->tex_type);
-  gl_target = gl_mem->tex_target;
-
-  if (USING_OPENGL (context) || USING_GLES3 (context)
-      || USING_OPENGL3 (context)) {
-    gl->PixelStorei (GL_UNPACK_ROW_LENGTH, gl_mem->unpack_length);
-  } else if (USING_GLES2 (context)) {
-    gl->PixelStorei (GL_UNPACK_ALIGNMENT, gl_mem->unpack_length);
-  }
-
-  GST_LOG ("upload for texture id:%u, with pbo %u %ux%u",
-      gl_mem->tex_id, gl_mem->mem.id, gl_mem->tex_width,
-      GL_MEM_HEIGHT (gl_mem));
-
-  /* find the start of the plane data including padding */
-  plane_start = _find_plane_frame_start (gl_mem);
-
-  if (gl_mem->mem.id && CONTEXT_SUPPORTS_PBO_UPLOAD (context)) {
-    gl->BindBuffer (GL_PIXEL_UNPACK_BUFFER, gl_mem->mem.id);
-    data = (void *) plane_start;
-  } else {
-    data = (gpointer) ((gintptr) plane_start + (gintptr) gl_mem->mem.data);
-  }
-
-  gl->BindTexture (gl_target, gl_mem->tex_id);
-  gl->TexSubImage2D (gl_target, 0, 0, 0, gl_mem->tex_width,
-      GL_MEM_HEIGHT (gl_mem), gl_format, gl_type, data);
-
-  if (gl_mem->mem.id && CONTEXT_SUPPORTS_PBO_UPLOAD (context))
-    gl->BindBuffer (GL_PIXEL_UNPACK_BUFFER, 0);
-
-  /* Reset to default values */
-  if (USING_OPENGL (context) || USING_GLES3 (context)) {
-    gl->PixelStorei (GL_UNPACK_ROW_LENGTH, 0);
-  } else if (USING_GLES2 (context)) {
-    gl->PixelStorei (GL_UNPACK_ALIGNMENT, 4);
-  }
-
-  gl->BindTexture (gl_target, 0);
-
-  gl_mem->transfer_state &= ~GST_GL_MEMORY_TRANSFER_NEED_UPLOAD;
-}
-
 static inline void
 _calculate_unpack_length (GstGLMemory * gl_mem, GstGLContext * context)
 {
@@ -484,7 +128,7 @@
   gl_mem->unpack_length = 1;
   gl_mem->tex_width = GL_MEM_WIDTH (gl_mem);
 
-  n_gl_bytes = _gl_texture_type_n_bytes (gl_mem->tex_type);
+  n_gl_bytes = gst_gl_texture_type_n_bytes (gl_mem->tex_type);
   if (n_gl_bytes == 0) {
     GST_ERROR ("Unsupported texture type %d", gl_mem->tex_type);
     return;
@@ -502,8 +146,8 @@
           ((GL_MEM_WIDTH (gl_mem) * n_gl_bytes) + j - 1) & ~(j - 1);
 
       if (round_up_j == GL_MEM_STRIDE (gl_mem)) {
-        GST_LOG ("Found alignment of %u based on width "
-            "(with plane width:%u, plane stride:%u and pixel stride:%u. "
+        GST_CAT_LOG (GST_CAT_GL_MEMORY, "Found alignment of %u based on "
+            "width (with plane width:%u, plane stride:%u and pixel stride:%u. "
             "RU%u(%u*%u) = %u)", j, GL_MEM_WIDTH (gl_mem),
             GL_MEM_STRIDE (gl_mem), n_gl_bytes, j, GL_MEM_WIDTH (gl_mem),
             n_gl_bytes, round_up_j);
@@ -525,8 +169,8 @@
         guint round_up_j = ((GL_MEM_STRIDE (gl_mem)) + j - 1) & ~(j - 1);
 
         if (round_up_j == (GL_MEM_STRIDE (gl_mem))) {
-          GST_LOG ("Found alignment of %u based on "
-              "stride (with plane stride:%u and pixel stride:%u. "
+          GST_CAT_LOG (GST_CAT_GL_MEMORY, "Found alignment of %u based "
+              "on stride (with plane stride:%u and pixel stride:%u. "
               "RU%u(%u) = %u)", j, GL_MEM_STRIDE (gl_mem), n_gl_bytes, j,
               GL_MEM_STRIDE (gl_mem), round_up_j);
 
@@ -541,14 +185,25 @@
       }
 
       if (j < n_gl_bytes) {
-        GST_ERROR
-            ("Failed to find matching alignment. Image may "
-            "look corrupted. plane width:%u, plane stride:%u and pixel "
-            "stride:%u", GL_MEM_WIDTH (gl_mem), GL_MEM_STRIDE (gl_mem),
-            n_gl_bytes);
+        GST_CAT_ERROR (GST_CAT_GL_MEMORY, "Failed to find matching "
+            "alignment. Image may look corrupted. plane width:%u, "
+            "plane stride:%u and pixel stride:%u", GL_MEM_WIDTH (gl_mem),
+            GL_MEM_STRIDE (gl_mem), n_gl_bytes);
       }
     }
   }
+
+  if (gl_mem->tex_target == GST_GL_TEXTURE_TARGET_RECTANGLE) {
+    guint w_sub =
+        GST_VIDEO_FORMAT_INFO_W_SUB (gl_mem->info.finfo, gl_mem->plane);
+    guint h_sub =
+        GST_VIDEO_FORMAT_INFO_H_SUB (gl_mem->info.finfo, gl_mem->plane);
+
+    if (w_sub)
+      gl_mem->tex_scaling[0] /= (1 << w_sub);
+    if (h_sub)
+      gl_mem->tex_scaling[1] /= (1 << h_sub);
+  }
 }
 
 static guint
@@ -560,22 +215,24 @@
 
   gl->GenTextures (1, &tex_id);
   gl->BindTexture (target, tex_id);
-  gl->TexImage2D (target, 0, internal_format, width, height, 0, format, type,
-      NULL);
+  if (target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE)
+    gl->TexImage2D (target, 0, internal_format, width, height, 0, format, type,
+        NULL);
 
   gl->TexParameteri (target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
   gl->TexParameteri (target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   gl->TexParameteri (target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
   gl->TexParameteri (target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 
+  gl->BindTexture (target, 0);
+
   return tex_id;
 }
 
 static gboolean
-_gl_mem_create (GstGLMemory * gl_mem, GError ** error)
+_gl_tex_create (GstGLMemory * gl_mem, GError ** error)
 {
   GstGLContext *context = gl_mem->mem.context;
-  const GstGLFuncs *gl = context->gl_vtable;
   GLenum internal_format;
   GLenum tex_format;
   GLenum tex_type;
@@ -585,42 +242,44 @@
   if (gl_mem->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_RGB16)
     tex_type = GL_UNSIGNED_SHORT_5_6_5;
 
-  GST_TRACE ("Generating texture format:%u type:%u dimensions:%ux%u",
-      tex_format, tex_type, gl_mem->tex_width, GL_MEM_HEIGHT (gl_mem));
-
   internal_format =
       gst_gl_sized_gl_format_from_gl_format_type (context, tex_format,
       tex_type);
 
   if (!gl_mem->texture_wrapped) {
     gl_mem->tex_id =
-        _new_texture (context, gl_mem->tex_target, internal_format, tex_format,
-        tex_type, gl_mem->tex_width, GL_MEM_HEIGHT (gl_mem));
-  }
+        _new_texture (context, gst_gl_texture_target_to_gl (gl_mem->tex_target),
+        internal_format, tex_format, tex_type, gl_mem->tex_width,
+        GL_MEM_HEIGHT (gl_mem));
 
-  GST_LOG ("generated texture id:%d", gl_mem->tex_id);
-
-  if (USING_OPENGL (context) || USING_OPENGL3 (context)
-      || USING_GLES3 (context)) {
-    /* FIXME: lazy init this for resource constrained platforms
-     * Will need to fix pbo detection based on the existence of the mem.id then */
-    gl->GenBuffers (1, &gl_mem->mem.id);
-    gl->BindBuffer (GL_PIXEL_UNPACK_BUFFER, gl_mem->mem.id);
-    gl->BufferData (GL_PIXEL_UNPACK_BUFFER, gl_mem->mem.mem.maxsize, NULL,
-        GL_STREAM_DRAW);
-    gl->BindBuffer (GL_PIXEL_UNPACK_BUFFER, 0);
-    GST_LOG ("generated pbo %u", gl_mem->mem.id);
+    GST_TRACE ("Generating texture id:%u format:%u type:%u dimensions:%ux%u",
+        gl_mem->tex_id, tex_format, tex_type, gl_mem->tex_width,
+        GL_MEM_HEIGHT (gl_mem));
   }
 
   return TRUE;
 }
 
-static void
-_gl_mem_init (GstGLMemory * mem, GstAllocator * allocator, GstMemory * parent,
-    GstGLContext * context, GstAllocationParams * params, GstVideoInfo * info,
-    GstVideoAlignment * valign, guint plane, gpointer user_data,
-    GDestroyNotify notify)
+/**
+ * gst_gl_memory_init:
+ * @mem: the #GstGLBaseMemory to initialize
+ * @allocator: the #GstAllocator to initialize with
+ * @parent: (allow-none): the parent #GstMemory to initialize with
+ * @context: the #GstGLContext to initialize with
+ * @params: (allow-none): the @GstAllocationParams to initialize with
+ * @size: the number of bytes to be allocated
+ * @notify: (allow-none): a #GDestroyNotify
+ * @user_data: (allow-none): user data to call @notify with
+ *
+ * Initializes @mem with the required parameters
+ */
+void
+gst_gl_memory_init (GstGLMemory * mem, GstAllocator * allocator,
+    GstMemory * parent, GstGLContext * context, GstGLTextureTarget target,
+    GstAllocationParams * params, GstVideoInfo * info, guint plane,
+    GstVideoAlignment * valign, gpointer user_data, GDestroyNotify notify)
 {
+  const gchar *target_str;
   gsize size;
 
   g_return_if_fail (plane < GST_VIDEO_INFO_N_PLANES (info));
@@ -648,45 +307,27 @@
 
   size = gst_gl_get_plane_data_size (info, valign, plane);
 
-  /* we always operate on 2D textures unless we're dealing with wrapped textures */
-  mem->tex_target = GL_TEXTURE_2D;
+  mem->tex_target = target;
   mem->tex_type =
       gst_gl_texture_type_from_format (context, GST_VIDEO_INFO_FORMAT (info),
       plane);
   mem->plane = plane;
-  mem->notify = notify;
-  mem->user_data = user_data;
 
   _calculate_unpack_length (mem, context);
 
-  /* calls _gl_mem_create() */
-  gst_gl_base_buffer_init ((GstGLBaseBuffer *) mem, allocator, parent, context,
-      params, size);
+  gst_gl_base_memory_init ((GstGLBaseMemory *) mem, allocator, parent, context,
+      params, size, user_data, notify);
 
-  GST_DEBUG ("new GL texture context:%" GST_PTR_FORMAT " memory:%p format:%u "
-      "dimensions:%ux%u stride:%u size:%" G_GSIZE_FORMAT, context, mem,
+  target_str = gst_gl_texture_target_to_string (target);
+  GST_CAT_DEBUG (GST_CAT_GL_MEMORY, "new GL texture context:%"
+      GST_PTR_FORMAT " memory:%p target:%s format:%u dimensions:%ux%u "
+      "stride:%u size:%" G_GSIZE_FORMAT, context, mem, target_str,
       mem->tex_type, mem->tex_width, GL_MEM_HEIGHT (mem), GL_MEM_STRIDE (mem),
       mem->mem.mem.size);
 }
 
-static GstGLMemory *
-_gl_mem_new (GstAllocator * allocator, GstMemory * parent,
-    GstGLContext * context, GstAllocationParams * params, GstVideoInfo * info,
-    GstVideoAlignment * valign, guint plane, gpointer user_data,
-    GDestroyNotify notify)
-{
-  GstGLMemory *mem;
-  mem = g_slice_new0 (GstGLMemory);
-  mem->texture_wrapped = FALSE;
-
-  _gl_mem_init (mem, allocator, parent, context, params, info, valign, plane,
-      user_data, notify);
-
-  return mem;
-}
-
-static gboolean
-_gl_mem_read_pixels (GstGLMemory * gl_mem, gpointer read_pointer)
+gboolean
+gst_gl_memory_read_pixels (GstGLMemory * gl_mem, gpointer read_pointer)
 {
   GstGLContext *context = gl_mem->mem.context;
   const GstGLFuncs *gl = context->gl_vtable;
@@ -703,7 +344,7 @@
   gl->BindFramebuffer (GL_FRAMEBUFFER, fbo);
 
   gl->FramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
-      gl_mem->tex_target, gl_mem->tex_id, 0);
+      gst_gl_texture_target_to_gl (gl_mem->tex_target), gl_mem->tex_id, 0);
 
   if (!gst_gl_context_check_framebuffer_status (context)) {
     GST_CAT_WARNING (GST_CAT_GL_MEMORY,
@@ -722,64 +363,8 @@
   return TRUE;
 }
 
-static gboolean
-_read_pixels_to_pbo (GstGLMemory * gl_mem)
-{
-  const GstGLFuncs *gl = gl_mem->mem.context->gl_vtable;
-
-  if (!gl_mem->mem.id || !CONTEXT_SUPPORTS_PBO_DOWNLOAD (gl_mem->mem.context)
-      || gl_mem->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE
-      || gl_mem->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA)
-    /* unsupported */
-    return FALSE;
-
-  if (gl_mem->transfer_state & GST_GL_MEMORY_TRANSFER_NEED_DOWNLOAD) {
-    /* copy texture data into into the pbo and map that */
-    gsize plane_start = _find_plane_frame_start (gl_mem);
-
-    gl->BindBuffer (GL_PIXEL_PACK_BUFFER, gl_mem->mem.id);
-
-    if (!_gl_mem_read_pixels (gl_mem, (gpointer) plane_start)) {
-      gl->BindBuffer (GL_PIXEL_PACK_BUFFER, 0);
-      return FALSE;
-    }
-
-    gl->BindBuffer (GL_PIXEL_PACK_BUFFER, 0);
-    gl_mem->transfer_state &= ~GST_GL_MEMORY_TRANSFER_NEED_DOWNLOAD;
-  }
-
-  return TRUE;
-}
-
 static gpointer
-_pbo_download_transfer (GstGLMemory * gl_mem, GstMapInfo * info, gsize size)
-{
-  GstGLBaseBufferAllocatorClass *alloc_class;
-  gpointer data = NULL;
-
-  alloc_class =
-      GST_GL_BASE_BUFFER_ALLOCATOR_CLASS (gst_gl_allocator_parent_class);
-
-  /* texture -> pbo */
-  if (info->flags & GST_MAP_READ
-      && gl_mem->transfer_state & GST_GL_MEMORY_TRANSFER_NEED_DOWNLOAD) {
-    GST_CAT_TRACE (GST_CAT_GL_MEMORY, "attempting download of texture %u "
-        "using pbo %u", gl_mem->tex_id, gl_mem->mem.id);
-
-    if (!_read_pixels_to_pbo (gl_mem))
-      return NULL;
-  }
-
-  /* get a cpu accessible mapping from the pbo */
-  gl_mem->mem.target = GL_PIXEL_PACK_BUFFER;
-  /* pbo -> data */
-  data = alloc_class->map_buffer ((GstGLBaseBuffer *) gl_mem, info, size);
-
-  return data;
-}
-
-static gpointer
-_gl_mem_download_get_tex_image (GstGLMemory * gl_mem, GstMapInfo * info,
+_gl_tex_download_get_tex_image (GstGLMemory * gl_mem, GstMapInfo * info,
     gsize size)
 {
   GstGLContext *context = gl_mem->mem.context;
@@ -797,8 +382,10 @@
     return NULL;
 
   if (info->flags & GST_MAP_READ
-      && gl_mem->transfer_state & GST_GL_MEMORY_TRANSFER_NEED_DOWNLOAD) {
+      && GST_MEMORY_FLAG_IS_SET (gl_mem,
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD)) {
     guint format, type;
+    guint target;
 
     GST_CAT_TRACE (GST_CAT_GL_MEMORY, "attempting download of texture %u "
         "using glGetTexImage", gl_mem->tex_id);
@@ -808,26 +395,29 @@
     if (gl_mem->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_RGB16)
       type = GL_UNSIGNED_SHORT_5_6_5;
 
-    gl->BindTexture (gl_mem->tex_target, gl_mem->tex_id);
-    gl->GetTexImage (gl_mem->tex_target, 0, format, type, gl_mem->mem.data);
-    gl->BindTexture (gl_mem->tex_target, 0);
+    target = gst_gl_texture_target_to_gl (gl_mem->tex_target);
+    gl->BindTexture (target, gl_mem->tex_id);
+    gl->GetTexImage (target, 0, format, type, gl_mem->mem.data);
+    gl->BindTexture (target, 0);
   }
 
   return gl_mem->mem.data;
 }
 
 static gpointer
-_gl_mem_download_read_pixels (GstGLMemory * gl_mem, GstMapInfo * info,
+_gl_tex_download_read_pixels (GstGLMemory * gl_mem, GstMapInfo * info,
     gsize size)
 {
   if (size != -1 && size != ((GstMemory *) gl_mem)->maxsize)
     return NULL;
 
   if (info->flags & GST_MAP_READ
-      && gl_mem->transfer_state & GST_GL_MEMORY_TRANSFER_NEED_DOWNLOAD) {
-    GST_CAT_TRACE (GST_CAT_GL_MEMORY, "attempting download of texture %u "
-        "using glReadPixels", gl_mem->tex_id);
-    if (!_gl_mem_read_pixels (gl_mem, gl_mem->mem.data))
+      && GST_MEMORY_FLAG_IS_SET (gl_mem,
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD)) {
+    GST_CAT_TRACE (GST_CAT_GL_MEMORY,
+        "attempting download of texture %u " "using glReadPixels",
+        gl_mem->tex_id);
+    if (!gst_gl_memory_read_pixels (gl_mem, gl_mem->mem.data))
       return NULL;
   }
 
@@ -835,149 +425,197 @@
 }
 
 static gpointer
-_gl_mem_map_cpu_access (GstGLMemory * gl_mem, GstMapInfo * info, gsize size)
+_gl_tex_map_cpu_access (GstGLMemory * gl_mem, GstMapInfo * info, gsize size)
 {
   gpointer data = NULL;
 
-  gst_gl_base_buffer_alloc_data ((GstGLBaseBuffer *) gl_mem);
-
-  if (!data && gl_mem->mem.id
-      && CONTEXT_SUPPORTS_PBO_DOWNLOAD (gl_mem->mem.context))
-    data = _pbo_download_transfer (gl_mem, info, size);
-  if (!data)
-    data = _gl_mem_download_get_tex_image (gl_mem, info, size);
+  if (!gst_gl_base_memory_alloc_data (GST_GL_BASE_MEMORY_CAST (gl_mem)))
+    return NULL;
 
   if (!data)
-    data = _gl_mem_download_read_pixels (gl_mem, info, size);
+    data = _gl_tex_download_get_tex_image (gl_mem, info, size);
+
+  if (!data)
+    data = _gl_tex_download_read_pixels (gl_mem, info, size);
 
   return data;
 }
 
+static void
+_upload_cpu_write (GstGLMemory * gl_mem, GstMapInfo * info, gsize maxsize)
+{
+  GstGLContext *context = gl_mem->mem.context;
+  const GstGLFuncs *gl;
+  GLenum gl_format, gl_type, gl_target;
+  gpointer data;
+  gsize plane_start;
+
+  if (!GST_MEMORY_FLAG_IS_SET (gl_mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD))
+    return;
+
+  gl = context->gl_vtable;
+
+  gl_type = GL_UNSIGNED_BYTE;
+  if (gl_mem->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_RGB16)
+    gl_type = GL_UNSIGNED_SHORT_5_6_5;
+
+  gl_format = gst_gl_format_from_gl_texture_type (gl_mem->tex_type);
+  gl_target = gst_gl_texture_target_to_gl (gl_mem->tex_target);
+
+  if (USING_OPENGL (context) || USING_GLES3 (context)
+      || USING_OPENGL3 (context)) {
+    gl->PixelStorei (GL_UNPACK_ROW_LENGTH, gl_mem->unpack_length);
+  } else if (USING_GLES2 (context)) {
+    gl->PixelStorei (GL_UNPACK_ALIGNMENT, gl_mem->unpack_length);
+  }
+
+  GST_CAT_LOG (GST_CAT_GL_MEMORY, "upload for texture id:%u, %ux%u",
+      gl_mem->tex_id, gl_mem->tex_width, GL_MEM_HEIGHT (gl_mem));
+
+  /* find the start of the plane data including padding */
+  plane_start =
+      gst_gl_get_plane_start (&gl_mem->info, &gl_mem->valign,
+      gl_mem->plane) + gl_mem->mem.mem.offset;
+
+  data = (gpointer) ((gintptr) plane_start + (gintptr) gl_mem->mem.data);
+
+  gl->BindTexture (gl_target, gl_mem->tex_id);
+  gl->TexSubImage2D (gl_target, 0, 0, 0, gl_mem->tex_width,
+      GL_MEM_HEIGHT (gl_mem), gl_format, gl_type, data);
+
+  /* Reset to default values */
+  if (USING_OPENGL (context) || USING_GLES3 (context)) {
+    gl->PixelStorei (GL_UNPACK_ROW_LENGTH, 0);
+  } else if (USING_GLES2 (context)) {
+    gl->PixelStorei (GL_UNPACK_ALIGNMENT, 4);
+  }
+
+  gl->BindTexture (gl_target, 0);
+}
+
 static gpointer
-_gl_mem_map_buffer (GstGLMemory * gl_mem, GstMapInfo * info, gsize maxsize)
+_default_gl_tex_map (GstGLMemory * gl_mem, GstMapInfo * info, gsize size)
 {
-  GstGLBaseBufferAllocatorClass *alloc_class;
+  if ((info->flags & GST_MAP_GL) == GST_MAP_GL) {
+    _upload_cpu_write (gl_mem, info, size);
+    return &gl_mem->tex_id;
+  } else {
+    return _gl_tex_map_cpu_access (gl_mem, info, size);
+  }
+}
+
+static gpointer
+_gl_tex_map (GstGLMemory * gl_mem, GstMapInfo * info, gsize maxsize)
+{
+  GstGLMemoryAllocatorClass *alloc_class;
   gpointer data;
 
-  alloc_class =
-      GST_GL_BASE_BUFFER_ALLOCATOR_CLASS (gst_gl_allocator_parent_class);
+  alloc_class = GST_GL_MEMORY_ALLOCATOR_GET_CLASS (gl_mem->mem.mem.allocator);
 
   if ((info->flags & GST_MAP_GL) == GST_MAP_GL) {
-    if ((info->flags & GST_MAP_READ) == GST_MAP_READ) {
-      GST_TRACE ("mapping GL texture:%u for reading", gl_mem->tex_id);
-
-      if (gl_mem->mem.id && CONTEXT_SUPPORTS_PBO_UPLOAD (gl_mem->mem.context)) {
-        gl_mem->mem.target = GL_PIXEL_UNPACK_BUFFER;
-        /* data -> pbo */
-        alloc_class->map_buffer ((GstGLBaseBuffer *) gl_mem, info, maxsize);
-      }
-      /* pbo -> texture */
-      _upload_memory (gl_mem, info, maxsize);
-    }
-
-    if ((info->flags & GST_MAP_WRITE) == GST_MAP_WRITE) {
-      GST_TRACE ("mapping GL texture:%u for writing", gl_mem->tex_id);
-      gl_mem->transfer_state |= GST_GL_MEMORY_TRANSFER_NEED_DOWNLOAD;
-    }
-    gl_mem->transfer_state &= ~GST_GL_MEMORY_TRANSFER_NEED_UPLOAD;
-
-    data = &gl_mem->tex_id;
+    if (gl_mem->tex_target == GST_GL_TEXTURE_TARGET_EXTERNAL_OES)
+      return &gl_mem->tex_id;
   } else {                      /* not GL */
-    data = _gl_mem_map_cpu_access (gl_mem, info, maxsize);
-    if (info->flags & GST_MAP_WRITE)
-      gl_mem->transfer_state |= GST_GL_MEMORY_TRANSFER_NEED_UPLOAD;
-    gl_mem->transfer_state &= ~GST_GL_MEMORY_TRANSFER_NEED_DOWNLOAD;
+    if (gl_mem->tex_target == GST_GL_TEXTURE_TARGET_EXTERNAL_OES) {
+      GST_CAT_ERROR (GST_CAT_GL_MEMORY, "Cannot map External OES textures");
+      return NULL;
+    }
   }
 
+  g_return_val_if_fail (alloc_class->map != NULL, NULL);
+  data = alloc_class->map (GST_GL_BASE_MEMORY_CAST (gl_mem), info, maxsize);
+
   return data;
 }
 
 static void
-_gl_mem_unmap_cpu_access (GstGLMemory * gl_mem, GstMapInfo * info)
+_default_gl_tex_unmap (GstGLMemory * gl_mem, GstMapInfo * info)
 {
-  GstGLBaseBufferAllocatorClass *alloc_class;
-  const GstGLFuncs *gl;
-
-  alloc_class =
-      GST_GL_BASE_BUFFER_ALLOCATOR_CLASS (gst_gl_allocator_parent_class);
-  gl = gl_mem->mem.context->gl_vtable;
-
-  if (!gl_mem->mem.id)
-    /* PBO's not supported */
-    return;
-
-  gl_mem->mem.target = GL_PIXEL_PACK_BUFFER;
-  alloc_class->unmap_buffer ((GstGLBaseBuffer *) gl_mem, info);
-  gl->BindBuffer (GL_PIXEL_PACK_BUFFER, 0);
 }
 
 static void
-_gl_mem_unmap_buffer (GstGLMemory * gl_mem, GstMapInfo * info)
+_gl_tex_unmap (GstGLMemory * gl_mem, GstMapInfo * info)
 {
-  if ((info->flags & GST_MAP_GL) == 0) {
-    _gl_mem_unmap_cpu_access (gl_mem, info);
-    if (info->flags & GST_MAP_WRITE)
-      gl_mem->transfer_state |= GST_GL_MEMORY_TRANSFER_NEED_UPLOAD;
-  } else {
-    if (info->flags & GST_MAP_WRITE)
-      gl_mem->transfer_state |= GST_GL_MEMORY_TRANSFER_NEED_DOWNLOAD;
-  }
+  GstGLMemoryAllocatorClass *alloc_class;
+
+  alloc_class = GST_GL_MEMORY_ALLOCATOR_GET_CLASS (gl_mem->mem.mem.allocator);
+  g_return_if_fail (alloc_class->unmap != NULL);
+
+  alloc_class->unmap (GST_GL_BASE_MEMORY_CAST (gl_mem), info);
 }
 
-static void
-_gl_mem_copy_thread (GstGLContext * context, gpointer data)
+gboolean
+gst_gl_memory_copy_teximage (GstGLMemory * src, guint tex_id,
+    GstGLTextureTarget out_target, GstVideoGLTextureType out_tex_type,
+    gint out_width, gint out_height)
 {
   const GstGLFuncs *gl;
-  GstGLMemoryCopyParams *copy_params;
-  GstGLMemory *src;
-  guint tex_id;
-  GLuint out_tex_target;
-  GLuint fboId;
-  gsize out_width, out_height, out_stride;
-  GLuint out_gl_format, out_gl_type;
-  GLuint in_gl_format, in_gl_type;
-  gsize in_size, out_size;
+  guint out_gl_format, out_tex_target;
+  GstMapInfo sinfo;
+  guint src_tex_id;
+  guint fbo;
 
-  copy_params = (GstGLMemoryCopyParams *) data;
-  src = copy_params->src;
-  tex_id = copy_params->tex_id;
-  out_tex_target = copy_params->tex_target;
-  out_width = copy_params->out_width;
-  out_height = copy_params->out_height;
-  out_stride = copy_params->out_stride;
-
-  gl = context->gl_vtable;
-  out_gl_format = gst_gl_format_from_gl_texture_type (copy_params->out_format);
-  out_gl_type = GL_UNSIGNED_BYTE;
-  if (copy_params->out_format == GST_VIDEO_GL_TEXTURE_TYPE_RGB16)
-    out_gl_type = GL_UNSIGNED_SHORT_5_6_5;
-  in_gl_format = gst_gl_format_from_gl_texture_type (src->tex_type);
-  in_gl_type = GL_UNSIGNED_BYTE;
-  if (src->tex_type == GST_VIDEO_GL_TEXTURE_TYPE_RGB16)
-    in_gl_type = GL_UNSIGNED_SHORT_5_6_5;
+  gl = src->mem.context->gl_vtable;
+  out_tex_target = gst_gl_texture_target_to_gl (out_target);
+  out_gl_format = gst_gl_format_from_gl_texture_type (out_tex_type);
 
   if (!gl->GenFramebuffers) {
-    gst_gl_context_set_error (context,
-        "Context, EXT_framebuffer_object not supported");
+    GST_CAT_ERROR (GST_CAT_GL_MEMORY, "Framebuffer objects not supported");
     goto error;
   }
 
-  in_size = GL_MEM_HEIGHT (src) * GL_MEM_STRIDE (src);
-  out_size = out_height * out_stride;
-
-  if (copy_params->respecify) {
-    if (in_size != out_size) {
-      GST_ERROR ("Cannot copy between textures with backing data of different"
-          "sizes. input %" G_GSIZE_FORMAT " output %" G_GSIZE_FORMAT, in_size,
-          out_size);
-      goto error;
-    }
+  if (!gst_memory_map (GST_MEMORY_CAST (src), &sinfo,
+          GST_MAP_READ | GST_MAP_GL)) {
+    GST_CAT_ERROR (GST_CAT_GL_MEMORY,
+        "Failed to map source memory for copying");
+    goto error;
   }
+  src_tex_id = *(guint *) sinfo.data;
 
-  if (!tex_id) {
-    guint internal_format;
-    guint out_gl_type;
+  GST_CAT_LOG (GST_CAT_GL_MEMORY, "copying memory %p, tex %u into "
+      "texture %i", src, src_tex_id, tex_id);
 
+  /* FIXME: try and avoid creating and destroying fbo's every copy... */
+  /* create a framebuffer object */
+  gl->GenFramebuffers (1, &fbo);
+  gl->BindFramebuffer (GL_FRAMEBUFFER, fbo);
+
+  gl->FramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+      gst_gl_texture_target_to_gl (src->tex_target), src_tex_id, 0);
+
+//  if (!gst_gl_context_check_framebuffer_status (src->context))
+//    goto fbo_error;
+
+  gl->BindTexture (out_tex_target, tex_id);
+  gl->CopyTexImage2D (out_tex_target, 0, out_gl_format, 0, 0, out_width,
+      out_height, 0);
+
+  gl->BindTexture (out_tex_target, 0);
+  gl->BindFramebuffer (GL_FRAMEBUFFER, 0);
+
+  gl->DeleteFramebuffers (1, &fbo);
+
+  gst_memory_unmap (GST_MEMORY_CAST (src), &sinfo);
+
+  return TRUE;
+
+error:
+  return FALSE;
+}
+
+static void
+_gl_tex_copy_thread (GstGLContext * context, gpointer data)
+{
+  GstGLMemoryCopyParams *copy_params;
+
+  copy_params = (GstGLMemoryCopyParams *) data;
+
+  if (!copy_params->tex_id) {
+    guint internal_format, out_gl_format, out_gl_type, out_tex_target;
+
+    out_tex_target = gst_gl_texture_target_to_gl (copy_params->tex_target);
+    out_gl_format =
+        gst_gl_format_from_gl_texture_type (copy_params->src->tex_type);
     out_gl_type = GL_UNSIGNED_BYTE;
     if (copy_params->out_format == GST_VIDEO_GL_TEXTURE_TYPE_RGB16)
       out_gl_type = GL_UNSIGNED_SHORT_5_6_5;
@@ -986,243 +624,190 @@
         gst_gl_sized_gl_format_from_gl_format_type (context, out_gl_format,
         out_gl_type);
 
-    tex_id =
-        _new_texture (context, out_tex_target, internal_format, out_gl_format,
-        out_gl_type, copy_params->out_width, copy_params->out_height);
+    copy_params->tex_id =
+        _new_texture (context, out_tex_target,
+        internal_format, out_gl_format, out_gl_type, copy_params->out_width,
+        copy_params->out_height);
   }
 
-  if (!tex_id) {
-    GST_WARNING ("Could not create GL texture with context:%p", context);
-  }
-
-  GST_LOG ("copying memory %p, tex %u into texture %i",
-      src, src->tex_id, tex_id);
-
-  /* FIXME: try and avoid creating and destroying fbo's every copy... */
-  /* create a framebuffer object */
-  gl->GenFramebuffers (1, &fboId);
-  gl->BindFramebuffer (GL_FRAMEBUFFER, fboId);
-
-  gl->FramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
-      src->tex_target, src->tex_id, 0);
-
-//  if (!gst_gl_context_check_framebuffer_status (src->context))
-//    goto fbo_error;
-
-  gl->BindTexture (out_tex_target, tex_id);
-  if (copy_params->respecify) {
-    if (!gl->GenBuffers || !src->mem.id) {
-      gst_gl_context_set_error (context, "Cannot reinterpret texture contents "
-          "without pixel buffer objects");
-      gl->BindTexture (out_tex_target, 0);
-      goto fbo_error;
-    }
-
-    if (gst_gl_context_get_gl_api (context) & GST_GL_API_GLES2
-        && (in_gl_format != GL_RGBA || in_gl_type != GL_UNSIGNED_BYTE)) {
-      gst_gl_context_set_error (context, "Cannot copy non RGBA/UNSIGNED_BYTE "
-          "textures on GLES2");
-      gl->BindTexture (out_tex_target, 0);
-      goto fbo_error;
-    }
-
-    GST_TRACE ("copying texture data with size of %u*%u*%u",
-        _gl_format_type_n_bytes (in_gl_format, in_gl_type), src->tex_width,
-        GL_MEM_HEIGHT (src));
-
-    /* copy tex */
-    gl->BindBuffer (GL_PIXEL_PACK_BUFFER, src->mem.id);
-    gl->BufferData (GL_PIXEL_PACK_BUFFER, in_size, NULL, GL_STREAM_COPY);
-    gl->ReadPixels (0, 0, src->tex_width, GL_MEM_HEIGHT (src), in_gl_format,
-        in_gl_type, 0);
-    gl->BindBuffer (GL_PIXEL_PACK_BUFFER, 0);
-
-    gl->BindBuffer (GL_PIXEL_UNPACK_BUFFER, src->mem.id);
-    gl->TexSubImage2D (out_tex_target, 0, 0, 0, out_width, out_height,
-        out_gl_format, out_gl_type, 0);
-
-    gl->BindBuffer (GL_PIXEL_UNPACK_BUFFER, 0);
-  } else {                      /* different sizes */
-    gl->CopyTexImage2D (out_tex_target, 0, out_gl_format, 0, 0, out_width,
-        out_height, 0);
-  }
-
-  gl->BindTexture (out_tex_target, 0);
-  gl->BindFramebuffer (GL_FRAMEBUFFER, 0);
-
-  gl->DeleteFramebuffers (1, &fboId);
-
-  copy_params->tex_id = tex_id;
-  copy_params->result = TRUE;
-
-  return;
-
-/* ERRORS */
-fbo_error:
-  {
-    gl->DeleteFramebuffers (1, &fboId);
-
-    copy_params->tex_id = 0;
-    copy_params->result = FALSE;
-    return;
-  }
-
-error:
-  {
-    copy_params->result = FALSE;
-    return;
-  }
+  copy_params->result = gst_gl_memory_copy_teximage (copy_params->src,
+      copy_params->tex_id, copy_params->tex_target, copy_params->tex_type,
+      copy_params->out_width, copy_params->out_height);
 }
 
 static GstMemory *
-_gl_mem_copy (GstGLMemory * src, gssize offset, gssize size)
+_default_gl_tex_copy (GstGLMemory * src, gssize offset, gssize size)
 {
-  GstGLAllocator *allocator = (GstGLAllocator *) src->mem.mem.allocator;
-  GstMemory *ret = NULL;
+  GstAllocationParams params = { 0, GST_MEMORY_CAST (src)->align, 0, 0 };
+  GstGLBaseMemoryAllocator *base_mem_allocator;
+  GstAllocator *allocator;
+  GstGLMemory *dest = NULL;
+
+  allocator = GST_MEMORY_CAST (src)->allocator;
+  base_mem_allocator = (GstGLBaseMemoryAllocator *) allocator;
+
+  if (src->tex_target == GST_GL_TEXTURE_TARGET_EXTERNAL_OES) {
+    GST_CAT_ERROR (GST_CAT_GL_MEMORY, "Cannot copy External OES textures");
+    return NULL;
+  }
 
   /* If not doing a full copy, then copy to sysmem, the 2D represention of the
    * texture would become wrong */
-  if (offset > 0 || size < src->mem.mem.size) {
-    ret = allocator->fallback_mem_copy (&src->mem.mem, offset, size);
-  } else if (GST_MEMORY_FLAG_IS_SET (src, GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD)) {
-    GstAllocationParams params = { 0, src->mem.mem.align, 0, 0 };
-    GstGLMemory *dest;
-
-    dest = _gl_mem_new (src->mem.mem.allocator, NULL, src->mem.context, &params,
-        &src->info, &src->valign, src->plane, NULL, NULL);
-    dest = (GstGLMemory *) gst_gl_base_buffer_alloc_data ((GstGLBaseBuffer *)
-        dest);
-
-    if (dest == NULL) {
-      GST_WARNING ("Could not copy GL Memory");
-      goto done;
-    }
-
-    memcpy (dest->mem.data, (guint8 *) src->mem.data + src->mem.mem.offset,
-        src->mem.mem.size);
-    GST_MINI_OBJECT_FLAG_SET (dest, GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD);
-    dest->transfer_state |= GST_GL_MEMORY_TRANSFER_NEED_UPLOAD;
-    ret = (GstMemory *) dest;
-  } else {
-    GstAllocationParams params = { 0, src->mem.mem.align, 0, 0 };
-    GstGLMemoryCopyParams copy_params;
-    GstGLMemory *dest;
-
-    copy_params.src = src;
-    copy_params.tex_id = 0;
-    copy_params.out_format = src->tex_type;
-    copy_params.tex_target = src->tex_target;
-    copy_params.out_width = src->tex_width;
-    copy_params.out_height = GL_MEM_HEIGHT (src);
-    copy_params.out_stride = GL_MEM_STRIDE (src);
-    copy_params.respecify = FALSE;
-
-    _gl_mem_copy_thread (src->mem.context, &copy_params);
-
-    if (!copy_params.result) {
-      GST_WARNING ("Could not copy GL Memory");
-      goto done;
-    }
-
-    dest = g_slice_new0 (GstGLMemory);
-    /* don't create our own texture */
-    dest->texture_wrapped = TRUE;
-    _gl_mem_init (dest, src->mem.mem.allocator, NULL, src->mem.context, &params,
-        &src->info, &src->valign, src->plane, NULL, NULL);
-    dest->texture_wrapped = FALSE;
-
-    dest->tex_id = copy_params.tex_id;
-    dest->tex_target = copy_params.tex_target;
-    dest = (GstGLMemory *) gst_gl_base_buffer_alloc_data ((GstGLBaseBuffer *)
-        dest);
-    GST_MINI_OBJECT_FLAG_SET (dest, GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD);
-    dest->transfer_state |= GST_GL_MEMORY_TRANSFER_NEED_DOWNLOAD;
-    ret = (GstMemory *) dest;
+  if (offset > 0 || size < GST_MEMORY_CAST (src)->size) {
+    return base_mem_allocator->fallback_mem_copy (GST_MEMORY_CAST (src), offset,
+        size);
   }
 
-done:
-  return ret;
+  dest = g_new0 (GstGLMemory, 1);
+
+  gst_gl_memory_init (dest, allocator, NULL, src->mem.context, src->tex_target,
+      &params, &src->info, src->plane, &src->valign, NULL, NULL);
+
+  if (GST_MEMORY_FLAG_IS_SET (src, GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD)) {
+    if (!gst_gl_base_memory_memcpy ((GstGLBaseMemory *) src,
+            (GstGLBaseMemory *) dest, offset, size)) {
+      GST_CAT_WARNING (GST_CAT_GL_MEMORY, "Could not copy GL Memory");
+      gst_memory_unref (GST_MEMORY_CAST (dest));
+      return NULL;
+    }
+  } else {
+    GstMapInfo dinfo;
+
+    if (!gst_memory_map (GST_MEMORY_CAST (dest), &dinfo,
+            GST_MAP_WRITE | GST_MAP_GL)) {
+      GST_CAT_WARNING (GST_CAT_GL_MEMORY,
+          "Failed not map destination " "for writing");
+      gst_memory_unref (GST_MEMORY_CAST (dest));
+      return NULL;
+    }
+
+    if (!gst_gl_memory_copy_into ((GstGLMemory *) src,
+            ((GstGLMemory *) dest)->tex_id, src->tex_target,
+            src->tex_type, src->tex_width, GL_MEM_HEIGHT (src))) {
+      GST_CAT_WARNING (GST_CAT_GL_MEMORY, "Could not copy GL Memory");
+      gst_memory_unmap (GST_MEMORY_CAST (dest), &dinfo);
+      gst_memory_unref (GST_MEMORY_CAST (dest));
+      return NULL;
+    }
+
+    gst_memory_unmap (GST_MEMORY_CAST (dest), &dinfo);
+  }
+
+  return (GstMemory *) dest;
 }
 
 static GstMemory *
-_gl_mem_alloc (GstAllocator * allocator, gsize size,
+_gl_tex_copy (GstGLMemory * src, gssize offset, gssize size)
+{
+  GstGLMemoryAllocatorClass *alloc_class;
+
+  alloc_class = GST_GL_MEMORY_ALLOCATOR_GET_CLASS (src->mem.mem.allocator);
+
+  if (src->tex_target == GST_GL_TEXTURE_TARGET_EXTERNAL_OES) {
+    GST_CAT_ERROR (GST_CAT_GL_MEMORY, "Cannot copy External OES textures");
+    return NULL;
+  }
+
+  g_return_val_if_fail (alloc_class->copy, NULL);
+  return (GstMemory *) alloc_class->copy (GST_GL_BASE_MEMORY_CAST (src), offset,
+      size);
+}
+
+static GstMemory *
+_gl_tex_alloc (GstAllocator * allocator, gsize size,
     GstAllocationParams * params)
 {
-  g_warning ("use gst_gl_memory_alloc () to allocate from this "
-      "GstGLMemory allocator");
+  g_warning ("Use gst_gl_base_memory_alloc to allocate from this allocator");
 
   return NULL;
 }
 
 static void
-_gl_mem_destroy (GstGLMemory * gl_mem)
+_gl_tex_destroy (GstGLMemory * gl_mem)
 {
   const GstGLFuncs *gl = gl_mem->mem.context->gl_vtable;
 
   if (gl_mem->tex_id && !gl_mem->texture_wrapped)
     gl->DeleteTextures (1, &gl_mem->tex_id);
+}
 
-  if (gl_mem->mem.id)
-    gl->DeleteBuffers (1, &gl_mem->mem.id);
+static GstGLMemory *
+_default_gl_tex_alloc (GstGLMemoryAllocator * allocator,
+    GstGLVideoAllocationParams * params)
+{
+  GstGLMemory *mem;
+
+  g_return_val_if_fail (params->parent.
+      alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_VIDEO, NULL);
+
+  mem = g_new0 (GstGLMemory, 1);
+
+  if (params->parent.
+      alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE) {
+    mem->tex_id = params->parent.gl_handle;
+    mem->texture_wrapped = TRUE;
+  }
+
+  gst_gl_memory_init (mem, GST_ALLOCATOR_CAST (allocator), NULL,
+      params->parent.context, params->target, params->parent.alloc_params,
+      params->v_info, params->plane, params->valign, params->parent.user_data,
+      params->parent.notify);
+
+  if (params->parent.
+      alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE) {
+    GST_MINI_OBJECT_FLAG_SET (mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD);
+  }
+  if (params->parent.
+      alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_SYSMEM) {
+    mem->mem.data = params->parent.wrapped_data;
+    GST_MINI_OBJECT_FLAG_SET (mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD);
+  }
+
+  return mem;
 }
 
 static void
-_gl_mem_free (GstAllocator * allocator, GstMemory * mem)
+gst_gl_memory_allocator_class_init (GstGLMemoryAllocatorClass * klass)
 {
-  GstGLMemory *gl_mem = (GstGLMemory *) mem;
-
-  GST_ALLOCATOR_CLASS (gst_gl_allocator_parent_class)->free (allocator, mem);
-
-  if (gl_mem->notify)
-    gl_mem->notify (gl_mem->user_data);
-
-  g_slice_free (GstGLMemory, gl_mem);
-}
-
-static void
-gst_gl_allocator_class_init (GstGLAllocatorClass * klass)
-{
-  GstGLBaseBufferAllocatorClass *gl_base;
+  GstGLBaseMemoryAllocatorClass *gl_base;
   GstAllocatorClass *allocator_class;
 
-  gl_base = (GstGLBaseBufferAllocatorClass *) klass;
+  gl_base = (GstGLBaseMemoryAllocatorClass *) klass;
   allocator_class = (GstAllocatorClass *) klass;
 
-  gl_base->create = (GstGLBaseBufferAllocatorCreateFunction) _gl_mem_create;
-  gl_base->map_buffer =
-      (GstGLBaseBufferAllocatorMapBufferFunction) _gl_mem_map_buffer;
-  gl_base->unmap_buffer =
-      (GstGLBaseBufferAllocatorUnmapBufferFunction) _gl_mem_unmap_buffer;
-  gl_base->copy = (GstGLBaseBufferAllocatorCopyFunction) _gl_mem_copy;
-  gl_base->destroy = (GstGLBaseBufferAllocatorDestroyFunction) _gl_mem_destroy;
+  klass->map = (GstGLBaseMemoryAllocatorMapFunction) _default_gl_tex_map;
+  klass->unmap = (GstGLBaseMemoryAllocatorUnmapFunction) _default_gl_tex_unmap;
+  klass->copy = (GstGLBaseMemoryAllocatorCopyFunction) _default_gl_tex_copy;
 
-  allocator_class->alloc = _gl_mem_alloc;
-  allocator_class->free = _gl_mem_free;
+  gl_base->alloc =
+      (GstGLBaseMemoryAllocatorAllocFunction) _default_gl_tex_alloc;
+  gl_base->create = (GstGLBaseMemoryAllocatorCreateFunction) _gl_tex_create;
+  gl_base->map = (GstGLBaseMemoryAllocatorMapFunction) _gl_tex_map;
+  gl_base->unmap = (GstGLBaseMemoryAllocatorUnmapFunction) _gl_tex_unmap;
+  gl_base->copy = (GstGLBaseMemoryAllocatorCopyFunction) _gl_tex_copy;
+  gl_base->destroy = (GstGLBaseMemoryAllocatorDestroyFunction) _gl_tex_destroy;
+
+  allocator_class->alloc = _gl_tex_alloc;
 }
 
 static void
-gst_gl_allocator_init (GstGLAllocator * allocator)
+gst_gl_memory_allocator_init (GstGLMemoryAllocator * allocator)
 {
   GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator);
 
-  /* Keep the fallback copy function around, we will need it when copying with
-   * at an offset or smaller size */
-  allocator->fallback_mem_copy = alloc->mem_copy;
-
-  alloc->mem_type = GST_GL_MEMORY_ALLOCATOR;
+  alloc->mem_type = GST_GL_MEMORY_ALLOCATOR_NAME;
 
   GST_OBJECT_FLAG_SET (allocator, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC);
 }
 
 /**
- * gst_gl_memory_copy_into_texture:
+ * gst_gl_memory_copy_into:
  * @gl_mem:a #GstGLMemory
  * @tex_id:OpenGL texture id
- * @tex_type: a #GstVideoGLTextureType
+ * @taget: the #GstGLTextureTarget
+ * @tex_type: the #GstVideoGLTextureType
  * @width: width of @tex_id
  * @height: height of @tex_id
- * @stride: stride of the backing texture data
- * @respecify: whether to copy the data or copy per texel
  *
  * Copies @gl_mem into the texture specfified by @tex_id.  The format of @tex_id
  * is specified by @tex_type, @width and @height.
@@ -1241,182 +826,25 @@
  * Returns: Whether the copy suceeded
  */
 gboolean
-gst_gl_memory_copy_into_texture (GstGLMemory * gl_mem, guint tex_id,
-    GstVideoGLTextureType tex_type, gint width, gint height, gint stride,
-    gboolean respecify)
+gst_gl_memory_copy_into (GstGLMemory * gl_mem, guint tex_id,
+    GstGLTextureTarget target, GstVideoGLTextureType tex_type, gint width,
+    gint height)
 {
   GstGLMemoryCopyParams copy_params;
 
   copy_params.src = gl_mem;
-  copy_params.tex_target = gl_mem->tex_target;
   copy_params.tex_id = tex_id;
-  copy_params.out_format = tex_type;
+  copy_params.tex_target = target;
+  copy_params.tex_type = tex_type;
   copy_params.out_width = width;
   copy_params.out_height = height;
-  copy_params.out_stride = stride;
-  copy_params.respecify = respecify;
 
-  gst_gl_context_thread_add (gl_mem->mem.context, _gl_mem_copy_thread,
+  gst_gl_context_thread_add (gl_mem->mem.context, _gl_tex_copy_thread,
       &copy_params);
 
   return copy_params.result;
 }
 
-/**
- * gst_gl_memory_wrapped_texture:
- * @context: a #GstGLContext
- * @texture_id: the GL texture handle
- * @texture_target: the GL texture target
- * @info: the #GstVideoInfo of the memory
- * @plane: The plane this memory will represent
- * @user_data: user data
- * @notify: Destroy callback for the user data
- *
- * Wraps a texture handle into a #GstGLMemory.
- *
- * Returns: a newly allocated #GstGLMemory
- */
-GstGLMemory *
-gst_gl_memory_wrapped_texture (GstGLContext * context,
-    guint texture_id, guint texture_target,
-    GstVideoInfo * info, guint plane, GstVideoAlignment * valign,
-    gpointer user_data, GDestroyNotify notify)
-{
-  GstGLMemory *mem;
-
-  mem = g_slice_new0 (GstGLMemory);
-
-  mem->tex_id = texture_id;
-  mem->texture_wrapped = TRUE;
-
-  _gl_mem_init (mem, _gl_allocator, NULL, context, NULL, info, valign, plane,
-      user_data, notify);
-
-  mem->tex_target = texture_target;
-
-  mem = (GstGLMemory *) gst_gl_base_buffer_alloc_data ((GstGLBaseBuffer *) mem);
-  GST_MINI_OBJECT_FLAG_SET (mem, GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD);
-  mem->transfer_state |= GST_GL_MEMORY_TRANSFER_NEED_DOWNLOAD;
-
-  return mem;
-}
-
-/**
- * gst_gl_memory_alloc:
- * @context:a #GstGLContext
- * @params: a #GstAllocationParams
- * @info: the #GstVideoInfo of the memory
- * @plane: the plane this memory will represent
- * @valign: the #GstVideoAlignment applied to @info
- *
- * Allocated a new #GstGlMemory.
- *
- * Returns: a #GstMemory object with a GL texture specified by @vinfo
- *          from @context
- */
-GstMemory *
-gst_gl_memory_alloc (GstGLContext * context, GstAllocationParams * params,
-    GstVideoInfo * info, guint plane, GstVideoAlignment * valign)
-{
-  GstGLMemory *mem;
-
-  mem = _gl_mem_new (_gl_allocator, NULL, context, params, info, valign, plane,
-      NULL, NULL);
-  mem = (GstGLMemory *) gst_gl_base_buffer_alloc_data ((GstGLBaseBuffer *) mem);
-
-  return (GstMemory *) mem;
-}
-
-/**
- * gst_gl_memory_wrapped:
- * @context:a #GstGLContext
- * @info: the #GstVideoInfo of the memory and data
- * @plane: the plane this memory will represent
- * @valign: the #GstVideoAlignment applied to @info
- * @data: the data to wrap
- * @user_data: data called with for @notify
- * @notify: function called with @user_data when @data needs to be freed
- * 
- * Wrapped @data into a #GstGLMemory. This version will account for padding
- * added to the allocation and expressed through @valign.
- *
- * Returns: a #GstGLMemory object with a GL texture specified by @v_info
- *          from @context and contents specified by @data
- */
-GstGLMemory *
-gst_gl_memory_wrapped (GstGLContext * context, GstVideoInfo * info,
-    guint plane, GstVideoAlignment * valign, gpointer data, gpointer user_data,
-    GDestroyNotify notify)
-{
-  GstGLMemory *mem;
-
-  mem = _gl_mem_new (_gl_allocator, NULL, context, NULL, info, valign, plane,
-      user_data, notify);
-  if (!mem)
-    return NULL;
-
-  mem->mem.data = data;
-
-  GST_MINI_OBJECT_FLAG_SET (mem, GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD);
-  mem->transfer_state |= GST_GL_MEMORY_TRANSFER_NEED_UPLOAD;
-
-  return mem;
-}
-
-static void
-_download_transfer (GstGLContext * context, GstGLMemory * gl_mem)
-{
-  GstGLBaseBuffer *mem = (GstGLBaseBuffer *) gl_mem;
-
-  g_mutex_lock (&mem->lock);
-  if (_read_pixels_to_pbo (gl_mem))
-    GST_CAT_TRACE (GST_CAT_GL_MEMORY, "optimistic download of texture %u "
-        "using pbo %u", gl_mem->tex_id, gl_mem->mem.id);
-  g_mutex_unlock (&mem->lock);
-}
-
-void
-gst_gl_memory_download_transfer (GstGLMemory * gl_mem)
-{
-  g_return_if_fail (gst_is_gl_memory ((GstMemory *) gl_mem));
-
-  gst_gl_context_thread_add (gl_mem->mem.context,
-      (GstGLContextThreadFunc) _download_transfer, gl_mem);
-}
-
-static void
-_upload_transfer (GstGLContext * context, GstGLMemory * gl_mem)
-{
-  GstGLBaseBufferAllocatorClass *alloc_class;
-  GstGLBaseBuffer *mem = (GstGLBaseBuffer *) gl_mem;
-  GstMapInfo info;
-
-  alloc_class =
-      GST_GL_BASE_BUFFER_ALLOCATOR_CLASS (gst_gl_allocator_parent_class);
-
-  info.flags = GST_MAP_READ | GST_MAP_GL;
-  info.memory = (GstMemory *) mem;
-  /* from gst_memory_map() */
-  info.size = mem->mem.size;
-  info.maxsize = mem->mem.maxsize - mem->mem.offset;
-
-  g_mutex_lock (&mem->lock);
-  mem->target = GL_PIXEL_UNPACK_BUFFER;
-  alloc_class->map_buffer (mem, &info, mem->mem.maxsize);
-  alloc_class->unmap_buffer (mem, &info);
-  g_mutex_unlock (&mem->lock);
-}
-
-void
-gst_gl_memory_upload_transfer (GstGLMemory * gl_mem)
-{
-  g_return_if_fail (gst_is_gl_memory ((GstMemory *) gl_mem));
-
-  if (CONTEXT_SUPPORTS_PBO_UPLOAD (gl_mem->mem.context))
-    gst_gl_context_thread_add (gl_mem->mem.context,
-        (GstGLContextThreadFunc) _upload_transfer, gl_mem);
-}
-
 gint
 gst_gl_memory_get_texture_width (GstGLMemory * gl_mem)
 {
@@ -1433,24 +861,51 @@
   return _get_plane_height (&gl_mem->info, gl_mem->plane);
 }
 
+GstVideoGLTextureType
+gst_gl_memory_get_texture_type (GstGLMemory * gl_mem)
+{
+  g_return_val_if_fail (gst_is_gl_memory ((GstMemory *) gl_mem), 0);
+
+  return gl_mem->tex_type;
+}
+
+GstGLTextureTarget
+gst_gl_memory_get_texture_target (GstGLMemory * gl_mem)
+{
+  g_return_val_if_fail (gst_is_gl_memory ((GstMemory *) gl_mem), 0);
+
+  return gl_mem->tex_target;
+}
+
+guint
+gst_gl_memory_get_texture_id (GstGLMemory * gl_mem)
+{
+  g_return_val_if_fail (gst_is_gl_memory ((GstMemory *) gl_mem), 0);
+
+  return gl_mem->tex_id;
+}
+
 /**
- * gst_gl_memory_init:
+ * gst_gl_memory_init_once:
  *
- * Initializes the GL Memory allocator. It is safe to call this function
+ * Initializes the GL Base Texture allocator. It is safe to call this function
  * multiple times.  This must be called before any other GstGLMemory operation.
  */
 void
-gst_gl_memory_init (void)
+gst_gl_memory_init_once (void)
 {
   static volatile gsize _init = 0;
 
   if (g_once_init_enter (&_init)) {
-    GST_DEBUG_CATEGORY_INIT (GST_CAT_GL_MEMORY, "glmemory", 0, "OpenGL Memory");
+    gst_gl_base_memory_init_once ();
 
-    _gl_allocator = g_object_new (gst_gl_allocator_get_type (), NULL);
+    GST_DEBUG_CATEGORY_INIT (GST_CAT_GL_MEMORY, "glbasetexture", 0,
+        "OpenGL Base Texture Memory");
 
-    gst_allocator_register (GST_GL_MEMORY_ALLOCATOR,
-        gst_object_ref (_gl_allocator));
+    _gl_memory_allocator = g_object_new (GST_TYPE_GL_MEMORY_ALLOCATOR, NULL);
+
+    gst_allocator_register (GST_GL_MEMORY_ALLOCATOR_NAME, _gl_memory_allocator);
+
     g_once_init_leave (&_init, 1);
   }
 }
@@ -1465,85 +920,275 @@
 gst_is_gl_memory (GstMemory * mem)
 {
   return mem != NULL && mem->allocator != NULL
-      && g_type_is_a (G_OBJECT_TYPE (mem->allocator), GST_TYPE_GL_ALLOCATOR);
+      && g_type_is_a (G_OBJECT_TYPE (mem->allocator),
+      GST_TYPE_GL_MEMORY_ALLOCATOR);
+}
+
+static void
+_gst_gl_video_allocation_params_set_video_alignment (GstGLVideoAllocationParams
+    * params, GstVideoAlignment * valign)
+{
+  g_return_if_fail (params != NULL);
+
+  if (!params->valign)
+    params->valign = g_new0 (GstVideoAlignment, 1);
+
+  if (valign) {
+    *params->valign = *valign;
+  } else {
+    gst_video_alignment_reset (params->valign);
+  }
+}
+
+gboolean
+gst_gl_video_allocation_params_init_full (GstGLVideoAllocationParams * params,
+    gsize struct_size, guint alloc_flags, GstGLAllocationParamsCopyFunc copy,
+    GstGLAllocationParamsFreeFunc free, GstGLContext * context,
+    GstAllocationParams * alloc_params, GstVideoInfo * v_info,
+    guint plane, GstVideoAlignment * valign, GstGLTextureTarget target,
+    gpointer wrapped_data, guint gl_handle, gpointer user_data,
+    GDestroyNotify notify)
+{
+  guint i;
+
+  g_return_val_if_fail (params != NULL, FALSE);
+  g_return_val_if_fail (copy != NULL, FALSE);
+  g_return_val_if_fail (free != NULL, FALSE);
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), FALSE);
+  g_return_val_if_fail (v_info != NULL, FALSE);
+
+  memset (params, 0, sizeof (*params));
+
+  if (!gst_gl_allocation_params_init ((GstGLAllocationParams *) params,
+          struct_size, alloc_flags, copy, free, context, 0, alloc_params,
+          wrapped_data, gl_handle, user_data, notify))
+    return FALSE;
+
+  params->v_info = g_new0 (GstVideoInfo, 1);
+  *params->v_info = *v_info;
+  for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) {
+    params->v_info->offset[i] = v_info->offset[i];
+    params->v_info->stride[i] = v_info->stride[i];
+  }
+  _gst_gl_video_allocation_params_set_video_alignment (params, valign);
+  params->target = target;
+  params->plane = plane;
+
+  return TRUE;
+}
+
+/**
+ * gst_gl_video_allocation_params_new:
+ * @context: a #GstGLContext
+ * @alloc_params: (allow-none): the #GstAllocationParams for @wrapped_data
+ * @v_info: the #GstVideoInfo for @wrapped_data
+ * @plane: the video plane @wrapped_data represents
+ * @valign: (allow-none): any #GstVideoAlignment applied to symem mappings of @wrapped_data
+ * @target: the #GstGLTextureTarget for @wrapped_data
+ *
+ * Returns: a new #GstGLVideoAllocationParams for allocating #GstGLMemory's
+ */
+GstGLVideoAllocationParams *
+gst_gl_video_allocation_params_new (GstGLContext * context,
+    GstAllocationParams * alloc_params, GstVideoInfo * v_info, guint plane,
+    GstVideoAlignment * valign, GstGLTextureTarget target)
+{
+  GstGLVideoAllocationParams *params = g_new0 (GstGLVideoAllocationParams, 1);
+
+  if (!gst_gl_video_allocation_params_init_full (params,
+          sizeof (GstGLVideoAllocationParams),
+          GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_ALLOC |
+          GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_VIDEO,
+          (GstGLAllocationParamsCopyFunc)
+          gst_gl_video_allocation_params_copy_data,
+          (GstGLAllocationParamsFreeFunc)
+          gst_gl_video_allocation_params_free_data, context, alloc_params,
+          v_info, plane, valign, target, NULL, 0, NULL, NULL)) {
+    g_free (params);
+    return NULL;
+  }
+
+  return params;
+}
+
+/**
+ * gst_gl_video_allocation_params_new_wrapped_data:
+ * @context: a #GstGLContext
+ * @alloc_params: (allow-none): the #GstAllocationParams for @wrapped_data
+ * @v_info: the #GstVideoInfo for @wrapped_data
+ * @plane: the video plane @wrapped_data represents
+ * @valign: (allow-none): any #GstVideoAlignment applied to symem mappings of @wrapped_data
+ * @target: the #GstGLTextureTarget for @wrapped_data
+ * @wrapped_data: the data pointer to wrap
+ * @user_data: (allow-none): user data to call @notify with
+ * @notify: (allow-none): a #GDestroyNotify
+ *
+ * Returns: a new #GstGLVideoAllocationParams for wrapping @wrapped_data
+ */
+GstGLVideoAllocationParams *
+gst_gl_video_allocation_params_new_wrapped_data (GstGLContext * context,
+    GstAllocationParams * alloc_params, GstVideoInfo * v_info, guint plane,
+    GstVideoAlignment * valign, GstGLTextureTarget target,
+    gpointer wrapped_data, gpointer user_data, GDestroyNotify notify)
+{
+  GstGLVideoAllocationParams *params = g_new0 (GstGLVideoAllocationParams, 1);
+
+  if (!gst_gl_video_allocation_params_init_full (params,
+          sizeof (GstGLVideoAllocationParams),
+          GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_SYSMEM |
+          GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_VIDEO,
+          (GstGLAllocationParamsCopyFunc)
+          gst_gl_video_allocation_params_copy_data,
+          (GstGLAllocationParamsFreeFunc)
+          gst_gl_video_allocation_params_free_data, context, alloc_params,
+          v_info, plane, valign, target, wrapped_data, 0, user_data, notify)) {
+    g_free (params);
+    return NULL;
+  }
+
+  return params;
+}
+
+/**
+ * gst_gl_video_allocation_params_new_wrapped_texture:
+ * @context: a #GstGLContext
+ * @alloc_params: (allow-none): the #GstAllocationParams for @tex_id
+ * @v_info: the #GstVideoInfo for @tex_id
+ * @plane: the video plane @tex_id represents
+ * @valign: (allow-none): any #GstVideoAlignment applied to symem mappings of @tex_id
+ * @target: the #GstGLTextureTarget for @tex_id
+ * @tex_id: the GL texture to wrap
+ * @user_data: (allow-none): user data to call @notify with
+ * @notify: (allow-none): a #GDestroyNotify
+ *
+ * Returns: a new #GstGLVideoAllocationParams for wrapping @tex_id
+ */
+GstGLVideoAllocationParams *
+gst_gl_video_allocation_params_new_wrapped_texture (GstGLContext * context,
+    GstAllocationParams * alloc_params, GstVideoInfo * v_info, guint plane,
+    GstVideoAlignment * valign, GstGLTextureTarget target,
+    guint tex_id, gpointer user_data, GDestroyNotify notify)
+{
+  GstGLVideoAllocationParams *params = g_new0 (GstGLVideoAllocationParams, 1);
+
+  if (!gst_gl_video_allocation_params_init_full (params,
+          sizeof (GstGLVideoAllocationParams),
+          GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE |
+          GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_VIDEO,
+          (GstGLAllocationParamsCopyFunc)
+          gst_gl_video_allocation_params_copy_data,
+          (GstGLAllocationParamsFreeFunc)
+          gst_gl_video_allocation_params_free_data, context, alloc_params,
+          v_info, plane, valign, target, NULL, tex_id, user_data, notify)) {
+    g_free (params);
+    return NULL;
+  }
+
+  return params;
+}
+
+void
+gst_gl_video_allocation_params_free_data (GstGLVideoAllocationParams * params)
+{
+  g_free (params->v_info);
+  g_free (params->valign);
+
+  gst_gl_allocation_params_free_data (&params->parent);
+}
+
+void
+gst_gl_video_allocation_params_copy_data (GstGLVideoAllocationParams * src_vid,
+    GstGLVideoAllocationParams * dest_vid)
+{
+  GstGLAllocationParams *src = (GstGLAllocationParams *) src_vid;
+  GstGLAllocationParams *dest = (GstGLAllocationParams *) dest_vid;
+  guint i;
+
+  gst_gl_allocation_params_copy_data (src, dest);
+
+  dest_vid->v_info = g_new0 (GstVideoInfo, 1);
+  *dest_vid->v_info = *src_vid->v_info;
+  for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) {
+    dest_vid->v_info->offset[i] = src_vid->v_info->offset[i];
+    dest_vid->v_info->stride[i] = src_vid->v_info->stride[i];
+  }
+  _gst_gl_video_allocation_params_set_video_alignment (dest_vid,
+      src_vid->valign);
+  dest_vid->target = src_vid->target;
+  dest_vid->plane = src_vid->plane;
 }
 
 /**
  * gst_gl_memory_setup_buffer:
- * @context: a #GstGLContext
- * @params: a #GstAllocationParams
- * @info: a #GstVideoInfo
- * @valign: the #GstVideoAlignment applied to @info
- * @buffer: a #GstBuffer
+ * @allocator: the @GstGLMemoryAllocator to allocate from
+ * @buffer: a #GstBuffer to setup
+ * @params: the #GstGLVideoAllocationParams to allocate with
  *
- * Adds the required #GstGLMemory<!--  -->s with the correct configuration to
- * @buffer based on @info. This version handles padding through @valign.
- *
- * Returns: whether the memory's were sucessfully added.
+ * Returns: whether the buffer was correctly setup
  */
 gboolean
-gst_gl_memory_setup_buffer (GstGLContext * context,
-    GstAllocationParams * params, GstVideoInfo * info,
-    GstVideoAlignment * valign, GstBuffer * buffer)
+gst_gl_memory_setup_buffer (GstGLMemoryAllocator * allocator,
+    GstBuffer * buffer, GstGLVideoAllocationParams * params)
 {
-  GstGLMemory *gl_mem[GST_VIDEO_MAX_PLANES] = { NULL, };
+  GstGLBaseMemoryAllocator *base_allocator;
   guint n_mem, i, v, views;
 
-  n_mem = GST_VIDEO_INFO_N_PLANES (info);
+  g_return_val_if_fail (params != NULL, FALSE);
+  g_return_val_if_fail ((params->parent.
+          alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_SYSMEM)
+      == 0, FALSE);
+  g_return_val_if_fail ((params->parent.alloc_flags &
+          GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE) == 0, FALSE);
+  g_return_val_if_fail (params->parent.
+      alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_VIDEO, FALSE);
 
-  if (GST_VIDEO_INFO_MULTIVIEW_MODE (info) ==
+  base_allocator = GST_GL_BASE_MEMORY_ALLOCATOR (allocator);
+  n_mem = GST_VIDEO_INFO_N_PLANES (params->v_info);
+
+  if (GST_VIDEO_INFO_MULTIVIEW_MODE (params->v_info) ==
       GST_VIDEO_MULTIVIEW_MODE_SEPARATED)
-    views = info->views;
+    views = params->v_info->views;
   else
     views = 1;
 
   for (v = 0; v < views; v++) {
     for (i = 0; i < n_mem; i++) {
-      gl_mem[i] =
-          (GstGLMemory *) gst_gl_memory_alloc (context, params, info, i,
-          valign);
-      if (gl_mem[i] == NULL)
+      GstGLMemory *gl_mem;
+
+      params->plane = i;
+
+      if (!(gl_mem = (GstGLMemory *) gst_gl_base_memory_alloc (base_allocator,
+                  (GstGLAllocationParams *) params)))
         return FALSE;
 
-      gst_buffer_append_memory (buffer, (GstMemory *) gl_mem[i]);
+      gst_buffer_append_memory (buffer, (GstMemory *) gl_mem);
     }
 
     gst_buffer_add_video_meta_full (buffer, v,
-        GST_VIDEO_INFO_FORMAT (info), GST_VIDEO_INFO_WIDTH (info),
-        GST_VIDEO_INFO_HEIGHT (info), n_mem, info->offset, info->stride);
+        GST_VIDEO_INFO_FORMAT (params->v_info),
+        GST_VIDEO_INFO_WIDTH (params->v_info),
+        GST_VIDEO_INFO_HEIGHT (params->v_info), n_mem, params->v_info->offset,
+        params->v_info->stride);
   }
 
   return TRUE;
 }
 
-/**
- * gst_gl_memory_setup_wrapped:
- * @context: a #GstGLContext
- * @info: a #GstVideoInfo
- * @valign: a #GstVideoInfo
- * @data: a list of per plane data pointers
- * @textures: (transfer out): a list of #GstGLMemory
- * @user_data: user data for the destroy function
- * @notify: A function called each time a memory is freed
- *
- * Wraps per plane data pointer in @data into the corresponding entry in
- * @textures based on @info and padding from @valign. Note that the @notify
- * will be called as many time as there is planes.
- *
- * Returns: whether the memory's were sucessfully created.
- */
-gboolean
-gst_gl_memory_setup_wrapped (GstGLContext * context, GstVideoInfo * info,
-    GstVideoAlignment * valign, gpointer data[GST_VIDEO_MAX_PLANES],
-    GstGLMemory * textures[GST_VIDEO_MAX_PLANES], gpointer user_data,
-    GDestroyNotify notify)
+GstGLMemoryAllocator *
+gst_gl_memory_allocator_get_default (GstGLContext * context)
 {
-  gint i;
+  GstGLMemoryAllocator *allocator = NULL;
 
-  for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) {
-    textures[i] = (GstGLMemory *) gst_gl_memory_wrapped (context, info, i,
-        valign, data[i], user_data, notify);
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), NULL);
+
+  if (USING_OPENGL (context) || USING_OPENGL3 (context)
+      || USING_GLES3 (context)) {
+    allocator = (GstGLMemoryAllocator *)
+        gst_allocator_find (GST_GL_MEMORY_PBO_ALLOCATOR_NAME);
+  } else {
+    allocator = (GstGLMemoryAllocator *)
+        gst_allocator_find (GST_GL_MEMORY_ALLOCATOR_NAME);
   }
 
-  return TRUE;
+  return allocator;
 }
diff --git a/gst-libs/gst/gl/gstglmemory.h b/gst-libs/gst/gl/gstglmemory.h
index 7bc4607..3dbf0ed 100644
--- a/gst-libs/gst/gl/gstglmemory.h
+++ b/gst-libs/gst/gl/gstglmemory.h
@@ -1,6 +1,6 @@
 /*
  * GStreamer
- * Copyright (C) 2012 Matthew Waters <ystreet00@gmail.com>
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.com>
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Library General Public
@@ -26,29 +26,27 @@
 #include <gst/gstmemory.h>
 #include <gst/video/video.h>
 
-#include <gst/gl/gstglbasebuffer.h>
-#include <gst/gl/gl.h>
+#include <gst/gl/gstglbasememory.h>
 
 G_BEGIN_DECLS
 
-#define GST_TYPE_GL_ALLOCATOR (gst_gl_allocator_get_type())
-GType gst_gl_allocator_get_type(void);
+#define GST_TYPE_GL_MEMORY_ALLOCATOR (gst_gl_memory_allocator_get_type())
+GType gst_gl_memory_allocator_get_type(void);
 
-#define GST_IS_GL_ALLOCATOR(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GL_ALLOCATOR))
-#define GST_IS_GL_ALLOCATOR_CLASS(klass)      (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GL_ALLOCATOR))
-#define GST_GL_ALLOCATOR_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_GL_ALLOCATOR, GstGLAllocatorClass))
-#define GST_GL_ALLOCATOR(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GL_ALLOCATOR, GstGLAllocator))
-#define GST_GL_ALLOCATOR_CLASS(klass)         (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GL_ALLOCATOR, GstGLAllocatorClass))
-#define GST_GL_ALLOCATOR_CAST(obj)            ((GstGLAllocator *)(obj))
+#define GST_IS_GL_MEMORY_ALLOCATOR(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GL_MEMORY_ALLOCATOR))
+#define GST_IS_GL_MEMORY_ALLOCATOR_CLASS(klass)      (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GL_MEMORY_ALLOCATOR))
+#define GST_GL_MEMORY_ALLOCATOR_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_GL_MEMORY_ALLOCATOR, GstGLMemoryAllocatorClass))
+#define GST_GL_MEMORY_ALLOCATOR(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GL_MEMORY_ALLOCATOR, GstGLMemoryAllocator))
+#define GST_GL_MEMORY_ALLOCATOR_CLASS(klass)         (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GL_MEMORY_ALLOCATOR, GstGLMemoryAllocatorClass))
+#define GST_GL_MEMORY_ALLOCATOR_CAST(obj)            ((GstGLMemoryAllocator *)(obj))
 
-typedef enum _GstGLMemoryTransfer
-{
-  /* force a transfer between the texture and the PBO (if available) */
-  GST_GL_MEMORY_TRANSFER_NEED_UPLOAD = (1 << 0),
-  GST_GL_MEMORY_TRANSFER_NEED_DOWNLOAD = (1 << 1),
-} GstGLMemoryTransfer;
+#define GST_GL_MEMORY_CAST(obj) ((GstGLMemory *) obj)
 
-#define GST_GL_MEMORY_ADD_TRANSFER(mem,state) ((GstGLMemory *)mem)->transfer_state |= state
+#define GST_CAPS_FEATURE_MEMORY_GL_MEMORY "memory:GLMemory"
+#define GST_GL_MEMORY_VIDEO_FORMATS_STR \
+    "{ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, " \
+    "AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, " \
+    "GRAY8, GRAY16_LE, GRAY16_BE }"
 
 /**
  * GstGLMemory:
@@ -66,118 +64,160 @@
  */
 struct _GstGLMemory
 {
-  GstGLBaseBuffer       mem;
+  GstGLBaseMemory           mem;
 
-  guint                 tex_id;
-  guint                 tex_target;
-  GstVideoGLTextureType tex_type;
-  GstVideoInfo          info;
-  GstVideoAlignment     valign;
-  guint                 plane;
-  gfloat                tex_scaling[2];
+  guint                     tex_id;
+  GstGLTextureTarget        tex_target;
+  GstVideoGLTextureType     tex_type;
+  GstVideoInfo              info;
+  GstVideoAlignment         valign;
+  guint                     plane;
+  gfloat                    tex_scaling[2];
 
-  /* <private> */
-  GstGLMemoryTransfer   transfer_state;
-  gboolean              texture_wrapped;
-  GDestroyNotify        notify;
-  gpointer              user_data;
-  guint                 unpack_length;
-  guint                 tex_width;
+  /* <protected> */
+  gboolean                  texture_wrapped;
+  guint                     unpack_length;
+  guint                     tex_width;
 };
 
-#define GST_CAPS_FEATURE_MEMORY_GL_MEMORY "memory:GLMemory"
-#define GST_GL_MEMORY_VIDEO_FORMATS_STR \
-    "{ RGBA, BGRA, RGBx, BGRx, ARGB, ABGR, xRGB, xBGR, RGB, BGR, RGB16, BGR16, " \
-    "AYUV, I420, YV12, NV12, NV21, YUY2, UYVY, Y41B, Y42B, Y444, " \
-    "GRAY8, GRAY16_LE, GRAY16_BE }"
+typedef struct _GstGLVideoAllocationParams GstGLVideoAllocationParams;
+
+#define GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_VIDEO (1 << 3)
+
+struct _GstGLVideoAllocationParams
+{
+  GstGLAllocationParams  parent;
+
+  GstVideoInfo          *v_info;
+  guint                  plane;
+  GstVideoAlignment     *valign;
+  GstGLTextureTarget     target;
+};
+
+gboolean        gst_gl_video_allocation_params_init_full        (GstGLVideoAllocationParams * params,
+                                                                 gsize struct_size,
+                                                                 guint alloc_flags,
+                                                                 GstGLAllocationParamsCopyFunc copy,
+                                                                 GstGLAllocationParamsFreeFunc free,
+                                                                 GstGLContext * context,
+                                                                 GstAllocationParams * alloc_params,
+                                                                 GstVideoInfo * v_info,
+                                                                 guint plane,
+                                                                 GstVideoAlignment * valign,
+                                                                 GstGLTextureTarget target,
+                                                                 gpointer wrapped_data,
+                                                                 guint gl_handle,
+                                                                 gpointer user_data,
+                                                                 GDestroyNotify notify);
+GstGLVideoAllocationParams * gst_gl_video_allocation_params_new (GstGLContext * context,
+                                                                 GstAllocationParams * alloc_params,
+                                                                 GstVideoInfo * v_info,
+                                                                 guint plane,
+                                                                 GstVideoAlignment * valign,
+                                                                 GstGLTextureTarget target);
+GstGLVideoAllocationParams * gst_gl_video_allocation_params_new_wrapped_data    (GstGLContext * context,
+                                                                                 GstAllocationParams * alloc_params,
+                                                                                 GstVideoInfo * v_info,
+                                                                                 guint plane,
+                                                                                 GstVideoAlignment * valign,
+                                                                                 GstGLTextureTarget target,
+                                                                                 gpointer wrapped_data,
+                                                                                 gpointer user_data,
+                                                                                 GDestroyNotify notify);
+
+GstGLVideoAllocationParams * gst_gl_video_allocation_params_new_wrapped_texture (GstGLContext * context,
+                                                                                 GstAllocationParams * alloc_params,
+                                                                                 GstVideoInfo * v_info,
+                                                                                 guint plane,
+                                                                                 GstVideoAlignment * valign,
+                                                                                 GstGLTextureTarget target,
+                                                                                 guint tex_id,
+                                                                                 gpointer user_data,
+                                                                                 GDestroyNotify notify);
+
+/* subclass usage */
+void            gst_gl_video_allocation_params_free_data    (GstGLVideoAllocationParams * params);
+/* subclass usage */
+void            gst_gl_video_allocation_params_copy_data    (GstGLVideoAllocationParams * src,
+                                                             GstGLVideoAllocationParams * dest);
 
 /**
- * GST_GL_MEMORY_ALLOCATOR:
+ * GstGLMemoryAllocator
+ *
+ * Opaque #GstGLMemoryAllocator struct
+ */
+struct _GstGLMemoryAllocator
+{
+  GstGLBaseMemoryAllocator parent;
+};
+
+/**
+ * GstGLMemoryAllocatorClass:
+ *
+ * The #GstGLMemoryAllocatorClass only contains private data
+ */
+struct _GstGLMemoryAllocatorClass
+{
+  GstGLBaseMemoryAllocatorClass             parent_class;
+
+  GstGLBaseMemoryAllocatorMapFunction       map;
+  GstGLBaseMemoryAllocatorCopyFunction      copy;
+  GstGLBaseMemoryAllocatorUnmapFunction     unmap;
+};
+
+#include <gst/gl/gstglbasememory.h>
+
+/**
+ * GST_GL_MEMORY_ALLOCATOR_NAME:
  *
  * The name of the GL memory allocator
  */
-#define GST_GL_MEMORY_ALLOCATOR   "GLMemory"
+#define GST_GL_MEMORY_ALLOCATOR_NAME   "GLMemory"
 
-void          gst_gl_memory_init (void);
-gboolean      gst_is_gl_memory (GstMemory * mem);
+void            gst_gl_memory_init_once (void);
+gboolean        gst_is_gl_memory (GstMemory * mem);
 
-GstMemory *   gst_gl_memory_alloc   (GstGLContext * context,
-                                     GstAllocationParams *params,
-                                     GstVideoInfo * info,
-                                     guint plane,
-                                     GstVideoAlignment *valign);
-GstGLMemory * gst_gl_memory_wrapped (GstGLContext * context,
-                                     GstVideoInfo * info,
-                                     guint plane,
-                                     GstVideoAlignment *valign,
-                                     gpointer data,
-                                     gpointer user_data,
-                                     GDestroyNotify notify);
-GstGLMemory * gst_gl_memory_wrapped_texture (GstGLContext * context,
-                                             guint texture_id,
-                                             guint texture_target,
-                                             GstVideoInfo * info,
-                                             guint plane,
-                                             GstVideoAlignment *valign,
-                                             gpointer user_data,
-                                             GDestroyNotify notify);
+void            gst_gl_memory_init              (GstGLMemory * mem,
+                                                 GstAllocator * allocator,
+                                                 GstMemory * parent,
+                                                 GstGLContext * context,
+                                                 GstGLTextureTarget target,
+                                                 GstAllocationParams *params,
+                                                 GstVideoInfo * info,
+                                                 guint plane,
+                                                 GstVideoAlignment *valign,
+                                                 gpointer user_data,
+                                                 GDestroyNotify notify);
 
-void          gst_gl_memory_download_transfer (GstGLMemory * gl_mem);
-void          gst_gl_memory_upload_transfer   (GstGLMemory * gl_mem);
+gboolean        gst_gl_memory_copy_into         (GstGLMemory *gl_mem,
+                                                 guint tex_id,
+                                                 GstGLTextureTarget target,
+                                                 GstVideoGLTextureType tex_type,
+                                                 gint width,
+                                                 gint height);
+gboolean        gst_gl_memory_copy_teximage     (GstGLMemory * src,
+                                                 guint tex_id,
+                                                 GstGLTextureTarget out_target,
+                                                 GstVideoGLTextureType out_tex_type,
+                                                 gint width,
+                                                 gint height);
 
-gboolean      gst_gl_memory_copy_into_texture (GstGLMemory *gl_mem,
-                                               guint tex_id,
-                                               GstVideoGLTextureType tex_type,
-                                               gint width,
-                                               gint height,
-                                               gint stride,
-                                               gboolean respecify);
+gboolean        gst_gl_memory_read_pixels       (GstGLMemory * gl_mem,
+                                                 gpointer read_pointer);
 
-gboolean      gst_gl_memory_setup_buffer  (GstGLContext * context,
-                                           GstAllocationParams * params,
-                                           GstVideoInfo * info,
-                                           GstVideoAlignment *valign,
-                                           GstBuffer * buffer);
-gboolean      gst_gl_memory_setup_wrapped (GstGLContext * context,
-                                           GstVideoInfo * info,
-                                           GstVideoAlignment *valign,
-                                           gpointer data[GST_VIDEO_MAX_PLANES],
-                                           GstGLMemory *textures[GST_VIDEO_MAX_PLANES],
-                                           gpointer user_data,
-                                           GDestroyNotify notify);
+/* accessors */
+gint                    gst_gl_memory_get_texture_width     (GstGLMemory * gl_mem);
+gint                    gst_gl_memory_get_texture_height    (GstGLMemory * gl_mem);
+GstVideoGLTextureType   gst_gl_memory_get_texture_type      (GstGLMemory * gl_mem);
+GstGLTextureTarget      gst_gl_memory_get_texture_target    (GstGLMemory * gl_mem);
+guint                   gst_gl_memory_get_texture_id        (GstGLMemory * gl_mem);
 
-gint          gst_gl_memory_get_texture_width  (GstGLMemory * gl_mem);
-gint          gst_gl_memory_get_texture_height (GstGLMemory * gl_mem);
+gboolean                gst_gl_memory_setup_buffer          (GstGLMemoryAllocator * allocator,
+                                                             GstBuffer * buffer,
+                                                             GstGLVideoAllocationParams * params);
 
-/* utility functions */
-GstVideoGLTextureType gst_gl_texture_type_from_format (GstGLContext *context,
-                                                       GstVideoFormat v_format,
-                                                       guint plane);
-guint                 gst_gl_format_from_gl_texture_type (GstVideoGLTextureType tex_format);
-guint                 gst_gl_sized_gl_format_from_gl_format_type (GstGLContext * context,
-                                                                  guint format,
-                                                                  guint type);
 
-/**
- * GstGLAllocator
- *
- * Opaque #GstGLAllocator struct
- */
-struct _GstGLAllocator
-{
-  GstGLBaseBufferAllocator parent;
-  GstMemoryCopyFunction fallback_mem_copy;
-};
-
-/**
- * GstGLAllocatorClass:
- *
- * The #GstGLAllocatorClass only contains private data
- */
-struct _GstGLAllocatorClass
-{
-  GstGLBaseBufferAllocatorClass parent_class;
-};
+GstGLMemoryAllocator *  gst_gl_memory_allocator_get_default (GstGLContext *context);
 
 G_END_DECLS
 
diff --git a/gst-libs/gst/gl/gstglmemorypbo.c b/gst-libs/gst/gl/gstglmemorypbo.c
new file mode 100644
index 0000000..f2ac6d8
--- /dev/null
+++ b/gst-libs/gst/gl/gstglmemorypbo.c
@@ -0,0 +1,921 @@
+/*
+ * GStreamer
+ * Copyright (C) 2012 Matthew Waters <ystreet00@gmail.com>
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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 <string.h>
+
+#include <gst/video/video.h>
+
+#include <gst/gl/gstglmemorypbo.h>
+
+/**
+ * SECTION:gstglmemorypbo
+ * @short_description: memory subclass for GL textures
+ * @see_also: #GstMemory, #GstAllocator, #GstGLBufferPool
+ *
+ * GstGLMemoryPBO is a #GstGLMemory subclass providing support for the mapping of
+ * GL textures.  
+ *
+ * #GstGLMemoryPBO is created through gst_gl_memory_pbo_alloc() or system memory can
+ * be wrapped through gst_gl_memory_pbo_wrapped().
+ *
+ * Data is uploaded or downloaded from the GPU as is necessary.
+ */
+
+/* Implementation notes
+ *
+ * PBO transfer's are implemented using GstGLBuffer.  We just need to
+ * ensure that the texture data is written/read to/from before/after calling
+ * map (mem->pbo, READ) which performs the pbo buffer transfer.
+ */
+
+#define USING_OPENGL(context) (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL, 1, 0))
+#define USING_OPENGL3(context) (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL3, 3, 1))
+#define USING_GLES(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES, 1, 0))
+#define USING_GLES2(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 2, 0))
+#define USING_GLES3(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 3, 0))
+
+/* FIXME: Unused, see https://bugzilla.gnome.org/show_bug.cgi?id=759679 */
+#if 0
+#define GL_MEM_WIDTH(gl_mem) _get_plane_width (&gl_mem->mem.info, gl_mem->mem.plane)
+#endif
+
+#define GL_MEM_HEIGHT(gl_mem) _get_plane_height (&gl_mem->mem.info, gl_mem->mem.plane)
+#define GL_MEM_STRIDE(gl_mem) GST_VIDEO_INFO_PLANE_STRIDE (&gl_mem->mem.info, gl_mem->mem.plane)
+
+#define CONTEXT_SUPPORTS_PBO_UPLOAD(context) \
+    (gst_gl_context_check_gl_version (context, \
+        GST_GL_API_OPENGL | GST_GL_API_OPENGL3, 2, 1) \
+        || gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 3, 0))
+#define CONTEXT_SUPPORTS_PBO_DOWNLOAD(context) \
+    (gst_gl_context_check_gl_version (context, \
+        GST_GL_API_OPENGL | GST_GL_API_OPENGL3 | GST_GL_API_GLES2, 3, 0))
+
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_GL_MEMORY);
+#define GST_CAT_DEFAULT GST_CAT_GL_MEMORY
+
+static GstAllocator *_gl_allocator;
+
+/* compatability definitions... */
+#ifndef GL_PIXEL_PACK_BUFFER
+#define GL_PIXEL_PACK_BUFFER 0x88EB
+#endif
+#ifndef GL_PIXEL_UNPACK_BUFFER
+#define GL_PIXEL_UNPACK_BUFFER 0x88EC
+#endif
+#ifndef GL_STREAM_READ
+#define GL_STREAM_READ 0x88E1
+#endif
+#ifndef GL_STREAM_DRAW
+#define GL_STREAM_DRAW 0x88E0
+#endif
+#ifndef GL_STREAM_COPY
+#define GL_STREAM_COPY 0x88E2
+#endif
+#ifndef GL_UNPACK_ROW_LENGTH
+#define GL_UNPACK_ROW_LENGTH 0x0CF2
+#endif
+
+#ifndef GL_TEXTURE_RECTANGLE
+#define GL_TEXTURE_RECTANGLE 0x84F5
+#endif
+#ifndef GL_TEXTURE_EXTERNAL_OES
+#define GL_TEXTURE_EXTERNAL_OES 0x8D65
+#endif
+
+#define parent_class gst_gl_memory_pbo_allocator_parent_class
+G_DEFINE_TYPE (GstGLMemoryPBOAllocator, gst_gl_memory_pbo_allocator,
+    GST_TYPE_GL_MEMORY_ALLOCATOR);
+
+typedef struct
+{
+  /* in */
+  GstGLMemoryPBO *src;
+  GstVideoGLTextureType out_format;
+  guint out_width, out_height;
+  guint out_stride;
+  gboolean respecify;
+  GstGLTextureTarget tex_target;
+  /* inout */
+  guint tex_id;
+  /* out */
+  gboolean result;
+} GstGLMemoryPBOCopyParams;
+
+/* FIXME: Unused, see https://bugzilla.gnome.org/show_bug.cgi?id=759679 */
+#if 0
+static inline guint
+_get_plane_width (GstVideoInfo * info, guint plane)
+{
+  if (GST_VIDEO_INFO_IS_YUV (info))
+    /* For now component width and plane width are the same and the
+     * plane-component mapping matches
+     */
+    return GST_VIDEO_INFO_COMP_WIDTH (info, plane);
+  else                          /* RGB, GRAY */
+    return GST_VIDEO_INFO_WIDTH (info);
+}
+#endif
+
+static inline guint
+_get_plane_height (GstVideoInfo * info, guint plane)
+{
+  if (GST_VIDEO_INFO_IS_YUV (info))
+    /* For now component width and plane width are the same and the
+     * plane-component mapping matches
+     */
+    return GST_VIDEO_INFO_COMP_HEIGHT (info, plane);
+  else                          /* RGB, GRAY */
+    return GST_VIDEO_INFO_HEIGHT (info);
+}
+
+static void
+_upload_pbo_memory (GstGLMemoryPBO * gl_mem, GstMapInfo * info,
+    GstGLBuffer * pbo, GstMapInfo * pbo_info)
+{
+  GstGLContext *context = gl_mem->mem.mem.context;
+  const GstGLFuncs *gl;
+  guint gl_format, gl_type, gl_target;
+  guint pbo_id;
+  gsize plane_start;
+
+  if (!GST_MEMORY_FLAG_IS_SET (gl_mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD))
+    return;
+
+  g_return_if_fail (CONTEXT_SUPPORTS_PBO_UPLOAD (context));
+
+  gl = context->gl_vtable;
+  pbo_id = *(guint *) pbo_info->data;
+
+  gl_type = GL_UNSIGNED_BYTE;
+  if (gl_mem->mem.tex_type == GST_VIDEO_GL_TEXTURE_TYPE_RGB16)
+    gl_type = GL_UNSIGNED_SHORT_5_6_5;
+
+  gl_format = gst_gl_format_from_gl_texture_type (gl_mem->mem.tex_type);
+  gl_target = gst_gl_texture_target_to_gl (gl_mem->mem.tex_target);
+
+  if (USING_OPENGL (context) || USING_GLES3 (context)
+      || USING_OPENGL3 (context)) {
+    gl->PixelStorei (GL_UNPACK_ROW_LENGTH, gl_mem->mem.unpack_length);
+  } else if (USING_GLES2 (context)) {
+    gl->PixelStorei (GL_UNPACK_ALIGNMENT, gl_mem->mem.unpack_length);
+  }
+
+  GST_CAT_LOG (GST_CAT_GL_MEMORY, "upload for texture id:%u, with pbo %u %ux%u",
+      gl_mem->mem.tex_id, pbo_id, gl_mem->mem.tex_width,
+      GL_MEM_HEIGHT (gl_mem));
+
+  /* find the start of the plane data including padding */
+  plane_start =
+      gst_gl_get_plane_start (&gl_mem->mem.info, &gl_mem->mem.valign,
+      gl_mem->mem.plane) + GST_MEMORY_CAST (gl_mem)->offset;
+
+  gl->BindBuffer (GL_PIXEL_UNPACK_BUFFER, pbo_id);
+  gl->BindTexture (gl_target, gl_mem->mem.tex_id);
+  gl->TexSubImage2D (gl_target, 0, 0, 0, gl_mem->mem.tex_width,
+      GL_MEM_HEIGHT (gl_mem), gl_format, gl_type, (void *) plane_start);
+  gl->BindBuffer (GL_PIXEL_UNPACK_BUFFER, 0);
+  gl->BindTexture (gl_target, 0);
+
+  /* Reset to default values */
+  if (USING_OPENGL (context) || USING_GLES3 (context)) {
+    gl->PixelStorei (GL_UNPACK_ROW_LENGTH, 0);
+  } else if (USING_GLES2 (context)) {
+    gl->PixelStorei (GL_UNPACK_ALIGNMENT, 4);
+  }
+}
+
+static guint
+_new_texture (GstGLContext * context, guint target, guint internal_format,
+    guint format, guint type, guint width, guint height)
+{
+  const GstGLFuncs *gl = context->gl_vtable;
+  guint tex_id;
+
+  gl->GenTextures (1, &tex_id);
+  gl->BindTexture (target, tex_id);
+  if (target == GL_TEXTURE_2D || target == GL_TEXTURE_RECTANGLE)
+    gl->TexImage2D (target, 0, internal_format, width, height, 0, format, type,
+        NULL);
+
+  gl->TexParameteri (target, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+  gl->TexParameteri (target, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+  gl->TexParameteri (target, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+  gl->TexParameteri (target, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+  gl->BindTexture (target, 0);
+
+  return tex_id;
+}
+
+static gboolean
+_gl_mem_create (GstGLMemoryPBO * gl_mem, GError ** error)
+{
+  GstGLContext *context = gl_mem->mem.mem.context;
+  GstGLBaseMemoryAllocatorClass *alloc_class;
+
+  alloc_class = GST_GL_BASE_MEMORY_ALLOCATOR_CLASS (parent_class);
+  if (!alloc_class->create ((GstGLBaseMemory *) gl_mem, error))
+    return FALSE;
+
+  if (USING_OPENGL (context) || USING_OPENGL3 (context)
+      || USING_GLES3 (context)) {
+    GstAllocationParams alloc_params =
+        { 0, GST_MEMORY_CAST (gl_mem)->align, 0, 0 };
+    GstGLBaseMemoryAllocator *buf_allocator;
+    GstGLBufferAllocationParams *params;
+
+    buf_allocator =
+        GST_GL_BASE_MEMORY_ALLOCATOR (gst_allocator_find
+        (GST_GL_BUFFER_ALLOCATOR_NAME));
+    params =
+        gst_gl_buffer_allocation_params_new (context,
+        GST_MEMORY_CAST (gl_mem)->size, &alloc_params, GL_PIXEL_UNPACK_BUFFER,
+        GL_STREAM_DRAW);
+
+    /* FIXME: lazy init this for resource constrained platforms
+     * Will need to fix pbo detection based on the existence of the mem.id then */
+    gl_mem->pbo = (GstGLBuffer *) gst_gl_base_memory_alloc (buf_allocator,
+        (GstGLAllocationParams *) params);
+
+    gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
+    gst_object_unref (buf_allocator);
+
+    GST_CAT_LOG (GST_CAT_GL_MEMORY, "generated pbo %u", gl_mem->pbo->id);
+  }
+
+  return TRUE;
+}
+
+static void
+_gl_mem_init (GstGLMemoryPBO * mem, GstAllocator * allocator,
+    GstMemory * parent, GstGLContext * context, GstGLTextureTarget target,
+    GstAllocationParams * params, GstVideoInfo * info,
+    guint plane, GstVideoAlignment * valign, gpointer user_data,
+    GDestroyNotify notify)
+{
+  gst_gl_memory_init ((GstGLMemory *) mem, allocator, parent,
+      context, target, params, info, plane, valign, user_data, notify);
+}
+
+static GstGLMemoryPBO *
+_gl_mem_new (GstAllocator * allocator, GstMemory * parent,
+    GstGLContext * context, GstGLTextureTarget target,
+    GstAllocationParams * params, GstVideoInfo * info,
+    guint plane, GstVideoAlignment * valign, gpointer user_data,
+    GDestroyNotify notify)
+{
+  GstGLMemoryPBO *mem;
+  mem = g_slice_new0 (GstGLMemoryPBO);
+  mem->mem.texture_wrapped = FALSE;
+
+  _gl_mem_init (mem, allocator, parent, context, target, params, info, plane,
+      valign, user_data, notify);
+
+  return mem;
+}
+
+static gboolean
+_read_pixels_to_pbo (GstGLMemoryPBO * gl_mem)
+{
+  if (!gl_mem->pbo || !CONTEXT_SUPPORTS_PBO_DOWNLOAD (gl_mem->mem.mem.context)
+      || gl_mem->mem.tex_type == GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE
+      || gl_mem->mem.tex_type == GST_VIDEO_GL_TEXTURE_TYPE_LUMINANCE_ALPHA)
+    /* unsupported */
+    return FALSE;
+
+  if (GST_MEMORY_FLAG_IS_SET (gl_mem,
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD)) {
+    /* copy texture data into into the pbo and map that */
+    gsize plane_start;
+    GstMapInfo pbo_info;
+
+    plane_start =
+        gst_gl_get_plane_start (&gl_mem->mem.info, &gl_mem->mem.valign,
+        gl_mem->mem.plane) + GST_MEMORY_CAST (gl_mem)->offset;
+
+    gl_mem->pbo->target = GL_PIXEL_PACK_BUFFER;
+    if (!gst_memory_map (GST_MEMORY_CAST (gl_mem->pbo), &pbo_info,
+            GST_MAP_WRITE | GST_MAP_GL)) {
+      GST_CAT_ERROR (GST_CAT_GL_MEMORY, "Failed to map pbo for writing");
+      return FALSE;
+    }
+
+    if (!gst_gl_memory_read_pixels ((GstGLMemory *) gl_mem,
+            (gpointer) plane_start)) {
+      gst_memory_unmap (GST_MEMORY_CAST (gl_mem->pbo), &pbo_info);
+      return FALSE;
+    }
+
+    gst_memory_unmap (GST_MEMORY_CAST (gl_mem->pbo), &pbo_info);
+  }
+
+  return TRUE;
+}
+
+static gpointer
+_pbo_download_transfer (GstGLMemoryPBO * gl_mem, GstMapInfo * info, gsize size)
+{
+  GstMapInfo *pbo_info;
+
+  gl_mem->pbo->target = GL_PIXEL_PACK_BUFFER;
+  /* texture -> pbo */
+  if (info->flags & GST_MAP_READ
+      && GST_MEMORY_FLAG_IS_SET (gl_mem,
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD)) {
+    GstMapInfo info;
+
+    GST_CAT_TRACE (GST_CAT_GL_MEMORY,
+        "attempting download of texture %u " "using pbo %u", gl_mem->mem.tex_id,
+        gl_mem->pbo->id);
+
+    if (!gst_memory_map (GST_MEMORY_CAST (gl_mem->pbo), &info,
+            GST_MAP_WRITE | GST_MAP_GL)) {
+      GST_CAT_WARNING (GST_CAT_GL_MEMORY, "Failed to write to PBO");
+      return NULL;
+    }
+
+    if (!_read_pixels_to_pbo (gl_mem))
+      return NULL;
+
+    gst_memory_unmap (GST_MEMORY_CAST (gl_mem->pbo), &info);
+  }
+
+  pbo_info = g_new0 (GstMapInfo, 1);
+
+  /* pbo -> data */
+  /* get a cpu accessible mapping from the pbo */
+  if (!gst_memory_map (GST_MEMORY_CAST (gl_mem->pbo), pbo_info, info->flags)) {
+    GST_CAT_ERROR (GST_CAT_GL_MEMORY, "Failed to map pbo");
+    g_free (pbo_info);
+    return NULL;
+  }
+  info->user_data[0] = pbo_info;
+
+  return pbo_info->data;
+}
+
+static gpointer
+_gl_mem_map_cpu_access (GstGLMemoryPBO * gl_mem, GstMapInfo * info, gsize size)
+{
+  gpointer data = NULL;
+
+  gst_gl_base_memory_alloc_data ((GstGLBaseMemory *) gl_mem);
+
+  if (!data && gl_mem->pbo
+      && CONTEXT_SUPPORTS_PBO_DOWNLOAD (gl_mem->mem.mem.context))
+    data = _pbo_download_transfer (gl_mem, info, size);
+
+  if (!data) {
+    GstGLMemoryAllocatorClass *alloc_class;
+
+    alloc_class = GST_GL_MEMORY_ALLOCATOR_CLASS (parent_class);
+
+    data = alloc_class->map ((GstGLBaseMemory *) gl_mem, info, size);
+  }
+
+  return data;
+}
+
+static gpointer
+_gl_mem_map_gpu_access (GstGLMemoryPBO * gl_mem, GstMapInfo * info, gsize size)
+{
+  gpointer data = &gl_mem->mem.tex_id;
+
+  if ((info->flags & GST_MAP_READ) == GST_MAP_READ) {
+    if (gl_mem->pbo && CONTEXT_SUPPORTS_PBO_UPLOAD (gl_mem->mem.mem.context)) {
+      GstMapInfo pbo_info;
+
+      /* data -> pbo */
+      if (!gst_memory_map (GST_MEMORY_CAST (gl_mem->pbo), &pbo_info,
+              GST_MAP_READ | GST_MAP_GL)) {
+        GST_CAT_ERROR (GST_CAT_GL_MEMORY, "Failed to map pbo");
+        return NULL;
+      }
+
+      /* pbo -> texture */
+      _upload_pbo_memory (gl_mem, info, gl_mem->pbo, &pbo_info);
+
+      gst_memory_unmap (GST_MEMORY_CAST (gl_mem->pbo), &pbo_info);
+    } else {
+      GstGLMemoryAllocatorClass *alloc_class;
+
+      alloc_class = GST_GL_MEMORY_ALLOCATOR_CLASS (parent_class);
+
+      data = alloc_class->map ((GstGLBaseMemory *) gl_mem, info, size);
+    }
+  }
+
+  return data;
+}
+
+static gpointer
+_gl_mem_map (GstGLMemoryPBO * gl_mem, GstMapInfo * info, gsize maxsize)
+{
+  gpointer data;
+
+  if ((info->flags & GST_MAP_GL) == GST_MAP_GL) {
+    if (gl_mem->mem.tex_target == GST_GL_TEXTURE_TARGET_EXTERNAL_OES)
+      return &gl_mem->mem.tex_id;
+
+    data = _gl_mem_map_gpu_access (gl_mem, info, maxsize);
+  } else {                      /* not GL */
+    if (gl_mem->mem.tex_target == GST_GL_TEXTURE_TARGET_EXTERNAL_OES) {
+      GST_CAT_ERROR (GST_CAT_GL_MEMORY, "Cannot map External OES textures");
+      return NULL;
+    }
+
+    data = _gl_mem_map_cpu_access (gl_mem, info, maxsize);
+  }
+
+  return data;
+}
+
+static void
+_gl_mem_unmap_cpu_access (GstGLMemoryPBO * gl_mem, GstMapInfo * info)
+{
+  if (!gl_mem->pbo || !CONTEXT_SUPPORTS_PBO_DOWNLOAD (gl_mem->mem.mem.context))
+    /* PBO's not supported */
+    return;
+
+  gl_mem->pbo->target = GL_PIXEL_PACK_BUFFER;
+  gst_memory_unmap (GST_MEMORY_CAST (gl_mem->pbo),
+      (GstMapInfo *) info->user_data[0]);
+  g_free (info->user_data[0]);
+}
+
+static void
+_gl_mem_unmap (GstGLMemoryPBO * gl_mem, GstMapInfo * info)
+{
+  if ((info->flags & GST_MAP_GL) == 0) {
+    _gl_mem_unmap_cpu_access (gl_mem, info);
+  }
+}
+
+static void
+_gl_mem_copy_thread (GstGLContext * context, gpointer data)
+{
+  const GstGLFuncs *gl;
+  GstGLMemoryPBOCopyParams *copy_params;
+  GstGLMemoryPBO *src;
+  guint tex_id;
+  guint out_tex_target;
+  GLuint fboId;
+  gsize out_width, out_height, out_stride;
+  GLuint out_gl_format, out_gl_type;
+  GLuint in_gl_format, in_gl_type;
+  gsize in_size, out_size;
+
+  copy_params = (GstGLMemoryPBOCopyParams *) data;
+  src = copy_params->src;
+  tex_id = copy_params->tex_id;
+  out_tex_target = gst_gl_texture_target_to_gl (copy_params->tex_target);
+  out_width = copy_params->out_width;
+  out_height = copy_params->out_height;
+  out_stride = copy_params->out_stride;
+
+  gl = context->gl_vtable;
+  out_gl_format = gst_gl_format_from_gl_texture_type (copy_params->out_format);
+  out_gl_type = GL_UNSIGNED_BYTE;
+  if (copy_params->out_format == GST_VIDEO_GL_TEXTURE_TYPE_RGB16)
+    out_gl_type = GL_UNSIGNED_SHORT_5_6_5;
+  in_gl_format = gst_gl_format_from_gl_texture_type (src->mem.tex_type);
+  in_gl_type = GL_UNSIGNED_BYTE;
+  if (src->mem.tex_type == GST_VIDEO_GL_TEXTURE_TYPE_RGB16)
+    in_gl_type = GL_UNSIGNED_SHORT_5_6_5;
+
+  if (!gl->GenFramebuffers) {
+    gst_gl_context_set_error (context,
+        "Context, EXT_framebuffer_object not supported");
+    goto error;
+  }
+
+  in_size = GL_MEM_HEIGHT (src) * GL_MEM_STRIDE (src);
+  out_size = out_height * out_stride;
+
+  if (copy_params->respecify) {
+    if (in_size != out_size) {
+      GST_ERROR ("Cannot copy between textures with backing data of different"
+          "sizes. input %" G_GSIZE_FORMAT " output %" G_GSIZE_FORMAT, in_size,
+          out_size);
+      goto error;
+    }
+  }
+
+  if (!tex_id) {
+    guint internal_format;
+    guint out_gl_type;
+
+    out_gl_type = GL_UNSIGNED_BYTE;
+    if (copy_params->out_format == GST_VIDEO_GL_TEXTURE_TYPE_RGB16)
+      out_gl_type = GL_UNSIGNED_SHORT_5_6_5;
+
+    internal_format =
+        gst_gl_sized_gl_format_from_gl_format_type (context, out_gl_format,
+        out_gl_type);
+
+    tex_id =
+        _new_texture (context, out_tex_target,
+        internal_format, out_gl_format, out_gl_type, copy_params->out_width,
+        copy_params->out_height);
+  }
+
+  if (!tex_id) {
+    GST_WARNING ("Could not create GL texture with context:%p", context);
+  }
+
+  GST_LOG ("copying memory %p, tex %u into texture %i",
+      src, src->mem.tex_id, tex_id);
+
+  /* FIXME: try and avoid creating and destroying fbo's every copy... */
+  /* create a framebuffer object */
+  gl->GenFramebuffers (1, &fboId);
+  gl->BindFramebuffer (GL_FRAMEBUFFER, fboId);
+
+  gl->FramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
+      gst_gl_texture_target_to_gl (src->mem.tex_target), src->mem.tex_id, 0);
+
+//  if (!gst_gl_context_check_framebuffer_status (src->mem.mem.context))
+//    goto fbo_error;
+
+  gl->BindTexture (out_tex_target, tex_id);
+  if (copy_params->respecify) {
+    GstMapInfo pbo_info;
+
+    if (!gl->GenBuffers || !src->pbo) {
+      gst_gl_context_set_error (context, "Cannot reinterpret texture contents "
+          "without pixel buffer objects");
+      gl->BindTexture (out_tex_target, 0);
+      goto fbo_error;
+    }
+
+    if (gst_gl_context_get_gl_api (context) & GST_GL_API_GLES2
+        && (in_gl_format != GL_RGBA || in_gl_type != GL_UNSIGNED_BYTE)) {
+      gst_gl_context_set_error (context, "Cannot copy non RGBA/UNSIGNED_BYTE "
+          "textures on GLES2");
+      gl->BindTexture (out_tex_target, 0);
+      goto fbo_error;
+    }
+
+    GST_TRACE ("copying texture data with size of %u*%u*%u",
+        gst_gl_format_type_n_bytes (in_gl_format, in_gl_type),
+        src->mem.tex_width, GL_MEM_HEIGHT (src));
+
+    /* copy tex */
+    _read_pixels_to_pbo (src);
+
+    src->pbo->target = GL_PIXEL_UNPACK_BUFFER;
+    if (!gst_memory_map (GST_MEMORY_CAST (src->pbo), &pbo_info,
+            GST_MAP_READ | GST_MAP_GL)) {
+      GST_CAT_ERROR (GST_CAT_GL_MEMORY, "Failed to map pbo for reading");
+      goto fbo_error;
+    }
+    gl->TexSubImage2D (out_tex_target, 0, 0, 0, out_width, out_height,
+        out_gl_format, out_gl_type, 0);
+    gst_memory_unmap (GST_MEMORY_CAST (src->pbo), &pbo_info);
+  } else {                      /* different sizes */
+    gst_gl_memory_copy_teximage (GST_GL_MEMORY_CAST (src),
+        tex_id, copy_params->tex_target, copy_params->out_format, out_width,
+        out_height);
+  }
+
+  gl->BindTexture (out_tex_target, 0);
+  gl->BindFramebuffer (GL_FRAMEBUFFER, 0);
+
+  gl->DeleteFramebuffers (1, &fboId);
+
+  copy_params->tex_id = tex_id;
+  copy_params->result = TRUE;
+
+  return;
+
+/* ERRORS */
+fbo_error:
+  {
+    gl->DeleteFramebuffers (1, &fboId);
+
+    copy_params->tex_id = 0;
+    copy_params->result = FALSE;
+    return;
+  }
+
+error:
+  {
+    copy_params->result = FALSE;
+    return;
+  }
+}
+
+static GstMemory *
+_gl_mem_copy (GstGLMemoryPBO * src, gssize offset, gssize size)
+{
+  GstAllocationParams params = { 0, GST_MEMORY_CAST (src)->align, 0, 0 };
+  GstGLBaseMemoryAllocator *base_mem_allocator;
+  GstAllocator *allocator;
+  GstMemory *dest = NULL;
+
+  allocator = GST_MEMORY_CAST (src)->allocator;
+  base_mem_allocator = (GstGLBaseMemoryAllocator *) allocator;
+
+  if (src->mem.tex_target == GST_GL_TEXTURE_TARGET_EXTERNAL_OES) {
+    GST_CAT_ERROR (GST_CAT_GL_MEMORY, "Cannot copy External OES textures");
+    return NULL;
+  }
+
+  /* If not doing a full copy, then copy to sysmem, the 2D represention of the
+   * texture would become wrong */
+  if (offset > 0 || size < GST_MEMORY_CAST (src)->size) {
+    return base_mem_allocator->fallback_mem_copy (GST_MEMORY_CAST (src), offset,
+        size);
+  }
+
+  dest = (GstMemory *) _gl_mem_new (allocator, NULL, src->mem.mem.context,
+      src->mem.tex_target, &params, &src->mem.info, src->mem.plane,
+      &src->mem.valign, NULL, NULL);
+
+  if (GST_MEMORY_FLAG_IS_SET (src, GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD)) {
+    if (!gst_gl_base_memory_memcpy ((GstGLBaseMemory *) src,
+            (GstGLBaseMemory *) dest, offset, size)) {
+      GST_CAT_WARNING (GST_CAT_GL_MEMORY, "Could not copy GL Memory");
+      gst_memory_unref (GST_MEMORY_CAST (dest));
+      return NULL;
+    }
+  } else {
+    GstMapInfo dinfo;
+
+    if (!gst_memory_map (GST_MEMORY_CAST (dest), &dinfo,
+            GST_MAP_WRITE | GST_MAP_GL)) {
+      GST_CAT_WARNING (GST_CAT_GL_MEMORY,
+          "Failed not map destination " "for writing");
+      gst_memory_unref (GST_MEMORY_CAST (dest));
+      return NULL;
+    }
+
+    if (!gst_gl_memory_copy_into ((GstGLMemory *) src,
+            ((GstGLMemory *) dest)->tex_id, src->mem.tex_target,
+            src->mem.tex_type, src->mem.tex_width, GL_MEM_HEIGHT (src))) {
+      GST_CAT_WARNING (GST_CAT_GL_MEMORY, "Could not copy GL Memory");
+      gst_memory_unmap (GST_MEMORY_CAST (dest), &dinfo);
+      gst_memory_unref (GST_MEMORY_CAST (dest));
+      return NULL;
+    }
+
+    gst_memory_unmap (GST_MEMORY_CAST (dest), &dinfo);
+  }
+
+  return dest;
+}
+
+static GstMemory *
+_gl_mem_alloc (GstAllocator * allocator, gsize size,
+    GstAllocationParams * params)
+{
+  g_warning ("Use gst_gl_base_memory_alloc () to allocate from this "
+      "GstGLMemoryPBO allocator");
+
+  return NULL;
+}
+
+static void
+_gl_mem_destroy (GstGLMemoryPBO * gl_mem)
+{
+  if (gl_mem->pbo)
+    gst_memory_unref (GST_MEMORY_CAST (gl_mem->pbo));
+  gl_mem->pbo = NULL;
+
+  GST_GL_BASE_MEMORY_ALLOCATOR_CLASS (parent_class)->destroy ((GstGLBaseMemory
+          *) gl_mem);
+}
+
+static void
+_gl_mem_free (GstAllocator * allocator, GstMemory * mem)
+{
+  GST_ALLOCATOR_CLASS (parent_class)->free (allocator, mem);
+}
+
+static GstGLMemoryPBO *
+_gl_mem_pbo_alloc (GstGLBaseMemoryAllocator * allocator,
+    GstGLVideoAllocationParams * params)
+{
+  GstGLMemoryPBO *mem;
+
+  g_return_val_if_fail (params->
+      parent.alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_VIDEO, NULL);
+
+  mem = g_new0 (GstGLMemoryPBO, 1);
+
+  if (params->
+      parent.alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE)
+  {
+    mem->mem.tex_id = params->parent.gl_handle;
+    mem->mem.texture_wrapped = TRUE;
+  }
+
+  _gl_mem_init (mem, GST_ALLOCATOR_CAST (allocator), NULL,
+      params->parent.context, params->target, params->parent.alloc_params,
+      params->v_info, params->plane, params->valign, params->parent.user_data,
+      params->parent.notify);
+
+  if (params->
+      parent.alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_GPU_HANDLE)
+  {
+    GST_MINI_OBJECT_FLAG_SET (mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD);
+  }
+  if (params->
+      parent.alloc_flags & GST_GL_ALLOCATION_PARAMS_ALLOC_FLAG_WRAP_SYSMEM) {
+    mem->pbo->mem.data = params->parent.wrapped_data;
+
+    GST_MINI_OBJECT_FLAG_SET (mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD);
+    GST_MINI_OBJECT_FLAG_SET (mem->pbo,
+        GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD);
+  }
+
+  return mem;
+}
+
+static void
+gst_gl_memory_pbo_allocator_class_init (GstGLMemoryPBOAllocatorClass * klass)
+{
+  GstGLBaseMemoryAllocatorClass *gl_base;
+  GstGLMemoryAllocatorClass *gl_tex;
+  GstAllocatorClass *allocator_class;
+
+  gl_tex = (GstGLMemoryAllocatorClass *) klass;
+  gl_base = (GstGLBaseMemoryAllocatorClass *) klass;
+  allocator_class = (GstAllocatorClass *) klass;
+
+  gl_base->alloc = (GstGLBaseMemoryAllocatorAllocFunction) _gl_mem_pbo_alloc;
+  gl_base->create = (GstGLBaseMemoryAllocatorCreateFunction) _gl_mem_create;
+  gl_tex->map = (GstGLBaseMemoryAllocatorMapFunction) _gl_mem_map;
+  gl_tex->unmap = (GstGLBaseMemoryAllocatorUnmapFunction) _gl_mem_unmap;
+  gl_tex->copy = (GstGLBaseMemoryAllocatorCopyFunction) _gl_mem_copy;
+  gl_base->destroy = (GstGLBaseMemoryAllocatorDestroyFunction) _gl_mem_destroy;
+
+  allocator_class->alloc = _gl_mem_alloc;
+  allocator_class->free = _gl_mem_free;
+}
+
+static void
+gst_gl_memory_pbo_allocator_init (GstGLMemoryPBOAllocator * allocator)
+{
+  GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator);
+
+  alloc->mem_type = GST_GL_MEMORY_PBO_ALLOCATOR_NAME;
+
+  GST_OBJECT_FLAG_SET (allocator, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC);
+}
+
+/**
+ * gst_gl_memory_pbo_copy_into_texture:
+ * @gl_mem:a #GstGLMemoryPBO
+ * @tex_id:OpenGL texture id
+ * @tex_type: a #GstVideoGLTextureType
+ * @width: width of @tex_id
+ * @height: height of @tex_id
+ * @stride: stride of the backing texture data
+ * @respecify: whether to copy the data or copy per texel
+ *
+ * Copies @gl_mem into the texture specfified by @tex_id.  The format of @tex_id
+ * is specified by @tex_type, @width and @height.
+ *
+ * If @respecify is %TRUE, then the copy is performed in terms of the texture
+ * data.  This is useful for splitting RGBA textures into RG or R textures or
+ * vice versa. The requirement for this to succeed is that the backing texture
+ * data must be the same size, i.e. say a RGBA8 texture is converted into a RG8
+ * texture, then the RG texture must have twice as many pixels available for
+ * output as the RGBA texture.
+ *
+ * Otherwise, if @respecify is %FALSE, then the copy is performed per texel
+ * using glCopyTexImage.  See the OpenGL specification for details on the
+ * mappings between texture formats.
+ *
+ * Returns: Whether the copy suceeded
+ */
+gboolean
+gst_gl_memory_pbo_copy_into_texture (GstGLMemoryPBO * gl_mem, guint tex_id,
+    GstGLTextureTarget target, GstVideoGLTextureType tex_type, gint width,
+    gint height, gint stride, gboolean respecify)
+{
+  GstGLMemoryPBOCopyParams copy_params;
+
+  copy_params.src = gl_mem;
+  copy_params.tex_target = target;
+  copy_params.tex_id = tex_id;
+  copy_params.out_format = tex_type;
+  copy_params.out_width = width;
+  copy_params.out_height = height;
+  copy_params.out_stride = stride;
+  copy_params.respecify = respecify;
+
+  gst_gl_context_thread_add (gl_mem->mem.mem.context, _gl_mem_copy_thread,
+      &copy_params);
+
+  return copy_params.result;
+}
+
+static void
+_download_transfer (GstGLContext * context, GstGLMemoryPBO * gl_mem)
+{
+  GstGLBaseMemory *mem = (GstGLBaseMemory *) gl_mem;
+
+  g_mutex_lock (&mem->lock);
+  if (_read_pixels_to_pbo (gl_mem))
+    GST_CAT_TRACE (GST_CAT_GL_MEMORY, "optimistic download of texture %u "
+        "using pbo %u", gl_mem->mem.tex_id, gl_mem->pbo->id);
+  g_mutex_unlock (&mem->lock);
+}
+
+void
+gst_gl_memory_pbo_download_transfer (GstGLMemoryPBO * gl_mem)
+{
+  g_return_if_fail (gst_is_gl_memory ((GstMemory *) gl_mem));
+
+  gst_gl_context_thread_add (gl_mem->mem.mem.context,
+      (GstGLContextThreadFunc) _download_transfer, gl_mem);
+}
+
+static void
+_upload_transfer (GstGLContext * context, GstGLMemoryPBO * gl_mem)
+{
+  GstGLBaseMemory *mem = (GstGLBaseMemory *) gl_mem;
+  GstMapInfo info;
+
+  g_mutex_lock (&mem->lock);
+  gl_mem->pbo->target = GL_PIXEL_UNPACK_BUFFER;
+  if (!gst_memory_map (GST_MEMORY_CAST (gl_mem->pbo), &info,
+          GST_MAP_READ | GST_MAP_GL)) {
+    GST_CAT_WARNING (GST_CAT_GL_MEMORY, "Failed to map pbo for reading");
+  } else {
+    gst_memory_unmap (GST_MEMORY_CAST (gl_mem->pbo), &info);
+  }
+  g_mutex_unlock (&mem->lock);
+}
+
+void
+gst_gl_memory_pbo_upload_transfer (GstGLMemoryPBO * gl_mem)
+{
+  g_return_if_fail (gst_is_gl_memory ((GstMemory *) gl_mem));
+
+  if (gl_mem->pbo && CONTEXT_SUPPORTS_PBO_UPLOAD (gl_mem->mem.mem.context))
+    gst_gl_context_thread_add (gl_mem->mem.mem.context,
+        (GstGLContextThreadFunc) _upload_transfer, gl_mem);
+}
+
+/**
+ * gst_gl_memory_pbo_init:
+ *
+ * Initializes the GL Memory allocator. It is safe to call this function
+ * multiple times.  This must be called before any other GstGLMemoryPBO operation.
+ */
+void
+gst_gl_memory_pbo_init_once (void)
+{
+  static volatile gsize _init = 0;
+
+  if (g_once_init_enter (&_init)) {
+    gst_gl_memory_init_once ();
+
+    GST_DEBUG_CATEGORY_INIT (GST_CAT_GL_MEMORY, "glmemory", 0, "OpenGL Memory");
+
+    _gl_allocator = g_object_new (GST_TYPE_GL_MEMORY_PBO_ALLOCATOR, NULL);
+
+    gst_allocator_register (GST_GL_MEMORY_PBO_ALLOCATOR_NAME,
+        gst_object_ref (_gl_allocator));
+    g_once_init_leave (&_init, 1);
+  }
+}
+
+/**
+ * gst_is_gl_memory:
+ * @mem:a #GstMemory
+ * 
+ * Returns: whether the memory at @mem is a #GstGLMemoryPBO
+ */
+gboolean
+gst_is_gl_memory_pbo (GstMemory * mem)
+{
+  return mem != NULL && mem->allocator != NULL
+      && g_type_is_a (G_OBJECT_TYPE (mem->allocator),
+      GST_TYPE_GL_MEMORY_PBO_ALLOCATOR);
+}
diff --git a/gst-libs/gst/gl/gstglmemorypbo.h b/gst-libs/gst/gl/gstglmemorypbo.h
new file mode 100644
index 0000000..aa4110e
--- /dev/null
+++ b/gst-libs/gst/gl/gstglmemorypbo.h
@@ -0,0 +1,101 @@
+/*
+ * GStreamer
+ * Copyright (C) 2012 Matthew Waters <ystreet00@gmail.com>
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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_MEMORY_PBO_H_
+#define _GST_GL_MEMORY_PBO_H_
+
+#include <gst/gst.h>
+#include <gst/gstallocator.h>
+#include <gst/gstmemory.h>
+#include <gst/video/video.h>
+
+#include <gst/gl/gstglmemory.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_GL_MEMORY_PBO_ALLOCATOR (gst_gl_memory_pbo_allocator_get_type())
+GType gst_gl_memory_pbo_allocator_get_type(void);
+
+#define GST_IS_GL_MEMORY_PBO_ALLOCATOR(obj)              (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_GL_MEMORY_PBO_ALLOCATOR))
+#define GST_IS_GL_MEMORY_PBO_ALLOCATOR_CLASS(klass)      (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_GL_MEMORY_PBO_ALLOCATOR))
+#define GST_GL_MEMORY_PBO_ALLOCATOR_GET_CLASS(obj)       (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_GL_MEMORY_PBO_ALLOCATOR, GstGLMemoryPBOAllocatorClass))
+#define GST_GL_MEMORY_PBO_ALLOCATOR(obj)                 (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_GL_MEMORY_PBO_ALLOCATOR, GstGLMemoryPBOAllocator))
+#define GST_GL_MEMORY_PBO_ALLOCATOR_CLASS(klass)         (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_GL_MEMORY_PBO_ALLOCATOR, GstGLAllocatorClass))
+#define GST_GL_MEMORY_PBO_ALLOCATOR_CAST(obj)            ((GstGLMemoryPBOAllocator *)(obj))
+
+/**
+ * GstGLMemoryPBO:
+ *
+ * Private instance
+ */
+struct _GstGLMemoryPBO
+{
+  GstGLMemory      mem;
+
+  /* <private> */
+  GstGLBuffer          *pbo;
+};
+
+/**
+ * GST_GL_MEMORY_PBO_ALLOCATOR:
+ *
+ * The name of the GL Memory PBO allocator
+ */
+#define GST_GL_MEMORY_PBO_ALLOCATOR_NAME   "GLMemoryPBO"
+
+void          gst_gl_memory_pbo_init_once               (void);
+gboolean      gst_is_gl_memory_pbo                      (GstMemory * mem);
+
+void          gst_gl_memory_pbo_download_transfer       (GstGLMemoryPBO * gl_mem);
+void          gst_gl_memory_pbo_upload_transfer         (GstGLMemoryPBO * gl_mem);
+
+gboolean      gst_gl_memory_pbo_copy_into_texture       (GstGLMemoryPBO *gl_mem,
+                                                         guint tex_id,
+                                                         GstGLTextureTarget target,
+                                                         GstVideoGLTextureType tex_type,
+                                                         gint width,
+                                                         gint height,
+                                                         gint stride,
+                                                         gboolean respecify);
+
+/**
+ * GstGLAllocator
+ *
+ * Opaque #GstGLAllocator struct
+ */
+struct _GstGLMemoryPBOAllocator
+{
+  GstGLMemoryAllocator parent;
+};
+
+/**
+ * GstGLAllocatorClass:
+ *
+ * The #GstGLAllocatorClass only contains private data
+ */
+struct _GstGLMemoryPBOAllocatorClass
+{
+  GstGLMemoryAllocatorClass parent_class;
+};
+
+G_END_DECLS
+
+#endif /* _GST_GL_MEMORY_PBO_H_ */
diff --git a/gst-libs/gst/gl/gstgloverlaycompositor.c b/gst-libs/gst/gl/gstgloverlaycompositor.c
index 97a4aab..f7d0639 100644
--- a/gst-libs/gst/gl/gstgloverlaycompositor.c
+++ b/gst-libs/gst/gl/gstgloverlaycompositor.c
@@ -344,12 +344,27 @@
   vinfo.stride[0] = vmeta->stride[0];
 
   if (gst_video_frame_map (comp_frame, &vinfo, comp_buffer, GST_MAP_READ)) {
+    GstGLVideoAllocationParams *params;
+    GstGLBaseMemoryAllocator *mem_allocator;
+    GstAllocator *allocator;
+
+    allocator =
+        GST_ALLOCATOR (gst_gl_memory_allocator_get_default (overlay->context));
+    mem_allocator = GST_GL_BASE_MEMORY_ALLOCATOR (allocator);
+
     gst_gl_composition_overlay_add_transformation (overlay, buf);
 
-    comp_gl_memory =
-        gst_gl_memory_wrapped (overlay->context, &comp_frame->info, 0, NULL,
+    params = gst_gl_video_allocation_params_new_wrapped_data (overlay->context,
+        NULL, &comp_frame->info, 0, NULL, GST_GL_TEXTURE_TARGET_2D,
         comp_frame->data[0], comp_frame, _video_frame_unmap_and_free);
 
+    comp_gl_memory =
+        (GstGLMemory *) gst_gl_base_memory_alloc (mem_allocator,
+        (GstGLAllocationParams *) params);
+
+    gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
+    gst_object_unref (allocator);
+
     overlay_buffer = gst_buffer_new ();
     gst_buffer_append_memory (overlay_buffer, (GstMemory *) comp_gl_memory);
 
@@ -425,12 +440,24 @@
 {
   GstGLOverlayCompositor *compositor =
       (GstGLOverlayCompositor *) compositor_pointer;
+  GError *error = NULL;
 
-  if (!gst_gl_shader_compile_with_default_v_and_check (compositor->shader,
-          fragment_shader, &compositor->position_attrib,
-          &compositor->texcoord_attrib)) {
-    GST_ERROR ("could not initialize shader.");
+  if (!(compositor->shader =
+          gst_gl_shader_new_link_with_stages (context, &error,
+              gst_glsl_stage_new_default_vertex (context),
+              gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
+                  GST_GLSL_VERSION_NONE,
+                  GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
+                  fragment_shader), NULL))) {
+    GST_ERROR_OBJECT (compositor, "could not initialize shader: %s",
+        error->message);
+    return;
   }
+
+  compositor->position_attrib =
+      gst_gl_shader_get_attribute_location (compositor->shader, "a_position");
+  compositor->texcoord_attrib =
+      gst_gl_shader_get_attribute_location (compositor->shader, "a_texcoord");
 }
 
 GstGLOverlayCompositor *
@@ -441,8 +468,6 @@
 
   compositor->context = gst_object_ref (context);
 
-  compositor->shader = gst_gl_shader_new (compositor->context);
-
   gst_gl_context_thread_add (compositor->context,
       gst_gl_overlay_compositor_init_gl, compositor);
 
diff --git a/gst-libs/gst/gl/gstglshader.c b/gst-libs/gst/gl/gstglshader.c
index a41bf38..05b4caf 100644
--- a/gst-libs/gst/gl/gstglshader.c
+++ b/gst-libs/gst/gl/gstglshader.c
@@ -25,38 +25,8 @@
 
 #include "gl.h"
 #include "gstglshader.h"
+#include "gstglsl_private.h"
 
-/* FIXME: separate into separate shader stage objects that can be added/removed
- * independently of the shader program */
-
-static const gchar *es2_version_header = "#version 100\n";
-
-/* *INDENT-OFF* */
-static const gchar *simple_vertex_shader_str_gles2 =
-      "attribute vec4 a_position;\n"
-      "attribute vec2 a_texcoord;\n"
-      "varying vec2 v_texcoord;\n"
-      "void main()\n"
-      "{\n"
-      "   gl_Position = a_position;\n"
-      "   v_texcoord = a_texcoord;\n"
-      "}\n";
-
-static const gchar *simple_fragment_shader_str_gles2 =
-      "#ifdef GL_ES\n"
-      "precision mediump float;\n"
-      "#endif\n"
-      "varying vec2 v_texcoord;\n"
-      "uniform sampler2D tex;\n"
-      "void main()\n"
-      "{\n"
-      "  gl_FragColor = texture2D(tex, v_texcoord);\n"
-      "}";
-/* *INDENT-ON* */
-
-#ifndef GL_COMPILE_STATUS
-#define GL_COMPILE_STATUS             0x8B81
-#endif
 #ifndef GLhandleARB
 #define GLhandleARB GLuint
 #endif
@@ -94,27 +64,17 @@
 enum
 {
   PROP_0,
-  PROP_VERTEX_SRC,
-  PROP_FRAGMENT_SRC,
-  PROP_COMPILED,
-  PROP_ACTIVE                   /* unused */
+  PROP_LINKED,
 };
 
 struct _GstGLShaderPrivate
 {
-  gchar *vertex_src;
-  gchar *fragment_src;
-
-  GLhandleARB vertex_handle;
-  GLhandleARB fragment_handle;
   GLhandleARB program_handle;
+  GList *stages;
 
-  gboolean compiled;
-  gboolean active;
+  gboolean linked;
 
-  GstGLAPI gl_api;
-
-  GstGLShaderVTable vtable;
+  GstGLSLFuncs vtable;
 };
 
 GST_DEBUG_CATEGORY_STATIC (gst_gl_shader_debug);
@@ -130,21 +90,21 @@
 {
   GstGLShaderPrivate *priv = shader->priv;
 
+  GST_OBJECT_LOCK (shader);
+
   /* release shader objects */
-  gst_gl_shader_release (shader);
+  gst_gl_shader_release_unlocked (shader);
 
   /* delete program */
   if (priv->program_handle) {
     GST_TRACE ("finalizing program shader %u", priv->program_handle);
 
     priv->vtable.DeleteProgram (priv->program_handle);
-    /* err = glGetError (); */
-    /* GST_WARNING ("error: 0x%x", err);  */
-    /* glGetObjectParameteriv(priv->program_handle, GL_OBJECT_DELETE_STATUS_, &status); */
-    /* GST_INFO ("program deletion status:%s", status == GL_TRUE ? "true" : "false" ); */
   }
 
   GST_DEBUG ("shader deleted %u", priv->program_handle);
+
+  GST_OBJECT_UNLOCK (shader);
 }
 
 static void
@@ -158,14 +118,9 @@
 
   GST_TRACE_OBJECT (shader, "finalizing shader %u", priv->program_handle);
 
-  g_free (priv->vertex_src);
-  g_free (priv->fragment_src);
-
   gst_gl_context_thread_add (shader->context,
       (GstGLContextThreadFunc) _cleanup_shader, shader);
 
-  priv->fragment_handle = 0;
-  priv->vertex_handle = 0;
   priv->program_handle = 0;
 
   if (shader->context) {
@@ -180,15 +135,7 @@
 gst_gl_shader_set_property (GObject * object,
     guint prop_id, const GValue * value, GParamSpec * pspec)
 {
-  GstGLShader *shader = GST_GL_SHADER (object);
-
   switch (prop_id) {
-    case PROP_VERTEX_SRC:
-      gst_gl_shader_set_vertex_source (shader, g_value_get_string (value));
-      break;
-    case PROP_FRAGMENT_SRC:
-      gst_gl_shader_set_fragment_source (shader, g_value_get_string (value));
-      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -203,27 +150,13 @@
   GstGLShaderPrivate *priv = shader->priv;
 
   switch (prop_id) {
-    case PROP_VERTEX_SRC:
-      g_value_set_string (value, priv->vertex_src);
-      break;
-    case PROP_FRAGMENT_SRC:
-      g_value_set_string (value, priv->fragment_src);
-      break;
-    case PROP_COMPILED:
-      g_value_set_boolean (value, priv->compiled);
+    case PROP_LINKED:
+      g_value_set_boolean (value, priv->linked);
       break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
   }
-
-}
-
-int
-gst_gl_shader_get_program_handle (GstGLShader * shader)
-{
-  GstGLShaderPrivate *priv = shader->priv;
-  return (int) priv->program_handle;
 }
 
 static void
@@ -239,82 +172,14 @@
   obj_class->get_property = gst_gl_shader_get_property;
 
   /* .. and install properties */
-
   g_object_class_install_property (obj_class,
-      PROP_VERTEX_SRC,
-      g_param_spec_string ("vertex-src",
-          "Vertex Source",
-          "GLSL Vertex Shader source code", NULL,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-  g_object_class_install_property (obj_class,
-      PROP_FRAGMENT_SRC,
-      g_param_spec_string ("fragment-src",
-          "Fragment Source",
-          "GLSL Fragment Shader source code", NULL,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-  g_object_class_install_property (obj_class,
-      PROP_ACTIVE,
-      g_param_spec_string ("active",
-          "Active", "Enable/Disable the shader", NULL,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-  g_object_class_install_property (obj_class,
-      PROP_COMPILED,
-      g_param_spec_boolean ("compiled",
-          "Compiled",
-          "Shader compile and link status", FALSE,
+      PROP_LINKED,
+      g_param_spec_boolean ("linked",
+          "Linked",
+          "Shader link status", FALSE,
           G_PARAM_READABLE | G_PARAM_STATIC_STRINGS));
 }
 
-void
-gst_gl_shader_set_vertex_source (GstGLShader * shader, const gchar * src)
-{
-  GstGLShaderPrivate *priv;
-
-  g_return_if_fail (GST_GL_IS_SHADER (shader));
-  g_return_if_fail (src != NULL);
-
-  priv = shader->priv;
-
-  if (gst_gl_shader_is_compiled (shader))
-    gst_gl_shader_release (shader);
-
-  g_free (priv->vertex_src);
-
-  priv->vertex_src = g_strdup (src);
-}
-
-void
-gst_gl_shader_set_fragment_source (GstGLShader * shader, const gchar * src)
-{
-  GstGLShaderPrivate *priv;
-
-  g_return_if_fail (GST_GL_IS_SHADER (shader));
-  g_return_if_fail (src != NULL);
-
-  priv = shader->priv;
-
-  if (gst_gl_shader_is_compiled (shader))
-    gst_gl_shader_release (shader);
-
-  g_free (priv->fragment_src);
-
-  priv->fragment_src = g_strdup (src);
-}
-
-const gchar *
-gst_gl_shader_get_vertex_source (GstGLShader * shader)
-{
-  g_return_val_if_fail (GST_GL_IS_SHADER (shader), NULL);
-  return shader->priv->vertex_src;
-}
-
-const gchar *
-gst_gl_shader_get_fragment_source (GstGLShader * shader)
-{
-  g_return_val_if_fail (GST_GL_IS_SHADER (shader), NULL);
-  return shader->priv->fragment_src;
-}
-
 static void
 gst_gl_shader_init (GstGLShader * self)
 {
@@ -323,268 +188,437 @@
 
   priv = self->priv = GST_GL_SHADER_GET_PRIVATE (self);
 
-  priv->vertex_src = NULL;
-  priv->fragment_src = NULL;
+  priv->linked = FALSE;
+}
 
-  priv->fragment_handle = 0;
-  priv->vertex_handle = 0;
+static GstGLShader *
+_new_with_stages_va_list (GstGLContext * context, GError ** error,
+    va_list varargs)
+{
+  GstGLShader *shader;
+  GstGLSLStage *stage;
+  gboolean to_unref_and_out = FALSE;
 
-  priv->compiled = FALSE;
-  priv->active = FALSE;         /* unused at the moment */
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), NULL);
 
-  /* FIXME: add API to get/set this for each shader */
-  priv->gl_api = GST_GL_API_ANY;
+  shader = g_object_new (GST_GL_TYPE_SHADER, NULL);
+  shader->context = gst_object_ref (context);
+
+  while ((stage = va_arg (varargs, GstGLSLStage *))) {
+    if (to_unref_and_out) {
+      gst_object_unref (stage);
+      continue;
+    }
+
+    if (!gst_glsl_stage_compile (stage, error)) {
+      gst_object_unref (stage);
+      to_unref_and_out = TRUE;
+      continue;
+    }
+    if (!gst_gl_shader_attach (shader, stage)) {
+      g_set_error (error, GST_GLSL_ERROR, GST_GLSL_ERROR_PROGRAM,
+          "Failed to attach stage to program");
+      to_unref_and_out = TRUE;
+      continue;
+    }
+  }
+
+  if (to_unref_and_out) {
+    gst_object_unref (shader);
+    return NULL;
+  }
+
+  return shader;
+}
+
+/**
+ * gst_gl_shader_new_link_with_stages:
+ * @context: a #GstGLContext
+ * @error: a #GError
+ *
+ * Each stage will attempt to be compiled and attached to @shader.  Then
+ * the shader will be linked. On error, %NULL will be returned and @error will
+ * contain the details of the error.
+ *
+ * Note: must be called in the GL thread
+ *
+ * Returns: (transfer full): a new @shader with the specified stages.
+ */
+GstGLShader *
+gst_gl_shader_new_link_with_stages (GstGLContext * context, GError ** error,
+    ...)
+{
+  GstGLShader *shader;
+  va_list varargs;
+
+  va_start (varargs, error);
+  shader = _new_with_stages_va_list (context, error, varargs);
+  va_end (varargs);
+
+  if (!shader)
+    return NULL;
+
+  if (!gst_gl_shader_link (shader, error))
+    return NULL;
+
+  return shader;
+}
+
+/**
+ * gst_gl_shader_new_with_stages:
+ * @context: a #GstGLContext
+ * @error: a #GError
+ *
+ * Each stage will attempt to be compiled and attached to @shader.  On error,
+ * %NULL will be returned and @error will contain the details of the error.
+ *
+ * Note: must be called in the GL thread
+ *
+ * Returns: (transfer full): a new @shader with the specified stages.
+ */
+GstGLShader *
+gst_gl_shader_new_with_stages (GstGLContext * context, GError ** error, ...)
+{
+  GstGLShader *shader;
+  va_list varargs;
+
+  va_start (varargs, error);
+  shader = _new_with_stages_va_list (context, error, varargs);
+  va_end (varargs);
+
+  return shader;
+}
+
+/**
+ * gst_gl_shader_new:
+ * @context: a #GstGLContext
+ *
+ * Note: must be called in the GL thread
+ *
+ * Returns: (transfer full): a new empty @shader
+ */
+GstGLShader *
+gst_gl_shader_new (GstGLContext * context)
+{
+  return gst_gl_shader_new_with_stages (context, NULL, NULL);
+}
+
+/**
+ * gst_gl_shader_new_default:
+ * @context: a #GstGLContext
+ *
+ * Note: must be called in the GL thread
+ *
+ * Returns: (transfer full): a default @shader
+ */
+GstGLShader *
+gst_gl_shader_new_default (GstGLContext * context, GError ** error)
+{
+  return gst_gl_shader_new_link_with_stages (context, error,
+      gst_glsl_stage_new_default_vertex (context),
+      gst_glsl_stage_new_default_fragment (context), NULL);
+}
+
+/**
+ * gst_gl_shader_is_linked:
+ * @shader: a #GstGLShader
+ *
+ * Note: must be called in the GL thread
+ *
+ * Returns: whether @shader has been successfully linked
+ */
+gboolean
+gst_gl_shader_is_linked (GstGLShader * shader)
+{
+  gboolean ret;
+
+  g_return_val_if_fail (GST_IS_GL_SHADER (shader), FALSE);
+
+  GST_OBJECT_LOCK (shader);
+  ret = shader->priv->linked;
+  GST_OBJECT_UNLOCK (shader);
+
+  return ret;
 }
 
 static gboolean
-_fill_vtable (GstGLShader * shader, GstGLContext * context)
+_ensure_program (GstGLShader * shader)
 {
-  GstGLFuncs *gl = context->gl_vtable;
-  GstGLShaderVTable *vtable = &shader->priv->vtable;
+  if (shader->priv->program_handle)
+    return TRUE;
 
-  if (gl->CreateProgram) {
-    vtable->CreateProgram = gl->CreateProgram;
-    vtable->DeleteProgram = gl->DeleteProgram;
-    vtable->UseProgram = gl->UseProgram;
+  shader->priv->program_handle = shader->priv->vtable.CreateProgram ();
+  return shader->priv->program_handle != 0;
+}
 
-    vtable->CreateShader = gl->CreateShader;
-    vtable->DeleteShader = gl->DeleteShader;
-    vtable->AttachShader = gl->AttachShader;
-    vtable->DetachShader = gl->DetachShader;
+/**
+ * gst_gl_shader_get_program_handle:
+ * @shader: a #GstGLShader
+ *
+ * Returns: the GL program handle for this shader
+ */
+int
+gst_gl_shader_get_program_handle (GstGLShader * shader)
+{
+  int ret;
 
-    vtable->GetAttachedShaders = gl->GetAttachedShaders;
+  g_return_val_if_fail (GST_IS_GL_SHADER (shader), 0);
 
-    vtable->GetShaderInfoLog = gl->GetShaderInfoLog;
-    vtable->GetShaderiv = gl->GetShaderiv;
-    vtable->GetProgramInfoLog = gl->GetProgramInfoLog;
-    vtable->GetProgramiv = gl->GetProgramiv;
-  } else if (gl->CreateProgramObject) {
-    vtable->CreateProgram = gl->CreateProgramObject;
-    vtable->DeleteProgram = gl->DeleteObject;
-    vtable->UseProgram = gl->UseProgramObject;
+  GST_OBJECT_LOCK (shader);
+  ret = (int) shader->priv->program_handle;
+  GST_OBJECT_UNLOCK (shader);
 
-    vtable->CreateShader = gl->CreateShaderObject;
-    vtable->DeleteShader = gl->DeleteObject;
-    vtable->AttachShader = gl->AttachObject;
-    vtable->DetachShader = gl->DetachObject;
+  return ret;
+}
 
-    vtable->GetAttachedShaders = gl->GetAttachedObjects;
+/**
+ * gst_gl_shader_detach_unlocked:
+ * @shader: a #GstGLShader
+ * @stage: a #GstGLSLStage to attach
+ *
+ * Detaches @stage from @shader.  @stage must have been successfully attached
+ * to @shader with gst_gl_shader_attach() or gst_gl_shader_attach_unlocked().
+ *
+ * Note: must be called in the GL thread
+ */
+void
+gst_gl_shader_detach_unlocked (GstGLShader * shader, GstGLSLStage * stage)
+{
+  guint stage_handle;
+  GList *elem;
 
-    vtable->GetShaderInfoLog = gl->GetInfoLog;
-    vtable->GetShaderiv = gl->GetObjectParameteriv;
-    vtable->GetProgramInfoLog = gl->GetInfoLog;
-    vtable->GetProgramiv = gl->GetObjectParameteriv;
-  } else {
+  g_return_if_fail (GST_IS_GL_SHADER (shader));
+  g_return_if_fail (GST_IS_GLSL_STAGE (stage));
+
+  if (!_gst_glsl_funcs_fill (&shader->priv->vtable, shader->context)) {
+    GST_WARNING_OBJECT (shader, "Failed to retreive required GLSL functions");
+    return;
+  }
+
+  if (!shader->priv->program_handle)
+    return;
+
+  elem = g_list_find (shader->priv->stages, stage);
+  if (!elem) {
+    GST_FIXME_OBJECT (shader, "Could not find stage %p in shader %p", stage,
+        shader);
+    return;
+  }
+
+  stage_handle = gst_glsl_stage_get_handle (stage);
+  if (!stage_handle) {
+    GST_FIXME_OBJECT (shader, "Stage %p doesn't have a GL handle", stage);
+    return;
+  }
+
+  g_assert (shader->context->gl_vtable->IsProgram (shader->priv->
+          program_handle));
+  g_assert (shader->context->gl_vtable->IsShader (stage_handle));
+
+  GST_LOG_OBJECT (shader, "detaching shader %i from program %i", stage_handle,
+      (int) shader->priv->program_handle);
+  shader->priv->vtable.DetachShader (shader->priv->program_handle,
+      stage_handle);
+
+  shader->priv->stages = g_list_delete_link (shader->priv->stages, elem);
+  gst_object_unref (stage);
+}
+
+/**
+ * gst_gl_shader_detach:
+ * @shader: a #GstGLShader
+ * @stage: a #GstGLSLStage to attach
+ *
+ * Detaches @stage from @shader.  @stage must have been successfully attached
+ * to @shader with gst_gl_shader_attach() or gst_gl_shader_attach_unlocked().
+ *
+ * Note: must be called in the GL thread
+ */
+void
+gst_gl_shader_detach (GstGLShader * shader, GstGLSLStage * stage)
+{
+  g_return_if_fail (GST_IS_GL_SHADER (shader));
+  g_return_if_fail (GST_IS_GLSL_STAGE (stage));
+
+  GST_OBJECT_LOCK (shader);
+  gst_gl_shader_detach_unlocked (shader, stage);
+  GST_OBJECT_UNLOCK (shader);
+}
+
+/**
+ * gst_gl_shader_attach_unlocked:
+ * @shader: a #GstGLShader
+ * @stage: a #GstGLSLStage to attach
+ *
+ * Attaches @stage to @shader.  @stage must have been successfully compiled
+ * with gst_glsl_stage_compile().
+ *
+ * Note: must be called in the GL thread
+ *
+ * Returns: whether @stage could be attached to @shader
+ */
+gboolean
+gst_gl_shader_attach_unlocked (GstGLShader * shader, GstGLSLStage * stage)
+{
+  guint stage_handle;
+
+  g_return_val_if_fail (GST_IS_GL_SHADER (shader), FALSE);
+  g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), FALSE);
+
+  if (!_gst_glsl_funcs_fill (&shader->priv->vtable, shader->context)) {
+    GST_WARNING_OBJECT (shader, "Failed to retreive required GLSL functions");
+    return FALSE;
+  }
+
+  if (!_ensure_program (shader))
+    return FALSE;
+
+  /* already attached? */
+  if (g_list_find (shader->priv->stages, stage))
+    return TRUE;
+
+  stage_handle = gst_glsl_stage_get_handle (stage);
+  if (!stage_handle) {
+    return FALSE;
+  }
+
+  g_assert (shader->context->gl_vtable->IsProgram (shader->priv->
+          program_handle));
+  g_assert (shader->context->gl_vtable->IsShader (stage_handle));
+
+  shader->priv->stages =
+      g_list_prepend (shader->priv->stages, gst_object_ref_sink (stage));
+  GST_LOG_OBJECT (shader, "attaching shader %i to program %i", stage_handle,
+      (int) shader->priv->program_handle);
+  shader->priv->vtable.AttachShader (shader->priv->program_handle,
+      stage_handle);
+
+  return TRUE;
+}
+
+/**
+ * gst_gl_shader_attach:
+ * @shader: a #GstGLShader
+ * @stage: a #GstGLSLStage to attach
+ *
+ * Attaches @stage to @shader.  @stage must have been successfully compiled
+ * with gst_glsl_stage_compile().
+ *
+ * Note: must be called in the GL thread
+ *
+ * Returns: whether @stage could be attached to @shader
+ */
+gboolean
+gst_gl_shader_attach (GstGLShader * shader, GstGLSLStage * stage)
+{
+  gboolean ret;
+
+  g_return_val_if_fail (GST_IS_GL_SHADER (shader), FALSE);
+  g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), FALSE);
+
+  GST_OBJECT_LOCK (shader);
+  ret = gst_gl_shader_attach_unlocked (shader, stage);
+  GST_OBJECT_UNLOCK (shader);
+
+  return ret;
+}
+
+/**
+ * gst_gl_shader_compile_attach_stage:
+ * @shader: a #GstGLShader
+ * @stage: a #GstGLSLStage to attach
+ * @error: a #GError
+ *
+ * Compiles @stage and attaches it to @shader.
+ *
+ * Note: must be called in the GL thread
+ *
+ * Returns: whether @stage could be compiled and attached to @shader
+ */
+gboolean
+gst_gl_shader_compile_attach_stage (GstGLShader * shader, GstGLSLStage * stage,
+    GError ** error)
+{
+  g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), FALSE);
+
+  if (!gst_glsl_stage_compile (stage, error)) {
+    return FALSE;
+  }
+
+  if (!gst_gl_shader_attach (shader, stage)) {
+    g_set_error (error, GST_GLSL_ERROR, GST_GLSL_ERROR_COMPILE,
+        "Failed to attach stage to shader");
     return FALSE;
   }
 
   return TRUE;
 }
 
-GstGLShader *
-gst_gl_shader_new (GstGLContext * context)
-{
-  GstGLShader *shader;
-
-  g_return_val_if_fail (GST_GL_IS_CONTEXT (context), NULL);
-
-  shader = g_object_new (GST_GL_TYPE_SHADER, NULL);
-  shader->context = gst_object_ref (context);
-
-  GST_DEBUG_OBJECT (shader, "Created new GLShader for context %" GST_PTR_FORMAT,
-      context);
-
-  return shader;
-}
-
+/**
+ * gst_gl_shader_link:
+ * @shader: a #GstGLShader
+ * @error: a #GError
+ *
+ * Links the current list of #GstGLSLStage's in @shader.
+ *
+ * Note: must be called in the GL thread
+ *
+ * Returns: whether @shader could be linked together.
+ */
 gboolean
-gst_gl_shader_is_compiled (GstGLShader * shader)
-{
-  g_return_val_if_fail (GST_GL_IS_SHADER (shader), FALSE);
-
-  return shader->priv->compiled;
-}
-
-static gboolean
-_shader_string_has_version (const gchar * str)
-{
-  gboolean sl_comment = FALSE;
-  gboolean ml_comment = FALSE;
-  gboolean has_version = FALSE;
-  gint i = 0;
-
-  /* search for #version to allow for preceeding comments as allowed by the
-   * GLSL specification */
-  while (str && str[i] != '\0' && i < 1024) {
-    if (sl_comment) {
-      if (str[i] != '\n')
-        sl_comment = FALSE;
-      i++;
-      continue;
-    }
-
-    if (ml_comment) {
-      if (g_strstr_len (&str[i], 2, "*/")) {
-        ml_comment = FALSE;
-        i += 2;
-      } else {
-        i++;
-      }
-      continue;
-    }
-
-    if (g_strstr_len (&str[i], 2, "//")) {
-      sl_comment = TRUE;
-      i += 2;
-      continue;
-    }
-
-    if (g_strstr_len (&str[i], 2, "/*")) {
-      ml_comment = TRUE;
-      i += 2;
-      continue;
-    }
-
-    if (g_strstr_len (&str[i], 1, "#")) {
-      if (g_strstr_len (&str[i], 8, "#version"))
-        has_version = TRUE;
-      break;
-    }
-
-    i++;
-  }
-
-  return has_version;
-}
-
-static void
-_maybe_prepend_version (GstGLShader * shader, const gchar * shader_str,
-    gint * n_vertex_sources, const gchar *** vertex_sources)
-{
-  gint n = 1;
-
-  /* FIXME: this all an educated guess */
-  if (gst_gl_context_check_gl_version (shader->context, GST_GL_API_OPENGL3, 3,
-          0)
-      && (shader->priv->gl_api & GST_GL_API_GLES2) != 0
-      && !_shader_string_has_version (shader_str))
-    n = 2;
-
-  *vertex_sources = g_malloc0 (n * sizeof (gchar *));
-
-  if (n > 1)
-    *vertex_sources[0] = es2_version_header;
-
-  (*vertex_sources)[n - 1] = shader_str;
-  *n_vertex_sources = n;
-}
-
-gboolean
-gst_gl_shader_compile (GstGLShader * shader, GError ** error)
+gst_gl_shader_link (GstGLShader * shader, GError ** error)
 {
   GstGLShaderPrivate *priv;
-  GstGLFuncs *gl;
-
+  const GstGLFuncs *gl;
   gchar info_buffer[2048];
-  gint len = 0;
   GLint status = GL_FALSE;
+  gint len = 0;
+  gboolean ret;
+  GList *elem;
 
-  g_return_val_if_fail (GST_GL_IS_SHADER (shader), FALSE);
+  g_return_val_if_fail (GST_IS_GL_SHADER (shader), FALSE);
+
+  GST_OBJECT_LOCK (shader);
 
   priv = shader->priv;
   gl = shader->context->gl_vtable;
 
-  if (priv->compiled)
-    return priv->compiled;
+  if (priv->linked) {
+    GST_OBJECT_UNLOCK (shader);
+    return TRUE;
+  }
 
-  if (!_fill_vtable (shader, shader->context))
+  if (!_gst_glsl_funcs_fill (&shader->priv->vtable, shader->context)) {
+    g_set_error (error, GST_GLSL_ERROR, GST_GLSL_ERROR_PROGRAM,
+        "Failed to retreive required GLSL functions");
+    GST_OBJECT_UNLOCK (shader);
     return FALSE;
+  }
 
-  shader->priv->program_handle = shader->priv->vtable.CreateProgram ();
+  if (!_ensure_program (shader)) {
+    g_set_error (error, GST_GLSL_ERROR, GST_GLSL_ERROR_PROGRAM,
+        "Failed to create GL program object");
+    GST_OBJECT_UNLOCK (shader);
+    return FALSE;
+  }
 
   GST_TRACE ("shader created %u", shader->priv->program_handle);
 
-  g_return_val_if_fail (priv->program_handle, FALSE);
+  for (elem = shader->priv->stages; elem; elem = elem->next) {
+    GstGLSLStage *stage = elem->data;
 
-  if (priv->vertex_src) {
-    gint n_vertex_sources;
-    const gchar **vertex_sources;
-
-    _maybe_prepend_version (shader, priv->vertex_src, &n_vertex_sources,
-        &vertex_sources);
-
-    /* create vertex object */
-    priv->vertex_handle = priv->vtable.CreateShader (GL_VERTEX_SHADER);
-    gl->ShaderSource (priv->vertex_handle, n_vertex_sources, vertex_sources,
-        NULL);
-    g_free (vertex_sources);
-
-    /* compile */
-    gl->CompileShader (priv->vertex_handle);
-    /* check everything is ok */
-    status = GL_FALSE;
-    gl->GetShaderiv (priv->vertex_handle, GL_COMPILE_STATUS, &status);
-
-    priv->vtable.GetShaderInfoLog (priv->vertex_handle,
-        sizeof (info_buffer) - 1, &len, info_buffer);
-    info_buffer[len] = '\0';
-
-    if (status != GL_TRUE) {
-      GST_ERROR ("Vertex Shader compilation failed:\n%s", info_buffer);
-
-      g_set_error (error, GST_GL_SHADER_ERROR,
-          GST_GL_SHADER_ERROR_COMPILE,
-          "Vertex Shader compilation failed:\n%s", info_buffer);
-
-      priv->vtable.DeleteShader (priv->vertex_handle);
-      priv->compiled = FALSE;
-      return priv->compiled;
-    } else if (len > 1) {
-      GST_FIXME ("vertex shader info log:\n%s\n", info_buffer);
+    if (!gst_glsl_stage_compile (stage, error)) {
+      GST_OBJECT_UNLOCK (shader);
+      return FALSE;
     }
-    priv->vtable.AttachShader (priv->program_handle, priv->vertex_handle);
 
-    GST_LOG ("vertex shader attached %u", priv->vertex_handle);
-  }
-
-  if (priv->fragment_src) {
-    gint n_fragment_sources;
-    const gchar **fragment_sources;
-
-    _maybe_prepend_version (shader, priv->fragment_src, &n_fragment_sources,
-        &fragment_sources);
-
-    /* create fragment object */
-    priv->fragment_handle = priv->vtable.CreateShader (GL_FRAGMENT_SHADER);
-    gl->ShaderSource (priv->fragment_handle, n_fragment_sources,
-        fragment_sources, NULL);
-    g_free (fragment_sources);
-    /* compile */
-    gl->CompileShader (priv->fragment_handle);
-    /* check everything is ok */
-    status = GL_FALSE;
-    priv->vtable.GetShaderiv (priv->fragment_handle,
-        GL_COMPILE_STATUS, &status);
-
-    priv->vtable.GetShaderInfoLog (priv->fragment_handle,
-        sizeof (info_buffer) - 1, &len, info_buffer);
-    info_buffer[len] = '\0';
-    if (status != GL_TRUE) {
-      GST_ERROR ("Fragment Shader compilation failed:\n%s", info_buffer);
-
-      g_set_error (error, GST_GL_SHADER_ERROR,
-          GST_GL_SHADER_ERROR_COMPILE,
-          "Fragment Shader compilation failed:\n%s", info_buffer);
-
-      priv->vtable.DeleteShader (priv->fragment_handle);
-      priv->compiled = FALSE;
-      return priv->compiled;
-    } else if (len > 1) {
-      GST_FIXME ("vertex shader info log:\n%s\n", info_buffer);
+    if (!gst_gl_shader_attach_unlocked (shader, stage)) {
+      g_set_error (error, GST_GLSL_ERROR, GST_GLSL_ERROR_COMPILE,
+          "Failed to attach shader %" GST_PTR_FORMAT "to program %"
+          GST_PTR_FORMAT, stage, shader);
+      GST_OBJECT_UNLOCK (shader);
+      return FALSE;
     }
-    priv->vtable.AttachShader (priv->program_handle, priv->fragment_handle);
-
-    GST_LOG ("fragment shader attached %u", priv->fragment_handle);
   }
 
   /* if nothing failed link shaders */
@@ -599,59 +633,89 @@
   if (status != GL_TRUE) {
     GST_ERROR ("Shader linking failed:\n%s", info_buffer);
 
-    g_set_error (error, GST_GL_SHADER_ERROR,
-        GST_GL_SHADER_ERROR_LINK, "Shader Linking failed:\n%s", info_buffer);
-    priv->compiled = FALSE;
-    return priv->compiled;
+    g_set_error (error, GST_GLSL_ERROR, GST_GLSL_ERROR_LINK,
+        "Shader Linking failed:\n%s", info_buffer);
+    ret = priv->linked = FALSE;
+    GST_OBJECT_UNLOCK (shader);
+    return ret;
   } else if (len > 1) {
     GST_FIXME ("shader link log:\n%s\n", info_buffer);
   }
-  /* success! */
-  priv->compiled = TRUE;
-  g_object_notify (G_OBJECT (shader), "compiled");
 
-  return priv->compiled;
+  ret = priv->linked = TRUE;
+  GST_OBJECT_UNLOCK (shader);
+
+  g_object_notify (G_OBJECT (shader), "linked");
+
+  return ret;
 }
 
+/**
+ * gst_gl_shader_release_unlocked:
+ * @shader: a #GstGLShader
+ *
+ * Releases the shader and stages.
+ *
+ * Note: must be called in the GL thread
+ */
 void
-gst_gl_shader_release (GstGLShader * shader)
+gst_gl_shader_release_unlocked (GstGLShader * shader)
 {
   GstGLShaderPrivate *priv;
+  GList *elem;
 
-  g_return_if_fail (GST_GL_IS_SHADER (shader));
+  g_return_if_fail (GST_IS_GL_SHADER (shader));
 
   priv = shader->priv;
 
-  if (!priv->compiled || !priv->program_handle)
-    return;
+  for (elem = shader->priv->stages; elem;) {
+    GstGLSLStage *stage = elem->data;
+    GList *next = elem->next;
 
-  if (priv->vertex_handle) {    /* not needed but nvidia doesn't care to respect the spec */
-    GST_TRACE ("finalizing vertex shader %u", priv->vertex_handle);
-
-    priv->vtable.DeleteShader (priv->vertex_handle);
+    gst_gl_shader_detach_unlocked (shader, stage);
+    elem = next;
   }
 
-  if (priv->fragment_handle) {
-    GST_TRACE ("finalizing fragment shader %u", priv->fragment_handle);
+  g_list_free_full (shader->priv->stages, (GDestroyNotify) gst_object_unref);
+  shader->priv->stages = NULL;
 
-    priv->vtable.DeleteShader (priv->fragment_handle);
-  }
+  priv->linked = FALSE;
 
-  if (priv->vertex_handle)
-    priv->vtable.DetachShader (priv->program_handle, priv->vertex_handle);
-  if (priv->fragment_handle)
-    priv->vtable.DetachShader (priv->program_handle, priv->fragment_handle);
-
-  priv->compiled = FALSE;
-  g_object_notify (G_OBJECT (shader), "compiled");
+  g_object_notify (G_OBJECT (shader), "linked");
 }
 
+/**
+ * gst_gl_shader_release:
+ * @shader: a #GstGLShader
+ *
+ * Releases the shader and stages.
+ *
+ * Note: must be called in the GL thread
+ */
+void
+gst_gl_shader_release (GstGLShader * shader)
+{
+  g_return_if_fail (GST_IS_GL_SHADER (shader));
+
+  GST_OBJECT_LOCK (shader);
+  gst_gl_shader_release_unlocked (shader);
+  GST_OBJECT_UNLOCK (shader);
+}
+
+/**
+ * gst_gl_shader_use:
+ * @shader: a #GstGLShader
+ *
+ * Mark's @shader as being used for the next GL draw command.
+ *
+ * Note: must be called in the GL thread and @shader must have been linked.
+ */
 void
 gst_gl_shader_use (GstGLShader * shader)
 {
   GstGLShaderPrivate *priv;
 
-  g_return_if_fail (GST_GL_IS_SHADER (shader));
+  g_return_if_fail (GST_IS_GL_SHADER (shader));
 
   priv = shader->priv;
 
@@ -662,12 +726,20 @@
   return;
 }
 
+/**
+ * gst_gl_context_clear_shader:
+ * @shader: a #GstGLShader
+ *
+ * Clear's the currently set shader from the GL state machine.
+ *
+ * Note: must be called in the GL thread.
+ */
 void
 gst_gl_context_clear_shader (GstGLContext * context)
 {
   GstGLFuncs *gl;
 
-  g_return_if_fail (GST_GL_IS_CONTEXT (context));
+  g_return_if_fail (GST_IS_GL_CONTEXT (context));
 
   gl = context->gl_vtable;
 
@@ -677,104 +749,6 @@
     gl->UseProgramObject (0);
 }
 
-gboolean
-gst_gl_shader_compile_and_check (GstGLShader * shader,
-    const gchar * source, GstGLShaderSourceType type)
-{
-  gboolean is_compiled = FALSE;
-
-  g_object_get (G_OBJECT (shader), "compiled", &is_compiled, NULL);
-
-  if (!is_compiled) {
-    GError *error = NULL;
-
-    switch (type) {
-      case GST_GL_SHADER_FRAGMENT_SOURCE:
-        gst_gl_shader_set_fragment_source (shader, source);
-        break;
-      case GST_GL_SHADER_VERTEX_SOURCE:
-        gst_gl_shader_set_vertex_source (shader, source);
-        break;
-      default:
-        g_assert_not_reached ();
-        break;
-    }
-
-    gst_gl_shader_compile (shader, &error);
-    if (error) {
-      gst_gl_context_set_error (shader->context, "%s", error->message);
-      g_error_free (error);
-      gst_gl_context_clear_shader (shader->context);
-
-      return FALSE;
-    }
-  }
-  return TRUE;
-}
-
-gboolean
-gst_gl_shader_compile_all_with_attribs_and_check (GstGLShader * shader,
-    const gchar * v_src, const gchar * f_src, const gint n_attribs,
-    const gchar * attrib_names[], GLint attrib_locs[])
-{
-  gint i = 0;
-  GError *error = NULL;
-
-  gst_gl_shader_set_vertex_source (shader, v_src);
-  gst_gl_shader_set_fragment_source (shader, f_src);
-
-  gst_gl_shader_compile (shader, &error);
-  if (error) {
-    gst_gl_context_set_error (shader->context, "%s", error->message);
-    g_error_free (error);
-    gst_gl_context_clear_shader (shader->context);
-
-    return FALSE;
-  }
-
-  for (i = 0; i < n_attribs; i++)
-    attrib_locs[i] =
-        gst_gl_shader_get_attribute_location (shader, attrib_names[i]);
-
-  return TRUE;
-}
-
-gboolean
-gst_gl_shader_compile_with_default_f_and_check (GstGLShader * shader,
-    const gchar * v_src, const gint n_attribs, const gchar * attrib_names[],
-    GLint attrib_locs[])
-{
-  return gst_gl_shader_compile_all_with_attribs_and_check (shader, v_src,
-      simple_fragment_shader_str_gles2, n_attribs, attrib_names, attrib_locs);
-}
-
-gboolean
-gst_gl_shader_compile_with_default_v_and_check (GstGLShader * shader,
-    const gchar * f_src, GLint * pos_loc, GLint * tex_loc)
-{
-  const gchar *attrib_names[2] = { "a_position", "a_texcoord" };
-  GLint attrib_locs[2] = { 0 };
-  gboolean ret = TRUE;
-
-  ret = gst_gl_shader_compile_all_with_attribs_and_check (shader,
-      simple_vertex_shader_str_gles2, f_src, 2, attrib_names, attrib_locs);
-
-  if (ret) {
-    *pos_loc = attrib_locs[0];
-    *tex_loc = attrib_locs[1];
-  }
-
-  return ret;
-}
-
-gboolean
-gst_gl_shader_compile_with_default_vf_and_check (GstGLShader * shader,
-    GLint * pos_loc, GLint * tex_loc)
-{
-  return gst_gl_shader_compile_with_default_v_and_check (shader,
-      simple_fragment_shader_str_gles2, pos_loc, tex_loc);
-}
-
 void
 gst_gl_shader_set_uniform_1f (GstGLShader * shader, const gchar * name,
     gfloat value)
@@ -1233,16 +1207,20 @@
 {
   GstGLShaderPrivate *priv;
   GstGLFuncs *gl;
+  gint ret;
 
   g_return_val_if_fail (shader != NULL, -1);
   priv = shader->priv;
   g_return_val_if_fail (priv->program_handle != 0, -1);
-  if (0 == priv->vertex_handle)
-    return -1;
 
   gl = shader->context->gl_vtable;
 
-  return gl->GetAttribLocation (priv->program_handle, name);
+  ret = gl->GetAttribLocation (priv->program_handle, name);
+
+  GST_TRACE_OBJECT (shader, "retreived program %i attribute \'%s\' location %i",
+      (int) priv->program_handle, name, ret);
+
+  return ret;
 }
 
 void
@@ -1257,11 +1235,8 @@
   g_return_if_fail (priv->program_handle != 0);
   gl = shader->context->gl_vtable;
 
-  gl->BindAttribLocation (priv->program_handle, index, name);
-}
+  GST_TRACE_OBJECT (shader, "binding program %i attribute \'%s\' location %i",
+      (int) priv->program_handle, name, index);
 
-GQuark
-gst_gl_shader_error_quark (void)
-{
-  return g_quark_from_static_string ("gst-gl-shader-error");
+  gl->BindAttribLocation (priv->program_handle, index, name);
 }
diff --git a/gst-libs/gst/gl/gstglshader.h b/gst-libs/gst/gl/gstglshader.h
index 97f98fc..21410e2 100644
--- a/gst-libs/gst/gl/gstglshader.h
+++ b/gst-libs/gst/gl/gstglshader.h
@@ -26,26 +26,14 @@
 
 G_BEGIN_DECLS
 
+GType gst_gl_shader_get_type (void);
 #define GST_GL_TYPE_SHADER         (gst_gl_shader_get_type())
 #define GST_GL_SHADER(o)           (G_TYPE_CHECK_INSTANCE_CAST((o), GST_GL_TYPE_SHADER, GstGLShader))
 #define GST_GL_SHADER_CLASS(k)     (G_TYPE_CHECK_CLASS((k), GST_GL_TYPE_SHADER, GstGLShaderClass))
-#define GST_GL_IS_SHADER(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_SHADER))
-#define GST_GL_IS_SHADER_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_SHADER))
+#define GST_IS_GL_SHADER(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_SHADER))
+#define GST_IS_GL_SHADER_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_SHADER))
 #define GST_GL_SHADER_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_GL_TYPE_SHADER, GstGLShaderClass))
 
-#define GST_GL_SHADER_ERROR (gst_gl_shader_error_quark ())
-
-typedef enum {
-  GST_GL_SHADER_ERROR_COMPILE,
-  GST_GL_SHADER_ERROR_LINK,
-  GST_GL_SHADER_ERROR_PROGRAM
-} GstGLShaderError;
-
-typedef enum {
-  GST_GL_SHADER_FRAGMENT_SOURCE,
-  GST_GL_SHADER_VERTEX_SOURCE
-} GstGLShaderSourceType;
-
 struct _GstGLShader {
   /*< private >*/
   GstObject parent;
@@ -53,6 +41,8 @@
   GstGLContext *context;
 
   GstGLShaderPrivate *priv;
+
+  gpointer _padding[GST_PADDING];
 };
 
 struct _GstGLShaderClass {
@@ -60,33 +50,29 @@
   GstObjectClass parent_class;
 };
 
-/* methods */
+GstGLShader * gst_gl_shader_new                     (GstGLContext *context);
+GstGLShader * gst_gl_shader_new_with_stages         (GstGLContext * context, GError ** error, ...);
+GstGLShader * gst_gl_shader_new_link_with_stages    (GstGLContext * context, GError ** error, ...);
+GstGLShader * gst_gl_shader_new_default             (GstGLContext * context, GError ** error);
 
-GQuark gst_gl_shader_error_quark (void);
-GType gst_gl_shader_get_type (void);
+gboolean gst_gl_shader_attach                       (GstGLShader * shader, GstGLSLStage * stage);
+gboolean gst_gl_shader_attach_unlocked              (GstGLShader * shader, GstGLSLStage * stage);
 
-GstGLShader * gst_gl_shader_new (GstGLContext *context);
+void     gst_gl_shader_detach                       (GstGLShader * shader, GstGLSLStage * stage);
+void     gst_gl_shader_detach_unlocked              (GstGLShader * shader, GstGLSLStage * stage);
 
-int gst_gl_shader_get_program_handle(GstGLShader * shader);
+gboolean gst_gl_shader_compile_attach_stage         (GstGLShader * shader,
+                                                     GstGLSLStage *stage,
+                                                     GError ** error);
+gboolean gst_gl_shader_link                         (GstGLShader * shader, GError ** error);
+gboolean gst_gl_shader_is_linked                    (GstGLShader *shader);
 
-void          gst_gl_shader_set_vertex_source   (GstGLShader *shader, const gchar *src);
-void          gst_gl_shader_set_fragment_source (GstGLShader *shader, const gchar *src);
-const gchar * gst_gl_shader_get_vertex_source   (GstGLShader *shader);
-const gchar * gst_gl_shader_get_fragment_source (GstGLShader *shader);
+int gst_gl_shader_get_program_handle                (GstGLShader * shader);
 
-void     gst_gl_shader_set_active        (GstGLShader *shader, gboolean active);
-gboolean gst_gl_shader_is_compiled       (GstGLShader *shader);
-gboolean gst_gl_shader_compile           (GstGLShader *shader, GError **error);
-gboolean gst_gl_shader_compile_and_check (GstGLShader *shader, const gchar *source, GstGLShaderSourceType type);
-gboolean gst_gl_shader_compile_all_with_attribs_and_check (GstGLShader *shader, const gchar *v_src, const gchar *f_src, const gint n_attribs, const gchar *attrib_names[], GLint attrib_locs[]);
-
-gboolean gst_gl_shader_compile_with_default_f_and_check   (GstGLShader *shader, const gchar *v_src, const gint n_attribs, const gchar *attrib_names[], GLint attrib_locs[]);
-gboolean gst_gl_shader_compile_with_default_v_and_check   (GstGLShader *shader, const gchar *f_src, GLint *pos_loc, GLint *tex_loc);
-gboolean gst_gl_shader_compile_with_default_vf_and_check  (GstGLShader *shader, GLint *pos_loc, GLint *tex_loc);
-
-void gst_gl_shader_release       (GstGLShader *shader);
-void gst_gl_shader_use           (GstGLShader *shader);
-void gst_gl_context_clear_shader (GstGLContext *context);
+void gst_gl_shader_release                          (GstGLShader *shader);
+void gst_gl_shader_release_unlocked                 (GstGLShader * shader);
+void gst_gl_shader_use                              (GstGLShader *shader);
+void gst_gl_context_clear_shader                    (GstGLContext *context);
 
 void gst_gl_shader_set_uniform_1i           (GstGLShader *shader, const gchar *name, gint value);
 void gst_gl_shader_set_uniform_1iv          (GstGLShader *shader, const gchar *name, guint count, gint *value);
diff --git a/gst-libs/gst/gl/gstglshaderstrings.c b/gst-libs/gst/gl/gstglshaderstrings.c
new file mode 100644
index 0000000..729be6f
--- /dev/null
+++ b/gst-libs/gst/gl/gstglshaderstrings.c
@@ -0,0 +1,71 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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 "gstglshaderstrings.h"
+
+/* *INDENT-OFF* */
+const gchar *gst_gl_shader_string_vertex_default =
+    "attribute vec4 a_position;\n"
+    "attribute vec2 a_texcoord;\n"
+    "varying vec2 v_texcoord;\n"
+    "void main()\n"
+    "{\n"
+    "   gl_Position = a_position;\n"
+    "   v_texcoord = a_texcoord;\n"
+    "}\n";
+
+const gchar *gst_gl_shader_string_vertex_mat4_texture_transform =
+    "uniform mat4 u_transformation;\n"
+    "attribute vec4 a_position;\n"
+    "attribute vec2 a_texcoord;\n"
+    "varying vec2 v_texcoord;\n"
+    "void main()\n"
+    "{\n"
+    "   gl_Position = a_position;\n"
+    "   v_texcoord = (u_transformation * vec4(a_texcoord, 0, 1)).xy;\n"
+    "}\n";
+
+const gchar *gst_gl_shader_string_fragment_default =
+    "#ifdef GL_ES\n"
+    "precision mediump float;\n"
+    "#endif\n"
+    "varying vec2 v_texcoord;\n"
+    "uniform sampler2D tex;\n"
+    "void main()\n"
+    "{\n"
+    "  gl_FragColor = texture2D(tex, v_texcoord);\n"
+    "}";
+
+const gchar *gst_gl_shader_string_fragment_external_oes_default =
+    "#extension GL_OES_EGL_image_external : require\n"
+    "#ifdef GL_ES\n"
+    "precision mediump float;\n"
+    "#endif\n"
+    "varying vec2 v_texcoord;\n"
+    "uniform samplerExternalOES tex;\n"
+    "void main()\n"
+    "{\n"
+    "  gl_FragColor = texture2D(tex, v_texcoord);\n"
+    "}";
+/* *INDENT-ON* */
diff --git a/gst-libs/gst/gl/gstglshaderstrings.h b/gst-libs/gst/gl/gstglshaderstrings.h
new file mode 100644
index 0000000..49ea8de
--- /dev/null
+++ b/gst-libs/gst/gl/gstglshaderstrings.h
@@ -0,0 +1,36 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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_SHADER_STRINGS_H__
+#define __GST_GL_SHADER_STRINGS_H__
+
+#include <gst/gl/gl.h>
+
+G_BEGIN_DECLS
+
+extern const gchar *gst_gl_shader_string_vertex_default;
+extern const gchar *gst_gl_shader_string_fragment_default;
+
+extern const gchar *gst_gl_shader_string_vertex_mat4_texture_transform;
+extern const gchar *gst_gl_shader_string_fragment_external_oes_default;
+
+G_END_DECLS
+
+#endif /* __GST_GL_SHADER_STRINGS_H__ */
diff --git a/gst-libs/gst/gl/gstglshadervariables.c b/gst-libs/gst/gl/gstglshadervariables.c
deleted file mode 100644
index be04c94..0000000
--- a/gst-libs/gst/gl/gstglshadervariables.c
+++ /dev/null
@@ -1,1488 +0,0 @@
-/*
- * GStreamer
- * Copyright (C) 2009 Luc Deschenaux <luc.deschenaux@freesurf.ch>
- *
- * 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 "gstglshadervariables.h"
-
-#if !defined(strtok_r) && defined(G_OS_WIN32)
-#if defined(_MSC_VER)
-#define strtok_r strtok_s
-#else
-#define strtok_r(s,d,p) strtok(s,d)
-#endif
-#endif
-
-#define trimleft(s,chars) while(s[0] && strchr(chars,s[0])) ++s;
-#define trimright(s,chars) { \
-	char *end; \
-	end=s+strlen(s)-1; \
-	while(end>=s && strchr(chars,end[0])) (end--)[0]=0; \
-}
-
-const char *gst_gl_shadervariable_datatype[] = {
-  "bool",
-  "int",
-  "uint",
-  "float",
-  "vec2",
-  "vec3",
-  "vec4",
-  "bvec2",
-  "bvec3",
-  "bvec4",
-  "ivec2",
-  "ivec3",
-  "ivec4",
-  "uvec2",
-  "uvec3",
-  "uvec4",
-  "mat2",
-  "mat3",
-  "mat4",
-  "mat2x2",
-  "mat2x3",
-  "mat2x4",
-  "mat3x2",
-  "mat3x3",
-  "mat3x4",
-  "mat4x2",
-  "mat4x3",
-  "mat4x4",
-  0
-};
-
-typedef enum
-{
-  _bool,
-  _int,
-  _uint,
-  _float,
-  _vec2,
-  _vec3,
-  _vec4,
-  _bvec2,
-  _bvec3,
-  _bvec4,
-  _ivec2,
-  _ivec3,
-  _ivec4,
-  _uvec2,
-  _uvec3,
-  _uvec4,
-  _mat2,
-  _mat3,
-  _mat4,
-  _mat2x2,
-  _mat2x3,
-  _mat2x4,
-  _mat3x2,
-  _mat3x3,
-  _mat3x4,
-  _mat4x2,
-  _mat4x3,
-  _mat4x4,
-  _datatypecount
-} gst_gl_shadervariable_datatypeindex;
-
-typedef struct gst_gl_shadervariable_desc
-{
-  gst_gl_shadervariable_datatypeindex type;
-  char *name;
-  int arraysize;
-  int count;
-  void *value;
-
-} gst_gl_shadervariable_desc;
-
-char *parsename (char **varname, int *arraysize, char **saveptr);
-char *parsevalue (char *value, char *_saveptr,
-    struct gst_gl_shadervariable_desc *ret);
-char *vec_parsevalue (int n, char *value, char *_saveptr,
-    struct gst_gl_shadervariable_desc *ret);
-char *bvec_parsevalue (int n, char *value, char *_saveptr,
-    struct gst_gl_shadervariable_desc *ret);
-char *ivec_parsevalue (int n, char *value, char *_saveptr,
-    struct gst_gl_shadervariable_desc *ret);
-char *uvec_parsevalue (int n, char *value, char *_saveptr,
-    struct gst_gl_shadervariable_desc *ret);
-char *mat_parsevalue (int n, int m, char *value, char *_saveptr,
-    struct gst_gl_shadervariable_desc *ret);
-
-/*
-	Function:
-		gst_gl_shadervariables_parse
-
-	Description:
-		Parse uniform variables declarations and set their values in
-		the specified shader.
-
-	Arguments:
-
-		GstGLShader *shader:
-			Shader in which variables are to be set.
-
-		char *variables:
-			The text to be parsed.
-
-		int (*_setvariable)():
-			Defaults to gst_gl_shadervariable_set().
-			You can specify here a user function for managing the
-			parsed variable description.
-
-	return values:
-		 0: 	No error.
-		-1:	Error.
-
-*/
-
-int
-gst_gl_shadervariables_parse (GstGLShader * shader, char *variables,
-    int (*_setvariable) (GstGLShader * shader,
-        struct gst_gl_shadervariable_desc * v))
-{
-  char *p = 0;
-  char *p0;
-  char *e;
-  char e1 = 0;
-  char *t = 0;
-  char *varname;
-  char *vartype;
-  char *varvalue;
-  int arraysize = 0;
-  char *saveptr = variables;
-  int line = 1;
-  char *lim;
-  int i;
-  int len;
-  struct gst_gl_shadervariable_desc ret;
-
-  if (!_setvariable) {
-    _setvariable = gst_gl_shadervariable_set;
-  }
-
-  if (!variables)
-    return 0;
-
-  p0 = variables;
-  trimright (p0, " \t\r\n");
-  lim = variables + strlen (variables);
-  e = strchr (p0, ';');
-  while (p0 < lim) {
-
-    if (!e) {
-      if (p0[0])
-        goto parse_error;
-      break;
-    }
-
-    e1 = e[1];
-    e[1] = 0;
-    p = g_strdup (p0);
-    e[1] = e1;
-
-    trimright (p, " \t");
-    trimleft (p, " \t\r\n");
-
-    t = strtok_r (p, " \t", &saveptr);
-    if (!t)
-      goto parse_error;
-    trimleft (t, " \t");
-    trimright (t, " \t\r\n");
-
-    if (t[0]) {
-
-      if (!strcmp (t, "const")) {
-        t = strtok_r (0, " \t", &saveptr);
-        if (!t)
-          goto parse_error;
-        trimleft (t, " \t");
-        if (!t[0])
-          goto parse_error;
-      }
-      // parse data type
-      for (i = 0; i < _datatypecount; ++i) {
-        if (!strcmp (t, gst_gl_shadervariable_datatype[i])) {
-          ret.type = (gst_gl_shadervariable_datatypeindex) i;
-          break;
-        }
-      }
-      if (i == _datatypecount)
-        goto parse_error;
-
-      vartype = g_strdup (t);
-      GST_INFO ("vartype : '%s'\n", vartype);
-
-      trimleft (saveptr, " \t");
-      t = saveptr;
-      if (*saveptr == '=')
-        goto parse_error;
-
-      // parse variable name and array size
-      t = parsename (&varname, &arraysize, &saveptr);
-      if (t)
-        goto parse_error;
-
-      trimright (varname, " \t");
-      GST_INFO ("varname : '%s'\n", varname);
-      GST_INFO ("arraysize : %d\n", arraysize);
-
-      // check type cast after assignement operator
-      t = strtok_r (0, "(", &saveptr);
-      if (!t)
-        goto parse_error;
-      trimleft (t, " \t");
-      trimright (t, " \t");
-
-      if (arraysize) {
-        gchar *s = g_strdup_printf ("%s[%d]", vartype, arraysize);
-        if (strcmp (t, s)) {
-          g_free (s);
-          goto parse_error;
-        }
-        g_free (s);
-      } else {
-        if (strcmp (t, vartype))
-          goto parse_error;
-      }
-
-      // extract variable value
-      t = strtok_r (0, ";", &saveptr);
-      if (!t)
-        goto parse_error;
-      trimleft (t, " \t");
-      trimright (t, " \t");
-
-      if (!t[0])
-        goto parse_error;
-      if (*(saveptr - 2) != ')')
-        goto parse_error;
-      *(saveptr - 2) = 0;
-      if (!t[0])
-        goto parse_error;
-
-      varvalue = g_strdup (t);
-      GST_INFO ("value: %s\n\n", varvalue);
-
-      t = saveptr;
-      if (t[0])
-        goto parse_error;
-
-      // parse variable value
-      len = strlen (varvalue);
-      ret.name = varname;
-      ret.arraysize = arraysize;
-      t = parsevalue (varvalue, saveptr, &ret);
-      if (t) {
-        t -= len;
-        goto parse_error;
-      }
-      // set variable value
-      _setvariable (shader, &ret);
-
-      fflush (0);
-    }
-    // Tell me why we cannot free(p) whithout segfault.
-    //g_free(p);
-    p0 = e + 1;
-    ++line;
-    e = strchr (p0, ';');
-  }
-
-  return 0;
-
-parse_error:
-  if (!t) {
-    t = saveptr;
-  }
-  if (!e) {
-    t = p = p0;
-  } else {
-    e[1] = 0;
-    trimleft (p0, " \t\r\n");
-    GST_ERROR ("\n%s", p0);
-    e[1] = e1;
-  }
-  GST_ERROR ("parse error on line %d, position %ld (%s)", line, (glong) (t - p),
-      t);
-  return -1;
-}
-
-/*
-	Function:
-		parsename
-
-	Description:
-		Parse text between the data type and the assignement operator
-		(ie: variable name and array size).
-
-	Arguments:
-
-		char **varname:
-			Text to parse.
-
-		int *arraysize:
-			Pointer to array size. Set to 0 if no array.
-
-		char **saveptr:
-			Address of char *saveptr for strtok_r()
-
-	return values:
-		 0: 	No error.
-		!0:	Pointer to parse error.
-
-*/
-
-char *
-parsename (char **varname, int *arraysize, char **saveptr)
-{
-  char *t;
-  char *i;
-  gint j;
-
-  *arraysize = 0;
-  t = strtok_r (0, "=", saveptr);
-  if (!t)
-    return *saveptr;
-
-  trimleft (t, " \t");
-  trimright (t, " \t");
-
-  i = strchr (t, '[');
-  if (!i) {                     // not an array
-    if (!t[0])
-      return t;
-    for (j = 0; j < (gint) strlen (t); ++j) {
-      if (!strchr (VALID_VARNAME_CHARS, t[j]))
-        return t + j;
-    }
-    *varname = g_strdup (t);
-  } else {                      // is an array
-
-    char *i2;
-    char *c;
-
-    i2 = strchr (i + 1, ']');
-    if (!i2)
-      return i + 1;
-    *i = 0;
-
-    if (!t[0])
-      return t;
-    for (j = 0; j < (gint) strlen (t); ++j) {
-      if (!strchr (VALID_VARNAME_CHARS, t[j]))
-        return t;
-    }
-
-    *varname = g_strdup (t);
-    *i = '[';
-
-    for (c = i + 1; c < i2; ++c)
-      if (*c < '0' || *c > '9')
-        return c;
-
-    *i2 = 0;
-    *arraysize = atoi (i + 1);
-    *i2 = ']';
-
-    if (!*arraysize)
-      return i + 1;
-  }
-
-  return 0;
-}
-
-/*
-	Function:
-		gst_gl_shadervariable_set
-
-	Description:
-		Set variable value in the specified shader
-
-	Arguments:
-
-		GstGlShader *shader:
-			The shader where to set the variable.
-
-		struct gst_gl_shadervariable_desc *ret:
-			The variable description.
-
-	return values:
-		 0: 	No error.
-		!0:	Variable type unknown/incorrect.
-
-*/
-
-int
-gst_gl_shadervariable_set (GstGLShader * shader,
-    struct gst_gl_shadervariable_desc *ret)
-{
-
-  switch (ret->type) {
-    case _bool:
-      if (ret->arraysize) {
-        gst_gl_shader_set_uniform_1iv (shader, ret->name, ret->count,
-            (int *) ret->value);
-      } else {
-        gst_gl_shader_set_uniform_1i (shader, ret->name,
-            ((int *) ret->value)[0]);
-      }
-      break;
-    case _int:
-      if (ret->arraysize) {
-        gst_gl_shader_set_uniform_1iv (shader, ret->name, ret->count,
-            (int *) ret->value);
-      } else {
-        gst_gl_shader_set_uniform_1i (shader, ret->name,
-            ((int *) ret->value)[0]);
-      }
-      break;
-
-    case _uint:
-      if (ret->arraysize) {
-        gst_gl_shader_set_uniform_1iv (shader, ret->name, ret->count,
-            (int *) ret->value);
-      } else {
-        gst_gl_shader_set_uniform_1i (shader, ret->name,
-            ((unsigned int *) ret->value)[0]);
-      }
-      break;
-
-    case _float:
-      if (ret->arraysize) {
-        gst_gl_shader_set_uniform_1fv (shader, ret->name, ret->count,
-            (float *) ret->value);
-      } else {
-        gst_gl_shader_set_uniform_1f (shader, ret->name,
-            ((float *) ret->value)[0]);
-      }
-      break;
-
-    case _vec2:
-      if (ret->arraysize) {
-        gst_gl_shader_set_uniform_2fv (shader, ret->name, ret->count,
-            (float *) ret->value);
-      } else {
-        gst_gl_shader_set_uniform_2f (shader, ret->name,
-            ((float *) ret->value)[0], ((float *) ret->value)[1]);
-      }
-      break;
-
-    case _bvec2:
-    case _ivec2:
-    case _uvec2:
-      if (ret->arraysize) {
-        gst_gl_shader_set_uniform_2iv (shader, ret->name, ret->count,
-            (int *) ret->value);
-      } else {
-        gst_gl_shader_set_uniform_2i (shader, ret->name,
-            ((int *) ret->value)[0], ((int *) ret->value)[1]);
-      }
-      break;
-
-    case _vec3:
-      if (ret->arraysize) {
-        gst_gl_shader_set_uniform_3fv (shader, ret->name, ret->count,
-            (float *) ret->value);
-      } else {
-        gst_gl_shader_set_uniform_3f (shader, ret->name,
-            ((float *) ret->value)[0], ((float *) ret->value)[1],
-            ((float *) ret->value)[2]);
-      }
-      break;
-
-    case _bvec3:
-    case _ivec3:
-    case _uvec3:
-      if (ret->arraysize) {
-        gst_gl_shader_set_uniform_3iv (shader, ret->name, ret->count,
-            (int *) ret->value);
-      } else {
-        gst_gl_shader_set_uniform_3i (shader, ret->name,
-            ((int *) ret->value)[0], ((int *) ret->value)[1],
-            ((int *) ret->value)[2]);
-      }
-      break;
-
-    case _vec4:
-      if (ret->arraysize) {
-        gst_gl_shader_set_uniform_4fv (shader, ret->name, ret->count,
-            (float *) ret->value);
-      } else {
-        gst_gl_shader_set_uniform_4f (shader, ret->name,
-            ((float *) ret->value)[0], ((float *) ret->value)[1],
-            ((float *) ret->value)[2], ((float *) ret->value)[3]);
-      }
-      break;
-
-    case _bvec4:
-    case _ivec4:
-    case _uvec4:
-      if (ret->arraysize) {
-        gst_gl_shader_set_uniform_4iv (shader, ret->name, ret->count,
-            (int *) ret->value);
-      } else {
-        gst_gl_shader_set_uniform_4i (shader, ret->name,
-            ((int *) ret->value)[0], ((int *) ret->value)[1],
-            ((int *) ret->value)[2], ((int *) ret->value)[3]);
-      }
-      break;
-
-    case _mat2:
-    case _mat2x2:
-      gst_gl_shader_set_uniform_matrix_2fv (shader, ret->name, ret->count, 0,
-          (float *) ret->value);
-      break;
-
-    case _mat3:
-    case _mat3x3:
-      gst_gl_shader_set_uniform_matrix_3fv (shader, ret->name, ret->count, 0,
-          (float *) ret->value);
-      break;
-
-    case _mat4:
-    case _mat4x4:
-      gst_gl_shader_set_uniform_matrix_4fv (shader, ret->name, ret->count, 0,
-          (float *) ret->value);
-      break;
-
-#if GST_GL_HAVE_OPENGL
-    case _mat2x3:
-      gst_gl_shader_set_uniform_matrix_2x3fv (shader, ret->name, ret->count, 0,
-          (float *) ret->value);
-      break;
-
-    case _mat3x2:
-      gst_gl_shader_set_uniform_matrix_3x2fv (shader, ret->name, ret->count, 0,
-          (float *) ret->value);
-      break;
-
-    case _mat2x4:
-      gst_gl_shader_set_uniform_matrix_2x4fv (shader, ret->name, ret->count, 0,
-          (float *) ret->value);
-      break;
-
-    case _mat4x2:
-      gst_gl_shader_set_uniform_matrix_4x2fv (shader, ret->name, ret->count, 0,
-          (float *) ret->value);
-      break;
-
-    case _mat3x4:
-      gst_gl_shader_set_uniform_matrix_3x4fv (shader, ret->name, ret->count, 0,
-          (float *) ret->value);
-      break;
-
-    case _mat4x3:
-      gst_gl_shader_set_uniform_matrix_4x3fv (shader, ret->name, ret->count, 0,
-          (float *) ret->value);
-      break;
-#endif
-
-    default:
-      return -1;
-  }
-  return 0;
-}
-
-/*
-	Function:
-		parsevalue
-
-	Description:
-		Parse text coming after the assignement operator for scalar
-		variables or call the appropriate subroutine to parse vector
-		variables.
-
-	Arguments:
-
-		char *value:
-			Text to be parsed.
-
-		char *_saveptr:
-			Index of end of value.
-
-		struct gst_gl_shadervariable_desc *ret:
-			The variable description to be completed
-			At input time it contains the data type index (type),
-			variable name (name) and array size (arraysize).
-
-	return values:
-		 0: 	No error.
-		!0:	Pointer to parse error.
-
-*/
-
-char *
-parsevalue (char *value, char *_saveptr, struct gst_gl_shadervariable_desc *ret)
-{
-
-  int i, j;
-  char *t;
-  char *saveptr = value;
-
-  switch (ret->type) {
-    case _bool:
-      ret->count = (ret->arraysize) ? ret->arraysize : 1;
-      if (ret->count == 1) {    // no array
-        if (strcmp (value, "true") && strcmp (value, "false"))
-          return _saveptr;
-        ret->value = (void *) g_malloc (sizeof (int));
-        ((int *) ret->value)[0] = strcmp (value, "false");
-
-      } else {                  // array
-        ret->value = g_malloc (sizeof (int *) * ret->count);
-        t = strtok_r (value, ",", &saveptr);
-        for (i = 0; i < ret->count; ++i) {
-          if (!t)
-            return _saveptr + (saveptr - value);
-          trimleft (t, " \t");
-          trimright (t, " \t");
-          if (strcmp (t, "true") && strcmp (t, "false"))
-            return _saveptr + (saveptr - t);
-          ((int *) ret->value)[i] = strcmp (t, "false");
-          t = strtok_r (0, ",", &saveptr);
-        }
-      }
-      break;
-    case _int:
-      ret->count = (ret->arraysize) ? ret->arraysize : 1;
-      if (ret->count == 1) {
-        for (j = 0; j < (gint) strlen (value); ++j) {
-          if (!strchr ("-0123456789", value[j]))
-            return _saveptr + j;
-        }
-        ret->value = (void *) g_malloc (sizeof (int));
-        *((int *) ret->value) = atoi (value);
-
-      } else {
-        ret->value = g_malloc (sizeof (int) * ret->count);
-        t = strtok_r (value, ",", &saveptr);
-
-        for (i = 0; i < ret->count; ++i) {
-
-          if (!t)
-            return _saveptr + (saveptr - value);
-
-          trimleft (t, " \t");
-          trimright (t, " \t");
-          if (!t[0])
-            return _saveptr + (saveptr - t);
-
-          for (j = 0; j < (gint) strlen (value); ++j) {
-            if (!strchr ("-0123456789", value[j]))
-              return _saveptr + (saveptr - t) + j;
-          }
-
-          ((int *) ret->value)[i] = atoi (t);
-          t = strtok_r (0, ",", &saveptr);
-        }
-      }
-      break;
-
-    case _uint:
-      ret->count = (ret->arraysize) ? ret->arraysize : 1;
-      if (ret->count == 1) {
-        for (j = 0; j < (gint) strlen (value); ++j) {
-          if (!strchr ("0123456789", value[j]))
-            return _saveptr + j;
-        }
-        ret->value = (void *) g_malloc (sizeof (unsigned int));
-        *((unsigned int *) ret->value) = atoi (value);
-
-      } else {
-        ret->value = g_malloc (sizeof (unsigned int) * ret->count);
-        t = strtok_r (value, ",", &saveptr);
-
-        for (i = 0; i < ret->count; ++i) {
-
-          if (!t)
-            return _saveptr + (saveptr - value);
-
-          trimleft (t, " \t");
-          trimright (t, " \t");
-          if (!t[0])
-            return _saveptr + (saveptr - t);
-
-          for (j = 0; j < (gint) strlen (value); ++j) {
-            if (!strchr ("0123456789", value[j]))
-              return _saveptr + (saveptr - t) + j;
-          }
-
-          ((unsigned int *) ret->value)[i] = atoi (t);
-          t = strtok_r (0, ",", &saveptr);
-        }
-      }
-      break;
-
-    case _float:
-      ret->count = (ret->arraysize) ? ret->arraysize : 1;
-      if (ret->count == 1) {
-        for (j = 0; j < (gint) strlen (value); ++j) {
-          if (!strchr ("0123456789.-", value[j]))
-            return _saveptr + j;
-        }
-        ret->value = (void *) g_malloc (sizeof (float));
-        *((float *) ret->value) = (float) g_ascii_strtod (value, NULL);
-
-      } else {
-        ret->value = g_malloc (sizeof (float) * ret->count);
-        t = strtok_r (value, ",", &saveptr);
-
-        for (i = 0; i < ret->count; ++i) {
-
-          if (!t)
-            return _saveptr + (saveptr - value);
-
-          trimleft (t, " \t");
-          trimright (t, " \t");
-          if (!t[0])
-            return _saveptr + (saveptr - t);
-
-          for (j = 0; j < (gint) strlen (value); ++j) {
-            if (!strchr ("0123456789.-", value[j]))
-              return _saveptr + (saveptr - t) + j;
-          }
-
-          ((float *) ret->value)[i] = (float) g_ascii_strtod (t, NULL);
-          t = strtok_r (0, ",", &saveptr);
-        }
-      }
-      break;
-
-    case _vec2:
-      return vec_parsevalue (2, value, _saveptr, ret);
-      break;
-
-    case _bvec2:
-      return bvec_parsevalue (2, value, _saveptr, ret);
-      break;
-
-    case _ivec2:
-      return ivec_parsevalue (2, value, _saveptr, ret);
-      break;
-
-    case _uvec2:
-      return uvec_parsevalue (2, value, _saveptr, ret);
-      break;
-
-    case _vec3:
-      return vec_parsevalue (3, value, _saveptr, ret);
-      break;
-
-    case _bvec3:
-      return bvec_parsevalue (3, value, _saveptr, ret);
-      break;
-
-    case _ivec3:
-      return uvec_parsevalue (3, value, _saveptr, ret);
-      break;
-
-    case _uvec3:
-      return uvec_parsevalue (3, value, _saveptr, ret);
-      break;
-
-    case _vec4:
-      return vec_parsevalue (4, value, _saveptr, ret);
-      break;
-
-    case _bvec4:
-      return bvec_parsevalue (4, value, _saveptr, ret);
-      break;
-
-    case _ivec4:
-      return ivec_parsevalue (4, value, _saveptr, ret);
-      break;
-
-    case _uvec4:
-      return uvec_parsevalue (4, value, _saveptr, ret);
-      break;
-
-    case _mat2:
-    case _mat2x2:
-      return mat_parsevalue (2, 2, value, _saveptr, ret);
-      break;
-
-    case _mat2x3:
-      return mat_parsevalue (2, 3, value, _saveptr, ret);
-      break;
-
-    case _mat3x2:
-      return mat_parsevalue (3, 2, value, _saveptr, ret);
-      break;
-
-    case _mat2x4:
-      return mat_parsevalue (2, 4, value, _saveptr, ret);
-      break;
-
-    case _mat4x2:
-      return mat_parsevalue (4, 2, value, _saveptr, ret);
-      break;
-
-    case _mat3:
-    case _mat3x3:
-      return mat_parsevalue (3, 3, value, _saveptr, ret);
-      break;
-
-    case _mat3x4:
-      return mat_parsevalue (3, 4, value, _saveptr, ret);
-      break;
-
-    case _mat4x3:
-      return mat_parsevalue (4, 3, value, _saveptr, ret);
-      break;
-
-    case _mat4:
-    case _mat4x4:
-      return mat_parsevalue (4, 4, value, _saveptr, ret);
-      break;
-
-    default:
-      break;
-  }
-  return 0;
-}
-
-/*
-	Function:
-		vec_parsevalue
-
-	Description:
-		Parse text coming after the assignement operator for vec
-		type variables.
-
-	Arguments:
-
-		int n;
-			Vector dimension.
-
-		char *value:
-			Text to be parsed.
-
-		char *_saveptr:
-			Index of end of value.
-
-		struct gst_gl_shadervariable_desc *ret:
-			The variable description to be completed
-			At input time it contains the data type index (type),
-			variable name (name) and array size (arraysize).
-
-	return values:
-		 0: 	No error.
-		!0:	Pointer to parse error.
-
-*/
-
-char *
-vec_parsevalue (int n, char *value, char *_saveptr,
-    struct gst_gl_shadervariable_desc *ret)
-{
-
-  int i;
-  int j;
-  int k;
-  char *saveptr = value;
-  char *saveptr2;
-  char *t;
-  char *u;
-
-  ret->count = (ret->arraysize) ? ret->arraysize * n : n;
-  ret->value = g_malloc (sizeof (float) * ret->count);
-
-  if (!ret->arraysize) {
-    t = strtok_r (value, ",", &saveptr);
-
-    for (i = 0; i < ret->count; ++i) {
-
-      if (!t)
-        return _saveptr + (saveptr - value);
-
-      trimleft (t, " \t");
-      trimright (t, " \t");
-      if (!t[0])
-        return _saveptr + (saveptr - t);
-
-      for (j = 0; j < (gint) strlen (value); ++j) {
-        if (!strchr ("0123456789.-", value[j]))
-          return _saveptr + (saveptr - t) + j;
-      }
-
-      ((float *) ret->value)[i] = (float) g_ascii_strtod (t, NULL);
-      t = strtok_r (0, ",", &saveptr);
-    }
-
-  } else {
-
-    saveptr2 = value;
-    u = strtok_r (value, ")", &saveptr2);
-
-    for (k = 0; k < ret->arraysize; ++k) {
-
-      if (!u)
-        return _saveptr + (saveptr2 - value);
-
-      trimleft (u, " \t");
-      trimright (u, " \t");
-
-      if (k) {
-        if (u[0] != ',')
-          return _saveptr + (u - value);
-        ++u;
-        trimleft (u, " \t");
-      }
-
-      if (strncmp (u, gst_gl_shadervariable_datatype[ret->type],
-              strlen (gst_gl_shadervariable_datatype[ret->type])))
-        return _saveptr + (u - value);
-
-      u += strlen (gst_gl_shadervariable_datatype[ret->type]);
-      trimleft (u, " \t");
-      if (u[0] != '(')
-        return _saveptr + (u - value);
-      ++u;
-
-      t = strtok_r (u, ",", &saveptr);
-      if (!t)
-        return _saveptr + (u - value);
-
-      for (i = 0; i < n; ++i) {
-
-        trimleft (t, " \t");
-        trimright (t, " \t");
-        if (!t[0])
-          return _saveptr + (t - value);
-
-        for (j = 0; j < (gint) strlen (t); ++j) {
-          if (!strchr ("0123456789.-", t[j]))
-            return _saveptr + (t - value) + j;
-        }
-
-        ((float *) ret->value)[k * n + i] = (float) g_ascii_strtod (t, NULL);
-        t = strtok_r (0, ",", &saveptr);
-        if (i < (n - 1) && !t)
-          return _saveptr + (saveptr - value);
-
-      }
-      u = strtok_r (0, ")", &saveptr2);
-    }
-  }
-  return 0;
-}
-
-/*
-	Function:
-		bvec_parsevalue
-
-	Description:
-		Parse text coming after the assignement operator for bvec
-		type variables.
-
-	Arguments:
-
-		int n;
-			Vector dimension.
-
-		char *value:
-			Text to be parsed.
-
-		char *_saveptr:
-			Index of end of value.
-
-		struct gst_gl_shadervariable_desc *ret:
-			The variable description to be completed
-			At input time it contains the data type index (type),
-			variable name (name) and array size (arraysize).
-
-	return values:
-		 0: 	No error.
-		!0:	Pointer to parse error.
-
-*/
-
-char *
-bvec_parsevalue (int n, char *value, char *_saveptr,
-    struct gst_gl_shadervariable_desc *ret)
-{
-
-  int i;
-  int k;
-  char *saveptr = value;
-  char *saveptr2;
-  char *t;
-  char *u;
-
-  ret->count = (ret->arraysize) ? ret->arraysize * n : n;
-  ret->value = g_malloc (sizeof (char **) * ret->count);
-
-  if (!ret->arraysize) {
-    t = strtok_r (value, ",", &saveptr);
-
-    for (i = 0; i < ret->count; ++i) {
-
-      if (!t)
-        return _saveptr + (saveptr - value);
-
-      trimleft (t, " \t");
-      trimright (t, " \t");
-      if (!t[0])
-        return _saveptr + (saveptr - t);
-
-      if (strcmp ("true", value) || strcmp ("false", value))
-        return _saveptr + (saveptr - t);
-
-      ((int *) ret->value)[i] = strcmp (t, "false");
-      t = strtok_r (0, ",", &saveptr);
-    }
-
-  } else {
-
-    saveptr2 = value;
-    u = strtok_r (value, ")", &saveptr2);
-
-    for (k = 0; k < ret->arraysize; ++k) {
-
-      if (!u)
-        return _saveptr + (saveptr2 - value);
-
-      trimleft (u, " \t");
-      trimright (u, " \t");
-
-      if (k) {
-        if (u[0] != ',')
-          return _saveptr + (u - value);
-        ++u;
-        trimleft (u, " \t");
-      }
-
-      if (strncmp (u, gst_gl_shadervariable_datatype[ret->type],
-              strlen (gst_gl_shadervariable_datatype[ret->type])))
-        return _saveptr + (u - value);
-
-      u += strlen (gst_gl_shadervariable_datatype[ret->type]);
-      trimleft (u, " \t");
-      if (u[0] != '(')
-        return _saveptr + (u - value);
-      ++u;
-
-      t = strtok_r (u, ",", &saveptr);
-      if (!t)
-        return _saveptr + (u - value);
-
-      for (i = 0; i < n; ++i) {
-
-        trimleft (t, " \t");
-        trimright (t, " \t");
-        if (!t[0])
-          return _saveptr + (t - value);
-
-        if (strcmp ("true", t) || strcmp ("false", t))
-          return _saveptr + (saveptr - t);
-
-        ((int *) ret->value)[k * n + i] = strcmp (t, "false");
-        t = strtok_r (0, ",", &saveptr);
-        if (i < (n - 1) && !t)
-          return _saveptr + (saveptr - value);
-
-      }
-      u = strtok_r (0, ")", &saveptr2);
-    }
-  }
-  return 0;
-}
-
-/*
-	Function:
-		ivec_parsevalue
-
-	Description:
-		Parse text coming after the assignement operator for ivec
-		type variables.
-
-	Arguments:
-
-		int n;
-			Vector dimension.
-
-		char *value:
-			Text to be parsed.
-
-		char *_saveptr:
-			Index of end of value.
-
-		struct gst_gl_shadervariable_desc *ret:
-			The variable description to be completed
-			At input time it contains the data type index (type),
-			variable name (name) and array size (arraysize).
-
-	return values:
-		 0: 	No error.
-		!0:	Pointer to parse error.
-
-*/
-
-char *
-ivec_parsevalue (int n, char *value, char *_saveptr,
-    struct gst_gl_shadervariable_desc *ret)
-{
-
-  int i;
-  int j;
-  int k;
-  char *saveptr = value;
-  char *saveptr2;
-  char *t;
-  char *u;
-
-  ret->count = (ret->arraysize) ? ret->arraysize * n : n;
-  ret->value = g_malloc (sizeof (int) * ret->count);
-
-  if (!ret->arraysize) {
-    t = strtok_r (value, ",", &saveptr);
-
-    for (i = 0; i < ret->count; ++i) {
-
-      if (!t)
-        return _saveptr + (saveptr - value);
-
-      trimleft (t, " \t");
-      trimright (t, " \t");
-      if (!t[0])
-        return _saveptr + (saveptr - t);
-
-      for (j = 0; j < (gint) strlen (value); ++j) {
-        if (!strchr ("0123456789-", value[j]))
-          return _saveptr + (saveptr - t) + j;
-      }
-
-      ((int *) ret->value)[i] = atoi (t);
-      t = strtok_r (0, ",", &saveptr);
-    }
-
-  } else {
-
-    saveptr2 = value;
-    u = strtok_r (value, ")", &saveptr2);
-
-    for (k = 0; k < ret->arraysize; ++k) {
-
-      if (!u)
-        return _saveptr + (saveptr2 - value);
-
-      trimleft (u, " \t");
-      trimright (u, " \t");
-
-      if (k) {
-        if (u[0] != ',')
-          return _saveptr + (u - value);
-        ++u;
-        trimleft (u, " \t");
-      }
-
-      if (strncmp (u, gst_gl_shadervariable_datatype[ret->type],
-              strlen (gst_gl_shadervariable_datatype[ret->type])))
-        return _saveptr + (u - value);
-
-      u += strlen (gst_gl_shadervariable_datatype[ret->type]);
-      trimleft (u, " \t");
-      if (u[0] != '(')
-        return _saveptr + (u - value);
-      ++u;
-
-      t = strtok_r (u, ",", &saveptr);
-      if (!t)
-        return _saveptr + (u - value);
-
-      for (i = 0; i < n; ++i) {
-
-        trimleft (t, " \t");
-        trimright (t, " \t");
-        if (!t[0])
-          return _saveptr + (t - value);
-
-        for (j = 0; j < (gint) strlen (t); ++j) {
-          if (!strchr ("0123456789-", t[j]))
-            return _saveptr + (t - value) + j;
-        }
-
-        ((int *) ret->value)[k * n + i] = atoi (t);
-        t = strtok_r (0, ",", &saveptr);
-        if (i < (n - 1) && !t)
-          return _saveptr + (saveptr - value);
-
-      }
-      u = strtok_r (0, ")", &saveptr2);
-    }
-  }
-  return 0;
-}
-
-/*
-	Function:
-		uvec_parsevalue
-
-	Description:
-		Parse text coming after the assignement operator for uvec
-		type variables.
-
-	Arguments:
-
-		int n;
-			Vector dimension.
-
-		char *value:
-			Text to be parsed.
-
-		char *_saveptr:
-			Index of end of value.
-
-		struct gst_gl_shadervariable_desc *ret:
-			The variable description to be completed
-			At input time it contains the data type index (type),
-			variable name (name) and array size (arraysize).
-
-	return values:
-		 0: 	No error.
-		!0:	Pointer to parse error.
-
-*/
-
-char *
-uvec_parsevalue (int n, char *value, char *_saveptr,
-    struct gst_gl_shadervariable_desc *ret)
-{
-
-  int i;
-  int j;
-  int k;
-  char *saveptr = value;
-  char *saveptr2;
-  char *t;
-  char *u;
-
-  ret->count = (ret->arraysize) ? ret->arraysize * n : n;
-  ret->value = g_malloc (sizeof (unsigned int) * ret->count);
-
-  if (!ret->arraysize) {
-    t = strtok_r (value, ",", &saveptr);
-
-    for (i = 0; i < ret->count; ++i) {
-
-      if (!t)
-        return _saveptr + (saveptr - value);
-
-      trimleft (t, " \t");
-      trimright (t, " \t");
-      if (!t[0])
-        return _saveptr + (saveptr - t);
-
-      for (j = 0; j < (gint) strlen (value); ++j) {
-        if (!strchr ("0123456789", value[j]))
-          return _saveptr + (saveptr - t) + j;
-      }
-
-      ((unsigned int *) ret->value)[i] = atoi (t);
-      t = strtok_r (0, ",", &saveptr);
-    }
-
-  } else {
-
-    saveptr2 = value;
-    u = strtok_r (value, ")", &saveptr2);
-
-    for (k = 0; k < ret->arraysize; ++k) {
-
-      if (!u)
-        return _saveptr + (saveptr2 - value);
-
-      trimleft (u, " \t");
-      trimright (u, " \t");
-
-      if (k) {
-        if (u[0] != ',')
-          return _saveptr + (u - value);
-        ++u;
-        trimleft (u, " \t");
-      }
-
-      if (strncmp (u, gst_gl_shadervariable_datatype[ret->type],
-              strlen (gst_gl_shadervariable_datatype[ret->type])))
-        return _saveptr + (u - value);
-
-      u += strlen (gst_gl_shadervariable_datatype[ret->type]);
-      trimleft (u, " \t");
-      if (u[0] != '(')
-        return _saveptr + (u - value);
-      ++u;
-
-      t = strtok_r (u, ",", &saveptr);
-      if (!t)
-        return _saveptr + (u - value);
-
-      for (i = 0; i < n; ++i) {
-
-        trimleft (t, " \t");
-        trimright (t, " \t");
-        if (!t[0])
-          return _saveptr + (t - value);
-
-        for (j = 0; j < (gint) strlen (t); ++j) {
-          if (!strchr ("0123456789", t[j]))
-            return _saveptr + (t - value) + j;
-        }
-
-        ((unsigned int *) ret->value)[k * n + i] = atoi (t);
-        t = strtok_r (0, ",", &saveptr);
-        if (i < (n - 1) && !t)
-          return _saveptr + (saveptr - value);
-
-      }
-      u = strtok_r (0, ")", &saveptr2);
-    }
-  }
-  return 0;
-}
-
-/*
-	Function:
-		mat_parsevalue
-
-	Description:
-		Parse text coming after the assignement operator for matrix
-		type variables.
-
-	Arguments:
-
-		int n,m;
-			Matrix dimensions.
-
-		char *value:
-			Text to be parsed.
-
-		char *_saveptr:
-			Index of end of value.
-
-		struct gst_gl_shadervariable_desc *ret:
-			The variable description to be completed
-			At input time it contains the data type index (type),
-			variable name (name) and array size (arraysize).
-
-	return values:
-		 0: 	No error.
-		!0:	Pointer to parse error.
-
-*/
-
-char *
-mat_parsevalue (int n, int m, char *value, char *_saveptr,
-    struct gst_gl_shadervariable_desc *ret)
-{
-
-  int i;
-  int j;
-  int k;
-  char *saveptr = value;
-  char *saveptr2;
-  char *t;
-  char *u;
-
-  ret->count = (ret->arraysize) ? ret->arraysize * n * m : n * m;
-  ret->value = g_malloc (sizeof (float) * ret->count);
-
-  if (!ret->arraysize) {
-    t = strtok_r (value, ",", &saveptr);
-
-    for (i = 0; i < ret->count; ++i) {
-
-      if (!t)
-        return _saveptr + (saveptr - value);
-
-      trimleft (t, " \t");
-      trimright (t, " \t");
-      if (!t[0])
-        return _saveptr + (saveptr - t);
-
-      for (j = 0; j < (gint) strlen (value); ++j) {
-        if (!strchr ("0123456789.-", value[j]))
-          return _saveptr + (saveptr - t) + j;
-      }
-
-      ((float *) ret->value)[i] = (float) g_ascii_strtod (t, NULL);
-      t = strtok_r (0, ",", &saveptr);
-    }
-
-  } else {
-
-    saveptr2 = value;
-    u = strtok_r (value, ")", &saveptr2);
-
-    for (k = 0; k < ret->arraysize; ++k) {
-
-      if (!u)
-        return _saveptr + (saveptr2 - value);
-
-      trimleft (u, " \t");
-      trimright (u, " \t");
-
-      if (k) {
-        if (u[0] != ',')
-          return _saveptr + (u - value);
-        ++u;
-        trimleft (u, " \t");
-      }
-
-      if (strncmp (u, gst_gl_shadervariable_datatype[ret->type],
-              strlen (gst_gl_shadervariable_datatype[ret->type])))
-        return _saveptr + (u - value);
-
-      u += strlen (gst_gl_shadervariable_datatype[ret->type]);
-      trimleft (u, " \t");
-      if (u[0] != '(')
-        return _saveptr + (u - value);
-      ++u;
-
-      t = strtok_r (u, ",", &saveptr);
-      if (!t)
-        return _saveptr + (u - value);
-
-      for (i = 0; i < n * m; ++i) {
-
-        trimleft (t, " \t");
-        trimright (t, " \t");
-        if (!t[0])
-          return _saveptr + (t - value);
-
-        for (j = 0; j < (gint) strlen (t); ++j) {
-          if (!strchr ("0123456789.-", t[j]))
-            return _saveptr + (t - value) + j;
-        }
-
-        ((float *) ret->value)[k * n * m + i] =
-            (float) g_ascii_strtod (t, NULL);
-        t = strtok_r (0, ",", &saveptr);
-        if (i < (n * m - 1) && !t)
-          return _saveptr + (saveptr - value);
-
-      }
-      u = strtok_r (0, ")", &saveptr2);
-    }
-  }
-  return 0;
-}
diff --git a/gst-libs/gst/gl/gstglshadervariables.h b/gst-libs/gst/gl/gstglshadervariables.h
deleted file mode 100644
index b37e1a5..0000000
--- a/gst-libs/gst/gl/gstglshadervariables.h
+++ /dev/null
@@ -1,39 +0,0 @@
-/*
- * GStreamer
- * Copyright (C) 2009 Luc Deschenaux <luc.deschenaux@freesurf.ch>
- *
- * 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_GLSHADER_VARIABLES
-#define GST_GLSHADER_VARIABLES
-
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <gst/gl/gstglshader.h>
-
-#define VALID_VARNAME_CHARS "abcdefghijklmnopqurstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_"
-
-struct gst_gl_shadervariable_desc;
-
-int gst_gl_shadervariables_parse (GstGLShader * shader, char *variables,
-    int (*_setvariable) (GstGLShader * shader,
-        struct gst_gl_shadervariable_desc * v));
-int gst_gl_shadervariable_set (GstGLShader * shader,
-    struct gst_gl_shadervariable_desc *ret);
-
-#endif
diff --git a/gst-libs/gst/gl/gstglsl.c b/gst-libs/gst/gl/gstglsl.c
new file mode 100644
index 0000000..2826622
--- /dev/null
+++ b/gst-libs/gst/gl/gstglsl.c
@@ -0,0 +1,547 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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/gl.h>
+
+#include "gstglsl.h"
+#include "gstglsl_private.h"
+
+GQuark
+gst_glsl_error_quark (void)
+{
+  return g_quark_from_static_string ("gst-glsl-error");
+}
+
+struct glsl_version_string
+{
+  GstGLSLVersion version;
+  const gchar *name;
+};
+
+static const struct glsl_version_string glsl_versions[] = {
+  /* keep in sync with definition in the header */
+  {GST_GLSL_VERSION_100, "100"},
+  {GST_GLSL_VERSION_110, "110"},
+  {GST_GLSL_VERSION_120, "120"},
+  {GST_GLSL_VERSION_130, "130"},
+  {GST_GLSL_VERSION_140, "140"},
+  {GST_GLSL_VERSION_150, "150"},
+  {GST_GLSL_VERSION_300, "300"},
+  {GST_GLSL_VERSION_310, "310"},
+  {GST_GLSL_VERSION_320, "320"},
+  {GST_GLSL_VERSION_330, "330"},
+  {GST_GLSL_VERSION_400, "400"},
+  {GST_GLSL_VERSION_410, "410"},
+  {GST_GLSL_VERSION_420, "420"},
+  {GST_GLSL_VERSION_430, "430"},
+  {GST_GLSL_VERSION_440, "440"},
+  {GST_GLSL_VERSION_450, "450"},
+};
+
+struct glsl_profile_string
+{
+  GstGLSLProfile profile;
+  const gchar *name;
+};
+
+static const struct glsl_profile_string glsl_profiles[] = {
+  /* keep in sync with definition in the header */
+  {GST_GLSL_PROFILE_ES, "es"},
+  {GST_GLSL_PROFILE_CORE, "core"},
+  {GST_GLSL_PROFILE_COMPATIBILITY, "compatibility"},
+};
+
+const gchar *
+gst_glsl_version_to_string (GstGLSLVersion version)
+{
+  int i;
+
+  if (version == GST_GLSL_VERSION_NONE)
+    return NULL;
+
+  for (i = 0; i < G_N_ELEMENTS (glsl_versions); i++) {
+    if (version == glsl_versions[i].version)
+      return glsl_versions[i].name;
+  }
+
+  return NULL;
+}
+
+GstGLSLVersion
+gst_glsl_version_from_string (const gchar * string)
+{
+  gchar *str;
+  int i;
+
+  if (string == NULL)
+    return 0;
+
+  str = g_strdup (string);
+  str = g_strstrip (str);
+
+  for (i = 0; i < G_N_ELEMENTS (glsl_versions); i++) {
+    if (g_strcmp0 (str, glsl_versions[i].name) == 0) {
+      g_free (str);
+      return glsl_versions[i].version;
+    }
+  }
+
+  g_free (str);
+  return 0;
+}
+
+const gchar *
+gst_glsl_profile_to_string (GstGLSLProfile profile)
+{
+  int i;
+
+  if (profile == GST_GLSL_PROFILE_NONE)
+    return NULL;
+
+  /* multiple profiles are not allowed */
+  if ((profile & (profile - 1)) != 0)
+    return NULL;
+
+  for (i = 0; i < G_N_ELEMENTS (glsl_profiles); i++) {
+    if (profile == glsl_profiles[i].profile)
+      return glsl_profiles[i].name;
+  }
+
+  return NULL;
+}
+
+GstGLSLProfile
+gst_glsl_profile_from_string (const gchar * string)
+{
+  gchar *str;
+  int i;
+
+  if (string == NULL)
+    return GST_GLSL_PROFILE_NONE;
+
+  str = g_strdup (string);
+  str = g_strstrip (str);
+
+  for (i = 0; i < G_N_ELEMENTS (glsl_profiles); i++) {
+    if (g_strcmp0 (str, glsl_profiles[i].name) == 0) {
+      g_free (str);
+      return glsl_profiles[i].profile;
+    }
+  }
+
+  g_free (str);
+  return GST_GLSL_PROFILE_NONE;
+}
+
+static gboolean
+_is_valid_version_profile (GstGLSLVersion version, GstGLSLProfile profile)
+{
+  if (version == GST_GLSL_VERSION_NONE)
+    return TRUE;
+
+  /* versions that may not need an explicit profile */
+  if (version <= GST_GLSL_VERSION_150 && profile == GST_GLSL_PROFILE_NONE)
+    return TRUE;
+
+  /* ES versions require an ES profile */
+  if (version == GST_GLSL_VERSION_100 || version == GST_GLSL_VERSION_300
+      || version == GST_GLSL_VERSION_310 || version == GST_GLSL_VERSION_320)
+    return profile == GST_GLSL_PROFILE_ES;
+
+  /* required profile and no ES profile for normal GL contexts */
+  if (version >= GST_GLSL_VERSION_330)
+    return profile == GST_GLSL_PROFILE_NONE || profile == GST_GLSL_PROFILE_CORE
+        || profile == GST_GLSL_PROFILE_COMPATIBILITY;
+
+  if (version <= GST_GLSL_VERSION_150)
+    return profile == GST_GLSL_PROFILE_NONE
+        || profile == GST_GLSL_PROFILE_COMPATIBILITY;
+
+  return FALSE;
+}
+
+gchar *
+gst_glsl_version_profile_to_string (GstGLSLVersion version,
+    GstGLSLProfile profile)
+{
+  const gchar *version_s, *profile_s;
+
+  if (!_is_valid_version_profile (version, profile))
+    return NULL;
+
+  version_s = gst_glsl_version_to_string (version);
+  /* no profiles in GL/ES <= 150 */
+  if (version <= GST_GLSL_VERSION_150)
+    profile_s = NULL;
+  else
+    profile_s = gst_glsl_profile_to_string (profile);
+
+  if (!version_s)
+    return NULL;
+
+  if (profile_s)
+    return g_strdup_printf ("%s %s", version_s, profile_s);
+
+  return g_strdup (version_s);
+}
+
+static void
+_fixup_version_profile (GstGLSLVersion * version, GstGLSLProfile * profile)
+{
+  if (*version == GST_GLSL_VERSION_100 || *version == GST_GLSL_VERSION_300
+      || *version == GST_GLSL_VERSION_310 || *version == GST_GLSL_VERSION_320)
+    *profile = GST_GLSL_PROFILE_ES;
+  else if (*version <= GST_GLSL_VERSION_150)
+    *profile = GST_GLSL_PROFILE_COMPATIBILITY;
+  else if (*profile == GST_GLSL_PROFILE_NONE
+      && *version >= GST_GLSL_VERSION_330)
+    *profile = GST_GLSL_PROFILE_CORE;
+}
+
+/* @str points to the start of "#version", "#    version" or "#\tversion", etc */
+static const gchar *
+_check_valid_version_preprocessor_string (const gchar * str)
+{
+  gint i = 0;
+
+  if (!str || !str[i])
+    return NULL;
+
+  /* there can be whitespace between the '#' and 'version' */
+  do {
+    i++;
+    if (str[i] == '\0' || str[i] == '\n' || str[i] == '\r')
+      return NULL;
+  } while (g_ascii_isspace (str[i]));
+  if (g_strstr_len (&str[i], 7, "version"))
+    return &str[i + 7];
+
+  return NULL;
+}
+
+gboolean
+gst_glsl_version_profile_from_string (const gchar * string,
+    GstGLSLVersion * version_ret, GstGLSLProfile * profile_ret)
+{
+  gchar *str, *version_s, *profile_s;
+  GstGLSLVersion version = GST_GLSL_VERSION_NONE;
+  GstGLSLProfile profile = GST_GLSL_PROFILE_NONE;
+  gint i;
+
+  if (!string)
+    goto error;
+
+  str = g_strdup (string);
+  version_s = g_strstrip (str);
+
+  /* skip possible #version prefix */
+  if (str[0] == '#') {
+    if (!(version_s =
+            (gchar *) _check_valid_version_preprocessor_string (version_s))) {
+      g_free (str);
+      goto error;
+    }
+  }
+
+  version_s = g_strstrip (version_s);
+
+  i = 0;
+  while (version_s && version_s[i] != '\0' && g_ascii_isdigit (version_s[i]))
+    i++;
+  /* wrong version length */
+  if (i != 3) {
+    g_free (str);
+    goto error;
+  }
+
+  if (version_s[i] != 0) {
+    version_s[i] = '\0';
+    i++;
+    profile_s = &version_s[i];
+    profile_s = g_strstrip (profile_s);
+
+    profile = gst_glsl_profile_from_string (profile_s);
+  }
+  version = gst_glsl_version_from_string (version_s);
+  g_free (str);
+
+  /* check whether the parsed data is valid */
+  if (!version)
+    goto error;
+  if (!_is_valid_version_profile (version, profile))
+    goto error;
+  /* got a profile when none was expected */
+  if (version <= GST_GLSL_VERSION_150 && profile != GST_GLSL_PROFILE_NONE)
+    goto error;
+
+  _fixup_version_profile (&version, &profile);
+
+  if (profile_ret)
+    *profile_ret = profile;
+  if (version_ret)
+    *version_ret = version;
+
+  return TRUE;
+
+error:
+  {
+    if (profile_ret)
+      *profile_ret = GST_GLSL_PROFILE_NONE;
+    if (version_ret)
+      *version_ret = GST_GLSL_VERSION_NONE;
+    return FALSE;
+  }
+}
+
+/* returns the pointer in @str to the #version declaration */
+const gchar *
+_gst_glsl_shader_string_find_version (const gchar * str)
+{
+  gboolean sl_comment = FALSE;
+  gboolean ml_comment = FALSE;
+  gboolean newline = TRUE;
+  gint i = 0;
+
+  /* search for #version while allowing for preceeding comments/whitespace as
+   * permitted by the GLSL specification */
+  while (str && str[i] != '\0' && i < 1024) {
+    if (str[i] == '\n' || str[i] == '\r') {
+      newline = TRUE;
+      sl_comment = FALSE;
+      i++;
+      continue;
+    }
+
+    if (g_ascii_isspace (str[i]))
+      goto next;
+
+    if (sl_comment)
+      goto next;
+
+    if (ml_comment) {
+      if (g_strstr_len (&str[i], 2, "*/")) {
+        ml_comment = FALSE;
+        i++;
+      }
+      goto next;
+    }
+
+    if (g_strstr_len (&str[i], 2, "//")) {
+      sl_comment = TRUE;
+      i++;
+      goto next;
+    }
+
+    if (g_strstr_len (&str[i], 2, "/*")) {
+      ml_comment = TRUE;
+      i++;
+      goto next;
+    }
+
+    if (str[i] == '#') {
+      if (newline && _check_valid_version_preprocessor_string (&str[i]))
+        return &str[i];
+      break;
+    }
+
+  next:
+    newline = FALSE;
+    i++;
+  }
+
+  return NULL;
+}
+
+gboolean
+gst_glsl_string_get_version_profile (const gchar * s, GstGLSLVersion * version,
+    GstGLSLProfile * profile)
+{
+  const gchar *version_profile_s;
+
+  version_profile_s = _gst_glsl_shader_string_find_version (s);
+  if (!version_profile_s)
+    goto error;
+
+  if (!gst_glsl_version_profile_from_string (version_profile_s, version,
+          profile))
+    goto error;
+
+  return TRUE;
+
+error:
+  {
+    if (version)
+      *version = GST_GLSL_VERSION_NONE;
+    if (profile)
+      *profile = GST_GLSL_PROFILE_NONE;
+    return FALSE;
+  }
+}
+
+GstGLSLVersion
+gst_gl_version_to_glsl_version (GstGLAPI gl_api, gint maj, gint min)
+{
+  g_return_val_if_fail (gl_api != GST_GL_API_NONE, 0);
+
+  if (gl_api & GST_GL_API_GLES2) {
+    if (maj == 2 && min == 0)
+      return 100;
+
+    if (maj == 3 && min >= 0 && min <= 2)
+      return maj * 100 + min * 10;
+
+    return 0;
+  }
+
+  /* versions match for >= 3.3 */
+  if (gl_api & (GST_GL_API_OPENGL3 | GST_GL_API_OPENGL)) {
+    if (maj > 3 || (maj == 3 && min >= 3))
+      return maj * 100 + min * 10;
+
+    if (maj == 3 && min == 2)
+      return 150;
+    if (maj == 3 && min == 1)
+      return 140;
+    if (maj == 3 && min == 0)
+      return 130;
+    if (maj == 2 && min == 1)
+      return 120;
+    if (maj == 2 && min == 0)
+      return 110;
+
+    return 0;
+  }
+
+  return 0;
+}
+
+gboolean
+gst_gl_context_supports_glsl_profile_version (GstGLContext * context,
+    GstGLSLVersion version, GstGLSLProfile profile)
+{
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), FALSE);
+
+  if (!_is_valid_version_profile (version, profile))
+    return FALSE;
+
+  if (profile != GST_GLSL_PROFILE_NONE) {
+    if (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 2, 0)) {
+      if ((profile & GST_GLSL_PROFILE_ES) == 0)
+        return FALSE;
+    } else if ((gst_gl_context_get_gl_api (context) & GST_GL_API_OPENGL) != 0) {
+      if ((profile & GST_GLSL_PROFILE_COMPATIBILITY) == 0)
+        return FALSE;
+    } else if ((gst_gl_context_get_gl_api (context) & GST_GL_API_OPENGL3) != 0) {
+      /* GL_ARB_es2_compatibility is requried for GL3 contexts */
+      if ((profile & (GST_GLSL_PROFILE_CORE | GST_GLSL_PROFILE_ES)) == 0)
+        return FALSE;
+    } else {
+      g_assert_not_reached ();
+    }
+  }
+
+  if (version != GST_GLSL_VERSION_NONE) {
+    GstGLAPI gl_api;
+    gint maj, min, glsl_version;
+
+    if (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 3, 1)) {
+      if (version > GST_GLSL_VERSION_310)
+        return FALSE;
+    } else if (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 3,
+            0)) {
+      if (version > GST_GLSL_VERSION_300)
+        return FALSE;
+    } else if (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 2,
+            0)) {
+      if (version > GST_GLSL_VERSION_100)
+        return FALSE;
+    }
+
+    gl_api = gst_gl_context_get_gl_api (context);
+    gst_gl_context_get_gl_version (context, &maj, &min);
+    glsl_version = gst_gl_version_to_glsl_version (gl_api, maj, min);
+    if (version > glsl_version)
+      return FALSE;
+
+    if (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL3, 1, 0))
+      /* GL_ARB_es2_compatibility is requried for GL3 contexts */
+      if (version < GST_GLSL_VERSION_150 && version != GST_GLSL_VERSION_100)
+        return FALSE;
+
+    if (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL, 1, 0)
+        && version < GST_GLSL_VERSION_110)
+      return FALSE;
+  }
+
+  return TRUE;
+}
+
+gboolean
+_gst_glsl_funcs_fill (GstGLSLFuncs * vtable, GstGLContext * context)
+{
+  GstGLFuncs *gl = context->gl_vtable;
+
+  if (vtable->initialized)
+    return TRUE;
+
+  if (gl->CreateProgram) {
+    vtable->CreateProgram = gl->CreateProgram;
+    vtable->DeleteProgram = gl->DeleteProgram;
+    vtable->UseProgram = gl->UseProgram;
+
+    vtable->CreateShader = gl->CreateShader;
+    vtable->DeleteShader = gl->DeleteShader;
+    vtable->AttachShader = gl->AttachShader;
+    vtable->DetachShader = gl->DetachShader;
+
+    vtable->GetAttachedShaders = gl->GetAttachedShaders;
+
+    vtable->GetShaderInfoLog = gl->GetShaderInfoLog;
+    vtable->GetShaderiv = gl->GetShaderiv;
+    vtable->GetProgramInfoLog = gl->GetProgramInfoLog;
+    vtable->GetProgramiv = gl->GetProgramiv;
+  } else if (gl->CreateProgramObject) {
+    vtable->CreateProgram = gl->CreateProgramObject;
+    vtable->DeleteProgram = gl->DeleteObject;
+    vtable->UseProgram = gl->UseProgramObject;
+
+    vtable->CreateShader = gl->CreateShaderObject;
+    vtable->DeleteShader = gl->DeleteObject;
+    vtable->AttachShader = gl->AttachObject;
+    vtable->DetachShader = gl->DetachObject;
+
+    vtable->GetAttachedShaders = gl->GetAttachedObjects;
+
+    vtable->GetShaderInfoLog = gl->GetInfoLog;
+    vtable->GetShaderiv = gl->GetObjectParameteriv;
+    vtable->GetProgramInfoLog = gl->GetInfoLog;
+    vtable->GetProgramiv = gl->GetObjectParameteriv;
+  } else {
+    vtable->initialized = FALSE;
+    return FALSE;
+  }
+
+  vtable->initialized = TRUE;
+  return TRUE;
+}
diff --git a/gst-libs/gst/gl/gstglsl.h b/gst-libs/gst/gl/gstglsl.h
new file mode 100644
index 0000000..9f051f6
--- /dev/null
+++ b/gst-libs/gst/gl/gstglsl.h
@@ -0,0 +1,96 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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_GLSL_H__
+#define __GST_GLSL_H__
+
+#include <gst/gl/gstgl_fwd.h>
+
+G_BEGIN_DECLS
+
+GQuark gst_glsl_error_quark (void);
+#define GST_GLSL_ERROR (gst_glsl_error_quark ())
+
+typedef enum {
+  GST_GLSL_ERROR_COMPILE,
+  GST_GLSL_ERROR_LINK,
+  GST_GLSL_ERROR_PROGRAM,
+} GstGLSLError;
+
+typedef enum
+{
+  GST_GLSL_VERSION_NONE = 0,
+
+  GST_GLSL_VERSION_100 = 100, /* ES */
+  GST_GLSL_VERSION_110 = 110, /* GL */
+  GST_GLSL_VERSION_120 = 120, /* GL */
+  GST_GLSL_VERSION_130 = 130, /* GL */
+  GST_GLSL_VERSION_140 = 140, /* GL */
+  GST_GLSL_VERSION_150 = 150, /* GL */
+  GST_GLSL_VERSION_300 = 300, /* ES */
+  GST_GLSL_VERSION_310 = 310, /* ES */
+  GST_GLSL_VERSION_320 = 320, /* ES */
+  GST_GLSL_VERSION_330 = 330, /* GL */
+  GST_GLSL_VERSION_400 = 400, /* GL */
+  GST_GLSL_VERSION_410 = 410, /* GL */
+  GST_GLSL_VERSION_420 = 420, /* GL */
+  GST_GLSL_VERSION_430 = 430, /* GL */
+  GST_GLSL_VERSION_440 = 440, /* GL */
+  GST_GLSL_VERSION_450 = 450, /* GL */
+
+  GST_GLSL_VERSION_ANY = -1,
+} GstGLSLVersion;
+
+typedef enum
+{
+  /* XXX: maybe make GstGLAPI instead */
+  GST_GLSL_PROFILE_NONE = 0,
+
+  GST_GLSL_PROFILE_ES = (1 << 0),
+  GST_GLSL_PROFILE_CORE = (1 << 1),
+  GST_GLSL_PROFILE_COMPATIBILITY = (1 << 2),
+
+  GST_GLSL_PROFILE_ANY = -1,
+} GstGLSLProfile;
+
+GstGLSLVersion gst_glsl_version_from_string         (const gchar * string);
+const gchar *  gst_glsl_version_to_string           (GstGLSLVersion version);
+
+GstGLSLProfile gst_glsl_profile_from_string         (const gchar * string);
+const gchar *  gst_glsl_profile_to_string           (GstGLSLProfile profile);
+
+gchar *        gst_glsl_version_profile_to_string   (GstGLSLVersion version,
+                                                     GstGLSLProfile profile);
+gboolean       gst_glsl_version_profile_from_string (const gchar * string,
+                                                     GstGLSLVersion * version,
+                                                     GstGLSLProfile * profile);
+
+gboolean       gst_glsl_string_get_version_profile  (const gchar *s,
+                                                     GstGLSLVersion * version,
+                                                     GstGLSLProfile * profile);
+
+GstGLSLVersion gst_gl_version_to_glsl_version       (GstGLAPI gl_api, gint maj, gint min);
+gboolean       gst_gl_context_supports_glsl_profile_version (GstGLContext * context,
+                                                             GstGLSLVersion version,
+                                                             GstGLSLProfile profile);
+
+G_END_DECLS
+
+#endif /* __GST_GLSL_H__ */
diff --git a/gst-libs/gst/gl/gstglsl_private.h b/gst-libs/gst/gl/gstglsl_private.h
new file mode 100644
index 0000000..c23ff91
--- /dev/null
+++ b/gst-libs/gst/gl/gstglsl_private.h
@@ -0,0 +1,63 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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_GLSL_PRIVATE_H__
+#define __GST_GLSL_PRIVATE_H__
+
+#include <gst/gl/gstgl_fwd.h>
+
+G_BEGIN_DECLS
+
+#ifndef GL_COMPILE_STATUS
+#define GL_COMPILE_STATUS             0x8B81
+#endif
+#ifndef GLhandleARB
+#define GLhandleARB GLuint
+#endif
+
+typedef struct _GstGLSLFuncs
+{
+  gboolean initialized;
+
+  GLuint GSTGLAPI (*CreateProgram) (void);
+  void GSTGLAPI (*DeleteProgram) (GLuint program);
+  void GSTGLAPI (*UseProgram) (GLuint program);
+  void GSTGLAPI (*GetAttachedShaders) (GLuint program, GLsizei maxcount,
+      GLsizei * count, GLuint * shaders);
+
+  GLuint GSTGLAPI (*CreateShader) (GLenum shaderType);
+  void GSTGLAPI (*DeleteShader) (GLuint shader);
+  void GSTGLAPI (*AttachShader) (GLuint program, GLuint shader);
+  void GSTGLAPI (*DetachShader) (GLuint program, GLuint shader);
+
+  void GSTGLAPI (*GetShaderiv) (GLuint program, GLenum pname, GLint * params);
+  void GSTGLAPI (*GetProgramiv) (GLuint program, GLenum pname, GLint * params);
+  void GSTGLAPI (*GetShaderInfoLog) (GLuint shader, GLsizei maxLength,
+      GLsizei * length, char *log);
+  void GSTGLAPI (*GetProgramInfoLog) (GLuint shader, GLsizei maxLength,
+      GLsizei * length, char *log);
+} GstGLSLFuncs;
+
+gboolean _gst_glsl_funcs_fill (GstGLSLFuncs * vtable, GstGLContext * context);
+const gchar * _gst_glsl_shader_string_find_version (const gchar * str);
+
+G_END_DECLS
+
+#endif /* __GST_GLSL_PRIVATE_H__ */
diff --git a/gst-libs/gst/gl/gstglslstage.c b/gst-libs/gst/gl/gstglslstage.c
new file mode 100644
index 0000000..5813201
--- /dev/null
+++ b/gst-libs/gst/gl/gstglslstage.c
@@ -0,0 +1,512 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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/gl.h>
+
+#include "gstglslstage.h"
+#include "gstglsl_private.h"
+
+static const gchar *es2_version_header = "#version 100\n";
+
+GST_DEBUG_CATEGORY_STATIC (gst_glsl_stage_debug);
+#define GST_CAT_DEFAULT gst_glsl_stage_debug
+
+G_DEFINE_TYPE_WITH_CODE (GstGLSLStage, gst_glsl_stage, GST_TYPE_OBJECT,
+    GST_DEBUG_CATEGORY_INIT (gst_glsl_stage_debug, "glslstage", 0,
+        "GLSL Stage");
+    );
+
+#define GST_GLSL_STAGE_GET_PRIVATE(o) \
+  (G_TYPE_INSTANCE_GET_PRIVATE((o), GST_TYPE_GLSL_STAGE, GstGLSLStagePrivate))
+
+struct _GstGLSLStagePrivate
+{
+  GstGLSLFuncs vtable;
+
+  GLenum type;
+  GLhandleARB handle;
+  GstGLSLVersion version;
+  GstGLSLProfile profile;
+  gchar **strings;
+  gint n_strings;
+
+  gboolean compiled;
+};
+
+static void
+gst_glsl_stage_finalize (GObject * object)
+{
+  GstGLSLStage *stage = GST_GLSL_STAGE (object);
+  gint i;
+
+  if (stage->context) {
+    gst_object_unref (stage->context);
+    stage->context = NULL;
+  }
+
+  for (i = 0; i < stage->priv->n_strings; i++) {
+    g_free (stage->priv->strings[i]);
+  }
+  g_free (stage->priv->strings);
+  stage->priv->strings = NULL;
+
+  G_OBJECT_CLASS (gst_glsl_stage_parent_class)->finalize (object);
+}
+
+static void
+gst_glsl_stage_set_property (GObject * object,
+    guint prop_id, const GValue * value, GParamSpec * pspec)
+{
+  switch (prop_id) {
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+gst_glsl_stage_get_property (GObject * object,
+    guint prop_id, GValue * value, GParamSpec * pspec)
+{
+  switch (prop_id) {
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+
+}
+
+static void
+gst_glsl_stage_class_init (GstGLSLStageClass * klass)
+{
+  GObjectClass *obj_class = G_OBJECT_CLASS (klass);
+
+  g_type_class_add_private (klass, sizeof (GstGLSLStagePrivate));
+
+  obj_class->finalize = gst_glsl_stage_finalize;
+  obj_class->set_property = gst_glsl_stage_set_property;
+  obj_class->get_property = gst_glsl_stage_get_property;
+}
+
+static void
+gst_glsl_stage_init (GstGLSLStage * stage)
+{
+  stage->priv = GST_GLSL_STAGE_GET_PRIVATE (stage);
+}
+
+static gboolean
+_is_valid_shader_type (GLenum type)
+{
+  switch (type) {
+    case GL_VERTEX_SHADER:
+    case GL_FRAGMENT_SHADER:
+#ifdef GL_TESS_CONTROL_SHADER
+    case GL_TESS_CONTROL_SHADER:
+#endif
+#ifdef GL_TESS_EVALUATION_SHADER
+    case GL_TESS_EVALUATION_SHADER:
+#endif
+#ifdef GL_GEOMETRY_SHADER
+    case GL_GEOMETRY_SHADER:
+#endif
+#ifdef GL_COMPUTE_SHADER
+    case GL_COMPUTE_SHADER:
+#endif
+      return TRUE;
+    default:
+      return FALSE;
+  }
+}
+
+static const gchar *
+_shader_type_to_string (GLenum type)
+{
+  switch (type) {
+    case GL_VERTEX_SHADER:
+      return "vertex";
+    case GL_FRAGMENT_SHADER:
+      return "fragment";
+#ifdef GL_TESS_CONTROL_SHADER
+    case GL_TESS_CONTROL_SHADER:
+      return "tesselation control";
+#endif
+#ifdef GL_TESS_EVALUATION_SHADER
+    case GL_TESS_EVALUATION_SHADER:
+      return "tesselation evaluation";
+#endif
+#ifdef GL_GEOMETRY_SHADER
+    case GL_GEOMETRY_SHADER:
+      return "geometry";
+#endif
+#ifdef GL_COMPUTE_SHADER
+    case GL_COMPUTE_SHADER:
+      return "compute";
+#endif
+    default:
+      return "unknown";
+  }
+}
+
+static gboolean
+_ensure_shader (GstGLSLStage * stage)
+{
+  if (stage->priv->handle)
+    return TRUE;
+
+  if (!(stage->priv->handle =
+          stage->priv->vtable.CreateShader (stage->priv->type)))
+    return FALSE;
+
+  return stage->priv->handle != 0;
+}
+
+/**
+ * gst_glsl_stage_new_with_strings:
+ * @context: a #GstGLContext
+ * @type: the GL enum shader stage type
+ *
+ * Returns: (transfer full): a new #GstGLSLStage of the specified @type
+ */
+GstGLSLStage *
+gst_glsl_stage_new_with_strings (GstGLContext * context, guint type,
+    GstGLSLVersion version, GstGLSLProfile profile, gint n_strings,
+    const gchar ** str)
+{
+  GstGLSLStage *stage;
+
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), NULL);
+  g_return_val_if_fail (_is_valid_shader_type (type), NULL);
+
+  stage = g_object_new (GST_TYPE_GLSL_STAGE, NULL);
+  /* FIXME: GInittable */
+  if (!_gst_glsl_funcs_fill (&stage->priv->vtable, context)) {
+    gst_object_unref (stage);
+    return NULL;
+  }
+
+  stage->context = gst_object_ref (context);
+  stage->priv->type = type;
+  if (!gst_glsl_stage_set_strings (stage, version, profile, n_strings, str)) {
+    gst_object_unref (stage);
+    return NULL;
+  }
+
+  return stage;
+}
+
+/**
+ * gst_glsl_stage_new_with_strings:
+ * @context: a #GstGLContext
+ * @type: the GL enum shader stage type
+ *
+ * Returns: (transfer full): a new #GstGLSLStage of the specified @type
+ */
+GstGLSLStage *
+gst_glsl_stage_new_with_string (GstGLContext * context, guint type,
+    GstGLSLVersion version, GstGLSLProfile profile, const gchar * str)
+{
+  return gst_glsl_stage_new_with_strings (context, type, version, profile, 1,
+      &str);
+}
+
+/**
+ * gst_glsl_stage_new:
+ * @context: a #GstGLContext
+ * @type: the GL enum shader stage type
+ *
+ * Returns: (transfer full): a new #GstGLSLStage of the specified @type
+ */
+GstGLSLStage *
+gst_glsl_stage_new (GstGLContext * context, guint type)
+{
+  return gst_glsl_stage_new_with_string (context, type, GST_GLSL_VERSION_NONE,
+      GST_GLSL_PROFILE_NONE, NULL);
+}
+
+/**
+ * gst_glsl_stage_new_with_default_vertex:
+ * @context: a #GstGLContext
+ *
+ * Returns: (transfer full): a new #GstGLSLStage with the default vertex shader
+ */
+GstGLSLStage *
+gst_glsl_stage_new_default_vertex (GstGLContext * context)
+{
+  return gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER,
+      GST_GLSL_VERSION_NONE,
+      GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
+      gst_gl_shader_string_vertex_default);
+}
+
+/**
+ * gst_glsl_stage_new_with_default_fragment:
+ * @context: a #GstGLContext
+ *
+ * Returns: (transfer full): a new #GstGLSLStage with the default fragment shader
+ */
+GstGLSLStage *
+gst_glsl_stage_new_default_fragment (GstGLContext * context)
+{
+  return gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
+      GST_GLSL_VERSION_NONE,
+      GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
+      gst_gl_shader_string_fragment_default);
+}
+
+/**
+ * gst_glsl_stage_set_strings:
+ * @stage: a #GstGLSLStage
+ * @version: a #GstGLSLVersion
+ * @profile: a #GstGLSLProfile
+ * @n_strings: number of strings in @str
+ * @str: (transfer none): a GLSL shader string
+ *
+ * Replaces the current shader string with @str.
+ */
+gboolean
+gst_glsl_stage_set_strings (GstGLSLStage * stage, GstGLSLVersion version,
+    GstGLSLProfile profile, gint n_strings, const gchar ** str)
+{
+  gint i;
+
+  g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), FALSE);
+  g_return_val_if_fail (n_strings > 0, FALSE);
+  g_return_val_if_fail (str != NULL, FALSE);
+
+  if (!gst_gl_context_supports_glsl_profile_version (stage->context, version,
+          profile)) {
+    const gchar *version_str = gst_glsl_version_to_string (version);
+    const gchar *profile_str = gst_glsl_profile_to_string (profile);
+    GST_ERROR_OBJECT (stage, "GL context does not support version %s and "
+        "profile %s", version_str, profile_str);
+    return FALSE;
+  }
+
+  stage->priv->version = version;
+  stage->priv->profile = profile;
+
+  for (i = 0; i < stage->priv->n_strings; i++) {
+    g_free (stage->priv->strings[i]);
+  }
+
+  if (stage->priv->n_strings < n_strings) {
+    /* only realloc if we need more space */
+    g_free (stage->priv->strings);
+    stage->priv->strings = g_new0 (gchar *, n_strings);
+  }
+
+  for (i = 0; i < n_strings; i++)
+    stage->priv->strings[i] = g_strdup (str[i]);
+  stage->priv->n_strings = n_strings;
+
+  return TRUE;
+}
+
+/**
+ * gst_glsl_stage_get_shader_type:
+ * @stage: a #GstGLSLStage
+ *
+ * Returns: The GL shader type for this shader stage
+ */
+guint
+gst_glsl_stage_get_shader_type (GstGLSLStage * stage)
+{
+  g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), 0);
+
+  return stage->priv->type;
+}
+
+/**
+ * gst_glsl_stage_get_handle:
+ * @stage: a #GstGLSLStage
+ *
+ * Returns: The GL handle for this shader stage
+ */
+guint
+gst_glsl_stage_get_handle (GstGLSLStage * stage)
+{
+  g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), 0);
+  g_return_val_if_fail (stage->priv->compiled, 0);
+
+  return stage->priv->handle;
+}
+
+/**
+ * gst_glsl_stage_get_version:
+ * @stage: a #GstGLSLStage
+ *
+ * Returns: The GLSL version for the current shader stage
+ */
+GstGLSLVersion
+gst_glsl_stage_get_version (GstGLSLStage * stage)
+{
+  g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), 0);
+
+  return stage->priv->version;
+}
+
+/**
+ * gst_glsl_stage_get_profile:
+ * @stage: a #GstGLSLStage
+ *
+ * Returns: The GLSL profile for the current shader stage
+ */
+GstGLSLProfile
+gst_glsl_stage_get_profile (GstGLSLStage * stage)
+{
+  g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), 0);
+
+  return stage->priv->profile;
+}
+
+static void
+_maybe_prepend_version (GstGLSLStage * stage, gchar ** shader_str,
+    gint * n_vertex_sources, const gchar *** vertex_sources)
+{
+  gint n = *n_vertex_sources;
+  gboolean add_header = FALSE;
+  gint i, j;
+
+  /* FIXME: this all an educated guess */
+  if (gst_gl_context_check_gl_version (stage->context, GST_GL_API_OPENGL3, 3, 0)
+      && (stage->priv->profile & GST_GLSL_PROFILE_ES) != 0
+      && !_gst_glsl_shader_string_find_version (shader_str[0])) {
+    add_header = TRUE;
+    n++;
+  }
+
+  *vertex_sources = g_malloc0 (n * sizeof (gchar *));
+
+  i = 0;
+  if (add_header)
+    (*vertex_sources)[i++] = es2_version_header;
+
+  for (j = 0; j < stage->priv->n_strings; i++, j++)
+    (*vertex_sources)[i] = shader_str[j];
+  *n_vertex_sources = n;
+}
+
+struct compile
+{
+  GstGLSLStage *stage;
+  GError **error;
+  gboolean result;
+};
+
+static void
+_compile_shader (GstGLContext * context, struct compile *data)
+{
+  GstGLSLStagePrivate *priv = data->stage->priv;
+  GstGLSLFuncs *vtable = &data->stage->priv->vtable;
+  const GstGLFuncs *gl = context->gl_vtable;
+  const gchar **vertex_sources;
+  gchar info_buffer[2048];
+  gint n_vertex_sources;
+  GLint status;
+  gint len;
+  gint i;
+
+  if (data->stage->priv->compiled) {
+    data->result = TRUE;
+    return;
+  }
+
+  if (!_ensure_shader (data->stage)) {
+    g_set_error (data->error, GST_GLSL_ERROR, GST_GLSL_ERROR_COMPILE,
+        "Failed to create shader object");
+    data->result = FALSE;
+    return;
+  }
+
+  n_vertex_sources = data->stage->priv->n_strings;
+  _maybe_prepend_version (data->stage, priv->strings, &n_vertex_sources,
+      &vertex_sources);
+
+  GST_TRACE_OBJECT (data->stage, "compiling shader:");
+  for (i = 0; i < n_vertex_sources; i++) {
+    GST_TRACE_OBJECT (data->stage, "%s", vertex_sources[i]);
+  }
+
+  gl->ShaderSource (priv->handle, n_vertex_sources,
+      (const gchar **) vertex_sources, NULL);
+  gl->CompileShader (priv->handle);
+  g_free (vertex_sources);
+  /* FIXME: supported threaded GLSL compilers and don't destroy compilation
+   * performance by getting the compilation result directly after compilation */
+  status = GL_FALSE;
+  gl->GetShaderiv (priv->handle, GL_COMPILE_STATUS, &status);
+
+  len = 0;
+  vtable->GetShaderInfoLog (priv->handle, sizeof (info_buffer) - 1, &len,
+      info_buffer);
+  info_buffer[len] = '\0';
+
+  if (status != GL_TRUE) {
+    GST_ERROR_OBJECT (data->stage, "%s shader compilation failed:%s",
+        _shader_type_to_string (priv->type), info_buffer);
+
+    g_set_error (data->error, GST_GLSL_ERROR, GST_GLSL_ERROR_COMPILE,
+        "%s shader compilation failed:%s",
+        _shader_type_to_string (priv->type), info_buffer);
+
+    vtable->DeleteShader (priv->handle);
+    data->result = FALSE;
+    return;
+  } else if (len > 1) {
+    GST_FIXME_OBJECT (data->stage, "%s shader info log:%s",
+        _shader_type_to_string (priv->type), info_buffer);
+  }
+
+  data->result = TRUE;
+}
+
+/**
+ * gst_glsl_stage_compile:
+ * @stage: a #GstGLSLStage
+ *
+ * Returns: whether the compilation suceeded
+ */
+gboolean
+gst_glsl_stage_compile (GstGLSLStage * stage, GError ** error)
+{
+  struct compile data;
+
+  g_return_val_if_fail (GST_IS_GLSL_STAGE (stage), FALSE);
+
+  if (!stage->priv->strings) {
+    g_set_error (error, GST_GLSL_ERROR, GST_GLSL_ERROR_COMPILE,
+        "No shader source to compile");
+    return FALSE;
+  }
+
+  data.stage = stage;
+  data.error = error;
+
+  gst_gl_context_thread_add (stage->context,
+      (GstGLContextThreadFunc) _compile_shader, &data);
+
+  stage->priv->compiled = TRUE;
+
+  return data.result;
+}
diff --git a/gst-libs/gst/gl/gstglslstage.h b/gst-libs/gst/gl/gstglslstage.h
new file mode 100644
index 0000000..69fbf2e
--- /dev/null
+++ b/gst-libs/gst/gl/gstglslstage.h
@@ -0,0 +1,85 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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_GLSL_STAGE_H__
+#define __GST_GLSL_STAGE_H__
+
+#include <gst/gl/gstglsl.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_GLSL_STAGE         (gst_glsl_stage_get_type())
+#define GST_GLSL_STAGE(o)           (G_TYPE_CHECK_INSTANCE_CAST((o), GST_TYPE_GLSL_STAGE, GstGLSLStage))
+#define GST_GLSL_STAGE_CLASS(k)     (G_TYPE_CHECK_CLASS((k), GST_TYPE_GLSL_STAGE, GstGLSLStageClass))
+#define GST_IS_GLSL_STAGE(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_TYPE_GLSL_STAGE))
+#define GST_IS_GLSL_STAGE_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_TYPE_GLSL_STAGE))
+#define GST_GLSL_STAGE_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_TYPE_GLSL_STAGE, GstGLSLStageClass))
+
+struct _GstGLSLStage
+{
+  /*< private >*/
+  GstObject parent;
+
+  GstGLContext *context;
+
+  GstGLSLStagePrivate *priv;
+
+  gpointer _padding[GST_PADDING];
+};
+
+struct _GstGLSLStageClass
+{
+  GstObjectClass parent;
+
+  /*< private >*/
+};
+
+GType          gst_glsl_stage_get_type          (void);
+GstGLSLStage * gst_glsl_stage_new               (GstGLContext * context, guint type);
+GstGLSLStage * gst_glsl_stage_new_with_string   (GstGLContext * context,
+                                                 guint type,
+                                                 GstGLSLVersion version,
+                                                 GstGLSLProfile profile,
+                                                 const gchar * str);
+GstGLSLStage * gst_glsl_stage_new_with_strings  (GstGLContext * context,
+                                                 guint type,
+                                                 GstGLSLVersion version,
+                                                 GstGLSLProfile profile,
+                                                 gint n_strings,
+                                                 const gchar ** str);
+
+GstGLSLStage * gst_glsl_stage_new_default_fragment (GstGLContext * context);
+GstGLSLStage * gst_glsl_stage_new_default_vertex   (GstGLContext * context);
+
+guint          gst_glsl_stage_get_handle        (GstGLSLStage * stage);
+GstGLSLProfile gst_glsl_stage_get_profile       (GstGLSLStage * stage);
+GstGLSLVersion gst_glsl_stage_get_version       (GstGLSLStage * stage);
+guint          gst_glsl_stage_get_shader_type   (GstGLSLStage * stage);
+gboolean       gst_glsl_stage_set_strings       (GstGLSLStage * stage,
+                                                 GstGLSLVersion version,
+                                                 GstGLSLProfile profile,
+                                                 gint n_strings,
+                                                 const gchar ** str);
+gboolean       gst_glsl_stage_compile           (GstGLSLStage * stage,
+                                                 GError ** error);
+
+G_END_DECLS
+
+#endif /* __GST_GLSL_STAGE_H__ */
diff --git a/gst-libs/gst/gl/gstglsyncmeta.c b/gst-libs/gst/gl/gstglsyncmeta.c
index f680353..a2f44a3 100644
--- a/gst-libs/gst/gl/gstglsyncmeta.c
+++ b/gst-libs/gst/gl/gstglsyncmeta.c
@@ -38,12 +38,71 @@
 #define GL_TIMEOUT_EXPIRED 0x911B
 #endif
 
+static void
+_default_set_sync_gl (GstGLSyncMeta * sync_meta, GstGLContext * context)
+{
+  const GstGLFuncs *gl = context->gl_vtable;
+
+  if (gl->FenceSync) {
+    if (sync_meta->data) {
+      GST_LOG ("deleting sync object %p", sync_meta->data);
+      gl->DeleteSync ((GLsync) sync_meta->data);
+    }
+    sync_meta->data =
+        (gpointer) gl->FenceSync (GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
+    gl->Flush ();
+    GST_LOG ("setting sync object %p", sync_meta->data);
+  } else {
+    gl->Finish ();
+  }
+}
+
+static void
+_default_wait_gl (GstGLSyncMeta * sync_meta, GstGLContext * context)
+{
+  const GstGLFuncs *gl = context->gl_vtable;
+  GLenum res;
+
+  if (sync_meta->data && gl->ClientWaitSync) {
+    do {
+      GST_LOG ("waiting on sync object %p", sync_meta->data);
+      res =
+          gl->ClientWaitSync ((GLsync) sync_meta->data,
+          GL_SYNC_FLUSH_COMMANDS_BIT, 1000000000 /* 1s */ );
+    } while (res == GL_TIMEOUT_EXPIRED);
+  }
+}
+
+static void
+_default_copy (GstGLSyncMeta * src, GstBuffer * sbuffer, GstGLSyncMeta * dest,
+    GstBuffer * dbuffer)
+{
+  GST_LOG ("copy sync object %p from meta %p to %p", src->data, src, dest);
+
+  /* Setting a sync point here relies on GstBuffer copying
+   * metas after data */
+  gst_gl_sync_meta_set_sync_point (src, src->context);
+}
+
+static void
+_default_free_gl (GstGLSyncMeta * sync_meta, GstGLContext * context)
+{
+  const GstGLFuncs *gl = context->gl_vtable;
+
+  if (sync_meta->data) {
+    GST_LOG ("deleting sync object %p", sync_meta->data);
+    gl->DeleteSync ((GLsync) sync_meta->data);
+    sync_meta->data = NULL;
+  }
+}
+
 GstGLSyncMeta *
-gst_buffer_add_gl_sync_meta (GstGLContext * context, GstBuffer * buffer)
+gst_buffer_add_gl_sync_meta_full (GstGLContext * context, GstBuffer * buffer,
+    gpointer data)
 {
   GstGLSyncMeta *meta;
 
-  g_return_val_if_fail (GST_GL_IS_CONTEXT (context), NULL);
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (context), NULL);
 
   meta =
       (GstGLSyncMeta *) gst_buffer_add_meta ((buffer), GST_GL_SYNC_META_INFO,
@@ -53,60 +112,63 @@
     return NULL;
 
   meta->context = gst_object_ref (context);
-  meta->glsync = NULL;
+  meta->data = data;
 
   return meta;
 }
 
+GstGLSyncMeta *
+gst_buffer_add_gl_sync_meta (GstGLContext * context, GstBuffer * buffer)
+{
+  GstGLSyncMeta *ret = gst_buffer_add_gl_sync_meta_full (context, buffer, NULL);
+  if (!ret)
+    return NULL;
+
+  ret->set_sync_gl = _default_set_sync_gl;
+  ret->wait_gl = _default_wait_gl;
+  ret->copy = _default_copy;
+  ret->free_gl = _default_free_gl;
+
+  return ret;
+}
+
 static void
 _set_sync_point (GstGLContext * context, GstGLSyncMeta * sync_meta)
 {
-  const GstGLFuncs *gl = context->gl_vtable;
+  g_assert (sync_meta->set_sync_gl != NULL);
 
-  if (gl->FenceSync) {
-    if (sync_meta->glsync) {
-      GST_LOG ("deleting sync object %p", sync_meta->glsync);
-      gl->DeleteSync (sync_meta->glsync);
-    }
-    sync_meta->glsync = gl->FenceSync (GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
-    gl->Flush ();
-    GST_LOG ("setting sync object %p", sync_meta->glsync);
-  } else {
-    gl->Finish ();
-  }
+  GST_LOG ("setting sync point %p", sync_meta);
+  sync_meta->set_sync_gl (sync_meta, context);
 }
 
 void
 gst_gl_sync_meta_set_sync_point (GstGLSyncMeta * sync_meta,
     GstGLContext * context)
 {
-  gst_gl_context_thread_add (context,
-      (GstGLContextThreadFunc) _set_sync_point, sync_meta);
+  if (sync_meta->set_sync)
+    sync_meta->set_sync (sync_meta, context);
+  else
+    gst_gl_context_thread_add (context,
+        (GstGLContextThreadFunc) _set_sync_point, sync_meta);
 }
 
 static void
 _wait (GstGLContext * context, GstGLSyncMeta * sync_meta)
 {
-  const GstGLFuncs *gl = context->gl_vtable;
-  GLenum res;
+  g_assert (sync_meta->wait_gl != NULL);
 
-  if (gl->ClientWaitSync) {
-    do {
-      GST_LOG ("waiting on sync object %p", sync_meta->glsync);
-      res =
-          gl->ClientWaitSync (sync_meta->glsync, GL_SYNC_FLUSH_COMMANDS_BIT,
-          1000000000 /* 1s */ );
-    } while (res == GL_TIMEOUT_EXPIRED);
-  }
+  GST_LOG ("waiting %p", sync_meta);
+  sync_meta->wait_gl (sync_meta, context);
 }
 
 void
 gst_gl_sync_meta_wait (GstGLSyncMeta * sync_meta, GstGLContext * context)
 {
-  if (sync_meta->glsync) {
+  if (sync_meta->wait)
+    sync_meta->wait (sync_meta, context);
+  else
     gst_gl_context_thread_add (context,
         (GstGLContextThreadFunc) _wait, sync_meta);
-  }
 }
 
 static gboolean
@@ -120,19 +182,24 @@
   if (GST_META_TRANSFORM_IS_COPY (type)) {
     GstMetaTransformCopy *copy = data;
 
+    g_assert (smeta->copy != NULL);
+
     if (!copy->region) {
       /* only copy if the complete data is copied as well */
-      dmeta = gst_buffer_add_gl_sync_meta (smeta->context, dest);
-
+      dmeta = gst_buffer_add_gl_sync_meta_full (smeta->context, dest, NULL);
       if (!dmeta)
         return FALSE;
 
-      GST_LOG ("copy sync object %p from meta %p to %p", smeta->glsync,
-          smeta, dmeta);
+      dmeta->set_sync = smeta->set_sync;
+      dmeta->set_sync_gl = smeta->set_sync_gl;
+      dmeta->wait = smeta->wait;
+      dmeta->wait_gl = smeta->wait_gl;
+      dmeta->copy = smeta->copy;
+      dmeta->free = smeta->free;
+      dmeta->free_gl = smeta->free_gl;
 
-      /* Setting a sync point here relies on GstBuffer copying
-       * metas after data */
-      gst_gl_sync_meta_set_sync_point (dmeta, smeta->context);
+      GST_LOG ("copying sync meta %p into %p", smeta, dmeta);
+      smeta->copy (smeta, buffer, dmeta, dest);
     }
   } else {
     /* return FALSE, if transform type is not supported */
@@ -145,22 +212,21 @@
 static void
 _free_gl_sync_meta (GstGLContext * context, GstGLSyncMeta * sync_meta)
 {
-  const GstGLFuncs *gl = context->gl_vtable;
+  g_assert (sync_meta->free_gl != NULL);
 
-  if (sync_meta->glsync) {
-    GST_LOG ("deleting sync object %p", sync_meta->glsync);
-    gl->DeleteSync (sync_meta->glsync);
-    sync_meta->glsync = NULL;
-  }
+  GST_LOG ("free sync meta %p", sync_meta);
+  sync_meta->free_gl (sync_meta, context);
 }
 
 static void
 _gst_gl_sync_meta_free (GstGLSyncMeta * sync_meta, GstBuffer * buffer)
 {
-  if (sync_meta->glsync) {
+  if (sync_meta->free)
+    sync_meta->free (sync_meta, sync_meta->context);
+  else
     gst_gl_context_thread_add (sync_meta->context,
         (GstGLContextThreadFunc) _free_gl_sync_meta, sync_meta);
-  }
+
   gst_object_unref (sync_meta->context);
 }
 
@@ -177,7 +243,14 @@
   }
 
   sync_meta->context = NULL;
-  sync_meta->glsync = NULL;
+  sync_meta->data = NULL;
+  sync_meta->set_sync = NULL;
+  sync_meta->set_sync_gl = NULL;
+  sync_meta->wait = NULL;
+  sync_meta->wait_gl = NULL;
+  sync_meta->copy = NULL;
+  sync_meta->free = NULL;
+  sync_meta->free_gl = NULL;
 
   return TRUE;
 }
diff --git a/gst-libs/gst/gl/gstglsyncmeta.h b/gst-libs/gst/gl/gstglsyncmeta.h
index 9d79435..8620ccd 100644
--- a/gst-libs/gst/gl/gstglsyncmeta.h
+++ b/gst-libs/gst/gl/gstglsyncmeta.h
@@ -32,12 +32,19 @@
 #define GST_BUFFER_POOL_OPTION_GL_SYNC_META "GstBufferPoolOptionGLSyncMeta"
 
 struct _GstGLSyncMeta {
-  /*< private >*/
   GstMeta parent;
 
   GstGLContext *context;
 
-  GLsync        glsync;
+  gpointer      data;
+
+  void (*set_sync) (GstGLSyncMeta * sync, GstGLContext * context);
+  void (*set_sync_gl) (GstGLSyncMeta * sync, GstGLContext * context);
+  void (*wait) (GstGLSyncMeta * sync, GstGLContext * context);
+  void (*wait_gl) (GstGLSyncMeta * sync, GstGLContext * context);
+  void (*copy) (GstGLSyncMeta * src, GstBuffer * sbuffer, GstGLSyncMeta * dest, GstBuffer * dbuffer);
+  void (*free) (GstGLSyncMeta * sync, GstGLContext * context);
+  void (*free_gl) (GstGLSyncMeta * sync, GstGLContext * context);
 };
 
 GType gst_gl_sync_meta_api_get_type (void);
@@ -46,6 +53,8 @@
 #define gst_buffer_get_gl_sync_meta(b) ((GstGLSyncMeta*)gst_buffer_get_meta((b),GST_GL_SYNC_META_API_TYPE))
 
 GstGLSyncMeta *     gst_buffer_add_gl_sync_meta         (GstGLContext * context, GstBuffer *buffer);
+GstGLSyncMeta *     gst_buffer_add_gl_sync_meta_full    (GstGLContext * context, GstBuffer * buffer,
+                                                         gpointer data);
 void                gst_gl_sync_meta_set_sync_point     (GstGLSyncMeta * sync, GstGLContext * context);
 void                gst_gl_sync_meta_wait               (GstGLSyncMeta * sync, GstGLContext * context);
 
diff --git a/gst-libs/gst/gl/gstglupload.c b/gst-libs/gst/gl/gstglupload.c
index 0addca1..bcb3780 100644
--- a/gst-libs/gst/gl/gstglupload.c
+++ b/gst-libs/gst/gl/gstglupload.c
@@ -31,6 +31,10 @@
 #include "egl/gsteglimagememory.h"
 #endif
 
+#if GST_GL_HAVE_DMABUF
+#include <gst/allocators/gstdmabuf.h>
+#endif
+
 /**
  * SECTION:gstglupload
  * @short_description: an object that uploads to GL textures
@@ -56,11 +60,27 @@
 G_DEFINE_TYPE_WITH_CODE (GstGLUpload, gst_gl_upload, GST_TYPE_OBJECT,
     DEBUG_INIT);
 static void gst_gl_upload_finalize (GObject * object);
-static void gst_gl_upload_release_buffer_unlocked (GstGLUpload * upload);
 
 #define GST_GL_UPLOAD_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
     GST_TYPE_GL_UPLOAD, GstGLUploadPrivate))
 
+static GstGLTextureTarget
+_caps_get_texture_target (GstCaps * caps, GstGLTextureTarget default_target)
+{
+  GstGLTextureTarget ret = 0;
+  GstStructure *s = gst_caps_get_structure (caps, 0);
+
+  if (gst_structure_has_field_typed (s, "texture-target", G_TYPE_STRING)) {
+    const gchar *target_str = gst_structure_get_string (s, "texture-target");
+    ret = gst_gl_texture_target_from_string (target_str);
+  }
+
+  if (!ret)
+    ret = default_target;
+
+  return ret;
+}
+
 /* Define the maximum number of planes we can upload - handle 2 views per buffer */
 #define GST_GL_UPLOAD_MAX_PLANES (GST_VIDEO_MAX_PLANES * 2)
 
@@ -122,7 +142,6 @@
       GstQuery * query);
     GstGLUploadReturn (*perform) (gpointer impl, GstBuffer * buffer,
       GstBuffer ** outbuf);
-  void (*release) (gpointer impl, GstBuffer * buffer);
   void (*free) (gpointer impl);
 } _UploadMethod;
 
@@ -194,16 +213,26 @@
     GstQuery * query)
 {
   struct GLMemoryUpload *upload = impl;
-  GstAllocationParams params;
-  GstAllocator *allocator;
   GstBufferPool *pool = NULL;
   guint n_pools, i;
+  GstCaps *caps;
+  GstCapsFeatures *features;
 
-  gst_allocation_params_init (&params);
+  gst_query_parse_allocation (query, &caps, NULL);
+  features = gst_caps_get_features (caps, 0);
 
-  allocator = gst_allocator_find (GST_GL_MEMORY_ALLOCATOR);
-  gst_query_add_allocation_param (query, allocator, &params);
-  gst_object_unref (allocator);
+  /* Only offer our custom allocator if that type of memory was negotiated. */
+  if (gst_caps_features_contains (features, GST_CAPS_FEATURE_MEMORY_GL_MEMORY)) {
+    GstAllocator *allocator;
+    GstAllocationParams params;
+    gst_allocation_params_init (&params);
+
+    allocator =
+        GST_ALLOCATOR (gst_gl_memory_allocator_get_default (upload->
+            upload->context));
+    gst_query_add_allocation_param (query, allocator, &params);
+    gst_object_unref (allocator);
+  }
 
   n_pools = gst_query_get_n_allocation_pools (query);
   for (i = 0; i < n_pools; i++) {
@@ -217,10 +246,8 @@
   if (!pool) {
     GstStructure *config;
     GstVideoInfo info;
-    GstCaps *caps;
     gsize size;
 
-    gst_query_parse_allocation (query, &caps, NULL);
 
     if (!gst_video_info_from_caps (&info, caps))
       goto invalid_caps;
@@ -233,6 +260,17 @@
     gst_buffer_pool_config_set_params (config, caps, size, 0, 0);
     gst_buffer_pool_config_add_option (config,
         GST_BUFFER_POOL_OPTION_GL_SYNC_META);
+    if (upload->upload->priv->out_caps) {
+      GstGLTextureTarget target;
+      const gchar *target_pool_option_str;
+
+      target =
+          _caps_get_texture_target (upload->upload->priv->out_caps,
+          GST_GL_TEXTURE_TARGET_2D);
+      target_pool_option_str =
+          gst_gl_texture_target_to_buffer_pool_option (target);
+      gst_buffer_pool_config_add_option (config, target_pool_option_str);
+    }
 
     if (!gst_buffer_pool_set_config (pool, config)) {
       gst_object_unref (pool);
@@ -276,7 +314,8 @@
             gl_mem->mem.context))
       return GST_GL_UPLOAD_UNSHARED_GL_CONTEXT;
 
-    gst_gl_memory_upload_transfer (gl_mem);
+    if (gst_is_gl_memory_pbo (mem))
+      gst_gl_memory_pbo_upload_transfer ((GstGLMemoryPBO *) mem);
   }
 
   *outbuf = gst_buffer_ref (buffer);
@@ -285,11 +324,6 @@
 }
 
 static void
-_gl_memory_upload_release (gpointer impl, GstBuffer * buffer)
-{
-}
-
-static void
 _gl_memory_upload_free (gpointer impl)
 {
   g_free (impl);
@@ -309,7 +343,6 @@
   &_gl_memory_upload_accept,
   &_gl_memory_upload_propose_allocation,
   &_gl_memory_upload_perform,
-  &_gl_memory_upload_release,
   &_gl_memory_upload_free
 };
 
@@ -319,6 +352,7 @@
   GstGLUpload *upload;
   GstBuffer *buffer;
   GstBuffer **outbuf;
+  GstGLVideoAllocationParams *params;
 };
 
 static gpointer
@@ -340,8 +374,17 @@
   if (direction == GST_PAD_SINK) {
     ret = _set_caps_features (caps, GST_CAPS_FEATURE_MEMORY_GL_MEMORY);
   } else {
+    gint i, n;
+
     ret = _set_caps_features (caps, GST_CAPS_FEATURE_MEMORY_EGL_IMAGE);
     gst_caps_set_simple (ret, "format", G_TYPE_STRING, "RGBA", NULL);
+
+    n = gst_caps_get_size (ret);
+    for (i = 0; i < n; i++) {
+      GstStructure *s = gst_caps_get_structure (ret, i);
+
+      gst_structure_remove_fields (s, "texture-target", NULL);
+    }
   }
 
   return ret;
@@ -367,6 +410,14 @@
   if (!ret)
     return FALSE;
 
+  if (image->params)
+    gst_gl_allocation_params_free ((GstGLAllocationParams *) image->params);
+  if (!(image->params =
+          gst_gl_video_allocation_params_new (image->upload->context, NULL,
+              &image->upload->priv->in_info, -1, NULL,
+              GST_GL_TEXTURE_TARGET_2D)))
+    return FALSE;
+
   if (buffer) {
     GstVideoInfo *in_info = &image->upload->priv->in_info;
     guint expected_memories = GST_VIDEO_INFO_N_PLANES (in_info);
@@ -395,13 +446,22 @@
     GstQuery * query)
 {
   struct EGLImageUpload *image = impl;
-  GstAllocationParams params;
-  GstAllocator *allocator;
+  GstCaps *caps;
+  GstCapsFeatures *features;
 
-  gst_allocation_params_init (&params);
+  gst_query_parse_allocation (query, &caps, NULL);
+  features = gst_caps_get_features (caps, 0);
 
-  if (gst_gl_context_check_feature (image->upload->context,
+  /* Only offer our custom allocator if that type of memory was negotiated. */
+  if (gst_caps_features_contains (features,
+          GST_CAPS_FEATURE_MEMORY_EGL_IMAGE) &&
+      gst_gl_context_check_feature (image->upload->context,
           "EGL_KHR_image_base")) {
+    GstAllocationParams params;
+    GstAllocator *allocator;
+
+    gst_allocation_params_init (&params);
+
     allocator = gst_allocator_find (GST_EGL_IMAGE_MEMORY_TYPE);
     gst_query_add_allocation_param (query, allocator, &params);
     gst_object_unref (allocator);
@@ -412,12 +472,17 @@
 _egl_image_upload_perform_gl_thread (GstGLContext * context,
     struct EGLImageUpload *image)
 {
+  GstGLMemoryAllocator *allocator;
   guint i, n;
 
+  allocator =
+      GST_GL_MEMORY_ALLOCATOR (gst_allocator_find
+      (GST_GL_MEMORY_PBO_ALLOCATOR_NAME));
+
   /* FIXME: buffer pool */
   *image->outbuf = gst_buffer_new ();
-  gst_gl_memory_setup_buffer (image->upload->context,
-      NULL, &image->upload->priv->out_info, NULL, *image->outbuf);
+  gst_gl_memory_setup_buffer (allocator, *image->outbuf, image->params);
+  gst_object_unref (allocator);
 
   n = gst_buffer_n_memory (image->buffer);
   for (i = 0; i < n; i++) {
@@ -435,8 +500,8 @@
   }
 
   if (GST_IS_GL_BUFFER_POOL (image->buffer->pool))
-    gst_gl_buffer_pool_replace_last_buffer (GST_GL_BUFFER_POOL (image->
-            buffer->pool), image->buffer);
+    gst_gl_buffer_pool_replace_last_buffer (GST_GL_BUFFER_POOL (image->buffer->
+            pool), image->buffer);
 }
 
 static GstGLUploadReturn
@@ -458,13 +523,13 @@
 }
 
 static void
-_egl_image_upload_release (gpointer impl, GstBuffer * buffer)
-{
-}
-
-static void
 _egl_image_upload_free (gpointer impl)
 {
+  struct EGLImageUpload *image = impl;
+
+  if (image->params)
+    gst_gl_allocation_params_free ((GstGLAllocationParams *) image->params);
+
   g_free (impl);
 }
 
@@ -481,10 +546,267 @@
   &_egl_image_upload_accept,
   &_egl_image_upload_propose_allocation,
   &_egl_image_upload_perform,
-  &_egl_image_upload_release,
   &_egl_image_upload_free
 };
-#endif
+#endif /* GST_GL_HAVE_PLATFORM_EGL */
+
+#if GST_GL_HAVE_DMABUF
+struct DmabufUpload
+{
+  GstGLUpload *upload;
+
+  GstMemory *eglimage[GST_VIDEO_MAX_PLANES];
+  GstBuffer *outbuf;
+  GstGLVideoAllocationParams *params;
+};
+
+static GstStaticCaps _dma_buf_upload_caps =
+GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE (GST_GL_MEMORY_VIDEO_FORMATS_STR));
+
+static gpointer
+_dma_buf_upload_new (GstGLUpload * upload)
+{
+  struct DmabufUpload *dmabuf = g_new0 (struct DmabufUpload, 1);
+  dmabuf->upload = upload;
+  return dmabuf;
+}
+
+static GstCaps *
+_dma_buf_upload_transform_caps (GstGLContext * context,
+    GstPadDirection direction, GstCaps * caps)
+{
+  GstCaps *ret;
+
+  if (direction == GST_PAD_SINK) {
+    ret = _set_caps_features (caps, GST_CAPS_FEATURE_MEMORY_GL_MEMORY);
+  } else {
+    gint i, n;
+
+    ret = _set_caps_features (caps, GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY);
+
+    n = gst_caps_get_size (ret);
+    for (i = 0; i < n; i++) {
+      GstStructure *s = gst_caps_get_structure (ret, i);
+
+      gst_structure_remove_fields (s, "texture-target", NULL);
+    }
+  }
+
+  return ret;
+}
+
+static GQuark
+_eglimage_quark (gint plane)
+{
+  static GQuark quark[4] = { 0 };
+  static const gchar *quark_str[] = {
+    "GstGLDMABufEGLImage0",
+    "GstGLDMABufEGLImage1",
+    "GstGLDMABufEGLImage2",
+    "GstGLDMABufEGLImage3",
+  };
+
+  if (!quark[plane])
+    quark[plane] = g_quark_from_static_string (quark_str[plane]);
+
+  return quark[plane];
+}
+
+static GstMemory *
+_get_cached_eglimage (GstMemory * mem, gint plane)
+{
+  return gst_mini_object_get_qdata (GST_MINI_OBJECT (mem),
+      _eglimage_quark (plane));
+}
+
+static void
+_set_cached_eglimage (GstMemory * mem, GstMemory * eglimage, gint plane)
+{
+  return gst_mini_object_set_qdata (GST_MINI_OBJECT (mem),
+      _eglimage_quark (plane), eglimage, (GDestroyNotify) gst_memory_unref);
+}
+
+static gboolean
+_dma_buf_upload_accept (gpointer impl, GstBuffer * buffer, GstCaps * in_caps,
+    GstCaps * out_caps)
+{
+  struct DmabufUpload *dmabuf = impl;
+  GstVideoInfo *in_info = &dmabuf->upload->priv->in_info;
+  guint n_planes = GST_VIDEO_INFO_N_PLANES (in_info);
+  GstVideoMeta *meta;
+  guint n_mem;
+  guint mems_idx[GST_VIDEO_MAX_PLANES];
+  gsize mems_skip[GST_VIDEO_MAX_PLANES];
+  GstMemory *mems[GST_VIDEO_MAX_PLANES];
+  guint i;
+
+  n_mem = gst_buffer_n_memory (buffer);
+  meta = gst_buffer_get_video_meta (buffer);
+
+  /* dmabuf upload is only supported with EGL contexts. */
+  if (!GST_IS_GL_CONTEXT_EGL (dmabuf->upload->context))
+    return FALSE;
+
+  if (!gst_gl_context_check_feature (dmabuf->upload->context,
+          "EGL_KHR_image_base"))
+    return FALSE;
+
+  /* This will eliminate most non-dmabuf out there */
+  if (!gst_is_dmabuf_memory (gst_buffer_peek_memory (buffer, 0)))
+    return FALSE;
+
+  /* We cannot have multiple dmabuf per plane */
+  if (n_mem > n_planes)
+    return FALSE;
+
+  /* Update video info based on video meta */
+  if (meta) {
+    in_info->width = meta->width;
+    in_info->height = meta->height;
+
+    for (i = 0; i < meta->n_planes; i++) {
+      in_info->offset[i] = meta->offset[i];
+      in_info->stride[i] = meta->stride[i];
+    }
+  }
+
+  if (dmabuf->params)
+    gst_gl_allocation_params_free ((GstGLAllocationParams *) dmabuf->params);
+  if (!(dmabuf->params =
+          gst_gl_video_allocation_params_new (dmabuf->upload->context, NULL,
+              &dmabuf->upload->priv->in_info, -1, NULL,
+              GST_GL_TEXTURE_TARGET_2D)))
+    return FALSE;
+
+  /* Find and validate all memories */
+  for (i = 0; i < n_planes; i++) {
+    guint plane_size;
+    guint length;
+
+    plane_size = gst_gl_get_plane_data_size (in_info, NULL, i);
+
+    if (!gst_buffer_find_memory (buffer, in_info->offset[i], plane_size,
+            &mems_idx[i], &length, &mems_skip[i]))
+      return FALSE;
+
+    /* We can't have more then one dmabuf per plane */
+    if (length != 1)
+      return FALSE;
+
+    mems[i] = gst_buffer_peek_memory (buffer, mems_idx[i]);
+
+    /* And all memory found must be dmabuf */
+    if (!gst_is_dmabuf_memory (mems[i]))
+      return FALSE;
+  }
+
+  /* Now create an EGLImage for each dmabufs */
+  for (i = 0; i < n_planes; i++) {
+    /* check if one is cached */
+    dmabuf->eglimage[i] = _get_cached_eglimage (mems[i], i);
+    if (dmabuf->eglimage[i])
+      continue;
+
+    /* otherwise create one and cache it */
+    dmabuf->eglimage[i] =
+        gst_egl_image_memory_from_dmabuf (dmabuf->upload->context,
+        gst_dmabuf_memory_get_fd (mems[i]), in_info, i, mems_skip[i]);
+
+    if (!dmabuf->eglimage[i])
+      return FALSE;
+
+    _set_cached_eglimage (mems[i], dmabuf->eglimage[i], i);
+  }
+
+  return TRUE;
+}
+
+static void
+_dma_buf_upload_propose_allocation (gpointer impl, GstQuery * decide_query,
+    GstQuery * query)
+{
+  /* nothing to do for now. */
+}
+
+static void
+_dma_buf_upload_perform_gl_thread (GstGLContext * context,
+    struct DmabufUpload *dmabuf)
+{
+  GstGLMemoryAllocator *allocator;
+  guint i, n;
+
+  allocator =
+      GST_GL_MEMORY_ALLOCATOR (gst_allocator_find
+      (GST_GL_MEMORY_PBO_ALLOCATOR_NAME));
+
+  /* FIXME: buffer pool */
+  dmabuf->outbuf = gst_buffer_new ();
+  gst_gl_memory_setup_buffer (allocator, dmabuf->outbuf, dmabuf->params);
+  gst_object_unref (allocator);
+
+  n = gst_buffer_n_memory (dmabuf->outbuf);
+  for (i = 0; i < n; i++) {
+    const GstGLFuncs *gl = NULL;
+    GstGLMemory *gl_mem =
+        (GstGLMemory *) gst_buffer_peek_memory (dmabuf->outbuf, i);
+
+    if (!dmabuf->eglimage[i]) {
+      g_clear_pointer (&dmabuf->outbuf, gst_buffer_unref);
+      return;
+    }
+
+    gl = GST_GL_CONTEXT (((GstEGLImageMemory *) gl_mem)->context)->gl_vtable;
+
+    gl->ActiveTexture (GL_TEXTURE0 + i);
+    gl->BindTexture (GL_TEXTURE_2D, gl_mem->tex_id);
+    gl->EGLImageTargetTexture2D (GL_TEXTURE_2D,
+        gst_egl_image_memory_get_image (dmabuf->eglimage[i]));
+  }
+}
+
+static GstGLUploadReturn
+_dma_buf_upload_perform (gpointer impl, GstBuffer * buffer, GstBuffer ** outbuf)
+{
+  struct DmabufUpload *dmabuf = impl;
+
+  gst_gl_context_thread_add (dmabuf->upload->context,
+      (GstGLContextThreadFunc) _dma_buf_upload_perform_gl_thread, dmabuf);
+
+  if (!dmabuf->outbuf)
+    return GST_GL_UPLOAD_ERROR;
+
+  gst_buffer_add_parent_buffer_meta (dmabuf->outbuf, buffer);
+
+  *outbuf = dmabuf->outbuf;
+  dmabuf->outbuf = NULL;
+
+  return GST_GL_UPLOAD_DONE;
+}
+
+static void
+_dma_buf_upload_free (gpointer impl)
+{
+  struct DmabufUpload *dmabuf = impl;
+
+  if (dmabuf->params)
+    gst_gl_allocation_params_free ((GstGLAllocationParams *) dmabuf->params);
+
+  g_free (impl);
+}
+
+static const UploadMethod _dma_buf_upload = {
+  "Dmabuf",
+  0,
+  &_dma_buf_upload_caps,
+  &_dma_buf_upload_new,
+  &_dma_buf_upload_transform_caps,
+  &_dma_buf_upload_accept,
+  &_dma_buf_upload_propose_allocation,
+  &_dma_buf_upload_perform,
+  &_dma_buf_upload_free
+};
+
+#endif /* GST_GL_HAVE_DMABUF */
 
 struct GLUploadMeta
 {
@@ -493,6 +815,7 @@
   gboolean result;
   GstVideoGLTextureUploadMeta *meta;
   guint texture_ids[GST_GL_UPLOAD_MAX_PLANES];
+  GstGLVideoAllocationParams *params;
 };
 
 static gpointer
@@ -514,10 +837,19 @@
   if (direction == GST_PAD_SINK) {
     ret = _set_caps_features (caps, GST_CAPS_FEATURE_MEMORY_GL_MEMORY);
   } else {
+    gint i, n;
+
     ret =
         _set_caps_features (caps,
         GST_CAPS_FEATURE_META_GST_VIDEO_GL_TEXTURE_UPLOAD_META);
     gst_caps_set_simple (ret, "format", G_TYPE_STRING, "RGBA", NULL);
+
+    n = gst_caps_get_size (ret);
+    for (i = 0; i < n; i++) {
+      GstStructure *s = gst_caps_get_structure (ret, i);
+
+      gst_structure_remove_fields (s, "texture-target", NULL);
+    }
   }
 
   return ret;
@@ -545,6 +877,14 @@
   if (!ret)
     return ret;
 
+  if (upload->params)
+    gst_gl_allocation_params_free ((GstGLAllocationParams *) upload->params);
+  if (!(upload->params =
+          gst_gl_video_allocation_params_new (upload->upload->context, NULL,
+              &upload->upload->priv->in_info, -1, NULL,
+              GST_GL_TEXTURE_TARGET_2D)))
+    return FALSE;
+
   if (buffer) {
     if ((meta = gst_buffer_get_video_gl_texture_upload_meta (buffer)) == NULL)
       return FALSE;
@@ -574,11 +914,11 @@
   gpointer handle;
 
   gl_apis =
-      gst_gl_api_to_string (gst_gl_context_get_gl_api (upload->upload->
-          context));
-  platform =
-      gst_gl_platform_to_string (gst_gl_context_get_gl_platform (upload->
+      gst_gl_api_to_string (gst_gl_context_get_gl_api (upload->
           upload->context));
+  platform =
+      gst_gl_platform_to_string (gst_gl_context_get_gl_platform
+      (upload->upload->context));
   handle = (gpointer) gst_gl_context_get_gl_context (upload->upload->context);
 
   gl_context =
@@ -618,6 +958,9 @@
   int i;
   GstVideoInfo *in_info = &upload->upload->priv->in_info;
   guint max_planes = GST_VIDEO_INFO_N_PLANES (in_info);
+  GstGLMemoryAllocator *allocator;
+
+  allocator = gst_gl_memory_allocator_get_default (upload->upload->context);
 
   /* Support stereo views for separated multiview mode */
   if (GST_VIDEO_INFO_MULTIVIEW_MODE (in_info) ==
@@ -630,8 +973,8 @@
 
   /* FIXME: buffer pool */
   *outbuf = gst_buffer_new ();
-  gst_gl_memory_setup_buffer (upload->upload->context,
-      NULL, &upload->upload->priv->in_info, NULL, *outbuf);
+  gst_gl_memory_setup_buffer (allocator, *outbuf, upload->params);
+  gst_object_unref (allocator);
 
   for (i = 0; i < GST_GL_UPLOAD_MAX_PLANES; i++) {
     guint tex_id = 0;
@@ -661,11 +1004,6 @@
 }
 
 static void
-_upload_meta_upload_release (gpointer impl, GstBuffer * buffer)
-{
-}
-
-static void
 _upload_meta_upload_free (gpointer impl)
 {
   struct GLUploadMeta *upload = impl;
@@ -678,6 +1016,10 @@
       gst_gl_context_del_texture (upload->upload->context,
           &upload->texture_ids[i]);
   }
+
+  if (upload->params)
+    gst_gl_allocation_params_free ((GstGLAllocationParams *) upload->params);
+
   g_free (upload);
 }
 
@@ -694,7 +1036,6 @@
   &_upload_meta_upload_accept,
   &_upload_meta_upload_propose_allocation,
   &_upload_meta_upload_perform,
-  &_upload_meta_upload_release,
   &_upload_meta_upload_free
 };
 
@@ -708,6 +1049,7 @@
 {
   GstGLUpload *upload;
   struct RawUploadFrame *in_frame;
+  GstGLVideoAllocationParams *params;
 };
 
 static struct RawUploadFrame *
@@ -776,7 +1118,16 @@
   if (direction == GST_PAD_SINK) {
     ret = _set_caps_features (caps, GST_CAPS_FEATURE_MEMORY_GL_MEMORY);
   } else {
+    gint i, n;
+
     ret = _set_caps_features (caps, GST_CAPS_FEATURE_MEMORY_SYSTEM_MEMORY);
+
+    n = gst_caps_get_size (ret);
+    for (i = 0; i < n; i++) {
+      GstStructure *s = gst_caps_get_structure (ret, i);
+
+      gst_structure_remove_fields (s, "texture-target", NULL);
+    }
   }
 
   return ret;
@@ -793,8 +1144,19 @@
   if (!gst_caps_features_contains (features, GST_CAPS_FEATURE_MEMORY_GL_MEMORY))
     return FALSE;
 
+  if (raw->in_frame)
+    _raw_upload_frame_unref (raw->in_frame);
   raw->in_frame = _raw_upload_frame_new (raw, buffer);
 
+  if (raw->params)
+    gst_gl_allocation_params_free ((GstGLAllocationParams *) raw->params);
+  if (!(raw->params =
+          gst_gl_video_allocation_params_new_wrapped_data (raw->upload->context,
+              NULL, &raw->upload->priv->in_info, -1, NULL,
+              GST_GL_TEXTURE_TARGET_2D, NULL, raw->in_frame,
+              (GDestroyNotify) _raw_upload_frame_unref)))
+    return FALSE;
+
   return (raw->in_frame != NULL);
 }
 
@@ -809,37 +1171,43 @@
 _raw_data_upload_perform (gpointer impl, GstBuffer * buffer,
     GstBuffer ** outbuf)
 {
-  GstGLMemory *in_tex[GST_GL_UPLOAD_MAX_PLANES] = { 0, };
+  GstGLBaseMemoryAllocator *allocator;
   struct RawUpload *raw = impl;
   int i;
   GstVideoInfo *in_info = &raw->upload->priv->in_info;
-  guint max_planes = GST_VIDEO_INFO_N_PLANES (in_info);
+  guint n_mem = GST_VIDEO_INFO_N_PLANES (in_info);
 
-  /* Support stereo views for separated multiview mode */
-  if (GST_VIDEO_INFO_MULTIVIEW_MODE (in_info) ==
-      GST_VIDEO_MULTIVIEW_MODE_SEPARATED)
-    max_planes *= GST_VIDEO_INFO_VIEWS (in_info);
-
-  gst_gl_memory_setup_wrapped (raw->upload->context,
-      &raw->upload->priv->in_info, NULL, raw->in_frame->frame.data, in_tex,
-      raw->in_frame, (GDestroyNotify) _raw_upload_frame_unref);
+  allocator =
+      GST_GL_BASE_MEMORY_ALLOCATOR (gst_gl_memory_allocator_get_default
+      (raw->upload->context));
 
   /* FIXME Use a buffer pool to cache the generated textures */
+  /* FIXME: multiview support with separated left/right frames? */
   *outbuf = gst_buffer_new ();
-  for (i = 0; i < max_planes; i++) {
+  for (i = 0; i < n_mem; i++) {
+    GstGLBaseMemory *tex;
+
+    raw->params->parent.wrapped_data = raw->in_frame->frame.data[i];
+    raw->params->plane = i;
+
+    tex =
+        gst_gl_base_memory_alloc (allocator,
+        (GstGLAllocationParams *) raw->params);
+    if (!tex) {
+      gst_buffer_unref (*outbuf);
+      *outbuf = NULL;
+      GST_ERROR_OBJECT (raw->upload, "Failed to allocate wrapped texture");
+      return GST_GL_UPLOAD_ERROR;
+    }
+
     _raw_upload_frame_ref (raw->in_frame);
-    gst_buffer_append_memory (*outbuf, (GstMemory *) in_tex[i]);
+    gst_buffer_append_memory (*outbuf, (GstMemory *) tex);
   }
+  gst_object_unref (allocator);
 
-  return GST_GL_UPLOAD_DONE;
-}
-
-static void
-_raw_data_upload_release (gpointer impl, GstBuffer * buffer)
-{
-  struct RawUpload *raw = impl;
   _raw_upload_frame_unref (raw->in_frame);
   raw->in_frame = NULL;
+  return GST_GL_UPLOAD_DONE;
 }
 
 static void
@@ -847,6 +1215,9 @@
 {
   struct RawUpload *raw = impl;
 
+  if (raw->params)
+    gst_gl_allocation_params_free ((GstGLAllocationParams *) raw->params);
+
   g_free (raw);
 }
 
@@ -862,7 +1233,6 @@
   &_raw_data_upload_accept,
   &_raw_data_upload_propose_allocation,
   &_raw_data_upload_perform,
-  &_raw_data_upload_release,
   &_raw_data_upload_free
 };
 
@@ -870,6 +1240,9 @@
 #if GST_GL_HAVE_PLATFORM_EGL
   &_egl_image_upload,
 #endif
+#if GST_GL_HAVE_DMABUF
+  &_dma_buf_upload,
+#endif
   &_upload_meta_upload, &_raw_data_upload
 };
 
@@ -945,8 +1318,6 @@
 
   upload = GST_GL_UPLOAD (object);
 
-  gst_gl_upload_release_buffer_unlocked (upload);
-
   if (upload->priv->method_impl)
     upload->priv->method->free (upload->priv->method_impl);
   upload->priv->method_i = 0;
@@ -1097,32 +1468,6 @@
   GST_OBJECT_UNLOCK (upload);
 }
 
-static void
-gst_gl_upload_release_buffer_unlocked (GstGLUpload * upload)
-{
-  if (upload->priv->outbuf && upload->priv->method_impl) {
-    upload->priv->method->release (upload->priv->method_impl,
-        upload->priv->outbuf);
-    gst_buffer_replace (&upload->priv->outbuf, NULL);
-  }
-}
-
-/**
- * gst_gl_upload_release_buffer:
- * @upload: a #GstGLUpload
- *
- * Releases any buffers currently referenced by @upload
- */
-void
-gst_gl_upload_release_buffer (GstGLUpload * upload)
-{
-  g_return_if_fail (upload != NULL);
-
-  GST_OBJECT_LOCK (upload);
-  gst_gl_upload_release_buffer_unlocked (upload);
-  GST_OBJECT_UNLOCK (upload);
-}
-
 static gboolean
 _upload_find_method (GstGLUpload * upload)
 {
@@ -1149,10 +1494,10 @@
  * gst_gl_upload_perform_with_buffer:
  * @upload: a #GstGLUpload
  * @buffer: a #GstBuffer
- * @outbuf_ptr: (allow-none): resulting buffer
+ * @outbuf_ptr: esulting buffer
  *
- * Uploads @buffer to the texture given by @tex_id.  @tex_id is valid
- * until gst_gl_upload_release_buffer() is called.
+ * Uploads @buffer using the transformation specified by
+ * gst_gl_upload_set_caps().
  *
  * Returns: whether the upload was successful
  */
@@ -1161,14 +1506,14 @@
     GstBuffer ** outbuf_ptr)
 {
   GstGLUploadReturn ret = GST_GL_UPLOAD_ERROR;
+  GstBuffer *outbuf;
 
   g_return_val_if_fail (GST_IS_GL_UPLOAD (upload), FALSE);
   g_return_val_if_fail (GST_IS_BUFFER (buffer), FALSE);
+  g_return_val_if_fail (outbuf_ptr != NULL, FALSE);
 
   GST_OBJECT_LOCK (upload);
 
-  gst_gl_upload_release_buffer_unlocked (upload);
-
 #define NEXT_METHOD \
 do { \
   if (!_upload_find_method (upload)) { \
@@ -1188,7 +1533,7 @@
 
   ret =
       upload->priv->method->perform (upload->priv->method_impl, buffer,
-      &upload->priv->outbuf);
+      &outbuf);
   if (ret == GST_GL_UPLOAD_UNSHARED_GL_CONTEXT) {
     upload->priv->method->free (upload->priv->method_impl);
     upload->priv->method = &_raw_data_upload;
@@ -1197,18 +1542,15 @@
   } else if (ret == GST_GL_UPLOAD_DONE) {
     /* we are done */
   } else {
-    gst_gl_upload_release_buffer_unlocked (upload);
     upload->priv->method->free (upload->priv->method_impl);
     upload->priv->method_impl = NULL;
     NEXT_METHOD;
   }
 
-  if (outbuf_ptr) {
-    if (buffer != upload->priv->outbuf)
-      gst_buffer_copy_into (upload->priv->outbuf, buffer,
-          GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS, 0, -1);
-    *outbuf_ptr = gst_buffer_ref (upload->priv->outbuf);
-  }
+  if (buffer != outbuf)
+    gst_buffer_copy_into (outbuf, buffer,
+        GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS, 0, -1);
+  *outbuf_ptr = outbuf;
 
   GST_OBJECT_UNLOCK (upload);
 
diff --git a/gst-libs/gst/gl/gstglupload.h b/gst-libs/gst/gl/gstglupload.h
index 5bc4346..ed6dc67 100644
--- a/gst-libs/gst/gl/gstglupload.h
+++ b/gst-libs/gst/gl/gstglupload.h
@@ -99,7 +99,6 @@
 GstGLUploadReturn gst_gl_upload_perform_with_buffer (GstGLUpload * upload,
                                                     GstBuffer * buffer,
                                                     GstBuffer ** outbuf);
-void              gst_gl_upload_release_buffer     (GstGLUpload * upload);
 
 G_END_DECLS
 
diff --git a/gst-libs/gst/gl/gstgluploadmeta.c b/gst-libs/gst/gl/gstgluploadmeta.c
deleted file mode 100644
index e47e006..0000000
--- a/gst-libs/gst/gl/gstgluploadmeta.c
+++ /dev/null
@@ -1,380 +0,0 @@
-/*
- * GStreamer
- * Copyright (C) 2012-2014 Matthew Waters <ystree00@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 <stdio.h>
-
-#include "gl.h"
-#include "gstgluploadmeta.h"
-
-/**
- * SECTION:gstgluploadmeta
- * @short_description: an object that provides #GstVideoGLTextureUploadMeta
- * @see_also: #GstGLUpload, #GstGLMemory
- *
- * #GstGLUploadMeta is an object that uploads data from system memory into GL textures.
- *
- * A #GstGLUpload can be created with gst_gl_upload_new()
- */
-
-#define USING_OPENGL(context) (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL, 1, 0))
-#define USING_OPENGL3(context) (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL3, 3, 1))
-#define USING_GLES(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES, 1, 0))
-#define USING_GLES2(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 2, 0))
-#define USING_GLES3(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 3, 0))
-
-/* *INDENT-OFF* */
-
-struct _GstGLUploadMetaPrivate
-{
-  GstBuffer *buffer;
-  gboolean initted;
-
-  GstGLMemory *in_tex[GST_VIDEO_MAX_PLANES];
-  GstGLMemory *out_tex[GST_VIDEO_MAX_PLANES];
-};
-
-GST_DEBUG_CATEGORY_STATIC (gst_gl_upload_meta_debug);
-#define GST_CAT_DEFAULT gst_gl_upload_meta_debug
-
-#define DEBUG_INIT \
-  GST_DEBUG_CATEGORY_INIT (gst_gl_upload_meta_debug, "gluploadmeta", 0, "uploadmeta");
-
-G_DEFINE_TYPE_WITH_CODE (GstGLUploadMeta, gst_gl_upload_meta, GST_TYPE_OBJECT, DEBUG_INIT);
-static void gst_gl_upload_meta_finalize (GObject * object);
-static void gst_gl_upload_meta_reset (GstGLUploadMeta * upload);
-
-#define GST_GL_UPLOAD_META_GET_PRIVATE(obj) (G_TYPE_INSTANCE_GET_PRIVATE ((obj), \
-    GST_TYPE_GL_UPLOAD_META, GstGLUploadMetaPrivate))
-
-static void
-gst_gl_upload_meta_class_init (GstGLUploadMetaClass * klass)
-{
-  g_type_class_add_private (klass, sizeof (GstGLUploadMetaPrivate));
-
-  G_OBJECT_CLASS (klass)->finalize = gst_gl_upload_meta_finalize;
-}
-
-static void
-gst_gl_upload_meta_init (GstGLUploadMeta * upload)
-{
-  upload->priv = GST_GL_UPLOAD_META_GET_PRIVATE (upload);
-
-  upload->context = NULL;
-
-  gst_video_info_set_format (&upload->info, GST_VIDEO_FORMAT_ENCODED, 0, 0);
-}
-
-/**
- * gst_gl_upload_meta_new:
- * @context: a #GstGLContext
- *
- * Returns: a new #GstGLUploadMeta object
- */
-GstGLUploadMeta *
-gst_gl_upload_meta_new (GstGLContext * context)
-{
-  GstGLUploadMeta *upload;
-
-  upload = g_object_new (GST_TYPE_GL_UPLOAD_META, NULL);
-
-  upload->context = gst_object_ref (context);
-
-  GST_DEBUG_OBJECT (upload, "Created upload for context %"GST_PTR_FORMAT, upload->context);
-  
-  return upload;
-}
-
-static void
-gst_gl_upload_meta_finalize (GObject * object)
-{
-  GstGLUploadMeta *upload;
-
-  GST_DEBUG_OBJECT (object, "Finalizing");
-  upload = GST_GL_UPLOAD_META (object);
-
-  gst_gl_upload_meta_reset (upload);
-
-  if (upload->context) {
-    gst_object_unref (upload->context);
-    upload->context = NULL;
-  }
-
-  G_OBJECT_CLASS (gst_gl_upload_meta_parent_class)->finalize (object);
-}
-
-static void
-gst_gl_upload_meta_reset (GstGLUploadMeta * upload)
-{
-  guint i;
-
-  for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) {
-    if (upload->priv->out_tex[i]) {
-      gst_memory_unref ((GstMemory *) upload->priv->out_tex[i]);
-      upload->priv->out_tex[i] = NULL;
-    }
-  }
-
-  for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) {
-    if (upload->priv->in_tex[i]) {
-      gst_memory_unref ((GstMemory *) upload->priv->in_tex[i]);
-      upload->priv->in_tex[i] = NULL;
-    }
-  }
-}
-
-static void
-_gst_gl_upload_meta_set_format_unlocked (GstGLUploadMeta * upload,
-    GstVideoInfo *info)
-{
-  g_return_if_fail (upload != NULL);
-  g_return_if_fail (GST_VIDEO_INFO_FORMAT (info) !=
-      GST_VIDEO_FORMAT_UNKNOWN);
-  g_return_if_fail (GST_VIDEO_INFO_FORMAT (info) !=
-      GST_VIDEO_FORMAT_ENCODED);
-
-  if (gst_video_info_is_equal (&upload->info, info))
-    return;
-
-  gst_gl_upload_meta_reset (upload);
-  upload->info = *info;
-  upload->priv->initted = FALSE;
-}
-
-/**
- * gst_gl_upload_meta_set_format:
- * @upload: a #GstGLUpload
- * @info: input #GstVideoInfo
- *
- * Initializes @upload with the information required for upload.
- */
-void
-gst_gl_upload_meta_set_format (GstGLUploadMeta * upload, GstVideoInfo * info)
-{
-  GST_OBJECT_LOCK (upload);
-  _gst_gl_upload_meta_set_format_unlocked (upload, info);
-  GST_OBJECT_UNLOCK (upload);
-}
-
-/**
- * gst_gl_upload_meta_get_format:
- * @upload: a #GstGLUpload
- *
- * Returns: (transfer none): The #GstVideoInfo set by
- * gst_gl_upload_meta_set_format()
- */
-GstVideoInfo *
-gst_gl_upload_meta_get_format (GstGLUploadMeta * upload)
-{
-  GstVideoInfo *ret;
-
-  GST_OBJECT_LOCK (upload);
-  ret = &upload->info;
-  GST_OBJECT_LOCK (upload);
-
-  return ret;
-}
-
-static gboolean
-_perform_with_gl_memory (GstGLUploadMeta * upload, GstVideoGLTextureUploadMeta *
-    meta, guint texture_id[4])
-{
-  gboolean res = TRUE;
-  gint i;
-
-  for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&upload->info); i++) {
-    GstGLMemory *in_mem = upload->priv->in_tex[i];
-
-    if (GST_MEMORY_FLAG_IS_SET (in_mem, GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD)) {
-      GstMapInfo map_info;
-      guint tex_id;
-
-      tex_id = in_mem->tex_id;
-      in_mem->tex_id = texture_id[i];
-
-      if (!gst_memory_map ((GstMemory *) in_mem, &map_info, GST_MAP_READ | GST_MAP_GL)) {
-        GST_WARNING_OBJECT (upload, "Failed to map GL memory");
-        res = FALSE;
-      }
-      gst_memory_unmap ((GstMemory *) in_mem, &map_info);
-
-      in_mem->tex_id = tex_id;
-      GST_MINI_OBJECT_FLAG_SET (in_mem, GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD);
-    } else {
-      GstGLMemory *out_mem;
-      gint mem_width, mem_height;
-
-      if (!upload->priv->out_tex[i]) {
-        /* the GL upload meta creates GL_TEXTURE_2D textures */
-        upload->priv->out_tex[i] = gst_gl_memory_wrapped_texture (upload->context,
-            texture_id[i], GL_TEXTURE_2D, &upload->info, i, NULL, NULL, NULL);
-      }
-
-      out_mem = upload->priv->out_tex[i];
-
-      if (out_mem->tex_id != texture_id[i]) {
-        out_mem->tex_id = texture_id[i];
-        GST_MINI_OBJECT_FLAG_SET (out_mem, GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD);
-      }
-
-      mem_width = gst_gl_memory_get_texture_width (out_mem);
-      mem_height = gst_gl_memory_get_texture_height (out_mem);
-
-      if (!(res = gst_gl_memory_copy_into_texture (in_mem, out_mem->tex_id,
-            out_mem->tex_type, mem_width, mem_height,
-            GST_VIDEO_INFO_PLANE_STRIDE (&out_mem->info, out_mem->plane),
-            FALSE)))
-        break;
-    }
-  }
-
-  return res;
-}
-
-static gboolean
-_perform_with_data_unlocked (GstGLUploadMeta * upload,
-    GstVideoGLTextureUploadMeta * meta, 
-    gpointer data[GST_VIDEO_MAX_PLANES], guint texture_id[4])
-{
-  guint i;
-
-  for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&upload->info); i++) {
-    if (!upload->priv->in_tex[i])
-      upload->priv->in_tex[i] = gst_gl_memory_wrapped (upload->context,
-          &upload->info, i, NULL, data[i], NULL, NULL);
-  }
-
-  return _perform_with_gl_memory (upload, meta, texture_id);
-}
-
-static gboolean
-_perform_for_gl_texture_upload_meta (GstVideoGLTextureUploadMeta *
-    meta, guint texture_id[4])
-{
-  GstGLUploadMeta *upload;
-  GstVideoFrame frame;
-  GstMemory *mem;
-  gboolean ret;
-  guint i, n;
-
-  g_return_val_if_fail (meta != NULL, FALSE);
-  g_return_val_if_fail (texture_id != NULL, FALSE);
-
-  upload = meta->user_data;
-
-  GST_OBJECT_LOCK (upload);
-
-  if (!upload->priv->initted) {
-    GstVideoInfo info;
-    GstVideoMeta *v_meta = gst_buffer_get_video_meta (upload->priv->buffer);
-    gint i;
-
-    if (!(ret = v_meta != NULL))
-      goto out;
-
-    gst_video_info_init (&info);
-    info.finfo = gst_video_format_get_info (v_meta->format);
-    info.width = v_meta->width;
-    info.height = v_meta->height;
-
-    for (i = 0; i < info.finfo->n_planes; i++) {
-      info.offset[i] = v_meta->offset[i];
-      info.stride[i] = v_meta->stride[i];
-    }
-
-    _gst_gl_upload_meta_set_format_unlocked (upload, &info);
-    upload->priv->initted = TRUE;
-  }
-
-  GST_LOG ("Uploading for meta with textures %i,%i,%i,%i", texture_id[0],
-      texture_id[1], texture_id[2], texture_id[3]);
-
-  /* GstGLMemory */
-  n = gst_buffer_n_memory (upload->priv->buffer);
-  mem = gst_buffer_peek_memory (upload->priv->buffer, 0);
-
-  if (gst_is_gl_memory (mem) && n == GST_VIDEO_INFO_N_PLANES (&upload->info)) {
-    for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&upload->info); i++)
-      upload->priv->in_tex[i] = (GstGLMemory *) gst_buffer_peek_memory (upload->priv->buffer, i);
-
-    ret = _perform_with_gl_memory (upload, meta, texture_id);
-
-    for (i = 0; i < GST_VIDEO_INFO_N_PLANES (&upload->info); i++)
-      upload->priv->in_tex[i] = NULL;
-
-    if (ret)
-      goto out;
-  }
-
-  if (!(ret = gst_video_frame_map (&frame, &upload->info, upload->priv->buffer,
-          GST_MAP_READ))) {
-    GST_ERROR ("failed to map video frame");
-    goto out;
-  }
-
-  /* update the video info from the one updated by frame_map using video meta */
-  _gst_gl_upload_meta_set_format_unlocked (upload, &frame.info);
-
-  ret = _perform_with_data_unlocked (upload, meta, frame.data, texture_id);
-
-  gst_video_frame_unmap (&frame);
-
-out:
-  GST_OBJECT_UNLOCK (upload);
-  return ret;
-}
-
-/**
- * gst_gl_upload_meta_add_to_buffer:
- * @upload: a #GstGLUploadMeta
- * @buffer: a #GstBuffer
- *
- * Adds a #GstVideoGLTextureUploadMeta on @buffer using @upload
- *
- * Returns: whether it was successful
- */
-gboolean
-gst_gl_upload_meta_add_to_buffer (GstGLUploadMeta * upload, GstBuffer * buffer)
-{
-  GstVideoGLTextureType texture_types[GST_VIDEO_MAX_PLANES];
-  GstVideoMeta *v_meta;
-  gint i;
-
-  g_return_val_if_fail (upload != NULL, FALSE);
-  g_return_val_if_fail (buffer != NULL, FALSE);
-  v_meta = gst_buffer_get_video_meta (buffer);
-  g_return_val_if_fail (v_meta != NULL, FALSE);
-
-  upload->priv->buffer = buffer;
-
-  for (i = 0; i < GST_VIDEO_MAX_PLANES; i++) {
-    texture_types[i] = gst_gl_texture_type_from_format (upload->context, v_meta->format, i);
-  }
-
-  gst_buffer_add_video_gl_texture_upload_meta (buffer,
-      GST_VIDEO_GL_TEXTURE_ORIENTATION_X_NORMAL_Y_NORMAL, 1, texture_types,
-      _perform_for_gl_texture_upload_meta, gst_object_ref (upload),
-      gst_object_ref, gst_object_unref);
-
-  return TRUE;
-}
diff --git a/gst-libs/gst/gl/gstgluploadmeta.h b/gst-libs/gst/gl/gstgluploadmeta.h
deleted file mode 100644
index 199be2a..0000000
--- a/gst-libs/gst/gl/gstgluploadmeta.h
+++ /dev/null
@@ -1,79 +0,0 @@
-/*
- * GStreamer
- * Copyright (C) 2012 Matthew Waters <ystree00@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_UPLOAD_META_H__
-#define __GST_GL_UPLOAD_META_H__
-
-#include <gst/video/video.h>
-#include <gst/gstmemory.h>
-
-#include <gst/gl/gstgl_fwd.h>
-
-G_BEGIN_DECLS
-
-GType gst_gl_upload_meta_get_type (void);
-#define GST_TYPE_GL_UPLOAD_META (gst_gl_upload_meta_get_type())
-#define GST_GL_UPLOAD_META(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_GL_UPLOAD_META,GstGLUploadMeta))
-#define GST_GL_UPLOAD_META_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_GL_UPLOAD_META,GstGLUploadMetaClass))
-#define GST_IS_GL_UPLOAD_META(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_GL_UPLOAD_META))
-#define GST_IS_GL_UPLOAD_META_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_GL_UPLOAD_META))
-#define GST_GL_UPLOAD_META_CAST(obj) ((GstGLUploadMeta*)(obj))
-
-/**
- * GstGLUploadMeta
- *
- * Opaque #GstGLUploadMeta object
- */
-struct _GstGLUploadMeta
-{
-  /* <private> */
-  GstObject        parent;
-
-  GstGLContext    *context;
-
-  /* input data */
-  GstVideoInfo     info;
-
-  /* <private> */
-  GstGLUploadMetaPrivate *priv;
-
-  gpointer _reserved[GST_PADDING];
-};
-
-/**
- * GstGLUploadMetaClass:
- *
- * The #GstGLUploadMetaClass struct only contains private data
- */
-struct _GstGLUploadMetaClass
-{
-  GstObjectClass object_class;
-};
-
-GstGLUploadMeta * gst_gl_upload_meta_new            (GstGLContext * context);
-
-void           gst_gl_upload_meta_set_format    (GstGLUploadMeta * upload, GstVideoInfo * info);
-GstVideoInfo * gst_gl_upload_meta_get_format    (GstGLUploadMeta * upload);
-
-gboolean       gst_gl_upload_meta_add_to_buffer (GstGLUploadMeta * upload, GstBuffer * buffer);
-
-G_END_DECLS
-
-#endif /* __GST_GL_UPLOAD_META_H__ */
diff --git a/gst-libs/gst/gl/gstglutils.c b/gst-libs/gst/gl/gstglutils.c
index 0c0642a..080c17b 100644
--- a/gst-libs/gst/gl/gstglutils.c
+++ b/gst-libs/gst/gl/gstglutils.c
@@ -24,6 +24,7 @@
 #include <stdio.h>
 
 #include <gst/gst.h>
+#include <glib/gprintf.h>
 
 #include "gl.h"
 #include "gstglutils.h"
@@ -374,20 +375,65 @@
   gst_object_unref (frame);
 }
 
-static void
-_compile_shader (GstGLContext * context, GstGLShader ** shader)
+struct _compile_shader
 {
+  GstGLShader **shader;
+  const gchar *vertex_src;
+  const gchar *fragment_src;
+};
+
+static void
+_compile_shader (GstGLContext * context, struct _compile_shader *data)
+{
+  GstGLShader *shader;
+  GstGLSLStage *vert, *frag;
   GError *error = NULL;
 
-  gst_gl_shader_compile (*shader, &error);
-  if (error) {
-    gst_gl_context_set_error (context, "%s", error->message);
+  shader = gst_gl_shader_new (context);
+
+  if (data->vertex_src) {
+    vert = gst_glsl_stage_new_with_string (context, GL_VERTEX_SHADER,
+        GST_GLSL_VERSION_NONE,
+        GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY, data->vertex_src);
+    if (!gst_glsl_stage_compile (vert, &error)) {
+      GST_ERROR_OBJECT (vert, "%s", error->message);
+      gst_object_unref (vert);
+      gst_object_unref (shader);
+      return;
+    }
+    if (!gst_gl_shader_attach (shader, vert)) {
+      gst_object_unref (shader);
+      return;
+    }
+  }
+
+  if (data->fragment_src) {
+    frag = gst_glsl_stage_new_with_string (context, GL_FRAGMENT_SHADER,
+        GST_GLSL_VERSION_NONE,
+        GST_GLSL_PROFILE_ES | GST_GLSL_PROFILE_COMPATIBILITY,
+        data->fragment_src);
+    if (!gst_glsl_stage_compile (frag, &error)) {
+      GST_ERROR_OBJECT (frag, "%s", error->message);
+      gst_object_unref (frag);
+      gst_object_unref (shader);
+      return;
+    }
+    if (!gst_gl_shader_attach (shader, frag)) {
+      gst_object_unref (shader);
+      return;
+    }
+  }
+
+  if (!gst_gl_shader_link (shader, &error)) {
+    GST_ERROR_OBJECT (shader, "%s", error->message);
     g_error_free (error);
     error = NULL;
     gst_gl_context_clear_shader (context);
-    gst_object_unref (*shader);
-    *shader = NULL;
+    gst_object_unref (shader);
+    return;
   }
+
+  *data->shader = shader;
 }
 
 /* Called by glfilter */
@@ -395,18 +441,17 @@
 gst_gl_context_gen_shader (GstGLContext * context, const gchar * vert_src,
     const gchar * frag_src, GstGLShader ** shader)
 {
+  struct _compile_shader data;
+
   g_return_val_if_fail (frag_src != NULL || vert_src != NULL, FALSE);
   g_return_val_if_fail (shader != NULL, FALSE);
 
-  *shader = gst_gl_shader_new (context);
-
-  if (frag_src)
-    gst_gl_shader_set_fragment_source (*shader, frag_src);
-  if (vert_src)
-    gst_gl_shader_set_vertex_source (*shader, vert_src);
+  data.shader = shader;
+  data.vertex_src = vert_src;
+  data.fragment_src = frag_src;
 
   gst_gl_context_thread_add (context, (GstGLContextThreadFunc) _compile_shader,
-      shader);
+      &data);
 
   return *shader != NULL;
 }
@@ -416,8 +461,7 @@
 {
   va_list args;
 
-  if (error_message)
-    g_free (error_message);
+  g_free (error_message);
 
   va_start (args, format);
   error_message = g_strdup_vprintf (format, args);
@@ -452,6 +496,19 @@
 
 GST_DEBUG_CATEGORY_STATIC (GST_CAT_CONTEXT);
 
+static void
+_init_context_debug (void)
+{
+#ifndef GST_DISABLE_GST_DEBUG
+  static volatile gsize _init = 0;
+
+  if (g_once_init_enter (&_init)) {
+    GST_DEBUG_CATEGORY_GET (GST_CAT_CONTEXT, "GST_CONTEXT");
+    g_once_init_leave (&_init, 1);
+  }
+#endif
+}
+
 static gboolean
 pad_query (const GValue * item, GValue * value, gpointer user_data)
 {
@@ -459,6 +516,8 @@
   GstQuery *query = user_data;
   gboolean res;
 
+  _init_context_debug ();
+
   res = gst_pad_peer_query (pad, query);
 
   if (res) {
@@ -495,13 +554,14 @@
   return g_value_get_boolean (&res);
 }
 
-static GstQuery *
-_gst_context_query (GstElement * element,
-    gpointer ptr, const gchar * display_type)
+static void
+_gst_context_query (GstElement * element, const gchar * display_type)
 {
   GstQuery *query;
   GstContext *ctxt;
 
+  _init_context_debug ();
+
   /*  2a) Query downstream with GST_QUERY_CONTEXT for the context and
    *      check if downstream already has a context of the specific type
    *  2b) Query upstream as above.
@@ -511,10 +571,12 @@
     gst_query_parse_context (query, &ctxt);
     GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element,
         "found context (%p) in downstream query", ctxt);
+    gst_element_set_context (element, ctxt);
   } else if (gst_gl_run_query (element, query, GST_PAD_SINK)) {
     gst_query_parse_context (query, &ctxt);
     GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element,
         "found context (%p) in upstream query", ctxt);
+    gst_element_set_context (element, ctxt);
   } else {
     /* 3) Post a GST_MESSAGE_NEED_CONTEXT message on the bus with
      *    the required context type and afterwards check if a
@@ -537,103 +599,33 @@
    * is required to update the display_ptr or call gst_gl_handle_set_context().
    */
 
-  return query;
+  gst_query_unref (query);
 }
 
 static void
 gst_gl_display_context_query (GstElement * element, GstGLDisplay ** display_ptr)
 {
-  GstContext *ctxt = NULL;
-  GstQuery *query = NULL;
-
-#ifndef GST_DISABLE_GST_DEBUG
-  if (!GST_CAT_CONTEXT)
-    GST_DEBUG_CATEGORY_GET (GST_CAT_CONTEXT, "GST_CONTEXT");
-#endif
-
-  query =
-      _gst_context_query (element, display_ptr, GST_GL_DISPLAY_CONTEXT_TYPE);
-  gst_query_parse_context (query, &ctxt);
-
-  if (ctxt && gst_context_has_context_type (ctxt, GST_GL_DISPLAY_CONTEXT_TYPE)) {
-    GstGLDisplay *tmp_disp = NULL;
-    if (gst_context_get_gl_display (ctxt, &tmp_disp) && tmp_disp)
-      *display_ptr = tmp_disp;
-  }
-
+  _gst_context_query (element, GST_GL_DISPLAY_CONTEXT_TYPE);
   if (*display_ptr)
-    goto out;
+    return;
 
 #if GST_GL_HAVE_WINDOW_X11
-  gst_query_unref (query);
-  query = _gst_context_query (element, display_ptr, "gst.x11.display.handle");
-  gst_query_parse_context (query, &ctxt);
-  if (ctxt && gst_context_has_context_type (ctxt, "gst.x11.display.handle")) {
-    const GstStructure *s;
-    Display *display;
-
-    s = gst_context_get_structure (ctxt);
-    if (gst_structure_get (s, "display", G_TYPE_POINTER, &display, NULL)
-        && display) {
-      *display_ptr =
-          (GstGLDisplay *) gst_gl_display_x11_new_with_display (display);
-    }
-  }
-
+  _gst_context_query (element, "gst.x11.display.handle");
   if (*display_ptr)
-    goto out;
+    return;
 #endif
 
 #if GST_GL_HAVE_WINDOW_WAYLAND
-  gst_query_unref (query);
-  query =
-      _gst_context_query (element, display_ptr,
-      "GstWaylandDisplayHandleContextType");
-  gst_query_parse_context (query, &ctxt);
-  if (ctxt
-      && gst_context_has_context_type (ctxt,
-          "GstWaylandDisplayHandleContextType")) {
-    const GstStructure *s;
-    struct wl_display *display;
-
-    s = gst_context_get_structure (ctxt);
-    if (gst_structure_get (s, "display", G_TYPE_POINTER, &display, NULL)
-        && display) {
-      *display_ptr =
-          (GstGLDisplay *) gst_gl_display_wayland_new_with_display (display);
-    }
-  }
-
+  _gst_context_query (element, "GstWaylandDisplayHandleContextType");
   if (*display_ptr)
-    goto out;
+    return;
 #endif
-
-out:
-  gst_query_unref (query);
 }
 
 static void
-gst_gl_context_query (GstElement * element, GstGLContext ** context_ptr)
+gst_gl_context_query (GstElement * element)
 {
-  GstContext *ctxt;
-  GstQuery *query;
-
-#ifndef GST_DISABLE_GST_DEBUG
-  if (!GST_CAT_CONTEXT)
-    GST_DEBUG_CATEGORY_GET (GST_CAT_CONTEXT, "GST_CONTEXT");
-#endif
-
-  query = _gst_context_query (element, context_ptr, "gst.gl.app_context");
-  gst_query_parse_context (query, &ctxt);
-  if (ctxt && gst_context_has_context_type (ctxt, "gst.gl.app_context")) {
-    const GstStructure *s = gst_context_get_structure (ctxt);
-    GstGLContext *tmp_ctx = NULL;
-    if (gst_structure_get (s, "context", GST_GL_TYPE_CONTEXT, &tmp_ctx, NULL)
-        && tmp_ctx)
-      *context_ptr = tmp_ctx;
-  }
-
-  gst_query_unref (query);
+  _gst_context_query (element, "gst.gl.app_context");
 }
 
 /*  4) Create a context by itself and post a GST_MESSAGE_HAVE_CONTEXT
@@ -650,9 +642,13 @@
     return;
   }
 
+  _init_context_debug ();
+
   context = gst_context_new (GST_GL_DISPLAY_CONTEXT_TYPE, TRUE);
   gst_context_set_gl_display (context, display);
 
+  gst_element_set_context (element, context);
+
   GST_CAT_INFO_OBJECT (GST_CAT_CONTEXT, element,
       "posting have context (%p) message with display (%p)", context, display);
   msg = gst_message_new_have_context (GST_OBJECT_CAST (element), context);
@@ -693,7 +689,7 @@
   if (*context_ptr)
     goto done;
 
-  gst_gl_context_query (element, context_ptr);
+  gst_gl_context_query (element);
 
 done:
   return *display_ptr != NULL;
@@ -908,6 +904,25 @@
   return plane_size;
 }
 
+/* find the difference between the start of the plane and where the video
+ * data starts in the plane */
+gsize
+gst_gl_get_plane_start (GstVideoInfo * info, GstVideoAlignment * valign,
+    guint plane)
+{
+  gsize plane_start;
+  gint i;
+
+  /* find the start of the plane data including padding */
+  plane_start = 0;
+  for (i = 0; i < plane; i++) {
+    plane_start += gst_gl_get_plane_data_size (info, valign, i);
+  }
+
+  /* offset between the plane data start and where the video frame starts */
+  return (GST_VIDEO_INFO_PLANE_OFFSET (info, plane)) - plane_start;
+}
+
 GstCaps *
 gst_gl_caps_replace_all_caps_features (const GstCaps * caps,
     const gchar * feature_name)
diff --git a/gst-libs/gst/gl/gstglutils.h b/gst-libs/gst/gl/gstglutils.h
index ee606e0..3c8460b 100644
--- a/gst-libs/gst/gl/gstglutils.h
+++ b/gst-libs/gst/gl/gstglutils.h
@@ -106,6 +106,8 @@
     GstQuery * query, GstPadDirection direction);
 gsize gst_gl_get_plane_data_size (GstVideoInfo * info, GstVideoAlignment * align,
     guint plane);
+gsize gst_gl_get_plane_start (GstVideoInfo * info, GstVideoAlignment * valign,
+    guint plane);
 GstCaps * gst_gl_caps_replace_all_caps_features (const GstCaps * caps,
     const gchar * feature_name);
 
diff --git a/gst-libs/gst/gl/gstglviewconvert.c b/gst-libs/gst/gl/gstglviewconvert.c
index ebe4ed3..c2776cb 100644
--- a/gst-libs/gst/gl/gstglviewconvert.c
+++ b/gst-libs/gst/gl/gstglviewconvert.c
@@ -31,6 +31,7 @@
 #endif
 
 #include "gstglviewconvert.h"
+#include <gst/video/gstvideoaffinetransformationmeta.h>
 
 #define USING_OPENGL(context) (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL, 1, 0))
 #define USING_OPENGL3(context) (gst_gl_context_check_gl_version (context, GST_GL_API_OPENGL3, 3, 1))
@@ -39,8 +40,12 @@
 #define USING_GLES3(context) (gst_gl_context_check_gl_version (context, GST_GL_API_GLES2, 3, 0))
 
 static GstStaticCaps caps_template =
-GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
-    (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, "RGBA"));
+GST_STATIC_CAPS ("video/x-raw(" GST_CAPS_FEATURE_MEMORY_GL_MEMORY "), "
+    "format = (string) RGBA, "
+    "width = " GST_VIDEO_SIZE_RANGE ", "
+    "height = " GST_VIDEO_SIZE_RANGE ", "
+    "framerate = " GST_VIDEO_FPS_RANGE ", "
+    "texture-target = (string) { 2D, rectangle, external-oes } ");
 
 #define GST_CAT_DEFAULT gst_gl_view_convert_debug
 GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
@@ -140,6 +145,13 @@
       }
 };
 
+static gfloat identity_matrix[] = {
+  1.0f, 0.0f, 0.0f, 0.0f,
+  0.0f, 1.0f, 0.0f, 0.0f,
+  0.0f, 0.0f, 1.0f, 0.0f,
+  0.0f, 0.0f, 0.0f, 1.0f,
+};
+
 /* *INDENT-OFF* */
 static const gchar *fragment_source =
   "#ifdef GL_ES\n"
@@ -224,16 +236,6 @@
 static const gchar *frag_output_separated =
   "gl_FragData[0] = l;\n"
   "gl_FragData[1] = r;\n";
-
-static const gchar text_vertex_shader[] =
-  "attribute vec4 a_position;   \n"
-  "attribute vec2 a_texcoord;   \n"
-  "varying vec2 v_texcoord;     \n"
-  "void main()                  \n"
-  "{                            \n"
-  "   gl_Position = a_position; \n"
-  "   v_texcoord = a_texcoord;  \n"
-  "}                            \n";
 /* *INDENT-ON* */
 
 static const GLfloat vertices[] = {
@@ -348,8 +350,8 @@
     gst_gl_view_convert_reset (viewconvert);
 }
 
-gboolean
-gst_gl_view_convert_set_format (GstGLViewConvert * viewconvert,
+static gboolean
+_view_convert_set_format (GstGLViewConvert * viewconvert,
     GstVideoInfo * in_info, GstVideoInfo * out_info)
 {
   g_return_val_if_fail (GST_IS_GL_VIEW_CONVERT (viewconvert), FALSE);
@@ -419,7 +421,7 @@
   if (!gst_video_info_from_caps (&out_info, out_caps))
     return FALSE;
 
-  return gst_gl_view_convert_set_format (viewconvert, &in_info, &out_info);
+  return _view_convert_set_format (viewconvert, &in_info, &out_info);
 }
 
 /* Function that can halve the value
@@ -1003,12 +1005,11 @@
   return result;
 }
 
-
 GstCaps *
 gst_gl_view_convert_transform_caps (GstGLViewConvert * viewconvert,
     GstPadDirection direction, GstCaps * caps, GstCaps * filter)
 {
-  gint i;
+  gint i, n;
   GstCaps *base_caps = gst_static_caps_get (&caps_template);
   GstCaps *out_caps, *tmp_caps;
 
@@ -1083,10 +1084,104 @@
 out:
   gst_caps_unref (caps);
 
+  n = gst_caps_get_size (out_caps);
+  for (i = 0; i < n; i++) {
+    GstStructure *s = gst_caps_get_structure (out_caps, i);
+
+    gst_structure_remove_fields (s, "texture-target", NULL);
+  }
+
   GST_DEBUG_OBJECT (viewconvert, "Returning caps %" GST_PTR_FORMAT, out_caps);
   return out_caps;
 }
 
+static guint
+_get_target_bitmask_from_g_value (const GValue * targets)
+{
+  guint new_targets = 0;
+
+  if (targets == NULL) {
+    new_targets = 1 << GST_GL_TEXTURE_TARGET_2D;
+  } else if (G_TYPE_CHECK_VALUE_TYPE (targets, G_TYPE_STRING)) {
+    GstGLTextureTarget target;
+    const gchar *str;
+
+    str = g_value_get_string (targets);
+    target = gst_gl_texture_target_from_string (str);
+
+    if (target)
+      new_targets |= 1 << target;
+  } else if (G_TYPE_CHECK_VALUE_TYPE (targets, GST_TYPE_LIST)) {
+    gint j, m;
+
+    m = gst_value_list_get_size (targets);
+    for (j = 0; j < m; j++) {
+      const GValue *val = gst_value_list_get_value (targets, j);
+      GstGLTextureTarget target;
+      const gchar *str;
+
+      str = g_value_get_string (val);
+      target = gst_gl_texture_target_from_string (str);
+      if (target)
+        new_targets |= 1 << target;
+    }
+  }
+
+  return new_targets;
+}
+
+static GstCaps *
+_fixate_texture_target (GstGLViewConvert * viewconvert,
+    GstPadDirection direction, GstCaps * caps, GstCaps * other)
+{
+  GValue item = G_VALUE_INIT;
+  const GValue *targets, *other_targets;
+  guint targets_mask = 0, other_targets_mask = 0, result_mask;
+  GstStructure *s, *s_other;
+
+  other = gst_caps_make_writable (other);
+  s = gst_caps_get_structure (caps, 0);
+  s_other = gst_caps_get_structure (other, 0);
+
+  other_targets = gst_structure_get_value (s_other, "texture-target");
+  targets = gst_structure_get_value (s, "texture-target");
+
+  targets_mask = _get_target_bitmask_from_g_value (targets);
+  other_targets_mask = _get_target_bitmask_from_g_value (other_targets);
+
+  result_mask = targets_mask & other_targets_mask;
+  if (result_mask == 0) {
+    /* nothing we can do here */
+    return gst_caps_fixate (other);
+  }
+
+  if (direction == GST_PAD_SINK) {
+    result_mask &=
+        (1 << GST_GL_TEXTURE_TARGET_2D | 1 << GST_GL_TEXTURE_TARGET_RECTANGLE);
+  } else {
+    /* if the src caps has 2D support we can 'convert' to anything */
+    if (targets_mask & (1 << GST_GL_TEXTURE_TARGET_2D))
+      result_mask = -1;
+    else
+      result_mask = other_targets_mask;
+  }
+
+  g_value_init (&item, G_TYPE_STRING);
+  if (result_mask & (1 << GST_GL_TEXTURE_TARGET_2D)) {
+    g_value_set_static_string (&item, GST_GL_TEXTURE_TARGET_2D_STR);
+  } else if (result_mask & (1 << GST_GL_TEXTURE_TARGET_RECTANGLE)) {
+    g_value_set_static_string (&item, GST_GL_TEXTURE_TARGET_RECTANGLE_STR);
+  } else if (result_mask & (1 << GST_GL_TEXTURE_TARGET_EXTERNAL_OES)) {
+    g_value_set_static_string (&item, GST_GL_TEXTURE_TARGET_EXTERNAL_OES_STR);
+  }
+
+  gst_structure_set_value (s, "texture-target", &item);
+
+  g_value_unset (&item);
+
+  return gst_caps_fixate (other);
+}
+
 GstCaps *
 gst_gl_view_convert_fixate_caps (GstGLViewConvert * viewconvert,
     GstPadDirection direction, GstCaps * caps, GstCaps * othercaps)
@@ -1158,6 +1253,10 @@
     }
   }
 
+  tmp = _fixate_texture_target (viewconvert, direction, caps, othercaps);
+  gst_caps_unref (othercaps);
+  othercaps = tmp;
+
 done:
   GST_DEBUG_OBJECT (viewconvert, "dir %s fixated to %" GST_PTR_FORMAT
       " against caps %" GST_PTR_FORMAT,
@@ -1255,6 +1354,7 @@
   guint out_width, out_height;
   GLuint fake_texture = 0;      /* a FBO must hava texture to init */
   GLenum internal_format;
+  gboolean ret = TRUE;
 
   gl = viewconvert->context->gl_vtable;
   out_width = GST_VIDEO_INFO_WIDTH (&viewconvert->out_info);
@@ -1310,14 +1410,111 @@
   if (!gst_gl_context_check_framebuffer_status (viewconvert->context)) {
     gst_gl_context_set_error (viewconvert->context,
         "GL framebuffer status incomplete");
-    gl->DeleteTextures (1, &fake_texture);
-    return FALSE;
+    ret = FALSE;
   }
 
   /* unbind the FBO */
+  gl->BindTexture (GL_TEXTURE_2D, 0);
   gl->BindFramebuffer (GL_FRAMEBUFFER, 0);
   gl->DeleteTextures (1, &fake_texture);
-  return TRUE;
+  return ret;
+}
+
+static gchar *
+_mangle_texture_access (const gchar * str, GstGLTextureTarget from,
+    GstGLTextureTarget to)
+{
+  const gchar *from_str = NULL, *to_str = NULL;
+  gchar *ret, *tmp;
+  gchar *regex_find;
+  GRegex *regex;
+
+  if (from == GST_GL_TEXTURE_TARGET_2D)
+    from_str = "texture2D";
+  if (from == GST_GL_TEXTURE_TARGET_RECTANGLE)
+    from_str = "texture2DRect";
+  if (from == GST_GL_TEXTURE_TARGET_EXTERNAL_OES)
+    from_str = "texture2D";
+
+  if (to == GST_GL_TEXTURE_TARGET_2D)
+    to_str = "texture2D";
+  if (to == GST_GL_TEXTURE_TARGET_RECTANGLE)
+    to_str = "texture2DRect";
+  if (to == GST_GL_TEXTURE_TARGET_EXTERNAL_OES)
+    to_str = "texture2D";
+
+  /* followed by any amount of whitespace then a bracket */
+  regex_find = g_strdup_printf ("%s(?=\\s*\\()", from_str);
+  regex = g_regex_new (regex_find, 0, 0, NULL);
+  tmp = g_regex_replace_literal (regex, str, -1, 0, to_str, 0, NULL);
+  g_free (regex_find);
+  g_regex_unref (regex);
+
+  if (tmp) {
+    ret = tmp;
+  } else {
+    GST_FIXME ("Couldn't mangle texture access successfully from %s to %s",
+        from_str, to_str);
+    ret = g_strdup (str);
+  }
+
+  return ret;
+}
+
+static gchar *
+_mangle_sampler_type (const gchar * str, GstGLTextureTarget from,
+    GstGLTextureTarget to)
+{
+  const gchar *from_str = NULL, *to_str = NULL;
+  gchar *ret, *tmp;
+  gchar *regex_find;
+  GRegex *regex;
+
+  if (from == GST_GL_TEXTURE_TARGET_2D)
+    from_str = "sampler2D";
+  if (from == GST_GL_TEXTURE_TARGET_RECTANGLE)
+    from_str = "sampler2DRect";
+  if (from == GST_GL_TEXTURE_TARGET_EXTERNAL_OES)
+    from_str = "samplerExternalOES";
+
+  if (to == GST_GL_TEXTURE_TARGET_2D)
+    to_str = "sampler2D";
+  if (to == GST_GL_TEXTURE_TARGET_RECTANGLE)
+    to_str = "sampler2DRect";
+  if (to == GST_GL_TEXTURE_TARGET_EXTERNAL_OES)
+    to_str = "samplerExternalOES";
+
+  /* followed by some whitespace  */
+  regex_find = g_strdup_printf ("%s(?=\\s)", from_str);
+  regex = g_regex_new (regex_find, 0, 0, NULL);
+  tmp = g_regex_replace_literal (regex, str, -1, 0, to_str, 0, NULL);
+  g_free (regex_find);
+  g_regex_unref (regex);
+
+  if (tmp) {
+    ret = tmp;
+  } else {
+    GST_FIXME ("Couldn't mangle sampler type successfully from %s to %s",
+        from_str, to_str);
+    ret = g_strdup (str);
+  }
+
+  return ret;
+}
+
+static gchar *
+_mangle_extensions (const gchar * str, GstGLTextureTarget from)
+{
+  const gchar *ext_str = NULL;
+
+  if (from == GST_GL_TEXTURE_TARGET_EXTERNAL_OES)
+    ext_str = "#extension GL_OES_EGL_image_external : require\n";
+
+  if (ext_str) {
+    return g_strdup_printf ("%s%s", ext_str, str);
+  } else {
+    return g_strdup (str);
+  }
 }
 
 /* free after use */
@@ -1327,6 +1524,8 @@
 {
   const gchar *input_str, *output_str;
   gboolean mono_input = FALSE;
+  gchar *tmp, *tmp2;
+
   switch (in_mode) {
     case GST_VIDEO_MULTIVIEW_MODE_NONE:
     case GST_VIDEO_MULTIVIEW_MODE_MONO:
@@ -1377,7 +1576,17 @@
       break;
   }
 
-  return g_strdup_printf (fragment_source, input_str, output_str);
+  tmp = g_strdup_printf (fragment_source, input_str, output_str);
+  tmp2 = _mangle_sampler_type (tmp, GST_GL_TEXTURE_TARGET_2D,
+      viewconvert->from_texture_target);
+  g_free (tmp);
+  tmp = _mangle_texture_access (tmp2, GST_GL_TEXTURE_TARGET_2D,
+      viewconvert->from_texture_target);
+  g_free (tmp2);
+  tmp2 = _mangle_extensions (tmp, viewconvert->from_texture_target);
+  g_free (tmp);
+
+  return tmp2;
 }
 
 static void
@@ -1449,6 +1658,17 @@
         "Cannot perform multiview conversion without OpenGL shaders");
     goto error;
   }
+
+  if (out_mode == GST_VIDEO_MULTIVIEW_MODE_SEPARATED
+      || out_mode == GST_VIDEO_MULTIVIEW_MODE_FRAME_BY_FRAME) {
+    if (!gl->DrawBuffers) {
+      GST_ERROR_OBJECT (viewconvert,
+          "Separate texture output mode requested however the current "
+          "OpenGL API does not support drawing to multiple buffers");
+      goto error;
+    }
+  }
+
   if ((in_flags & GST_VIDEO_MULTIVIEW_FLAGS_RIGHT_VIEW_FIRST) ==
       (out_flags & GST_VIDEO_MULTIVIEW_FLAGS_RIGHT_VIEW_FIRST)) {
     l_index = 0;
@@ -1517,8 +1737,9 @@
       offsets[0][0], offsets[0][1], offsets[1][0], offsets[1][1]);
   fragment_source_str = _get_shader_string (viewconvert, in_mode, out_mode);
 // g_print ("%s\n", fragment_source_str);
-  res = gst_gl_context_gen_shader (viewconvert->context, text_vertex_shader,
-      fragment_source_str, &viewconvert->shader);
+  res = gst_gl_context_gen_shader (viewconvert->context,
+      gst_gl_shader_string_vertex_mat4_texture_transform, fragment_source_str,
+      &viewconvert->shader);
   g_free (fragment_source_str);
   if (!res)
     goto error;
@@ -1536,6 +1757,8 @@
       GST_VIDEO_INFO_HEIGHT (&viewconvert->out_info));
   gst_gl_shader_set_uniform_matrix_3fv (viewconvert->shader, "downmix",
       2, FALSE, &downmix_matrices[viewconvert->downmix_mode][0][0]);
+  gst_gl_shader_set_uniform_matrix_4fv (viewconvert->shader, "u_transformation",
+      1, FALSE, identity_matrix);
   if (in_mode == GST_VIDEO_MULTIVIEW_MODE_SEPARATED ||
       in_mode == GST_VIDEO_MULTIVIEW_MODE_FRAME_BY_FRAME) {
     gst_gl_shader_set_uniform_1i (viewconvert->shader, "tex_l", l_index);
@@ -1572,7 +1795,6 @@
     gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0);
   }
 
-  gl->BindTexture (GL_TEXTURE_2D, 0);
   viewconvert->initted = TRUE;
   return TRUE;
 error:
@@ -1594,6 +1816,9 @@
   };
   GstVideoMultiviewMode in_mode = priv->input_mode;
   GstVideoMultiviewMode out_mode = priv->output_mode;
+  guint from_gl_target =
+      gst_gl_texture_target_to_gl (viewconvert->from_texture_target);
+  GstVideoAffineTransformationMeta *af_meta;
 
   gl = context->gl_vtable;
   out_width = GST_VIDEO_INFO_WIDTH (&viewconvert->out_info);
@@ -1605,12 +1830,22 @@
   } else {
     out_views = 1;
   }
+
+  /* FIXME: the auxillary buffer could have a different transform matrix */
+  af_meta = gst_buffer_get_video_affine_transformation_meta (priv->primary_in);
+  if (af_meta)
+    gst_gl_shader_set_uniform_matrix_4fv (viewconvert->shader,
+        "u_transformation", 1, FALSE, af_meta->matrix);
+
   /* attach the texture to the FBO to renderer to */
   for (i = 0; i < out_views; i++) {
+    guint gl_target =
+        gst_gl_texture_target_to_gl (viewconvert->to_texture_target);
+
     /* needed? */
-    gl->BindTexture (GL_TEXTURE_2D, priv->out_tex[i]->tex_id);
+    gl->BindTexture (gl_target, priv->out_tex[i]->tex_id);
     gl->FramebufferTexture2D (GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0 + i,
-        GL_TEXTURE_2D, priv->out_tex[i]->tex_id, 0);
+        gl_target, priv->out_tex[i]->tex_id, 0);
   }
 
   if (gl->DrawBuffers)
@@ -1632,11 +1867,11 @@
       return FALSE;
     }
     gl->ActiveTexture (GL_TEXTURE1);
-    gl->BindTexture (GL_TEXTURE_2D, priv->in_tex[1]->tex_id);
+    gl->BindTexture (from_gl_target, priv->in_tex[1]->tex_id);
   }
 
   gl->ActiveTexture (GL_TEXTURE0);
-  gl->BindTexture (GL_TEXTURE_2D, priv->in_tex[0]->tex_id);
+  gl->BindTexture (from_gl_target, priv->in_tex[0]->tex_id);
   gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, NULL);
   if (gl->BindVertexArray)
     gl->BindVertexArray (0);
@@ -1656,11 +1891,27 @@
 static gboolean
 _gen_buffer (GstGLViewConvert * viewconvert, GstBuffer ** target)
 {
+  GstGLVideoAllocationParams *params;
+  GstGLMemoryAllocator *mem_allocator;
+  GstAllocator *allocator;
+
   *target = gst_buffer_new ();
-  if (!gst_gl_memory_setup_buffer (viewconvert->context, NULL,
-          &viewconvert->out_info, NULL, *target)) {
+
+  allocator =
+      GST_ALLOCATOR (gst_gl_memory_allocator_get_default
+      (viewconvert->context));
+  mem_allocator = GST_GL_MEMORY_ALLOCATOR (allocator);
+  params = gst_gl_video_allocation_params_new (viewconvert->context, NULL,
+      &viewconvert->out_info, 0, NULL, viewconvert->to_texture_target);
+
+  if (!gst_gl_memory_setup_buffer (mem_allocator, *target, params)) {
+    gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
+    gst_object_unref (allocator);
     return FALSE;
   }
+  gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
+  gst_object_unref (allocator);
+
   gst_buffer_add_video_meta_full (*target, 0,
       GST_VIDEO_INFO_FORMAT (&viewconvert->out_info),
       GST_VIDEO_INFO_WIDTH (&viewconvert->out_info),
@@ -1779,10 +2030,28 @@
       /* Luminance formats are not color renderable */
       /* renderering to a framebuffer only renders the intersection of all
        * the attachments i.e. the smallest attachment size */
-      if (!priv->out_tex[j])
+      if (!priv->out_tex[j]) {
+        GstGLVideoAllocationParams *params;
+        GstGLBaseMemoryAllocator *base_mem_allocator;
+        GstAllocator *allocator;
+        GstVideoInfo temp_info;
+
+        gst_video_info_set_format (&temp_info, GST_VIDEO_FORMAT_RGBA, out_width,
+            out_height);
+
+        allocator =
+            GST_ALLOCATOR (gst_gl_memory_allocator_get_default (context));
+        base_mem_allocator = GST_GL_BASE_MEMORY_ALLOCATOR (allocator);
+        params = gst_gl_video_allocation_params_new (context, NULL, &temp_info,
+            0, NULL, viewconvert->to_texture_target);
+
         priv->out_tex[j] =
-            (GstGLMemory *) gst_gl_memory_alloc (context, NULL, &temp_info, 0,
-            NULL);
+            (GstGLMemory *) gst_gl_base_memory_alloc (base_mem_allocator,
+            (GstGLAllocationParams *) params);
+
+        gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
+        gst_object_unref (allocator);
+      }
     } else {
       priv->out_tex[j] = out_tex;
     }
@@ -1833,9 +2102,8 @@
         res = FALSE;
         continue;
       }
-      gst_gl_memory_copy_into_texture (priv->out_tex[j],
-          out_tex->tex_id, out_tex->tex_type, width, height,
-          GST_VIDEO_INFO_PLANE_STRIDE (&out_tex->info, out_tex->plane), FALSE);
+      gst_gl_memory_copy_into (priv->out_tex[j], out_tex->tex_id,
+          viewconvert->to_texture_target, out_tex->tex_type, width, height);
       gst_memory_unmap ((GstMemory *) out_tex, &to_info);
     }
 
@@ -1899,7 +2167,7 @@
   GstVideoMultiviewFlags in_flags, out_flags;
 
   g_return_val_if_fail (GST_IS_GL_VIEW_CONVERT (viewconvert), GST_FLOW_ERROR);
-  g_return_val_if_fail (GST_GL_IS_CONTEXT (viewconvert->context),
+  g_return_val_if_fail (GST_IS_GL_CONTEXT (viewconvert->context),
       GST_FLOW_ERROR);
 
   GST_OBJECT_LOCK (viewconvert);
@@ -1974,11 +2242,13 @@
   }
 
   outbuf = priv->primary_out;
-  gst_buffer_copy_into (outbuf, priv->primary_in,
-      GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS, 0, -1);
-  GST_BUFFER_FLAG_SET (outbuf,
-      GST_VIDEO_BUFFER_FLAG_FIRST_IN_BUNDLE |
-      GST_VIDEO_BUFFER_FLAG_MULTIPLE_VIEW);
+  if (outbuf) {
+    gst_buffer_copy_into (outbuf, priv->primary_in,
+        GST_BUFFER_COPY_FLAGS | GST_BUFFER_COPY_TIMESTAMPS, 0, -1);
+    GST_BUFFER_FLAG_SET (outbuf,
+        GST_VIDEO_BUFFER_FLAG_FIRST_IN_BUNDLE |
+        GST_VIDEO_BUFFER_FLAG_MULTIPLE_VIEW);
+  }
 
   if (priv->auxilliary_out) {
     gst_buffer_copy_into (priv->auxilliary_out,
diff --git a/gst-libs/gst/gl/gstglviewconvert.h b/gst-libs/gst/gl/gstglviewconvert.h
index 26a6df9..dda2eef 100644
--- a/gst-libs/gst/gl/gstglviewconvert.h
+++ b/gst-libs/gst/gl/gstglviewconvert.h
@@ -61,6 +61,9 @@
   GstVideoInfo in_info;
   GstVideoInfo out_info;
 
+  GstGLTextureTarget from_texture_target;
+  GstGLTextureTarget to_texture_target;
+
   gboolean initted;
   gboolean reconfigure;
 
@@ -78,8 +81,6 @@
 GType gst_gl_view_convert_get_type (void);
 GstGLViewConvert * gst_gl_view_convert_new (void);
 
-gboolean gst_gl_view_convert_set_format (GstGLViewConvert *viewconvert, GstVideoInfo *in_info,
-    GstVideoInfo *out_info);
 gboolean  gst_gl_view_convert_set_caps (GstGLViewConvert * viewconvert, GstCaps * in_caps, GstCaps * out_caps);
 GstCaps * gst_gl_view_convert_transform_caps (GstGLViewConvert * viewconvert,
     GstPadDirection direction, GstCaps * caps, GstCaps * filter);
diff --git a/gst-libs/gst/gl/gstglwindow.c b/gst-libs/gst/gl/gstglwindow.c
index 4f27cd0..b5175f9 100644
--- a/gst-libs/gst/gl/gstglwindow.c
+++ b/gst-libs/gst/gl/gstglwindow.c
@@ -85,21 +85,23 @@
 static void gst_gl_window_default_send_message_async (GstGLWindow * window,
     GstGLWindowCB callback, gpointer data, GDestroyNotify destroy);
 static gpointer gst_gl_window_navigation_thread (GstGLWindow * window);
-void gst_gl_window_run_navigation (GstGLWindow * window);
-void gst_gl_window_open_navigation (GstGLWindow * window);
-void gst_gl_window_close_navigation (GstGLWindow * window);
-void gst_gl_window_quit_navigation (GstGLWindow * window);
 
 struct _GstGLWindowPrivate
 {
   GMainContext *main_context;
   GMainLoop *loop;
-  GThread *navigation_thread;
 
   guint surface_width;
   guint surface_height;
 
   gboolean alive;
+
+  GThread *navigation_thread;
+  GMainContext *navigation_context;
+  GMainLoop *navigation_loop;
+  GMutex nav_lock;
+  GCond nav_create_cond;
+  gboolean nav_alive;
 };
 
 static void gst_gl_window_finalize (GObject * object);
@@ -187,13 +189,12 @@
   window->priv = priv;
 
   g_mutex_init (&window->lock);
-  g_mutex_init (&window->nav_lock);
-  g_cond_init (&window->nav_create_cond);
-  g_cond_init (&window->nav_destroy_cond);
-  window->nav_created = FALSE;
-  window->nav_alive = FALSE;
   window->is_drawing = FALSE;
 
+  g_mutex_init (&window->priv->nav_lock);
+  g_cond_init (&window->priv->nav_create_cond);
+  window->priv->nav_alive = FALSE;
+
   g_weak_ref_init (&window->context_ref, NULL);
 
   priv->main_context = g_main_context_new ();
@@ -209,7 +210,6 @@
   klass->close = GST_DEBUG_FUNCPTR (gst_gl_window_default_close);
   klass->run = GST_DEBUG_FUNCPTR (gst_gl_window_default_run);
   klass->quit = GST_DEBUG_FUNCPTR (gst_gl_window_default_quit);
-  klass->draw_unlocked = GST_DEBUG_FUNCPTR (gst_gl_window_default_draw);
   klass->draw = GST_DEBUG_FUNCPTR (gst_gl_window_default_draw);
   klass->send_message = GST_DEBUG_FUNCPTR (gst_gl_window_default_send_message);
   klass->send_message_async =
@@ -311,16 +311,13 @@
 
   window->display = gst_object_ref (display);
 
-  g_mutex_lock (&window->nav_lock);
+  g_mutex_lock (&window->priv->nav_lock);
+  window->priv->navigation_thread = g_thread_new ("gstglnavigation",
+      (GThreadFunc) gst_gl_window_navigation_thread, window);
 
-  if (!window->nav_created) {
-    window->priv->navigation_thread = g_thread_new ("gstglnavigation",
-        (GThreadFunc) gst_gl_window_navigation_thread, window);
-
-    g_cond_wait (&window->nav_create_cond, &window->nav_lock);
-    window->nav_created = TRUE;
-  }
-  g_mutex_unlock (&window->nav_lock);
+  while (!window->priv->nav_alive)
+    g_cond_wait (&window->priv->nav_create_cond, &window->priv->nav_lock);
+  g_mutex_unlock (&window->priv->nav_lock);
 
   return window;
 }
@@ -331,15 +328,11 @@
   GstGLWindow *window = GST_GL_WINDOW (object);
   GstGLWindowPrivate *priv = window->priv;
 
-  if (window->nav_alive) {
-    g_mutex_lock (&window->nav_lock);
-    GST_INFO ("send quit navigation loop");
-    gst_gl_window_quit_navigation (window);
-    while (window->nav_alive) {
-      g_cond_wait (&window->nav_destroy_cond, &window->nav_lock);
-    }
-    g_mutex_unlock (&window->nav_lock);
-  }
+  GST_INFO ("quit navigation loop");
+  g_main_loop_quit (window->priv->navigation_loop);
+  /* wait until navigation thread finished */
+  g_thread_join (window->priv->navigation_thread);
+  window->priv->navigation_thread = NULL;
 
   if (priv->loop)
     g_main_loop_unref (priv->loop);
@@ -350,9 +343,8 @@
   g_weak_ref_clear (&window->context_ref);
 
   g_mutex_clear (&window->lock);
-  g_mutex_clear (&window->nav_lock);
-  g_cond_clear (&window->nav_create_cond);
-  g_cond_clear (&window->nav_destroy_cond);
+  g_mutex_clear (&window->priv->nav_lock);
+  g_cond_clear (&window->priv->nav_create_cond);
   gst_object_unref (window->display);
 
   G_OBJECT_CLASS (gst_gl_window_parent_class)->finalize (object);
@@ -416,7 +408,7 @@
   GstGLWindowClass *window_class;
   GstSetWindowHandleCb *data;
 
-  g_return_if_fail (GST_GL_IS_WINDOW (window));
+  g_return_if_fail (GST_IS_GL_WINDOW (window));
   g_return_if_fail (handle != 0);
   window_class = GST_GL_WINDOW_GET_CLASS (window);
   g_return_if_fail (window_class->set_window_handle != NULL);
@@ -462,29 +454,6 @@
   gst_gl_window_send_message (window, (GstGLWindowCB) draw_cb, window);
 }
 
-
-/**
- * gst_gl_window_draw_unlocked:
- * @window: a #GstGLWindow
- *
- * Redraw the window contents.  Implementations should invoke the draw callback.
- *
- * Since: 1.4
- */
-void
-gst_gl_window_draw_unlocked (GstGLWindow * window)
-{
-  GstGLWindowClass *window_class;
-
-  g_return_if_fail (GST_GL_IS_WINDOW (window));
-  window_class = GST_GL_WINDOW_GET_CLASS (window);
-  g_return_if_fail (window_class->draw_unlocked != NULL);
-
-  window_class->draw_unlocked (window);
-
-  window->queue_resize = FALSE;
-}
-
 /**
  * gst_gl_window_draw:
  * @window: a #GstGLWindow
@@ -498,7 +467,7 @@
 {
   GstGLWindowClass *window_class;
 
-  g_return_if_fail (GST_GL_IS_WINDOW (window));
+  g_return_if_fail (GST_IS_GL_WINDOW (window));
   window_class = GST_GL_WINDOW_GET_CLASS (window);
   g_return_if_fail (window_class->draw != NULL);
 
@@ -528,7 +497,7 @@
 {
   GstGLWindowClass *window_class;
 
-  g_return_if_fail (GST_GL_IS_WINDOW (window));
+  g_return_if_fail (GST_IS_GL_WINDOW (window));
   window_class = GST_GL_WINDOW_GET_CLASS (window);
 
   if (window_class->set_preferred_size)
@@ -548,7 +517,7 @@
 {
   GstGLWindowClass *window_class;
 
-  g_return_if_fail (GST_GL_IS_WINDOW (window));
+  g_return_if_fail (GST_IS_GL_WINDOW (window));
   window_class = GST_GL_WINDOW_GET_CLASS (window);
 
   if (window_class->show)
@@ -574,7 +543,7 @@
 {
   GstGLWindowClass *window_class;
 
-  g_return_if_fail (GST_GL_IS_WINDOW (window));
+  g_return_if_fail (GST_IS_GL_WINDOW (window));
   window_class = GST_GL_WINDOW_GET_CLASS (window);
   g_return_if_fail (window_class->run != NULL);
 
@@ -582,23 +551,6 @@
   window_class->run (window);
 }
 
-/**
- * gst_gl_window_run_navigation:
- * @window: a #GstGLWindow
- *
- * Start the execution of the navigation runloop.
- *
- * Since: 1.6
- */
-void
-gst_gl_window_run_navigation (GstGLWindow * window)
-{
-  g_return_if_fail (GST_GL_IS_WINDOW (window));
-  g_return_if_fail (window->navigation_context != NULL);
-  g_return_if_fail (window->navigation_loop != NULL);
-  g_main_loop_run (window->navigation_loop);
-}
-
 static void
 gst_gl_window_default_quit (GstGLWindow * window)
 {
@@ -618,7 +570,7 @@
 {
   GstGLWindowClass *window_class;
 
-  g_return_if_fail (GST_GL_IS_WINDOW (window));
+  g_return_if_fail (GST_IS_GL_WINDOW (window));
   window_class = GST_GL_WINDOW_GET_CLASS (window);
   g_return_if_fail (window_class->quit != NULL);
 
@@ -699,7 +651,7 @@
 {
   GstGLWindowClass *window_class;
 
-  g_return_if_fail (GST_GL_IS_WINDOW (window));
+  g_return_if_fail (GST_IS_GL_WINDOW (window));
   g_return_if_fail (callback != NULL);
   window_class = GST_GL_WINDOW_GET_CLASS (window);
   g_return_if_fail (window_class->send_message != NULL);
@@ -761,7 +713,7 @@
 {
   GstGLWindowClass *window_class;
 
-  g_return_if_fail (GST_GL_IS_WINDOW (window));
+  g_return_if_fail (GST_IS_GL_WINDOW (window));
   g_return_if_fail (callback != NULL);
   window_class = GST_GL_WINDOW_GET_CLASS (window);
   g_return_if_fail (window_class->send_message_async != NULL);
@@ -784,7 +736,7 @@
 gst_gl_window_set_draw_callback (GstGLWindow * window, GstGLWindowCB callback,
     gpointer data, GDestroyNotify destroy_notify)
 {
-  g_return_if_fail (GST_GL_IS_WINDOW (window));
+  g_return_if_fail (GST_IS_GL_WINDOW (window));
 
   GST_GL_WINDOW_LOCK (window);
 
@@ -813,7 +765,7 @@
 gst_gl_window_set_resize_callback (GstGLWindow * window,
     GstGLWindowResizeCB callback, gpointer data, GDestroyNotify destroy_notify)
 {
-  g_return_if_fail (GST_GL_IS_WINDOW (window));
+  g_return_if_fail (GST_IS_GL_WINDOW (window));
 
   GST_GL_WINDOW_LOCK (window);
 
@@ -842,7 +794,7 @@
 gst_gl_window_set_close_callback (GstGLWindow * window, GstGLWindowCB callback,
     gpointer data, GDestroyNotify destroy_notify)
 {
-  g_return_if_fail (GST_GL_IS_WINDOW (window));
+  g_return_if_fail (GST_IS_GL_WINDOW (window));
 
   GST_GL_WINDOW_LOCK (window);
 
@@ -885,7 +837,7 @@
 {
   GstGLWindowClass *window_class;
 
-  g_return_val_if_fail (GST_GL_IS_WINDOW (window), 0);
+  g_return_val_if_fail (GST_IS_GL_WINDOW (window), 0);
   window_class = GST_GL_WINDOW_GET_CLASS (window);
   g_return_val_if_fail (window_class->get_display != NULL, 0);
 
@@ -905,7 +857,7 @@
 {
   GstGLWindowClass *window_class;
 
-  g_return_val_if_fail (GST_GL_IS_WINDOW (window), 0);
+  g_return_val_if_fail (GST_IS_GL_WINDOW (window), 0);
   window_class = GST_GL_WINDOW_GET_CLASS (window);
   g_return_val_if_fail (window_class->get_window_handle != NULL, 0);
 
@@ -923,7 +875,7 @@
 GstGLContext *
 gst_gl_window_get_context (GstGLWindow * window)
 {
-  g_return_val_if_fail (GST_GL_IS_WINDOW (window), NULL);
+  g_return_val_if_fail (GST_IS_GL_WINDOW (window), NULL);
 
   return (GstGLContext *) g_weak_ref_get (&window->context_ref);
 }
@@ -950,50 +902,47 @@
 
 G_DEFINE_TYPE (GstGLDummyWindow, gst_gl_dummy_window, GST_GL_TYPE_WINDOW);
 
-void
-gst_gl_window_open_navigation (GstGLWindow * window)
+static gboolean
+gst_gl_window_navigation_started (gpointer data)
 {
-  g_return_if_fail (GST_GL_IS_WINDOW (window));
-  g_mutex_lock (&window->nav_lock);
-  window->navigation_context = g_main_context_new ();
-  window->navigation_loop = g_main_loop_new (window->navigation_context, FALSE);
-  g_main_context_push_thread_default (window->navigation_context);
-  window->nav_alive = TRUE;
-  g_cond_signal (&window->nav_create_cond);
-  g_mutex_unlock (&window->nav_lock);
-}
+  GstGLWindow *window = data;
 
-void
-gst_gl_window_close_navigation (GstGLWindow * window)
-{
-  g_return_if_fail (GST_GL_IS_WINDOW (window));
-  g_return_if_fail (window->navigation_context != NULL);
-  g_return_if_fail (window->navigation_loop != NULL);
+  g_mutex_lock (&window->priv->nav_lock);
+  window->priv->nav_alive = TRUE;
+  g_cond_signal (&window->priv->nav_create_cond);
+  g_mutex_unlock (&window->priv->nav_lock);
 
-  g_mutex_lock (&window->nav_lock);
-  window->nav_alive = FALSE;
-  g_main_context_pop_thread_default (window->navigation_context);
-  g_main_loop_unref (window->navigation_loop);
-  g_main_context_unref (window->navigation_context);
-  g_cond_signal (&window->nav_destroy_cond);
-  g_mutex_unlock (&window->nav_lock);
-}
-
-void
-gst_gl_window_quit_navigation (GstGLWindow * window)
-{
-  g_return_if_fail (GST_GL_IS_WINDOW (window));
-
-  g_main_loop_quit (window->navigation_loop);
+  return G_SOURCE_REMOVE;
 }
 
 static gpointer
 gst_gl_window_navigation_thread (GstGLWindow * window)
 {
-  gst_gl_window_open_navigation (window);
-  gst_gl_window_run_navigation (window);
+  GSource *source;
+
+  g_return_val_if_fail (GST_IS_GL_WINDOW (window), NULL);
+
+  window->priv->navigation_context = g_main_context_new ();
+  window->priv->navigation_loop =
+      g_main_loop_new (window->priv->navigation_context, FALSE);
+  g_main_context_push_thread_default (window->priv->navigation_context);
+
+  source = g_idle_source_new ();
+  g_source_set_callback (source, (GSourceFunc) gst_gl_window_navigation_started,
+      window, NULL);
+  g_source_attach (source, window->priv->navigation_context);
+  g_source_unref (source);
+
+  g_main_loop_run (window->priv->navigation_loop);
+
+  g_main_context_pop_thread_default (window->priv->navigation_context);
+
+  g_main_loop_unref (window->priv->navigation_loop);
+  g_main_context_unref (window->priv->navigation_context);
+  window->priv->navigation_loop = NULL;
+  window->priv->navigation_context = NULL;
+
   GST_INFO ("navigation loop exited\n");
-  gst_gl_window_close_navigation (window);
 
   return NULL;
 }
@@ -1045,20 +994,6 @@
   return g_object_new (gst_gl_dummy_window_get_type (), NULL);
 }
 
-gboolean
-gst_gl_window_key_event_cb (gpointer data)
-{
-  struct key_event *key_data = (struct key_event *) data;
-  GST_DEBUG
-      ("%s called data struct %p window %p key %s event %s ",
-      __func__, key_data, key_data->window, key_data->key_str,
-      key_data->event_type);
-  gst_gl_window_send_key_event (GST_GL_WINDOW (key_data->window),
-      key_data->event_type, key_data->key_str);
-  g_slice_free (struct key_event, key_data);
-  return G_SOURCE_REMOVE;
-}
-
 void
 gst_gl_window_send_key_event (GstGLWindow * window, const char *event_type,
     const char *key_str)
@@ -1067,21 +1002,45 @@
       event_type, key_str);
 }
 
-gboolean
-gst_gl_window_mouse_event_cb (gpointer data)
+typedef struct
 {
-  struct mouse_event *mouse_data = (struct mouse_event *) data;
-  GST_DEBUG ("%s called data struct %p mouse event %s button %d at %g, %g",
-      __func__, mouse_data, mouse_data->event_type, mouse_data->button,
-      mouse_data->posx, mouse_data->posy);
-  gst_gl_window_send_mouse_event (GST_GL_WINDOW (mouse_data->window),
-      mouse_data->event_type, mouse_data->button, mouse_data->posx,
-      mouse_data->posy);
-  g_slice_free (struct mouse_event, mouse_data);
+  GstGLWindow *window;
+  const char *event_type;
+  const char *key_str;
+} KeyEventData;
+
+static gboolean
+gst_gl_window_key_event_cb (gpointer data)
+{
+  KeyEventData *key_data = data;
+
+  GST_DEBUG
+      ("%s called data struct %p window %p key %s event %s ",
+      __func__, key_data, key_data->window, key_data->key_str,
+      key_data->event_type);
+
+  gst_gl_window_send_key_event (GST_GL_WINDOW (key_data->window),
+      key_data->event_type, key_data->key_str);
+
   return G_SOURCE_REMOVE;
 }
 
 void
+gst_gl_window_send_key_event_async (GstGLWindow * window,
+    const char *event_type, const char *key_str)
+{
+  KeyEventData *key_data = g_new0 (KeyEventData, 1);
+
+  key_data->window = window;
+  key_data->key_str = key_str;
+  key_data->event_type = event_type;
+
+  g_main_context_invoke_full (window->priv->navigation_context,
+      G_PRIORITY_DEFAULT, (GSourceFunc) gst_gl_window_key_event_cb, key_data,
+      (GDestroyNotify) g_free);
+}
+
+void
 gst_gl_window_send_mouse_event (GstGLWindow * window, const char *event_type,
     int button, double posx, double posy)
 {
@@ -1089,6 +1048,48 @@
       event_type, button, posx, posy);
 }
 
+typedef struct
+{
+  GstGLWindow *window;
+  const char *event_type;
+  int button;
+  double posx;
+  double posy;
+} MouseEventData;
+
+static gboolean
+gst_gl_window_mouse_event_cb (gpointer data)
+{
+  MouseEventData *mouse_data = data;
+
+  GST_DEBUG ("%s called data struct %p mouse event %s button %d at %g, %g",
+      __func__, mouse_data, mouse_data->event_type, mouse_data->button,
+      mouse_data->posx, mouse_data->posy);
+
+  gst_gl_window_send_mouse_event (GST_GL_WINDOW (mouse_data->window),
+      mouse_data->event_type, mouse_data->button, mouse_data->posx,
+      mouse_data->posy);
+
+  return G_SOURCE_REMOVE;
+}
+
+void
+gst_gl_window_send_mouse_event_async (GstGLWindow * window,
+    const char *event_type, int button, double posx, double posy)
+{
+  MouseEventData *mouse_data = g_new0 (MouseEventData, 1);
+
+  mouse_data->window = window;
+  mouse_data->event_type = event_type;
+  mouse_data->button = button;
+  mouse_data->posx = posx;
+  mouse_data->posy = posy;
+
+  g_main_context_invoke_full (window->priv->navigation_context,
+      G_PRIORITY_DEFAULT, (GSourceFunc) gst_gl_window_mouse_event_cb,
+      mouse_data, (GDestroyNotify) g_free);
+}
+
 /**
  * gst_gl_window_handle_events:
  * @window: a #GstGLWindow
@@ -1105,7 +1106,7 @@
 {
   GstGLWindowClass *window_class;
 
-  g_return_if_fail (GST_GL_IS_WINDOW (window));
+  g_return_if_fail (GST_IS_GL_WINDOW (window));
   window_class = GST_GL_WINDOW_GET_CLASS (window);
 
   if (window_class->handle_events)
@@ -1132,7 +1133,7 @@
   GstGLWindowClass *window_class;
   gboolean ret = FALSE;
 
-  g_return_val_if_fail (GST_GL_IS_WINDOW (window), FALSE);
+  g_return_val_if_fail (GST_IS_GL_WINDOW (window), FALSE);
   window_class = GST_GL_WINDOW_GET_CLASS (window);
 
   if (x < 0 || y < 0 || width <= 0 || height <= 0)
@@ -1149,7 +1150,7 @@
 {
   GstGLWindowClass *window_class;
 
-  g_return_if_fail (GST_GL_IS_WINDOW (window));
+  g_return_if_fail (GST_IS_GL_WINDOW (window));
   window_class = GST_GL_WINDOW_GET_CLASS (window);
 
   window->queue_resize = TRUE;
@@ -1160,7 +1161,7 @@
 void
 gst_gl_window_resize (GstGLWindow * window, guint width, guint height)
 {
-  g_return_if_fail (GST_GL_IS_WINDOW (window));
+  g_return_if_fail (GST_IS_GL_WINDOW (window));
 
   if (window->resize)
     window->resize (window->resize_data, width, height);
diff --git a/gst-libs/gst/gl/gstglwindow.h b/gst-libs/gst/gl/gstglwindow.h
index e4781c7..1cf5c3e 100644
--- a/gst-libs/gst/gl/gstglwindow.h
+++ b/gst-libs/gst/gl/gstglwindow.h
@@ -33,8 +33,8 @@
 #define GST_GL_TYPE_WINDOW         (gst_gl_window_get_type())
 #define GST_GL_WINDOW(o)           (G_TYPE_CHECK_INSTANCE_CAST((o), GST_GL_TYPE_WINDOW, GstGLWindow))
 #define GST_GL_WINDOW_CLASS(k)     (G_TYPE_CHECK_CLASS_CAST((k), GST_GL_TYPE_WINDOW, GstGLWindowClass))
-#define GST_GL_IS_WINDOW(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_WINDOW))
-#define GST_GL_IS_WINDOW_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_WINDOW))
+#define GST_IS_GL_WINDOW(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_WINDOW))
+#define GST_IS_GL_WINDOW_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_WINDOW))
 #define GST_GL_WINDOW_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_GL_TYPE_WINDOW, GstGLWindowClass))
 
 #define GST_GL_WINDOW_LOCK(w) g_mutex_lock(&GST_GL_WINDOW(w)->lock)
@@ -67,11 +67,6 @@
   GstObject parent;
 
   GMutex        lock;
-  GMutex        nav_lock;
-  GCond         nav_create_cond;
-  GCond         nav_destroy_cond;
-  gboolean      nav_created;
-  gboolean      nav_alive;
 
   GstGLDisplay *display;
   GWeakRef      context_ref;
@@ -93,9 +88,6 @@
   gboolean              queue_resize;
 
   /*< private >*/
-  GMainContext *navigation_context;
-  GMainLoop *navigation_loop;
-
   GstGLWindowPrivate *priv;
 
   gpointer _reserved[GST_PADDING];
@@ -108,7 +100,6 @@
  * @set_window_handle: Set a window to render into
  * @get_window_handle: Gets the current window that this #GstGLWindow is
  *                     rendering into
- * @draw_unlocked: redraw the window with the specified dimensions
  * @draw: redraw the window with the specified dimensions
  * @run: run the mainloop
  * @quit: send a quit to the mainloop
@@ -131,7 +122,6 @@
   guintptr (*get_display)        (GstGLWindow *window);
   void     (*set_window_handle)  (GstGLWindow *window, guintptr id);
   guintptr (*get_window_handle)  (GstGLWindow *window);
-  void     (*draw_unlocked)      (GstGLWindow *window);
   void     (*draw)               (GstGLWindow *window);
   void     (*run)                (GstGLWindow *window);
   void     (*quit)               (GstGLWindow *window);
@@ -150,22 +140,6 @@
   gpointer _reserved[GST_PADDING];
 };
 
-struct key_event
-{
-  GstGLWindow *window;
-  const char *event_type;
-  const char *key_str;
-};
-
-struct mouse_event
-{
-  GstGLWindow *window;
-  const char *event_type;
-  int button;
-  double posx;
-  double posy;
-};
-
 GQuark gst_gl_window_error_quark (void);
 GType gst_gl_window_get_type     (void);
 
@@ -203,20 +177,26 @@
 /* navigation */
 void     gst_gl_window_handle_events        (GstGLWindow * window,
                                              gboolean handle_events);
-gboolean gst_gl_window_key_event_cb         (gpointer data);
-gboolean gst_gl_window_mouse_event_cb       (gpointer data);
+
 void     gst_gl_window_send_key_event       (GstGLWindow * window,
                                              const char * event_type,
                                              const char * key_str);
+void     gst_gl_window_send_key_event_async (GstGLWindow * window,
+                                             const char * event_type,
+                                             const char * key_str);
 void     gst_gl_window_send_mouse_event     (GstGLWindow * window,
                                              const char * event_type,
                                              int button,
                                              double posx,
                                              double posy);
+void     gst_gl_window_send_mouse_event_async (GstGLWindow * window,
+                                             const char * event_type,
+                                             int button,
+                                             double posx,
+                                             double posy);
 
 /* surfaces/rendering */
 void     gst_gl_window_queue_resize         (GstGLWindow *window);
-void     gst_gl_window_draw_unlocked        (GstGLWindow *window);
 void     gst_gl_window_draw                 (GstGLWindow *window);
 void     gst_gl_window_show                 (GstGLWindow *window);
 void     gst_gl_window_set_preferred_size   (GstGLWindow * window,
diff --git a/gst-libs/gst/gl/wayland/Makefile.in b/gst-libs/gst/gl/wayland/Makefile.in
index 55462d4..2f94860 100644
--- a/gst-libs/gst/gl/wayland/Makefile.in
+++ b/gst-libs/gst/gl/wayland/Makefile.in
@@ -247,6 +247,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -284,6 +286,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -311,6 +315,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -329,6 +335,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -339,6 +347,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -364,6 +374,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -389,6 +401,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -520,6 +534,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -577,8 +593,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -648,6 +668,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c
index b34ad42..6e1f0c5 100644
--- a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c
+++ b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.c
@@ -334,8 +334,6 @@
       GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_get_window_handle);
   window_class->set_window_handle =
       GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_set_window_handle);
-  window_class->draw_unlocked =
-      GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_draw);
   window_class->show = GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_show);
   window_class->draw = GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_draw);
   window_class->close = GST_DEBUG_FUNCPTR (gst_gl_window_wayland_egl_close);
diff --git a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h
index f76b5b0..e0166da 100644
--- a/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h
+++ b/gst-libs/gst/gl/wayland/gstglwindow_wayland_egl.h
@@ -32,8 +32,8 @@
 #define GST_GL_TYPE_WINDOW_WAYLAND_EGL         (gst_gl_window_wayland_egl_get_type())
 #define GST_GL_WINDOW_WAYLAND_EGL(o)           (G_TYPE_CHECK_INSTANCE_CAST((o), GST_GL_TYPE_WINDOW_WAYLAND_EGL, GstGLWindowWaylandEGL))
 #define GST_GL_WINDOW_WAYLAND_EGL_CLASS(k)     (G_TYPE_CHECK_CLASS((k), GST_GL_TYPE_WINDOW_WAYLAND_EGL, GstGLWindowWaylandEGLClass))
-#define GST_GL_IS_WINDOW_WAYLAND_EGL(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_WINDOW_WAYLAND_EGL))
-#define GST_GL_IS_WINDOW_WAYLAND_EGL_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_WINDOW_WAYLAND_EGL))
+#define GST_IS_GL_WINDOW_WAYLAND_EGL(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_WINDOW_WAYLAND_EGL))
+#define GST_IS_GL_WINDOW_WAYLAND_EGL_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_WINDOW_WAYLAND_EGL))
 #define GST_GL_WINDOW_WAYLAND_EGL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_GL_TYPE_WINDOW_WAYLAND_EGL, GstGLWindowWaylandEGL_Class))
 
 typedef struct _GstGLWindowWaylandEGL        GstGLWindowWaylandEGL;
diff --git a/gst-libs/gst/gl/win32/Makefile.in b/gst-libs/gst/gl/win32/Makefile.in
index ccf98e9..eee9164 100644
--- a/gst-libs/gst/gl/win32/Makefile.in
+++ b/gst-libs/gst/gl/win32/Makefile.in
@@ -252,6 +252,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -289,6 +291,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -316,6 +320,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -334,6 +340,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -344,6 +352,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -369,6 +379,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -394,6 +406,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -525,6 +539,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -582,8 +598,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -653,6 +673,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst-libs/gst/gl/win32/gstglcontext_wgl.h b/gst-libs/gst/gl/win32/gstglcontext_wgl.h
index 64bf141..2458de8 100644
--- a/gst-libs/gst/gl/win32/gstglcontext_wgl.h
+++ b/gst-libs/gst/gl/win32/gstglcontext_wgl.h
@@ -28,8 +28,8 @@
 #define GST_GL_TYPE_CONTEXT_WGL         (gst_gl_context_wgl_get_type())
 #define GST_GL_CONTEXT_WGL(o)           (G_TYPE_CHECK_INSTANCE_CAST((o), GST_GL_TYPE_CONTEXT_WGL, GstGLContextWGL))
 #define GST_GL_CONTEXT_WGL_CLASS(k)     (G_TYPE_CHECK_CLASS((k), GST_GL_TYPE_CONTEXT_WGL, GstGLContextWGLClass))
-#define GST_GL_IS_CONTEXT_WGL(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_CONTEXT_WGL))
-#define GST_GL_IS_CONTEXT_WGL_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_CONTEXT_WGL))
+#define GST_IS_GL_CONTEXT_WGL(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_CONTEXT_WGL))
+#define GST_IS_GL_CONTEXT_WGL_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_CONTEXT_WGL))
 #define GST_GL_CONTEXT_WGL_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_GL_TYPE_CONTEXT_WGL, GstGLContextWGLClass))
 
 typedef struct _GstGLContextWGL        GstGLContextWGL;
diff --git a/gst-libs/gst/gl/win32/gstglwindow_win32.c b/gst-libs/gst/gl/win32/gstglwindow_win32.c
index a2ed3e6..1ff18bb 100644
--- a/gst-libs/gst/gl/win32/gstglwindow_win32.c
+++ b/gst-libs/gst/gl/win32/gstglwindow_win32.c
@@ -74,7 +74,6 @@
 
   window_class->set_window_handle =
       GST_DEBUG_FUNCPTR (gst_gl_window_win32_set_window_handle);
-  window_class->draw_unlocked = GST_DEBUG_FUNCPTR (gst_gl_window_win32_draw);
   window_class->draw = GST_DEBUG_FUNCPTR (gst_gl_window_win32_draw);
   window_class->get_display =
       GST_DEBUG_FUNCPTR (gst_gl_window_win32_get_display);
diff --git a/gst-libs/gst/gl/win32/gstglwindow_win32.h b/gst-libs/gst/gl/win32/gstglwindow_win32.h
index 080a4d4..c17b492 100644
--- a/gst-libs/gst/gl/win32/gstglwindow_win32.h
+++ b/gst-libs/gst/gl/win32/gstglwindow_win32.h
@@ -32,8 +32,8 @@
 #define GST_GL_TYPE_WINDOW_WIN32         (gst_gl_window_win32_get_type())
 #define GST_GL_WINDOW_WIN32(o)           (G_TYPE_CHECK_INSTANCE_CAST((o), GST_GL_TYPE_WINDOW_WIN32, GstGLWindowWin32))
 #define GST_GL_WINDOW_WIN32_CLASS(k)     (G_TYPE_CHECK_CLASS((k), GST_GL_TYPE_WINDOW_WIN32, GstGLWindowWin32Class))
-#define GST_GL_IS_WINDOW_WIN32(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_WINDOW_WIN32))
-#define GST_GL_IS_WINDOW_WIN32_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_WINDOW_WIN32))
+#define GST_IS_GL_WINDOW_WIN32(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_WINDOW_WIN32))
+#define GST_IS_GL_WINDOW_WIN32_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_WINDOW_WIN32))
 #define GST_GL_WINDOW_WIN32_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_GL_TYPE_WINDOW_WIN32, GstGLWindowWin32Class))
 
 typedef struct _GstGLWindowWin32        GstGLWindowWin32;
diff --git a/gst-libs/gst/gl/x11/Makefile.in b/gst-libs/gst/gl/x11/Makefile.in
index a919ca5..77622a2 100644
--- a/gst-libs/gst/gl/x11/Makefile.in
+++ b/gst-libs/gst/gl/x11/Makefile.in
@@ -281,6 +281,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -318,6 +320,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -345,6 +349,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -363,6 +369,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -373,6 +381,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -398,6 +408,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -423,6 +435,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -554,6 +568,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -611,8 +627,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -682,6 +702,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst-libs/gst/gl/x11/gstglcontext_glx.h b/gst-libs/gst/gl/x11/gstglcontext_glx.h
index e015108..f95204a 100644
--- a/gst-libs/gst/gl/x11/gstglcontext_glx.h
+++ b/gst-libs/gst/gl/x11/gstglcontext_glx.h
@@ -30,8 +30,8 @@
 #define GST_GL_TYPE_CONTEXT_GLX         (gst_gl_context_glx_get_type())
 #define GST_GL_CONTEXT_GLX(o)           (G_TYPE_CHECK_INSTANCE_CAST((o), GST_GL_TYPE_CONTEXT_GLX, GstGLContextGLX))
 #define GST_GL_CONTEXT_GLX_CLASS(k)     (G_TYPE_CHECK_CLASS((k), GST_GL_TYPE_CONTEXT_GLX, GstGLContextGLXClass))
-#define GST_GL_IS_CONTEXT_GLX(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_CONTEXT_GLX))
-#define GST_GL_IS_CONTEXT_GLX_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_CONTEXT_GLX))
+#define GST_IS_GL_CONTEXT_GLX(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_CONTEXT_GLX))
+#define GST_IS_GL_CONTEXT_GLX_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_CONTEXT_GLX))
 #define GST_GL_CONTEXT_GLX_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_GL_TYPE_CONTEXT_GLX, GstGLContextGLX_Class))
 
 typedef struct _GstGLContextGLX        GstGLContextGLX;
diff --git a/gst-libs/gst/gl/x11/gstgldisplay_x11.c b/gst-libs/gst/gl/x11/gstgldisplay_x11.c
index e6086b7..696929e 100644
--- a/gst-libs/gst/gl/x11/gstgldisplay_x11.c
+++ b/gst-libs/gst/gl/x11/gstgldisplay_x11.c
@@ -55,8 +55,7 @@
 {
   GstGLDisplayX11 *display_x11 = GST_GL_DISPLAY_X11 (object);
 
-  if (display_x11->name)
-    g_free (display_x11->name);
+  g_free (display_x11->name);
 
   if (!display_x11->foreign_display && display_x11->display) {
     XCloseDisplay (display_x11->display);
diff --git a/gst-libs/gst/gl/x11/gstglwindow_x11.c b/gst-libs/gst/gl/x11/gstglwindow_x11.c
index 29c2aea..43387ac 100644
--- a/gst-libs/gst/gl/x11/gstglwindow_x11.c
+++ b/gst-libs/gst/gl/x11/gstglwindow_x11.c
@@ -74,7 +74,6 @@
 static void gst_gl_window_x11_set_preferred_size (GstGLWindow * window,
     gint width, gint height);
 void gst_gl_window_x11_show (GstGLWindow * window);
-void gst_gl_window_x11_draw_unlocked (GstGLWindow * window);
 void gst_gl_window_x11_draw (GstGLWindow * window);
 gboolean gst_gl_window_x11_create_context (GstGLWindow * window,
     GstGLAPI gl_api, guintptr external_gl_context, GError ** error);
@@ -104,8 +103,6 @@
       GST_DEBUG_FUNCPTR (gst_gl_window_x11_set_window_handle);
   window_class->get_window_handle =
       GST_DEBUG_FUNCPTR (gst_gl_window_x11_get_window_handle);
-  window_class->draw_unlocked =
-      GST_DEBUG_FUNCPTR (gst_gl_window_x11_draw_unlocked);
   window_class->draw = GST_DEBUG_FUNCPTR (gst_gl_window_x11_draw);
   window_class->open = GST_DEBUG_FUNCPTR (gst_gl_window_x11_open);
   window_class->close = GST_DEBUG_FUNCPTR (gst_gl_window_x11_close);
@@ -387,39 +384,13 @@
   gst_gl_window_send_message (window, (GstGLWindowCB) _show_window, window);
 }
 
-/* Called in the gl thread */
-void
-gst_gl_window_x11_draw_unlocked (GstGLWindow * window)
-{
-  GstGLWindowX11 *window_x11 = GST_GL_WINDOW_X11 (window);
-
-  if (gst_gl_window_is_running (GST_GL_WINDOW (window_x11))
-      && window_x11->allow_extra_expose_events) {
-    if (window->queue_resize) {
-      guint width, height;
-
-      gst_gl_window_get_surface_dimensions (window, &width, &height);
-      gst_gl_window_resize (window, width, height);
-    }
-
-    if (window->draw) {
-      GstGLContext *context = gst_gl_window_get_context (window);
-      GstGLContextClass *context_class = GST_GL_CONTEXT_GET_CLASS (context);
-
-      window->draw (window->draw_data);
-      context_class->swap_buffers (context);
-
-      gst_object_unref (context);
-    }
-  }
-}
-
 static void
 draw_cb (gpointer data)
 {
   GstGLWindowX11 *window_x11 = data;
+  GstGLWindow *window = GST_GL_WINDOW (window_x11);
 
-  if (gst_gl_window_is_running (GST_GL_WINDOW (window_x11))) {
+  if (gst_gl_window_is_running (window)) {
     XWindowAttributes attr;
 
     XGetWindowAttributes (window_x11->device, window_x11->internal_win_id,
@@ -443,7 +414,24 @@
       }
     }
 
-    gst_gl_window_x11_draw_unlocked (GST_GL_WINDOW (window_x11));
+    if (window_x11->allow_extra_expose_events) {
+      if (window->queue_resize) {
+        guint width, height;
+
+        gst_gl_window_get_surface_dimensions (window, &width, &height);
+        gst_gl_window_resize (window, width, height);
+      }
+
+      if (window->draw) {
+        GstGLContext *context = gst_gl_window_get_context (window);
+        GstGLContextClass *context_class = GST_GL_CONTEXT_GET_CLASS (context);
+
+        window->draw (window->draw_data);
+        context_class->swap_buffers (context);
+
+        gst_object_unref (context);
+      }
+    }
   }
 }
 
@@ -527,10 +515,6 @@
   GstGLContextClass *context_class;
   GstGLWindow *window;
   gboolean ret = TRUE;
-  const char *key_str = NULL;
-  KeySym keysym;
-  struct mouse_event *mouse_data;
-  struct key_event *key_data;
 
   window = GST_GL_WINDOW (window_x11);
 
@@ -603,47 +587,39 @@
         break;
       case KeyPress:
       case KeyRelease:
+      {
+        const char *key_str = NULL, *key_type = NULL;
+        KeySym keysym;
+
         keysym = XkbKeycodeToKeysym (window_x11->device,
             event.xkey.keycode, 0, 0);
         key_str = XKeysymToString (keysym);
-        key_data = g_slice_new (struct key_event);
-        key_data->window = window;
-        key_data->key_str = XKeysymToString (keysym);
-        key_data->event_type =
-            event.type == KeyPress ? "key-press" : "key-release";
-        GST_DEBUG ("input event key %d pressed over window at %d,%d (%s)",
-            event.xkey.keycode, event.xkey.x, event.xkey.y, key_str);
-        g_main_context_invoke (window->navigation_context,
-            (GSourceFunc) gst_gl_window_key_event_cb, key_data);
+        key_type = event.type == KeyPress ? "key-press" : "key-release";
+        GST_DEBUG ("input event key %d %s over window at %d,%d (%s)",
+            event.xkey.keycode, key_type, event.xkey.x, event.xkey.y, key_str);
+        gst_gl_window_send_key_event_async (window, key_type, key_str);
         break;
+      }
       case ButtonPress:
-      case ButtonRelease:
-        GST_DEBUG ("input event mouse button %d pressed over window at %d,%d",
-            event.xbutton.button, event.xbutton.x, event.xbutton.y);
-        mouse_data = g_slice_new (struct mouse_event);
-        mouse_data->window = window;
-        mouse_data->event_type =
-            event.type ==
-            ButtonPress ? "mouse-button-press" : "mouse-button-release";
-        mouse_data->button = event.xbutton.button;
-        mouse_data->posx = (double) event.xbutton.x;
-        mouse_data->posy = (double) event.xbutton.y;
+      case ButtonRelease:{
+        const char *mouse_type = NULL;
 
-        g_main_context_invoke (window->navigation_context,
-            (GSourceFunc) gst_gl_window_mouse_event_cb, mouse_data);
+        mouse_type = event.type ==
+            ButtonPress ? "mouse-button-press" : "mouse-button-release";
+
+        GST_DEBUG ("input event mouse button %d %s over window at %d,%d",
+            event.xbutton.button, mouse_type, event.xbutton.x, event.xbutton.y);
+
+        gst_gl_window_send_mouse_event_async (window, mouse_type,
+            event.xbutton.button, event.xbutton.x, event.xbutton.y);
         break;
+      }
       case MotionNotify:
         GST_DEBUG ("input event pointer moved over window at %d,%d",
             event.xmotion.x, event.xmotion.y);
-        mouse_data = g_slice_new (struct mouse_event);
-        mouse_data->window = window;
-        mouse_data->event_type = "mouse-move";
-        mouse_data->button = 0;
-        mouse_data->posx = (double) event.xbutton.x;
-        mouse_data->posy = (double) event.xbutton.y;
 
-        g_main_context_invoke (window->navigation_context, (GSourceFunc)
-            gst_gl_window_mouse_event_cb, mouse_data);
+        gst_gl_window_send_mouse_event_async (window, "mouse-move", 0,
+            event.xbutton.x, event.xbutton.y);
         break;
       default:
         GST_DEBUG ("unknown XEvent type: %u", event.type);
diff --git a/gst-libs/gst/gl/x11/gstglwindow_x11.h b/gst-libs/gst/gl/x11/gstglwindow_x11.h
index c16a637..b4a4b17 100644
--- a/gst-libs/gst/gl/x11/gstglwindow_x11.h
+++ b/gst-libs/gst/gl/x11/gstglwindow_x11.h
@@ -31,8 +31,8 @@
 #define GST_GL_TYPE_WINDOW_X11         (gst_gl_window_x11_get_type())
 #define GST_GL_WINDOW_X11(o)           (G_TYPE_CHECK_INSTANCE_CAST((o), GST_GL_TYPE_WINDOW_X11, GstGLWindowX11))
 #define GST_GL_WINDOW_X11_CLASS(k)     (G_TYPE_CHECK_CLASS((k), GST_GL_TYPE_WINDOW_X11, GstGLWindowX11Class))
-#define GST_GL_IS_WINDOW_X11(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_WINDOW_X11))
-#define GST_GL_IS_WINDOW_X11_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_WINDOW_X11))
+#define GST_IS_GL_WINDOW_X11(o)        (G_TYPE_CHECK_INSTANCE_TYPE((o), GST_GL_TYPE_WINDOW_X11))
+#define GST_IS_GL_WINDOW_X11_CLASS(k)  (G_TYPE_CHECK_CLASS_TYPE((k), GST_GL_TYPE_WINDOW_X11))
 #define GST_GL_WINDOW_X11_GET_CLASS(o) (G_TYPE_INSTANCE_GET_CLASS((o), GST_GL_TYPE_WINDOW_X11, GstGLWindowX11Class))
 
 typedef struct _GstGLWindowX11        GstGLWindowX11;
diff --git a/gst-libs/gst/glib-compat-private.h b/gst-libs/gst/glib-compat-private.h
index c96c005..1a4aa7d 100644
--- a/gst-libs/gst/glib-compat-private.h
+++ b/gst-libs/gst/glib-compat-private.h
@@ -27,114 +27,6 @@
 
 G_BEGIN_DECLS
 
-#if !GLIB_CHECK_VERSION(2,25,0)
-
-#if defined (_MSC_VER) && !defined(_WIN64)
-typedef struct _stat32 GStatBuf;
-#else
-typedef struct stat GStatBuf;
-#endif
-
-#endif
-
-#if GLIB_CHECK_VERSION(2,26,0)
-#define GLIB_HAS_GDATETIME
-#endif
-
-/* See bug #651514 */
-#if GLIB_CHECK_VERSION(2,29,5)
-#define G_ATOMIC_POINTER_COMPARE_AND_EXCHANGE(a,b,c) \
-    g_atomic_pointer_compare_and_exchange ((a),(b),(c))
-#define G_ATOMIC_INT_COMPARE_AND_EXCHANGE(a,b,c) \
-    g_atomic_int_compare_and_exchange ((a),(b),(c))
-#else
-#define G_ATOMIC_POINTER_COMPARE_AND_EXCHANGE(a,b,c) \
-    g_atomic_pointer_compare_and_exchange ((volatile gpointer *)(a),(b),(c))
-#define G_ATOMIC_INT_COMPARE_AND_EXCHANGE(a,b,c) \
-    g_atomic_int_compare_and_exchange ((volatile int *)(a),(b),(c))
-#endif
-
-/* See bug #651514 */
-#if GLIB_CHECK_VERSION(2,29,5)
-#define G_ATOMIC_INT_ADD(a,b) g_atomic_int_add ((a),(b))
-#else
-#define G_ATOMIC_INT_ADD(a,b) g_atomic_int_exchange_and_add ((a),(b))
-#endif
-
-/* copies */
-
-#if GLIB_CHECK_VERSION (2, 31, 0)
-#define g_mutex_new gst_g_mutex_new
-static inline GMutex *
-gst_g_mutex_new (void)
-{
-  GMutex *mutex = g_slice_new (GMutex);
-  g_mutex_init (mutex);
-  return mutex;
-}
-#define g_mutex_free gst_g_mutex_free
-static inline void
-gst_g_mutex_free (GMutex *mutex)
-{
-  g_mutex_clear (mutex);
-  g_slice_free (GMutex, mutex);
-}
-#define g_cond_new gst_g_cond_new
-static inline GCond *
-gst_g_cond_new (void)
-{
-  GCond *cond = g_slice_new (GCond);
-  g_cond_init (cond);
-  return cond;
-}
-#define g_cond_free gst_g_cond_free
-static inline void
-gst_g_cond_free (GCond *cond)
-{
-  g_cond_clear (cond);
-  g_slice_free (GCond, cond);
-}
-#define g_cond_timed_wait gst_g_cond_timed_wait
-static inline gboolean
-gst_g_cond_timed_wait (GCond *cond, GMutex *mutex, GTimeVal *abs_time)
-{
-  gint64 end_time;
-
-  if (abs_time == NULL) {
-    g_cond_wait (cond, mutex);
-    return TRUE;
-  }
-
-  end_time = abs_time->tv_sec;
-  end_time *= 1000000;
-  end_time += abs_time->tv_usec;
-
-  /* would be nice if we had clock_rtoffset, but that didn't seem to
-   * make it into the kernel yet...
-   */
-  /* if CLOCK_MONOTONIC is not defined then g_get_montonic_time() and
-   * g_get_real_time() are returning the same clock and we'd add ~0
-   */
-  end_time += g_get_monotonic_time () - g_get_real_time ();
-  return g_cond_wait_until (cond, mutex, end_time);
-}
-#endif /* GLIB_CHECK_VERSION (2, 31, 0) */
-
-#if GLIB_CHECK_VERSION (2, 31, 0)
-#define g_thread_create gst_g_thread_create
-static inline GThread *
-gst_g_thread_create (GThreadFunc func, gpointer data, gboolean joinable,
-    GError **error)
-{
-  GThread *thread = g_thread_try_new ("gst-check", func, data, error);
-  if (!joinable)
-    g_thread_unref (thread);
-  return thread;
-}
-#endif /* GLIB_CHECK_VERSION (2, 31, 0) */
-
-/* adaptations */
-
 G_END_DECLS
 
 #endif
diff --git a/gst-libs/gst/insertbin/Makefile.am b/gst-libs/gst/insertbin/Makefile.am
index 09eb97c..d4d331c 100644
--- a/gst-libs/gst/insertbin/Makefile.am
+++ b/gst-libs/gst/insertbin/Makefile.am
@@ -33,7 +33,8 @@
 		GST_PLUGIN_SYSTEM_PATH_1_0="" GST_PLUGIN_PATH_1_0="" GST_REGISTRY_UPDATE=no \
 		$(INTROSPECTION_SCANNER) -v --namespace GstInsertBin \
 		--nsversion=@GST_API_VERSION@ \
-		--strip-prefix=Gst \
+		--identifier-prefix=Gst \
+		--symbol-prefix=gst \
 		--warn-all \
 		--c-include "gst/insertbin/gstinsertbin.h" \
 		-I$(top_srcdir)/gst-libs \
diff --git a/gst-libs/gst/insertbin/Makefile.in b/gst-libs/gst/insertbin/Makefile.in
index 2ca48c8..971b081 100644
--- a/gst-libs/gst/insertbin/Makefile.in
+++ b/gst-libs/gst/insertbin/Makefile.in
@@ -264,6 +264,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -301,6 +303,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -328,6 +332,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -346,6 +352,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -356,6 +364,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -381,6 +391,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -406,6 +418,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -537,6 +551,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -594,8 +610,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -665,6 +685,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -1143,7 +1164,8 @@
 @HAVE_INTROSPECTION_TRUE@		GST_PLUGIN_SYSTEM_PATH_1_0="" GST_PLUGIN_PATH_1_0="" GST_REGISTRY_UPDATE=no \
 @HAVE_INTROSPECTION_TRUE@		$(INTROSPECTION_SCANNER) -v --namespace GstInsertBin \
 @HAVE_INTROSPECTION_TRUE@		--nsversion=@GST_API_VERSION@ \
-@HAVE_INTROSPECTION_TRUE@		--strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@		--identifier-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@		--symbol-prefix=gst \
 @HAVE_INTROSPECTION_TRUE@		--warn-all \
 @HAVE_INTROSPECTION_TRUE@		--c-include "gst/insertbin/gstinsertbin.h" \
 @HAVE_INTROSPECTION_TRUE@		-I$(top_srcdir)/gst-libs \
diff --git a/gst-libs/gst/insertbin/gstinsertbin.h b/gst-libs/gst/insertbin/gstinsertbin.h
index 051a17a..58326f4 100644
--- a/gst-libs/gst/insertbin/gstinsertbin.h
+++ b/gst-libs/gst/insertbin/gstinsertbin.h
@@ -102,5 +102,9 @@
     GstInsertBinCallback callback, gpointer user_data);
 
 
+#ifdef G_DEFINE_AUTOPTR_CLEANUP_FUNC
+G_DEFINE_AUTOPTR_CLEANUP_FUNC(GstInsertBin, gst_object_unref)
+#endif
+
 G_END_DECLS
 #endif /* __GST_INSERT_BIN_H__ */
diff --git a/gst-libs/gst/interfaces/Makefile.in b/gst-libs/gst/interfaces/Makefile.in
index 62c0397..c112c1c 100644
--- a/gst-libs/gst/interfaces/Makefile.in
+++ b/gst-libs/gst/interfaces/Makefile.in
@@ -294,6 +294,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -331,6 +333,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -358,6 +362,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -376,6 +382,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -386,6 +394,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -411,6 +421,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -436,6 +448,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -567,6 +581,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -624,8 +640,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -695,6 +715,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst-libs/gst/mpegts/Makefile.in b/gst-libs/gst/mpegts/Makefile.in
index cbd4848..942f3e4 100644
--- a/gst-libs/gst/mpegts/Makefile.in
+++ b/gst-libs/gst/mpegts/Makefile.in
@@ -302,6 +302,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -339,6 +341,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -366,6 +370,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -384,6 +390,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -394,6 +402,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -419,6 +429,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -444,6 +456,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -575,6 +589,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -632,8 +648,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -703,6 +723,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst-libs/gst/mpegts/gstmpegtsdescriptor.c b/gst-libs/gst/mpegts/gstmpegtsdescriptor.c
index da8419c..d4817d2 100644
--- a/gst-libs/gst/mpegts/gstmpegtsdescriptor.c
+++ b/gst-libs/gst/mpegts/gstmpegtsdescriptor.c
@@ -635,7 +635,6 @@
 _packetize_descriptor_array (GPtrArray * array, guint8 ** out_data)
 {
   guint i;
-  guint8 header_size;
   GstMpegtsDescriptor *descriptor;
 
   g_return_if_fail (out_data != NULL);
@@ -647,13 +646,8 @@
   for (i = 0; i < array->len; i++) {
     descriptor = g_ptr_array_index (array, i);
 
-    if (descriptor->tag == GST_MTS_DESC_DVB_EXTENSION)
-      header_size = 3;
-    else
-      header_size = 2;
-
-    memcpy (*out_data, descriptor->data, descriptor->length + header_size);
-    *out_data += descriptor->length + header_size;
+    memcpy (*out_data, descriptor->data, descriptor->length + 2);
+    *out_data += descriptor->length + 2;
   }
 }
 
@@ -689,15 +683,15 @@
 
   descriptor->tag = tag;
   descriptor->tag_extension = tag_extension;
-  descriptor->length = length;
+  descriptor->length = length + 1;
 
   descriptor->data = g_malloc (length + 3);
 
   data = descriptor->data;
 
   *data++ = descriptor->tag;
-  *data++ = descriptor->tag_extension;
-  *data = descriptor->length;
+  *data++ = descriptor->length;
+  *data = descriptor->tag_extension;
 
   return descriptor;
 }
@@ -1105,3 +1099,28 @@
 
   return descriptor;
 }
+
+/**
+ * gst_mpegts_descriptor_from_custom_with_extension:
+ * @tag: descriptor tag
+ * @tag_extension: descriptor tag extension
+ * @data: (transfer none): descriptor data (after tag and length field)
+ * @length: length of @data
+ *
+ * Creates a #GstMpegtsDescriptor with custom @tag, @tag_extension and @data
+ *
+ * Returns: #GstMpegtsDescriptor
+ */
+GstMpegtsDescriptor *
+gst_mpegts_descriptor_from_custom_with_extension (guint8 tag,
+    guint8 tag_extension, const guint8 * data, gsize length)
+{
+  GstMpegtsDescriptor *descriptor;
+
+  descriptor = _new_descriptor_with_extension (tag, tag_extension, length);
+
+  if (data && (length > 0))
+    memcpy (descriptor->data + 3, data, length);
+
+  return descriptor;
+}
diff --git a/gst-libs/gst/mpegts/gstmpegtsdescriptor.h b/gst-libs/gst/mpegts/gstmpegtsdescriptor.h
index bbef97d..af56be0 100644
--- a/gst-libs/gst/mpegts/gstmpegtsdescriptor.h
+++ b/gst-libs/gst/mpegts/gstmpegtsdescriptor.h
@@ -341,6 +341,8 @@
 
 GstMpegtsDescriptor *
 gst_mpegts_descriptor_from_custom (guint8 tag, const guint8 *data, gsize length);
+GstMpegtsDescriptor *
+gst_mpegts_descriptor_from_custom_with_extension (guint8 tag, guint8 tag_extension, const guint8 *data, gsize length);
 
 G_END_DECLS
 
diff --git a/gst-libs/gst/player/Makefile.am b/gst-libs/gst/player/Makefile.am
new file mode 100644
index 0000000..60e8ecf
--- /dev/null
+++ b/gst-libs/gst/player/Makefile.am
@@ -0,0 +1,101 @@
+lib_LTLIBRARIES = libgstplayer-@GST_API_VERSION@.la
+
+libgstplayer_@GST_API_VERSION@_la_SOURCES = \
+	gstplayer.c  \
+	gstplayer-signal-dispatcher.c  \
+	gstplayer-video-renderer.c  \
+	gstplayer-media-info.c \
+	gstplayer-g-main-context-signal-dispatcher.c  \
+	gstplayer-video-overlay-video-renderer.c \
+	gstplayer-visualization.c
+
+libgstplayer_@GST_API_VERSION@_la_CFLAGS = \
+	-I$(top_srcdir)/gst-libs \
+	-I$(top_builddir)/gst-libs \
+	$(GST_PLUGINS_BASE_CFLAGS) \
+	$(GST_BASE_CFLAGS) \
+	$(GST_CFLAGS)
+
+libgstplayer_@GST_API_VERSION@_la_LDFLAGS = \
+	$(GST_LIB_LDFLAGS) \
+	$(GST_ALL_LDFLAGS) \
+	$(GST_LT_LDFLAGS)
+
+libgstplayer_@GST_API_VERSION@_la_LIBADD = \
+	$(GST_PLUGINS_BASE_LIBS) \
+	-lgstvideo-$(GST_API_VERSION) \
+	-lgstaudio-$(GST_API_VERSION) \
+	-lgsttag-$(GST_API_VERSION) \
+	-lgstpbutils-$(GST_API_VERSION) \
+	$(GST_LIBS) \
+	$(LIBM)
+
+libgstplayerdir = $(includedir)/gstreamer-@GST_API_VERSION@/gst/player
+
+noinst_HEADERS = \
+	gstplayer-signal-dispatcher-private.h \
+	gstplayer-video-renderer-private.h \
+	gstplayer-media-info-private.h
+
+libgstplayer_HEADERS = \
+	player.h \
+	gstplayer.h \
+	gstplayer-types.h \
+	gstplayer-signal-dispatcher.h \
+	gstplayer-video-renderer.h \
+	gstplayer-media-info.h \
+	gstplayer-g-main-context-signal-dispatcher.h  \
+	gstplayer-video-overlay-video-renderer.h \
+	gstplayer-visualization.h
+
+CLEANFILES =
+
+if HAVE_INTROSPECTION
+BUILT_GIRSOURCES = GstPlayer-@GST_API_VERSION@.gir
+
+gir_headers=$(patsubst %,$(srcdir)/%, $(libgstplayer_HEADERS))
+gir_sources=$(patsubst %,$(srcdir)/%, $(libgstplayer_@GST_API_VERSION@_la_SOURCES))
+
+GstPlayer-@GST_API_VERSION@.gir: $(INTROSPECTION_SCANNER) libgstplayer-@GST_API_VERSION@.la
+	$(AM_V_GEN)$(INTROSPECTION_SCANNER) -v --namespace GstPlayer \
+		--nsversion=@GST_API_VERSION@ \
+		--warn-all \
+		--strip-prefix=Gst \
+		-I$(top_srcdir)/gst-libs \
+		-I$(top_builddir)/gst-libs \
+		--c-include "gst/player/player.h" \
+		--add-include-path=$(top_builddir)/gst-libs \
+		--add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-1.0` \
+		--library-path=$(top_builddir)/gst-libs \
+		--library=libgstplayer-@GST_API_VERSION@.la \
+		--include=Gst-@GST_API_VERSION@ \
+		--libtool="${LIBTOOL}" \
+		--pkg gstreamer-@GST_API_VERSION@ \
+		--pkg gstreamer-audio-@GST_API_VERSION@ \
+		--pkg gstreamer-video-@GST_API_VERSION@ \
+		--pkg gstreamer-tag-@GST_API_VERSION@ \
+		--pkg gstreamer-pbutils-@GST_API_VERSION@ \
+		--pkg-export gstreamer-player-@GST_API_VERSION@ \
+		--add-init-section="gst_init(NULL,NULL);" \
+		--output $@ \
+		$(gir_headers) \
+		$(gir_sources)
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+girdir = $(datadir)/gir-1.0
+gir_DATA = $(BUILT_GIRSOURCES)
+
+typelibsdir = $(libdir)/girepository-1.0/
+
+typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+
+%.typelib: %.gir $(INTROSPECTION_COMPILER)
+	$(AM_V_GEN)$(INTROSPECTION_COMPILER) \
+		--includedir=$(srcdir)/gst-libs \
+		--includedir=$(builddir)/gst-libs \
+		--includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-1.0` \
+		$(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+CLEANFILES += $(BUILT_GIRSOURCES) $(typelibs_DATA)
+endif
diff --git a/gst-libs/gst/player/Makefile.in b/gst-libs/gst/player/Makefile.in
new file mode 100644
index 0000000..99e4e37
--- /dev/null
+++ b/gst-libs/gst/player/Makefile.in
@@ -0,0 +1,1334 @@
+# Makefile.in generated by automake 1.15 from Makefile.am.
+# @configure_input@
+
+# Copyright (C) 1994-2014 Free Software Foundation, Inc.
+
+# This Makefile.in is free software; the Free Software Foundation
+# gives unlimited permission to copy and/or distribute it,
+# with or without modifications, as long as this notice is preserved.
+
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY, to the extent permitted by law; without
+# even the implied warranty of MERCHANTABILITY or FITNESS FOR A
+# PARTICULAR PURPOSE.
+
+@SET_MAKE@
+
+
+
+VPATH = @srcdir@
+am__is_gnu_make = { \
+  if test -z '$(MAKELEVEL)'; then \
+    false; \
+  elif test -n '$(MAKE_HOST)'; then \
+    true; \
+  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \
+    true; \
+  else \
+    false; \
+  fi; \
+}
+am__make_running_with_option = \
+  case $${target_option-} in \
+      ?) ;; \
+      *) echo "am__make_running_with_option: internal error: invalid" \
+              "target option '$${target_option-}' specified" >&2; \
+         exit 1;; \
+  esac; \
+  has_opt=no; \
+  sane_makeflags=$$MAKEFLAGS; \
+  if $(am__is_gnu_make); then \
+    sane_makeflags=$$MFLAGS; \
+  else \
+    case $$MAKEFLAGS in \
+      *\\[\ \	]*) \
+        bs=\\; \
+        sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \
+          | sed "s/$$bs$$bs[$$bs $$bs	]*//g"`;; \
+    esac; \
+  fi; \
+  skip_next=no; \
+  strip_trailopt () \
+  { \
+    flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \
+  }; \
+  for flg in $$sane_makeflags; do \
+    test $$skip_next = yes && { skip_next=no; continue; }; \
+    case $$flg in \
+      *=*|--*) continue;; \
+        -*I) strip_trailopt 'I'; skip_next=yes;; \
+      -*I?*) strip_trailopt 'I';; \
+        -*O) strip_trailopt 'O'; skip_next=yes;; \
+      -*O?*) strip_trailopt 'O';; \
+        -*l) strip_trailopt 'l'; skip_next=yes;; \
+      -*l?*) strip_trailopt 'l';; \
+      -[dEDm]) skip_next=yes;; \
+      -[JT]) skip_next=yes;; \
+    esac; \
+    case $$flg in \
+      *$$target_option*) has_opt=yes; break;; \
+    esac; \
+  done; \
+  test $$has_opt = yes
+am__make_dryrun = (target_option=n; $(am__make_running_with_option))
+am__make_keepgoing = (target_option=k; $(am__make_running_with_option))
+pkgdatadir = $(datadir)/@PACKAGE@
+pkgincludedir = $(includedir)/@PACKAGE@
+pkglibdir = $(libdir)/@PACKAGE@
+pkglibexecdir = $(libexecdir)/@PACKAGE@
+am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd
+install_sh_DATA = $(install_sh) -c -m 644
+install_sh_PROGRAM = $(install_sh) -c
+install_sh_SCRIPT = $(install_sh) -c
+INSTALL_HEADER = $(INSTALL_DATA)
+transform = $(program_transform_name)
+NORMAL_INSTALL = :
+PRE_INSTALL = :
+POST_INSTALL = :
+NORMAL_UNINSTALL = :
+PRE_UNINSTALL = :
+POST_UNINSTALL = :
+build_triplet = @build@
+host_triplet = @host@
+target_triplet = @target@
+@HAVE_INTROSPECTION_TRUE@am__append_1 = $(BUILT_GIRSOURCES) $(typelibs_DATA)
+subdir = gst-libs/gst/player
+ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
+am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
+	$(top_srcdir)/common/m4/as-auto-alt.m4 \
+	$(top_srcdir)/common/m4/as-compiler-flag.m4 \
+	$(top_srcdir)/common/m4/as-libtool.m4 \
+	$(top_srcdir)/common/m4/as-version.m4 \
+	$(top_srcdir)/common/m4/ax_create_stdint_h.m4 \
+	$(top_srcdir)/common/m4/ax_pthread.m4 \
+	$(top_srcdir)/common/m4/gst-arch.m4 \
+	$(top_srcdir)/common/m4/gst-args.m4 \
+	$(top_srcdir)/common/m4/gst-check.m4 \
+	$(top_srcdir)/common/m4/gst-default.m4 \
+	$(top_srcdir)/common/m4/gst-dowhile.m4 \
+	$(top_srcdir)/common/m4/gst-error.m4 \
+	$(top_srcdir)/common/m4/gst-feature.m4 \
+	$(top_srcdir)/common/m4/gst-gettext.m4 \
+	$(top_srcdir)/common/m4/gst-glib2.m4 \
+	$(top_srcdir)/common/m4/gst-package-release-datetime.m4 \
+	$(top_srcdir)/common/m4/gst-platform.m4 \
+	$(top_srcdir)/common/m4/gst-plugin-docs.m4 \
+	$(top_srcdir)/common/m4/gst-plugindir.m4 \
+	$(top_srcdir)/common/m4/gst.m4 \
+	$(top_srcdir)/common/m4/gtk-doc.m4 \
+	$(top_srcdir)/common/m4/introspection.m4 \
+	$(top_srcdir)/common/m4/orc.m4 $(top_srcdir)/common/m4/pkg.m4 \
+	$(top_srcdir)/m4/gettext.m4 $(top_srcdir)/m4/gsettings.m4 \
+	$(top_srcdir)/m4/gst-fionread.m4 $(top_srcdir)/m4/gst-sdl.m4 \
+	$(top_srcdir)/m4/iconv.m4 $(top_srcdir)/m4/intlmacosx.m4 \
+	$(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \
+	$(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/libgcrypt.m4 \
+	$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \
+	$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \
+	$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/nls.m4 \
+	$(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \
+	$(top_srcdir)/configure.ac
+am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
+	$(ACLOCAL_M4)
+DIST_COMMON = $(srcdir)/Makefile.am $(libgstplayer_HEADERS) \
+	$(noinst_HEADERS) $(am__DIST_COMMON)
+mkinstalldirs = $(install_sh) -d
+CONFIG_HEADER = $(top_builddir)/config.h
+CONFIG_CLEAN_FILES =
+CONFIG_CLEAN_VPATH_FILES =
+am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
+am__vpath_adj = case $$p in \
+    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
+    *) f=$$p;; \
+  esac;
+am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
+am__install_max = 40
+am__nobase_strip_setup = \
+  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
+am__nobase_strip = \
+  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
+am__nobase_list = $(am__nobase_strip_setup); \
+  for p in $$list; do echo "$$p $$p"; done | \
+  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
+  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
+    if (++n[$$2] == $(am__install_max)) \
+      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
+    END { for (dir in files) print dir, files[dir] }'
+am__base_list = \
+  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
+  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
+am__uninstall_files_from_dir = { \
+  test -z "$$files" \
+    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
+    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
+         $(am__cd) "$$dir" && rm -f $$files; }; \
+  }
+am__installdirs = "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" \
+	"$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(libgstplayerdir)"
+LTLIBRARIES = $(lib_LTLIBRARIES)
+am__DEPENDENCIES_1 =
+libgstplayer_@GST_API_VERSION@_la_DEPENDENCIES =  \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1)
+am_libgstplayer_@GST_API_VERSION@_la_OBJECTS =  \
+	libgstplayer_@GST_API_VERSION@_la-gstplayer.lo \
+	libgstplayer_@GST_API_VERSION@_la-gstplayer-signal-dispatcher.lo \
+	libgstplayer_@GST_API_VERSION@_la-gstplayer-video-renderer.lo \
+	libgstplayer_@GST_API_VERSION@_la-gstplayer-media-info.lo \
+	libgstplayer_@GST_API_VERSION@_la-gstplayer-g-main-context-signal-dispatcher.lo \
+	libgstplayer_@GST_API_VERSION@_la-gstplayer-video-overlay-video-renderer.lo \
+	libgstplayer_@GST_API_VERSION@_la-gstplayer-visualization.lo
+libgstplayer_@GST_API_VERSION@_la_OBJECTS =  \
+	$(am_libgstplayer_@GST_API_VERSION@_la_OBJECTS)
+AM_V_lt = $(am__v_lt_@AM_V@)
+am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
+am__v_lt_0 = --silent
+am__v_lt_1 = 
+libgstplayer_@GST_API_VERSION@_la_LINK = $(LIBTOOL) $(AM_V_lt) \
+	--tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+	$(CCLD) $(libgstplayer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) \
+	$(libgstplayer_@GST_API_VERSION@_la_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_P = $(am__v_P_@AM_V@)
+am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
+am__v_P_0 = false
+am__v_P_1 = :
+AM_V_GEN = $(am__v_GEN_@AM_V@)
+am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)
+am__v_GEN_0 = @echo "  GEN     " $@;
+am__v_GEN_1 = 
+AM_V_at = $(am__v_at_@AM_V@)
+am__v_at_ = $(am__v_at_@AM_DEFAULT_V@)
+am__v_at_0 = @
+am__v_at_1 = 
+DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)
+depcomp = $(SHELL) $(top_srcdir)/depcomp
+am__depfiles_maybe = depfiles
+am__mv = mv -f
+COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
+	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
+LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \
+	$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \
+	$(AM_CFLAGS) $(CFLAGS)
+AM_V_CC = $(am__v_CC_@AM_V@)
+am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)
+am__v_CC_0 = @echo "  CC      " $@;
+am__v_CC_1 = 
+CCLD = $(CC)
+LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
+AM_V_CCLD = $(am__v_CCLD_@AM_V@)
+am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
+am__v_CCLD_0 = @echo "  CCLD    " $@;
+am__v_CCLD_1 = 
+SOURCES = $(libgstplayer_@GST_API_VERSION@_la_SOURCES)
+DIST_SOURCES = $(libgstplayer_@GST_API_VERSION@_la_SOURCES)
+am__can_run_installinfo = \
+  case $$AM_UPDATE_INFO_DIR in \
+    n|no|NO) false;; \
+    *) (install-info --version) >/dev/null 2>&1;; \
+  esac
+DATA = $(gir_DATA) $(typelibs_DATA)
+HEADERS = $(libgstplayer_HEADERS) $(noinst_HEADERS)
+am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
+# Read a list of newline-separated strings from the standard input,
+# and print each of them once, without duplicates.  Input order is
+# *not* preserved.
+am__uniquify_input = $(AWK) '\
+  BEGIN { nonempty = 0; } \
+  { items[$$0] = 1; nonempty = 1; } \
+  END { if (nonempty) { for (i in items) print i; }; } \
+'
+# Make sure the list of sources is unique.  This is necessary because,
+# e.g., the same source file might be shared among _SOURCES variables
+# for different programs/libraries.
+am__define_uniq_tagged_files = \
+  list='$(am__tagged_files)'; \
+  unique=`for i in $$list; do \
+    if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \
+  done | $(am__uniquify_input)`
+ETAGS = etags
+CTAGS = ctags
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
+DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
+ACLOCAL = @ACLOCAL@
+ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
+ACMENC_CFLAGS = @ACMENC_CFLAGS@
+ACMMP3DEC_CFLAGS = @ACMMP3DEC_CFLAGS@
+AMTAR = @AMTAR@
+AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@
+APEXSINK_CFLAGS = @APEXSINK_CFLAGS@
+APEXSINK_LIBS = @APEXSINK_LIBS@
+AR = @AR@
+AS = @AS@
+ASSRENDER_CFLAGS = @ASSRENDER_CFLAGS@
+ASSRENDER_LIBS = @ASSRENDER_LIBS@
+AUTOCONF = @AUTOCONF@
+AUTOHEADER = @AUTOHEADER@
+AUTOMAKE = @AUTOMAKE@
+AWK = @AWK@
+BLUEZ5_CFLAGS = @BLUEZ5_CFLAGS@
+BLUEZ5_LIBS = @BLUEZ5_LIBS@
+BS2B_CFLAGS = @BS2B_CFLAGS@
+BS2B_LIBS = @BS2B_LIBS@
+BZ2_LIBS = @BZ2_LIBS@
+CC = @CC@
+CCASFLAGS = @CCASFLAGS@
+CCDEPMODE = @CCDEPMODE@
+CFLAGS = @CFLAGS@
+CHROMAPRINT_CFLAGS = @CHROMAPRINT_CFLAGS@
+CHROMAPRINT_LIBS = @CHROMAPRINT_LIBS@
+CLUTTER_CFLAGS = @CLUTTER_CFLAGS@
+CLUTTER_GLX_CFLAGS = @CLUTTER_GLX_CFLAGS@
+CLUTTER_GLX_LIBS = @CLUTTER_GLX_LIBS@
+CLUTTER_LIBS = @CLUTTER_LIBS@
+CLUTTER_X11_CFLAGS = @CLUTTER_X11_CFLAGS@
+CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
+CPP = @CPP@
+CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
+CURL_CFLAGS = @CURL_CFLAGS@
+CURL_LIBS = @CURL_LIBS@
+CXX = @CXX@
+CXXCPP = @CXXCPP@
+CXXDEPMODE = @CXXDEPMODE@
+CXXFLAGS = @CXXFLAGS@
+CYGPATH_W = @CYGPATH_W@
+DAALA_CFLAGS = @DAALA_CFLAGS@
+DAALA_LIBS = @DAALA_LIBS@
+DCCP_LIBS = @DCCP_LIBS@
+DECKLINK_CXXFLAGS = @DECKLINK_CXXFLAGS@
+DECKLINK_LIBS = @DECKLINK_LIBS@
+DEFAULT_AUDIOSINK = @DEFAULT_AUDIOSINK@
+DEFAULT_AUDIOSRC = @DEFAULT_AUDIOSRC@
+DEFAULT_VIDEOSINK = @DEFAULT_VIDEOSINK@
+DEFAULT_VIDEOSRC = @DEFAULT_VIDEOSRC@
+DEFAULT_VISUALIZER = @DEFAULT_VISUALIZER@
+DEFS = @DEFS@
+DEPDIR = @DEPDIR@
+DEPRECATED_CFLAGS = @DEPRECATED_CFLAGS@
+DIRECT3D_LIBS = @DIRECT3D_LIBS@
+DIRECTFB_CFLAGS = @DIRECTFB_CFLAGS@
+DIRECTFB_LIBS = @DIRECTFB_LIBS@
+DIRECTSOUND_LIBS = @DIRECTSOUND_LIBS@
+DIRECTX_CFLAGS = @DIRECTX_CFLAGS@
+DIRECTX_LDFLAGS = @DIRECTX_LDFLAGS@
+DLLTOOL = @DLLTOOL@
+DSYMUTIL = @DSYMUTIL@
+DTLS_CFLAGS = @DTLS_CFLAGS@
+DTLS_LIBS = @DTLS_LIBS@
+DTS_LIBS = @DTS_LIBS@
+DUMPBIN = @DUMPBIN@
+DVDNAV_CFLAGS = @DVDNAV_CFLAGS@
+DVDNAV_LIBS = @DVDNAV_LIBS@
+ECHO_C = @ECHO_C@
+ECHO_N = @ECHO_N@
+ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
+EGREP = @EGREP@
+ERROR_CFLAGS = @ERROR_CFLAGS@
+ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
+ERROR_OBJCFLAGS = @ERROR_OBJCFLAGS@
+EXEEXT = @EXEEXT@
+EXIF_CFLAGS = @EXIF_CFLAGS@
+EXIF_LIBS = @EXIF_LIBS@
+FAAC_LIBS = @FAAC_LIBS@
+FAAD_IS_NEAAC = @FAAD_IS_NEAAC@
+FAAD_LIBS = @FAAD_LIBS@
+FFLAGS = @FFLAGS@
+FGREP = @FGREP@
+FLITE_CFLAGS = @FLITE_CFLAGS@
+FLITE_LIBS = @FLITE_LIBS@
+FLUIDSYNTH_CFLAGS = @FLUIDSYNTH_CFLAGS@
+FLUIDSYNTH_LIBS = @FLUIDSYNTH_LIBS@
+GCOV = @GCOV@
+GCOV_CFLAGS = @GCOV_CFLAGS@
+GCOV_LIBS = @GCOV_LIBS@
+GDBUS_CODEGEN = @GDBUS_CODEGEN@
+GETTEXT_MACRO_VERSION = @GETTEXT_MACRO_VERSION@
+GETTEXT_PACKAGE = @GETTEXT_PACKAGE@
+GIO_CFLAGS = @GIO_CFLAGS@
+GIO_LDFLAGS = @GIO_LDFLAGS@
+GIO_LIBS = @GIO_LIBS@
+GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
+GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
+GLIB_CFLAGS = @GLIB_CFLAGS@
+GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
+GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
+GLIB_GENMARSHAL = @GLIB_GENMARSHAL@
+GLIB_LIBS = @GLIB_LIBS@
+GLIB_MKENUMS = @GLIB_MKENUMS@
+GLIB_PREFIX = @GLIB_PREFIX@
+GLIB_REQ = @GLIB_REQ@
+GL_CFLAGS = @GL_CFLAGS@
+GL_LIBS = @GL_LIBS@
+GL_OBJCFLAGS = @GL_OBJCFLAGS@
+GME_LIBS = @GME_LIBS@
+GMODULE_EXPORT_CFLAGS = @GMODULE_EXPORT_CFLAGS@
+GMODULE_EXPORT_LIBS = @GMODULE_EXPORT_LIBS@
+GMODULE_NO_EXPORT_CFLAGS = @GMODULE_NO_EXPORT_CFLAGS@
+GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
+GMSGFMT = @GMSGFMT@
+GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
+GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
+GRAPHENE_LIBS = @GRAPHENE_LIBS@
+GREP = @GREP@
+GSETTINGS_CFLAGS = @GSETTINGS_CFLAGS@
+GSETTINGS_DISABLE_SCHEMAS_COMPILE = @GSETTINGS_DISABLE_SCHEMAS_COMPILE@
+GSETTINGS_LIBS = @GSETTINGS_LIBS@
+GSM_LIBS = @GSM_LIBS@
+GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
+GSTPB_PREFIX = @GSTPB_PREFIX@
+GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
+GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
+GST_API_VERSION = @GST_API_VERSION@
+GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
+GST_BASE_LIBS = @GST_BASE_LIBS@
+GST_CFLAGS = @GST_CFLAGS@
+GST_CHECK_CFLAGS = @GST_CHECK_CFLAGS@
+GST_CHECK_LIBS = @GST_CHECK_LIBS@
+GST_CONTROLLER_CFLAGS = @GST_CONTROLLER_CFLAGS@
+GST_CONTROLLER_LIBS = @GST_CONTROLLER_LIBS@
+GST_CURRENT = @GST_CURRENT@
+GST_CXXFLAGS = @GST_CXXFLAGS@
+GST_LEVEL_DEFAULT = @GST_LEVEL_DEFAULT@
+GST_LIBS = @GST_LIBS@
+GST_LIBVERSION = @GST_LIBVERSION@
+GST_LIB_LDFLAGS = @GST_LIB_LDFLAGS@
+GST_LICENSE = @GST_LICENSE@
+GST_LT_LDFLAGS = @GST_LT_LDFLAGS@
+GST_NET_CFLAGS = @GST_NET_CFLAGS@
+GST_NET_LIBS = @GST_NET_LIBS@
+GST_OBJCFLAGS = @GST_OBJCFLAGS@
+GST_OPTION_CFLAGS = @GST_OPTION_CFLAGS@
+GST_OPTION_CXXFLAGS = @GST_OPTION_CXXFLAGS@
+GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
+GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
+GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
+GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
+GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
+GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
+GST_PLUGINS_BAD_CXXFLAGS = @GST_PLUGINS_BAD_CXXFLAGS@
+GST_PLUGINS_BAD_OBJCFLAGS = @GST_PLUGINS_BAD_OBJCFLAGS@
+GST_PLUGINS_BASE_CFLAGS = @GST_PLUGINS_BASE_CFLAGS@
+GST_PLUGINS_BASE_DIR = @GST_PLUGINS_BASE_DIR@
+GST_PLUGINS_BASE_LIBS = @GST_PLUGINS_BASE_LIBS@
+GST_PLUGINS_DIR = @GST_PLUGINS_DIR@
+GST_PLUGINS_GOOD_CFLAGS = @GST_PLUGINS_GOOD_CFLAGS@
+GST_PLUGINS_GOOD_DIR = @GST_PLUGINS_GOOD_DIR@
+GST_PLUGINS_GOOD_LIBS = @GST_PLUGINS_GOOD_LIBS@
+GST_PLUGINS_LIBAV_CFLAGS = @GST_PLUGINS_LIBAV_CFLAGS@
+GST_PLUGINS_LIBAV_DIR = @GST_PLUGINS_LIBAV_DIR@
+GST_PLUGINS_LIBAV_LIBS = @GST_PLUGINS_LIBAV_LIBS@
+GST_PLUGINS_NONPORTED = @GST_PLUGINS_NONPORTED@
+GST_PLUGINS_SELECTED = @GST_PLUGINS_SELECTED@
+GST_PLUGINS_UGLY_CFLAGS = @GST_PLUGINS_UGLY_CFLAGS@
+GST_PLUGINS_UGLY_DIR = @GST_PLUGINS_UGLY_DIR@
+GST_PLUGINS_UGLY_LIBS = @GST_PLUGINS_UGLY_LIBS@
+GST_PLUGIN_LDFLAGS = @GST_PLUGIN_LDFLAGS@
+GST_PLUGIN_LIBTOOLFLAGS = @GST_PLUGIN_LIBTOOLFLAGS@
+GST_PREFIX = @GST_PREFIX@
+GST_REVISION = @GST_REVISION@
+GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
+GTK3_CFLAGS = @GTK3_CFLAGS@
+GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
+GTK3_GL_LIBS = @GTK3_GL_LIBS@
+GTK3_LIBS = @GTK3_LIBS@
+GTK3_WAYLAND_CFLAGS = @GTK3_WAYLAND_CFLAGS@
+GTK3_WAYLAND_LIBS = @GTK3_WAYLAND_LIBS@
+GTK3_X11_CFLAGS = @GTK3_X11_CFLAGS@
+GTK3_X11_LIBS = @GTK3_X11_LIBS@
+GTKDOC_CHECK = @GTKDOC_CHECK@
+GTKDOC_DEPS_CFLAGS = @GTKDOC_DEPS_CFLAGS@
+GTKDOC_DEPS_LIBS = @GTKDOC_DEPS_LIBS@
+GTKDOC_MKPDF = @GTKDOC_MKPDF@
+GTKDOC_REBASE = @GTKDOC_REBASE@
+GTK_BASE_DIR = @GTK_BASE_DIR@
+GTK_CFLAGS = @GTK_CFLAGS@
+GTK_LIBS = @GTK_LIBS@
+GTK_VERSION = @GTK_VERSION@
+G_UDEV_CFLAGS = @G_UDEV_CFLAGS@
+G_UDEV_LIBS = @G_UDEV_LIBS@
+HAVE_CLUTTER = @HAVE_CLUTTER@
+HAVE_CLUTTER_GLX = @HAVE_CLUTTER_GLX@
+HAVE_CLUTTER_X11 = @HAVE_CLUTTER_X11@
+HAVE_CXX = @HAVE_CXX@
+HAVE_DIRECT3D = @HAVE_DIRECT3D@
+HAVE_DIRECTSOUND = @HAVE_DIRECTSOUND@
+HAVE_DTS = @HAVE_DTS@
+HAVE_EGL = @HAVE_EGL@
+HAVE_FAAC = @HAVE_FAAC@
+HAVE_FAAD = @HAVE_FAAD@
+HAVE_FLITE = @HAVE_FLITE@
+HAVE_GL = @HAVE_GL@
+HAVE_GLES2 = @HAVE_GLES2@
+HAVE_GRAPHENE = @HAVE_GRAPHENE@
+HAVE_GSM = @HAVE_GSM@
+HAVE_GTK3 = @HAVE_GTK3@
+HAVE_JPEG = @HAVE_JPEG@
+HAVE_NAS = @HAVE_NAS@
+HAVE_OPENJPEG = @HAVE_OPENJPEG@
+HAVE_PNG = @HAVE_PNG@
+HAVE_SRTP = @HAVE_SRTP@
+HAVE_WASAPI = @HAVE_WASAPI@
+HAVE_WILDMIDI = @HAVE_WILDMIDI@
+HAVE_WINKS = @HAVE_WINKS@
+HAVE_WINSCREENCAP = @HAVE_WINSCREENCAP@
+HAVE_X11 = @HAVE_X11@
+HTML_DIR = @HTML_DIR@
+INSTALL = @INSTALL@
+INSTALL_DATA = @INSTALL_DATA@
+INSTALL_PROGRAM = @INSTALL_PROGRAM@
+INSTALL_SCRIPT = @INSTALL_SCRIPT@
+INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@
+INTLLIBS = @INTLLIBS@
+INTL_MACOSX_LIBS = @INTL_MACOSX_LIBS@
+INTROSPECTION_CFLAGS = @INTROSPECTION_CFLAGS@
+INTROSPECTION_COMPILER = @INTROSPECTION_COMPILER@
+INTROSPECTION_GENERATE = @INTROSPECTION_GENERATE@
+INTROSPECTION_GIRDIR = @INTROSPECTION_GIRDIR@
+INTROSPECTION_INIT = @INTROSPECTION_INIT@
+INTROSPECTION_LIBS = @INTROSPECTION_LIBS@
+INTROSPECTION_MAKEFILE = @INTROSPECTION_MAKEFILE@
+INTROSPECTION_SCANNER = @INTROSPECTION_SCANNER@
+INTROSPECTION_TYPELIBDIR = @INTROSPECTION_TYPELIBDIR@
+JPEG_LIBS = @JPEG_LIBS@
+KATE_CFLAGS = @KATE_CFLAGS@
+KATE_LIBS = @KATE_LIBS@
+LD = @LD@
+LDFLAGS = @LDFLAGS@
+LIBDC1394_CFLAGS = @LIBDC1394_CFLAGS@
+LIBDC1394_LIBS = @LIBDC1394_LIBS@
+LIBDE265_CFLAGS = @LIBDE265_CFLAGS@
+LIBDE265_LIBS = @LIBDE265_LIBS@
+LIBDIR = @LIBDIR@
+LIBGCRYPT_CFLAGS = @LIBGCRYPT_CFLAGS@
+LIBGCRYPT_CONFIG = @LIBGCRYPT_CONFIG@
+LIBGCRYPT_LIBS = @LIBGCRYPT_LIBS@
+LIBICONV = @LIBICONV@
+LIBINTL = @LIBINTL@
+LIBM = @LIBM@
+LIBMMS_CFLAGS = @LIBMMS_CFLAGS@
+LIBMMS_LIBS = @LIBMMS_LIBS@
+LIBOBJS = @LIBOBJS@
+LIBPNG_CFLAGS = @LIBPNG_CFLAGS@
+LIBPNG_LIBS = @LIBPNG_LIBS@
+LIBS = @LIBS@
+LIBTOOL = @LIBTOOL@
+LIBUDEV_CFLAGS = @LIBUDEV_CFLAGS@
+LIBUDEV_LIBS = @LIBUDEV_LIBS@
+LIBUSB_CFLAGS = @LIBUSB_CFLAGS@
+LIBUSB_LIBS = @LIBUSB_LIBS@
+LIBVISUAL_CFLAGS = @LIBVISUAL_CFLAGS@
+LIBVISUAL_LIBS = @LIBVISUAL_LIBS@
+LIBXML2_CFLAGS = @LIBXML2_CFLAGS@
+LIBXML2_LIBS = @LIBXML2_LIBS@
+LIPO = @LIPO@
+LN_S = @LN_S@
+LOCALEDIR = @LOCALEDIR@
+LRDF_CFLAGS = @LRDF_CFLAGS@
+LRDF_LIBS = @LRDF_LIBS@
+LTLIBICONV = @LTLIBICONV@
+LTLIBINTL = @LTLIBINTL@
+LTLIBOBJS = @LTLIBOBJS@
+MAINT = @MAINT@
+MAKEINFO = @MAKEINFO@
+MANIFEST_TOOL = @MANIFEST_TOOL@
+MIMIC_CFLAGS = @MIMIC_CFLAGS@
+MIMIC_LIBS = @MIMIC_LIBS@
+MJPEG_CFLAGS = @MJPEG_CFLAGS@
+MJPEG_LIBS = @MJPEG_LIBS@
+MKDIR_P = @MKDIR_P@
+MOC = @MOC@
+MODPLUG_CFLAGS = @MODPLUG_CFLAGS@
+MODPLUG_LIBS = @MODPLUG_LIBS@
+MPEG2ENC_CFLAGS = @MPEG2ENC_CFLAGS@
+MPEG2ENC_LIBS = @MPEG2ENC_LIBS@
+MPG123_CFLAGS = @MPG123_CFLAGS@
+MPG123_LIBS = @MPG123_LIBS@
+MPLEX_CFLAGS = @MPLEX_CFLAGS@
+MPLEX_LDFLAGS = @MPLEX_LDFLAGS@
+MPLEX_LIBS = @MPLEX_LIBS@
+MSGFMT = @MSGFMT@
+MSGFMT_015 = @MSGFMT_015@
+MSGMERGE = @MSGMERGE@
+MUSEPACK_LIBS = @MUSEPACK_LIBS@
+NAS_CFLAGS = @NAS_CFLAGS@
+NAS_LIBS = @NAS_LIBS@
+NEON_CFLAGS = @NEON_CFLAGS@
+NEON_LIBS = @NEON_LIBS@
+NETTLE_CFLAGS = @NETTLE_CFLAGS@
+NETTLE_LIBS = @NETTLE_LIBS@
+NM = @NM@
+NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
+OBJC = @OBJC@
+OBJCDEPMODE = @OBJCDEPMODE@
+OBJCFLAGS = @OBJCFLAGS@
+OBJDUMP = @OBJDUMP@
+OBJEXT = @OBJEXT@
+OFA_CFLAGS = @OFA_CFLAGS@
+OFA_LIBS = @OFA_LIBS@
+OPENAL_CFLAGS = @OPENAL_CFLAGS@
+OPENAL_LIBS = @OPENAL_LIBS@
+OPENCV_CFLAGS = @OPENCV_CFLAGS@
+OPENCV_LIBS = @OPENCV_LIBS@
+OPENCV_PREFIX = @OPENCV_PREFIX@
+OPENEXR_CFLAGS = @OPENEXR_CFLAGS@
+OPENEXR_LIBS = @OPENEXR_LIBS@
+OPENH264_CFLAGS = @OPENH264_CFLAGS@
+OPENH264_LIBS = @OPENH264_LIBS@
+OPENJPEG_CFLAGS = @OPENJPEG_CFLAGS@
+OPENJPEG_LIBS = @OPENJPEG_LIBS@
+OPENNI2_CFLAGS = @OPENNI2_CFLAGS@
+OPENNI2_LIBS = @OPENNI2_LIBS@
+OPENSSL_CFLAGS = @OPENSSL_CFLAGS@
+OPENSSL_LIBS = @OPENSSL_LIBS@
+OPUS_CFLAGS = @OPUS_CFLAGS@
+OPUS_LIBS = @OPUS_LIBS@
+ORCC = @ORCC@
+ORCC_FLAGS = @ORCC_FLAGS@
+ORC_CFLAGS = @ORC_CFLAGS@
+ORC_LIBS = @ORC_LIBS@
+OTOOL = @OTOOL@
+OTOOL64 = @OTOOL64@
+PACKAGE = @PACKAGE@
+PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@
+PACKAGE_NAME = @PACKAGE_NAME@
+PACKAGE_STRING = @PACKAGE_STRING@
+PACKAGE_TARNAME = @PACKAGE_TARNAME@
+PACKAGE_URL = @PACKAGE_URL@
+PACKAGE_VERSION = @PACKAGE_VERSION@
+PACKAGE_VERSION_MAJOR = @PACKAGE_VERSION_MAJOR@
+PACKAGE_VERSION_MICRO = @PACKAGE_VERSION_MICRO@
+PACKAGE_VERSION_MINOR = @PACKAGE_VERSION_MINOR@
+PACKAGE_VERSION_NANO = @PACKAGE_VERSION_NANO@
+PACKAGE_VERSION_RELEASE = @PACKAGE_VERSION_RELEASE@
+PATH_SEPARATOR = @PATH_SEPARATOR@
+PKG_CONFIG = @PKG_CONFIG@
+PLUGINDIR = @PLUGINDIR@
+POSUB = @POSUB@
+PROFILE_CFLAGS = @PROFILE_CFLAGS@
+PTHREAD_CC = @PTHREAD_CC@
+PTHREAD_CFLAGS = @PTHREAD_CFLAGS@
+PTHREAD_LIBS = @PTHREAD_LIBS@
+PVR_CFLAGS = @PVR_CFLAGS@
+PVR_LIBS = @PVR_LIBS@
+PYTHON = @PYTHON@
+PYTHON_EXEC_PREFIX = @PYTHON_EXEC_PREFIX@
+PYTHON_PLATFORM = @PYTHON_PLATFORM@
+PYTHON_PREFIX = @PYTHON_PREFIX@
+PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
+QT_CFLAGS = @QT_CFLAGS@
+QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
+QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
+QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
+QT_X11_CFLAGS = @QT_X11_CFLAGS@
+QT_X11_LIBS = @QT_X11_LIBS@
+RANLIB = @RANLIB@
+RCC = @RCC@
+RSVG_2_36_2_CFLAGS = @RSVG_2_36_2_CFLAGS@
+RSVG_2_36_2_LIBS = @RSVG_2_36_2_LIBS@
+RSVG_CFLAGS = @RSVG_CFLAGS@
+RSVG_LIBS = @RSVG_LIBS@
+RTMP_CFLAGS = @RTMP_CFLAGS@
+RTMP_LIBS = @RTMP_LIBS@
+SBC_CFLAGS = @SBC_CFLAGS@
+SBC_LIBS = @SBC_LIBS@
+SCHRO_CFLAGS = @SCHRO_CFLAGS@
+SCHRO_LIBS = @SCHRO_LIBS@
+SDL_CFLAGS = @SDL_CFLAGS@
+SDL_CLUTTER = @SDL_CLUTTER@
+SDL_CONFIG = @SDL_CONFIG@
+SDL_LIBS = @SDL_LIBS@
+SED = @SED@
+SET_MAKE = @SET_MAKE@
+SHELL = @SHELL@
+SHM_LIBS = @SHM_LIBS@
+SLV2_CFLAGS = @SLV2_CFLAGS@
+SLV2_LIBS = @SLV2_LIBS@
+SNDFILE_CFLAGS = @SNDFILE_CFLAGS@
+SNDFILE_LIBS = @SNDFILE_LIBS@
+SNDIO_LIBS = @SNDIO_LIBS@
+SOUNDTOUCH_CFLAGS = @SOUNDTOUCH_CFLAGS@
+SOUNDTOUCH_LIBS = @SOUNDTOUCH_LIBS@
+SPANDSP_CFLAGS = @SPANDSP_CFLAGS@
+SPANDSP_LIBS = @SPANDSP_LIBS@
+SPC_LIBS = @SPC_LIBS@
+SRTP_CFLAGS = @SRTP_CFLAGS@
+SRTP_LIBS = @SRTP_LIBS@
+SSH2_CFLAGS = @SSH2_CFLAGS@
+SSH2_LIBS = @SSH2_LIBS@
+STRIP = @STRIP@
+TELETEXTDEC_CFLAGS = @TELETEXTDEC_CFLAGS@
+TELETEXTDEC_LIBS = @TELETEXTDEC_LIBS@
+TIGER_CFLAGS = @TIGER_CFLAGS@
+TIGER_LIBS = @TIGER_LIBS@
+TIMIDITY_CFLAGS = @TIMIDITY_CFLAGS@
+TIMIDITY_LIBS = @TIMIDITY_LIBS@
+UIC = @UIC@
+USE_GLES2 = @USE_GLES2@
+USE_NLS = @USE_NLS@
+USE_OPENGL = @USE_OPENGL@
+VALGRIND_CFLAGS = @VALGRIND_CFLAGS@
+VALGRIND_LIBS = @VALGRIND_LIBS@
+VALGRIND_PATH = @VALGRIND_PATH@
+VDPAU_CFLAGS = @VDPAU_CFLAGS@
+VDPAU_LIBS = @VDPAU_LIBS@
+VERSION = @VERSION@
+VOAACENC_CFLAGS = @VOAACENC_CFLAGS@
+VOAACENC_LIBS = @VOAACENC_LIBS@
+VOAMRWBENC_CFLAGS = @VOAMRWBENC_CFLAGS@
+VOAMRWBENC_LIBS = @VOAMRWBENC_LIBS@
+WARNING_CFLAGS = @WARNING_CFLAGS@
+WARNING_CXXFLAGS = @WARNING_CXXFLAGS@
+WARNING_OBJCFLAGS = @WARNING_OBJCFLAGS@
+WASAPI_LIBS = @WASAPI_LIBS@
+WAYLAND_CFLAGS = @WAYLAND_CFLAGS@
+WAYLAND_EGL_CFLAGS = @WAYLAND_EGL_CFLAGS@
+WAYLAND_EGL_LIBS = @WAYLAND_EGL_LIBS@
+WAYLAND_LIBS = @WAYLAND_LIBS@
+WEBP_CFLAGS = @WEBP_CFLAGS@
+WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
+WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
+WILDMIDI_LIBS = @WILDMIDI_LIBS@
+WINKS_LIBS = @WINKS_LIBS@
+WINSCREENCAP_LIBS = @WINSCREENCAP_LIBS@
+WINSOCK2_LIBS = @WINSOCK2_LIBS@
+X11_CFLAGS = @X11_CFLAGS@
+X11_LIBS = @X11_LIBS@
+X265_CFLAGS = @X265_CFLAGS@
+X265_LIBS = @X265_LIBS@
+XCOMPOSITE_CFLAGS = @XCOMPOSITE_CFLAGS@
+XCOMPOSITE_LIBS = @XCOMPOSITE_LIBS@
+XGETTEXT = @XGETTEXT@
+XGETTEXT_015 = @XGETTEXT_015@
+XGETTEXT_EXTRA_OPTIONS = @XGETTEXT_EXTRA_OPTIONS@
+XVID_LIBS = @XVID_LIBS@
+X_CFLAGS = @X_CFLAGS@
+X_LIBS = @X_LIBS@
+ZBAR_CFLAGS = @ZBAR_CFLAGS@
+ZBAR_LIBS = @ZBAR_LIBS@
+abs_builddir = @abs_builddir@
+abs_srcdir = @abs_srcdir@
+abs_top_builddir = @abs_top_builddir@
+abs_top_srcdir = @abs_top_srcdir@
+ac_ct_AR = @ac_ct_AR@
+ac_ct_CC = @ac_ct_CC@
+ac_ct_CXX = @ac_ct_CXX@
+ac_ct_DUMPBIN = @ac_ct_DUMPBIN@
+ac_ct_OBJC = @ac_ct_OBJC@
+am__include = @am__include@
+am__leading_dot = @am__leading_dot@
+am__quote = @am__quote@
+am__tar = @am__tar@
+am__untar = @am__untar@
+ax_pthread_config = @ax_pthread_config@
+bindir = @bindir@
+build = @build@
+build_alias = @build_alias@
+build_cpu = @build_cpu@
+build_os = @build_os@
+build_vendor = @build_vendor@
+builddir = @builddir@
+datadir = @datadir@
+datarootdir = @datarootdir@
+docdir = @docdir@
+dvidir = @dvidir@
+exec_prefix = @exec_prefix@
+gsettingsschemadir = @gsettingsschemadir@
+host = @host@
+host_alias = @host_alias@
+host_cpu = @host_cpu@
+host_os = @host_os@
+host_vendor = @host_vendor@
+htmldir = @htmldir@
+includedir = @includedir@
+infodir = @infodir@
+install_sh = @install_sh@
+libdir = @libdir@
+libexecdir = @libexecdir@
+localedir = @localedir@
+localstatedir = @localstatedir@
+mandir = @mandir@
+mkdir_p = @mkdir_p@
+oldincludedir = @oldincludedir@
+pdfdir = @pdfdir@
+pkgpyexecdir = @pkgpyexecdir@
+pkgpythondir = @pkgpythondir@
+plugindir = @plugindir@
+prefix = @prefix@
+program_transform_name = @program_transform_name@
+psdir = @psdir@
+pyexecdir = @pyexecdir@
+pythondir = @pythondir@
+runstatedir = @runstatedir@
+sbindir = @sbindir@
+sharedstatedir = @sharedstatedir@
+srcdir = @srcdir@
+sysconfdir = @sysconfdir@
+target = @target@
+target_alias = @target_alias@
+target_cpu = @target_cpu@
+target_os = @target_os@
+target_vendor = @target_vendor@
+top_build_prefix = @top_build_prefix@
+top_builddir = @top_builddir@
+top_srcdir = @top_srcdir@
+wayland_scanner = @wayland_scanner@
+lib_LTLIBRARIES = libgstplayer-@GST_API_VERSION@.la
+libgstplayer_@GST_API_VERSION@_la_SOURCES = \
+	gstplayer.c  \
+	gstplayer-signal-dispatcher.c  \
+	gstplayer-video-renderer.c  \
+	gstplayer-media-info.c \
+	gstplayer-g-main-context-signal-dispatcher.c  \
+	gstplayer-video-overlay-video-renderer.c \
+	gstplayer-visualization.c
+
+libgstplayer_@GST_API_VERSION@_la_CFLAGS = \
+	-I$(top_srcdir)/gst-libs \
+	-I$(top_builddir)/gst-libs \
+	$(GST_PLUGINS_BASE_CFLAGS) \
+	$(GST_BASE_CFLAGS) \
+	$(GST_CFLAGS)
+
+libgstplayer_@GST_API_VERSION@_la_LDFLAGS = \
+	$(GST_LIB_LDFLAGS) \
+	$(GST_ALL_LDFLAGS) \
+	$(GST_LT_LDFLAGS)
+
+libgstplayer_@GST_API_VERSION@_la_LIBADD = \
+	$(GST_PLUGINS_BASE_LIBS) \
+	-lgstvideo-$(GST_API_VERSION) \
+	-lgstaudio-$(GST_API_VERSION) \
+	-lgsttag-$(GST_API_VERSION) \
+	-lgstpbutils-$(GST_API_VERSION) \
+	$(GST_LIBS) \
+	$(LIBM)
+
+libgstplayerdir = $(includedir)/gstreamer-@GST_API_VERSION@/gst/player
+noinst_HEADERS = \
+	gstplayer-signal-dispatcher-private.h \
+	gstplayer-video-renderer-private.h \
+	gstplayer-media-info-private.h
+
+libgstplayer_HEADERS = \
+	player.h \
+	gstplayer.h \
+	gstplayer-types.h \
+	gstplayer-signal-dispatcher.h \
+	gstplayer-video-renderer.h \
+	gstplayer-media-info.h \
+	gstplayer-g-main-context-signal-dispatcher.h  \
+	gstplayer-video-overlay-video-renderer.h \
+	gstplayer-visualization.h
+
+CLEANFILES = $(am__append_1)
+@HAVE_INTROSPECTION_TRUE@BUILT_GIRSOURCES = GstPlayer-@GST_API_VERSION@.gir
+@HAVE_INTROSPECTION_TRUE@gir_headers = $(patsubst %,$(srcdir)/%, $(libgstplayer_HEADERS))
+@HAVE_INTROSPECTION_TRUE@gir_sources = $(patsubst %,$(srcdir)/%, $(libgstplayer_@GST_API_VERSION@_la_SOURCES))
+
+# INTROSPECTION_GIRDIR/INTROSPECTION_TYPELIBDIR aren't the right place to
+# install anything - we need to install inside our prefix.
+@HAVE_INTROSPECTION_TRUE@girdir = $(datadir)/gir-1.0
+@HAVE_INTROSPECTION_TRUE@gir_DATA = $(BUILT_GIRSOURCES)
+@HAVE_INTROSPECTION_TRUE@typelibsdir = $(libdir)/girepository-1.0/
+@HAVE_INTROSPECTION_TRUE@typelibs_DATA = $(BUILT_GIRSOURCES:.gir=.typelib)
+all: all-am
+
+.SUFFIXES:
+.SUFFIXES: .c .lo .o .obj
+$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)
+	@for dep in $?; do \
+	  case '$(am__configure_deps)' in \
+	    *$$dep*) \
+	      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \
+	        && { if test -f $@; then exit 0; else break; fi; }; \
+	      exit 1;; \
+	  esac; \
+	done; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst-libs/gst/player/Makefile'; \
+	$(am__cd) $(top_srcdir) && \
+	  $(AUTOMAKE) --gnu gst-libs/gst/player/Makefile
+Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
+	@case '$?' in \
+	  *config.status*) \
+	    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \
+	  *) \
+	    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \
+	    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \
+	esac;
+
+$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+
+$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)
+	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
+$(am__aclocal_m4_deps):
+
+install-libLTLIBRARIES: $(lib_LTLIBRARIES)
+	@$(NORMAL_INSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	list2=; for p in $$list; do \
+	  if test -f $$p; then \
+	    list2="$$list2 $$p"; \
+	  else :; fi; \
+	done; \
+	test -z "$$list2" || { \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(libdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(libdir)" || exit 1; \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(libdir)"; \
+	}
+
+uninstall-libLTLIBRARIES:
+	@$(NORMAL_UNINSTALL)
+	@list='$(lib_LTLIBRARIES)'; test -n "$(libdir)" || list=; \
+	for p in $$list; do \
+	  $(am__strip_dir) \
+	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'"; \
+	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(libdir)/$$f"; \
+	done
+
+clean-libLTLIBRARIES:
+	-test -z "$(lib_LTLIBRARIES)" || rm -f $(lib_LTLIBRARIES)
+	@list='$(lib_LTLIBRARIES)'; \
+	locs=`for p in $$list; do echo $$p; done | \
+	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
+	      sort -u`; \
+	test -z "$$locs" || { \
+	  echo rm -f $${locs}; \
+	  rm -f $${locs}; \
+	}
+
+libgstplayer-@GST_API_VERSION@.la: $(libgstplayer_@GST_API_VERSION@_la_OBJECTS) $(libgstplayer_@GST_API_VERSION@_la_DEPENDENCIES) $(EXTRA_libgstplayer_@GST_API_VERSION@_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(libgstplayer_@GST_API_VERSION@_la_LINK) -rpath $(libdir) $(libgstplayer_@GST_API_VERSION@_la_OBJECTS) $(libgstplayer_@GST_API_VERSION@_la_LIBADD) $(LIBS)
+
+mostlyclean-compile:
+	-rm -f *.$(OBJEXT)
+
+distclean-compile:
+	-rm -f *.tab.c
+
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-g-main-context-signal-dispatcher.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-media-info.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-signal-dispatcher.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-video-overlay-video-renderer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-video-renderer.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-visualization.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer.Plo@am__quote@
+
+.c.o:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<
+
+.c.obj:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\
+@am__fastdepCC_TRUE@	$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`
+
+.c.lo:
+@am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\
+@am__fastdepCC_TRUE@	$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\
+@am__fastdepCC_TRUE@	$(am__mv) $$depbase.Tpo $$depbase.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
+
+libgstplayer_@GST_API_VERSION@_la-gstplayer.lo: gstplayer.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstplayer_@GST_API_VERSION@_la-gstplayer.lo -MD -MP -MF $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer.Tpo -c -o libgstplayer_@GST_API_VERSION@_la-gstplayer.lo `test -f 'gstplayer.c' || echo '$(srcdir)/'`gstplayer.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer.Tpo $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstplayer.c' object='libgstplayer_@GST_API_VERSION@_la-gstplayer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstplayer_@GST_API_VERSION@_la-gstplayer.lo `test -f 'gstplayer.c' || echo '$(srcdir)/'`gstplayer.c
+
+libgstplayer_@GST_API_VERSION@_la-gstplayer-signal-dispatcher.lo: gstplayer-signal-dispatcher.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstplayer_@GST_API_VERSION@_la-gstplayer-signal-dispatcher.lo -MD -MP -MF $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-signal-dispatcher.Tpo -c -o libgstplayer_@GST_API_VERSION@_la-gstplayer-signal-dispatcher.lo `test -f 'gstplayer-signal-dispatcher.c' || echo '$(srcdir)/'`gstplayer-signal-dispatcher.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-signal-dispatcher.Tpo $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-signal-dispatcher.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstplayer-signal-dispatcher.c' object='libgstplayer_@GST_API_VERSION@_la-gstplayer-signal-dispatcher.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstplayer_@GST_API_VERSION@_la-gstplayer-signal-dispatcher.lo `test -f 'gstplayer-signal-dispatcher.c' || echo '$(srcdir)/'`gstplayer-signal-dispatcher.c
+
+libgstplayer_@GST_API_VERSION@_la-gstplayer-video-renderer.lo: gstplayer-video-renderer.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstplayer_@GST_API_VERSION@_la-gstplayer-video-renderer.lo -MD -MP -MF $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-video-renderer.Tpo -c -o libgstplayer_@GST_API_VERSION@_la-gstplayer-video-renderer.lo `test -f 'gstplayer-video-renderer.c' || echo '$(srcdir)/'`gstplayer-video-renderer.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-video-renderer.Tpo $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-video-renderer.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstplayer-video-renderer.c' object='libgstplayer_@GST_API_VERSION@_la-gstplayer-video-renderer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstplayer_@GST_API_VERSION@_la-gstplayer-video-renderer.lo `test -f 'gstplayer-video-renderer.c' || echo '$(srcdir)/'`gstplayer-video-renderer.c
+
+libgstplayer_@GST_API_VERSION@_la-gstplayer-media-info.lo: gstplayer-media-info.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstplayer_@GST_API_VERSION@_la-gstplayer-media-info.lo -MD -MP -MF $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-media-info.Tpo -c -o libgstplayer_@GST_API_VERSION@_la-gstplayer-media-info.lo `test -f 'gstplayer-media-info.c' || echo '$(srcdir)/'`gstplayer-media-info.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-media-info.Tpo $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-media-info.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstplayer-media-info.c' object='libgstplayer_@GST_API_VERSION@_la-gstplayer-media-info.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstplayer_@GST_API_VERSION@_la-gstplayer-media-info.lo `test -f 'gstplayer-media-info.c' || echo '$(srcdir)/'`gstplayer-media-info.c
+
+libgstplayer_@GST_API_VERSION@_la-gstplayer-g-main-context-signal-dispatcher.lo: gstplayer-g-main-context-signal-dispatcher.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstplayer_@GST_API_VERSION@_la-gstplayer-g-main-context-signal-dispatcher.lo -MD -MP -MF $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-g-main-context-signal-dispatcher.Tpo -c -o libgstplayer_@GST_API_VERSION@_la-gstplayer-g-main-context-signal-dispatcher.lo `test -f 'gstplayer-g-main-context-signal-dispatcher.c' || echo '$(srcdir)/'`gstplayer-g-main-context-signal-dispatcher.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-g-main-context-signal-dispatcher.Tpo $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-g-main-context-signal-dispatcher.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstplayer-g-main-context-signal-dispatcher.c' object='libgstplayer_@GST_API_VERSION@_la-gstplayer-g-main-context-signal-dispatcher.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstplayer_@GST_API_VERSION@_la-gstplayer-g-main-context-signal-dispatcher.lo `test -f 'gstplayer-g-main-context-signal-dispatcher.c' || echo '$(srcdir)/'`gstplayer-g-main-context-signal-dispatcher.c
+
+libgstplayer_@GST_API_VERSION@_la-gstplayer-video-overlay-video-renderer.lo: gstplayer-video-overlay-video-renderer.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstplayer_@GST_API_VERSION@_la-gstplayer-video-overlay-video-renderer.lo -MD -MP -MF $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-video-overlay-video-renderer.Tpo -c -o libgstplayer_@GST_API_VERSION@_la-gstplayer-video-overlay-video-renderer.lo `test -f 'gstplayer-video-overlay-video-renderer.c' || echo '$(srcdir)/'`gstplayer-video-overlay-video-renderer.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-video-overlay-video-renderer.Tpo $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-video-overlay-video-renderer.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstplayer-video-overlay-video-renderer.c' object='libgstplayer_@GST_API_VERSION@_la-gstplayer-video-overlay-video-renderer.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstplayer_@GST_API_VERSION@_la-gstplayer-video-overlay-video-renderer.lo `test -f 'gstplayer-video-overlay-video-renderer.c' || echo '$(srcdir)/'`gstplayer-video-overlay-video-renderer.c
+
+libgstplayer_@GST_API_VERSION@_la-gstplayer-visualization.lo: gstplayer-visualization.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -MT libgstplayer_@GST_API_VERSION@_la-gstplayer-visualization.lo -MD -MP -MF $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-visualization.Tpo -c -o libgstplayer_@GST_API_VERSION@_la-gstplayer-visualization.lo `test -f 'gstplayer-visualization.c' || echo '$(srcdir)/'`gstplayer-visualization.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-visualization.Tpo $(DEPDIR)/libgstplayer_@GST_API_VERSION@_la-gstplayer-visualization.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstplayer-visualization.c' object='libgstplayer_@GST_API_VERSION@_la-gstplayer-visualization.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstplayer_@GST_API_VERSION@_la_CFLAGS) $(CFLAGS) -c -o libgstplayer_@GST_API_VERSION@_la-gstplayer-visualization.lo `test -f 'gstplayer-visualization.c' || echo '$(srcdir)/'`gstplayer-visualization.c
+
+mostlyclean-libtool:
+	-rm -f *.lo
+
+clean-libtool:
+	-rm -rf .libs _libs
+install-girDATA: $(gir_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(girdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(girdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(girdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(girdir)" || exit $$?; \
+	done
+
+uninstall-girDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(gir_DATA)'; test -n "$(girdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(girdir)'; $(am__uninstall_files_from_dir)
+install-typelibsDATA: $(typelibs_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(typelibsdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(typelibsdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(typelibsdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(typelibsdir)" || exit $$?; \
+	done
+
+uninstall-typelibsDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(typelibs_DATA)'; test -n "$(typelibsdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(typelibsdir)'; $(am__uninstall_files_from_dir)
+install-libgstplayerHEADERS: $(libgstplayer_HEADERS)
+	@$(NORMAL_INSTALL)
+	@list='$(libgstplayer_HEADERS)'; test -n "$(libgstplayerdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(libgstplayerdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(libgstplayerdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_HEADER) $$files '$(DESTDIR)$(libgstplayerdir)'"; \
+	  $(INSTALL_HEADER) $$files "$(DESTDIR)$(libgstplayerdir)" || exit $$?; \
+	done
+
+uninstall-libgstplayerHEADERS:
+	@$(NORMAL_UNINSTALL)
+	@list='$(libgstplayer_HEADERS)'; test -n "$(libgstplayerdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(libgstplayerdir)'; $(am__uninstall_files_from_dir)
+
+ID: $(am__tagged_files)
+	$(am__define_uniq_tagged_files); mkid -fID $$unique
+tags: tags-am
+TAGS: tags
+
+tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	set x; \
+	here=`pwd`; \
+	$(am__define_uniq_tagged_files); \
+	shift; \
+	if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \
+	  test -n "$$unique" || unique=$$empty_fix; \
+	  if test $$# -gt 0; then \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      "$$@" $$unique; \
+	  else \
+	    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \
+	      $$unique; \
+	  fi; \
+	fi
+ctags: ctags-am
+
+CTAGS: ctags
+ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)
+	$(am__define_uniq_tagged_files); \
+	test -z "$(CTAGS_ARGS)$$unique" \
+	  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \
+	     $$unique
+
+GTAGS:
+	here=`$(am__cd) $(top_builddir) && pwd` \
+	  && $(am__cd) $(top_srcdir) \
+	  && gtags -i $(GTAGS_ARGS) "$$here"
+cscopelist: cscopelist-am
+
+cscopelist-am: $(am__tagged_files)
+	list='$(am__tagged_files)'; \
+	case "$(srcdir)" in \
+	  [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \
+	  *) sdir=$(subdir)/$(srcdir) ;; \
+	esac; \
+	for i in $$list; do \
+	  if test -f "$$i"; then \
+	    echo "$(subdir)/$$i"; \
+	  else \
+	    echo "$$sdir/$$i"; \
+	  fi; \
+	done >> $(top_builddir)/cscope.files
+
+distclean-tags:
+	-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags
+
+distdir: $(DISTFILES)
+	@srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \
+	list='$(DISTFILES)'; \
+	  dist_files=`for file in $$list; do echo $$file; done | \
+	  sed -e "s|^$$srcdirstrip/||;t" \
+	      -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \
+	case $$dist_files in \
+	  */*) $(MKDIR_P) `echo "$$dist_files" | \
+			   sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \
+			   sort -u` ;; \
+	esac; \
+	for file in $$dist_files; do \
+	  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \
+	  if test -d $$d/$$file; then \
+	    dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \
+	    if test -d "$(distdir)/$$file"; then \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \
+	      cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \
+	      find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \
+	    fi; \
+	    cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \
+	  else \
+	    test -f "$(distdir)/$$file" \
+	    || cp -p $$d/$$file "$(distdir)/$$file" \
+	    || exit 1; \
+	  fi; \
+	done
+check-am: all-am
+check: check-am
+all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS)
+installdirs:
+	for dir in "$(DESTDIR)$(libdir)" "$(DESTDIR)$(girdir)" "$(DESTDIR)$(typelibsdir)" "$(DESTDIR)$(libgstplayerdir)"; do \
+	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
+	done
+install: install-am
+install-exec: install-exec-am
+install-data: install-data-am
+uninstall: uninstall-am
+
+install-am: all-am
+	@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am
+
+installcheck: installcheck-am
+install-strip:
+	if test -z '$(STRIP)'; then \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	      install; \
+	else \
+	  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \
+	    install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \
+	    "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \
+	fi
+mostlyclean-generic:
+
+clean-generic:
+	-test -z "$(CLEANFILES)" || rm -f $(CLEANFILES)
+
+distclean-generic:
+	-test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES)
+	-test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES)
+
+maintainer-clean-generic:
+	@echo "This command is intended for maintainers to use"
+	@echo "it deletes files that may require special tools to rebuild."
+clean: clean-am
+
+clean-am: clean-generic clean-libLTLIBRARIES clean-libtool \
+	mostlyclean-am
+
+distclean: distclean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+distclean-am: clean-am distclean-compile distclean-generic \
+	distclean-tags
+
+dvi: dvi-am
+
+dvi-am:
+
+html: html-am
+
+html-am:
+
+info: info-am
+
+info-am:
+
+install-data-am: install-girDATA install-libgstplayerHEADERS \
+	install-typelibsDATA
+
+install-dvi: install-dvi-am
+
+install-dvi-am:
+
+install-exec-am: install-libLTLIBRARIES
+
+install-html: install-html-am
+
+install-html-am:
+
+install-info: install-info-am
+
+install-info-am:
+
+install-man:
+
+install-pdf: install-pdf-am
+
+install-pdf-am:
+
+install-ps: install-ps-am
+
+install-ps-am:
+
+installcheck-am:
+
+maintainer-clean: maintainer-clean-am
+	-rm -rf ./$(DEPDIR)
+	-rm -f Makefile
+maintainer-clean-am: distclean-am maintainer-clean-generic
+
+mostlyclean: mostlyclean-am
+
+mostlyclean-am: mostlyclean-compile mostlyclean-generic \
+	mostlyclean-libtool
+
+pdf: pdf-am
+
+pdf-am:
+
+ps: ps-am
+
+ps-am:
+
+uninstall-am: uninstall-girDATA uninstall-libLTLIBRARIES \
+	uninstall-libgstplayerHEADERS uninstall-typelibsDATA
+
+.MAKE: install-am install-strip
+
+.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
+	clean-libLTLIBRARIES clean-libtool cscopelist-am ctags \
+	ctags-am distclean distclean-compile distclean-generic \
+	distclean-libtool distclean-tags distdir dvi dvi-am html \
+	html-am info info-am install install-am install-data \
+	install-data-am install-dvi install-dvi-am install-exec \
+	install-exec-am install-girDATA install-html install-html-am \
+	install-info install-info-am install-libLTLIBRARIES \
+	install-libgstplayerHEADERS install-man install-pdf \
+	install-pdf-am install-ps install-ps-am install-strip \
+	install-typelibsDATA installcheck installcheck-am installdirs \
+	maintainer-clean maintainer-clean-generic mostlyclean \
+	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
+	pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+	uninstall-girDATA uninstall-libLTLIBRARIES \
+	uninstall-libgstplayerHEADERS uninstall-typelibsDATA
+
+.PRECIOUS: Makefile
+
+
+@HAVE_INTROSPECTION_TRUE@GstPlayer-@GST_API_VERSION@.gir: $(INTROSPECTION_SCANNER) libgstplayer-@GST_API_VERSION@.la
+@HAVE_INTROSPECTION_TRUE@	$(AM_V_GEN)$(INTROSPECTION_SCANNER) -v --namespace GstPlayer \
+@HAVE_INTROSPECTION_TRUE@		--nsversion=@GST_API_VERSION@ \
+@HAVE_INTROSPECTION_TRUE@		--warn-all \
+@HAVE_INTROSPECTION_TRUE@		--strip-prefix=Gst \
+@HAVE_INTROSPECTION_TRUE@		-I$(top_srcdir)/gst-libs \
+@HAVE_INTROSPECTION_TRUE@		-I$(top_builddir)/gst-libs \
+@HAVE_INTROSPECTION_TRUE@		--c-include "gst/player/player.h" \
+@HAVE_INTROSPECTION_TRUE@		--add-include-path=$(top_builddir)/gst-libs \
+@HAVE_INTROSPECTION_TRUE@		--add-include-path=`$(PKG_CONFIG) --variable=girdir gstreamer-1.0` \
+@HAVE_INTROSPECTION_TRUE@		--library-path=$(top_builddir)/gst-libs \
+@HAVE_INTROSPECTION_TRUE@		--library=libgstplayer-@GST_API_VERSION@.la \
+@HAVE_INTROSPECTION_TRUE@		--include=Gst-@GST_API_VERSION@ \
+@HAVE_INTROSPECTION_TRUE@		--libtool="${LIBTOOL}" \
+@HAVE_INTROSPECTION_TRUE@		--pkg gstreamer-@GST_API_VERSION@ \
+@HAVE_INTROSPECTION_TRUE@		--pkg gstreamer-audio-@GST_API_VERSION@ \
+@HAVE_INTROSPECTION_TRUE@		--pkg gstreamer-video-@GST_API_VERSION@ \
+@HAVE_INTROSPECTION_TRUE@		--pkg gstreamer-tag-@GST_API_VERSION@ \
+@HAVE_INTROSPECTION_TRUE@		--pkg gstreamer-pbutils-@GST_API_VERSION@ \
+@HAVE_INTROSPECTION_TRUE@		--pkg-export gstreamer-player-@GST_API_VERSION@ \
+@HAVE_INTROSPECTION_TRUE@		--add-init-section="gst_init(NULL,NULL);" \
+@HAVE_INTROSPECTION_TRUE@		--output $@ \
+@HAVE_INTROSPECTION_TRUE@		$(gir_headers) \
+@HAVE_INTROSPECTION_TRUE@		$(gir_sources)
+
+@HAVE_INTROSPECTION_TRUE@%.typelib: %.gir $(INTROSPECTION_COMPILER)
+@HAVE_INTROSPECTION_TRUE@	$(AM_V_GEN)$(INTROSPECTION_COMPILER) \
+@HAVE_INTROSPECTION_TRUE@		--includedir=$(srcdir)/gst-libs \
+@HAVE_INTROSPECTION_TRUE@		--includedir=$(builddir)/gst-libs \
+@HAVE_INTROSPECTION_TRUE@		--includedir=`$(PKG_CONFIG) --variable=girdir gstreamer-1.0` \
+@HAVE_INTROSPECTION_TRUE@		$(INTROSPECTION_COMPILER_OPTS) $< -o $(@F)
+
+# Tell versions [3.59,3.63) of GNU make to not export all variables.
+# Otherwise a system limit (for SysV at least) may be exceeded.
+.NOEXPORT:
diff --git a/gst-libs/gst/player/gstplayer-g-main-context-signal-dispatcher.c b/gst-libs/gst/player/gstplayer-g-main-context-signal-dispatcher.c
new file mode 100644
index 0000000..c1f57d0
--- /dev/null
+++ b/gst-libs/gst/player/gstplayer-g-main-context-signal-dispatcher.c
@@ -0,0 +1,212 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.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.
+ */
+
+/**
+ * SECTION:gstplayer-gmaincontextsignaldispatcher
+ * @short_description: Player GLib MainContext dispatcher
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstplayer-g-main-context-signal-dispatcher.h"
+
+struct _GstPlayerGMainContextSignalDispatcher
+{
+  GObject parent;
+  GMainContext *application_context;
+};
+
+struct _GstPlayerGMainContextSignalDispatcherClass
+{
+  GObjectClass parent_class;
+};
+
+static void
+    gst_player_g_main_context_signal_dispatcher_interface_init
+    (GstPlayerSignalDispatcherInterface * iface);
+
+enum
+{
+  G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_0,
+  G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_APPLICATION_CONTEXT,
+  G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_LAST
+};
+
+G_DEFINE_TYPE_WITH_CODE (GstPlayerGMainContextSignalDispatcher,
+    gst_player_g_main_context_signal_dispatcher, G_TYPE_OBJECT,
+    G_IMPLEMENT_INTERFACE (GST_TYPE_PLAYER_SIGNAL_DISPATCHER,
+        gst_player_g_main_context_signal_dispatcher_interface_init));
+
+static GParamSpec
+    * g_main_context_signal_dispatcher_param_specs
+    [G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_LAST] = { NULL, };
+
+static void
+gst_player_g_main_context_signal_dispatcher_finalize (GObject * object)
+{
+  GstPlayerGMainContextSignalDispatcher *self =
+      GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER (object);
+
+  if (self->application_context)
+    g_main_context_unref (self->application_context);
+
+  G_OBJECT_CLASS
+      (gst_player_g_main_context_signal_dispatcher_parent_class)->finalize
+      (object);
+}
+
+static void
+gst_player_g_main_context_signal_dispatcher_set_property (GObject * object,
+    guint prop_id, const GValue * value, GParamSpec * pspec)
+{
+  GstPlayerGMainContextSignalDispatcher *self =
+      GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER (object);
+
+  switch (prop_id) {
+    case G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_APPLICATION_CONTEXT:
+      self->application_context = g_value_dup_boxed (value);
+      if (!self->application_context)
+        self->application_context = g_main_context_ref_thread_default ();
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+gst_player_g_main_context_signal_dispatcher_get_property (GObject * object,
+    guint prop_id, GValue * value, GParamSpec * pspec)
+{
+  GstPlayerGMainContextSignalDispatcher *self =
+      GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER (object);
+
+  switch (prop_id) {
+    case G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_APPLICATION_CONTEXT:
+      g_value_set_boxed (value, self->application_context);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+    gst_player_g_main_context_signal_dispatcher_class_init
+    (GstPlayerGMainContextSignalDispatcherClass * klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->finalize =
+      gst_player_g_main_context_signal_dispatcher_finalize;
+  gobject_class->set_property =
+      gst_player_g_main_context_signal_dispatcher_set_property;
+  gobject_class->get_property =
+      gst_player_g_main_context_signal_dispatcher_get_property;
+
+  g_main_context_signal_dispatcher_param_specs
+      [G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_APPLICATION_CONTEXT] =
+      g_param_spec_boxed ("application-context", "Application Context",
+      "Application GMainContext to dispatch signals to", G_TYPE_MAIN_CONTEXT,
+      G_PARAM_READWRITE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+
+  g_object_class_install_properties (gobject_class,
+      G_MAIN_CONTEXT_SIGNAL_DISPATCHER_PROP_LAST,
+      g_main_context_signal_dispatcher_param_specs);
+}
+
+static void
+    gst_player_g_main_context_signal_dispatcher_init
+    (G_GNUC_UNUSED GstPlayerGMainContextSignalDispatcher * self)
+{
+}
+
+typedef struct
+{
+  void (*emitter) (gpointer data);
+  gpointer data;
+  GDestroyNotify destroy;
+} GMainContextSignalDispatcherData;
+
+static gboolean
+g_main_context_signal_dispatcher_dispatch_gsourcefunc (gpointer user_data)
+{
+  GMainContextSignalDispatcherData *data = user_data;
+
+  data->emitter (data->data);
+
+  return G_SOURCE_REMOVE;
+}
+
+static void
+g_main_context_signal_dispatcher_dispatch_destroy (gpointer user_data)
+{
+  GMainContextSignalDispatcherData *data = user_data;
+
+  if (data->destroy)
+    data->destroy (data->data);
+  g_free (data);
+}
+
+static void
+gst_player_g_main_context_signal_dispatcher_dispatch (GstPlayerSignalDispatcher
+    * iface, G_GNUC_UNUSED GstPlayer * player, void (*emitter) (gpointer data),
+    gpointer data, GDestroyNotify destroy)
+{
+  GstPlayerGMainContextSignalDispatcher *self =
+      GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER (iface);
+  GMainContextSignalDispatcherData *gsourcefunc_data =
+      g_new (GMainContextSignalDispatcherData, 1);
+
+  gsourcefunc_data->emitter = emitter;
+  gsourcefunc_data->data = data;
+  gsourcefunc_data->destroy = destroy;
+
+  g_main_context_invoke_full (self->application_context,
+      G_PRIORITY_DEFAULT, g_main_context_signal_dispatcher_dispatch_gsourcefunc,
+      gsourcefunc_data, g_main_context_signal_dispatcher_dispatch_destroy);
+}
+
+static void
+    gst_player_g_main_context_signal_dispatcher_interface_init
+    (GstPlayerSignalDispatcherInterface * iface)
+{
+  iface->dispatch = gst_player_g_main_context_signal_dispatcher_dispatch;
+}
+
+/**
+ * gst_player_g_main_context_signal_dispatcher_new:
+ * @application_context: (allow-none): GMainContext to use or %NULL
+ *
+ * Creates a new GstPlayerSignalDispatcher that uses @application_context,
+ * or the thread default one if %NULL is used. See gst_player_new_full().
+ *
+ * Returns: (transfer full): the new GstPlayerSignalDispatcher
+ */
+GstPlayerSignalDispatcher *
+gst_player_g_main_context_signal_dispatcher_new (GMainContext *
+    application_context)
+{
+  return g_object_new (GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER,
+      "application-context", application_context, NULL);
+}
diff --git a/gst-libs/gst/player/gstplayer-g-main-context-signal-dispatcher.h b/gst-libs/gst/player/gstplayer-g-main-context-signal-dispatcher.h
new file mode 100644
index 0000000..431032b
--- /dev/null
+++ b/gst-libs/gst/player/gstplayer-g-main-context-signal-dispatcher.h
@@ -0,0 +1,48 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.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_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_H__
+#define __GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_H__
+
+#include <gst/player/gstplayer-types.h>
+#include <gst/player/gstplayer-signal-dispatcher.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstPlayerGMainContextSignalDispatcher
+    GstPlayerGMainContextSignalDispatcher;
+typedef struct _GstPlayerGMainContextSignalDispatcherClass
+    GstPlayerGMainContextSignalDispatcherClass;
+
+#define GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER             (gst_player_g_main_context_signal_dispatcher_get_type ())
+#define GST_IS_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER))
+#define GST_IS_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER))
+#define GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER, GstPlayerGMainContextSignalDispatcherClass))
+#define GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER, GstPlayerGMainContextSignalDispatcher))
+#define GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER, GstPlayerGMainContextSignalDispatcherClass))
+#define GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_CAST(obj)        ((GstPlayerGMainContextSignalDispatcher*)(obj))
+
+GType gst_player_g_main_context_signal_dispatcher_get_type (void);
+
+GstPlayerSignalDispatcher * gst_player_g_main_context_signal_dispatcher_new (GMainContext * application_context);
+
+G_END_DECLS
+
+#endif /* __GST_PLAYER_G_MAIN_CONTEXT_SIGNAL_DISPATCHER_H__ */
diff --git a/gst-libs/gst/player/gstplayer-media-info-private.h b/gst-libs/gst/player/gstplayer-media-info-private.h
new file mode 100644
index 0000000..b8757be
--- /dev/null
+++ b/gst-libs/gst/player/gstplayer-media-info-private.h
@@ -0,0 +1,125 @@
+/* GStreamer
+ *
+ * Copyright (C) 2015 Brijesh Singh <brijesh.ksingh@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 "gstplayer-media-info.h"
+
+#ifndef __GST_PLAYER_MEDIA_INFO_PRIVATE_H__
+#define __GST_PLAYER_MEDIA_INFO_PRIVATE_H__
+
+struct _GstPlayerStreamInfo
+{
+  GObject parent;
+
+  gchar *codec;
+
+  GstCaps *caps;
+  gint stream_index;
+  GstTagList  *tags;
+};
+
+struct _GstPlayerStreamInfoClass
+{
+  GObjectClass parent_class;
+};
+
+struct _GstPlayerSubtitleInfo
+{
+  GstPlayerStreamInfo  parent;
+
+  gchar *language;
+};
+
+struct _GstPlayerSubtitleInfoClass
+{
+  GstPlayerStreamInfoClass parent_class;
+};
+
+struct _GstPlayerAudioInfo
+{
+  GstPlayerStreamInfo  parent;
+
+  gint channels;
+  gint sample_rate;
+
+  guint bitrate;
+  guint max_bitrate;
+
+  gchar *language;
+};
+
+struct _GstPlayerAudioInfoClass
+{
+  GstPlayerStreamInfoClass parent_class;
+};
+
+struct _GstPlayerVideoInfo
+{
+  GstPlayerStreamInfo  parent;
+
+  gint width;
+  gint height;
+  gint framerate_num;
+  gint framerate_denom;
+  gint par_num;
+  gint par_denom;
+
+  guint bitrate;
+  guint max_bitrate;
+};
+
+struct _GstPlayerVideoInfoClass
+{
+  GstPlayerStreamInfoClass parent_class;
+};
+
+struct _GstPlayerMediaInfo
+{
+  GObject parent;
+
+  gchar *uri;
+  gchar *title;
+  gchar *container;
+  gboolean seekable;
+  GstTagList *tags;
+  GstSample *image_sample;
+
+  GList *stream_list;
+  GList *audio_stream_list;
+  GList *video_stream_list;
+  GList *subtitle_stream_list;
+
+  GstClockTime  duration;
+};
+
+struct _GstPlayerMediaInfoClass
+{
+  GObjectClass parent_class;
+};
+
+G_GNUC_INTERNAL GstPlayerMediaInfo*   gst_player_media_info_new
+                                      (const gchar *uri);
+G_GNUC_INTERNAL GstPlayerMediaInfo*   gst_player_media_info_copy
+                                      (GstPlayerMediaInfo *ref);
+G_GNUC_INTERNAL GstPlayerStreamInfo*  gst_player_stream_info_new
+                                      (gint stream_index, GType type);
+G_GNUC_INTERNAL GstPlayerStreamInfo*  gst_player_stream_info_copy
+                                      (GstPlayerStreamInfo *ref);
+
+#endif /* __GST_PLAYER_MEDIA_INFO_PRIVATE_H__ */
diff --git a/gst-libs/gst/player/gstplayer-media-info.c b/gst-libs/gst/player/gstplayer-media-info.c
new file mode 100644
index 0000000..a42b611
--- /dev/null
+++ b/gst-libs/gst/player/gstplayer-media-info.c
@@ -0,0 +1,775 @@
+/* GStreamer
+ *
+ * Copyright (C) 2015 Brijesh Singh <brijesh.ksingh@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.
+ */
+
+/**
+ * SECTION:gstplayer-mediainfo
+ * @short_description: Player Media Information
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstplayer-media-info.h"
+#include "gstplayer-media-info-private.h"
+
+/* Per-stream information */
+G_DEFINE_ABSTRACT_TYPE (GstPlayerStreamInfo, gst_player_stream_info,
+    G_TYPE_OBJECT);
+
+static void
+gst_player_stream_info_init (GstPlayerStreamInfo * sinfo)
+{
+  sinfo->stream_index = -1;
+}
+
+static void
+gst_player_stream_info_finalize (GObject * object)
+{
+  GstPlayerStreamInfo *sinfo = GST_PLAYER_STREAM_INFO (object);
+
+  g_free (sinfo->codec);
+
+  if (sinfo->caps)
+    gst_caps_unref (sinfo->caps);
+
+  if (sinfo->tags)
+    gst_tag_list_unref (sinfo->tags);
+
+  G_OBJECT_CLASS (gst_player_stream_info_parent_class)->finalize (object);
+}
+
+static void
+gst_player_stream_info_class_init (GstPlayerStreamInfoClass * klass)
+{
+  GObjectClass *gobject_class = (GObjectClass *) klass;
+
+  gobject_class->finalize = gst_player_stream_info_finalize;
+}
+
+/**
+ * gst_player_stream_info_get_index:
+ * @info: a #GstPlayerStreamInfo
+ *
+ * Function to get stream index from #GstPlayerStreamInfo instance.
+ *
+ * Returns: the stream index of this stream.
+ */
+gint
+gst_player_stream_info_get_index (const GstPlayerStreamInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_STREAM_INFO (info), -1);
+
+  return info->stream_index;
+}
+
+/**
+ * gst_player_stream_info_get_stream_type:
+ * @info: a #GstPlayerStreamInfo
+ *
+ * Function to return human readable name for the stream type
+ * of the given @info (ex: "audio", "video", "subtitle")
+ *
+ * Returns: a human readable name
+ */
+const gchar *
+gst_player_stream_info_get_stream_type (const GstPlayerStreamInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_STREAM_INFO (info), NULL);
+
+  if (GST_IS_PLAYER_VIDEO_INFO (info))
+    return "video";
+  else if (GST_IS_PLAYER_AUDIO_INFO (info))
+    return "audio";
+  else
+    return "subtitle";
+}
+
+/**
+ * gst_player_stream_info_get_tags:
+ * @info: a #GstPlayerStreamInfo
+ *
+ * Returns: (transfer none): the tags contained in this stream.
+ */
+GstTagList *
+gst_player_stream_info_get_tags (const GstPlayerStreamInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_STREAM_INFO (info), NULL);
+
+  return info->tags;
+}
+
+/**
+ * gst_player_stream_info_get_codec:
+ * @info: a #GstPlayerStreamInfo
+ *
+ * A string describing codec used in #GstPlayerStreamInfo.
+ *
+ * Returns: codec string or NULL on unknown.
+ */
+const gchar *
+gst_player_stream_info_get_codec (const GstPlayerStreamInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_STREAM_INFO (info), NULL);
+
+  return info->codec;
+}
+
+/**
+ * gst_player_stream_info_get_caps:
+ * @info: a #GstPlayerStreamInfo
+ *
+ * Returns: (transfer none): the #GstCaps of the stream.
+ */
+GstCaps *
+gst_player_stream_info_get_caps (const GstPlayerStreamInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_STREAM_INFO (info), NULL);
+
+  return info->caps;
+}
+
+/* Video information */
+G_DEFINE_TYPE (GstPlayerVideoInfo, gst_player_video_info,
+    GST_TYPE_PLAYER_STREAM_INFO);
+
+static void
+gst_player_video_info_init (GstPlayerVideoInfo * info)
+{
+  info->width = -1;
+  info->height = -1;
+  info->framerate_num = 0;
+  info->framerate_denom = 1;
+  info->par_num = 1;
+  info->par_denom = 1;
+}
+
+static void
+gst_player_video_info_class_init (G_GNUC_UNUSED GstPlayerVideoInfoClass * klass)
+{
+  /* nothing to do here */
+}
+
+/**
+ * gst_player_video_info_get_width:
+ * @info: a #GstPlayerVideoInfo
+ *
+ * Returns: the width of video in #GstPlayerVideoInfo.
+ */
+gint
+gst_player_video_info_get_width (const GstPlayerVideoInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_VIDEO_INFO (info), -1);
+
+  return info->width;
+}
+
+/**
+ * gst_player_video_info_get_height:
+ * @info: a #GstPlayerVideoInfo
+ *
+ * Returns: the height of video in #GstPlayerVideoInfo.
+ */
+gint
+gst_player_video_info_get_height (const GstPlayerVideoInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_VIDEO_INFO (info), -1);
+
+  return info->height;
+}
+
+/**
+ * gst_player_video_info_get_framerate_num:
+ * @info: a #GstPlayerVideoInfo
+ *
+ */
+void
+gst_player_video_info_get_framerate (const GstPlayerVideoInfo * info,
+    gint * fps_n, gint * fps_d)
+{
+  g_return_if_fail (GST_IS_PLAYER_VIDEO_INFO (info));
+
+  *fps_n = info->framerate_num;
+  *fps_d = info->framerate_denom;
+}
+
+/**
+ * gst_player_video_info_get_pixel_aspect_ratio:
+ * @info: a #GstPlayerVideoInfo
+ * @par_n: (out): numerator
+ * @par_d: (out): denominator
+ *
+ * Returns the pixel aspect ratio in @par_n and @par_d
+ *
+ */
+void
+gst_player_video_info_get_pixel_aspect_ratio (const GstPlayerVideoInfo * info,
+    guint * par_n, guint * par_d)
+{
+  g_return_if_fail (GST_IS_PLAYER_VIDEO_INFO (info));
+
+  *par_n = info->par_num;
+  *par_d = info->par_denom;
+}
+
+/**
+ * gst_player_video_info_get_bitrate:
+ * @info: a #GstPlayerVideoInfo
+ *
+ * Returns: the current bitrate of video in #GstPlayerVideoInfo.
+ */
+gint
+gst_player_video_info_get_bitrate (const GstPlayerVideoInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_VIDEO_INFO (info), -1);
+
+  return info->bitrate;
+}
+
+/**
+ * gst_player_video_info_get_max_bitrate:
+ * @info: a #GstPlayerVideoInfo
+ *
+ * Returns: the maximum bitrate of video in #GstPlayerVideoInfo.
+ */
+gint
+gst_player_video_info_get_max_bitrate (const GstPlayerVideoInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_VIDEO_INFO (info), -1);
+
+  return info->max_bitrate;
+}
+
+/* Audio information */
+G_DEFINE_TYPE (GstPlayerAudioInfo, gst_player_audio_info,
+    GST_TYPE_PLAYER_STREAM_INFO);
+
+static void
+gst_player_audio_info_init (GstPlayerAudioInfo * info)
+{
+  info->channels = 0;
+  info->sample_rate = 0;
+  info->bitrate = -1;
+  info->max_bitrate = -1;
+}
+
+static void
+gst_player_audio_info_finalize (GObject * object)
+{
+  GstPlayerAudioInfo *info = GST_PLAYER_AUDIO_INFO (object);
+
+  g_free (info->language);
+
+  G_OBJECT_CLASS (gst_player_audio_info_parent_class)->finalize (object);
+}
+
+static void
+gst_player_audio_info_class_init (GstPlayerAudioInfoClass * klass)
+{
+  GObjectClass *gobject_class = (GObjectClass *) klass;
+
+  gobject_class->finalize = gst_player_audio_info_finalize;
+}
+
+/**
+ * gst_player_audio_info_get_language:
+ * @info: a #GstPlayerAudioInfo
+ *
+ * Returns: the language of the stream, or NULL if unknown.
+ */
+const gchar *
+gst_player_audio_info_get_language (const GstPlayerAudioInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_AUDIO_INFO (info), NULL);
+
+  return info->language;
+}
+
+/**
+ * gst_player_audio_info_get_channels:
+ * @info: a #GstPlayerAudioInfo
+ *
+ * Returns: the number of audio channels in #GstPlayerAudioInfo.
+ */
+gint
+gst_player_audio_info_get_channels (const GstPlayerAudioInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_AUDIO_INFO (info), 0);
+
+  return info->channels;
+}
+
+/**
+ * gst_player_audio_info_get_sample_rate:
+ * @info: a #GstPlayerAudioInfo
+ *
+ * Returns: the audio sample rate in #GstPlayerAudioInfo.
+ */
+gint
+gst_player_audio_info_get_sample_rate (const GstPlayerAudioInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_AUDIO_INFO (info), 0);
+
+  return info->sample_rate;
+}
+
+/**
+ * gst_player_audio_info_get_bitrate:
+ * @info: a #GstPlayerAudioInfo
+ *
+ * Returns: the audio bitrate in #GstPlayerAudioInfo.
+ */
+gint
+gst_player_audio_info_get_bitrate (const GstPlayerAudioInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_AUDIO_INFO (info), -1);
+
+  return info->bitrate;
+}
+
+/**
+ * gst_player_audio_info_get_max_bitrate:
+ * @info: a #GstPlayerAudioInfo
+ *
+ * Returns: the audio maximum bitrate in #GstPlayerAudioInfo.
+ */
+gint
+gst_player_audio_info_get_max_bitrate (const GstPlayerAudioInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_AUDIO_INFO (info), -1);
+
+  return info->max_bitrate;
+}
+
+/* Subtitle information */
+G_DEFINE_TYPE (GstPlayerSubtitleInfo, gst_player_subtitle_info,
+    GST_TYPE_PLAYER_STREAM_INFO);
+
+static void
+gst_player_subtitle_info_init (G_GNUC_UNUSED GstPlayerSubtitleInfo * info)
+{
+  /* nothing to do */
+}
+
+static void
+gst_player_subtitle_info_finalize (GObject * object)
+{
+  GstPlayerSubtitleInfo *info = GST_PLAYER_SUBTITLE_INFO (object);
+
+  g_free (info->language);
+
+  G_OBJECT_CLASS (gst_player_subtitle_info_parent_class)->finalize (object);
+}
+
+static void
+gst_player_subtitle_info_class_init (GstPlayerSubtitleInfoClass * klass)
+{
+  GObjectClass *gobject_class = (GObjectClass *) klass;
+
+  gobject_class->finalize = gst_player_subtitle_info_finalize;
+}
+
+/**
+ * gst_player_subtitle_info_get_language:
+ * @info: a #GstPlayerSubtitleInfo
+ *
+ * Returns: the language of the stream, or NULL if unknown.
+ */
+const gchar *
+gst_player_subtitle_info_get_language (const GstPlayerSubtitleInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_SUBTITLE_INFO (info), NULL);
+
+  return info->language;
+}
+
+/* Global media information */
+G_DEFINE_TYPE (GstPlayerMediaInfo, gst_player_media_info, G_TYPE_OBJECT);
+
+static void
+gst_player_media_info_init (GstPlayerMediaInfo * info)
+{
+  info->duration = -1;
+  info->seekable = FALSE;
+}
+
+static void
+gst_player_media_info_finalize (GObject * object)
+{
+  GstPlayerMediaInfo *info = GST_PLAYER_MEDIA_INFO (object);
+
+  g_free (info->uri);
+
+  if (info->tags)
+    gst_tag_list_unref (info->tags);
+
+  g_free (info->title);
+
+  g_free (info->container);
+
+  if (info->image_sample)
+    gst_sample_unref (info->image_sample);
+
+  if (info->audio_stream_list)
+    g_list_free (info->audio_stream_list);
+
+  if (info->video_stream_list)
+    g_list_free (info->video_stream_list);
+
+  if (info->subtitle_stream_list)
+    g_list_free (info->subtitle_stream_list);
+
+  if (info->stream_list)
+    g_list_free_full (info->stream_list, g_object_unref);
+
+  G_OBJECT_CLASS (gst_player_media_info_parent_class)->finalize (object);
+}
+
+static void
+gst_player_media_info_class_init (GstPlayerMediaInfoClass * klass)
+{
+  GObjectClass *oclass = (GObjectClass *) klass;
+
+  oclass->finalize = gst_player_media_info_finalize;
+}
+
+static GstPlayerVideoInfo *
+gst_player_video_info_new (void)
+{
+  return g_object_new (GST_TYPE_PLAYER_VIDEO_INFO, NULL);
+}
+
+static GstPlayerAudioInfo *
+gst_player_audio_info_new (void)
+{
+  return g_object_new (GST_TYPE_PLAYER_AUDIO_INFO, NULL);
+}
+
+static GstPlayerSubtitleInfo *
+gst_player_subtitle_info_new (void)
+{
+  return g_object_new (GST_TYPE_PLAYER_SUBTITLE_INFO, NULL);
+}
+
+static GstPlayerStreamInfo *
+gst_player_video_info_copy (GstPlayerVideoInfo * ref)
+{
+  GstPlayerVideoInfo *ret;
+
+  ret = gst_player_video_info_new ();
+
+  ret->width = ref->width;
+  ret->height = ref->height;
+  ret->framerate_num = ref->framerate_num;
+  ret->framerate_denom = ref->framerate_denom;
+  ret->par_num = ref->par_num;
+  ret->par_denom = ref->par_denom;
+  ret->bitrate = ref->bitrate;
+  ret->max_bitrate = ref->max_bitrate;
+
+  return (GstPlayerStreamInfo *) ret;
+}
+
+static GstPlayerStreamInfo *
+gst_player_audio_info_copy (GstPlayerAudioInfo * ref)
+{
+  GstPlayerAudioInfo *ret;
+
+  ret = gst_player_audio_info_new ();
+
+  ret->sample_rate = ref->sample_rate;
+  ret->channels = ref->channels;
+  ret->bitrate = ref->bitrate;
+  ret->max_bitrate = ref->max_bitrate;
+
+  if (ref->language)
+    ret->language = g_strdup (ref->language);
+
+  return (GstPlayerStreamInfo *) ret;
+}
+
+static GstPlayerStreamInfo *
+gst_player_subtitle_info_copy (GstPlayerSubtitleInfo * ref)
+{
+  GstPlayerSubtitleInfo *ret;
+
+  ret = gst_player_subtitle_info_new ();
+  if (ref->language)
+    ret->language = g_strdup (ref->language);
+
+  return (GstPlayerStreamInfo *) ret;
+}
+
+GstPlayerStreamInfo *
+gst_player_stream_info_copy (GstPlayerStreamInfo * ref)
+{
+  GstPlayerStreamInfo *info = NULL;
+
+  if (!ref)
+    return NULL;
+
+  if (GST_IS_PLAYER_VIDEO_INFO (ref))
+    info = gst_player_video_info_copy ((GstPlayerVideoInfo *) ref);
+  else if (GST_IS_PLAYER_AUDIO_INFO (ref))
+    info = gst_player_audio_info_copy ((GstPlayerAudioInfo *) ref);
+  else
+    info = gst_player_subtitle_info_copy ((GstPlayerSubtitleInfo *) ref);
+
+  info->stream_index = ref->stream_index;
+  if (ref->tags)
+    info->tags = gst_tag_list_ref (ref->tags);
+  if (ref->caps)
+    info->caps = gst_caps_copy (ref->caps);
+  if (ref->codec)
+    info->codec = g_strdup (ref->codec);
+
+  return info;
+}
+
+GstPlayerMediaInfo *
+gst_player_media_info_copy (GstPlayerMediaInfo * ref)
+{
+  GList *l;
+  GstPlayerMediaInfo *info;
+
+  if (!ref)
+    return NULL;
+
+  info = gst_player_media_info_new (ref->uri);
+  info->duration = ref->duration;
+  info->seekable = ref->seekable;
+  if (ref->tags)
+    info->tags = gst_tag_list_ref (ref->tags);
+  if (ref->title)
+    info->title = g_strdup (ref->title);
+  if (ref->container)
+    info->container = g_strdup (ref->container);
+  if (ref->image_sample)
+    info->image_sample = gst_sample_ref (ref->image_sample);
+
+  for (l = ref->stream_list; l != NULL; l = l->next) {
+    GstPlayerStreamInfo *s;
+
+    s = gst_player_stream_info_copy ((GstPlayerStreamInfo *) l->data);
+    info->stream_list = g_list_append (info->stream_list, s);
+
+    if (GST_IS_PLAYER_AUDIO_INFO (s))
+      info->audio_stream_list = g_list_append (info->audio_stream_list, s);
+    else if (GST_IS_PLAYER_VIDEO_INFO (s))
+      info->video_stream_list = g_list_append (info->video_stream_list, s);
+    else
+      info->subtitle_stream_list =
+          g_list_append (info->subtitle_stream_list, s);
+  }
+
+  return info;
+}
+
+GstPlayerStreamInfo *
+gst_player_stream_info_new (gint stream_index, GType type)
+{
+  GstPlayerStreamInfo *info = NULL;
+
+  if (type == GST_TYPE_PLAYER_AUDIO_INFO)
+    info = (GstPlayerStreamInfo *) gst_player_audio_info_new ();
+  else if (type == GST_TYPE_PLAYER_VIDEO_INFO)
+    info = (GstPlayerStreamInfo *) gst_player_video_info_new ();
+  else
+    info = (GstPlayerStreamInfo *) gst_player_subtitle_info_new ();
+
+  info->stream_index = stream_index;
+
+  return info;
+}
+
+GstPlayerMediaInfo *
+gst_player_media_info_new (const gchar * uri)
+{
+  GstPlayerMediaInfo *info;
+
+  g_return_val_if_fail (uri != NULL, NULL);
+
+  info = g_object_new (GST_TYPE_PLAYER_MEDIA_INFO, NULL);
+  info->uri = g_strdup (uri);
+
+  return info;
+}
+
+/**
+ * gst_player_media_info_get_uri:
+ * @info: a #GstPlayerMediaInfo
+ *
+ * Returns: the URI associated with #GstPlayerMediaInfo.
+ */
+const gchar *
+gst_player_media_info_get_uri (const GstPlayerMediaInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_MEDIA_INFO (info), NULL);
+
+  return info->uri;
+}
+
+/**
+ * gst_player_media_info_is_seekable:
+ * @info: a #GstPlayerMediaInfo
+ *
+ * Returns: %TRUE if the media is seekable.
+ */
+gboolean
+gst_player_media_info_is_seekable (const GstPlayerMediaInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_MEDIA_INFO (info), FALSE);
+
+  return info->seekable;
+}
+
+/**
+ * gst_player_media_info_get_stream_list:
+ * @info: a #GstPlayerMediaInfo
+ *
+ * Returns: (transfer none) (element-type GstPlayerStreamInfo): A #GList of
+ * matching #GstPlayerStreamInfo.
+ */
+GList *
+gst_player_media_info_get_stream_list (const GstPlayerMediaInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_MEDIA_INFO (info), NULL);
+
+  return info->stream_list;
+}
+
+/**
+ * gst_player_get_video_streams:
+ * @info: a #GstPlayerMediaInfo
+ *
+ * Returns: (transfer none) (element-type GstPlayerVideoInfo): A #GList of
+ * matching #GstPlayerVideoInfo.
+ */
+GList *
+gst_player_get_video_streams (const GstPlayerMediaInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_MEDIA_INFO (info), NULL);
+
+  return info->video_stream_list;
+}
+
+/**
+ * gst_player_get_subtitle_streams:
+ * @info: a #GstPlayerMediaInfo
+ *
+ * Returns: (transfer none) (element-type GstPlayerSubtitleInfo): A #GList of
+ * matching #GstPlayerSubtitleInfo.
+ */
+GList *
+gst_player_get_subtitle_streams (const GstPlayerMediaInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_MEDIA_INFO (info), NULL);
+
+  return info->subtitle_stream_list;
+}
+
+/**
+ * gst_player_get_audio_streams:
+ * @info: a #GstPlayerMediaInfo
+ *
+ * Returns: (transfer none) (element-type GstPlayerAudioInfo): A #GList of
+ * matching #GstPlayerAudioInfo.
+ */
+GList *
+gst_player_get_audio_streams (const GstPlayerMediaInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_MEDIA_INFO (info), NULL);
+
+  return info->audio_stream_list;
+}
+
+/**
+ * gst_player_media_info_get_duration:
+ * @info: a #GstPlayerMediaInfo
+ *
+ * Returns: duration of the media.
+ */
+GstClockTime
+gst_player_media_info_get_duration (const GstPlayerMediaInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_MEDIA_INFO (info), -1);
+
+  return info->duration;
+}
+
+/**
+ * gst_player_media_info_get_tags:
+ * @info: a #GstPlayerMediaInfo
+ *
+ * Returns: (transfer none): the tags contained in media info.
+ */
+GstTagList *
+gst_player_media_info_get_tags (const GstPlayerMediaInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_MEDIA_INFO (info), NULL);
+
+  return info->tags;
+}
+
+/**
+ * gst_player_media_info_get_title:
+ * @info: a #GstPlayerMediaInfo
+ *
+ * Returns: the media title.
+ */
+const gchar *
+gst_player_media_info_get_title (const GstPlayerMediaInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_MEDIA_INFO (info), NULL);
+
+  return info->title;
+}
+
+/**
+ * gst_player_media_info_get_container_format:
+ * @info: a #GstPlayerMediaInfo
+ *
+ * Returns: the container format.
+ */
+const gchar *
+gst_player_media_info_get_container_format (const GstPlayerMediaInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_MEDIA_INFO (info), NULL);
+
+  return info->container;
+}
+
+/**
+ * gst_player_media_info_get_image_sample:
+ * @info: a #GstPlayerMediaInfo
+ *
+ * Function to get the image (or preview-image) stored in taglist.
+ * Application can use gst_sample_*_() API's to get caps, buffer etc.
+ *
+ * Returns: (transfer none): GstSample or NULL.
+ */
+GstSample *
+gst_player_media_info_get_image_sample (const GstPlayerMediaInfo * info)
+{
+  g_return_val_if_fail (GST_IS_PLAYER_MEDIA_INFO (info), NULL);
+
+  return info->image_sample;
+}
diff --git a/gst-libs/gst/player/gstplayer-media-info.h b/gst-libs/gst/player/gstplayer-media-info.h
new file mode 100644
index 0000000..a458b75
--- /dev/null
+++ b/gst-libs/gst/player/gstplayer-media-info.h
@@ -0,0 +1,192 @@
+/* GStreamer
+ *
+ * Copyright (C) 2015 Brijesh Singh <brijesh.ksingh@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_PLAYER_MEDIA_INFO_H__
+#define __GST_PLAYER_MEDIA_INFO_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_PLAYER_STREAM_INFO \
+  (gst_player_stream_info_get_type ())
+#define GST_PLAYER_STREAM_INFO(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PLAYER_STREAM_INFO,GstPlayerStreamInfo))
+#define GST_PLAYER_STREAM_INFO_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PLAYER_STREAM_INFO,GstPlayerStreamInfo))
+#define GST_IS_PLAYER_STREAM_INFO(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PLAYER_STREAM_INFO))
+#define GST_IS_PLAYER_STREAM_INFO_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PLAYER_STREAM_INFO))
+
+/**
+ * GstPlayerStreamInfo:
+ *
+ * Base structure for information concering a media stream. Depending on
+ * the stream type, one can find more media-specific information in
+ * #GstPlayerVideoInfo, #GstPlayerAudioInfo, #GstPlayerSubtitleInfo.
+ */
+typedef struct _GstPlayerStreamInfo GstPlayerStreamInfo;
+typedef struct _GstPlayerStreamInfoClass GstPlayerStreamInfoClass;
+GType gst_player_stream_info_get_type (void);
+
+gint          gst_player_stream_info_get_index
+                (const GstPlayerStreamInfo *info);
+const gchar*  gst_player_stream_info_get_stream_type
+                (const GstPlayerStreamInfo *info);
+GstTagList*   gst_player_stream_info_get_tags
+                (const GstPlayerStreamInfo *info);
+GstCaps*      gst_player_stream_info_get_caps
+                (const GstPlayerStreamInfo *info);
+const gchar*  gst_player_stream_info_get_codec
+                (const GstPlayerStreamInfo *info);
+
+#define GST_TYPE_PLAYER_VIDEO_INFO \
+  (gst_player_video_info_get_type ())
+#define GST_PLAYER_VIDEO_INFO(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PLAYER_VIDEO_INFO, GstPlayerVideoInfo))
+#define GST_PLAYER_VIDEO_INFO_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((obj),GST_TYPE_PLAYER_VIDEO_INFO, GstPlayerVideoInfoClass))
+#define GST_IS_PLAYER_VIDEO_INFO(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PLAYER_VIDEO_INFO))
+#define GST_IS_PLAYER_VIDEO_INFO_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE((obj),GST_TYPE_PLAYER_VIDEO_INFO))
+
+/**
+ * GstPlayerVideoInfo:
+ *
+ * #GstPlayerStreamInfo specific to video streams.
+ */
+typedef struct _GstPlayerVideoInfo GstPlayerVideoInfo;
+typedef struct _GstPlayerVideoInfoClass GstPlayerVideoInfoClass;
+GType gst_player_video_info_get_type (void);
+
+gint          gst_player_video_info_get_bitrate
+                (const GstPlayerVideoInfo* info);
+gint          gst_player_video_info_get_max_bitrate
+                (const GstPlayerVideoInfo* info);
+gint          gst_player_video_info_get_width
+                (const GstPlayerVideoInfo* info);
+gint          gst_player_video_info_get_height
+                (const GstPlayerVideoInfo* info);
+void          gst_player_video_info_get_framerate
+                (const GstPlayerVideoInfo* info, gint *fps_n, gint *fps_d);
+void          gst_player_video_info_get_pixel_aspect_ratio
+                (const GstPlayerVideoInfo* info, guint *par_n, guint *par_d);
+
+#define GST_TYPE_PLAYER_AUDIO_INFO \
+  (gst_player_audio_info_get_type ())
+#define GST_PLAYER_AUDIO_INFO(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PLAYER_AUDIO_INFO, GstPlayerAudioInfo))
+#define GST_PLAYER_AUDIO_INFO_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PLAYER_AUDIO_INFO, GstPlayerAudioInfoClass))
+#define GST_IS_PLAYER_AUDIO_INFO(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PLAYER_AUDIO_INFO))
+#define GST_IS_PLAYER_AUDIO_INFO_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PLAYER_AUDIO_INFO))
+
+/**
+ * GstPlayerAudioInfo:
+ *
+ * #GstPlayerStreamInfo specific to audio streams.
+ */
+typedef struct _GstPlayerAudioInfo GstPlayerAudioInfo;
+typedef struct _GstPlayerAudioInfoClass GstPlayerAudioInfoClass;
+GType gst_player_audio_info_get_type (void);
+
+gint          gst_player_audio_info_get_channels
+                (const GstPlayerAudioInfo* info);
+gint          gst_player_audio_info_get_sample_rate
+                (const GstPlayerAudioInfo* info);
+gint          gst_player_audio_info_get_bitrate
+                (const GstPlayerAudioInfo* info);
+gint          gst_player_audio_info_get_max_bitrate
+                (const GstPlayerAudioInfo* info);
+const gchar*  gst_player_audio_info_get_language
+                (const GstPlayerAudioInfo* info);
+
+#define GST_TYPE_PLAYER_SUBTITLE_INFO \
+  (gst_player_subtitle_info_get_type ())
+#define GST_PLAYER_SUBTITLE_INFO(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PLAYER_SUBTITLE_INFO, GstPlayerSubtitleInfo))
+#define GST_PLAYER_SUBTITLE_INFO_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PLAYER_SUBTITLE_INFO,GstPlayerSubtitleInfoClass))
+#define GST_IS_PLAYER_SUBTITLE_INFO(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PLAYER_SUBTITLE_INFO))
+#define GST_IS_PLAYER_SUBTITLE_INFO_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PLAYER_SUBTITLE_INFO))
+
+/**
+ * GstPlayerSubtitleInfo:
+ *
+ * #GstPlayerStreamInfo specific to subtitle streams.
+ */
+typedef struct _GstPlayerSubtitleInfo GstPlayerSubtitleInfo;
+typedef struct _GstPlayerSubtitleInfoClass GstPlayerSubtitleInfoClass;
+GType gst_player_subtitle_info_get_type (void);
+
+const gchar*  gst_player_subtitle_info_get_language
+                (const GstPlayerSubtitleInfo* info);
+
+#define GST_TYPE_PLAYER_MEDIA_INFO \
+  (gst_player_media_info_get_type())
+#define GST_PLAYER_MEDIA_INFO(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_PLAYER_MEDIA_INFO,GstPlayerMediaInfo))
+#define GST_PLAYER_MEDIA_INFO_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_PLAYER_MEDIA_INFO,GstPlayerMediaInfoClass))
+#define GST_IS_PLAYER_MEDIA_INFO(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_PLAYER_MEDIA_INFO))
+#define GST_IS_PLAYER_MEDIA_INFO_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_PLAYER_MEDIA_INFO))
+
+/**
+ * GstPlayerMediaInfo:
+ *
+ * Structure containing the media information of a URI.
+ */
+typedef struct _GstPlayerMediaInfo GstPlayerMediaInfo;
+typedef struct _GstPlayerMediaInfoClass GstPlayerMediaInfoClass;
+GType gst_player_media_info_get_type (void);
+
+const gchar*  gst_player_media_info_get_uri
+                (const GstPlayerMediaInfo *info);
+gboolean      gst_player_media_info_is_seekable
+                (const GstPlayerMediaInfo *info);
+GstClockTime  gst_player_media_info_get_duration
+                (const GstPlayerMediaInfo *info);
+GList*        gst_player_media_info_get_stream_list
+                (const GstPlayerMediaInfo *info);
+GList*        gst_player_get_video_streams
+                (const GstPlayerMediaInfo *info);
+GList*        gst_player_get_audio_streams
+                (const GstPlayerMediaInfo *info);
+GList*        gst_player_get_subtitle_streams
+                (const GstPlayerMediaInfo *info);
+GstTagList*   gst_player_media_info_get_tags
+                (const GstPlayerMediaInfo *info);
+const gchar*  gst_player_media_info_get_title
+                (const GstPlayerMediaInfo *info);
+const gchar*  gst_player_media_info_get_container_format
+                (const GstPlayerMediaInfo *info);
+GstSample*    gst_player_media_info_get_image_sample
+                (const GstPlayerMediaInfo *info);
+G_END_DECLS
+
+#endif /* __GST_PLAYER_MEDIA_INFO_H */
diff --git a/gst-libs/gst/player/gstplayer-signal-dispatcher-private.h b/gst-libs/gst/player/gstplayer-signal-dispatcher-private.h
new file mode 100644
index 0000000..7399161
--- /dev/null
+++ b/gst-libs/gst/player/gstplayer-signal-dispatcher-private.h
@@ -0,0 +1,34 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.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_PLAYER_SIGNAL_DISPATCHER_PRIVATE_H__
+#define __GST_PLAYER_SIGNAL_DISPATCHER_PRIVATE_H__
+
+#include <gst/player/gstplayer-signal-dispatcher.h>
+
+G_BEGIN_DECLS
+
+G_GNUC_INTERNAL void gst_player_signal_dispatcher_dispatch (GstPlayerSignalDispatcher * self,
+    GstPlayer * player, GstPlayerSignalDispatcherFunc emitter, gpointer data,
+    GDestroyNotify destroy);
+
+G_END_DECLS
+
+#endif /* __GST_PLAYER_SIGNAL_DISPATCHER_PRIVATE_H__ */
diff --git a/gst-libs/gst/player/gstplayer-signal-dispatcher.c b/gst-libs/gst/player/gstplayer-signal-dispatcher.c
new file mode 100644
index 0000000..33e7b73
--- /dev/null
+++ b/gst-libs/gst/player/gstplayer-signal-dispatcher.c
@@ -0,0 +1,57 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.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 "gstplayer-signal-dispatcher.h"
+#include "gstplayer-signal-dispatcher-private.h"
+
+G_DEFINE_INTERFACE (GstPlayerSignalDispatcher, gst_player_signal_dispatcher,
+    G_TYPE_OBJECT);
+
+static void
+gst_player_signal_dispatcher_default_init (G_GNUC_UNUSED
+    GstPlayerSignalDispatcherInterface * iface)
+{
+
+}
+
+void
+gst_player_signal_dispatcher_dispatch (GstPlayerSignalDispatcher * self,
+    GstPlayer * player, GstPlayerSignalDispatcherFunc emitter, gpointer data,
+    GDestroyNotify destroy)
+{
+  GstPlayerSignalDispatcherInterface *iface;
+
+  if (!self) {
+    emitter (data);
+    if (destroy)
+      destroy (data);
+    return;
+  }
+
+  g_return_if_fail (GST_IS_PLAYER_SIGNAL_DISPATCHER (self));
+  iface = GST_PLAYER_SIGNAL_DISPATCHER_GET_INTERFACE (self);
+  g_return_if_fail (iface->dispatch != NULL);
+
+  iface->dispatch (self, player, emitter, data, destroy);
+}
diff --git a/gst-libs/gst/player/gstplayer-signal-dispatcher.h b/gst-libs/gst/player/gstplayer-signal-dispatcher.h
new file mode 100644
index 0000000..76338b2
--- /dev/null
+++ b/gst-libs/gst/player/gstplayer-signal-dispatcher.h
@@ -0,0 +1,53 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.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_PLAYER_SIGNAL_DISPATCHER_H__
+#define __GST_PLAYER_SIGNAL_DISPATCHER_H__
+
+#include <gst/gst.h>
+#include <gst/player/gstplayer-types.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstPlayerSignalDispatcher GstPlayerSignalDispatcher;
+typedef struct _GstPlayerSignalDispatcherInterface GstPlayerSignalDispatcherInterface;
+
+#define GST_TYPE_PLAYER_SIGNAL_DISPATCHER                (gst_player_signal_dispatcher_get_type ())
+#define GST_PLAYER_SIGNAL_DISPATCHER(obj)                (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAYER_SIGNAL_DISPATCHER, GstPlayerSignalDispatcher))
+#define GST_IS_PLAYER_SIGNAL_DISPATCHER(obj)             (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAYER_SIGNAL_DISPATCHER))
+#define GST_PLAYER_SIGNAL_DISPATCHER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_PLAYER_SIGNAL_DISPATCHER, GstPlayerSignalDispatcherInterface))
+
+typedef void (*GstPlayerSignalDispatcherFunc) (gpointer data);
+
+struct _GstPlayerSignalDispatcherInterface {
+  GTypeInterface parent_iface;
+
+  void (*dispatch) (GstPlayerSignalDispatcher * self,
+                    GstPlayer * player,
+                    GstPlayerSignalDispatcherFunc emitter,
+                    gpointer data,
+                    GDestroyNotify destroy);
+};
+
+GType        gst_player_signal_dispatcher_get_type    (void);
+
+G_END_DECLS
+
+#endif /* __GST_PLAYER_SIGNAL_DISPATCHER_H__ */
diff --git a/gst-libs/gst/player/gstplayer-types.h b/gst-libs/gst/player/gstplayer-types.h
new file mode 100644
index 0000000..f6627e6
--- /dev/null
+++ b/gst-libs/gst/player/gstplayer-types.h
@@ -0,0 +1,35 @@
+/* GStreamer
+ *
+ * Copyright (C) 2015 Sebastian Dröge <sebastian@centricular.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_PLAYER_TYPES_H__
+#define __GST_PLAYER_TYPES_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstPlayer GstPlayer;
+typedef struct _GstPlayerClass GstPlayerClass;
+
+G_END_DECLS
+
+#endif /* __GST_PLAYER_TYPES_H__ */
+
+
diff --git a/gst-libs/gst/player/gstplayer-video-overlay-video-renderer.c b/gst-libs/gst/player/gstplayer-video-overlay-video-renderer.c
new file mode 100644
index 0000000..ab8894f
--- /dev/null
+++ b/gst-libs/gst/player/gstplayer-video-overlay-video-renderer.c
@@ -0,0 +1,224 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.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.
+ */
+
+/**
+ * SECTION:gstplayer-videooverlayvideorenderer
+ * @short_description: Player Video Overlay Video Renderer
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstplayer-video-overlay-video-renderer.h"
+#include "gstplayer.h"
+
+#include <gst/video/video.h>
+
+struct _GstPlayerVideoOverlayVideoRenderer
+{
+  GObject parent;
+
+  GstVideoOverlay *video_overlay;
+  gpointer window_handle;
+};
+
+struct _GstPlayerVideoOverlayVideoRendererClass
+{
+  GObjectClass parent_class;
+};
+
+static void
+    gst_player_video_overlay_video_renderer_interface_init
+    (GstPlayerVideoRendererInterface * iface);
+
+enum
+{
+  VIDEO_OVERLAY_VIDEO_RENDERER_PROP_0,
+  VIDEO_OVERLAY_VIDEO_RENDERER_PROP_WINDOW_HANDLE,
+  VIDEO_OVERLAY_VIDEO_RENDERER_PROP_LAST
+};
+
+G_DEFINE_TYPE_WITH_CODE (GstPlayerVideoOverlayVideoRenderer,
+    gst_player_video_overlay_video_renderer, G_TYPE_OBJECT,
+    G_IMPLEMENT_INTERFACE (GST_TYPE_PLAYER_VIDEO_RENDERER,
+        gst_player_video_overlay_video_renderer_interface_init));
+
+static GParamSpec
+    * video_overlay_video_renderer_param_specs
+    [VIDEO_OVERLAY_VIDEO_RENDERER_PROP_LAST] = { NULL, };
+
+static void
+gst_player_video_overlay_video_renderer_set_property (GObject * object,
+    guint prop_id, const GValue * value, GParamSpec * pspec)
+{
+  GstPlayerVideoOverlayVideoRenderer *self =
+      GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (object);
+
+  switch (prop_id) {
+    case VIDEO_OVERLAY_VIDEO_RENDERER_PROP_WINDOW_HANDLE:
+      self->window_handle = g_value_get_pointer (value);
+      if (self->video_overlay)
+        gst_video_overlay_set_window_handle (self->video_overlay,
+            (guintptr) self->window_handle);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+gst_player_video_overlay_video_renderer_get_property (GObject * object,
+    guint prop_id, GValue * value, GParamSpec * pspec)
+{
+  GstPlayerVideoOverlayVideoRenderer *self =
+      GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (object);
+
+  switch (prop_id) {
+    case VIDEO_OVERLAY_VIDEO_RENDERER_PROP_WINDOW_HANDLE:
+      g_value_set_pointer (value, self->window_handle);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+gst_player_video_overlay_video_renderer_finalize (GObject * object)
+{
+  GstPlayerVideoOverlayVideoRenderer *self =
+      GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (object);
+
+  if (self->video_overlay)
+    gst_object_unref (self->video_overlay);
+
+  G_OBJECT_CLASS
+      (gst_player_video_overlay_video_renderer_parent_class)->finalize (object);
+}
+
+static void
+    gst_player_video_overlay_video_renderer_class_init
+    (GstPlayerVideoOverlayVideoRendererClass * klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->set_property =
+      gst_player_video_overlay_video_renderer_set_property;
+  gobject_class->get_property =
+      gst_player_video_overlay_video_renderer_get_property;
+  gobject_class->finalize = gst_player_video_overlay_video_renderer_finalize;
+
+  video_overlay_video_renderer_param_specs
+      [VIDEO_OVERLAY_VIDEO_RENDERER_PROP_WINDOW_HANDLE] =
+      g_param_spec_pointer ("window-handle", "Window Handle",
+      "Window handle to embed the video into",
+      G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS);
+
+  g_object_class_install_properties (gobject_class,
+      VIDEO_OVERLAY_VIDEO_RENDERER_PROP_LAST,
+      video_overlay_video_renderer_param_specs);
+}
+
+static void
+    gst_player_video_overlay_video_renderer_init
+    (G_GNUC_UNUSED GstPlayerVideoOverlayVideoRenderer * self)
+{
+}
+
+static GstElement *gst_player_video_overlay_video_renderer_create_video_sink
+    (GstPlayerVideoRenderer * iface, GstPlayer * player)
+{
+  GstElement *video_overlay;
+  GstPlayerVideoOverlayVideoRenderer *self =
+      GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (iface);
+
+  if (self->video_overlay)
+    gst_object_unref (self->video_overlay);
+
+  video_overlay = gst_player_get_pipeline (player);
+  g_return_val_if_fail (GST_IS_VIDEO_OVERLAY (video_overlay), NULL);
+
+  self->video_overlay = GST_VIDEO_OVERLAY (video_overlay);
+
+  gst_video_overlay_set_window_handle (self->video_overlay,
+      (guintptr) self->window_handle);
+
+  return NULL;
+}
+
+static void
+    gst_player_video_overlay_video_renderer_interface_init
+    (GstPlayerVideoRendererInterface * iface)
+{
+  iface->create_video_sink =
+      gst_player_video_overlay_video_renderer_create_video_sink;
+}
+
+/**
+ * gst_player_video_overlay_video_renderer_new:
+ * @window_handle: (allow-none): Window handle to use or %NULL
+ *
+ * Returns: (transfer full):
+ */
+GstPlayerVideoRenderer *
+gst_player_video_overlay_video_renderer_new (gpointer window_handle)
+{
+  return g_object_new (GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER,
+      "window-handle", window_handle, NULL);
+}
+
+/**
+ * gst_player_video_overlay_video_renderer_set_window_handle:
+ * @self: #GstPlayerVideoRenderer instance
+ * @window_handle: handle referencing to the platform specific window
+ *
+ * Sets the platform specific window handle into which the video
+ * should be rendered
+ **/
+void gst_player_video_overlay_video_renderer_set_window_handle
+    (GstPlayerVideoOverlayVideoRenderer * self, gpointer window_handle)
+{
+  g_return_if_fail (GST_IS_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (self));
+
+  g_object_set (self, "window-handle", window_handle, NULL);
+}
+
+/**
+ * gst_player_video_overlay_video_renderer_get_window_handle:
+ * @self: #GstPlayerVideoRenderer instance
+ *
+ * Returns: (transfer none): The currently set, platform specific window
+ * handle
+ */
+gpointer
+    gst_player_video_overlay_video_renderer_get_window_handle
+    (GstPlayerVideoOverlayVideoRenderer * self) {
+  gpointer window_handle;
+
+  g_return_val_if_fail (GST_IS_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER (self),
+      NULL);
+
+  g_object_get (self, "window-handle", &window_handle, NULL);
+
+  return window_handle;
+}
diff --git a/gst-libs/gst/player/gstplayer-video-overlay-video-renderer.h b/gst-libs/gst/player/gstplayer-video-overlay-video-renderer.h
new file mode 100644
index 0000000..72a420b
--- /dev/null
+++ b/gst-libs/gst/player/gstplayer-video-overlay-video-renderer.h
@@ -0,0 +1,49 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.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_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_H__
+#define __GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_H__
+
+#include <gst/player/gstplayer-types.h>
+#include <gst/player/gstplayer-video-renderer.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstPlayerVideoOverlayVideoRenderer
+    GstPlayerVideoOverlayVideoRenderer;
+typedef struct _GstPlayerVideoOverlayVideoRendererClass
+    GstPlayerVideoOverlayVideoRendererClass;
+
+#define GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER             (gst_player_video_overlay_video_renderer_get_type ())
+#define GST_IS_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER))
+#define GST_IS_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER))
+#define GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER, GstPlayerVideoOverlayVideoRendererClass))
+#define GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER, GstPlayerVideoOverlayVideoRenderer))
+#define GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER, GstPlayerVideoOverlayVideoRendererClass))
+#define GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_CAST(obj)        ((GstPlayerVideoOverlayVideoRenderer*)(obj))
+
+GType gst_player_video_overlay_video_renderer_get_type (void);
+GstPlayerVideoRenderer * gst_player_video_overlay_video_renderer_new (gpointer window_handle);
+void gst_player_video_overlay_video_renderer_set_window_handle (GstPlayerVideoOverlayVideoRenderer * self, gpointer window_handle);
+gpointer gst_player_video_overlay_video_renderer_get_window_handle (GstPlayerVideoOverlayVideoRenderer * self);
+
+G_END_DECLS
+
+#endif /* __GST_PLAYER_VIDEO_OVERLAY_VIDEO_RENDERER_H__ */
diff --git a/gst-libs/gst/player/gstplayer-video-renderer-private.h b/gst-libs/gst/player/gstplayer-video-renderer-private.h
new file mode 100644
index 0000000..6ecab15
--- /dev/null
+++ b/gst-libs/gst/player/gstplayer-video-renderer-private.h
@@ -0,0 +1,33 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.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_PLAYER_VIDEO_RENDERER_PRIVATE_H__
+#define __GST_PLAYER_VIDEO_RENDERER_PRIVATE_H__
+
+#include <gst/player/gstplayer-video-renderer.h>
+
+G_BEGIN_DECLS
+
+G_GNUC_INTERNAL GstElement * gst_player_video_renderer_create_video_sink (GstPlayerVideoRenderer *
+    self, GstPlayer * player);
+
+G_END_DECLS
+
+#endif /* __GST_PLAYER_VIDEO_RENDERER_PRIVATE_H__ */
diff --git a/gst-libs/gst/player/gstplayer-video-renderer.c b/gst-libs/gst/player/gstplayer-video-renderer.c
new file mode 100644
index 0000000..6faf6a8
--- /dev/null
+++ b/gst-libs/gst/player/gstplayer-video-renderer.c
@@ -0,0 +1,49 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.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 "gstplayer-video-renderer.h"
+#include "gstplayer-video-renderer-private.h"
+
+G_DEFINE_INTERFACE (GstPlayerVideoRenderer, gst_player_video_renderer,
+    G_TYPE_OBJECT);
+
+static void
+gst_player_video_renderer_default_init (G_GNUC_UNUSED
+    GstPlayerVideoRendererInterface * iface)
+{
+
+}
+
+GstElement *
+gst_player_video_renderer_create_video_sink (GstPlayerVideoRenderer * self,
+    GstPlayer * player)
+{
+  GstPlayerVideoRendererInterface *iface;
+
+  g_return_val_if_fail (GST_IS_PLAYER_VIDEO_RENDERER (self), NULL);
+  iface = GST_PLAYER_VIDEO_RENDERER_GET_INTERFACE (self);
+  g_return_val_if_fail (iface->create_video_sink != NULL, NULL);
+
+  return iface->create_video_sink (self, player);
+}
diff --git a/gst-libs/gst/player/gstplayer-video-renderer.h b/gst-libs/gst/player/gstplayer-video-renderer.h
new file mode 100644
index 0000000..b9df5c9
--- /dev/null
+++ b/gst-libs/gst/player/gstplayer-video-renderer.h
@@ -0,0 +1,47 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.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_PLAYER_VIDEO_RENDERER_H__
+#define __GST_PLAYER_VIDEO_RENDERER_H__
+
+#include <gst/gst.h>
+#include <gst/player/gstplayer-types.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstPlayerVideoRenderer GstPlayerVideoRenderer;
+typedef struct _GstPlayerVideoRendererInterface GstPlayerVideoRendererInterface;
+
+#define GST_TYPE_PLAYER_VIDEO_RENDERER                (gst_player_video_renderer_get_type ())
+#define GST_PLAYER_VIDEO_RENDERER(obj)                (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAYER_VIDEO_RENDERER, GstPlayerVideoRenderer))
+#define GST_IS_PLAYER_VIDEO_RENDERER(obj)             (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAYER_VIDEO_RENDERER))
+#define GST_PLAYER_VIDEO_RENDERER_GET_INTERFACE(inst) (G_TYPE_INSTANCE_GET_INTERFACE ((inst), GST_TYPE_PLAYER_VIDEO_RENDERER, GstPlayerVideoRendererInterface))
+
+struct _GstPlayerVideoRendererInterface {
+  GTypeInterface parent_iface;
+
+  GstElement * (*create_video_sink) (GstPlayerVideoRenderer * self, GstPlayer * player);
+};
+
+GType        gst_player_video_renderer_get_type       (void);
+
+G_END_DECLS
+
+#endif /* __GST_PLAYER_VIDEO_RENDERER_H__ */
diff --git a/gst-libs/gst/player/gstplayer-visualization.c b/gst-libs/gst/player/gstplayer-visualization.c
new file mode 100644
index 0000000..79976a7
--- /dev/null
+++ b/gst-libs/gst/player/gstplayer-visualization.c
@@ -0,0 +1,178 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.com>
+ * Copyright (C) 2015 Brijesh Singh <brijesh.ksingh@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.
+ */
+
+/**
+ * SECTION:gstplayer-visualization
+ * @short_description: Player Visualization
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstplayer-visualization.h"
+
+#include <string.h>
+
+static GMutex vis_lock;
+static GQueue vis_list = G_QUEUE_INIT;
+static guint32 vis_cookie;
+
+G_DEFINE_BOXED_TYPE (GstPlayerVisualization, gst_player_visualization,
+    (GBoxedCopyFunc) gst_player_visualization_copy,
+    (GBoxedFreeFunc) gst_player_visualization_free);
+
+/**
+ * gst_player_visualization_free:
+ * @vis: #GstPlayerVisualization instance
+ *
+ * Frees a #GstPlayerVisualization.
+ */
+void
+gst_player_visualization_free (GstPlayerVisualization * vis)
+{
+  g_return_if_fail (vis != NULL);
+
+  g_free (vis->name);
+  g_free (vis->description);
+  g_free (vis);
+}
+
+/**
+ * gst_player_visualization_copy:
+ * @vis: #GstPlayerVisualization instance
+ *
+ * Makes a copy of the #GstPlayerVisualization. The result must be
+ * freed using gst_player_visualization_free().
+ *
+ * Returns: (transfer full): an allocated copy of @vis.
+ */
+GstPlayerVisualization *
+gst_player_visualization_copy (const GstPlayerVisualization * vis)
+{
+  GstPlayerVisualization *ret;
+
+  g_return_val_if_fail (vis != NULL, NULL);
+
+  ret = g_new0 (GstPlayerVisualization, 1);
+  ret->name = vis->name ? g_strdup (vis->name) : NULL;
+  ret->description = vis->description ? g_strdup (vis->description) : NULL;
+
+  return ret;
+}
+
+/**
+ * gst_player_visualizations_free:
+ * @viss: a %NULL terminated array of #GstPlayerVisualization to free
+ *
+ * Frees a %NULL terminated array of #GstPlayerVisualization.
+ */
+void
+gst_player_visualizations_free (GstPlayerVisualization ** viss)
+{
+  GstPlayerVisualization **p;
+
+  g_return_if_fail (viss != NULL);
+
+  p = viss;
+  while (*p) {
+    g_free ((*p)->name);
+    g_free ((*p)->description);
+    g_free (*p);
+    p++;
+  }
+  g_free (viss);
+}
+
+static void
+gst_player_update_visualization_list (void)
+{
+  GList *features;
+  GList *l;
+  guint32 cookie;
+  GstPlayerVisualization *vis;
+
+  g_mutex_lock (&vis_lock);
+
+  /* check if we need to update the list */
+  cookie = gst_registry_get_feature_list_cookie (gst_registry_get ());
+  if (vis_cookie == cookie) {
+    g_mutex_unlock (&vis_lock);
+    return;
+  }
+
+  /* if update is needed then first free the existing list */
+  while ((vis = g_queue_pop_head (&vis_list)))
+    gst_player_visualization_free (vis);
+
+  features = gst_registry_get_feature_list (gst_registry_get (),
+      GST_TYPE_ELEMENT_FACTORY);
+
+  for (l = features; l; l = l->next) {
+    GstPluginFeature *feature = l->data;
+    const gchar *klass;
+
+    klass = gst_element_factory_get_metadata (GST_ELEMENT_FACTORY (feature),
+        GST_ELEMENT_METADATA_KLASS);
+
+    if (strstr (klass, "Visualization")) {
+      vis = g_new0 (GstPlayerVisualization, 1);
+
+      vis->name = g_strdup (gst_plugin_feature_get_name (feature));
+      vis->description =
+          g_strdup (gst_element_factory_get_metadata (GST_ELEMENT_FACTORY
+              (feature), GST_ELEMENT_METADATA_DESCRIPTION));
+      g_queue_push_tail (&vis_list, vis);
+    }
+  }
+  gst_plugin_feature_list_free (features);
+
+  vis_cookie = cookie;
+
+  g_mutex_unlock (&vis_lock);
+}
+
+/**
+ * gst_player_visualizations_get:
+ *
+ * Returns: (transfer full) (array zero-terminated=1) (element-type GstPlayerVisualization):
+ *  a %NULL terminated array containing all available
+ *  visualizations. Use gst_player_visualizations_free() after
+ *  usage.
+ */
+GstPlayerVisualization **
+gst_player_visualizations_get (void)
+{
+  gint i = 0;
+  GList *l;
+  GstPlayerVisualization **ret;
+
+  gst_player_update_visualization_list ();
+
+  g_mutex_lock (&vis_lock);
+  ret = g_new0 (GstPlayerVisualization *, g_queue_get_length (&vis_list) + 1);
+  for (l = vis_list.head; l; l = l->next)
+    ret[i++] = gst_player_visualization_copy (l->data);
+  g_mutex_unlock (&vis_lock);
+
+  return ret;
+}
diff --git a/gst-libs/gst/player/gstplayer-visualization.h b/gst-libs/gst/player/gstplayer-visualization.h
new file mode 100644
index 0000000..7382773
--- /dev/null
+++ b/gst-libs/gst/player/gstplayer-visualization.h
@@ -0,0 +1,52 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.com>
+ * Copyright (C) 2015 Brijesh Singh <brijesh.ksingh@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_PLAYER_VISUALIZATION_H__
+#define __GST_PLAYER_VISUALIZATION_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+typedef struct _GstPlayerVisualization GstPlayerVisualization;
+/**
+ * GstPlayerVisualization:
+ * @name: name of the visualization.
+ * @description: description of the visualization.
+ *
+ * A #GstPlayerVisualization descriptor.
+ */
+struct _GstPlayerVisualization {
+  gchar *name;
+  gchar *description;
+};
+
+GType                     gst_player_visualization_get_type (void);
+
+GstPlayerVisualization *  gst_player_visualization_copy  (const GstPlayerVisualization *vis);
+void                      gst_player_visualization_free  (GstPlayerVisualization *vis);
+
+GstPlayerVisualization ** gst_player_visualizations_get  (void);
+void                      gst_player_visualizations_free (GstPlayerVisualization **viss);
+
+G_END_DECLS
+
+#endif /* __GST_PLAYER_VISUALIZATION_H__ */
diff --git a/gst-libs/gst/player/gstplayer.c b/gst-libs/gst/player/gstplayer.c
new file mode 100644
index 0000000..94892b7
--- /dev/null
+++ b/gst-libs/gst/player/gstplayer.c
@@ -0,0 +1,3801 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.com>
+ * Copyright (C) 2015 Brijesh Singh <brijesh.ksingh@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.
+ */
+
+/**
+ * SECTION:gstplayer
+ * @short_description: Player
+ *
+ */
+
+/* TODO:
+ *
+ * - Equalizer
+ * - Gapless playback
+ * - Frame stepping
+ * - Subtitle font, connection speed
+ * - Deinterlacing
+ * - Buffering control (-> progressive downloading)
+ * - Playlist/queue object
+ * - Custom video sink (e.g. embed in GL scene)
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstplayer.h"
+#include "gstplayer-signal-dispatcher-private.h"
+#include "gstplayer-video-renderer-private.h"
+#include "gstplayer-media-info-private.h"
+
+#include <gst/gst.h>
+#include <gst/video/video.h>
+#include <gst/video/colorbalance.h>
+#include <gst/tag/tag.h>
+#include <gst/pbutils/descriptions.h>
+
+#include <string.h>
+
+GST_DEBUG_CATEGORY_STATIC (gst_player_debug);
+#define GST_CAT_DEFAULT gst_player_debug
+
+#define DEFAULT_URI NULL
+#define DEFAULT_POSITION GST_CLOCK_TIME_NONE
+#define DEFAULT_DURATION GST_CLOCK_TIME_NONE
+#define DEFAULT_VOLUME 1.0
+#define DEFAULT_MUTE FALSE
+#define DEFAULT_RATE 1.0
+#define DEFAULT_POSITION_UPDATE_INTERVAL_MS 100
+
+GQuark
+gst_player_error_quark (void)
+{
+  static GQuark quark;
+
+  if (!quark)
+    quark = g_quark_from_static_string ("gst-player-error-quark");
+
+  return quark;
+}
+
+enum
+{
+  PROP_0,
+  PROP_VIDEO_RENDERER,
+  PROP_SIGNAL_DISPATCHER,
+  PROP_URI,
+  PROP_SUBURI,
+  PROP_POSITION,
+  PROP_DURATION,
+  PROP_MEDIA_INFO,
+  PROP_CURRENT_AUDIO_TRACK,
+  PROP_CURRENT_VIDEO_TRACK,
+  PROP_CURRENT_SUBTITLE_TRACK,
+  PROP_VOLUME,
+  PROP_MUTE,
+  PROP_RATE,
+  PROP_PIPELINE,
+  PROP_POSITION_UPDATE_INTERVAL,
+  PROP_LAST
+};
+
+enum
+{
+  SIGNAL_POSITION_UPDATED,
+  SIGNAL_DURATION_CHANGED,
+  SIGNAL_STATE_CHANGED,
+  SIGNAL_BUFFERING,
+  SIGNAL_END_OF_STREAM,
+  SIGNAL_ERROR,
+  SIGNAL_WARNING,
+  SIGNAL_VIDEO_DIMENSIONS_CHANGED,
+  SIGNAL_MEDIA_INFO_UPDATED,
+  SIGNAL_VOLUME_CHANGED,
+  SIGNAL_MUTE_CHANGED,
+  SIGNAL_SEEK_DONE,
+  SIGNAL_LAST
+};
+
+enum
+{
+  GST_PLAY_FLAG_VIDEO = (1 << 0),
+  GST_PLAY_FLAG_AUDIO = (1 << 1),
+  GST_PLAY_FLAG_SUBTITLE = (1 << 2),
+  GST_PLAY_FLAG_VIS = (1 << 3)
+};
+
+struct _GstPlayer
+{
+  GstObject parent;
+
+  GstPlayerVideoRenderer *video_renderer;
+  GstPlayerSignalDispatcher *signal_dispatcher;
+
+  gchar *uri;
+  gchar *suburi;
+
+  GThread *thread;
+  GMutex lock;
+  GCond cond;
+  GMainContext *context;
+  GMainLoop *loop;
+
+  GstElement *playbin;
+  GstBus *bus;
+  GstState target_state, current_state;
+  gboolean is_live, is_eos;
+  GSource *tick_source, *ready_timeout_source;
+
+  gdouble rate;
+  guint position_update_interval_ms;
+
+  GstPlayerState app_state;
+  gint buffering;
+
+  GstTagList *global_tags;
+  GstPlayerMediaInfo *media_info;
+
+  GstElement *current_vis_element;
+
+  /* Protected by lock */
+  gboolean seek_pending;        /* Only set from main context */
+  GstClockTime last_seek_time;  /* Only set from main context */
+  GSource *seek_source;
+  GstClockTime seek_position;
+};
+
+struct _GstPlayerClass
+{
+  GstObjectClass parent_class;
+};
+
+#define parent_class gst_player_parent_class
+G_DEFINE_TYPE (GstPlayer, gst_player, GST_TYPE_OBJECT);
+
+static guint signals[SIGNAL_LAST] = { 0, };
+static GParamSpec *param_specs[PROP_LAST] = { NULL, };
+
+static void gst_player_dispose (GObject * object);
+static void gst_player_finalize (GObject * object);
+static void gst_player_set_property (GObject * object, guint prop_id,
+    const GValue * value, GParamSpec * pspec);
+static void gst_player_get_property (GObject * object, guint prop_id,
+    GValue * value, GParamSpec * pspec);
+static void gst_player_constructed (GObject * object);
+
+static gpointer gst_player_main (gpointer data);
+
+static void gst_player_seek_internal_locked (GstPlayer * self);
+static gboolean gst_player_stop_internal (gpointer user_data);
+static gboolean gst_player_pause_internal (gpointer user_data);
+static gboolean gst_player_play_internal (gpointer user_data);
+static gboolean gst_player_set_rate_internal (gpointer user_data);
+static gboolean gst_player_set_position_update_interval_internal (gpointer
+    user_data);
+static void change_state (GstPlayer * self, GstPlayerState state);
+
+static GstPlayerMediaInfo *gst_player_media_info_create (GstPlayer * self);
+
+static void gst_player_streams_info_create (GstPlayer * self,
+    GstPlayerMediaInfo * media_info, const gchar * prop, GType type);
+static void gst_player_stream_info_update (GstPlayer * self,
+    GstPlayerStreamInfo * s);
+static void gst_player_stream_info_update_tags_and_caps (GstPlayer * self,
+    GstPlayerStreamInfo * s);
+static GstPlayerStreamInfo *gst_player_stream_info_find (GstPlayerMediaInfo *
+    media_info, GType type, gint stream_index);
+static GstPlayerStreamInfo *gst_player_stream_info_get_current (GstPlayer *
+    self, const gchar * prop, GType type);
+
+static void gst_player_video_info_update (GstPlayer * self,
+    GstPlayerStreamInfo * stream_info);
+static void gst_player_audio_info_update (GstPlayer * self,
+    GstPlayerStreamInfo * stream_info);
+static void gst_player_subtitle_info_update (GstPlayer * self,
+    GstPlayerStreamInfo * stream_info);
+
+static void emit_media_info_updated_signal (GstPlayer * self);
+
+static void *get_title (GstTagList * tags);
+static void *get_container_format (GstTagList * tags);
+static void *get_from_tags (GstPlayer * self, GstPlayerMediaInfo * media_info,
+    void *(*func) (GstTagList *));
+static void *get_cover_sample (GstTagList * tags);
+
+static void
+gst_player_init (GstPlayer * self)
+{
+  GST_TRACE_OBJECT (self, "Initializing");
+
+  self = gst_player_get_instance_private (self);
+
+  g_mutex_init (&self->lock);
+  g_cond_init (&self->cond);
+
+  self->context = g_main_context_new ();
+  self->loop = g_main_loop_new (self->context, FALSE);
+
+  self->position_update_interval_ms = DEFAULT_POSITION_UPDATE_INTERVAL_MS;
+  self->seek_pending = FALSE;
+  self->seek_position = GST_CLOCK_TIME_NONE;
+  self->last_seek_time = GST_CLOCK_TIME_NONE;
+
+  GST_TRACE_OBJECT (self, "Initialized");
+}
+
+static void
+gst_player_class_init (GstPlayerClass * klass)
+{
+  GObjectClass *gobject_class = (GObjectClass *) klass;
+
+  gobject_class->set_property = gst_player_set_property;
+  gobject_class->get_property = gst_player_get_property;
+  gobject_class->dispose = gst_player_dispose;
+  gobject_class->finalize = gst_player_finalize;
+  gobject_class->constructed = gst_player_constructed;
+
+  param_specs[PROP_VIDEO_RENDERER] =
+      g_param_spec_object ("video-renderer",
+      "Video Renderer", "Video renderer to use for rendering videos",
+      GST_TYPE_PLAYER_VIDEO_RENDERER,
+      G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+
+  param_specs[PROP_SIGNAL_DISPATCHER] =
+      g_param_spec_object ("signal-dispatcher",
+      "Signal Dispatcher", "Dispatcher for the signals to e.g. event loops",
+      GST_TYPE_PLAYER_SIGNAL_DISPATCHER,
+      G_PARAM_WRITABLE | G_PARAM_CONSTRUCT_ONLY | G_PARAM_STATIC_STRINGS);
+
+  param_specs[PROP_URI] = g_param_spec_string ("uri", "URI", "Current URI",
+      DEFAULT_URI, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+  param_specs[PROP_SUBURI] = g_param_spec_string ("suburi", "Subtitle URI",
+      "Current Subtitle URI", NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+  param_specs[PROP_POSITION] =
+      g_param_spec_uint64 ("position", "Position", "Current Position",
+      0, G_MAXUINT64, DEFAULT_POSITION,
+      G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+
+  param_specs[PROP_MEDIA_INFO] =
+      g_param_spec_object ("media-info", "Media Info",
+      "Current media information", GST_TYPE_PLAYER_MEDIA_INFO,
+      G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+
+  param_specs[PROP_CURRENT_AUDIO_TRACK] =
+      g_param_spec_object ("current-audio-track", "Current Audio Track",
+      "Current audio track information", GST_TYPE_PLAYER_AUDIO_INFO,
+      G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+
+  param_specs[PROP_CURRENT_VIDEO_TRACK] =
+      g_param_spec_object ("current-video-track", "Current Video Track",
+      "Current video track information", GST_TYPE_PLAYER_VIDEO_INFO,
+      G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+
+  param_specs[PROP_CURRENT_SUBTITLE_TRACK] =
+      g_param_spec_object ("current-subtitle-track", "Current Subtitle Track",
+      "Current audio subtitle information", GST_TYPE_PLAYER_SUBTITLE_INFO,
+      G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+
+  param_specs[PROP_DURATION] =
+      g_param_spec_uint64 ("duration", "Duration", "Duration",
+      0, G_MAXUINT64, DEFAULT_DURATION,
+      G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+
+  param_specs[PROP_VOLUME] =
+      g_param_spec_double ("volume", "Volume", "Volume",
+      0, 10.0, DEFAULT_VOLUME, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+  param_specs[PROP_MUTE] =
+      g_param_spec_boolean ("mute", "Mute", "Mute",
+      DEFAULT_MUTE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+  param_specs[PROP_PIPELINE] =
+      g_param_spec_object ("pipeline", "Pipeline",
+      "GStreamer pipeline that is used",
+      GST_TYPE_ELEMENT, G_PARAM_READABLE | G_PARAM_STATIC_STRINGS);
+
+  param_specs[PROP_RATE] =
+      g_param_spec_double ("rate", "rate", "Playback rate",
+      -64.0, 64.0, DEFAULT_RATE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+  param_specs[PROP_POSITION_UPDATE_INTERVAL] =
+      g_param_spec_uint ("position-update-interval", "Position update interval",
+      "Interval in milliseconds between two position-updated signals."
+      "Pass 0 to stop updating the position.",
+      0, 10000, DEFAULT_POSITION_UPDATE_INTERVAL_MS,
+      G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS);
+
+  g_object_class_install_properties (gobject_class, PROP_LAST, param_specs);
+
+  signals[SIGNAL_POSITION_UPDATED] =
+      g_signal_new ("position-updated", G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL,
+      NULL, NULL, G_TYPE_NONE, 1, GST_TYPE_CLOCK_TIME);
+
+  signals[SIGNAL_DURATION_CHANGED] =
+      g_signal_new ("duration-changed", G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL,
+      NULL, NULL, G_TYPE_NONE, 1, GST_TYPE_CLOCK_TIME);
+
+  signals[SIGNAL_STATE_CHANGED] =
+      g_signal_new ("state-changed", G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL,
+      NULL, NULL, G_TYPE_NONE, 1, GST_TYPE_PLAYER_STATE);
+
+  signals[SIGNAL_BUFFERING] =
+      g_signal_new ("buffering", G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL,
+      NULL, NULL, G_TYPE_NONE, 1, G_TYPE_INT);
+
+  signals[SIGNAL_END_OF_STREAM] =
+      g_signal_new ("end-of-stream", G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL,
+      NULL, NULL, G_TYPE_NONE, 0, G_TYPE_INVALID);
+
+  signals[SIGNAL_ERROR] =
+      g_signal_new ("error", G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL,
+      NULL, NULL, G_TYPE_NONE, 1, G_TYPE_ERROR);
+
+  signals[SIGNAL_VIDEO_DIMENSIONS_CHANGED] =
+      g_signal_new ("video-dimensions-changed", G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL,
+      NULL, NULL, G_TYPE_NONE, 2, G_TYPE_INT, G_TYPE_INT);
+
+  signals[SIGNAL_MEDIA_INFO_UPDATED] =
+      g_signal_new ("media-info-updated", G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL,
+      NULL, NULL, G_TYPE_NONE, 1, GST_TYPE_PLAYER_MEDIA_INFO);
+
+  signals[SIGNAL_VOLUME_CHANGED] =
+      g_signal_new ("volume-changed", G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL,
+      NULL, NULL, G_TYPE_NONE, 0, G_TYPE_INVALID);
+
+  signals[SIGNAL_MUTE_CHANGED] =
+      g_signal_new ("mute-changed", G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL,
+      NULL, NULL, G_TYPE_NONE, 0, G_TYPE_INVALID);
+
+  signals[SIGNAL_WARNING] =
+      g_signal_new ("warning", G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL,
+      NULL, NULL, G_TYPE_NONE, 1, G_TYPE_ERROR);
+
+  signals[SIGNAL_SEEK_DONE] =
+      g_signal_new ("seek-done", G_TYPE_FROM_CLASS (klass),
+      G_SIGNAL_RUN_LAST | G_SIGNAL_NO_RECURSE | G_SIGNAL_NO_HOOKS, 0, NULL,
+      NULL, NULL, G_TYPE_NONE, 1, GST_TYPE_CLOCK_TIME);
+}
+
+static void
+gst_player_dispose (GObject * object)
+{
+  GstPlayer *self = GST_PLAYER (object);
+
+  GST_TRACE_OBJECT (self, "Stopping main thread");
+
+  if (self->loop) {
+    g_main_loop_quit (self->loop);
+
+    g_thread_join (self->thread);
+    self->thread = NULL;
+
+    g_main_loop_unref (self->loop);
+    self->loop = NULL;
+
+    g_main_context_unref (self->context);
+    self->context = NULL;
+  }
+
+  G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+static void
+gst_player_finalize (GObject * object)
+{
+  GstPlayer *self = GST_PLAYER (object);
+
+  GST_TRACE_OBJECT (self, "Finalizing");
+
+  g_free (self->uri);
+  g_free (self->suburi);
+  if (self->global_tags)
+    gst_tag_list_unref (self->global_tags);
+  if (self->video_renderer)
+    g_object_unref (self->video_renderer);
+  if (self->signal_dispatcher)
+    g_object_unref (self->signal_dispatcher);
+  if (self->current_vis_element)
+    gst_object_unref (self->current_vis_element);
+  g_mutex_clear (&self->lock);
+  g_cond_clear (&self->cond);
+
+  G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static void
+gst_player_constructed (GObject * object)
+{
+  GstPlayer *self = GST_PLAYER (object);
+
+  GST_TRACE_OBJECT (self, "Constructed");
+
+  g_mutex_lock (&self->lock);
+  self->thread = g_thread_new ("GstPlayer", gst_player_main, self);
+  while (!self->loop || !g_main_loop_is_running (self->loop))
+    g_cond_wait (&self->cond, &self->lock);
+  g_mutex_unlock (&self->lock);
+
+  G_OBJECT_CLASS (parent_class)->constructed (object);
+}
+
+static gboolean
+gst_player_set_uri_internal (gpointer user_data)
+{
+  GstPlayer *self = user_data;
+
+  gst_player_stop_internal (self);
+
+  g_mutex_lock (&self->lock);
+
+  GST_DEBUG_OBJECT (self, "Changing URI to '%s'", GST_STR_NULL (self->uri));
+
+  g_object_set (self->playbin, "uri", self->uri, NULL);
+
+  /* if have suburi from previous playback then free it */
+  if (self->suburi) {
+    g_free (self->suburi);
+    self->suburi = NULL;
+    g_object_set (self->playbin, "suburi", NULL, NULL);
+  }
+
+  g_mutex_unlock (&self->lock);
+
+  return G_SOURCE_REMOVE;
+}
+
+static gboolean
+gst_player_set_suburi_internal (gpointer user_data)
+{
+  GstPlayer *self = user_data;
+  GstClockTime position;
+  GstState target_state;
+
+  /* save the state and position */
+  target_state = self->target_state;
+  position = gst_player_get_position (self);
+
+  gst_player_stop_internal (self);
+  g_mutex_lock (&self->lock);
+
+  GST_DEBUG_OBJECT (self, "Changing SUBURI to '%s'",
+      GST_STR_NULL (self->suburi));
+
+  g_object_set (self->playbin, "suburi", self->suburi, NULL);
+  g_object_set (self->playbin, "uri", self->uri, NULL);
+
+  g_mutex_unlock (&self->lock);
+
+  /* restore state and position */
+  if (position != GST_CLOCK_TIME_NONE)
+    gst_player_seek (self, position);
+  if (target_state == GST_STATE_PAUSED)
+    gst_player_pause_internal (self);
+  else if (target_state == GST_STATE_PLAYING)
+    gst_player_play_internal (self);
+
+  return G_SOURCE_REMOVE;
+}
+
+static void
+gst_player_set_property (GObject * object, guint prop_id,
+    const GValue * value, GParamSpec * pspec)
+{
+  GstPlayer *self = GST_PLAYER (object);
+
+  switch (prop_id) {
+    case PROP_VIDEO_RENDERER:
+      self->video_renderer = g_value_dup_object (value);
+      break;
+    case PROP_SIGNAL_DISPATCHER:
+      self->signal_dispatcher = g_value_dup_object (value);
+      break;
+    case PROP_URI:{
+      g_mutex_lock (&self->lock);
+      g_free (self->uri);
+
+      self->uri = g_value_dup_string (value);
+      GST_DEBUG_OBJECT (self, "Set uri=%s", self->uri);
+      g_mutex_unlock (&self->lock);
+
+      g_main_context_invoke_full (self->context, G_PRIORITY_DEFAULT,
+          gst_player_set_uri_internal, self, NULL);
+      break;
+    }
+    case PROP_SUBURI:{
+      g_mutex_lock (&self->lock);
+      g_free (self->suburi);
+
+      self->suburi = g_value_dup_string (value);
+      GST_DEBUG_OBJECT (self, "Set suburi=%s", self->suburi);
+      g_mutex_unlock (&self->lock);
+
+      g_main_context_invoke_full (self->context, G_PRIORITY_DEFAULT,
+          gst_player_set_suburi_internal, self, NULL);
+      break;
+    }
+    case PROP_VOLUME:
+      GST_DEBUG_OBJECT (self, "Set volume=%lf", g_value_get_double (value));
+      g_object_set_property (G_OBJECT (self->playbin), "volume", value);
+      break;
+    case PROP_RATE:
+      g_mutex_lock (&self->lock);
+      self->rate = g_value_get_double (value);
+      GST_DEBUG_OBJECT (self, "Set rate=%lf", g_value_get_double (value));
+      g_mutex_unlock (&self->lock);
+
+      gst_player_set_rate_internal (self);
+      break;
+    case PROP_MUTE:
+      GST_DEBUG_OBJECT (self, "Set mute=%d", g_value_get_boolean (value));
+      g_object_set_property (G_OBJECT (self->playbin), "mute", value);
+      break;
+    case PROP_POSITION_UPDATE_INTERVAL:
+      g_mutex_lock (&self->lock);
+      self->position_update_interval_ms = g_value_get_uint (value);
+      GST_DEBUG_OBJECT (self, "Set position update interval=%u ms",
+          g_value_get_uint (value));
+      g_mutex_unlock (&self->lock);
+
+      gst_player_set_position_update_interval_internal (self);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+gst_player_get_property (GObject * object, guint prop_id,
+    GValue * value, GParamSpec * pspec)
+{
+  GstPlayer *self = GST_PLAYER (object);
+
+  switch (prop_id) {
+    case PROP_URI:
+      g_mutex_lock (&self->lock);
+      g_value_set_string (value, self->uri);
+      g_mutex_unlock (&self->lock);
+      break;
+    case PROP_SUBURI:
+      g_mutex_lock (&self->lock);
+      g_value_set_string (value, self->suburi);
+      g_mutex_unlock (&self->lock);
+      GST_DEBUG_OBJECT (self, "Returning has-suburi=%d",
+          g_value_get_boolean (value));
+      break;
+    case PROP_POSITION:{
+      gint64 position = 0;
+
+      gst_element_query_position (self->playbin, GST_FORMAT_TIME, &position);
+      g_value_set_uint64 (value, position);
+      GST_TRACE_OBJECT (self, "Returning position=%" GST_TIME_FORMAT,
+          GST_TIME_ARGS (g_value_get_uint64 (value)));
+      break;
+    }
+    case PROP_DURATION:{
+      gint64 duration = 0;
+
+      gst_element_query_duration (self->playbin, GST_FORMAT_TIME, &duration);
+      g_value_set_uint64 (value, duration);
+      GST_TRACE_OBJECT (self, "Returning duration=%" GST_TIME_FORMAT,
+          GST_TIME_ARGS (g_value_get_uint64 (value)));
+      break;
+    }
+    case PROP_MEDIA_INFO:{
+      GstPlayerMediaInfo *media_info = gst_player_get_media_info (self);
+      g_value_set_object (value, media_info);
+      g_object_unref (media_info);
+      break;
+    }
+    case PROP_CURRENT_AUDIO_TRACK:{
+      GstPlayerAudioInfo *audio_info =
+          gst_player_get_current_audio_track (self);
+      g_value_set_object (value, audio_info);
+      g_object_unref (audio_info);
+      break;
+    }
+    case PROP_CURRENT_VIDEO_TRACK:{
+      GstPlayerVideoInfo *video_info =
+          gst_player_get_current_video_track (self);
+      g_value_set_object (value, video_info);
+      g_object_unref (video_info);
+      break;
+    }
+    case PROP_CURRENT_SUBTITLE_TRACK:{
+      GstPlayerSubtitleInfo *subtitle_info =
+          gst_player_get_current_subtitle_track (self);
+      g_value_set_object (value, subtitle_info);
+      g_object_unref (subtitle_info);
+      break;
+    }
+    case PROP_VOLUME:
+      g_object_get_property (G_OBJECT (self->playbin), "volume", value);
+      GST_TRACE_OBJECT (self, "Returning volume=%lf",
+          g_value_get_double (value));
+      break;
+    case PROP_RATE:
+      g_mutex_lock (&self->lock);
+      g_value_set_double (value, gst_player_get_rate (self));
+      g_mutex_unlock (&self->lock);
+      break;
+    case PROP_MUTE:
+      g_object_get_property (G_OBJECT (self->playbin), "mute", value);
+      GST_TRACE_OBJECT (self, "Returning mute=%d", g_value_get_boolean (value));
+      break;
+    case PROP_PIPELINE:
+      g_value_set_object (value, self->playbin);
+      break;
+    case PROP_POSITION_UPDATE_INTERVAL:
+      g_mutex_lock (&self->lock);
+      g_value_set_uint (value, gst_player_get_position_update_interval (self));
+      g_mutex_unlock (&self->lock);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static gboolean
+main_loop_running_cb (gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+
+  GST_TRACE_OBJECT (self, "Main loop running now");
+
+  g_mutex_lock (&self->lock);
+  g_cond_signal (&self->cond);
+  g_mutex_unlock (&self->lock);
+
+  return G_SOURCE_REMOVE;
+}
+
+typedef struct
+{
+  GstPlayer *player;
+  GstPlayerState state;
+} StateChangedSignalData;
+
+static void
+state_changed_dispatch (gpointer user_data)
+{
+  StateChangedSignalData *data = user_data;
+
+  g_signal_emit (data->player, signals[SIGNAL_STATE_CHANGED], 0, data->state);
+}
+
+static void
+state_changed_signal_data_free (StateChangedSignalData * data)
+{
+  g_object_unref (data->player);
+  g_free (data);
+}
+
+static void
+change_state (GstPlayer * self, GstPlayerState state)
+{
+  if (state == self->app_state)
+    return;
+
+  GST_DEBUG_OBJECT (self, "Changing app state from %s to %s",
+      gst_player_state_get_name (self->app_state),
+      gst_player_state_get_name (state));
+  self->app_state = state;
+
+  if (g_signal_handler_find (self, G_SIGNAL_MATCH_ID,
+          signals[SIGNAL_STATE_CHANGED], 0, NULL, NULL, NULL) != 0) {
+    StateChangedSignalData *data = g_new (StateChangedSignalData, 1);
+
+    data->player = g_object_ref (self);
+    data->state = state;
+    gst_player_signal_dispatcher_dispatch (self->signal_dispatcher, self,
+        state_changed_dispatch, data,
+        (GDestroyNotify) state_changed_signal_data_free);
+  }
+}
+
+typedef struct
+{
+  GstPlayer *player;
+  GstClockTime position;
+} PositionUpdatedSignalData;
+
+static void
+position_updated_dispatch (gpointer user_data)
+{
+  PositionUpdatedSignalData *data = user_data;
+
+  if (data->player->target_state >= GST_STATE_PAUSED) {
+    g_signal_emit (data->player, signals[SIGNAL_POSITION_UPDATED], 0,
+        data->position);
+    g_object_notify_by_pspec (G_OBJECT (data->player),
+        param_specs[PROP_POSITION]);
+  }
+}
+
+static void
+position_updated_signal_data_free (PositionUpdatedSignalData * data)
+{
+  g_object_unref (data->player);
+  g_free (data);
+}
+
+static gboolean
+tick_cb (gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+  gint64 position;
+
+  if (self->target_state >= GST_STATE_PAUSED
+      && gst_element_query_position (self->playbin, GST_FORMAT_TIME,
+          &position)) {
+    GST_LOG_OBJECT (self, "Position %" GST_TIME_FORMAT,
+        GST_TIME_ARGS (position));
+
+    if (g_signal_handler_find (self, G_SIGNAL_MATCH_ID,
+            signals[SIGNAL_POSITION_UPDATED], 0, NULL, NULL, NULL) != 0) {
+      PositionUpdatedSignalData *data = g_new (PositionUpdatedSignalData, 1);
+
+      data->player = g_object_ref (self);
+      data->position = position;
+      gst_player_signal_dispatcher_dispatch (self->signal_dispatcher, self,
+          position_updated_dispatch, data,
+          (GDestroyNotify) position_updated_signal_data_free);
+    }
+  }
+
+  return G_SOURCE_CONTINUE;
+}
+
+static void
+add_tick_source (GstPlayer * self)
+{
+  if (self->tick_source)
+    return;
+
+  if (!self->position_update_interval_ms)
+    return;
+
+  self->tick_source = g_timeout_source_new (self->position_update_interval_ms);
+  g_source_set_callback (self->tick_source, (GSourceFunc) tick_cb, self, NULL);
+  g_source_attach (self->tick_source, self->context);
+}
+
+static void
+remove_tick_source (GstPlayer * self)
+{
+  if (!self->tick_source)
+    return;
+
+  g_source_destroy (self->tick_source);
+  g_source_unref (self->tick_source);
+  self->tick_source = NULL;
+}
+
+static gboolean
+ready_timeout_cb (gpointer user_data)
+{
+  GstPlayer *self = user_data;
+
+  if (self->target_state <= GST_STATE_READY) {
+    GST_DEBUG_OBJECT (self, "Setting pipeline to NULL state");
+    self->target_state = GST_STATE_NULL;
+    self->current_state = GST_STATE_NULL;
+    gst_element_set_state (self->playbin, GST_STATE_NULL);
+  }
+
+  return G_SOURCE_REMOVE;
+}
+
+static void
+add_ready_timeout_source (GstPlayer * self)
+{
+  if (self->ready_timeout_source)
+    return;
+
+  self->ready_timeout_source = g_timeout_source_new_seconds (60);
+  g_source_set_callback (self->ready_timeout_source,
+      (GSourceFunc) ready_timeout_cb, self, NULL);
+  g_source_attach (self->ready_timeout_source, self->context);
+}
+
+static void
+remove_ready_timeout_source (GstPlayer * self)
+{
+  if (!self->ready_timeout_source)
+    return;
+
+  g_source_destroy (self->ready_timeout_source);
+  g_source_unref (self->ready_timeout_source);
+  self->ready_timeout_source = NULL;
+}
+
+typedef struct
+{
+  GstPlayer *player;
+  GError *err;
+} ErrorSignalData;
+
+static void
+error_dispatch (gpointer user_data)
+{
+  ErrorSignalData *data = user_data;
+
+  g_signal_emit (data->player, signals[SIGNAL_ERROR], 0, data->err);
+}
+
+static void
+free_error_signal_data (ErrorSignalData * data)
+{
+  g_object_unref (data->player);
+  g_clear_error (&data->err);
+  g_free (data);
+}
+
+static void
+emit_error (GstPlayer * self, GError * err)
+{
+  GST_ERROR_OBJECT (self, "Error: %s (%s, %d)", err->message,
+      g_quark_to_string (err->domain), err->code);
+
+  if (g_signal_handler_find (self, G_SIGNAL_MATCH_ID,
+          signals[SIGNAL_ERROR], 0, NULL, NULL, NULL) != 0) {
+    ErrorSignalData *data = g_new (ErrorSignalData, 1);
+
+    data->player = g_object_ref (self);
+    data->err = g_error_copy (err);
+    gst_player_signal_dispatcher_dispatch (self->signal_dispatcher, self,
+        error_dispatch, data, (GDestroyNotify) free_error_signal_data);
+  }
+
+  g_error_free (err);
+
+  remove_tick_source (self);
+  remove_ready_timeout_source (self);
+
+  self->target_state = GST_STATE_NULL;
+  self->current_state = GST_STATE_NULL;
+  self->is_live = FALSE;
+  self->is_eos = FALSE;
+  gst_element_set_state (self->playbin, GST_STATE_NULL);
+  change_state (self, GST_PLAYER_STATE_STOPPED);
+  self->buffering = 100;
+
+  g_mutex_lock (&self->lock);
+  if (self->media_info) {
+    g_object_unref (self->media_info);
+    self->media_info = NULL;
+  }
+
+  if (self->global_tags) {
+    gst_tag_list_unref (self->global_tags);
+    self->global_tags = NULL;
+  }
+
+  self->seek_pending = FALSE;
+  if (self->seek_source) {
+    g_source_destroy (self->seek_source);
+    g_source_unref (self->seek_source);
+    self->seek_source = NULL;
+  }
+  self->seek_position = GST_CLOCK_TIME_NONE;
+  self->last_seek_time = GST_CLOCK_TIME_NONE;
+  g_mutex_unlock (&self->lock);
+}
+
+static void
+dump_dot_file (GstPlayer * self, const gchar * name)
+{
+  gchar *full_name;
+
+  full_name = g_strdup_printf ("gst-player.%p.%s", self, name);
+
+  GST_DEBUG_BIN_TO_DOT_FILE_WITH_TS (GST_BIN (self->playbin),
+      GST_DEBUG_GRAPH_SHOW_ALL, full_name);
+
+  g_free (full_name);
+}
+
+typedef struct
+{
+  GstPlayer *player;
+  GError *err;
+} WarningSignalData;
+
+static void
+warning_dispatch (gpointer user_data)
+{
+  WarningSignalData *data = user_data;
+
+  g_signal_emit (data->player, signals[SIGNAL_WARNING], 0, data->err);
+}
+
+static void
+free_warning_signal_data (WarningSignalData * data)
+{
+  g_object_unref (data->player);
+  g_clear_error (&data->err);
+  g_free (data);
+}
+
+static void
+emit_warning (GstPlayer * self, GError * err)
+{
+  GST_ERROR_OBJECT (self, "Warning: %s (%s, %d)", err->message,
+      g_quark_to_string (err->domain), err->code);
+
+  if (g_signal_handler_find (self, G_SIGNAL_MATCH_ID,
+          signals[SIGNAL_WARNING], 0, NULL, NULL, NULL) != 0) {
+    WarningSignalData *data = g_new (WarningSignalData, 1);
+
+    data->player = g_object_ref (self);
+    data->err = g_error_copy (err);
+    gst_player_signal_dispatcher_dispatch (self->signal_dispatcher, self,
+        warning_dispatch, data, (GDestroyNotify) free_warning_signal_data);
+  }
+
+  g_error_free (err);
+}
+
+static void
+error_cb (G_GNUC_UNUSED GstBus * bus, GstMessage * msg, gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+  GError *err, *player_err;
+  gchar *name, *debug, *message, *full_message;
+
+  dump_dot_file (self, "error");
+
+  gst_message_parse_error (msg, &err, &debug);
+
+  name = gst_object_get_path_string (msg->src);
+  message = gst_error_get_message (err->domain, err->code);
+
+  if (debug)
+    full_message =
+        g_strdup_printf ("Error from element %s: %s\n%s\n%s", name, message,
+        err->message, debug);
+  else
+    full_message =
+        g_strdup_printf ("Error from element %s: %s\n%s", name, message,
+        err->message);
+
+  GST_ERROR_OBJECT (self, "ERROR: from element %s: %s\n", name, err->message);
+  if (debug != NULL)
+    GST_ERROR_OBJECT (self, "Additional debug info:\n%s\n", debug);
+
+  player_err =
+      g_error_new_literal (GST_PLAYER_ERROR, GST_PLAYER_ERROR_FAILED,
+      full_message);
+  emit_error (self, player_err);
+
+  g_clear_error (&err);
+  g_free (debug);
+  g_free (name);
+  g_free (full_message);
+  g_free (message);
+}
+
+static void
+warning_cb (G_GNUC_UNUSED GstBus * bus, GstMessage * msg, gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+  GError *err, *player_err;
+  gchar *name, *debug, *message, *full_message;
+
+  dump_dot_file (self, "warning");
+
+  gst_message_parse_warning (msg, &err, &debug);
+
+  name = gst_object_get_path_string (msg->src);
+  message = gst_error_get_message (err->domain, err->code);
+
+  if (debug)
+    full_message =
+        g_strdup_printf ("Warning from element %s: %s\n%s\n%s", name, message,
+        err->message, debug);
+  else
+    full_message =
+        g_strdup_printf ("Warning from element %s: %s\n%s", name, message,
+        err->message);
+
+  GST_WARNING_OBJECT (self, "WARNING: from element %s: %s\n", name,
+      err->message);
+  if (debug != NULL)
+    GST_WARNING_OBJECT (self, "Additional debug info:\n%s\n", debug);
+
+  player_err =
+      g_error_new_literal (GST_PLAYER_ERROR, GST_PLAYER_ERROR_FAILED,
+      full_message);
+  emit_warning (self, player_err);
+
+  g_clear_error (&err);
+  g_free (debug);
+  g_free (name);
+  g_free (full_message);
+  g_free (message);
+}
+
+static void
+eos_dispatch (gpointer user_data)
+{
+  g_signal_emit (user_data, signals[SIGNAL_END_OF_STREAM], 0);
+}
+
+static void
+eos_cb (G_GNUC_UNUSED GstBus * bus, G_GNUC_UNUSED GstMessage * msg,
+    gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+
+  GST_DEBUG_OBJECT (self, "End of stream");
+
+  tick_cb (self);
+  remove_tick_source (self);
+
+  if (g_signal_handler_find (self, G_SIGNAL_MATCH_ID,
+          signals[SIGNAL_END_OF_STREAM], 0, NULL, NULL, NULL) != 0) {
+    gst_player_signal_dispatcher_dispatch (self->signal_dispatcher, self,
+        eos_dispatch, g_object_ref (self), (GDestroyNotify) g_object_unref);
+  }
+  change_state (self, GST_PLAYER_STATE_STOPPED);
+  self->buffering = 100;
+  self->is_eos = TRUE;
+}
+
+typedef struct
+{
+  GstPlayer *player;
+  gint percent;
+} BufferingSignalData;
+
+static void
+buffering_dispatch (gpointer user_data)
+{
+  BufferingSignalData *data = user_data;
+
+  if (data->player->target_state >= GST_STATE_PAUSED) {
+    g_signal_emit (data->player, signals[SIGNAL_BUFFERING], 0, data->percent);
+  }
+}
+
+static void
+buffering_signal_data_free (BufferingSignalData * data)
+{
+  g_object_unref (data->player);
+  g_free (data);
+}
+
+static void
+buffering_cb (G_GNUC_UNUSED GstBus * bus, GstMessage * msg, gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+  gint percent;
+
+  if (self->target_state < GST_STATE_PAUSED)
+    return;
+  if (self->is_live)
+    return;
+
+  gst_message_parse_buffering (msg, &percent);
+  GST_LOG_OBJECT (self, "Buffering %d%%", percent);
+
+  if (percent < 100 && self->target_state >= GST_STATE_PAUSED) {
+    GstStateChangeReturn state_ret;
+
+    GST_DEBUG_OBJECT (self, "Waiting for buffering to finish");
+    state_ret = gst_element_set_state (self->playbin, GST_STATE_PAUSED);
+
+    if (state_ret == GST_STATE_CHANGE_FAILURE) {
+      emit_error (self, g_error_new (GST_PLAYER_ERROR, GST_PLAYER_ERROR_FAILED,
+              "Failed to handle buffering"));
+      return;
+    }
+
+    change_state (self, GST_PLAYER_STATE_BUFFERING);
+  }
+
+  if (self->buffering != percent) {
+    if (g_signal_handler_find (self, G_SIGNAL_MATCH_ID,
+            signals[SIGNAL_BUFFERING], 0, NULL, NULL, NULL) != 0) {
+      BufferingSignalData *data = g_new (BufferingSignalData, 1);
+
+      data->player = g_object_ref (self);
+      data->percent = percent;
+      gst_player_signal_dispatcher_dispatch (self->signal_dispatcher, self,
+          buffering_dispatch, data,
+          (GDestroyNotify) buffering_signal_data_free);
+    }
+
+    self->buffering = percent;
+  }
+
+
+  g_mutex_lock (&self->lock);
+  if (percent == 100 && (self->seek_position != GST_CLOCK_TIME_NONE ||
+          self->seek_pending)) {
+    g_mutex_unlock (&self->lock);
+
+    GST_DEBUG_OBJECT (self, "Buffering finished - seek pending");
+  } else if (percent == 100 && self->target_state >= GST_STATE_PLAYING
+      && self->current_state >= GST_STATE_PAUSED) {
+    GstStateChangeReturn state_ret;
+
+    g_mutex_unlock (&self->lock);
+
+    GST_DEBUG_OBJECT (self, "Buffering finished - going to PLAYING");
+    state_ret = gst_element_set_state (self->playbin, GST_STATE_PLAYING);
+    /* Application state change is happening when the state change happened */
+    if (state_ret == GST_STATE_CHANGE_FAILURE)
+      emit_error (self, g_error_new (GST_PLAYER_ERROR, GST_PLAYER_ERROR_FAILED,
+              "Failed to handle buffering"));
+  } else if (percent == 100 && self->target_state >= GST_STATE_PAUSED) {
+    g_mutex_unlock (&self->lock);
+
+    GST_DEBUG_OBJECT (self, "Buffering finished - staying PAUSED");
+    change_state (self, GST_PLAYER_STATE_PAUSED);
+  } else {
+    g_mutex_unlock (&self->lock);
+  }
+}
+
+static void
+clock_lost_cb (G_GNUC_UNUSED GstBus * bus, G_GNUC_UNUSED GstMessage * msg,
+    gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+  GstStateChangeReturn state_ret;
+
+  GST_DEBUG_OBJECT (self, "Clock lost");
+  if (self->target_state >= GST_STATE_PLAYING) {
+    state_ret = gst_element_set_state (self->playbin, GST_STATE_PAUSED);
+    if (state_ret != GST_STATE_CHANGE_FAILURE)
+      state_ret = gst_element_set_state (self->playbin, GST_STATE_PLAYING);
+
+    if (state_ret == GST_STATE_CHANGE_FAILURE)
+      emit_error (self, g_error_new (GST_PLAYER_ERROR, GST_PLAYER_ERROR_FAILED,
+              "Failed to handle clock loss"));
+  }
+}
+
+typedef struct
+{
+  GstPlayer *player;
+  gint width, height;
+} VideoDimensionsChangedSignalData;
+
+static void
+video_dimensions_changed_dispatch (gpointer user_data)
+{
+  VideoDimensionsChangedSignalData *data = user_data;
+
+  if (data->player->target_state >= GST_STATE_PAUSED) {
+    g_signal_emit (data->player, signals[SIGNAL_VIDEO_DIMENSIONS_CHANGED], 0,
+        data->width, data->height);
+  }
+}
+
+static void
+video_dimensions_changed_signal_data_free (VideoDimensionsChangedSignalData *
+    data)
+{
+  g_object_unref (data->player);
+  g_free (data);
+}
+
+static void
+check_video_dimensions_changed (GstPlayer * self)
+{
+  GstElement *video_sink;
+  GstPad *video_sink_pad;
+  GstCaps *caps;
+  GstVideoInfo info;
+  gint width = 0, height = 0;
+
+  g_object_get (self->playbin, "video-sink", &video_sink, NULL);
+  if (!video_sink)
+    goto out;
+
+  video_sink_pad = gst_element_get_static_pad (video_sink, "sink");
+  if (!video_sink_pad) {
+    gst_object_unref (video_sink);
+    goto out;
+  }
+
+  caps = gst_pad_get_current_caps (video_sink_pad);
+
+  if (caps) {
+    if (gst_video_info_from_caps (&info, caps)) {
+      info.width = info.width * info.par_n / info.par_d;
+
+      GST_DEBUG_OBJECT (self, "Video dimensions changed: %dx%d", info.width,
+          info.height);
+      width = info.width;
+      height = info.height;
+    }
+
+    gst_caps_unref (caps);
+  }
+  gst_object_unref (video_sink_pad);
+  gst_object_unref (video_sink);
+
+out:
+  if (g_signal_handler_find (self, G_SIGNAL_MATCH_ID,
+          signals[SIGNAL_VIDEO_DIMENSIONS_CHANGED], 0, NULL, NULL, NULL) != 0) {
+    VideoDimensionsChangedSignalData *data =
+        g_new (VideoDimensionsChangedSignalData, 1);
+
+    data->player = g_object_ref (self);
+    data->width = width;
+    data->height = height;
+    gst_player_signal_dispatcher_dispatch (self->signal_dispatcher, self,
+        video_dimensions_changed_dispatch, data,
+        (GDestroyNotify) video_dimensions_changed_signal_data_free);
+  }
+}
+
+static void
+notify_caps_cb (G_GNUC_UNUSED GObject * object,
+    G_GNUC_UNUSED GParamSpec * pspec, gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+
+  check_video_dimensions_changed (self);
+}
+
+typedef struct
+{
+  GstPlayer *player;
+  GstClockTime duration;
+} DurationChangedSignalData;
+
+static void
+duration_changed_dispatch (gpointer user_data)
+{
+  DurationChangedSignalData *data = user_data;
+
+  if (data->player->target_state >= GST_STATE_PAUSED) {
+    g_signal_emit (data->player, signals[SIGNAL_DURATION_CHANGED], 0,
+        data->duration);
+    g_object_notify_by_pspec (G_OBJECT (data->player),
+        param_specs[PROP_DURATION]);
+  }
+}
+
+static void
+duration_changed_signal_data_free (DurationChangedSignalData * data)
+{
+  g_object_unref (data->player);
+  g_free (data);
+}
+
+static void
+emit_duration_changed (GstPlayer * self, GstClockTime duration)
+{
+  GST_DEBUG_OBJECT (self, "Duration changed %" GST_TIME_FORMAT,
+      GST_TIME_ARGS (duration));
+
+  if (g_signal_handler_find (self, G_SIGNAL_MATCH_ID,
+          signals[SIGNAL_DURATION_CHANGED], 0, NULL, NULL, NULL) != 0) {
+    DurationChangedSignalData *data = g_new (DurationChangedSignalData, 1);
+
+    data->player = g_object_ref (self);
+    data->duration = duration;
+    gst_player_signal_dispatcher_dispatch (self->signal_dispatcher, self,
+        duration_changed_dispatch, data,
+        (GDestroyNotify) duration_changed_signal_data_free);
+  }
+}
+
+typedef struct
+{
+  GstPlayer *player;
+  GstClockTime position;
+} SeekDoneSignalData;
+
+static void
+seek_done_dispatch (gpointer user_data)
+{
+  SeekDoneSignalData *data = user_data;
+
+  g_signal_emit (data->player, signals[SIGNAL_SEEK_DONE], 0, data->position);
+}
+
+static void
+seek_done_signal_data_free (SeekDoneSignalData * data)
+{
+  g_object_unref (data->player);
+  g_free (data);
+}
+
+static void
+emit_seek_done (GstPlayer * self)
+{
+  if (g_signal_handler_find (self, G_SIGNAL_MATCH_ID,
+          signals[SIGNAL_SEEK_DONE], 0, NULL, NULL, NULL) != 0) {
+    SeekDoneSignalData *data = g_new (SeekDoneSignalData, 1);
+
+    data->player = g_object_ref (self);
+    data->position = gst_player_get_position (self);
+    gst_player_signal_dispatcher_dispatch (self->signal_dispatcher, self,
+        seek_done_dispatch, data, (GDestroyNotify) seek_done_signal_data_free);
+  }
+}
+
+static void
+state_changed_cb (G_GNUC_UNUSED GstBus * bus, GstMessage * msg,
+    gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+  GstState old_state, new_state, pending_state;
+
+  gst_message_parse_state_changed (msg, &old_state, &new_state, &pending_state);
+
+  if (GST_MESSAGE_SRC (msg) == GST_OBJECT (self->playbin)) {
+    gchar *transition_name;
+
+    GST_DEBUG_OBJECT (self, "Changed state old: %s new: %s pending: %s",
+        gst_element_state_get_name (old_state),
+        gst_element_state_get_name (new_state),
+        gst_element_state_get_name (pending_state));
+
+    transition_name = g_strdup_printf ("%s_%s",
+        gst_element_state_get_name (old_state),
+        gst_element_state_get_name (new_state));
+    dump_dot_file (self, transition_name);
+    g_free (transition_name);
+
+    self->current_state = new_state;
+
+    if (old_state == GST_STATE_READY && new_state == GST_STATE_PAUSED
+        && pending_state == GST_STATE_VOID_PENDING) {
+      GstElement *video_sink;
+      GstPad *video_sink_pad;
+      gint64 duration = -1;
+
+      GST_DEBUG_OBJECT (self, "Initial PAUSED - pre-rolled");
+
+      g_mutex_lock (&self->lock);
+      if (self->media_info)
+        g_object_unref (self->media_info);
+      self->media_info = gst_player_media_info_create (self);
+      g_mutex_unlock (&self->lock);
+      emit_media_info_updated_signal (self);
+
+      g_object_get (self->playbin, "video-sink", &video_sink, NULL);
+
+      if (video_sink) {
+        video_sink_pad = gst_element_get_static_pad (video_sink, "sink");
+
+        if (video_sink_pad) {
+          g_signal_connect (video_sink_pad, "notify::caps",
+              (GCallback) notify_caps_cb, self);
+          gst_object_unref (video_sink_pad);
+        }
+        gst_object_unref (video_sink);
+      }
+
+      check_video_dimensions_changed (self);
+      gst_element_query_duration (self->playbin, GST_FORMAT_TIME, &duration);
+      emit_duration_changed (self, duration);
+    }
+
+    if (new_state == GST_STATE_PAUSED
+        && pending_state == GST_STATE_VOID_PENDING) {
+      remove_tick_source (self);
+
+      g_mutex_lock (&self->lock);
+      if (self->seek_pending) {
+        self->seek_pending = FALSE;
+
+        if (!self->media_info->seekable) {
+          GST_DEBUG_OBJECT (self, "Media is not seekable");
+          if (self->seek_source) {
+            g_source_destroy (self->seek_source);
+            g_source_unref (self->seek_source);
+            self->seek_source = NULL;
+          }
+          self->seek_position = GST_CLOCK_TIME_NONE;
+          self->last_seek_time = GST_CLOCK_TIME_NONE;
+        } else if (self->seek_source) {
+          GST_DEBUG_OBJECT (self, "Seek finished but new seek is pending");
+          gst_player_seek_internal_locked (self);
+        } else {
+          GST_DEBUG_OBJECT (self, "Seek finished");
+          emit_seek_done (self);
+        }
+      }
+
+      if (self->seek_position != GST_CLOCK_TIME_NONE) {
+        GST_DEBUG_OBJECT (self, "Seeking now that we reached PAUSED state");
+        gst_player_seek_internal_locked (self);
+        g_mutex_unlock (&self->lock);
+      } else if (!self->seek_pending) {
+        g_mutex_unlock (&self->lock);
+
+        tick_cb (self);
+
+        if (self->target_state >= GST_STATE_PLAYING && self->buffering == 100) {
+          GstStateChangeReturn state_ret;
+
+          state_ret = gst_element_set_state (self->playbin, GST_STATE_PLAYING);
+          if (state_ret == GST_STATE_CHANGE_FAILURE)
+            emit_error (self, g_error_new (GST_PLAYER_ERROR,
+                    GST_PLAYER_ERROR_FAILED, "Failed to play"));
+        } else if (self->buffering == 100) {
+          change_state (self, GST_PLAYER_STATE_PAUSED);
+        }
+      } else {
+        g_mutex_unlock (&self->lock);
+      }
+    } else if (new_state == GST_STATE_PLAYING
+        && pending_state == GST_STATE_VOID_PENDING) {
+
+      /* If no seek is currently pending, add the tick source. This can happen
+       * if we seeked already but the state-change message was still queued up */
+      if (!self->seek_pending) {
+        add_tick_source (self);
+        change_state (self, GST_PLAYER_STATE_PLAYING);
+      }
+    } else if (new_state == GST_STATE_READY && old_state > GST_STATE_READY) {
+      change_state (self, GST_PLAYER_STATE_STOPPED);
+    } else {
+      /* Otherwise we neither reached PLAYING nor PAUSED, so must
+       * wait for something to happen... i.e. are BUFFERING now */
+      change_state (self, GST_PLAYER_STATE_BUFFERING);
+    }
+  }
+}
+
+static void
+duration_changed_cb (G_GNUC_UNUSED GstBus * bus, G_GNUC_UNUSED GstMessage * msg,
+    gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+  gint64 duration;
+
+  if (gst_element_query_duration (self->playbin, GST_FORMAT_TIME, &duration)) {
+    emit_duration_changed (self, duration);
+  }
+}
+
+static void
+latency_cb (G_GNUC_UNUSED GstBus * bus, G_GNUC_UNUSED GstMessage * msg,
+    gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+
+  GST_DEBUG_OBJECT (self, "Latency changed");
+
+  gst_bin_recalculate_latency (GST_BIN (self->playbin));
+}
+
+static void
+request_state_cb (G_GNUC_UNUSED GstBus * bus, GstMessage * msg,
+    gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+  GstState state;
+  GstStateChangeReturn state_ret;
+
+  gst_message_parse_request_state (msg, &state);
+
+  GST_DEBUG_OBJECT (self, "State %s requested",
+      gst_element_state_get_name (state));
+
+  self->target_state = state;
+  state_ret = gst_element_set_state (self->playbin, state);
+  if (state_ret == GST_STATE_CHANGE_FAILURE)
+    emit_error (self, g_error_new (GST_PLAYER_ERROR, GST_PLAYER_ERROR_FAILED,
+            "Failed to change to requested state %s",
+            gst_element_state_get_name (state)));
+}
+
+static void
+media_info_update (GstPlayer * self, GstPlayerMediaInfo * info)
+{
+  g_free (info->title);
+  info->title = get_from_tags (self, info, get_title);
+
+  g_free (info->container);
+  info->container = get_from_tags (self, info, get_container_format);
+
+  if (info->image_sample)
+    gst_sample_unref (info->image_sample);
+  info->image_sample = get_from_tags (self, info, get_cover_sample);
+
+  GST_DEBUG_OBJECT (self, "title: %s, container: %s "
+      "image_sample: %p", info->title, info->container, info->image_sample);
+}
+
+static void
+tags_cb (G_GNUC_UNUSED GstBus * bus, GstMessage * msg, gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+  GstTagList *tags = NULL;
+
+  gst_message_parse_tag (msg, &tags);
+
+  /*
+   * NOTE: Inorder to get global tag you must apply the following patches in
+   * your gstreamer build.
+   *
+   * http://cgit.freedesktop.org/gstreamer/gst-plugins-good/commit/?id=9119fbd774093e3ae762c8652acd80d54b2c3b45
+   * http://cgit.freedesktop.org/gstreamer/gstreamer/commit/?id=18b058100940bdcaed86fa412e3582a02871f995
+   */
+  GST_DEBUG_OBJECT (self, "recieved %s tags",
+      gst_tag_list_get_scope (tags) ==
+      GST_TAG_SCOPE_GLOBAL ? "global" : "stream");
+
+  if (gst_tag_list_get_scope (tags) == GST_TAG_SCOPE_GLOBAL) {
+    g_mutex_lock (&self->lock);
+    if (self->media_info) {
+      if (self->media_info->tags)
+        gst_tag_list_unref (self->media_info->tags);
+      self->media_info->tags = gst_tag_list_ref (tags);
+      media_info_update (self, self->media_info);
+      g_mutex_unlock (&self->lock);
+      emit_media_info_updated_signal (self);
+    } else {
+      if (self->global_tags)
+        gst_tag_list_unref (self->global_tags);
+      self->global_tags = gst_tag_list_ref (tags);
+      g_mutex_unlock (&self->lock);
+    }
+  }
+
+  gst_tag_list_unref (tags);
+}
+
+static void
+element_cb (G_GNUC_UNUSED GstBus * bus, GstMessage * msg, gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+  const GstStructure *s;
+
+  s = gst_message_get_structure (msg);
+  if (gst_structure_has_name (s, "redirect")) {
+    const gchar *new_location;
+
+    new_location = gst_structure_get_string (s, "new-location");
+    if (!new_location) {
+      const GValue *locations_list, *location_val;
+      guint i, size;
+
+      locations_list = gst_structure_get_value (s, "locations");
+      size = gst_value_list_get_size (locations_list);
+      for (i = 0; i < size; ++i) {
+        const GstStructure *location_s;
+
+        location_val = gst_value_list_get_value (locations_list, i);
+        if (!GST_VALUE_HOLDS_STRUCTURE (location_val))
+          continue;
+
+        location_s = (const GstStructure *) g_value_get_boxed (location_val);
+        if (!gst_structure_has_name (location_s, "redirect"))
+          continue;
+
+        new_location = gst_structure_get_string (location_s, "new-location");
+        if (new_location)
+          break;
+      }
+    }
+
+    if (new_location) {
+      GstState target_state;
+
+      GST_DEBUG_OBJECT (self, "Redirect to '%s'", new_location);
+
+      /* Remember target state and restore after setting the URI */
+      target_state = self->target_state;
+
+      g_mutex_lock (&self->lock);
+      g_free (self->uri);
+
+      self->uri = g_strdup (new_location);
+      g_mutex_unlock (&self->lock);
+
+      gst_player_set_uri_internal (self);
+
+      if (target_state == GST_STATE_PAUSED)
+        gst_player_pause_internal (self);
+      else if (target_state == GST_STATE_PLAYING)
+        gst_player_play_internal (self);
+    }
+  }
+}
+
+static void
+player_set_flag (GstPlayer * self, gint pos)
+{
+  gint flags;
+
+  g_object_get (self->playbin, "flags", &flags, NULL);
+  flags |= pos;
+  g_object_set (self->playbin, "flags", flags, NULL);
+
+  GST_DEBUG_OBJECT (self, "setting flags=%#x", flags);
+}
+
+static void
+player_clear_flag (GstPlayer * self, gint pos)
+{
+  gint flags;
+
+  g_object_get (self->playbin, "flags", &flags, NULL);
+  flags &= ~pos;
+  g_object_set (self->playbin, "flags", flags, NULL);
+
+  GST_DEBUG_OBJECT (self, "setting flags=%#x", flags);
+}
+
+typedef struct
+{
+  GstPlayer *player;
+  GstPlayerMediaInfo *info;
+} MediaInfoUpdatedSignalData;
+
+static void
+media_info_updated_dispatch (gpointer user_data)
+{
+  MediaInfoUpdatedSignalData *data = user_data;
+
+  if (data->player->target_state >= GST_STATE_PAUSED) {
+    g_signal_emit (data->player, signals[SIGNAL_MEDIA_INFO_UPDATED], 0,
+        data->info);
+  }
+}
+
+static void
+free_media_info_updated_signal_data (MediaInfoUpdatedSignalData * data)
+{
+  g_object_unref (data->player);
+  g_object_unref (data->info);
+  g_free (data);
+}
+
+/*
+ * emit_media_info_updated_signal:
+ *
+ * create a new copy of self->media_info object and emits the newly created
+ * copy to user application. The newly created media_info will be unref'ed
+ * as part of signal finalize method.
+ */
+static void
+emit_media_info_updated_signal (GstPlayer * self)
+{
+  MediaInfoUpdatedSignalData *data = g_new (MediaInfoUpdatedSignalData, 1);
+  data->player = g_object_ref (self);
+  g_mutex_lock (&self->lock);
+  data->info = gst_player_media_info_copy (self->media_info);
+  g_mutex_unlock (&self->lock);
+
+  gst_player_signal_dispatcher_dispatch (self->signal_dispatcher, self,
+      media_info_updated_dispatch, data,
+      (GDestroyNotify) free_media_info_updated_signal_data);
+}
+
+static GstCaps *
+get_caps (GstPlayer * self, gint stream_index, GType type)
+{
+  GstPad *pad = NULL;
+  GstCaps *caps = NULL;
+
+  if (type == GST_TYPE_PLAYER_VIDEO_INFO)
+    g_signal_emit_by_name (G_OBJECT (self->playbin),
+        "get-video-pad", stream_index, &pad);
+  else if (type == GST_TYPE_PLAYER_AUDIO_INFO)
+    g_signal_emit_by_name (G_OBJECT (self->playbin),
+        "get-audio-pad", stream_index, &pad);
+  else
+    g_signal_emit_by_name (G_OBJECT (self->playbin),
+        "get-text-pad", stream_index, &pad);
+
+  if (pad) {
+    caps = gst_pad_get_current_caps (pad);
+    gst_object_unref (pad);
+  }
+
+  return caps;
+}
+
+static void
+gst_player_subtitle_info_update (GstPlayer * self,
+    GstPlayerStreamInfo * stream_info)
+{
+  GstPlayerSubtitleInfo *info = (GstPlayerSubtitleInfo *) stream_info;
+
+  if (stream_info->tags) {
+
+    /* free the old language info */
+    g_free (info->language);
+    info->language = NULL;
+
+    /* First try to get the language full name from tag, if name is not
+     * available then try language code. If we find the language code
+     * then use gstreamer api to translate code to full name.
+     */
+    gst_tag_list_get_string (stream_info->tags, GST_TAG_LANGUAGE_NAME,
+        &info->language);
+    if (!info->language) {
+      gchar *lang_code = NULL;
+
+      gst_tag_list_get_string (stream_info->tags, GST_TAG_LANGUAGE_CODE,
+          &lang_code);
+      if (lang_code) {
+        info->language = g_strdup (gst_tag_get_language_name (lang_code));
+        g_free (lang_code);
+      }
+    }
+
+    /* If we are still failed to find language name then check if external
+     * subtitle is loaded and compare the stream index between current sub
+     * stream index with our stream index and if matches then declare it as
+     * external subtitle and use the filename.
+     */
+    if (!info->language) {
+      gint text_index = -1;
+      gchar *suburi = NULL;
+
+      g_object_get (G_OBJECT (self->playbin), "current-suburi", &suburi, NULL);
+      if (suburi) {
+        g_object_get (G_OBJECT (self->playbin), "current-text", &text_index,
+            NULL);
+        if (text_index == gst_player_stream_info_get_index (stream_info))
+          info->language = g_path_get_basename (suburi);
+        g_free (suburi);
+      }
+    }
+
+  } else {
+    g_free (info->language);
+    info->language = NULL;
+  }
+
+  GST_DEBUG_OBJECT (self, "language=%s", info->language);
+}
+
+static void
+gst_player_video_info_update (GstPlayer * self,
+    GstPlayerStreamInfo * stream_info)
+{
+  GstPlayerVideoInfo *info = (GstPlayerVideoInfo *) stream_info;
+
+  if (stream_info->caps) {
+    GstStructure *s;
+
+    s = gst_caps_get_structure (stream_info->caps, 0);
+    if (s) {
+      gint width, height;
+      gint fps_n, fps_d;
+      gint par_n, par_d;
+
+      if (gst_structure_get_int (s, "width", &width))
+        info->width = width;
+      else
+        info->width = -1;
+
+      if (gst_structure_get_int (s, "height", &height))
+        info->height = height;
+      else
+        info->height = -1;
+
+      if (gst_structure_get_fraction (s, "framerate", &fps_n, &fps_d)) {
+        info->framerate_num = fps_n;
+        info->framerate_denom = fps_d;
+      } else {
+        info->framerate_num = 0;
+        info->framerate_denom = 1;
+      }
+
+
+      if (gst_structure_get_fraction (s, "pixel-aspect-ratio", &par_n, &par_d)) {
+        info->par_num = par_n;
+        info->par_denom = par_d;
+      } else {
+        info->par_num = 1;
+        info->par_denom = 1;
+      }
+    }
+  } else {
+    info->width = info->height = -1;
+    info->par_num = info->par_denom = 1;
+    info->framerate_num = 0;
+    info->framerate_denom = 1;
+  }
+
+  if (stream_info->tags) {
+    guint bitrate, max_bitrate;
+
+    if (gst_tag_list_get_uint (stream_info->tags, GST_TAG_BITRATE, &bitrate))
+      info->bitrate = bitrate;
+    else
+      info->bitrate = -1;
+
+    if (gst_tag_list_get_uint (stream_info->tags, GST_TAG_MAXIMUM_BITRATE,
+            &max_bitrate) || gst_tag_list_get_uint (stream_info->tags,
+            GST_TAG_NOMINAL_BITRATE, &max_bitrate))
+      info->max_bitrate = max_bitrate;
+    else
+      info->max_bitrate = -1;
+  } else {
+    info->bitrate = info->max_bitrate = -1;
+  }
+
+  GST_DEBUG_OBJECT (self, "width=%d height=%d fps=%.2f par=%d:%d "
+      "bitrate=%d max_bitrate=%d", info->width, info->height,
+      (gdouble) info->framerate_num / info->framerate_denom,
+      info->par_num, info->par_denom, info->bitrate, info->max_bitrate);
+}
+
+static void
+gst_player_audio_info_update (GstPlayer * self,
+    GstPlayerStreamInfo * stream_info)
+{
+  GstPlayerAudioInfo *info = (GstPlayerAudioInfo *) stream_info;
+
+  if (stream_info->caps) {
+    GstStructure *s;
+
+    s = gst_caps_get_structure (stream_info->caps, 0);
+    if (s) {
+      gint rate, channels;
+
+      if (gst_structure_get_int (s, "rate", &rate))
+        info->sample_rate = rate;
+      else
+        info->sample_rate = -1;
+
+      if (gst_structure_get_int (s, "channels", &channels))
+        info->channels = channels;
+      else
+        info->channels = 0;
+    }
+  } else {
+    info->sample_rate = -1;
+    info->channels = 0;
+  }
+
+  if (stream_info->tags) {
+    guint bitrate, max_bitrate;
+
+    if (gst_tag_list_get_uint (stream_info->tags, GST_TAG_BITRATE, &bitrate))
+      info->bitrate = bitrate;
+    else
+      info->bitrate = -1;
+
+    if (gst_tag_list_get_uint (stream_info->tags, GST_TAG_MAXIMUM_BITRATE,
+            &max_bitrate) || gst_tag_list_get_uint (stream_info->tags,
+            GST_TAG_NOMINAL_BITRATE, &max_bitrate))
+      info->max_bitrate = max_bitrate;
+    else
+      info->max_bitrate = -1;
+
+    /* if we have old language the free it */
+    g_free (info->language);
+    info->language = NULL;
+
+    /* First try to get the language full name from tag, if name is not
+     * available then try language code. If we find the language code
+     * then use gstreamer api to translate code to full name.
+     */
+    gst_tag_list_get_string (stream_info->tags, GST_TAG_LANGUAGE_NAME,
+        &info->language);
+    if (!info->language) {
+      gchar *lang_code = NULL;
+
+      gst_tag_list_get_string (stream_info->tags, GST_TAG_LANGUAGE_CODE,
+          &lang_code);
+      if (lang_code) {
+        info->language = g_strdup (gst_tag_get_language_name (lang_code));
+        g_free (lang_code);
+      }
+    }
+  } else {
+    g_free (info->language);
+    info->language = NULL;
+    info->max_bitrate = info->bitrate = -1;
+  }
+
+  GST_DEBUG_OBJECT (self, "language=%s rate=%d channels=%d bitrate=%d "
+      "max_bitrate=%d", info->language, info->sample_rate, info->channels,
+      info->bitrate, info->bitrate);
+}
+
+static GstPlayerStreamInfo *
+gst_player_stream_info_find (GstPlayerMediaInfo * media_info,
+    GType type, gint stream_index)
+{
+  GList *list, *l;
+  GstPlayerStreamInfo *info = NULL;
+
+  if (!media_info)
+    return NULL;
+
+  list = gst_player_media_info_get_stream_list (media_info);
+  for (l = list; l != NULL; l = l->next) {
+    info = (GstPlayerStreamInfo *) l->data;
+    if ((G_OBJECT_TYPE (info) == type) && (info->stream_index == stream_index)) {
+      return info;
+    }
+  }
+
+  return NULL;
+}
+
+static gboolean
+is_track_enabled (GstPlayer * self, gint pos)
+{
+  gint flags;
+
+  g_object_get (G_OBJECT (self->playbin), "flags", &flags, NULL);
+
+  if ((flags & pos))
+    return TRUE;
+
+  return FALSE;
+}
+
+static GstPlayerStreamInfo *
+gst_player_stream_info_get_current (GstPlayer * self, const gchar * prop,
+    GType type)
+{
+  gint current;
+  GstPlayerStreamInfo *info;
+
+  if (!self->media_info)
+    return NULL;
+
+  g_object_get (G_OBJECT (self->playbin), prop, &current, NULL);
+  g_mutex_lock (&self->lock);
+  info = gst_player_stream_info_find (self->media_info, type, current);
+  if (info)
+    info = gst_player_stream_info_copy (info);
+  g_mutex_unlock (&self->lock);
+
+  return info;
+}
+
+static void
+gst_player_stream_info_update (GstPlayer * self, GstPlayerStreamInfo * s)
+{
+  if (GST_IS_PLAYER_VIDEO_INFO (s))
+    gst_player_video_info_update (self, s);
+  else if (GST_IS_PLAYER_AUDIO_INFO (s))
+    gst_player_audio_info_update (self, s);
+  else
+    gst_player_subtitle_info_update (self, s);
+}
+
+static gchar *
+stream_info_get_codec (GstPlayerStreamInfo * s)
+{
+  const gchar *type;
+  GstTagList *tags;
+  gchar *codec = NULL;
+
+  if (GST_IS_PLAYER_VIDEO_INFO (s))
+    type = GST_TAG_VIDEO_CODEC;
+  else if (GST_IS_PLAYER_AUDIO_INFO (s))
+    type = GST_TAG_AUDIO_CODEC;
+  else
+    type = GST_TAG_SUBTITLE_CODEC;
+
+  tags = gst_player_stream_info_get_tags (s);
+  if (tags) {
+    gst_tag_list_get_string (tags, type, &codec);
+    if (!codec)
+      gst_tag_list_get_string (tags, GST_TAG_CODEC, &codec);
+  }
+
+  if (!codec) {
+    GstCaps *caps;
+    caps = gst_player_stream_info_get_caps (s);
+    if (caps) {
+      codec = gst_pb_utils_get_codec_description (caps);
+    }
+  }
+
+  return codec;
+}
+
+static void
+gst_player_stream_info_update_tags_and_caps (GstPlayer * self,
+    GstPlayerStreamInfo * s)
+{
+  GstTagList *tags;
+  gint stream_index;
+
+  stream_index = gst_player_stream_info_get_index (s);
+
+  if (GST_IS_PLAYER_VIDEO_INFO (s))
+    g_signal_emit_by_name (self->playbin, "get-video-tags",
+        stream_index, &tags);
+  else if (GST_IS_PLAYER_AUDIO_INFO (s))
+    g_signal_emit_by_name (self->playbin, "get-audio-tags",
+        stream_index, &tags);
+  else
+    g_signal_emit_by_name (self->playbin, "get-text-tags", stream_index, &tags);
+
+  if (s->tags)
+    gst_tag_list_unref (s->tags);
+  s->tags = tags;
+
+  if (s->caps)
+    gst_caps_unref (s->caps);
+  s->caps = get_caps (self, stream_index, G_OBJECT_TYPE (s));
+
+  g_free (s->codec);
+  s->codec = stream_info_get_codec (s);
+
+  GST_DEBUG_OBJECT (self, "%s index: %d tags: %p caps: %p",
+      gst_player_stream_info_get_stream_type (s), stream_index,
+      s->tags, s->caps);
+
+  gst_player_stream_info_update (self, s);
+}
+
+static void
+gst_player_streams_info_create (GstPlayer * self,
+    GstPlayerMediaInfo * media_info, const gchar * prop, GType type)
+{
+  gint i;
+  gint total = -1;
+  GstPlayerStreamInfo *s;
+
+  if (!media_info)
+    return;
+
+  g_object_get (G_OBJECT (self->playbin), prop, &total, NULL);
+
+  GST_DEBUG_OBJECT (self, "%s: %d", prop, total);
+
+  for (i = 0; i < total; i++) {
+    /* check if stream already exist in the list */
+    s = gst_player_stream_info_find (media_info, type, i);
+
+    if (!s) {
+      /* create a new stream info instance */
+      s = gst_player_stream_info_new (i, type);
+
+      /* add the object in stream list */
+      media_info->stream_list = g_list_append (media_info->stream_list, s);
+
+      /* based on type, add the object in its corresponding stream_ list */
+      if (GST_IS_PLAYER_AUDIO_INFO (s))
+        media_info->audio_stream_list = g_list_append
+            (media_info->audio_stream_list, s);
+      else if (GST_IS_PLAYER_VIDEO_INFO (s))
+        media_info->video_stream_list = g_list_append
+            (media_info->video_stream_list, s);
+      else
+        media_info->subtitle_stream_list = g_list_append
+            (media_info->subtitle_stream_list, s);
+
+      GST_DEBUG_OBJECT (self, "create %s stream stream_index: %d",
+          gst_player_stream_info_get_stream_type (s), i);
+    }
+
+    gst_player_stream_info_update_tags_and_caps (self, s);
+  }
+}
+
+static void
+video_changed_cb (G_GNUC_UNUSED GObject * object, gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+
+  g_mutex_lock (&self->lock);
+  gst_player_streams_info_create (self, self->media_info,
+      "n-video", GST_TYPE_PLAYER_VIDEO_INFO);
+  g_mutex_unlock (&self->lock);
+}
+
+static void
+audio_changed_cb (G_GNUC_UNUSED GObject * object, gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+
+  g_mutex_lock (&self->lock);
+  gst_player_streams_info_create (self, self->media_info,
+      "n-audio", GST_TYPE_PLAYER_AUDIO_INFO);
+  g_mutex_unlock (&self->lock);
+}
+
+static void
+subtitle_changed_cb (G_GNUC_UNUSED GObject * object, gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+
+  g_mutex_lock (&self->lock);
+  gst_player_streams_info_create (self, self->media_info,
+      "n-text", GST_TYPE_PLAYER_SUBTITLE_INFO);
+  g_mutex_unlock (&self->lock);
+}
+
+static void *
+get_title (GstTagList * tags)
+{
+  gchar *title = NULL;
+
+  gst_tag_list_get_string (tags, GST_TAG_TITLE, &title);
+  if (!title)
+    gst_tag_list_get_string (tags, GST_TAG_TITLE_SORTNAME, &title);
+
+  return title;
+}
+
+static void *
+get_container_format (GstTagList * tags)
+{
+  gchar *container = NULL;
+
+  gst_tag_list_get_string (tags, GST_TAG_CONTAINER_FORMAT, &container);
+
+  /* TODO: If container is not available then maybe consider
+   * parsing caps or file extension to guess the container format.
+   */
+
+  return container;
+}
+
+static void *
+get_from_tags (GstPlayer * self, GstPlayerMediaInfo * media_info,
+    void *(*func) (GstTagList *))
+{
+  GList *l;
+  void *ret = NULL;
+
+  if (media_info->tags) {
+    ret = func (media_info->tags);
+    if (ret)
+      return ret;
+  }
+
+  /* if global tag does not exit then try video and audio streams */
+  GST_DEBUG_OBJECT (self, "trying video tags");
+  for (l = gst_player_get_video_streams (media_info); l != NULL; l = l->next) {
+    GstTagList *tags;
+
+    tags = gst_player_stream_info_get_tags ((GstPlayerStreamInfo *) l->data);
+    if (tags)
+      ret = func (tags);
+
+    if (ret)
+      return ret;
+  }
+
+  GST_DEBUG_OBJECT (self, "trying audio tags");
+  for (l = gst_player_get_audio_streams (media_info); l != NULL; l = l->next) {
+    GstTagList *tags;
+
+    tags = gst_player_stream_info_get_tags ((GstPlayerStreamInfo *) l->data);
+    if (tags)
+      ret = func (tags);
+
+    if (ret)
+      return ret;
+  }
+
+  GST_DEBUG_OBJECT (self, "failed to get the information from tags");
+  return NULL;
+}
+
+static void *
+get_cover_sample (GstTagList * tags)
+{
+  GstSample *cover_sample = NULL;
+
+  gst_tag_list_get_sample (tags, GST_TAG_IMAGE, &cover_sample);
+  if (!cover_sample)
+    gst_tag_list_get_sample (tags, GST_TAG_PREVIEW_IMAGE, &cover_sample);
+
+  return cover_sample;
+}
+
+static GstPlayerMediaInfo *
+gst_player_media_info_create (GstPlayer * self)
+{
+  GstPlayerMediaInfo *media_info;
+  GstQuery *query;
+
+  GST_DEBUG_OBJECT (self, "begin");
+  media_info = gst_player_media_info_new (self->uri);
+  media_info->duration = gst_player_get_duration (self);
+  media_info->tags = self->global_tags;
+  self->global_tags = NULL;
+
+  query = gst_query_new_seeking (GST_FORMAT_TIME);
+  if (gst_element_query (self->playbin, query))
+    gst_query_parse_seeking (query, NULL, &media_info->seekable, NULL, NULL);
+  gst_query_unref (query);
+
+  /* create audio/video/sub streams */
+  gst_player_streams_info_create (self, media_info, "n-video",
+      GST_TYPE_PLAYER_VIDEO_INFO);
+  gst_player_streams_info_create (self, media_info, "n-audio",
+      GST_TYPE_PLAYER_AUDIO_INFO);
+  gst_player_streams_info_create (self, media_info, "n-text",
+      GST_TYPE_PLAYER_SUBTITLE_INFO);
+
+  media_info->title = get_from_tags (self, media_info, get_title);
+  media_info->container =
+      get_from_tags (self, media_info, get_container_format);
+  media_info->image_sample = get_from_tags (self, media_info, get_cover_sample);
+
+  GST_DEBUG_OBJECT (self, "uri: %s title: %s duration: %" GST_TIME_FORMAT
+      " seekable: %s container: %s image_sample %p",
+      media_info->uri, media_info->title, GST_TIME_ARGS (media_info->duration),
+      media_info->seekable ? "yes" : "no", media_info->container,
+      media_info->image_sample);
+
+  GST_DEBUG_OBJECT (self, "end");
+  return media_info;
+}
+
+static void
+tags_changed_cb (GstPlayer * self, gint stream_index, GType type)
+{
+  GstPlayerStreamInfo *s;
+
+  if (!self->media_info)
+    return;
+
+  /* update the stream information */
+  g_mutex_lock (&self->lock);
+  s = gst_player_stream_info_find (self->media_info, type, stream_index);
+  gst_player_stream_info_update_tags_and_caps (self, s);
+  g_mutex_unlock (&self->lock);
+
+  emit_media_info_updated_signal (self);
+}
+
+static void
+video_tags_changed_cb (G_GNUC_UNUSED GstElement * playbin, gint stream_index,
+    gpointer user_data)
+{
+  tags_changed_cb (GST_PLAYER (user_data), stream_index,
+      GST_TYPE_PLAYER_VIDEO_INFO);
+}
+
+static void
+audio_tags_changed_cb (G_GNUC_UNUSED GstElement * playbin, gint stream_index,
+    gpointer user_data)
+{
+  tags_changed_cb (GST_PLAYER (user_data), stream_index,
+      GST_TYPE_PLAYER_AUDIO_INFO);
+}
+
+static void
+subtitle_tags_changed_cb (G_GNUC_UNUSED GstElement * playbin, gint stream_index,
+    gpointer user_data)
+{
+  tags_changed_cb (GST_PLAYER (user_data), stream_index,
+      GST_TYPE_PLAYER_SUBTITLE_INFO);
+}
+
+static void
+volume_changed_dispatch (gpointer user_data)
+{
+  g_signal_emit (user_data, signals[SIGNAL_VOLUME_CHANGED], 0);
+  g_object_notify_by_pspec (G_OBJECT (user_data), param_specs[PROP_VOLUME]);
+}
+
+static void
+volume_notify_cb (G_GNUC_UNUSED GObject * obj, G_GNUC_UNUSED GParamSpec * pspec,
+    GstPlayer * self)
+{
+  if (g_signal_handler_find (self, G_SIGNAL_MATCH_ID,
+          signals[SIGNAL_VOLUME_CHANGED], 0, NULL, NULL, NULL) != 0) {
+    gst_player_signal_dispatcher_dispatch (self->signal_dispatcher, self,
+        volume_changed_dispatch, g_object_ref (self),
+        (GDestroyNotify) g_object_unref);
+  }
+}
+
+static void
+mute_changed_dispatch (gpointer user_data)
+{
+  g_signal_emit (user_data, signals[SIGNAL_MUTE_CHANGED], 0);
+  g_object_notify_by_pspec (G_OBJECT (user_data), param_specs[PROP_MUTE]);
+}
+
+static void
+mute_notify_cb (G_GNUC_UNUSED GObject * obj, G_GNUC_UNUSED GParamSpec * pspec,
+    GstPlayer * self)
+{
+  if (g_signal_handler_find (self, G_SIGNAL_MATCH_ID,
+          signals[SIGNAL_MUTE_CHANGED], 0, NULL, NULL, NULL) != 0) {
+    gst_player_signal_dispatcher_dispatch (self->signal_dispatcher, self,
+        mute_changed_dispatch, g_object_ref (self),
+        (GDestroyNotify) g_object_unref);
+  }
+}
+
+static gpointer
+gst_player_main (gpointer data)
+{
+  GstPlayer *self = GST_PLAYER (data);
+  GstBus *bus;
+  GSource *source;
+  GSource *bus_source;
+  GstElement *scaletempo;
+
+  GST_TRACE_OBJECT (self, "Starting main thread");
+
+  g_main_context_push_thread_default (self->context);
+
+  source = g_idle_source_new ();
+  g_source_set_callback (source, (GSourceFunc) main_loop_running_cb, self,
+      NULL);
+  g_source_attach (source, self->context);
+  g_source_unref (source);
+
+  self->playbin = gst_element_factory_make ("playbin", "playbin");
+
+  if (self->video_renderer) {
+    GstElement *video_sink =
+        gst_player_video_renderer_create_video_sink (self->video_renderer,
+        self);
+
+    if (video_sink)
+      g_object_set (self->playbin, "video-sink", video_sink, NULL);
+  }
+
+  scaletempo = gst_element_factory_make ("scaletempo", NULL);
+  if (scaletempo) {
+    if (gst_plugin_feature_check_version (GST_PLUGIN_FEATURE
+            (gst_element_get_factory (scaletempo)), 1, 6, 1)) {
+      g_object_set (self->playbin, "audio-filter", scaletempo, NULL);
+    } else {
+      gst_object_unref (scaletempo);
+      g_warning ("GstPlayer: scaletempo >= 1.6.1 is needed for preserving "
+          "audio pitch during trick modes");
+    }
+  } else {
+    g_warning ("GstPlayer: scaletempo element not available. Audio pitch "
+        "will not be preserved during trick modes");
+  }
+
+  self->bus = bus = gst_element_get_bus (self->playbin);
+  bus_source = gst_bus_create_watch (bus);
+  g_source_set_callback (bus_source, (GSourceFunc) gst_bus_async_signal_func,
+      NULL, NULL);
+  g_source_attach (bus_source, self->context);
+
+  g_signal_connect (G_OBJECT (bus), "message::error", G_CALLBACK (error_cb),
+      self);
+  g_signal_connect (G_OBJECT (bus), "message::warning", G_CALLBACK (warning_cb),
+      self);
+  g_signal_connect (G_OBJECT (bus), "message::eos", G_CALLBACK (eos_cb), self);
+  g_signal_connect (G_OBJECT (bus), "message::state-changed",
+      G_CALLBACK (state_changed_cb), self);
+  g_signal_connect (G_OBJECT (bus), "message::buffering",
+      G_CALLBACK (buffering_cb), self);
+  g_signal_connect (G_OBJECT (bus), "message::clock-lost",
+      G_CALLBACK (clock_lost_cb), self);
+  g_signal_connect (G_OBJECT (bus), "message::duration-changed",
+      G_CALLBACK (duration_changed_cb), self);
+  g_signal_connect (G_OBJECT (bus), "message::latency",
+      G_CALLBACK (latency_cb), self);
+  g_signal_connect (G_OBJECT (bus), "message::request-state",
+      G_CALLBACK (request_state_cb), self);
+  g_signal_connect (G_OBJECT (bus), "message::element",
+      G_CALLBACK (element_cb), self);
+  g_signal_connect (G_OBJECT (bus), "message::tag", G_CALLBACK (tags_cb), self);
+
+  g_signal_connect (self->playbin, "video-changed",
+      G_CALLBACK (video_changed_cb), self);
+  g_signal_connect (self->playbin, "audio-changed",
+      G_CALLBACK (audio_changed_cb), self);
+  g_signal_connect (self->playbin, "text-changed",
+      G_CALLBACK (subtitle_changed_cb), self);
+
+  g_signal_connect (self->playbin, "video-tags-changed",
+      G_CALLBACK (video_tags_changed_cb), self);
+  g_signal_connect (self->playbin, "audio-tags-changed",
+      G_CALLBACK (audio_tags_changed_cb), self);
+  g_signal_connect (self->playbin, "text-tags-changed",
+      G_CALLBACK (subtitle_tags_changed_cb), self);
+  g_signal_connect (self->playbin, "notify::volume",
+      G_CALLBACK (volume_notify_cb), self);
+  g_signal_connect (self->playbin, "notify::mute",
+      G_CALLBACK (mute_notify_cb), self);
+
+  self->target_state = GST_STATE_NULL;
+  self->current_state = GST_STATE_NULL;
+  change_state (self, GST_PLAYER_STATE_STOPPED);
+  self->buffering = 100;
+  self->is_eos = FALSE;
+  self->is_live = FALSE;
+
+  GST_TRACE_OBJECT (self, "Starting main loop");
+  g_main_loop_run (self->loop);
+  GST_TRACE_OBJECT (self, "Stopped main loop");
+
+  g_source_destroy (bus_source);
+  g_source_unref (bus_source);
+  gst_object_unref (bus);
+
+  remove_tick_source (self);
+  remove_ready_timeout_source (self);
+
+  g_mutex_lock (&self->lock);
+  if (self->media_info) {
+    g_object_unref (self->media_info);
+    self->media_info = NULL;
+  }
+
+  if (self->seek_source)
+    g_source_unref (self->seek_source);
+  self->seek_source = NULL;
+  g_mutex_unlock (&self->lock);
+
+  g_main_context_pop_thread_default (self->context);
+
+  self->target_state = GST_STATE_NULL;
+  self->current_state = GST_STATE_NULL;
+  if (self->playbin) {
+    gst_element_set_state (self->playbin, GST_STATE_NULL);
+    gst_object_unref (self->playbin);
+    self->playbin = NULL;
+  }
+
+  GST_TRACE_OBJECT (self, "Stopped main thread");
+
+  return NULL;
+}
+
+static gpointer
+gst_player_init_once (G_GNUC_UNUSED gpointer user_data)
+{
+  gst_init (NULL, NULL);
+
+  GST_DEBUG_CATEGORY_INIT (gst_player_debug, "gst-player", 0, "GstPlayer");
+  gst_player_error_quark ();
+
+  return NULL;
+}
+
+/**
+ * gst_player_new:
+ *
+ * Returns: a new #GstPlayer instance
+ */
+GstPlayer *
+gst_player_new (void)
+{
+  return gst_player_new_full (NULL, NULL);
+}
+
+/**
+ * gst_player_new_full:
+ * @video_renderer: (transfer full) (allow-none): GstPlayerVideoRenderer to use
+ * @signal_dispatcher: (transfer full) (allow-none): GstPlayerSignalDispatcher to use
+ *
+ * Creates a new #GstPlayer instance that uses @signal_dispatcher to dispatch
+ * signals to some event loop system, or emits signals directly if NULL is
+ * passed. See gst_player_g_main_context_signal_dispatcher_new().
+ *
+ * Video is going to be rendered by @video_renderer, or if %NULL is provided
+ * no special video set up will be done and some default handling will be
+ * performed.
+ *
+ * Returns: a new #GstPlayer instance
+ */
+GstPlayer *
+gst_player_new_full (GstPlayerVideoRenderer * video_renderer,
+    GstPlayerSignalDispatcher * signal_dispatcher)
+{
+  static GOnce once = G_ONCE_INIT;
+  GstPlayer *self;
+
+  g_once (&once, gst_player_init_once, NULL);
+
+  self =
+      g_object_new (GST_TYPE_PLAYER, "video-renderer", video_renderer,
+      "signal-dispatcher", signal_dispatcher, NULL);
+
+  if (video_renderer)
+    g_object_unref (video_renderer);
+  if (signal_dispatcher)
+    g_object_unref (signal_dispatcher);
+
+  return self;
+}
+
+static gboolean
+gst_player_play_internal (gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+  GstStateChangeReturn state_ret;
+
+  GST_DEBUG_OBJECT (self, "Play");
+
+  g_mutex_lock (&self->lock);
+  if (!self->uri) {
+    g_mutex_unlock (&self->lock);
+    return G_SOURCE_REMOVE;
+  }
+  g_mutex_unlock (&self->lock);
+
+  remove_ready_timeout_source (self);
+  self->target_state = GST_STATE_PLAYING;
+
+  if (self->current_state < GST_STATE_PAUSED)
+    change_state (self, GST_PLAYER_STATE_BUFFERING);
+
+  if (self->current_state >= GST_STATE_PAUSED && !self->is_eos) {
+    state_ret = gst_element_set_state (self->playbin, GST_STATE_PLAYING);
+  } else {
+    state_ret = gst_element_set_state (self->playbin, GST_STATE_PAUSED);
+  }
+
+  if (state_ret == GST_STATE_CHANGE_NO_PREROLL) {
+    self->is_live = TRUE;
+    GST_DEBUG_OBJECT (self, "Pipeline is live");
+  }
+
+  if (state_ret == GST_STATE_CHANGE_FAILURE) {
+    emit_error (self, g_error_new (GST_PLAYER_ERROR, GST_PLAYER_ERROR_FAILED,
+            "Failed to play"));
+    return G_SOURCE_REMOVE;
+  } else if (state_ret == GST_STATE_CHANGE_NO_PREROLL) {
+    self->is_live = TRUE;
+    GST_DEBUG_OBJECT (self, "Pipeline is live");
+  }
+
+  if (self->is_eos) {
+    gboolean ret;
+
+    GST_DEBUG_OBJECT (self, "Was EOS, seeking to beginning");
+    self->is_eos = FALSE;
+    ret =
+        gst_element_seek_simple (self->playbin, GST_FORMAT_TIME,
+        GST_SEEK_FLAG_FLUSH, 0);
+    if (!ret) {
+      GST_ERROR_OBJECT (self, "Seek to beginning failed");
+      gst_player_stop_internal (self);
+      gst_player_play_internal (self);
+    }
+  }
+
+  return G_SOURCE_REMOVE;
+}
+
+/**
+ * gst_player_play:
+ * @player: #GstPlayer instance
+ *
+ * Request to play the loaded stream.
+ */
+void
+gst_player_play (GstPlayer * self)
+{
+  g_return_if_fail (GST_IS_PLAYER (self));
+
+  g_main_context_invoke_full (self->context, G_PRIORITY_DEFAULT,
+      gst_player_play_internal, self, NULL);
+}
+
+static gboolean
+gst_player_pause_internal (gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+  GstStateChangeReturn state_ret;
+
+  GST_DEBUG_OBJECT (self, "Pause");
+
+  g_mutex_lock (&self->lock);
+  if (!self->uri) {
+    g_mutex_unlock (&self->lock);
+    return G_SOURCE_REMOVE;
+  }
+  g_mutex_unlock (&self->lock);
+
+  tick_cb (self);
+  remove_tick_source (self);
+  remove_ready_timeout_source (self);
+
+  self->target_state = GST_STATE_PAUSED;
+
+  if (self->current_state < GST_STATE_PAUSED)
+    change_state (self, GST_PLAYER_STATE_BUFFERING);
+
+  state_ret = gst_element_set_state (self->playbin, GST_STATE_PAUSED);
+  if (state_ret == GST_STATE_CHANGE_FAILURE) {
+    emit_error (self, g_error_new (GST_PLAYER_ERROR, GST_PLAYER_ERROR_FAILED,
+            "Failed to pause"));
+    return G_SOURCE_REMOVE;
+  } else if (state_ret == GST_STATE_CHANGE_NO_PREROLL) {
+    self->is_live = TRUE;
+    GST_DEBUG_OBJECT (self, "Pipeline is live");
+  }
+
+  if (self->is_eos) {
+    gboolean ret;
+
+    GST_DEBUG_OBJECT (self, "Was EOS, seeking to beginning");
+    self->is_eos = FALSE;
+    ret =
+        gst_element_seek_simple (self->playbin, GST_FORMAT_TIME,
+        GST_SEEK_FLAG_FLUSH, 0);
+    if (!ret) {
+      GST_ERROR_OBJECT (self, "Seek to beginning failed");
+      gst_player_stop_internal (self);
+      gst_player_pause_internal (self);
+    }
+  }
+
+  return G_SOURCE_REMOVE;
+}
+
+/**
+ * gst_player_pause:
+ * @player: #GstPlayer instance
+ *
+ * Pauses the current stream.
+ */
+void
+gst_player_pause (GstPlayer * self)
+{
+  g_return_if_fail (GST_IS_PLAYER (self));
+
+  g_main_context_invoke_full (self->context, G_PRIORITY_DEFAULT,
+      gst_player_pause_internal, self, NULL);
+}
+
+static gboolean
+gst_player_stop_internal (gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+
+  GST_DEBUG_OBJECT (self, "Stop");
+
+  tick_cb (self);
+  remove_tick_source (self);
+
+  add_ready_timeout_source (self);
+
+  self->target_state = GST_STATE_NULL;
+  self->current_state = GST_STATE_READY;
+  self->is_live = FALSE;
+  self->is_eos = FALSE;
+  gst_bus_set_flushing (self->bus, TRUE);
+  gst_element_set_state (self->playbin, GST_STATE_READY);
+  gst_bus_set_flushing (self->bus, FALSE);
+  change_state (self, GST_PLAYER_STATE_STOPPED);
+  self->buffering = 100;
+  g_mutex_lock (&self->lock);
+  if (self->media_info) {
+    g_object_unref (self->media_info);
+    self->media_info = NULL;
+  }
+  if (self->global_tags) {
+    gst_tag_list_unref (self->global_tags);
+    self->global_tags = NULL;
+  }
+  self->seek_pending = FALSE;
+  if (self->seek_source) {
+    g_source_destroy (self->seek_source);
+    g_source_unref (self->seek_source);
+    self->seek_source = NULL;
+  }
+  self->seek_position = GST_CLOCK_TIME_NONE;
+  self->last_seek_time = GST_CLOCK_TIME_NONE;
+  self->rate = 1.0;
+  g_mutex_unlock (&self->lock);
+
+  return G_SOURCE_REMOVE;
+}
+
+/**
+ * gst_player_stop:
+ * @player: #GstPlayer instance
+ *
+ * Stops playing the current stream and resets to the first position
+ * in the stream.
+ */
+void
+gst_player_stop (GstPlayer * self)
+{
+  g_return_if_fail (GST_IS_PLAYER (self));
+
+  g_main_context_invoke_full (self->context, G_PRIORITY_DEFAULT,
+      gst_player_stop_internal, self, NULL);
+}
+
+/* Must be called with lock from main context, releases lock! */
+static void
+gst_player_seek_internal_locked (GstPlayer * self)
+{
+  gboolean ret;
+  GstClockTime position;
+  gdouble rate;
+  GstStateChangeReturn state_ret;
+  GstEvent *s_event;
+  GstSeekFlags flags = 0;
+
+  if (self->seek_source) {
+    g_source_destroy (self->seek_source);
+    g_source_unref (self->seek_source);
+    self->seek_source = NULL;
+  }
+
+  /* Only seek in PAUSED */
+  if (self->current_state < GST_STATE_PAUSED) {
+    return;
+  } else if (self->current_state != GST_STATE_PAUSED) {
+    g_mutex_unlock (&self->lock);
+    state_ret = gst_element_set_state (self->playbin, GST_STATE_PAUSED);
+    if (state_ret == GST_STATE_CHANGE_FAILURE) {
+      emit_error (self, g_error_new (GST_PLAYER_ERROR, GST_PLAYER_ERROR_FAILED,
+              "Failed to seek"));
+      g_mutex_lock (&self->lock);
+      return;
+    }
+    g_mutex_lock (&self->lock);
+    return;
+  }
+
+  self->last_seek_time = gst_util_get_timestamp ();
+  position = self->seek_position;
+  self->seek_position = GST_CLOCK_TIME_NONE;
+  self->seek_pending = TRUE;
+  rate = self->rate;
+  g_mutex_unlock (&self->lock);
+
+  remove_tick_source (self);
+  self->is_eos = FALSE;
+
+  flags |= GST_SEEK_FLAG_FLUSH;
+
+#if GST_CHECK_VERSION(1,5,0)
+  if (rate != 1.0) {
+    flags |= GST_SEEK_FLAG_TRICKMODE;
+  }
+#endif
+
+  if (rate >= 0.0) {
+    s_event = gst_event_new_seek (rate, GST_FORMAT_TIME, flags,
+        GST_SEEK_TYPE_SET, position, GST_SEEK_TYPE_NONE, GST_CLOCK_TIME_NONE);
+  } else {
+    s_event = gst_event_new_seek (rate, GST_FORMAT_TIME, flags,
+        GST_SEEK_TYPE_SET, G_GINT64_CONSTANT (0), GST_SEEK_TYPE_SET, position);
+  }
+
+  GST_DEBUG_OBJECT (self, "Seek with rate %.2lf to %" GST_TIME_FORMAT,
+      rate, GST_TIME_ARGS (position));
+
+  ret = gst_element_send_event (self->playbin, s_event);
+  if (!ret)
+    emit_error (self, g_error_new (GST_PLAYER_ERROR, GST_PLAYER_ERROR_FAILED,
+            "Failed to seek to %" GST_TIME_FORMAT, GST_TIME_ARGS (position)));
+
+  g_mutex_lock (&self->lock);
+}
+
+static gboolean
+gst_player_seek_internal (gpointer user_data)
+{
+  GstPlayer *self = GST_PLAYER (user_data);
+
+  g_mutex_lock (&self->lock);
+  gst_player_seek_internal_locked (self);
+  g_mutex_unlock (&self->lock);
+
+  return G_SOURCE_REMOVE;
+}
+
+static gboolean
+gst_player_set_rate_internal (gpointer user_data)
+{
+  GstPlayer *self = user_data;
+
+  g_mutex_lock (&self->lock);
+
+  self->seek_position = gst_player_get_position (self);
+
+  /* If there is no seek being dispatch to the main context currently do that,
+   * otherwise we just updated the rate so that it will be taken by
+   * the seek handler from the main context instead of the old one.
+   */
+  if (!self->seek_source) {
+    /* If no seek is pending then create new seek source */
+    if (!self->seek_pending) {
+      self->seek_source = g_idle_source_new ();
+      g_source_set_callback (self->seek_source,
+          (GSourceFunc) gst_player_seek_internal, self, NULL);
+      g_source_attach (self->seek_source, self->context);
+    }
+  }
+
+  g_mutex_unlock (&self->lock);
+
+  return G_SOURCE_REMOVE;
+}
+
+/**
+ * gst_player_set_rate:
+ * @player: #GstPlayer instance
+ * @rate: playback rate
+ *
+ * Playback at specified rate
+ */
+void
+gst_player_set_rate (GstPlayer * self, gdouble rate)
+{
+  g_return_if_fail (GST_IS_PLAYER (self));
+  g_return_if_fail (rate != 0.0);
+
+  g_mutex_lock (&self->lock);
+  self->rate = rate;
+  g_mutex_unlock (&self->lock);
+
+  gst_player_set_rate_internal (self);
+}
+
+/**
+ * gst_player_get_rate:
+ * @player: #GstPlayer instance
+ *
+ * Returns: current playback rate
+ */
+gdouble
+gst_player_get_rate (GstPlayer * self)
+{
+  g_return_val_if_fail (GST_IS_PLAYER (self), DEFAULT_RATE);
+
+  return self->rate;
+}
+
+static gboolean
+gst_player_set_position_update_interval_internal (gpointer user_data)
+{
+  GstPlayer *self = user_data;
+
+  g_mutex_lock (&self->lock);
+
+  if (self->tick_source) {
+    remove_tick_source (self);
+    add_tick_source (self);
+  }
+
+  g_mutex_unlock (&self->lock);
+
+  return G_SOURCE_REMOVE;
+}
+
+/**
+ * gst_player_set_position_update_interval:
+ * @player: #GstPlayer instance
+ * @interval: interval in ms
+ *
+ * Set interval in milliseconds between two position-updated signals.
+ * Pass 0 to stop updating the position.
+ */
+void
+gst_player_set_position_update_interval (GstPlayer * self, guint interval)
+{
+  g_return_if_fail (GST_IS_PLAYER (self));
+  g_return_if_fail (interval <= 10000);
+
+  g_mutex_lock (&self->lock);
+  self->position_update_interval_ms = interval;
+  g_mutex_unlock (&self->lock);
+
+  gst_player_set_position_update_interval_internal (self);
+}
+
+/**
+ * gst_player_get_position_update_interval:
+ * @player: #GstPlayer instance
+ *
+ * Returns: current position update interval in milliseconds
+ */
+guint
+gst_player_get_position_update_interval (GstPlayer * self)
+{
+  g_return_val_if_fail (GST_IS_PLAYER (self),
+      DEFAULT_POSITION_UPDATE_INTERVAL_MS);
+
+  return self->position_update_interval_ms;
+}
+
+/**
+ * gst_player_seek:
+ * @player: #GstPlayer instance
+ * @position: position to seek in nanoseconds
+ *
+ * Seeks the currently-playing stream to the absolute @position time
+ * in nanoseconds.
+ */
+void
+gst_player_seek (GstPlayer * self, GstClockTime position)
+{
+  g_return_if_fail (GST_IS_PLAYER (self));
+  g_return_if_fail (GST_CLOCK_TIME_IS_VALID (position));
+
+  g_mutex_lock (&self->lock);
+  if (self->media_info && !self->media_info->seekable) {
+    GST_DEBUG_OBJECT (self, "Media is not seekable");
+    g_mutex_unlock (&self->lock);
+    return;
+  }
+
+  self->seek_position = position;
+
+  /* If there is no seek being dispatch to the main context currently do that,
+   * otherwise we just updated the seek position so that it will be taken by
+   * the seek handler from the main context instead of the old one.
+   */
+  if (!self->seek_source) {
+    GstClockTime now = gst_util_get_timestamp ();
+
+    /* If no seek is pending or it was started more than 250 mseconds ago seek
+     * immediately, otherwise wait until the 250 mseconds have passed */
+    if (!self->seek_pending || (now - self->last_seek_time > 250 * GST_MSECOND)) {
+      self->seek_source = g_idle_source_new ();
+      g_source_set_callback (self->seek_source,
+          (GSourceFunc) gst_player_seek_internal, self, NULL);
+      GST_TRACE_OBJECT (self, "Dispatching seek to position %" GST_TIME_FORMAT,
+          GST_TIME_ARGS (position));
+      g_source_attach (self->seek_source, self->context);
+    } else {
+      guint delay = 250000 - (now - self->last_seek_time) / 1000;
+
+      /* Note that last_seek_time must be set to something at this point and
+       * it must be smaller than 250 mseconds */
+      self->seek_source = g_timeout_source_new (delay);
+      g_source_set_callback (self->seek_source,
+          (GSourceFunc) gst_player_seek_internal, self, NULL);
+
+      GST_TRACE_OBJECT (self,
+          "Delaying seek to position %" GST_TIME_FORMAT " by %u us",
+          GST_TIME_ARGS (position), delay);
+      g_source_attach (self->seek_source, self->context);
+    }
+  }
+  g_mutex_unlock (&self->lock);
+}
+
+/**
+ * gst_player_get_uri:
+ * @player: #GstPlayer instance
+ *
+ * Gets the URI of the currently-playing stream.
+ *
+ * Returns: (transfer full): a string containing the URI of the
+ * currently-playing stream. g_free() after usage.
+ */
+gchar *
+gst_player_get_uri (GstPlayer * self)
+{
+  gchar *val;
+
+  g_return_val_if_fail (GST_IS_PLAYER (self), DEFAULT_URI);
+
+  g_object_get (self, "uri", &val, NULL);
+
+  return val;
+}
+
+/**
+ * gst_player_set_uri:
+ * @player: #GstPlayer instance
+ * @uri: next URI to play.
+ *
+ * Sets the next URI to play.
+ */
+void
+gst_player_set_uri (GstPlayer * self, const gchar * val)
+{
+  g_return_if_fail (GST_IS_PLAYER (self));
+
+  g_object_set (self, "uri", val, NULL);
+}
+
+/**
+ * gst_player_get_position:
+ * @player: #GstPlayer instance
+ *
+ * Returns: the absolute position time, in nanoseconds, of the
+ * currently-playing stream.
+ */
+GstClockTime
+gst_player_get_position (GstPlayer * self)
+{
+  GstClockTime val;
+
+  g_return_val_if_fail (GST_IS_PLAYER (self), DEFAULT_POSITION);
+
+  g_object_get (self, "position", &val, NULL);
+
+  return val;
+}
+
+/**
+ * gst_player_get_duration:
+ * @player: #GstPlayer instance
+ *
+ * Retrieves the duration of the media stream that self represents.
+ *
+ * Returns: the duration of the currently-playing media stream, in
+ * nanoseconds.
+ */
+GstClockTime
+gst_player_get_duration (GstPlayer * self)
+{
+  GstClockTime val;
+
+  g_return_val_if_fail (GST_IS_PLAYER (self), DEFAULT_DURATION);
+
+  g_object_get (self, "duration", &val, NULL);
+
+  return val;
+}
+
+/**
+ * gst_player_get_volume:
+ * @player: #GstPlayer instance
+ *
+ * Returns the current volume level, as a percentage between 0 and 1.
+ *
+ * Returns: the volume as percentage between 0 and 1.
+ */
+gdouble
+gst_player_get_volume (GstPlayer * self)
+{
+  gdouble val;
+
+  g_return_val_if_fail (GST_IS_PLAYER (self), DEFAULT_VOLUME);
+
+  g_object_get (self, "volume", &val, NULL);
+
+  return val;
+}
+
+/**
+ * gst_player_set_volume:
+ * @player: #GstPlayer instance
+ * @val: the new volume level, as a percentage between 0 and 1
+ *
+ * Sets the volume level of the stream as a percentage between 0 and 1.
+ */
+void
+gst_player_set_volume (GstPlayer * self, gdouble val)
+{
+  g_return_if_fail (GST_IS_PLAYER (self));
+
+  g_object_set (self, "volume", val, NULL);
+}
+
+/**
+ * gst_player_get_mute:
+ * @player: #GstPlayer instance
+ *
+ * Returns: %TRUE if the currently-playing stream is muted.
+ */
+gboolean
+gst_player_get_mute (GstPlayer * self)
+{
+  gboolean val;
+
+  g_return_val_if_fail (GST_IS_PLAYER (self), DEFAULT_MUTE);
+
+  g_object_get (self, "mute", &val, NULL);
+
+  return val;
+}
+
+/**
+ * gst_player_set_mute:
+ * @player: #GstPlayer instance
+ * @val: Mute state the should be set
+ *
+ * %TRUE if the currently-playing stream should be muted.
+ */
+void
+gst_player_set_mute (GstPlayer * self, gboolean val)
+{
+  g_return_if_fail (GST_IS_PLAYER (self));
+
+  g_object_set (self, "mute", val, NULL);
+}
+
+/**
+ * gst_player_get_pipeline:
+ * @player: #GstPlayer instance
+ *
+ * Returns: (transfer full): The internal playbin instance
+ */
+GstElement *
+gst_player_get_pipeline (GstPlayer * self)
+{
+  GstElement *val;
+
+  g_return_val_if_fail (GST_IS_PLAYER (self), NULL);
+
+  g_object_get (self, "pipeline", &val, NULL);
+
+  return val;
+}
+
+/**
+ * gst_player_get_media_info:
+ * @player: #GstPlayer instance
+ *
+ * A Function to get the current media info #GstPlayerMediaInfo instance.
+ *
+ * Returns: (transfer full): media info instance.
+ *
+ * The caller should free it with g_object_unref()
+ */
+GstPlayerMediaInfo *
+gst_player_get_media_info (GstPlayer * self)
+{
+  GstPlayerMediaInfo *info;
+
+  g_return_val_if_fail (GST_IS_PLAYER (self), NULL);
+
+  if (!self->media_info)
+    return NULL;
+
+  g_mutex_lock (&self->lock);
+  info = gst_player_media_info_copy (self->media_info);
+  g_mutex_unlock (&self->lock);
+
+  return info;
+}
+
+/**
+ * gst_player_get_current_audio_track:
+ * @player: #GstPlayer instance
+ *
+ * A Function to get current audio #GstPlayerAudioInfo instance.
+ *
+ * Returns: (transfer full): current audio track.
+ *
+ * The caller should free it with g_object_unref()
+ */
+GstPlayerAudioInfo *
+gst_player_get_current_audio_track (GstPlayer * self)
+{
+  GstPlayerAudioInfo *info;
+
+  g_return_val_if_fail (GST_IS_PLAYER (self), NULL);
+
+  if (!is_track_enabled (self, GST_PLAY_FLAG_AUDIO))
+    return NULL;
+
+  info = (GstPlayerAudioInfo *) gst_player_stream_info_get_current (self,
+      "current-audio", GST_TYPE_PLAYER_AUDIO_INFO);
+  return info;
+}
+
+/**
+ * gst_player_get_current_video_track:
+ * @player: #GstPlayer instance
+ *
+ * A Function to get current video #GstPlayerVideoInfo instance.
+ *
+ * Returns: (transfer full): current video track.
+ *
+ * The caller should free it with g_object_unref()
+ */
+GstPlayerVideoInfo *
+gst_player_get_current_video_track (GstPlayer * self)
+{
+  GstPlayerVideoInfo *info;
+
+  g_return_val_if_fail (GST_IS_PLAYER (self), NULL);
+
+  if (!is_track_enabled (self, GST_PLAY_FLAG_VIDEO))
+    return NULL;
+
+  info = (GstPlayerVideoInfo *) gst_player_stream_info_get_current (self,
+      "current-video", GST_TYPE_PLAYER_VIDEO_INFO);
+  return info;
+}
+
+/**
+ * gst_player_get_current_subtitle_track:
+ * @player: #GstPlayer instance
+ *
+ * A Function to get current subtitle #GstPlayerSubtitleInfo instance.
+ *
+ * Returns: (transfer none): current subtitle track.
+ *
+ * The caller should free it with g_object_unref()
+ */
+GstPlayerSubtitleInfo *
+gst_player_get_current_subtitle_track (GstPlayer * self)
+{
+  GstPlayerSubtitleInfo *info;
+
+  g_return_val_if_fail (GST_IS_PLAYER (self), NULL);
+
+  if (!is_track_enabled (self, GST_PLAY_FLAG_SUBTITLE))
+    return NULL;
+
+  info = (GstPlayerSubtitleInfo *) gst_player_stream_info_get_current (self,
+      "current-text", GST_TYPE_PLAYER_SUBTITLE_INFO);
+  return info;
+}
+
+/**
+ * gst_player_set_audio_track:
+ * @player: #GstPlayer instance
+ * @stream_index: stream index
+ *
+ * Returns: %TRUE or %FALSE
+ *
+ * Sets the audio track @stream_idex.
+ */
+gboolean
+gst_player_set_audio_track (GstPlayer * self, gint stream_index)
+{
+  GstPlayerStreamInfo *info;
+
+  g_return_val_if_fail (GST_IS_PLAYER (self), 0);
+
+  g_mutex_lock (&self->lock);
+  info = gst_player_stream_info_find (self->media_info,
+      GST_TYPE_PLAYER_AUDIO_INFO, stream_index);
+  g_mutex_unlock (&self->lock);
+  if (!info) {
+    GST_ERROR_OBJECT (self, "invalid audio stream index %d", stream_index);
+    return FALSE;
+  }
+
+  g_object_set (G_OBJECT (self->playbin), "current-audio", stream_index, NULL);
+  GST_DEBUG_OBJECT (self, "set stream index '%d'", stream_index);
+  return TRUE;
+}
+
+/**
+ * gst_player_set_video_track:
+ * @player: #GstPlayer instance
+ * @stream_index: stream index
+ *
+ * Returns: %TRUE or %FALSE
+ *
+ * Sets the video track @stream_index.
+ */
+gboolean
+gst_player_set_video_track (GstPlayer * self, gint stream_index)
+{
+  GstPlayerStreamInfo *info;
+
+  g_return_val_if_fail (GST_IS_PLAYER (self), 0);
+
+  /* check if stream_index exist in our internal media_info list */
+  g_mutex_lock (&self->lock);
+  info = gst_player_stream_info_find (self->media_info,
+      GST_TYPE_PLAYER_VIDEO_INFO, stream_index);
+  g_mutex_unlock (&self->lock);
+  if (!info) {
+    GST_ERROR_OBJECT (self, "invalid video stream index %d", stream_index);
+    return FALSE;
+  }
+
+  g_object_set (G_OBJECT (self->playbin), "current-video", stream_index, NULL);
+  GST_DEBUG_OBJECT (self, "set stream index '%d'", stream_index);
+  return TRUE;
+}
+
+/**
+ * gst_player_set_subtitle_track:
+ * @player: #GstPlayer instance
+ * @stream_index: stream index
+ *
+ * Returns: %TRUE or %FALSE
+ *
+ * Sets the subtitle strack @stream_index.
+ */
+gboolean
+gst_player_set_subtitle_track (GstPlayer * self, gint stream_index)
+{
+  GstPlayerStreamInfo *info;
+
+  g_return_val_if_fail (GST_IS_PLAYER (self), 0);
+
+  g_mutex_lock (&self->lock);
+  info = gst_player_stream_info_find (self->media_info,
+      GST_TYPE_PLAYER_SUBTITLE_INFO, stream_index);
+  g_mutex_unlock (&self->lock);
+  if (!info) {
+    GST_ERROR_OBJECT (self, "invalid subtitle stream index %d", stream_index);
+    return FALSE;
+  }
+
+  g_object_set (G_OBJECT (self->playbin), "current-text", stream_index, NULL);
+  GST_DEBUG_OBJECT (self, "set stream index '%d'", stream_index);
+  return TRUE;
+}
+
+/**
+ * gst_player_set_audio_track_enabled:
+ * @player: #GstPlayer instance
+ * @enabled: TRUE or FALSE
+ *
+ * Enable or disable the current audio track.
+ */
+void
+gst_player_set_audio_track_enabled (GstPlayer * self, gboolean enabled)
+{
+  g_return_if_fail (GST_IS_PLAYER (self));
+
+  if (enabled)
+    player_set_flag (self, GST_PLAY_FLAG_AUDIO);
+  else
+    player_clear_flag (self, GST_PLAY_FLAG_AUDIO);
+
+  GST_DEBUG_OBJECT (self, "track is '%s'", enabled ? "Enabled" : "Disabled");
+}
+
+/**
+ * gst_player_set_video_track_enabled:
+ * @player: #GstPlayer instance
+ * @enabled: TRUE or FALSE
+ *
+ * Enable or disable the current video track.
+ */
+void
+gst_player_set_video_track_enabled (GstPlayer * self, gboolean enabled)
+{
+  g_return_if_fail (GST_IS_PLAYER (self));
+
+  if (enabled)
+    player_set_flag (self, GST_PLAY_FLAG_VIDEO);
+  else
+    player_clear_flag (self, GST_PLAY_FLAG_VIDEO);
+
+  GST_DEBUG_OBJECT (self, "track is '%s'", enabled ? "Enabled" : "Disabled");
+}
+
+/**
+ * gst_player_set_subtitle_track_enabled:
+ * @player: #GstPlayer instance
+ * @enabled: TRUE or FALSE
+ *
+ * Enable or disable the current subtitle track.
+ */
+void
+gst_player_set_subtitle_track_enabled (GstPlayer * self, gboolean enabled)
+{
+  g_return_if_fail (GST_IS_PLAYER (self));
+
+  if (enabled)
+    player_set_flag (self, GST_PLAY_FLAG_SUBTITLE);
+  else
+    player_clear_flag (self, GST_PLAY_FLAG_SUBTITLE);
+
+  GST_DEBUG_OBJECT (self, "track is '%s'", enabled ? "Enabled" : "Disabled");
+}
+
+/**
+ * gst_player_set_subtitle_uri:
+ * @player: #GstPlayer instance
+ * @uri: subtitle URI
+ *
+ * Returns: %TRUE or %FALSE
+ *
+ * Sets the external subtitle URI.
+ */
+gboolean
+gst_player_set_subtitle_uri (GstPlayer * self, const gchar * suburi)
+{
+  g_return_val_if_fail (GST_IS_PLAYER (self), FALSE);
+
+  g_mutex_lock (&self->lock);
+  g_free (self->suburi);
+  self->suburi = g_strdup (suburi);
+  g_mutex_unlock (&self->lock);
+
+  gst_player_set_suburi_internal (self);
+
+  return TRUE;
+}
+
+/**
+ * gst_player_get_subtitle_uri:
+ * @player: #GstPlayer instance
+ *
+ * current subtitle URI
+ *
+ * Returns: (transfer full): URI of the current external subtitle.
+ *   g_free() after usage.
+ */
+gchar *
+gst_player_get_subtitle_uri (GstPlayer * self)
+{
+  gchar *val = NULL;
+
+  g_return_val_if_fail (GST_IS_PLAYER (self), NULL);
+
+  g_object_get (self, "suburi", &val, NULL);
+
+  return val;
+}
+
+/**
+ * gst_player_set_visualization:
+ * @player: #GstPlayer instance
+ * @name: visualization element obtained from
+ * #gst_player_visualizations_get()
+ *
+ * Returns: %TRUE if the visualizations was set correctly. Otherwise,
+ * %FALSE.
+ */
+gboolean
+gst_player_set_visualization (GstPlayer * self, const gchar * name)
+{
+  g_return_val_if_fail (GST_IS_PLAYER (self), FALSE);
+
+  g_mutex_lock (&self->lock);
+  if (self->current_vis_element) {
+    gst_object_unref (self->current_vis_element);
+    self->current_vis_element = NULL;
+  }
+
+  if (name) {
+    self->current_vis_element = gst_element_factory_make (name, NULL);
+    if (!self->current_vis_element)
+      goto error_no_element;
+    gst_object_ref_sink (self->current_vis_element);
+  }
+  g_object_set (self->playbin, "vis-plugin", self->current_vis_element, NULL);
+
+  g_mutex_unlock (&self->lock);
+  GST_DEBUG_OBJECT (self, "set vis-plugin to '%s'", name);
+
+  return TRUE;
+
+error_no_element:
+  g_mutex_unlock (&self->lock);
+  GST_WARNING_OBJECT (self, "could not find visualization '%s'", name);
+  return FALSE;
+}
+
+/**
+ * gst_player_get_current_visualization:
+ * @player: #GstPlayer instance
+ *
+ * Returns: (transfer full): Name of the currently enabled visualization.
+ *   g_free() after usage.
+ */
+gchar *
+gst_player_get_current_visualization (GstPlayer * self)
+{
+  gchar *name = NULL;
+  GstElement *vis_plugin = NULL;
+
+  g_return_val_if_fail (GST_IS_PLAYER (self), NULL);
+
+  if (!is_track_enabled (self, GST_PLAY_FLAG_VIS))
+    return NULL;
+
+  g_object_get (self->playbin, "vis-plugin", &vis_plugin, NULL);
+
+  if (vis_plugin) {
+    GstElementFactory *factory = gst_element_get_factory (vis_plugin);
+    if (factory)
+      name = g_strdup (gst_plugin_feature_get_name (factory));
+    gst_object_unref (vis_plugin);
+  }
+
+  GST_DEBUG_OBJECT (self, "vis-plugin '%s' %p", name, vis_plugin);
+
+  return name;
+}
+
+/**
+ * gst_player_set_visualization_enabled:
+ * @player: #GstPlayer instance
+ * @enabled: TRUE or FALSE
+ *
+ * Enable or disable the visualization.
+ */
+void
+gst_player_set_visualization_enabled (GstPlayer * self, gboolean enabled)
+{
+  g_return_if_fail (GST_IS_PLAYER (self));
+
+  if (enabled)
+    player_set_flag (self, GST_PLAY_FLAG_VIS);
+  else
+    player_clear_flag (self, GST_PLAY_FLAG_VIS);
+
+  GST_DEBUG_OBJECT (self, "visualization is '%s'",
+      enabled ? "Enabled" : "Disabled");
+}
+
+struct CBChannelMap
+{
+  const gchar *label;           /* channel label name */
+  const gchar *name;            /* get_name () */
+};
+
+static const struct CBChannelMap cb_channel_map[] = {
+  /* GST_PLAYER_COLOR_BALANCE_BRIGHTNESS */ {"BRIGHTNESS", "brightness"},
+  /* GST_PLAYER_COLOR_BALANCE_CONTRAST   */ {"CONTRAST", "contrast"},
+  /* GST_PLAYER_COLOR_BALANCE_SATURATION */ {"SATURATION", "saturation"},
+  /* GST_PLAYER_COLOR_BALANCE_HUE        */ {"HUE", "hue"},
+};
+
+static GstColorBalanceChannel *
+gst_player_color_balance_find_channel (GstPlayer * self,
+    GstPlayerColorBalanceType type)
+{
+  GstColorBalanceChannel *channel;
+  const GList *l, *channels;
+
+  if (type < GST_PLAYER_COLOR_BALANCE_BRIGHTNESS ||
+      type > GST_PLAYER_COLOR_BALANCE_HUE)
+    return NULL;
+
+  channels =
+      gst_color_balance_list_channels (GST_COLOR_BALANCE (self->playbin));
+  for (l = channels; l; l = l->next) {
+    channel = l->data;
+    if (g_strrstr (channel->label, cb_channel_map[type].label))
+      return channel;
+  }
+
+  return NULL;
+}
+
+/**
+ * gst_player_has_color_balance:
+ * @player:#GstPlayer instance
+ *
+ * Checks whether the @player has color balance support available.
+ *
+ * Returns: %TRUE if @player has color balance support. Otherwise,
+ *   %FALSE.
+ */
+gboolean
+gst_player_has_color_balance (GstPlayer * self)
+{
+  const GList *channels;
+
+  g_return_val_if_fail (GST_IS_PLAYER (self), FALSE);
+
+  if (!GST_IS_COLOR_BALANCE (self->playbin))
+    return FALSE;
+
+  channels =
+      gst_color_balance_list_channels (GST_COLOR_BALANCE (self->playbin));
+  return (channels != NULL);
+}
+
+/**
+ * gst_player_set_color_balance:
+ * @player: #GstPlayer instance
+ * @type: #GstPlayerColorBalanceType
+ * @value: The new value for the @type, ranged [0,1]
+ *
+ * Sets the current value of the indicated channel @type to the passed
+ * value.
+ */
+void
+gst_player_set_color_balance (GstPlayer * self, GstPlayerColorBalanceType type,
+    gdouble value)
+{
+  GstColorBalanceChannel *channel;
+  gdouble new_val;
+
+  g_return_if_fail (GST_IS_PLAYER (self));
+  g_return_if_fail (value >= 0.0 && value <= 1.0);
+
+  if (!GST_IS_COLOR_BALANCE (self->playbin))
+    return;
+
+  channel = gst_player_color_balance_find_channel (self, type);
+  if (!channel)
+    return;
+
+  value = CLAMP (value, 0.0, 1.0);
+
+  /* Convert to channel range */
+  new_val = channel->min_value + value * ((gdouble) channel->max_value -
+      (gdouble) channel->min_value);
+
+  gst_color_balance_set_value (GST_COLOR_BALANCE (self->playbin), channel,
+      new_val);
+}
+
+/**
+ * gst_player_get_color_balance:
+ * @player: #GstPlayer instance
+ * @type: #GstPlayerColorBalanceType
+ *
+ * Retrieve the current value of the indicated @type.
+ *
+ * Returns: The current value of @type, between [0,1]. In case of
+ *   error -1 is returned.
+ */
+gdouble
+gst_player_get_color_balance (GstPlayer * self, GstPlayerColorBalanceType type)
+{
+  GstColorBalanceChannel *channel;
+  gint value;
+
+  g_return_val_if_fail (GST_IS_PLAYER (self), -1);
+
+  if (!GST_IS_COLOR_BALANCE (self->playbin))
+    return -1;
+
+  channel = gst_player_color_balance_find_channel (self, type);
+  if (!channel)
+    return -1;
+
+  value = gst_color_balance_get_value (GST_COLOR_BALANCE (self->playbin),
+      channel);
+
+  return ((gdouble) value -
+      (gdouble) channel->min_value) / ((gdouble) channel->max_value -
+      (gdouble) channel->min_value);
+}
+
+#define C_ENUM(v) ((gint) v)
+#define C_FLAGS(v) ((guint) v)
+
+GType
+gst_player_color_balance_type_get_type (void)
+{
+  static gsize id = 0;
+  static const GEnumValue values[] = {
+    {C_ENUM (GST_PLAYER_COLOR_BALANCE_HUE), "GST_PLAYER_COLOR_BALANCE_HUE",
+        "hue"},
+    {C_ENUM (GST_PLAYER_COLOR_BALANCE_BRIGHTNESS),
+        "GST_PLAYER_COLOR_BALANCE_BRIGHTNESS", "brightness"},
+    {C_ENUM (GST_PLAYER_COLOR_BALANCE_SATURATION),
+        "GST_PLAYER_COLOR_BALANCE_SATURATION", "saturation"},
+    {C_ENUM (GST_PLAYER_COLOR_BALANCE_CONTRAST),
+        "GST_PLAYER_COLOR_BALANCE_CONTRAST", "contrast"},
+    {0, NULL, NULL}
+  };
+
+  if (g_once_init_enter (&id)) {
+    GType tmp = g_enum_register_static ("GstPlayerColorBalanceType", values);
+    g_once_init_leave (&id, tmp);
+  }
+
+  return (GType) id;
+}
+
+/**
+ * gst_player_color_balance_type_get_name:
+ * @type: a #GstPlayerColorBalanceType
+ *
+ * Gets a string representing the given color balance type.
+ *
+ * Returns: (transfer none): a string with the name of the color
+ *   balance type.
+ */
+const gchar *
+gst_player_color_balance_type_get_name (GstPlayerColorBalanceType type)
+{
+  g_return_val_if_fail (type >= GST_PLAYER_COLOR_BALANCE_BRIGHTNESS &&
+      type <= GST_PLAYER_COLOR_BALANCE_HUE, NULL);
+
+  return cb_channel_map[type].name;
+}
+
+GType
+gst_player_state_get_type (void)
+{
+  static gsize id = 0;
+  static const GEnumValue values[] = {
+    {C_ENUM (GST_PLAYER_STATE_STOPPED), "GST_PLAYER_STATE_STOPPED", "stopped"},
+    {C_ENUM (GST_PLAYER_STATE_BUFFERING), "GST_PLAYER_STATE_BUFFERING",
+        "buffering"},
+    {C_ENUM (GST_PLAYER_STATE_PAUSED), "GST_PLAYER_STATE_PAUSED", "paused"},
+    {C_ENUM (GST_PLAYER_STATE_PLAYING), "GST_PLAYER_STATE_PLAYING", "playing"},
+    {0, NULL, NULL}
+  };
+
+  if (g_once_init_enter (&id)) {
+    GType tmp = g_enum_register_static ("GstPlayerState", values);
+    g_once_init_leave (&id, tmp);
+  }
+
+  return (GType) id;
+}
+
+/**
+ * gst_player_state_get_name:
+ * @state: a #GstPlayerState
+ *
+ * Gets a string representing the given state.
+ *
+ * Returns: (transfer none): a string with the name of the state.
+ */
+const gchar *
+gst_player_state_get_name (GstPlayerState state)
+{
+  switch (state) {
+    case GST_PLAYER_STATE_STOPPED:
+      return "stopped";
+    case GST_PLAYER_STATE_BUFFERING:
+      return "buffering";
+    case GST_PLAYER_STATE_PAUSED:
+      return "paused";
+    case GST_PLAYER_STATE_PLAYING:
+      return "playing";
+  }
+
+  g_assert_not_reached ();
+  return NULL;
+}
+
+GType
+gst_player_error_get_type (void)
+{
+  static gsize id = 0;
+  static const GEnumValue values[] = {
+    {C_ENUM (GST_PLAYER_ERROR_FAILED), "GST_PLAYER_ERROR_FAILED", "failed"},
+    {0, NULL, NULL}
+  };
+
+  if (g_once_init_enter (&id)) {
+    GType tmp = g_enum_register_static ("GstPlayerError", values);
+    g_once_init_leave (&id, tmp);
+  }
+
+  return (GType) id;
+}
+
+/**
+ * gst_player_error_get_name:
+ * @error: a #GstPlayerError
+ *
+ * Gets a string representing the given error.
+ *
+ * Returns: (transfer none): a string with the given error.
+ */
+const gchar *
+gst_player_error_get_name (GstPlayerError error)
+{
+  switch (error) {
+    case GST_PLAYER_ERROR_FAILED:
+      return "failed";
+  }
+
+  g_assert_not_reached ();
+  return NULL;
+}
diff --git a/gst-libs/gst/player/gstplayer.h b/gst-libs/gst/player/gstplayer.h
new file mode 100644
index 0000000..29287bd
--- /dev/null
+++ b/gst-libs/gst/player/gstplayer.h
@@ -0,0 +1,184 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.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_PLAYER_H__
+#define __GST_PLAYER_H__
+
+#include <gst/gst.h>
+#include <gst/player/gstplayer-types.h>
+#include <gst/player/gstplayer-signal-dispatcher.h>
+#include <gst/player/gstplayer-video-renderer.h>
+#include <gst/player/gstplayer-media-info.h>
+
+G_BEGIN_DECLS
+
+GType        gst_player_state_get_type                (void);
+#define      GST_TYPE_PLAYER_STATE                    (gst_player_state_get_type ())
+
+/**
+ * GstPlayerState:
+ * @GST_PLAYER_STATE_STOPPED: the player is stopped.
+ * @GST_PLAYER_STATE_BUFFERING: the player is buffering.
+ * @GST_PLAYER_STATE_PAUSED: the player is paused.
+ * @GST_PLAYER_STATE_PLAYING: the player is currently playing a
+ * stream.
+ */
+typedef enum
+{
+  GST_PLAYER_STATE_STOPPED,
+  GST_PLAYER_STATE_BUFFERING,
+  GST_PLAYER_STATE_PAUSED,
+  GST_PLAYER_STATE_PLAYING
+} GstPlayerState;
+
+const gchar *gst_player_state_get_name                (GstPlayerState state);
+
+GQuark       gst_player_error_quark                   (void);
+GType        gst_player_error_get_type                (void);
+#define      GST_PLAYER_ERROR                         (gst_player_error_quark ())
+#define      GST_TYPE_PLAYER_ERROR                    (gst_player_error_get_type ())
+
+/**
+ * GstPlayerError:
+ * @GST_PLAYER_ERROR_FAILED: generic error.
+ */
+typedef enum {
+  GST_PLAYER_ERROR_FAILED = 0
+} GstPlayerError;
+
+const gchar *gst_player_error_get_name                (GstPlayerError error);
+
+GType gst_player_color_balance_type_get_type          (void);
+#define GST_TYPE_PLAYER_COLOR_BALANCE_TYPE            (gst_player_color_balance_type_get_type ())
+
+/**
+ * GstPlayerColorBalanceType:
+ * @GST_PLAYER_COLOR_BALANCE_BRIGHTNESS: brightness or black level.
+ * @GST_PLAYER_COLOR_BALANCE_CONTRAST: contrast or luma gain.
+ * @GST_PLAYER_COLOR_BALANCE_SATURATION: color saturation or chroma
+ * gain.
+ * @GST_PLAYER_COLOR_BALANCE_HUE: hue or color balance.
+ */
+typedef enum
+{
+  GST_PLAYER_COLOR_BALANCE_BRIGHTNESS,
+  GST_PLAYER_COLOR_BALANCE_CONTRAST,
+  GST_PLAYER_COLOR_BALANCE_SATURATION,
+  GST_PLAYER_COLOR_BALANCE_HUE,
+} GstPlayerColorBalanceType;
+
+const gchar *gst_player_color_balance_type_get_name   (GstPlayerColorBalanceType type);
+
+#define GST_TYPE_PLAYER             (gst_player_get_type ())
+#define GST_IS_PLAYER(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_PLAYER))
+#define GST_IS_PLAYER_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_PLAYER))
+#define GST_PLAYER_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_PLAYER, GstPlayerClass))
+#define GST_PLAYER(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_PLAYER, GstPlayer))
+#define GST_PLAYER_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_PLAYER, GstPlayerClass))
+#define GST_PLAYER_CAST(obj)        ((GstPlayer*)(obj))
+
+
+GType        gst_player_get_type                      (void);
+
+GstPlayer *  gst_player_new                           (void);
+GstPlayer *  gst_player_new_full                      (GstPlayerVideoRenderer * video_renderer, GstPlayerSignalDispatcher * signal_dispatcher);
+
+void         gst_player_play                          (GstPlayer    * player);
+void         gst_player_pause                         (GstPlayer    * player);
+void         gst_player_stop                          (GstPlayer    * player);
+
+void         gst_player_seek                          (GstPlayer    * player,
+                                                       GstClockTime   position);
+void         gst_player_set_rate                      (GstPlayer    * player,
+                                                       gdouble        rate);
+gdouble      gst_player_get_rate                      (GstPlayer    * player);
+
+void         gst_player_set_position_update_interval  (GstPlayer    * player,
+                                                       guint          interval);
+guint        gst_player_get_position_update_interval  (GstPlayer    * player);
+
+gchar *      gst_player_get_uri                       (GstPlayer    * player);
+void         gst_player_set_uri                       (GstPlayer    * player,
+                                                       const gchar  * uri);
+
+GstClockTime gst_player_get_position                  (GstPlayer    * player);
+GstClockTime gst_player_get_duration                  (GstPlayer    * player);
+
+gdouble      gst_player_get_volume                    (GstPlayer    * player);
+void         gst_player_set_volume                    (GstPlayer    * player,
+                                                       gdouble        val);
+
+gboolean     gst_player_get_mute                      (GstPlayer    * player);
+void         gst_player_set_mute                      (GstPlayer    * player,
+                                                       gboolean       val);
+
+GstElement * gst_player_get_pipeline                  (GstPlayer    * player);
+
+void         gst_player_set_video_track_enabled       (GstPlayer    * player,
+                                                       gboolean enabled);
+
+void         gst_player_set_audio_track_enabled       (GstPlayer    * player,
+                                                       gboolean enabled);
+
+void         gst_player_set_subtitle_track_enabled    (GstPlayer    * player,
+                                                       gboolean enabled);
+
+gboolean     gst_player_set_audio_track               (GstPlayer    *player,
+                                                       gint stream_index);
+
+gboolean     gst_player_set_video_track               (GstPlayer    *player,
+                                                       gint stream_index);
+
+gboolean     gst_player_set_subtitle_track            (GstPlayer    *player,
+                                                       gint stream_index);
+
+GstPlayerMediaInfo * gst_player_get_media_info        (GstPlayer    * player);
+
+GstPlayerAudioInfo * gst_player_get_current_audio_track
+                                                      (GstPlayer    * player);
+
+GstPlayerVideoInfo * gst_player_get_current_video_track
+                                                      (GstPlayer    * player);
+
+GstPlayerSubtitleInfo * gst_player_get_current_subtitle_track
+                                                      (GstPlayer    * player);
+
+gboolean     gst_player_set_subtitle_uri              (GstPlayer    * player,
+                                                       const gchar *uri);
+gchar *      gst_player_get_subtitle_uri              (GstPlayer    * player);
+
+gboolean     gst_player_set_visualization             (GstPlayer    * player,
+                                                       const gchar *name);
+
+void         gst_player_set_visualization_enabled     (GstPlayer    * player,
+                                                       gboolean enabled);
+
+gchar *      gst_player_get_current_visualization     (GstPlayer    * player);
+
+gboolean     gst_player_has_color_balance             (GstPlayer    * player);
+void         gst_player_set_color_balance             (GstPlayer    * player,
+                                                       GstPlayerColorBalanceType type,
+                                                       gdouble value);
+gdouble      gst_player_get_color_balance             (GstPlayer    * player,
+                                                       GstPlayerColorBalanceType type);
+
+G_END_DECLS
+
+#endif /* __GST_PLAYER_H__ */
diff --git a/gst-libs/gst/player/player.h b/gst-libs/gst/player/player.h
new file mode 100644
index 0000000..0fc91d6
--- /dev/null
+++ b/gst-libs/gst/player/player.h
@@ -0,0 +1,30 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014 Sebastian Dröge <sebastian@centricular.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 __PLAYER_H__
+#define __PLAYER_H__
+
+#include <gst/player/gstplayer.h>
+#include <gst/player/gstplayer-media-info.h>
+#include <gst/player/gstplayer-g-main-context-signal-dispatcher.h>
+#include <gst/player/gstplayer-video-overlay-video-renderer.h>
+#include <gst/player/gstplayer-visualization.h>
+
+#endif /* __PLAYER_H__ */
diff --git a/gst-libs/gst/uridownloader/Makefile.in b/gst-libs/gst/uridownloader/Makefile.in
index 4fb5da8..689d555 100644
--- a/gst-libs/gst/uridownloader/Makefile.in
+++ b/gst-libs/gst/uridownloader/Makefile.in
@@ -262,6 +262,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -299,6 +301,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -326,6 +330,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -344,6 +350,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -354,6 +362,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -379,6 +389,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -404,6 +416,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -535,6 +549,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -592,8 +608,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -663,6 +683,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst-libs/gst/video/Makefile.in b/gst-libs/gst/video/Makefile.in
index 3a4a6d4..aeaf50b 100644
--- a/gst-libs/gst/video/Makefile.in
+++ b/gst-libs/gst/video/Makefile.in
@@ -282,6 +282,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -319,6 +321,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -346,6 +350,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -364,6 +370,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -374,6 +382,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -399,6 +409,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -424,6 +436,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -555,6 +569,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -612,8 +628,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -683,6 +703,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst-libs/gst/video/gstvideoaggregator.c b/gst-libs/gst/video/gstvideoaggregator.c
index ea1e810..d3a9ca9 100644
--- a/gst-libs/gst/video/gstvideoaggregator.c
+++ b/gst-libs/gst/video/gstvideoaggregator.c
@@ -982,9 +982,9 @@
   gboolean live;
 
   GST_DEBUG_OBJECT (vagg,
-      "Updating QoS: proportion %lf, diff %s%" GST_TIME_FORMAT ", timestamp %"
-      GST_TIME_FORMAT, proportion, (diff < 0) ? "-" : "",
-      GST_TIME_ARGS (ABS (diff)), GST_TIME_ARGS (timestamp));
+      "Updating QoS: proportion %lf, diff %" GST_STIME_FORMAT ", timestamp %"
+      GST_TIME_FORMAT, proportion, GST_STIME_ARGS (diff),
+      GST_TIME_ARGS (timestamp));
 
   live =
       GST_CLOCK_TIME_IS_VALID (gst_aggregator_get_latency (GST_AGGREGATOR
diff --git a/gst-libs/gst/wayland/Makefile.in b/gst-libs/gst/wayland/Makefile.in
index dd87423..9c4475a 100644
--- a/gst-libs/gst/wayland/Makefile.in
+++ b/gst-libs/gst/wayland/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst-plugins-bad.doap b/gst-plugins-bad.doap
index 0c335c9..58380e8 100644
--- a/gst-plugins-bad.doap
+++ b/gst-plugins-bad.doap
@@ -35,6 +35,16 @@
 
  <release>
   <Version>
+   <revision>1.7.1</revision>
+   <branch>master</branch>
+   <name></name>
+   <created>2015-12-24</created>
+   <file-release rdf:resource="http://gstreamer.freedesktop.org/src/gst-plugins-bad/gst-plugins-bad-1.7.1.tar.xz" />
+  </Version>
+ </release>
+
+ <release>
+  <Version>
    <revision>1.6.2</revision>
    <branch>1.6</branch>
    <name></name>
diff --git a/gst-plugins-bad.spec b/gst-plugins-bad.spec
index 24cc66f..6061164 100644
--- a/gst-plugins-bad.spec
+++ b/gst-plugins-bad.spec
@@ -6,7 +6,7 @@
 
 Summary: GStreamer streaming media framework "bad" plug-ins
 Name: %{gstreamer}-plugins-bad
-Version: 1.6.2
+Version: 1.7.1
 Release: 1.gst
 # The freeze and nfs plugins are LGPLv2 (only)
 License: LGPLv2+ and LGPLv2
@@ -231,7 +231,7 @@
 %{_libdir}/gstreamer-%{majorminor}/libgstsiren.so
 
 %{_libdir}/gstreamer-%{majorminor}/libgstdvbsuboverlay.so
-%{_libdir}/gstreamer-%{majorminor}/libgstfragmented.so
+%{_libdir}/gstreamer-%{majorminor}/libgsthls.so
 %{_libdir}/gstreamer-%{majorminor}/libgstvideoparsersbad.so
 %{_libdir}/gstreamer-%{majorminor}/libgsty4mdec.so
 %{_libdir}/gstreamer-%{majorminor}/libgstaudiovisualizers.so
diff --git a/gst-plugins-bad.spec.in b/gst-plugins-bad.spec.in
index 907c632..0e717bb 100644
--- a/gst-plugins-bad.spec.in
+++ b/gst-plugins-bad.spec.in
@@ -231,7 +231,7 @@
 %{_libdir}/gstreamer-%{majorminor}/libgstsiren.so
 
 %{_libdir}/gstreamer-%{majorminor}/libgstdvbsuboverlay.so
-%{_libdir}/gstreamer-%{majorminor}/libgstfragmented.so
+%{_libdir}/gstreamer-%{majorminor}/libgsthls.so
 %{_libdir}/gstreamer-%{majorminor}/libgstvideoparsersbad.so
 %{_libdir}/gstreamer-%{majorminor}/libgsty4mdec.so
 %{_libdir}/gstreamer-%{majorminor}/libgstaudiovisualizers.so
diff --git a/gst/Makefile.in b/gst/Makefile.in
index 3e4ba88..60e8521 100644
--- a/gst/Makefile.in
+++ b/gst/Makefile.in
@@ -253,6 +253,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -290,6 +292,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -317,6 +321,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -335,6 +341,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -345,6 +353,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -370,6 +380,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -395,6 +407,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -526,6 +540,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -583,8 +599,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -654,6 +674,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/accurip/Makefile.in b/gst/accurip/Makefile.in
index 4ed6aa8..7d1716d 100644
--- a/gst/accurip/Makefile.in
+++ b/gst/accurip/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/adpcmdec/Makefile.in b/gst/adpcmdec/Makefile.in
index f109d68..6a80510 100644
--- a/gst/adpcmdec/Makefile.in
+++ b/gst/adpcmdec/Makefile.in
@@ -271,6 +271,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -308,6 +310,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -335,6 +339,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -353,6 +359,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -363,6 +371,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -388,6 +398,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -413,6 +425,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -544,6 +558,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -601,8 +617,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -672,6 +692,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/adpcmenc/Makefile.in b/gst/adpcmenc/Makefile.in
index d303ed0..e2b24e5 100644
--- a/gst/adpcmenc/Makefile.in
+++ b/gst/adpcmenc/Makefile.in
@@ -271,6 +271,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -308,6 +310,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -335,6 +339,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -353,6 +359,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -363,6 +371,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -388,6 +398,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -413,6 +425,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -544,6 +558,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -601,8 +617,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -672,6 +692,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/aiff/Makefile.in b/gst/aiff/Makefile.in
index dd427f1..3e6e95c 100644
--- a/gst/aiff/Makefile.in
+++ b/gst/aiff/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/aiff/aiffparse.c b/gst/aiff/aiffparse.c
index 78854ae..7ca19c6 100644
--- a/gst/aiff/aiffparse.c
+++ b/gst/aiff/aiffparse.c
@@ -35,14 +35,14 @@
  * <title>Example launch line</title>
  * <para>
  * <programlisting>
- * gst-launch filesrc location=sine.aiff ! aiffparse ! audioconvert ! alsasink
+ * gst-launch-1.0 filesrc location=sine.aiff ! aiffparse ! audioconvert ! alsasink
  * </programlisting>
  * Read a aiff file and output to the soundcard using the ALSA element. The
  * aiff file is assumed to contain raw uncompressed samples.
  * </para>
  * <para>
  * <programlisting>
- * gst-launch souphhtpsrc location=http://www.example.org/sine.aiff ! queue ! aiffparse ! audioconvert ! alsasink
+ * gst-launch-1.0 souphttpsrc location=http://www.example.org/sine.aiff ! queue ! aiffparse ! audioconvert ! alsasink
  * </programlisting>
  * Stream data from a network url.
  * </para>
diff --git a/gst/asfmux/Makefile.in b/gst/asfmux/Makefile.in
index 08cee4f..dbc95c7 100644
--- a/gst/asfmux/Makefile.in
+++ b/gst/asfmux/Makefile.in
@@ -279,6 +279,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -316,6 +318,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -343,6 +347,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -361,6 +367,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -371,6 +379,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -396,6 +406,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -421,6 +433,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -552,6 +566,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -609,8 +625,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -680,6 +700,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/asfmux/gstasfmux.c b/gst/asfmux/gstasfmux.c
index c77f8b6..45617be 100644
--- a/gst/asfmux/gstasfmux.c
+++ b/gst/asfmux/gstasfmux.c
@@ -35,11 +35,11 @@
  * <title>Example launch lines</title>
  * <para>(write everything in one line, without the backslash characters)</para>
  * |[
- * gst-launch videotestsrc num-buffers=250 \
- * ! "video/x-raw,format=(string)I420,framerate=(fraction)25/1" ! ffenc_wmv2 \
+ * gst-launch-1.0 videotestsrc num-buffers=250 \
+ * ! "video/x-raw,format=(string)I420,framerate=(fraction)25/1" ! avenc_wmv2 \
  * ! asfmux name=mux ! filesink location=test.asf \
  * audiotestsrc num-buffers=440 ! audioconvert \
- * ! "audio/x-raw,rate=44100" ! ffenc_wmav2 ! mux.
+ * ! "audio/x-raw,rate=44100" ! avenc_wmav2 ! mux.
  * ]| This creates an ASF file containing an WMV video stream
  * with a test picture and WMA audio stream of a test sound.
  *
@@ -54,13 +54,13 @@
  * <para>(write everything in one line, without the backslash characters)</para>
  * Server (sender)
  * |[
- * gst-launch -ve videotestsrc ! ffenc_wmv2 ! asfmux name=mux streamable=true \
+ * gst-launch-1.0 -ve videotestsrc ! avenc_wmv2 ! asfmux name=mux streamable=true \
  * ! rtpasfpay ! udpsink host=127.0.0.1 port=3333 \
- * audiotestsrc ! ffenc_wmav2 ! mux.
+ * audiotestsrc ! avenc_wmav2 ! mux.
  * ]|
  * Client (receiver)
  * |[
- * gst-launch udpsrc port=3333 ! "caps_from_rtpasfpay_at_sender" \
+ * gst-launch-1.0 udpsrc port=3333 ! "caps_from_rtpasfpay_at_sender" \
  * ! rtpasfdepay ! decodebin name=d ! queue \
  * ! videoconvert ! autovideosink \
  * d. ! queue ! audioconvert ! autoaudiosink
diff --git a/gst/audiofxbad/Makefile.in b/gst/audiofxbad/Makefile.in
index c56081f..f6b89ee 100644
--- a/gst/audiofxbad/Makefile.in
+++ b/gst/audiofxbad/Makefile.in
@@ -273,6 +273,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -310,6 +312,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -337,6 +341,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -355,6 +361,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -365,6 +373,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -390,6 +400,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -415,6 +427,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -546,6 +560,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -603,8 +619,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -674,6 +694,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/audiofxbad/gstaudiochannelmix.c b/gst/audiofxbad/gstaudiochannelmix.c
index fa48c26..aebe84a 100644
--- a/gst/audiofxbad/gstaudiochannelmix.c
+++ b/gst/audiofxbad/gstaudiochannelmix.c
@@ -27,7 +27,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v audiotestsrc ! audiochannelmix ! autoaudiosink
+ * gst-launch-1.0 -v audiotestsrc ! audiochannelmix ! autoaudiosink
  * ]|
  * </refsect2>
  */
diff --git a/gst/audiomixer/Makefile.in b/gst/audiomixer/Makefile.in
index a4eb719..3924cc4 100644
--- a/gst/audiomixer/Makefile.in
+++ b/gst/audiomixer/Makefile.in
@@ -304,6 +304,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -341,6 +343,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -368,6 +372,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -386,6 +392,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -396,6 +404,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -421,6 +431,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -446,6 +458,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -577,6 +591,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -634,8 +650,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -705,6 +725,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/audiomixer/gstaudioaggregator.c b/gst/audiomixer/gstaudioaggregator.c
index 8ca7913..5d7e8d6 100644
--- a/gst/audiomixer/gstaudioaggregator.c
+++ b/gst/audiomixer/gstaudioaggregator.c
@@ -175,6 +175,8 @@
     GstAggregatorPad * bpad, GstBuffer * buffer, GstBuffer ** outbuf);
 static GstFlowReturn gst_audio_aggregator_aggregate (GstAggregator * agg,
     gboolean timeout);
+static gboolean sync_pad_values (GstAudioAggregator * aagg,
+    GstAudioAggregatorPad * pad);
 
 #define DEFAULT_OUTPUT_BUFFER_DURATION (10 * GST_MSECOND)
 #define DEFAULT_ALIGNMENT_THRESHOLD   (40 * GST_MSECOND)
@@ -240,6 +242,8 @@
 
   klass->create_output_buffer = gst_audio_aggregator_create_output_buffer;
 
+  GST_DEBUG_REGISTER_FUNCPTR (sync_pad_values);
+
   GST_DEBUG_CATEGORY_INIT (audio_aggregator_debug, "audioaggregator",
       GST_DEBUG_FG_MAGENTA, "GstAudioAggregator");
 
@@ -829,7 +833,7 @@
   if (discont) {
     /* Have discont, need resync */
     if (pad->priv->next_offset != -1)
-      GST_INFO_OBJECT (pad, "Have discont. Expected %"
+      GST_DEBUG_OBJECT (pad, "Have discont. Expected %"
           G_GUINT64_FORMAT ", got %" G_GUINT64_FORMAT,
           pad->priv->next_offset, start_offset);
     pad->priv->output_offset = -1;
@@ -853,7 +857,7 @@
 
     /* Convert to position in the output segment */
     start_output_offset =
-        gst_segment_to_position (&agg->segment, GST_FORMAT_TIME,
+        gst_segment_position_from_running_time (&agg->segment, GST_FORMAT_TIME,
         start_running_time);
     if (start_output_offset != -1)
       start_output_offset =
@@ -861,7 +865,7 @@
           GST_SECOND);
 
     end_output_offset =
-        gst_segment_to_position (&agg->segment, GST_FORMAT_TIME,
+        gst_segment_position_from_running_time (&agg->segment, GST_FORMAT_TIME,
         end_running_time);
     if (end_output_offset != -1)
       end_output_offset =
@@ -995,7 +999,7 @@
   if (pad->priv->position == pad->priv->size) {
     /* Buffer done, drop it */
     gst_buffer_replace (&pad->priv->buffer, NULL);
-    GST_DEBUG_OBJECT (pad, "Finished mixing buffer, waiting for next");
+    GST_LOG_OBJECT (pad, "Finished mixing buffer, waiting for next");
     return FALSE;
   }
 
@@ -1089,7 +1093,7 @@
 
   /* Sync pad properties to the stream time */
   gst_aggregator_iterate_sinkpads (agg,
-      (GstAggregatorPadForeachFunc) GST_DEBUG_FUNCPTR (sync_pad_values), NULL);
+      (GstAggregatorPadForeachFunc) sync_pad_values, NULL);
 
   GST_AUDIO_AGGREGATOR_LOCK (aagg);
   GST_OBJECT_LOCK (agg);
@@ -1194,8 +1198,8 @@
       if (timeout) {
         if (pad->priv->output_offset < next_offset) {
           gint64 diff = next_offset - pad->priv->output_offset;
-          GST_LOG_OBJECT (pad, "Timeout, missing %" G_GINT64_FORMAT " frames (%"
-              GST_TIME_FORMAT ")", diff,
+          GST_DEBUG_OBJECT (pad, "Timeout, missing %" G_GINT64_FORMAT
+              " frames (%" GST_TIME_FORMAT ")", diff,
               GST_TIME_ARGS (gst_util_uint64_scale (diff, GST_SECOND,
                       GST_AUDIO_INFO_RATE (&aagg->info))));
         }
@@ -1241,7 +1245,7 @@
       pad->priv->output_offset += diff;
 
       if (pad->priv->position == pad->priv->size) {
-        GST_LOG_OBJECT (pad, "Buffer was late by %" GST_TIME_FORMAT
+        GST_DEBUG_OBJECT (pad, "Buffer was late by %" GST_TIME_FORMAT
             ", dropping %" GST_PTR_FORMAT,
             GST_TIME_ARGS (gst_util_uint64_scale (odiff, GST_SECOND,
                     GST_AUDIO_INFO_RATE (&aagg->info))), pad->priv->buffer);
@@ -1262,8 +1266,8 @@
       drop_buf = !gst_audio_aggregator_mix_buffer (aagg, pad, pad->priv->buffer,
           outbuf);
       if (pad->priv->output_offset >= next_offset) {
-        GST_DEBUG_OBJECT (pad,
-            "Pad is after current offset: %" G_GUINT64_FORMAT " >= %"
+        GST_LOG_OBJECT (pad,
+            "Pad is at or after current offset: %" G_GUINT64_FORMAT " >= %"
             G_GINT64_FORMAT, pad->priv->output_offset, next_offset);
       } else {
         is_done = FALSE;
@@ -1279,15 +1283,15 @@
 
   if (dropped) {
     /* We dropped a buffer, retry */
-    GST_INFO_OBJECT (aagg, "A pad dropped a buffer, wait for the next one");
+    GST_LOG_OBJECT (aagg, "A pad dropped a buffer, wait for the next one");
     GST_AUDIO_AGGREGATOR_UNLOCK (aagg);
     return GST_FLOW_OK;
   }
 
   if (!is_done && !is_eos) {
     /* Get more buffers */
-    GST_INFO_OBJECT (aagg,
-        "We're not done yet for the current offset," " waiting for more data");
+    GST_LOG_OBJECT (aagg,
+        "We're not done yet for the current offset, waiting for more data");
     GST_AUDIO_AGGREGATOR_UNLOCK (aagg);
     return GST_FLOW_OK;
   }
diff --git a/gst/audiomixer/gstaudiomixer.c b/gst/audiomixer/gstaudiomixer.c
index 3966a8f..b211f7d 100644
--- a/gst/audiomixer/gstaudiomixer.c
+++ b/gst/audiomixer/gstaudiomixer.c
@@ -44,7 +44,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch audiotestsrc freq=100 ! audiomixer name=mix ! audioconvert ! alsasink audiotestsrc freq=500 ! mix.
+ * gst-launch-1.0 audiotestsrc freq=100 ! audiomixer name=mix ! audioconvert ! alsasink audiotestsrc freq=500 ! mix.
  * ]| This pipeline produces two sine waves mixed together.
  * </refsect2>
  *
@@ -781,6 +781,97 @@
   iface->get_children_count = gst_audiomixer_child_proxy_get_children_count;
 }
 
+/* Empty liveadder alias with non-zero latency */
+
+typedef GstAudioMixer GstLiveAdder;
+typedef GstAudioMixerClass GstLiveAdderClass;
+
+static GType gst_live_adder_get_type (void);
+#define GST_TYPE_LIVE_ADDER gst_live_adder_get_type ()
+
+G_DEFINE_TYPE (GstLiveAdder, gst_live_adder, GST_TYPE_AUDIO_MIXER);
+
+enum
+{
+  LIVEADDER_PROP_LATENCY = 1
+};
+
+static void
+gst_live_adder_init (GstLiveAdder * self)
+{
+}
+
+static void
+gst_live_adder_set_property (GObject * object, guint prop_id,
+    const GValue * value, GParamSpec * pspec)
+{
+  switch (prop_id) {
+    case LIVEADDER_PROP_LATENCY:
+    {
+      GParamSpec *parent_spec =
+          g_object_class_find_property (G_OBJECT_CLASS
+          (gst_live_adder_parent_class), "latency");
+      GObjectClass *pspec_class = g_type_class_peek (parent_spec->owner_type);
+      GValue v = { 0 };
+
+      g_value_init (&v, G_TYPE_INT64);
+
+      g_value_set_int64 (&v, g_value_get_uint (value) * GST_MSECOND);
+
+      G_OBJECT_CLASS (pspec_class)->set_property (object,
+          parent_spec->param_id, &v, parent_spec);
+      break;
+    }
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+gst_live_adder_get_property (GObject * object, guint prop_id, GValue * value,
+    GParamSpec * pspec)
+{
+  switch (prop_id) {
+    case LIVEADDER_PROP_LATENCY:
+    {
+      GParamSpec *parent_spec =
+          g_object_class_find_property (G_OBJECT_CLASS
+          (gst_live_adder_parent_class), "latency");
+      GObjectClass *pspec_class = g_type_class_peek (parent_spec->owner_type);
+      GValue v = { 0 };
+
+      g_value_init (&v, G_TYPE_INT64);
+
+      G_OBJECT_CLASS (pspec_class)->get_property (object,
+          parent_spec->param_id, &v, parent_spec);
+
+      g_value_set_uint (value, g_value_get_int64 (&v) / GST_MSECOND);
+      break;
+    }
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+
+static void
+gst_live_adder_class_init (GstLiveAdderClass * klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  gobject_class->set_property = gst_live_adder_set_property;
+  gobject_class->get_property = gst_live_adder_get_property;
+
+  g_object_class_install_property (gobject_class, LIVEADDER_PROP_LATENCY,
+      g_param_spec_uint ("latency", "Buffer latency",
+          "Additional latency in live mode to allow upstream "
+          "to take longer to produce buffers for the current "
+          "position (in milliseconds)", 0, G_MAXUINT,
+          30, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS | G_PARAM_CONSTRUCT));
+}
+
 static gboolean
 plugin_init (GstPlugin * plugin)
 {
@@ -791,6 +882,10 @@
           GST_TYPE_AUDIO_MIXER))
     return FALSE;
 
+  if (!gst_element_register (plugin, "liveadder", GST_RANK_NONE,
+          GST_TYPE_LIVE_ADDER))
+    return FALSE;
+
   if (!gst_element_register (plugin, "audiointerleave", GST_RANK_NONE,
           GST_TYPE_AUDIO_INTERLEAVE))
     return FALSE;
diff --git a/gst/audiovisualizers/Makefile.am b/gst/audiovisualizers/Makefile.am
index a669900..ec9b05f 100644
--- a/gst/audiovisualizers/Makefile.am
+++ b/gst/audiovisualizers/Makefile.am
@@ -1,7 +1,6 @@
 plugin_LTLIBRARIES = libgstaudiovisualizers.la
 
 libgstaudiovisualizers_la_SOURCES = plugin.c \
-    gstaudiovisualizer.c gstaudiovisualizer.h \
     gstspacescope.c gstspacescope.h \
     gstspectrascope.c gstspectrascope.h \
     gstsynaescope.c gstsynaescope.h \
@@ -13,9 +12,12 @@
 libgstaudiovisualizers_la_LIBADD = \
 	$(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_API_VERSION) \
 	-lgstvideo-$(GST_API_VERSION) -lgstfft-$(GST_API_VERSION) \
-	$(GST_BASE_LIBS)  $(GST_LIBS) $(LIBM)
+	-lgstpbutils-$(GST_API_VERSION) $(GST_BASE_LIBS)  $(GST_LIBS) $(LIBM)
 libgstaudiovisualizers_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
 libgstaudiovisualizers_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
 
-noinst_HEADERS = gstaudiovisualizer.h gstdrawhelpers.h \
-	gstspacescope.h gstspectrascope.h gstsynaescope.h gstwavescope.h
+noinst_HEADERS = gstdrawhelpers.h \
+	gstspacescope.h \
+	gstspectrascope.h \
+	gstsynaescope.h \
+	gstwavescope.h
diff --git a/gst/audiovisualizers/Makefile.in b/gst/audiovisualizers/Makefile.in
index c930141..4bd907a 100644
--- a/gst/audiovisualizers/Makefile.in
+++ b/gst/audiovisualizers/Makefile.in
@@ -169,7 +169,6 @@
 	$(am__DEPENDENCIES_1)
 am_libgstaudiovisualizers_la_OBJECTS =  \
 	libgstaudiovisualizers_la-plugin.lo \
-	libgstaudiovisualizers_la-gstaudiovisualizer.lo \
 	libgstaudiovisualizers_la-gstspacescope.lo \
 	libgstaudiovisualizers_la-gstspectrascope.lo \
 	libgstaudiovisualizers_la-gstsynaescope.lo \
@@ -283,6 +282,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -320,6 +321,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -347,6 +350,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -365,6 +370,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -375,6 +382,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -400,6 +409,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -425,6 +436,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -556,6 +569,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -613,8 +628,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -684,6 +703,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -772,7 +792,6 @@
 wayland_scanner = @wayland_scanner@
 plugin_LTLIBRARIES = libgstaudiovisualizers.la
 libgstaudiovisualizers_la_SOURCES = plugin.c \
-    gstaudiovisualizer.c gstaudiovisualizer.h \
     gstspacescope.c gstspacescope.h \
     gstspectrascope.c gstspectrascope.h \
     gstsynaescope.c gstsynaescope.h \
@@ -785,12 +804,15 @@
 libgstaudiovisualizers_la_LIBADD = \
 	$(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_API_VERSION) \
 	-lgstvideo-$(GST_API_VERSION) -lgstfft-$(GST_API_VERSION) \
-	$(GST_BASE_LIBS)  $(GST_LIBS) $(LIBM)
+	-lgstpbutils-$(GST_API_VERSION) $(GST_BASE_LIBS)  $(GST_LIBS) $(LIBM)
 
 libgstaudiovisualizers_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
 libgstaudiovisualizers_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
-noinst_HEADERS = gstaudiovisualizer.h gstdrawhelpers.h \
-	gstspacescope.h gstspectrascope.h gstsynaescope.h gstwavescope.h
+noinst_HEADERS = gstdrawhelpers.h \
+	gstspacescope.h \
+	gstspectrascope.h \
+	gstsynaescope.h \
+	gstwavescope.h
 
 all: all-am
 
@@ -870,7 +892,6 @@
 distclean-compile:
 	-rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiovisualizers_la-gstaudiovisualizer.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiovisualizers_la-gstspacescope.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiovisualizers_la-gstspectrascope.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstaudiovisualizers_la-gstsynaescope.Plo@am__quote@
@@ -908,13 +929,6 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiovisualizers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiovisualizers_la_CFLAGS) $(CFLAGS) -c -o libgstaudiovisualizers_la-plugin.lo `test -f 'plugin.c' || echo '$(srcdir)/'`plugin.c
 
-libgstaudiovisualizers_la-gstaudiovisualizer.lo: gstaudiovisualizer.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiovisualizers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiovisualizers_la_CFLAGS) $(CFLAGS) -MT libgstaudiovisualizers_la-gstaudiovisualizer.lo -MD -MP -MF $(DEPDIR)/libgstaudiovisualizers_la-gstaudiovisualizer.Tpo -c -o libgstaudiovisualizers_la-gstaudiovisualizer.lo `test -f 'gstaudiovisualizer.c' || echo '$(srcdir)/'`gstaudiovisualizer.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiovisualizers_la-gstaudiovisualizer.Tpo $(DEPDIR)/libgstaudiovisualizers_la-gstaudiovisualizer.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstaudiovisualizer.c' object='libgstaudiovisualizers_la-gstaudiovisualizer.lo' libtool=yes @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiovisualizers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiovisualizers_la_CFLAGS) $(CFLAGS) -c -o libgstaudiovisualizers_la-gstaudiovisualizer.lo `test -f 'gstaudiovisualizer.c' || echo '$(srcdir)/'`gstaudiovisualizer.c
-
 libgstaudiovisualizers_la-gstspacescope.lo: gstspacescope.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstaudiovisualizers_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstaudiovisualizers_la_CFLAGS) $(CFLAGS) -MT libgstaudiovisualizers_la-gstspacescope.lo -MD -MP -MF $(DEPDIR)/libgstaudiovisualizers_la-gstspacescope.Tpo -c -o libgstaudiovisualizers_la-gstspacescope.lo `test -f 'gstspacescope.c' || echo '$(srcdir)/'`gstspacescope.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstaudiovisualizers_la-gstspacescope.Tpo $(DEPDIR)/libgstaudiovisualizers_la-gstspacescope.Plo
diff --git a/gst/audiovisualizers/gstaudiovisualizer.c b/gst/audiovisualizers/gstaudiovisualizer.c
deleted file mode 100644
index 9c4a177..0000000
--- a/gst/audiovisualizers/gstaudiovisualizer.c
+++ /dev/null
@@ -1,1459 +0,0 @@
-/* GStreamer
- * Copyright (C) <2011> Stefan Kost <ensonic@users.sf.net>
- * Copyright (C) <2015> Luis de Bethencourt <luis@debethencourt.com>
- *
- * gstaudiovisualizer.h: base class for audio visualisation elements
- *
- * 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.
- */
-/**
- * SECTION:gstaudiovisualizer
- *
- * A baseclass for scopes (visualizers). It takes care of re-fitting the
- * audio-rate to video-rate and handles renegotiation (downstream video size
- * changes).
- * 
- * It also provides several background shading effects. These effects are
- * applied to a previous picture before the render() implementation can draw a
- * new frame.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include <string.h>
-
-#include <gst/video/video.h>
-#include <gst/video/gstvideometa.h>
-#include <gst/video/gstvideopool.h>
-
-#include "gstaudiovisualizer.h"
-
-GST_DEBUG_CATEGORY_STATIC (audio_visualizer_debug);
-#define GST_CAT_DEFAULT (audio_visualizer_debug)
-
-#define DEFAULT_SHADER GST_AUDIO_VISUALIZER_SHADER_FADE
-#define DEFAULT_SHADE_AMOUNT   0x000a0a0a
-
-enum
-{
-  PROP_0,
-  PROP_SHADER,
-  PROP_SHADE_AMOUNT
-};
-
-static GstBaseTransformClass *parent_class = NULL;
-
-static void gst_audio_visualizer_class_init (GstAudioVisualizerClass * klass);
-static void gst_audio_visualizer_init (GstAudioVisualizer * scope,
-    GstAudioVisualizerClass * g_class);
-static void gst_audio_visualizer_set_property (GObject * object,
-    guint prop_id, const GValue * value, GParamSpec * pspec);
-static void gst_audio_visualizer_get_property (GObject * object,
-    guint prop_id, GValue * value, GParamSpec * pspec);
-static void gst_audio_visualizer_finalize (GObject * object);
-
-static gboolean gst_audio_visualizer_src_negotiate (GstAudioVisualizer * scope);
-static gboolean gst_audio_visualizer_src_setcaps (GstAudioVisualizer *
-    scope, GstCaps * caps);
-static gboolean gst_audio_visualizer_sink_setcaps (GstAudioVisualizer *
-    scope, GstCaps * caps);
-
-static GstFlowReturn gst_audio_visualizer_chain (GstPad * pad,
-    GstObject * parent, GstBuffer * buffer);
-
-static gboolean gst_audio_visualizer_src_event (GstPad * pad,
-    GstObject * parent, GstEvent * event);
-static gboolean gst_audio_visualizer_sink_event (GstPad * pad,
-    GstObject * parent, GstEvent * event);
-
-static gboolean gst_audio_visualizer_src_query (GstPad * pad,
-    GstObject * parent, GstQuery * query);
-
-static GstStateChangeReturn gst_audio_visualizer_change_state (GstElement *
-    element, GstStateChange transition);
-
-static gboolean gst_audio_visualizer_do_bufferpool (GstAudioVisualizer * scope,
-    GstCaps * outcaps);
-
-static gboolean
-default_decide_allocation (GstAudioVisualizer * scope, GstQuery * query);
-
-#define GST_AUDIO_VISUALIZER_GET_PRIVATE(obj)  \
-    (G_TYPE_INSTANCE_GET_PRIVATE ((obj), GST_TYPE_AUDIO_VISUALIZER, GstAudioVisualizerPrivate))
-
-struct _GstAudioVisualizerPrivate
-{
-  gboolean negotiated;
-
-  GstBufferPool *pool;
-  gboolean pool_active;
-  GstAllocator *allocator;
-  GstAllocationParams params;
-  GstQuery *query;
-
-  /* pads */
-  GstPad *srcpad, *sinkpad;
-
-  GstAudioVisualizerShader shader_type;
-  GstAudioVisualizerShaderFunc shader;
-  guint32 shade_amount;
-
-  GstAdapter *adapter;
-
-  GstBuffer *inbuf;
-  GstBuffer *tempbuf;
-  GstVideoFrame tempframe;
-
-  guint spf;                    /* samples per video frame */
-  guint64 frame_duration;
-
-  /* QoS stuff *//* with LOCK */
-  gdouble proportion;
-  GstClockTime earliest_time;
-
-  guint dropped;                /* frames dropped / not dropped */
-  guint processed;
-
-  /* configuration mutex */
-  GMutex config_lock;
-
-  GstSegment segment;
-};
-
-
-/* shading functions */
-
-#define GST_TYPE_AUDIO_VISUALIZER_SHADER (gst_audio_visualizer_shader_get_type())
-static GType
-gst_audio_visualizer_shader_get_type (void)
-{
-  static GType shader_type = 0;
-  static const GEnumValue shaders[] = {
-    {GST_AUDIO_VISUALIZER_SHADER_NONE, "None", "none"},
-    {GST_AUDIO_VISUALIZER_SHADER_FADE, "Fade", "fade"},
-    {GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_UP, "Fade and move up",
-        "fade-and-move-up"},
-    {GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_DOWN, "Fade and move down",
-        "fade-and-move-down"},
-    {GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_LEFT, "Fade and move left",
-        "fade-and-move-left"},
-    {GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_RIGHT,
-          "Fade and move right",
-        "fade-and-move-right"},
-    {GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_HORIZ_OUT,
-        "Fade and move horizontally out", "fade-and-move-horiz-out"},
-    {GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_HORIZ_IN,
-        "Fade and move horizontally in", "fade-and-move-horiz-in"},
-    {GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_VERT_OUT,
-        "Fade and move vertically out", "fade-and-move-vert-out"},
-    {GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_VERT_IN,
-        "Fade and move vertically in", "fade-and-move-vert-in"},
-    {0, NULL, NULL},
-  };
-
-  if (G_UNLIKELY (shader_type == 0)) {
-    /* TODO: rename when exporting it as a library */
-    shader_type =
-        g_enum_register_static
-        ("GstAudioVisualizerShader-BadGstAudioVisualizers", shaders);
-  }
-  return shader_type;
-}
-
-/* we're only supporting GST_VIDEO_FORMAT_xRGB right now) */
-#if G_BYTE_ORDER == G_LITTLE_ENDIAN
-
-#define SHADE(_d, _s, _i, _r, _g, _b)                     \
-G_STMT_START {                                            \
-    _d[_i * 4 + 0] = (_s[_i * 4 + 0] > _b) ? _s[_i * 4 + 0] - _b : 0; \
-    _d[_i * 4 + 1] = (_s[_i * 4 + 1] > _g) ? _s[_i * 4 + 1] - _g : 0; \
-    _d[_i * 4 + 2] = (_s[_i * 4 + 2] > _r) ? _s[_i * 4 + 2] - _r : 0; \
-    _d[_i * 4 + 3] = 0;                                       \
-} G_STMT_END
-
-#else /* G_BYTE_ORDER == G_LITTLE_ENDIAN */
-
-#define SHADE(_d, _s, _i, _r, _g, _b)                     \
-G_STMT_START {                                            \
-    _d[_i * 4 + 0] = 0;                                       \
-    _d[_i * 4 + 1] = (_s[_i * 4 + 1] > _r) ? _s[_i * 4 + 1] - _r : 0; \
-    _d[_i * 4 + 2] = (_s[_i * 4 + 2] > _g) ? _s[_i * 4 + 2] - _g : 0; \
-    _d[_i * 4 + 3] = (_s[_i * 4 + 3] > _b) ? _s[_i * 4 + 3] - _b : 0; \
-} G_STMT_END
-
-#endif
-
-static void
-shader_fade (GstAudioVisualizer * scope, const GstVideoFrame * sframe,
-    GstVideoFrame * dframe)
-{
-  guint i, j;
-  guint32 shade_amount = scope->priv->shade_amount;
-  guint r = (shade_amount >> 16) & 0xff;
-  guint g = (shade_amount >> 8) & 0xff;
-  guint b = (shade_amount >> 0) & 0xff;
-  guint8 *s, *d;
-  gint ss, ds, width, height;
-
-  s = GST_VIDEO_FRAME_PLANE_DATA (sframe, 0);
-  ss = GST_VIDEO_FRAME_PLANE_STRIDE (sframe, 0);
-  d = GST_VIDEO_FRAME_PLANE_DATA (dframe, 0);
-  ds = GST_VIDEO_FRAME_PLANE_STRIDE (dframe, 0);
-
-  width = GST_VIDEO_FRAME_WIDTH (sframe);
-  height = GST_VIDEO_FRAME_HEIGHT (sframe);
-
-  for (j = 0; j < height; j++) {
-    for (i = 0; i < width; i++) {
-      SHADE (d, s, i, r, g, b);
-    }
-    s += ss;
-    d += ds;
-  }
-}
-
-static void
-shader_fade_and_move_up (GstAudioVisualizer * scope,
-    const GstVideoFrame * sframe, GstVideoFrame * dframe)
-{
-  guint i, j;
-  guint32 shade_amount = scope->priv->shade_amount;
-  guint r = (shade_amount >> 16) & 0xff;
-  guint g = (shade_amount >> 8) & 0xff;
-  guint b = (shade_amount >> 0) & 0xff;
-  guint8 *s, *d;
-  gint ss, ds, width, height;
-
-  s = GST_VIDEO_FRAME_PLANE_DATA (sframe, 0);
-  ss = GST_VIDEO_FRAME_PLANE_STRIDE (sframe, 0);
-  d = GST_VIDEO_FRAME_PLANE_DATA (dframe, 0);
-  ds = GST_VIDEO_FRAME_PLANE_STRIDE (dframe, 0);
-
-  width = GST_VIDEO_FRAME_WIDTH (sframe);
-  height = GST_VIDEO_FRAME_HEIGHT (sframe);
-
-  for (j = 1; j < height; j++) {
-    s += ss;
-    for (i = 0; i < width; i++) {
-      SHADE (d, s, i, r, g, b);
-    }
-    d += ds;
-  }
-}
-
-static void
-shader_fade_and_move_down (GstAudioVisualizer * scope,
-    const GstVideoFrame * sframe, GstVideoFrame * dframe)
-{
-  guint i, j;
-  guint32 shade_amount = scope->priv->shade_amount;
-  guint r = (shade_amount >> 16) & 0xff;
-  guint g = (shade_amount >> 8) & 0xff;
-  guint b = (shade_amount >> 0) & 0xff;
-  guint8 *s, *d;
-  gint ss, ds, width, height;
-
-  s = GST_VIDEO_FRAME_PLANE_DATA (sframe, 0);
-  ss = GST_VIDEO_FRAME_PLANE_STRIDE (sframe, 0);
-  d = GST_VIDEO_FRAME_PLANE_DATA (dframe, 0);
-  ds = GST_VIDEO_FRAME_PLANE_STRIDE (dframe, 0);
-
-  width = GST_VIDEO_FRAME_WIDTH (sframe);
-  height = GST_VIDEO_FRAME_HEIGHT (sframe);
-
-  for (j = 1; j < height; j++) {
-    d += ds;
-    for (i = 0; i < width; i++) {
-      SHADE (d, s, i, r, g, b);
-    }
-    s += ss;
-  }
-}
-
-static void
-shader_fade_and_move_left (GstAudioVisualizer * scope,
-    const GstVideoFrame * sframe, GstVideoFrame * dframe)
-{
-  guint i, j;
-  guint32 shade_amount = scope->priv->shade_amount;
-  guint r = (shade_amount >> 16) & 0xff;
-  guint g = (shade_amount >> 8) & 0xff;
-  guint b = (shade_amount >> 0) & 0xff;
-  guint8 *s, *d;
-  gint ss, ds, width, height;
-
-  s = GST_VIDEO_FRAME_PLANE_DATA (sframe, 0);
-  ss = GST_VIDEO_FRAME_PLANE_STRIDE (sframe, 0);
-  d = GST_VIDEO_FRAME_PLANE_DATA (dframe, 0);
-  ds = GST_VIDEO_FRAME_PLANE_STRIDE (dframe, 0);
-
-  width = GST_VIDEO_FRAME_WIDTH (sframe);
-  height = GST_VIDEO_FRAME_HEIGHT (sframe);
-
-  width -= 1;
-  s += 4;
-
-  /* move to the left */
-  for (j = 0; j < height; j++) {
-    for (i = 0; i < width; i++) {
-      SHADE (d, s, i, r, g, b);
-    }
-    d += ds;
-    s += ss;
-  }
-}
-
-static void
-shader_fade_and_move_right (GstAudioVisualizer * scope,
-    const GstVideoFrame * sframe, GstVideoFrame * dframe)
-{
-  guint i, j;
-  guint32 shade_amount = scope->priv->shade_amount;
-  guint r = (shade_amount >> 16) & 0xff;
-  guint g = (shade_amount >> 8) & 0xff;
-  guint b = (shade_amount >> 0) & 0xff;
-  guint8 *s, *d;
-  gint ss, ds, width, height;
-
-  s = GST_VIDEO_FRAME_PLANE_DATA (sframe, 0);
-  ss = GST_VIDEO_FRAME_PLANE_STRIDE (sframe, 0);
-  d = GST_VIDEO_FRAME_PLANE_DATA (dframe, 0);
-  ds = GST_VIDEO_FRAME_PLANE_STRIDE (dframe, 0);
-
-  width = GST_VIDEO_FRAME_WIDTH (sframe);
-  height = GST_VIDEO_FRAME_HEIGHT (sframe);
-
-  width -= 1;
-  d += 4;
-
-  /* move to the right */
-  for (j = 0; j < height; j++) {
-    for (i = 0; i < width; i++) {
-      SHADE (d, s, i, r, g, b);
-    }
-    d += ds;
-    s += ss;
-  }
-}
-
-static void
-shader_fade_and_move_horiz_out (GstAudioVisualizer * scope,
-    const GstVideoFrame * sframe, GstVideoFrame * dframe)
-{
-  guint i, j;
-  guint32 shade_amount = scope->priv->shade_amount;
-  guint r = (shade_amount >> 16) & 0xff;
-  guint g = (shade_amount >> 8) & 0xff;
-  guint b = (shade_amount >> 0) & 0xff;
-  guint8 *s, *d;
-  gint ss, ds, width, height;
-
-  s = GST_VIDEO_FRAME_PLANE_DATA (sframe, 0);
-  ss = GST_VIDEO_FRAME_PLANE_STRIDE (sframe, 0);
-  d = GST_VIDEO_FRAME_PLANE_DATA (dframe, 0);
-  ds = GST_VIDEO_FRAME_PLANE_STRIDE (dframe, 0);
-
-  width = GST_VIDEO_FRAME_WIDTH (sframe);
-  height = GST_VIDEO_FRAME_HEIGHT (sframe);
-
-  /* move upper half up */
-  for (j = 0; j < height / 2; j++) {
-    s += ss;
-    for (i = 0; i < width; i++) {
-      SHADE (d, s, i, r, g, b);
-    }
-    d += ds;
-  }
-  /* move lower half down */
-  for (j = 0; j < height / 2; j++) {
-    d += ds;
-    for (i = 0; i < width; i++) {
-      SHADE (d, s, i, r, g, b);
-    }
-    s += ss;
-  }
-}
-
-static void
-shader_fade_and_move_horiz_in (GstAudioVisualizer * scope,
-    const GstVideoFrame * sframe, GstVideoFrame * dframe)
-{
-  guint i, j;
-  guint32 shade_amount = scope->priv->shade_amount;
-  guint r = (shade_amount >> 16) & 0xff;
-  guint g = (shade_amount >> 8) & 0xff;
-  guint b = (shade_amount >> 0) & 0xff;
-  guint8 *s, *d;
-  gint ss, ds, width, height;
-
-  s = GST_VIDEO_FRAME_PLANE_DATA (sframe, 0);
-  ss = GST_VIDEO_FRAME_PLANE_STRIDE (sframe, 0);
-  d = GST_VIDEO_FRAME_PLANE_DATA (dframe, 0);
-  ds = GST_VIDEO_FRAME_PLANE_STRIDE (dframe, 0);
-
-  width = GST_VIDEO_FRAME_WIDTH (sframe);
-  height = GST_VIDEO_FRAME_HEIGHT (sframe);
-
-  /* move upper half down */
-  for (j = 0; j < height / 2; j++) {
-    d += ds;
-    for (i = 0; i < width; i++) {
-      SHADE (d, s, i, r, g, b);
-    }
-    s += ss;
-  }
-  /* move lower half up */
-  for (j = 0; j < height / 2; j++) {
-    s += ss;
-    for (i = 0; i < width; i++) {
-      SHADE (d, s, i, r, g, b);
-    }
-    d += ds;
-  }
-}
-
-static void
-shader_fade_and_move_vert_out (GstAudioVisualizer * scope,
-    const GstVideoFrame * sframe, GstVideoFrame * dframe)
-{
-  guint i, j;
-  guint32 shade_amount = scope->priv->shade_amount;
-  guint r = (shade_amount >> 16) & 0xff;
-  guint g = (shade_amount >> 8) & 0xff;
-  guint b = (shade_amount >> 0) & 0xff;
-  guint8 *s, *s1, *d, *d1;
-  gint ss, ds, width, height;
-
-  s = GST_VIDEO_FRAME_PLANE_DATA (sframe, 0);
-  ss = GST_VIDEO_FRAME_PLANE_STRIDE (sframe, 0);
-  d = GST_VIDEO_FRAME_PLANE_DATA (dframe, 0);
-  ds = GST_VIDEO_FRAME_PLANE_STRIDE (dframe, 0);
-
-  width = GST_VIDEO_FRAME_WIDTH (sframe);
-  height = GST_VIDEO_FRAME_HEIGHT (sframe);
-
-  for (j = 0; j < height; j++) {
-    /* move left half to the left */
-    s1 = s + 1;
-    for (i = 0; i < width / 2; i++) {
-      SHADE (d, s1, i, r, g, b);
-    }
-    /* move right half to the right */
-    d1 = d + 1;
-    for (; i < width - 1; i++) {
-      SHADE (d1, s, i, r, g, b);
-    }
-    s += ss;
-    d += ds;
-  }
-}
-
-static void
-shader_fade_and_move_vert_in (GstAudioVisualizer * scope,
-    const GstVideoFrame * sframe, GstVideoFrame * dframe)
-{
-  guint i, j;
-  guint32 shade_amount = scope->priv->shade_amount;
-  guint r = (shade_amount >> 16) & 0xff;
-  guint g = (shade_amount >> 8) & 0xff;
-  guint b = (shade_amount >> 0) & 0xff;
-  guint8 *s, *s1, *d, *d1;
-  gint ss, ds, width, height;
-
-  s = GST_VIDEO_FRAME_PLANE_DATA (sframe, 0);
-  ss = GST_VIDEO_FRAME_PLANE_STRIDE (sframe, 0);
-  d = GST_VIDEO_FRAME_PLANE_DATA (dframe, 0);
-  ds = GST_VIDEO_FRAME_PLANE_STRIDE (dframe, 0);
-
-  width = GST_VIDEO_FRAME_WIDTH (sframe);
-  height = GST_VIDEO_FRAME_HEIGHT (sframe);
-
-  for (j = 0; j < height; j++) {
-    /* move left half to the right */
-    d1 = d + 1;
-    for (i = 0; i < width / 2; i++) {
-      SHADE (d1, s, i, r, g, b);
-    }
-    /* move right half to the left */
-    s1 = s + 1;
-    for (; i < width - 1; i++) {
-      SHADE (d, s1, i, r, g, b);
-    }
-    s += ss;
-    d += ds;
-  }
-}
-
-static void
-gst_audio_visualizer_change_shader (GstAudioVisualizer * scope)
-{
-  GstAudioVisualizerShaderFunc shader;
-
-  switch (scope->priv->shader_type) {
-    case GST_AUDIO_VISUALIZER_SHADER_NONE:
-      shader = NULL;
-      break;
-    case GST_AUDIO_VISUALIZER_SHADER_FADE:
-      shader = shader_fade;
-      break;
-    case GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_UP:
-      shader = shader_fade_and_move_up;
-      break;
-    case GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_DOWN:
-      shader = shader_fade_and_move_down;
-      break;
-    case GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_LEFT:
-      shader = shader_fade_and_move_left;
-      break;
-    case GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_RIGHT:
-      shader = shader_fade_and_move_right;
-      break;
-    case GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_HORIZ_OUT:
-      shader = shader_fade_and_move_horiz_out;
-      break;
-    case GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_HORIZ_IN:
-      shader = shader_fade_and_move_horiz_in;
-      break;
-    case GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_VERT_OUT:
-      shader = shader_fade_and_move_vert_out;
-      break;
-    case GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_VERT_IN:
-      shader = shader_fade_and_move_vert_in;
-      break;
-    default:
-      GST_ERROR ("invalid shader function");
-      shader = NULL;
-      break;
-  }
-
-  scope->priv->shader = shader;
-}
-
-/* base class */
-
-GType
-gst_audio_visualizer_get_type (void)
-{
-  static volatile gsize audio_visualizer_type = 0;
-
-  if (g_once_init_enter (&audio_visualizer_type)) {
-    static const GTypeInfo audio_visualizer_info = {
-      sizeof (GstAudioVisualizerClass),
-      NULL,
-      NULL,
-      (GClassInitFunc) gst_audio_visualizer_class_init,
-      NULL,
-      NULL,
-      sizeof (GstAudioVisualizer),
-      0,
-      (GInstanceInitFunc) gst_audio_visualizer_init,
-    };
-    GType _type;
-
-    /* TODO: rename when exporting it as a library */
-    _type = g_type_register_static (GST_TYPE_ELEMENT,
-        "GstAudioVisualizer-BadGstAudioVisualizers", &audio_visualizer_info,
-        G_TYPE_FLAG_ABSTRACT);
-    g_once_init_leave (&audio_visualizer_type, _type);
-  }
-  return (GType) audio_visualizer_type;
-}
-
-static void
-gst_audio_visualizer_class_init (GstAudioVisualizerClass * klass)
-{
-  GObjectClass *gobject_class = (GObjectClass *) klass;
-  GstElementClass *element_class = (GstElementClass *) klass;
-
-  g_type_class_add_private (klass, sizeof (GstAudioVisualizerPrivate));
-
-  parent_class = g_type_class_peek_parent (klass);
-
-  GST_DEBUG_CATEGORY_INIT (audio_visualizer_debug, "baseaudiovisualizer",
-      0, "scope audio visualisation base class");
-
-  gobject_class->set_property = gst_audio_visualizer_set_property;
-  gobject_class->get_property = gst_audio_visualizer_get_property;
-  gobject_class->finalize = gst_audio_visualizer_finalize;
-
-  element_class->change_state =
-      GST_DEBUG_FUNCPTR (gst_audio_visualizer_change_state);
-
-  klass->decide_allocation = GST_DEBUG_FUNCPTR (default_decide_allocation);
-
-  g_object_class_install_property (gobject_class, PROP_SHADER,
-      g_param_spec_enum ("shader", "shader type",
-          "Shader function to apply on each frame",
-          GST_TYPE_AUDIO_VISUALIZER_SHADER, DEFAULT_SHADER,
-          G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
-  g_object_class_install_property (gobject_class, PROP_SHADE_AMOUNT,
-      g_param_spec_uint ("shade-amount", "shade amount",
-          "Shading color to use (big-endian ARGB)", 0, G_MAXUINT32,
-          DEFAULT_SHADE_AMOUNT,
-          G_PARAM_READWRITE | GST_PARAM_CONTROLLABLE | G_PARAM_STATIC_STRINGS));
-}
-
-static void
-gst_audio_visualizer_init (GstAudioVisualizer * scope,
-    GstAudioVisualizerClass * g_class)
-{
-  GstPadTemplate *pad_template;
-
-  scope->priv = GST_AUDIO_VISUALIZER_GET_PRIVATE (scope);
-
-  /* create the sink and src pads */
-  pad_template =
-      gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "sink");
-  g_return_if_fail (pad_template != NULL);
-  scope->priv->sinkpad = gst_pad_new_from_template (pad_template, "sink");
-  gst_pad_set_chain_function (scope->priv->sinkpad,
-      GST_DEBUG_FUNCPTR (gst_audio_visualizer_chain));
-  gst_pad_set_event_function (scope->priv->sinkpad,
-      GST_DEBUG_FUNCPTR (gst_audio_visualizer_sink_event));
-  gst_element_add_pad (GST_ELEMENT (scope), scope->priv->sinkpad);
-
-  pad_template =
-      gst_element_class_get_pad_template (GST_ELEMENT_CLASS (g_class), "src");
-  g_return_if_fail (pad_template != NULL);
-  scope->priv->srcpad = gst_pad_new_from_template (pad_template, "src");
-  gst_pad_set_event_function (scope->priv->srcpad,
-      GST_DEBUG_FUNCPTR (gst_audio_visualizer_src_event));
-  gst_pad_set_query_function (scope->priv->srcpad,
-      GST_DEBUG_FUNCPTR (gst_audio_visualizer_src_query));
-  gst_element_add_pad (GST_ELEMENT (scope), scope->priv->srcpad);
-
-  scope->priv->adapter = gst_adapter_new ();
-  scope->priv->inbuf = gst_buffer_new ();
-
-  /* properties */
-  scope->priv->shader_type = DEFAULT_SHADER;
-  gst_audio_visualizer_change_shader (scope);
-  scope->priv->shade_amount = DEFAULT_SHADE_AMOUNT;
-
-  /* reset the initial video state */
-  gst_video_info_init (&scope->vinfo);
-  scope->priv->frame_duration = GST_CLOCK_TIME_NONE;
-
-  /* reset the initial state */
-  gst_audio_info_init (&scope->ainfo);
-  gst_video_info_init (&scope->vinfo);
-
-  g_mutex_init (&scope->priv->config_lock);
-}
-
-static void
-gst_audio_visualizer_set_property (GObject * object, guint prop_id,
-    const GValue * value, GParamSpec * pspec)
-{
-  GstAudioVisualizer *scope = GST_AUDIO_VISUALIZER (object);
-
-  switch (prop_id) {
-    case PROP_SHADER:
-      scope->priv->shader_type = g_value_get_enum (value);
-      gst_audio_visualizer_change_shader (scope);
-      break;
-    case PROP_SHADE_AMOUNT:
-      scope->priv->shade_amount = g_value_get_uint (value);
-      break;
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-      break;
-  }
-}
-
-static void
-gst_audio_visualizer_get_property (GObject * object, guint prop_id,
-    GValue * value, GParamSpec * pspec)
-{
-  GstAudioVisualizer *scope = GST_AUDIO_VISUALIZER (object);
-
-  switch (prop_id) {
-    case PROP_SHADER:
-      g_value_set_enum (value, scope->priv->shader_type);
-      break;
-    case PROP_SHADE_AMOUNT:
-      g_value_set_uint (value, scope->priv->shade_amount);
-      break;
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-      break;
-  }
-}
-
-static void
-gst_audio_visualizer_finalize (GObject * object)
-{
-  GstAudioVisualizer *scope = GST_AUDIO_VISUALIZER (object);
-  GstAudioVisualizerPrivate *priv = scope->priv;
-
-  if (priv->adapter) {
-    g_object_unref (priv->adapter);
-    priv->adapter = NULL;
-  }
-  if (priv->inbuf) {
-    gst_buffer_unref (priv->inbuf);
-    priv->inbuf = NULL;
-  }
-  if (priv->tempbuf) {
-    gst_video_frame_unmap (&priv->tempframe);
-    gst_buffer_unref (priv->tempbuf);
-    priv->tempbuf = NULL;
-  }
-
-  g_mutex_clear (&priv->config_lock);
-
-  G_OBJECT_CLASS (parent_class)->finalize (object);
-}
-
-static void
-gst_audio_visualizer_reset (GstAudioVisualizer * scope)
-{
-  GstAudioVisualizerPrivate *priv = scope->priv;
-
-  gst_adapter_clear (priv->adapter);
-  gst_segment_init (&priv->segment, GST_FORMAT_UNDEFINED);
-
-  GST_OBJECT_LOCK (scope);
-  priv->proportion = 1.0;
-  priv->earliest_time = -1;
-  priv->dropped = 0;
-  priv->processed = 0;
-  GST_OBJECT_UNLOCK (scope);
-}
-
-static gboolean
-gst_audio_visualizer_sink_setcaps (GstAudioVisualizer * scope, GstCaps * caps)
-{
-  GstAudioInfo info;
-
-  if (!gst_audio_info_from_caps (&info, caps))
-    goto wrong_caps;
-
-  scope->ainfo = info;
-
-  GST_DEBUG_OBJECT (scope, "audio: channels %d, rate %d",
-      GST_AUDIO_INFO_CHANNELS (&info), GST_AUDIO_INFO_RATE (&info));
-
-  if (!gst_audio_visualizer_src_negotiate (scope)) {
-    goto not_negotiated;
-  }
-
-  return TRUE;
-
-  /* Errors */
-wrong_caps:
-  {
-    GST_WARNING_OBJECT (scope, "could not parse caps");
-    return FALSE;
-  }
-not_negotiated:
-  {
-    GST_WARNING_OBJECT (scope, "failed to negotiate");
-    return FALSE;
-  }
-}
-
-static gboolean
-gst_audio_visualizer_src_setcaps (GstAudioVisualizer * scope, GstCaps * caps)
-{
-  GstVideoInfo info;
-  GstAudioVisualizerClass *klass;
-  GstAudioVisualizerPrivate *priv;
-  gboolean res;
-
-  if (!gst_video_info_from_caps (&info, caps))
-    goto wrong_caps;
-
-  klass = GST_AUDIO_VISUALIZER_CLASS (G_OBJECT_GET_CLASS (scope));
-
-  priv = scope->priv;
-
-  scope->vinfo = info;
-
-  priv->frame_duration = gst_util_uint64_scale_int (GST_SECOND,
-      GST_VIDEO_INFO_FPS_D (&info), GST_VIDEO_INFO_FPS_N (&info));
-  priv->spf = gst_util_uint64_scale_int (GST_AUDIO_INFO_RATE (&scope->ainfo),
-      GST_VIDEO_INFO_FPS_D (&info), GST_VIDEO_INFO_FPS_N (&info));
-  scope->req_spf = priv->spf;
-
-  if (priv->tempbuf) {
-    gst_video_frame_unmap (&priv->tempframe);
-    gst_buffer_unref (priv->tempbuf);
-  }
-  priv->tempbuf = gst_buffer_new_wrapped (g_malloc0 (scope->vinfo.size),
-      scope->vinfo.size);
-  gst_video_frame_map (&priv->tempframe, &scope->vinfo, priv->tempbuf,
-      GST_MAP_READWRITE);
-
-  if (klass->setup && !klass->setup (scope))
-    goto setup_failed;
-
-  GST_DEBUG_OBJECT (scope, "video: dimension %dx%d, framerate %d/%d",
-      GST_VIDEO_INFO_WIDTH (&info), GST_VIDEO_INFO_HEIGHT (&info),
-      GST_VIDEO_INFO_FPS_N (&info), GST_VIDEO_INFO_FPS_D (&info));
-  GST_DEBUG_OBJECT (scope, "blocks: spf %u, req_spf %u", priv->spf,
-      scope->req_spf);
-
-  gst_pad_set_caps (priv->srcpad, caps);
-
-  /* find a pool for the negotiated caps now */
-  res = gst_audio_visualizer_do_bufferpool (scope, caps);
-  gst_caps_unref (caps);
-
-  return res;
-
-  /* ERRORS */
-wrong_caps:
-  {
-    gst_caps_unref (caps);
-    GST_DEBUG_OBJECT (scope, "error parsing caps");
-    return FALSE;
-  }
-
-setup_failed:
-  {
-    GST_WARNING_OBJECT (scope, "failed to set up");
-    return FALSE;
-  }
-}
-
-static gboolean
-gst_audio_visualizer_src_negotiate (GstAudioVisualizer * scope)
-{
-  GstCaps *othercaps, *target;
-  GstStructure *structure;
-  GstCaps *templ;
-  gboolean ret;
-
-  templ = gst_pad_get_pad_template_caps (scope->priv->srcpad);
-
-  GST_DEBUG_OBJECT (scope, "performing negotiation");
-
-  /* see what the peer can do */
-  othercaps = gst_pad_peer_query_caps (scope->priv->srcpad, NULL);
-  if (othercaps) {
-    target = gst_caps_intersect (othercaps, templ);
-    gst_caps_unref (othercaps);
-    gst_caps_unref (templ);
-
-    if (gst_caps_is_empty (target))
-      goto no_format;
-
-    target = gst_caps_truncate (target);
-  } else {
-    target = templ;
-  }
-
-  target = gst_caps_make_writable (target);
-  structure = gst_caps_get_structure (target, 0);
-  gst_structure_fixate_field_nearest_int (structure, "width", 320);
-  gst_structure_fixate_field_nearest_int (structure, "height", 200);
-  gst_structure_fixate_field_nearest_fraction (structure, "framerate", 25, 1);
-
-  target = gst_caps_fixate (target);
-
-  GST_DEBUG_OBJECT (scope, "final caps are %" GST_PTR_FORMAT, target);
-
-  ret = gst_audio_visualizer_src_setcaps (scope, target);
-
-  return ret;
-
-no_format:
-  {
-    gst_caps_unref (target);
-    return FALSE;
-  }
-}
-
-/* takes ownership of the pool, allocator and query */
-static gboolean
-gst_audio_visualizer_set_allocation (GstAudioVisualizer * scope,
-    GstBufferPool * pool, GstAllocator * allocator,
-    GstAllocationParams * params, GstQuery * query)
-{
-  GstAllocator *oldalloc;
-  GstBufferPool *oldpool;
-  GstQuery *oldquery;
-  GstAudioVisualizerPrivate *priv = scope->priv;
-
-  GST_OBJECT_LOCK (scope);
-  oldpool = priv->pool;
-  priv->pool = pool;
-  priv->pool_active = FALSE;
-
-  oldalloc = priv->allocator;
-  priv->allocator = allocator;
-
-  oldquery = priv->query;
-  priv->query = query;
-
-  if (params)
-    priv->params = *params;
-  else
-    gst_allocation_params_init (&priv->params);
-  GST_OBJECT_UNLOCK (scope);
-
-  if (oldpool) {
-    GST_DEBUG_OBJECT (scope, "deactivating old pool %p", oldpool);
-    gst_buffer_pool_set_active (oldpool, FALSE);
-    gst_object_unref (oldpool);
-  }
-  if (oldalloc) {
-    gst_object_unref (oldalloc);
-  }
-  if (oldquery) {
-    gst_query_unref (oldquery);
-  }
-  return TRUE;
-}
-
-static gboolean
-gst_audio_visualizer_do_bufferpool (GstAudioVisualizer * scope,
-    GstCaps * outcaps)
-{
-  GstQuery *query;
-  gboolean result = TRUE;
-  GstBufferPool *pool = NULL;
-  GstAudioVisualizerClass *klass;
-  GstAllocator *allocator;
-  GstAllocationParams params;
-
-  /* not passthrough, we need to allocate */
-  /* find a pool for the negotiated caps now */
-  GST_DEBUG_OBJECT (scope, "doing allocation query");
-  query = gst_query_new_allocation (outcaps, TRUE);
-
-  if (!gst_pad_peer_query (scope->priv->srcpad, query)) {
-    /* not a problem, we use the query defaults */
-    GST_DEBUG_OBJECT (scope, "allocation query failed");
-  }
-
-  klass = GST_AUDIO_VISUALIZER_GET_CLASS (scope);
-
-  GST_DEBUG_OBJECT (scope, "calling decide_allocation");
-  g_assert (klass->decide_allocation != NULL);
-  result = klass->decide_allocation (scope, query);
-
-  GST_DEBUG_OBJECT (scope, "ALLOCATION (%d) params: %" GST_PTR_FORMAT, result,
-      query);
-
-  if (!result)
-    goto no_decide_allocation;
-
-  /* we got configuration from our peer or the decide_allocation method,
-   * parse them */
-  if (gst_query_get_n_allocation_params (query) > 0) {
-    gst_query_parse_nth_allocation_param (query, 0, &allocator, &params);
-  } else {
-    allocator = NULL;
-    gst_allocation_params_init (&params);
-  }
-
-  if (gst_query_get_n_allocation_pools (query) > 0)
-    gst_query_parse_nth_allocation_pool (query, 0, &pool, NULL, NULL, NULL);
-
-  /* now store */
-  result =
-      gst_audio_visualizer_set_allocation (scope, pool, allocator, &params,
-      query);
-
-  return result;
-
-  /* Errors */
-no_decide_allocation:
-  {
-    GST_WARNING_OBJECT (scope, "Subclass failed to decide allocation");
-    gst_query_unref (query);
-
-    return result;
-  }
-}
-
-static gboolean
-default_decide_allocation (GstAudioVisualizer * scope, GstQuery * query)
-{
-  GstCaps *outcaps;
-  GstBufferPool *pool;
-  guint size, min, max;
-  GstAllocator *allocator;
-  GstAllocationParams params;
-  GstStructure *config;
-  gboolean update_allocator;
-  gboolean update_pool;
-
-  gst_query_parse_allocation (query, &outcaps, NULL);
-
-  /* we got configuration from our peer or the decide_allocation method,
-   * parse them */
-  if (gst_query_get_n_allocation_params (query) > 0) {
-    /* try the allocator */
-    gst_query_parse_nth_allocation_param (query, 0, &allocator, &params);
-    update_allocator = TRUE;
-  } else {
-    allocator = NULL;
-    gst_allocation_params_init (&params);
-    update_allocator = FALSE;
-  }
-
-  if (gst_query_get_n_allocation_pools (query) > 0) {
-    gst_query_parse_nth_allocation_pool (query, 0, &pool, &size, &min, &max);
-    update_pool = TRUE;
-  } else {
-    pool = NULL;
-    size = GST_VIDEO_INFO_SIZE (&scope->vinfo);
-    min = max = 0;
-    update_pool = FALSE;
-  }
-
-  if (pool == NULL) {
-    /* we did not get a pool, make one ourselves then */
-    pool = gst_video_buffer_pool_new ();
-  }
-
-  config = gst_buffer_pool_get_config (pool);
-  gst_buffer_pool_config_set_params (config, outcaps, size, min, max);
-  gst_buffer_pool_config_set_allocator (config, allocator, &params);
-  gst_buffer_pool_config_add_option (config, GST_BUFFER_POOL_OPTION_VIDEO_META);
-  gst_buffer_pool_set_config (pool, config);
-
-  if (update_allocator)
-    gst_query_set_nth_allocation_param (query, 0, allocator, &params);
-  else
-    gst_query_add_allocation_param (query, allocator, &params);
-
-  if (allocator)
-    gst_object_unref (allocator);
-
-  if (update_pool)
-    gst_query_set_nth_allocation_pool (query, 0, pool, size, min, max);
-  else
-    gst_query_add_allocation_pool (query, pool, size, min, max);
-
-  if (pool)
-    gst_object_unref (pool);
-
-  return TRUE;
-}
-
-static GstFlowReturn
-default_prepare_output_buffer (GstAudioVisualizer * scope, GstBuffer ** outbuf)
-{
-  GstAudioVisualizerPrivate *priv;
-
-  priv = scope->priv;
-
-  g_assert (priv->pool != NULL);
-
-  /* we can't reuse the input buffer */
-  if (!priv->pool_active) {
-    GST_DEBUG_OBJECT (scope, "setting pool %p active", priv->pool);
-    if (!gst_buffer_pool_set_active (priv->pool, TRUE))
-      goto activate_failed;
-    priv->pool_active = TRUE;
-  }
-  GST_DEBUG_OBJECT (scope, "using pool alloc");
-
-  return gst_buffer_pool_acquire_buffer (priv->pool, outbuf, NULL);
-
-  /* ERRORS */
-activate_failed:
-  {
-    GST_ELEMENT_ERROR (scope, RESOURCE, SETTINGS,
-        ("failed to activate bufferpool"), ("failed to activate bufferpool"));
-    return GST_FLOW_ERROR;
-  }
-}
-
-static GstFlowReturn
-gst_audio_visualizer_chain (GstPad * pad, GstObject * parent,
-    GstBuffer * buffer)
-{
-  GstFlowReturn ret = GST_FLOW_OK;
-  GstAudioVisualizer *scope;
-  GstAudioVisualizerPrivate *priv;
-  GstAudioVisualizerClass *klass;
-  GstBuffer *inbuf;
-  guint64 dist, ts;
-  guint avail, sbpf;
-  gpointer adata;
-  gint bps, channels, rate;
-
-  scope = GST_AUDIO_VISUALIZER (parent);
-  priv = scope->priv;
-  klass = GST_AUDIO_VISUALIZER_CLASS (G_OBJECT_GET_CLASS (scope));
-
-  GST_LOG_OBJECT (scope, "chainfunc called");
-
-  /* resync on DISCONT */
-  if (GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT)) {
-    gst_adapter_clear (priv->adapter);
-  }
-
-  /* Make sure have an output format */
-  if (gst_pad_check_reconfigure (priv->srcpad)) {
-    if (!gst_audio_visualizer_src_negotiate (scope)) {
-      gst_pad_mark_reconfigure (priv->srcpad);
-      goto not_negotiated;
-    }
-  }
-
-  channels = GST_AUDIO_INFO_CHANNELS (&scope->ainfo);
-  rate = GST_AUDIO_INFO_RATE (&scope->ainfo);
-  bps = GST_AUDIO_INFO_BPS (&scope->ainfo);
-
-  if (bps == 0) {
-    ret = GST_FLOW_NOT_NEGOTIATED;
-    goto beach;
-  }
-
-  gst_adapter_push (priv->adapter, buffer);
-
-  g_mutex_lock (&priv->config_lock);
-
-  /* this is what we want */
-  sbpf = scope->req_spf * channels * sizeof (gint16);
-
-  inbuf = priv->inbuf;
-  /* FIXME: the timestamp in the adapter would be different */
-  gst_buffer_copy_into (inbuf, buffer, GST_BUFFER_COPY_METADATA, 0, -1);
-
-  /* this is what we have */
-  avail = gst_adapter_available (priv->adapter);
-  GST_LOG_OBJECT (scope, "avail: %u, bpf: %u", avail, sbpf);
-  while (avail >= sbpf) {
-    GstBuffer *outbuf;
-    GstVideoFrame outframe;
-
-    /* get timestamp of the current adapter content */
-    ts = gst_adapter_prev_pts (priv->adapter, &dist);
-    if (GST_CLOCK_TIME_IS_VALID (ts)) {
-      /* convert bytes to time */
-      dist /= bps;
-      ts += gst_util_uint64_scale_int (dist, GST_SECOND, rate);
-    }
-
-    /* check for QoS, don't compute buffers that are known to be late */
-    if (GST_CLOCK_TIME_IS_VALID (ts)) {
-      GstClockTime earliest_time;
-      gdouble proportion;
-      gint64 qostime;
-
-      qostime =
-          gst_segment_to_running_time (&priv->segment, GST_FORMAT_TIME,
-          ts) + priv->frame_duration;
-
-      GST_OBJECT_LOCK (scope);
-      earliest_time = priv->earliest_time;
-      proportion = priv->proportion;
-      GST_OBJECT_UNLOCK (scope);
-
-      if (GST_CLOCK_TIME_IS_VALID (earliest_time) && qostime <= earliest_time) {
-        GstClockTime stream_time, jitter;
-        GstMessage *qos_msg;
-
-        GST_DEBUG_OBJECT (scope,
-            "QoS: skip ts: %" GST_TIME_FORMAT ", earliest: %" GST_TIME_FORMAT,
-            GST_TIME_ARGS (qostime), GST_TIME_ARGS (earliest_time));
-
-        ++priv->dropped;
-        stream_time = gst_segment_to_stream_time (&priv->segment,
-            GST_FORMAT_TIME, ts);
-        jitter = GST_CLOCK_DIFF (qostime, earliest_time);
-        qos_msg = gst_message_new_qos (GST_OBJECT (scope), FALSE, qostime,
-            stream_time, ts, GST_BUFFER_DURATION (buffer));
-        gst_message_set_qos_values (qos_msg, jitter, proportion, 1000000);
-        gst_message_set_qos_stats (qos_msg, GST_FORMAT_BUFFERS,
-            priv->processed, priv->dropped);
-        gst_element_post_message (GST_ELEMENT (scope), qos_msg);
-
-        goto skip;
-      }
-    }
-
-    ++priv->processed;
-
-    g_mutex_unlock (&priv->config_lock);
-    ret = default_prepare_output_buffer (scope, &outbuf);
-    g_mutex_lock (&priv->config_lock);
-    /* recheck as the value could have changed */
-    sbpf = scope->req_spf * channels * sizeof (gint16);
-
-    /* no buffer allocated, we don't care why. */
-    if (ret != GST_FLOW_OK)
-      break;
-
-    /* sync controlled properties */
-    if (GST_CLOCK_TIME_IS_VALID (ts))
-      gst_object_sync_values (GST_OBJECT (scope), ts);
-
-    GST_BUFFER_TIMESTAMP (outbuf) = ts;
-    GST_BUFFER_DURATION (outbuf) = priv->frame_duration;
-
-    /* this can fail as the data size we need could have changed */
-    if (!(adata = (gpointer) gst_adapter_map (priv->adapter, sbpf)))
-      break;
-
-    gst_video_frame_map (&outframe, &scope->vinfo, outbuf, GST_MAP_READWRITE);
-
-    if (priv->shader) {
-      gst_video_frame_copy (&outframe, &priv->tempframe);
-    } else {
-      /* gst_video_frame_clear() or is output frame already cleared */
-      gint i;
-
-      for (i = 0; i < scope->vinfo.finfo->n_planes; i++) {
-        memset (outframe.data[i], 0, outframe.map[i].size);
-      }
-    }
-
-    gst_buffer_replace_all_memory (inbuf,
-        gst_memory_new_wrapped (GST_MEMORY_FLAG_READONLY, adata, sbpf, 0,
-            sbpf, NULL, NULL));
-
-    /* call class->render() vmethod */
-    if (klass->render) {
-      if (!klass->render (scope, inbuf, &outframe)) {
-        ret = GST_FLOW_ERROR;
-        gst_video_frame_unmap (&outframe);
-        goto beach;
-      } else {
-        /* run various post processing (shading and geometric transformation) */
-        /* FIXME: SHADER assumes 32bpp */
-        if (priv->shader && GST_VIDEO_INFO_COMP_PSTRIDE (&scope->vinfo, 0) == 4) {
-          priv->shader (scope, &outframe, &priv->tempframe);
-        }
-      }
-    }
-    gst_video_frame_unmap (&outframe);
-
-    g_mutex_unlock (&priv->config_lock);
-    ret = gst_pad_push (priv->srcpad, outbuf);
-    outbuf = NULL;
-    g_mutex_lock (&priv->config_lock);
-
-  skip:
-    /* recheck as the value could have changed */
-    sbpf = scope->req_spf * channels * sizeof (gint16);
-    GST_LOG_OBJECT (scope, "avail: %u, bpf: %u", avail, sbpf);
-    /* we want to take less or more, depending on spf : req_spf */
-    if (avail - sbpf >= sbpf) {
-      gst_adapter_flush (priv->adapter, sbpf);
-      gst_adapter_unmap (priv->adapter);
-    } else if (avail >= sbpf) {
-      /* just flush a bit and stop */
-      gst_adapter_flush (priv->adapter, (avail - sbpf));
-      gst_adapter_unmap (priv->adapter);
-      break;
-    }
-    avail = gst_adapter_available (priv->adapter);
-
-    if (ret != GST_FLOW_OK)
-      break;
-  }
-
-  g_mutex_unlock (&priv->config_lock);
-
-beach:
-  return ret;
-
-  /* ERRORS */
-not_negotiated:
-  {
-    GST_DEBUG_OBJECT (scope, "Failed to renegotiate");
-    return GST_FLOW_NOT_NEGOTIATED;
-  }
-}
-
-static gboolean
-gst_audio_visualizer_src_event (GstPad * pad, GstObject * parent,
-    GstEvent * event)
-{
-  gboolean res;
-  GstAudioVisualizer *scope;
-  GstAudioVisualizerPrivate *priv;
-
-  scope = GST_AUDIO_VISUALIZER (parent);
-  priv = scope->priv;
-
-  switch (GST_EVENT_TYPE (event)) {
-    case GST_EVENT_QOS:
-    {
-      gdouble proportion;
-      GstClockTimeDiff diff;
-      GstClockTime timestamp;
-
-      gst_event_parse_qos (event, NULL, &proportion, &diff, &timestamp);
-
-      /* save stuff for the _chain() function */
-      GST_OBJECT_LOCK (scope);
-      priv->proportion = proportion;
-      if (diff >= 0)
-        /* we're late, this is a good estimate for next displayable
-         * frame (see part-qos.txt) */
-        priv->earliest_time = timestamp + 2 * diff + priv->frame_duration;
-      else
-        priv->earliest_time = timestamp + diff;
-      GST_OBJECT_UNLOCK (scope);
-
-      res = gst_pad_push_event (priv->sinkpad, event);
-      break;
-    }
-    case GST_EVENT_RECONFIGURE:
-      /* dont't forward */
-      gst_event_unref (event);
-      res = TRUE;
-      break;
-    default:
-      res = gst_pad_event_default (pad, parent, event);
-      break;
-  }
-
-  return res;
-}
-
-static gboolean
-gst_audio_visualizer_sink_event (GstPad * pad, GstObject * parent,
-    GstEvent * event)
-{
-  gboolean res;
-  GstAudioVisualizer *scope;
-
-  scope = GST_AUDIO_VISUALIZER (parent);
-
-  switch (GST_EVENT_TYPE (event)) {
-    case GST_EVENT_CAPS:
-    {
-      GstCaps *caps;
-
-      gst_event_parse_caps (event, &caps);
-      res = gst_audio_visualizer_sink_setcaps (scope, caps);
-      gst_event_unref (event);
-      break;
-    }
-    case GST_EVENT_FLUSH_STOP:
-      gst_audio_visualizer_reset (scope);
-      res = gst_pad_push_event (scope->priv->srcpad, event);
-      break;
-    case GST_EVENT_SEGMENT:
-    {
-      /* the newsegment values are used to clip the input samples
-       * and to convert the incomming timestamps to running time so
-       * we can do QoS */
-      gst_event_copy_segment (event, &scope->priv->segment);
-
-      res = gst_pad_push_event (scope->priv->srcpad, event);
-      break;
-    }
-    default:
-      res = gst_pad_event_default (pad, parent, event);
-      break;
-  }
-
-  return res;
-}
-
-static gboolean
-gst_audio_visualizer_src_query (GstPad * pad, GstObject * parent,
-    GstQuery * query)
-{
-  gboolean res = FALSE;
-  GstAudioVisualizer *scope;
-
-  scope = GST_AUDIO_VISUALIZER (parent);
-
-  switch (GST_QUERY_TYPE (query)) {
-    case GST_QUERY_LATENCY:
-    {
-      /* We need to send the query upstream and add the returned latency to our
-       * own */
-      GstClockTime min_latency, max_latency;
-      gboolean us_live;
-      GstClockTime our_latency;
-      guint max_samples;
-      gint rate = GST_AUDIO_INFO_RATE (&scope->ainfo);
-
-      if (rate == 0)
-        break;
-
-      if ((res = gst_pad_peer_query (scope->priv->sinkpad, query))) {
-        gst_query_parse_latency (query, &us_live, &min_latency, &max_latency);
-
-        GST_DEBUG_OBJECT (scope, "Peer latency: min %"
-            GST_TIME_FORMAT " max %" GST_TIME_FORMAT,
-            GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency));
-
-        /* the max samples we must buffer buffer */
-        max_samples = MAX (scope->req_spf, scope->priv->spf);
-        our_latency = gst_util_uint64_scale_int (max_samples, GST_SECOND, rate);
-
-        GST_DEBUG_OBJECT (scope, "Our latency: %" GST_TIME_FORMAT,
-            GST_TIME_ARGS (our_latency));
-
-        /* we add some latency but only if we need to buffer more than what
-         * upstream gives us */
-        min_latency += our_latency;
-        if (max_latency != -1)
-          max_latency += our_latency;
-
-        GST_DEBUG_OBJECT (scope, "Calculated total latency : min %"
-            GST_TIME_FORMAT " max %" GST_TIME_FORMAT,
-            GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency));
-
-        gst_query_set_latency (query, TRUE, min_latency, max_latency);
-      }
-      break;
-    }
-    default:
-      res = gst_pad_query_default (pad, parent, query);
-      break;
-  }
-
-  return res;
-}
-
-static GstStateChangeReturn
-gst_audio_visualizer_change_state (GstElement * element,
-    GstStateChange transition)
-{
-  GstStateChangeReturn ret;
-  GstAudioVisualizer *scope;
-
-  scope = GST_AUDIO_VISUALIZER (element);
-
-  switch (transition) {
-    case GST_STATE_CHANGE_READY_TO_PAUSED:
-      gst_audio_visualizer_reset (scope);
-      break;
-    default:
-      break;
-  }
-
-  ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
-
-  switch (transition) {
-    case GST_STATE_CHANGE_PAUSED_TO_READY:
-      gst_audio_visualizer_set_allocation (scope, NULL, NULL, NULL, NULL);
-      break;
-    case GST_STATE_CHANGE_READY_TO_NULL:
-      break;
-    default:
-      break;
-  }
-
-  return ret;
-}
diff --git a/gst/audiovisualizers/gstaudiovisualizer.h b/gst/audiovisualizers/gstaudiovisualizer.h
deleted file mode 100644
index 381de81..0000000
--- a/gst/audiovisualizers/gstaudiovisualizer.h
+++ /dev/null
@@ -1,108 +0,0 @@
-/* GStreamer
- * Copyright (C) <2011> Stefan Kost <ensonic@users.sf.net>
- * Copyright (C) <2015> Luis de Bethencourt <luis@debethencourt.com>
- *
- * gstaudiovisualizer.c: base class for audio visualisation elements
- *
- * 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_AUDIO_VISUALIZER_H__
-#define __GST_AUDIO_VISUALIZER_H__
-
-#include <gst/gst.h>
-#include <gst/base/gstbasetransform.h>
-
-#include <gst/video/video.h>
-#include <gst/audio/audio.h>
-#include <gst/base/gstadapter.h>
-
-G_BEGIN_DECLS
-
-#define GST_TYPE_AUDIO_VISUALIZER            (gst_audio_visualizer_get_type())
-#define GST_AUDIO_VISUALIZER(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_AUDIO_VISUALIZER,GstAudioVisualizer))
-#define GST_AUDIO_VISUALIZER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_AUDIO_VISUALIZER,GstAudioVisualizerClass))
-#define GST_AUDIO_VISUALIZER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_AUDIO_VISUALIZER,GstAudioVisualizerClass))
-#define GST_IS_AUDIO_VISUALIZER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_AUDIO_VISUALIZER))
-#define GST_IS_AUDIO_VISUALIZER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_AUDIO_VISUALIZER))
-
-typedef struct _GstAudioVisualizer GstAudioVisualizer;
-typedef struct _GstAudioVisualizerClass GstAudioVisualizerClass;
-typedef struct _GstAudioVisualizerPrivate GstAudioVisualizerPrivate;
-
-typedef void (*GstAudioVisualizerShaderFunc)(GstAudioVisualizer *scope, const GstVideoFrame *s, GstVideoFrame *d);
-
-/**
- * GstAudioVisualizerShader:
- * @GST_AUDIO_VISUALIZER_SHADER_NONE: no shading
- * @GST_AUDIO_VISUALIZER_SHADER_FADE: plain fading
- * @GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_UP: fade and move up
- * @GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_DOWN: fade and move down
- * @GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_LEFT: fade and move left
- * @GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_RIGHT: fade and move right
- * @GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_HORIZ_OUT: fade and move horizontally out
- * @GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_HORIZ_IN: fade and move horizontally in
- * @GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_VERT_OUT: fade and move vertically out
- * @GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_VERT_IN: fade and move vertically in
- *
- * Different types of supported background shading functions.
- */
-typedef enum {
-  GST_AUDIO_VISUALIZER_SHADER_NONE,
-  GST_AUDIO_VISUALIZER_SHADER_FADE,
-  GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_UP,
-  GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_DOWN,
-  GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_LEFT,
-  GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_RIGHT,
-  GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_HORIZ_OUT,
-  GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_HORIZ_IN,
-  GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_VERT_OUT,
-  GST_AUDIO_VISUALIZER_SHADER_FADE_AND_MOVE_VERT_IN
-} GstAudioVisualizerShader;
-
-struct _GstAudioVisualizer
-{
-  GstElement parent;
-
-  guint req_spf;                /* min samples per frame wanted by the subclass */
-
-  /* video state */
-  GstVideoInfo vinfo;
-
-  /* audio state */
-  GstAudioInfo ainfo;
-
-  /* <private> */
-  GstAudioVisualizerPrivate *priv;
-};
-
-struct _GstAudioVisualizerClass
-{
-  GstElementClass parent_class;
-
-  /* virtual function, called whenever the format changes */
-  gboolean (*setup) (GstAudioVisualizer * scope);
-
-  /* virtual function for rendering a frame */
-  gboolean (*render) (GstAudioVisualizer * scope, GstBuffer * audio, GstVideoFrame * video);
-
-  gboolean (*decide_allocation)   (GstAudioVisualizer * scope, GstQuery *query);
-};
-
-GType gst_audio_visualizer_get_type (void);
-
-G_END_DECLS
-#endif /* __GST_AUDIO_VISUALIZER_H__ */
diff --git a/gst/audiovisualizers/gstspacescope.c b/gst/audiovisualizers/gstspacescope.c
index b0828a8..6cde066 100644
--- a/gst/audiovisualizers/gstspacescope.c
+++ b/gst/audiovisualizers/gstspacescope.c
@@ -28,7 +28,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch audiotestsrc ! audioconvert ! spacescope ! ximagesink
+ * gst-launch-1.0 audiotestsrc ! audioconvert ! spacescope ! ximagesink
  * ]|
  * </refsect2>
  */
diff --git a/gst/audiovisualizers/gstspacescope.h b/gst/audiovisualizers/gstspacescope.h
index a305ab5..10659fe 100644
--- a/gst/audiovisualizers/gstspacescope.h
+++ b/gst/audiovisualizers/gstspacescope.h
@@ -22,7 +22,7 @@
 #ifndef __GST_SPACE_SCOPE_H__
 #define __GST_SPACE_SCOPE_H__
 
-#include "gstaudiovisualizer.h"
+#include "gst/pbutils/gstaudiovisualizer.h"
 
 G_BEGIN_DECLS
 #define GST_TYPE_SPACE_SCOPE            (gst_space_scope_get_type())
diff --git a/gst/audiovisualizers/gstspectrascope.c b/gst/audiovisualizers/gstspectrascope.c
index ff43cfd..297d3ef 100644
--- a/gst/audiovisualizers/gstspectrascope.c
+++ b/gst/audiovisualizers/gstspectrascope.c
@@ -29,7 +29,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch audiotestsrc ! audioconvert ! spectrascope ! ximagesink
+ * gst-launch-1.0 audiotestsrc ! audioconvert ! spectrascope ! ximagesink
  * ]|
  * </refsect2>
  */
diff --git a/gst/audiovisualizers/gstspectrascope.h b/gst/audiovisualizers/gstspectrascope.h
index 0b21d08..d063734 100644
--- a/gst/audiovisualizers/gstspectrascope.h
+++ b/gst/audiovisualizers/gstspectrascope.h
@@ -22,7 +22,7 @@
 #ifndef __GST_SPECTRA_SCOPE_H__
 #define __GST_SPECTRA_SCOPE_H__
 
-#include "gstaudiovisualizer.h"
+#include "gst/pbutils/gstaudiovisualizer.h"
 #include <gst/fft/gstffts16.h>
 
 G_BEGIN_DECLS
diff --git a/gst/audiovisualizers/gstsynaescope.c b/gst/audiovisualizers/gstsynaescope.c
index 23d15f0..dfadf09 100644
--- a/gst/audiovisualizers/gstsynaescope.c
+++ b/gst/audiovisualizers/gstsynaescope.c
@@ -28,7 +28,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch audiotestsrc ! audioconvert ! synaescope ! ximagesink
+ * gst-launch-1.0 audiotestsrc ! audioconvert ! synaescope ! ximagesink
  * ]|
  * </refsect2>
  */
diff --git a/gst/audiovisualizers/gstsynaescope.h b/gst/audiovisualizers/gstsynaescope.h
index a3148ed..f6ec264 100644
--- a/gst/audiovisualizers/gstsynaescope.h
+++ b/gst/audiovisualizers/gstsynaescope.h
@@ -22,7 +22,7 @@
 #ifndef __GST_SYNAE_SCOPE_H__
 #define __GST_SYNAE_SCOPE_H__
 
-#include "gstaudiovisualizer.h"
+#include "gst/pbutils/gstaudiovisualizer.h"
 #include <gst/fft/gstffts16.h>
 
 G_BEGIN_DECLS
diff --git a/gst/audiovisualizers/gstwavescope.c b/gst/audiovisualizers/gstwavescope.c
index b87d05c..ad125b0 100644
--- a/gst/audiovisualizers/gstwavescope.c
+++ b/gst/audiovisualizers/gstwavescope.c
@@ -28,7 +28,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch audiotestsrc ! audioconvert ! wavescope ! ximagesink
+ * gst-launch-1.0 audiotestsrc ! audioconvert ! wavescope ! ximagesink
  * ]|
  * </refsect2>
  */
@@ -176,8 +176,7 @@
 {
   GstWaveScope *scope = GST_WAVE_SCOPE (bscope);
 
-  if (scope->flt)
-    g_free (scope->flt);
+  g_free (scope->flt);
 
   scope->flt = g_new0 (gdouble, 6 * GST_AUDIO_INFO_CHANNELS (&bscope->ainfo));
 
diff --git a/gst/audiovisualizers/gstwavescope.h b/gst/audiovisualizers/gstwavescope.h
index 087f179..f367f88 100644
--- a/gst/audiovisualizers/gstwavescope.h
+++ b/gst/audiovisualizers/gstwavescope.h
@@ -22,7 +22,7 @@
 #ifndef __GST_WAVE_SCOPE_H__
 #define __GST_WAVE_SCOPE_H__
 
-#include "gstaudiovisualizer.h"
+#include "gst/pbutils/gstaudiovisualizer.h"
 
 G_BEGIN_DECLS
 #define GST_TYPE_WAVE_SCOPE            (gst_wave_scope_get_type())
diff --git a/gst/autoconvert/Makefile.in b/gst/autoconvert/Makefile.in
index 4c9b61d..19d51b7 100644
--- a/gst/autoconvert/Makefile.in
+++ b/gst/autoconvert/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/autoconvert/gstautoconvert.c b/gst/autoconvert/gstautoconvert.c
index 230a15c..b5a1035 100644
--- a/gst/autoconvert/gstautoconvert.c
+++ b/gst/autoconvert/gstautoconvert.c
@@ -106,6 +106,8 @@
     GstCaps * filter, GstPadDirection dir);
 static GstFlowReturn gst_auto_convert_sink_chain (GstPad * pad,
     GstObject * parent, GstBuffer * buffer);
+static GstFlowReturn gst_auto_convert_sink_chain_list (GstPad * pad,
+    GstObject * parent, GstBufferList * list);
 static gboolean gst_auto_convert_sink_event (GstPad * pad, GstObject * parent,
     GstEvent * event);
 static gboolean gst_auto_convert_sink_query (GstPad * pad, GstObject * parent,
@@ -118,6 +120,8 @@
 
 static GstFlowReturn gst_auto_convert_internal_sink_chain (GstPad * pad,
     GstObject * parent, GstBuffer * buffer);
+static GstFlowReturn gst_auto_convert_internal_sink_chain_list (GstPad * pad,
+    GstObject * parent, GstBufferList * list);
 static gboolean gst_auto_convert_internal_sink_event (GstPad * pad,
     GstObject * parent, GstEvent * event);
 static gboolean gst_auto_convert_internal_sink_query (GstPad * pad,
@@ -188,6 +192,8 @@
 
   gst_pad_set_chain_function (autoconvert->sinkpad,
       GST_DEBUG_FUNCPTR (gst_auto_convert_sink_chain));
+  gst_pad_set_chain_list_function (autoconvert->sinkpad,
+      GST_DEBUG_FUNCPTR (gst_auto_convert_sink_chain_list));
   gst_pad_set_event_function (autoconvert->sinkpad,
       GST_DEBUG_FUNCPTR (gst_auto_convert_sink_event));
   gst_pad_set_query_function (autoconvert->sinkpad,
@@ -479,6 +485,8 @@
 
   gst_pad_set_chain_function (internal_sinkpad,
       GST_DEBUG_FUNCPTR (gst_auto_convert_internal_sink_chain));
+  gst_pad_set_chain_list_function (internal_sinkpad,
+      GST_DEBUG_FUNCPTR (gst_auto_convert_internal_sink_chain_list));
   gst_pad_set_event_function (internal_sinkpad,
       GST_DEBUG_FUNCPTR (gst_auto_convert_internal_sink_event));
   gst_pad_set_query_function (internal_sinkpad,
@@ -921,6 +929,27 @@
   return ret;
 }
 
+static GstFlowReturn
+gst_auto_convert_sink_chain_list (GstPad * pad, GstObject * parent,
+    GstBufferList * list)
+{
+  GstFlowReturn ret = GST_FLOW_NOT_NEGOTIATED;
+  GstAutoConvert *autoconvert = GST_AUTO_CONVERT (parent);
+
+  if (autoconvert->current_internal_srcpad) {
+    ret = gst_pad_push_list (autoconvert->current_internal_srcpad, list);
+    if (ret != GST_FLOW_OK)
+      GST_DEBUG_OBJECT (autoconvert,
+          "Child element %" GST_PTR_FORMAT "returned flow %s",
+          autoconvert->current_subelement, gst_flow_get_name (ret));
+  } else {
+    GST_ERROR_OBJECT (autoconvert, "Got buffer without an negotiated element,"
+        " returning not-negotiated");
+  }
+
+  return ret;
+}
+
 static gboolean
 gst_auto_convert_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
 {
@@ -1212,6 +1241,17 @@
   return gst_pad_push (autoconvert->srcpad, buffer);
 }
 
+static GstFlowReturn
+gst_auto_convert_internal_sink_chain_list (GstPad * pad, GstObject * parent,
+    GstBufferList * list)
+{
+  GstAutoConvert *autoconvert =
+      GST_AUTO_CONVERT (g_object_get_qdata (G_OBJECT (pad),
+          parent_quark));
+
+  return gst_pad_push_list (autoconvert->srcpad, list);
+}
+
 static gboolean
 gst_auto_convert_internal_sink_event (GstPad * pad, GstObject * parent,
     GstEvent * event)
@@ -1243,7 +1283,31 @@
       GST_AUTO_CONVERT (g_object_get_qdata (G_OBJECT (pad),
           parent_quark));
 
-  return gst_pad_peer_query (autoconvert->srcpad, query);
+  if (!gst_pad_peer_query (autoconvert->srcpad, query)) {
+    switch (GST_QUERY_TYPE (query)) {
+      case GST_QUERY_CAPS:
+      {
+        GstCaps *filter;
+
+        gst_query_parse_caps (query, &filter);
+        if (filter) {
+          gst_query_set_caps_result (query, filter);
+        } else {
+          filter = gst_caps_new_any ();
+          gst_query_set_caps_result (query, filter);
+          gst_caps_unref (filter);
+        }
+        return TRUE;
+      }
+      case GST_QUERY_ACCEPT_CAPS:
+        gst_query_set_accept_caps_result (query, TRUE);
+        return TRUE;
+      default:
+        return FALSE;
+    }
+  }
+
+  return TRUE;
 }
 
 static gboolean
diff --git a/gst/autoconvert/gstautovideoconvert.c b/gst/autoconvert/gstautovideoconvert.c
index 271d6f5..11fc974 100644
--- a/gst/autoconvert/gstautovideoconvert.c
+++ b/gst/autoconvert/gstautovideoconvert.c
@@ -20,11 +20,11 @@
 /*
  * test autovideoconvert:
  * if rgb2bayer is present
- * gst-launch videotestsrc num-buffers=2 ! "video/x-raw,width=100,height=100,framerate=10/1" ! autovideoconvert ! "video/x-raw-bayer,width=100,height=100,format=bggr,framerate=10/1" ! fakesink -v
+ * gst-launch-1.0 videotestsrc num-buffers=2 ! "video/x-raw,width=100,height=100,framerate=10/1" ! autovideoconvert ! "video/x-bayer,width=100,height=100,format=bggr,framerate=10/1" ! fakesink -v
  * if bayer2rgb is present
- * gst-launch videotestsrc num-buffers=2 ! "video/x-raw-bayer,width=100,height=100,format=bggr,framerate=10/1" ! autovideoconvert ! "video/x-raw,width=100,height=100,framerate=10/1" ! fakesink -v
+ * gst-launch-1.0 videotestsrc num-buffers=2 ! "video/x-bayer,width=100,height=100,format=bggr,framerate=10/1" ! autovideoconvert ! "video/x-raw,width=100,height=100,framerate=10/1" ! fakesink -v
  * test with videoconvert
- * gst-launch videotestsrc num-buffers=2 ! "video/x-raw,format=RGBx,width=100,height=100,framerate=10/1" ! autovideoconvert ! "video/x-raw,format=RGB16,width=100,height=100,framerate=10/1" ! fakesink -v
+ * gst-launch-1.0 videotestsrc num-buffers=2 ! "video/x-raw,format=RGBx,width=100,height=100,framerate=10/1" ! autovideoconvert ! "video/x-raw,format=RGB16,width=100,height=100,framerate=10/1" ! fakesink -v
  */
 #ifdef HAVE_CONFIG_H
 #include "config.h"
diff --git a/gst/bayer/Makefile.in b/gst/bayer/Makefile.in
index 06418d1..bc33d82 100644
--- a/gst/bayer/Makefile.in
+++ b/gst/bayer/Makefile.in
@@ -298,6 +298,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -335,6 +337,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 
 # orc-generated code creates warnings
@@ -364,6 +368,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -382,6 +388,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -392,6 +400,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -417,6 +427,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -442,6 +454,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -573,6 +587,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -630,8 +646,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -701,6 +721,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/camerabin2/Makefile.in b/gst/camerabin2/Makefile.in
index 89814b7..b897722 100644
--- a/gst/camerabin2/Makefile.in
+++ b/gst/camerabin2/Makefile.in
@@ -282,6 +282,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -319,6 +321,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -346,6 +350,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -364,6 +370,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -374,6 +382,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -399,6 +409,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -424,6 +436,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -555,6 +569,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -612,8 +628,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -683,6 +703,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/camerabin2/gstcamerabin2.c b/gst/camerabin2/gstcamerabin2.c
index 7458675..d0876d5 100644
--- a/gst/camerabin2/gstcamerabin2.c
+++ b/gst/camerabin2/gstcamerabin2.c
@@ -121,11 +121,11 @@
  * <refsect2>
  * <title>Example launch line</title>
  * <para>
- * Unfortunately, camerabin can't be really used from gst-launch, as you need
+ * Unfortunately, camerabin can't be really used from gst-launch-1.0, as you need
  * to send signals to control it. The following pipeline might be able
  * to show the viewfinder using all the default elements.
  * |[
- * gst-launch -v -m camerabin
+ * gst-launch-1.0 -v -m camerabin
  * ]|
  * </para>
  * </refsect2>
diff --git a/gst/camerabin2/gstviewfinderbin.c b/gst/camerabin2/gstviewfinderbin.c
index 9732340..3ae6c31 100644
--- a/gst/camerabin2/gstviewfinderbin.c
+++ b/gst/camerabin2/gstviewfinderbin.c
@@ -24,7 +24,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v videotestsrc ! viewfinderbin
+ * gst-launch-1.0 -v videotestsrc ! viewfinderbin
  * ]|
  * Feeds the viewfinderbin with video test data.
  * </refsect2>
diff --git a/gst/cdxaparse/Makefile.in b/gst/cdxaparse/Makefile.in
index 7b77827..594ea86 100644
--- a/gst/cdxaparse/Makefile.in
+++ b/gst/cdxaparse/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/coloreffects/Makefile.in b/gst/coloreffects/Makefile.in
index 1c5432f..0493f7f 100644
--- a/gst/coloreffects/Makefile.in
+++ b/gst/coloreffects/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/coloreffects/gstchromahold.c b/gst/coloreffects/gstchromahold.c
index fa5709d..097312a 100644
--- a/gst/coloreffects/gstchromahold.c
+++ b/gst/coloreffects/gstchromahold.c
@@ -29,7 +29,7 @@
  *
  * Sample pipeline:
  * |[
- * gst-launch videotestsrc pattern=smpte75 ! \
+ * gst-launch-1.0 videotestsrc pattern=smpte75 ! \
  *   chromahold target-r=0 target-g=0 target-b=255 ! \
  *   videoconvert ! autovideosink     \
  * ]| This pipeline only keeps the red color.
diff --git a/gst/coloreffects/gstcoloreffects.c b/gst/coloreffects/gstcoloreffects.c
index 335588d..a62a45d 100644
--- a/gst/coloreffects/gstcoloreffects.c
+++ b/gst/coloreffects/gstcoloreffects.c
@@ -25,7 +25,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v videotestsrc ! coloreffects preset=heat ! videoconvert !
+ * gst-launch-1.0 -v videotestsrc ! coloreffects preset=heat ! videoconvert !
  *     autovideosink
  * ]| This pipeline shows the effect of coloreffects on a test stream.
  * </refsect2>
diff --git a/gst/compositor/Makefile.in b/gst/compositor/Makefile.in
index 5d3868d..5293106 100644
--- a/gst/compositor/Makefile.in
+++ b/gst/compositor/Makefile.in
@@ -305,6 +305,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -342,6 +344,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -369,6 +373,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -387,6 +393,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -397,6 +405,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -422,6 +432,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -447,6 +459,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -578,6 +592,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -635,8 +651,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -706,6 +726,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/dataurisrc/Makefile.in b/gst/dataurisrc/Makefile.in
index c881d29..cad26ea 100644
--- a/gst/dataurisrc/Makefile.in
+++ b/gst/dataurisrc/Makefile.in
@@ -271,6 +271,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -308,6 +310,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -335,6 +339,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -353,6 +359,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -363,6 +371,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -388,6 +398,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -413,6 +425,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -544,6 +558,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -601,8 +617,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -672,6 +692,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/dataurisrc/gstdataurisrc.c b/gst/dataurisrc/gstdataurisrc.c
index 1fde36d..45c1814 100644
--- a/gst/dataurisrc/gstdataurisrc.c
+++ b/gst/dataurisrc/gstdataurisrc.c
@@ -27,7 +27,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch-0.10 -v dataurisrc uri="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAfElEQVQ4je2MwQnAIAxFgziA4EnczIsO4MEROo/gzZWc4xdTbe1R6LGRR74heYS7iKElzfcMiRnt4hf8gk8EayB6luefue/HzlJfCA50XsNjYRxprZmenXNIKSGEsC+QUqK1hhgj521BzhnWWiilUGvdF5RS4L2HMQZCCJy8sHMm2TYdJAAAAABJRU5ErkJggg==" ! pngdec ! videoconvert ! freeze ! videoconvert ! autovideosink
+ * gst-launch-1.0 -v dataurisrc uri="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAfElEQVQ4je2MwQnAIAxFgziA4EnczIsO4MEROo/gzZWc4xdTbe1R6LGRR74heYS7iKElzfcMiRnt4hf8gk8EayB6luefue/HzlJfCA50XsNjYRxprZmenXNIKSGEsC+QUqK1hhgj521BzhnWWiilUGvdF5RS4L2HMQZCCJy8sHMm2TYdJAAAAABJRU5ErkJggg==" ! pngdec ! videoconvert ! imagefreeze ! videoconvert ! autovideosink
  * ]| This pipeline displays a small 16x16 PNG image from the data URI.
  * </refsect2>
  */
diff --git a/gst/dccp/Makefile.in b/gst/dccp/Makefile.in
index ae90f1d..e9e034b 100644
--- a/gst/dccp/Makefile.in
+++ b/gst/dccp/Makefile.in
@@ -281,6 +281,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -318,6 +320,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -345,6 +349,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -363,6 +369,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -373,6 +381,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -398,6 +408,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -423,6 +435,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -554,6 +568,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -611,8 +627,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -682,6 +702,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/debugutils/Makefile.in b/gst/debugutils/Makefile.in
index 48fa5de..86740c7 100644
--- a/gst/debugutils/Makefile.in
+++ b/gst/debugutils/Makefile.in
@@ -297,6 +297,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -334,6 +336,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -361,6 +365,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -379,6 +385,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -389,6 +397,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -414,6 +424,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -439,6 +451,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -570,6 +584,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -627,8 +643,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -698,6 +718,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/debugutils/fpsdisplaysink.c b/gst/debugutils/fpsdisplaysink.c
index dcef679..39c2422 100644
--- a/gst/debugutils/fpsdisplaysink.c
+++ b/gst/debugutils/fpsdisplaysink.c
@@ -25,10 +25,10 @@
  * <refsect2>
  * <title>Example launch lines</title>
  * |[
- * gst-launch videotestsrc ! fpsdisplaysink
- * gst-launch videotestsrc ! fpsdisplaysink text-overlay=false
- * gst-launch filesrc location=video.avi ! decodebin name=d ! queue ! fpsdisplaysink d. ! queue ! fakesink sync=true
- * gst-launch playbin uri=file:///path/to/video.avi video-sink="fpsdisplaysink" audio-sink=fakesink
+ * gst-launch-1.0 videotestsrc ! fpsdisplaysink
+ * gst-launch-1.0 videotestsrc ! fpsdisplaysink text-overlay=false
+ * gst-launch-1.0 filesrc location=video.avi ! decodebin name=d ! queue ! fpsdisplaysink d. ! queue ! fakesink sync=true
+ * gst-launch-1.0 playbin uri=file:///path/to/video.avi video-sink="fpsdisplaysink" audio-sink=fakesink
  * ]|
  * </refsect2>
  */
diff --git a/gst/debugutils/gstchopmydata.c b/gst/debugutils/gstchopmydata.c
index e7800d5..ceff7e5 100644
--- a/gst/debugutils/gstchopmydata.c
+++ b/gst/debugutils/gstchopmydata.c
@@ -26,7 +26,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v audiotestsrc num-buffers=10 ! gstchopmydata min-size=100
+ * gst-launch-1.0 -v audiotestsrc num-buffers=10 ! chopmydata min-size=100
  * max-size=200 step-size=2 ! fakesink -v
  * ]|
  * 
diff --git a/gst/debugutils/gstdebugspy.c b/gst/debugutils/gstdebugspy.c
index b746b51..19e7cf2 100644
--- a/gst/debugutils/gstdebugspy.c
+++ b/gst/debugutils/gstdebugspy.c
@@ -29,7 +29,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -m videotestsrc ! debugspy ! fakesink
+ * gst-launch-1.0 -m videotestsrc ! debugspy ! fakesink
  * ]|
  * </refsect2>
  */
diff --git a/gst/debugutils/gstwatchdog.c b/gst/debugutils/gstwatchdog.c
index 3292b43..0a4c12e 100644
--- a/gst/debugutils/gstwatchdog.c
+++ b/gst/debugutils/gstwatchdog.c
@@ -35,7 +35,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v fakesrc ! watchdog ! fakesink
+ * gst-launch-1.0 -v fakesrc ! watchdog ! fakesink
  * ]|
  * </refsect2>
  */
diff --git a/gst/dvbsuboverlay/Makefile.in b/gst/dvbsuboverlay/Makefile.in
index d532c63..22a8288 100644
--- a/gst/dvbsuboverlay/Makefile.in
+++ b/gst/dvbsuboverlay/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/dvbsuboverlay/dvb-sub.c b/gst/dvbsuboverlay/dvb-sub.c
index 65a43ab..7596563 100644
--- a/gst/dvbsuboverlay/dvb-sub.c
+++ b/gst/dvbsuboverlay/dvb-sub.c
@@ -277,8 +277,7 @@
     dvb_sub->region_list = region->next;
 
     delete_region_display_list (dvb_sub, region);
-    if (region->pbuf)
-      g_free (region->pbuf);
+    g_free (region->pbuf);
 
     g_slice_free (DVBSubRegion, region);
   }
@@ -472,8 +471,7 @@
   buf += 2;
 
   if (region->width * region->height != region->buf_size) {     /* FIXME: Read closer from spec what happens when dimensions change */
-    if (region->pbuf)
-      g_free (region->pbuf);
+    g_free (region->pbuf);
 
     region->buf_size = region->width * region->height;
 
diff --git a/gst/dvbsuboverlay/gstdvbsuboverlay.c b/gst/dvbsuboverlay/gstdvbsuboverlay.c
index 63599db..3658201 100644
--- a/gst/dvbsuboverlay/gstdvbsuboverlay.c
+++ b/gst/dvbsuboverlay/gstdvbsuboverlay.c
@@ -26,7 +26,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[ FIXME
- * gst-launch -v filesrc location=/path/to/ts ! mpegtsdemux name=d ! queue ! mp3parse ! mad ! audioconvert ! autoaudiosink \
+ * gst-launch-1.0 -v filesrc location=/path/to/ts ! mpegtsdemux name=d ! queue ! mpegaudioparse ! mad ! audioconvert ! autoaudiosink \
  *     d. ! queue ! mpeg2dec ! videoconvert ! r. \
  *     d. ! queue ! "subpicture/x-dvb" ! dvbsuboverlay name=r ! videoconvert ! autovideosink
  * ]| This pipeline demuxes a MPEG-TS file with MPEG2 video, MP3 audio and embedded DVB subtitles and renders the subtitles on top of the video.
diff --git a/gst/dvdspu/Makefile.in b/gst/dvdspu/Makefile.in
index 51c777c..49c3927 100644
--- a/gst/dvdspu/Makefile.in
+++ b/gst/dvdspu/Makefile.in
@@ -278,6 +278,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -315,6 +317,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -342,6 +346,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -360,6 +366,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -370,6 +378,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -395,6 +405,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -420,6 +432,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -551,6 +565,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -608,8 +624,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -679,6 +699,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/dvdspu/gstdvdspu.c b/gst/dvdspu/gstdvdspu.c
index 62ee544..04a4387 100644
--- a/gst/dvdspu/gstdvdspu.c
+++ b/gst/dvdspu/gstdvdspu.c
@@ -24,7 +24,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * FIXME: gst-launch ...
+ * FIXME: gst-launch-1.0 ...
  * ]| FIXME: description for the sample launch pipeline
  * </refsect2>
  */
@@ -90,7 +90,8 @@
 
 static GstCaps *gst_dvd_spu_video_proxy_getcaps (GstPad * pad,
     GstCaps * filter);
-static gboolean gst_dvd_spu_video_set_caps (GstPad * pad, GstCaps * caps);
+static gboolean gst_dvd_spu_video_set_caps (GstDVDSpu * dvdspu, GstPad * pad,
+    GstCaps * caps);
 static GstFlowReturn gst_dvd_spu_video_chain (GstPad * pad, GstObject * parent,
     GstBuffer * buf);
 static gboolean gst_dvd_spu_video_event (GstPad * pad, GstObject * parent,
@@ -104,7 +105,8 @@
     GstBuffer * buf);
 static gboolean gst_dvd_spu_subpic_event (GstPad * pad, GstObject * parent,
     GstEvent * event);
-static gboolean gst_dvd_spu_subpic_set_caps (GstPad * pad, GstCaps * caps);
+static gboolean gst_dvd_spu_subpic_set_caps (GstDVDSpu * dvdspu, GstPad * pad,
+    GstCaps * caps);
 
 static void gst_dvd_spu_clear (GstDVDSpu * dvdspu);
 static void gst_dvd_spu_flush_spu_info (GstDVDSpu * dvdspu,
@@ -315,9 +317,8 @@
 }
 
 static gboolean
-gst_dvd_spu_video_set_caps (GstPad * pad, GstCaps * caps)
+gst_dvd_spu_video_set_caps (GstDVDSpu * dvdspu, GstPad * pad, GstCaps * caps)
 {
-  GstDVDSpu *dvdspu = GST_DVD_SPU (gst_pad_get_parent (pad));
   gboolean res = FALSE;
   GstVideoInfo info;
   gint i;
@@ -339,7 +340,6 @@
 
   res = TRUE;
 done:
-  gst_object_unref (dvdspu);
   return res;
 }
 
@@ -405,7 +405,7 @@
       GstCaps *caps;
 
       gst_event_parse_caps (event, &caps);
-      res = gst_dvd_spu_video_set_caps (pad, caps);
+      res = gst_dvd_spu_video_set_caps (dvdspu, pad, caps);
       if (res)
         res = gst_pad_push_event (dvdspu->srcpad, event);
       else
@@ -1057,7 +1057,7 @@
       GstCaps *caps;
 
       gst_event_parse_caps (event, &caps);
-      res = gst_dvd_spu_subpic_set_caps (pad, caps);
+      res = gst_dvd_spu_subpic_set_caps (dvdspu, pad, caps);
       gst_event_unref (event);
       break;
     }
@@ -1066,9 +1066,10 @@
     case GST_EVENT_CUSTOM_DOWNSTREAM_OOB:
     {
       const GstStructure *structure = gst_event_get_structure (event);
+      const gchar *name = gst_structure_get_name (structure);
       gboolean need_push;
 
-      if (!gst_structure_has_name (structure, "application/x-gst-dvd")) {
+      if (!g_str_has_prefix (name, "application/x-gst-dvd")) {
         res = gst_pad_event_default (pad, parent, event);
         break;
       }
@@ -1184,9 +1185,8 @@
 }
 
 static gboolean
-gst_dvd_spu_subpic_set_caps (GstPad * pad, GstCaps * caps)
+gst_dvd_spu_subpic_set_caps (GstDVDSpu * dvdspu, GstPad * pad, GstCaps * caps)
 {
-  GstDVDSpu *dvdspu = GST_DVD_SPU (gst_pad_get_parent (pad));
   gboolean res = FALSE;
   GstStructure *s;
   SpuInputType input_type;
@@ -1212,7 +1212,6 @@
   DVD_SPU_UNLOCK (dvdspu);
   res = TRUE;
 done:
-  gst_object_unref (dvdspu);
   return res;
 }
 
diff --git a/gst/dvdspu/gstspu-pgs.c b/gst/dvdspu/gstspu-pgs.c
index fc59716..6108de0 100644
--- a/gst/dvdspu/gstspu-pgs.c
+++ b/gst/dvdspu/gstspu-pgs.c
@@ -81,7 +81,8 @@
 static void
 dump_rle_data (GstDVDSpu * dvdspu, guint8 * data, guint32 len)
 {
-  guint16 obj_h G_GNUC_UNUSED;
+#if DUMP_FULL_IMAGE
+  guint16 obj_h;
   guint16 obj_w;
   guint8 *end = data + len;
   guint x = 0;
@@ -141,7 +142,6 @@
       }
     }
 
-#if DUMP_FULL_IMAGE
     {
       gint i;
 #if 1
@@ -159,7 +159,6 @@
       PGS_DUMP ("Run x: %d pix: %d col: %d\n", x, run_len, pal_id);
 #endif
     }
-#endif
 
     x += run_len;
     if (!run_len || x > obj_w)
@@ -167,6 +166,7 @@
   };
 
   PGS_DUMP ("\n");
+#endif
 }
 
 static void
@@ -318,6 +318,8 @@
     guint8 n_objects)
 {
   if (ps->objects == NULL) {
+    if (n_objects == 0)
+      return;
     ps->objects =
         g_array_sized_new (FALSE, TRUE, sizeof (PgsCompositionObject),
         n_objects);
diff --git a/gst/faceoverlay/Makefile.in b/gst/faceoverlay/Makefile.in
index f651c95..382cd5a 100644
--- a/gst/faceoverlay/Makefile.in
+++ b/gst/faceoverlay/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/festival/Makefile.in b/gst/festival/Makefile.in
index 9959066..32c7b01 100644
--- a/gst/festival/Makefile.in
+++ b/gst/festival/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/festival/gstfestival.c b/gst/festival/gstfestival.c
index cb2d1cb..00ef82d 100644
--- a/gst/festival/gstfestival.c
+++ b/gst/festival/gstfestival.c
@@ -71,7 +71,7 @@
  * <refsect2>
  * <title>Example pipeline</title>
  * |[
- * echo 'Hello G-Streamer!' | gst-launch fdsrc fd=0 ! festival ! wavparse ! audioconvert ! alsasink
+ * echo 'Hello G-Streamer!' | gst-launch-1.0 fdsrc fd=0 ! festival ! wavparse ! audioconvert ! alsasink
  * ]|
  * </refsect2>
  */
diff --git a/gst/fieldanalysis/Makefile.in b/gst/fieldanalysis/Makefile.in
index 0d2f359..da057cc 100644
--- a/gst/fieldanalysis/Makefile.in
+++ b/gst/fieldanalysis/Makefile.in
@@ -303,6 +303,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -340,6 +342,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -367,6 +371,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -385,6 +391,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -395,6 +403,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -420,6 +430,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -445,6 +457,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -576,6 +590,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -633,8 +649,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -704,6 +724,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/fieldanalysis/gstfieldanalysis.c b/gst/fieldanalysis/gstfieldanalysis.c
index b7ffd87..260eaf3 100644
--- a/gst/fieldanalysis/gstfieldanalysis.c
+++ b/gst/fieldanalysis/gstfieldanalysis.c
@@ -51,7 +51,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v uridecodebin uri=/path/to/foo.bar ! fieldanalysis ! deinterlace ! videoconvert ! autovideosink
+ * gst-launch-1.0 -v uridecodebin uri=/path/to/foo.bar ! fieldanalysis ! deinterlace ! videoconvert ! autovideosink
  * ]| This pipeline will analyse a video stream with default metrics and thresholds and output progressive frames.
  * </refsect2>
  */
diff --git a/gst/freeverb/Makefile.in b/gst/freeverb/Makefile.in
index 3a0997e..01c5cb2 100644
--- a/gst/freeverb/Makefile.in
+++ b/gst/freeverb/Makefile.in
@@ -277,6 +277,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -314,6 +316,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -341,6 +345,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -359,6 +365,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -369,6 +377,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -394,6 +404,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -419,6 +431,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -550,6 +564,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -607,8 +623,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -678,6 +698,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/freeverb/gstfreeverb.c b/gst/freeverb/gstfreeverb.c
index 4ee3779..9500334 100644
--- a/gst/freeverb/gstfreeverb.c
+++ b/gst/freeverb/gstfreeverb.c
@@ -36,8 +36,8 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch audiotestsrc wave=saw ! freeverb ! autoaudiosink
- * gst-launch filesrc location="melo1.ogg" ! decodebin ! audioconvert ! freeverb ! autoaudiosink
+ * gst-launch-1.0 audiotestsrc wave=saw ! freeverb ! autoaudiosink
+ * gst-launch-1.0 filesrc location="melo1.ogg" ! decodebin ! audioconvert ! freeverb ! autoaudiosink
  * ]|
  * </refsect2>
  */
diff --git a/gst/frei0r/Makefile.in b/gst/frei0r/Makefile.in
index b829d16..e16cfbd 100644
--- a/gst/frei0r/Makefile.in
+++ b/gst/frei0r/Makefile.in
@@ -278,6 +278,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -315,6 +317,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -342,6 +346,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -360,6 +366,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -370,6 +378,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -395,6 +405,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -420,6 +432,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -551,6 +565,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -608,8 +624,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -679,6 +699,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/gaudieffects/Makefile.in b/gst/gaudieffects/Makefile.in
index f81db9b..76b1bcb 100644
--- a/gst/gaudieffects/Makefile.in
+++ b/gst/gaudieffects/Makefile.in
@@ -309,6 +309,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -346,6 +348,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -373,6 +377,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -391,6 +397,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -401,6 +409,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -426,6 +436,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -451,6 +463,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -582,6 +596,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -639,8 +655,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -710,6 +730,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/gaudieffects/gstburn.c b/gst/gaudieffects/gstburn.c
index c82c8af..a3a3c55 100644
--- a/gst/gaudieffects/gstburn.c
+++ b/gst/gaudieffects/gstburn.c
@@ -52,7 +52,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v videotestsrc ! burn ! videoconvert ! autovideosink
+ * gst-launch-1.0 -v videotestsrc ! burn ! videoconvert ! autovideosink
  * ]| This pipeline shows the effect of burn on a test stream
  * </refsect2>
  */
diff --git a/gst/gaudieffects/gstchromium.c b/gst/gaudieffects/gstchromium.c
index 8daca3a..264bb65 100644
--- a/gst/gaudieffects/gstchromium.c
+++ b/gst/gaudieffects/gstchromium.c
@@ -52,7 +52,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v videotestsrc ! chromium ! videoconvert ! autovideosink
+ * gst-launch-1.0 -v videotestsrc ! chromium ! videoconvert ! autovideosink
  * ]| This pipeline shows the effect of chromium on a test stream
  * </refsect2>
  */
diff --git a/gst/gaudieffects/gstdilate.c b/gst/gaudieffects/gstdilate.c
index 98fa053..83a3513 100644
--- a/gst/gaudieffects/gstdilate.c
+++ b/gst/gaudieffects/gstdilate.c
@@ -52,7 +52,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v videotestsrc ! dilate ! videoconvert ! autovideosink
+ * gst-launch-1.0 -v videotestsrc ! dilate ! videoconvert ! autovideosink
  * ]| This pipeline shows the effect of dilate on a test stream
  * </refsect2>
  */
diff --git a/gst/gaudieffects/gstdodge.c b/gst/gaudieffects/gstdodge.c
index 8cf8c6e..996d894 100644
--- a/gst/gaudieffects/gstdodge.c
+++ b/gst/gaudieffects/gstdodge.c
@@ -52,7 +52,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v videotestsrc ! dodge ! videoconvert ! autovideosink
+ * gst-launch-1.0 -v videotestsrc ! dodge ! videoconvert ! autovideosink
  * ]| This pipeline shows the effect of dodge on a test stream
  * </refsect2>
  */
diff --git a/gst/gaudieffects/gstexclusion.c b/gst/gaudieffects/gstexclusion.c
index 860c5b4..a723f69 100644
--- a/gst/gaudieffects/gstexclusion.c
+++ b/gst/gaudieffects/gstexclusion.c
@@ -52,7 +52,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v videotestsrc ! exclusion ! videoconvert ! autovideosink
+ * gst-launch-1.0 -v videotestsrc ! exclusion ! videoconvert ! autovideosink
  * ]| This pipeline shows the effect of exclusion on a test stream
  * </refsect2>
  */
diff --git a/gst/gaudieffects/gstgaussblur.c b/gst/gaudieffects/gstgaussblur.c
index bbf22b6..6ba9b84 100644
--- a/gst/gaudieffects/gstgaussblur.c
+++ b/gst/gaudieffects/gstgaussblur.c
@@ -53,7 +53,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v videotestsrc ! gaussianblur ! videoconvert ! autovideosink
+ * gst-launch-1.0 -v videotestsrc ! gaussianblur ! videoconvert ! autovideosink
  * ]| This pipeline shows the effect of gaussianblur on a test stream
  * </refsect2>
  */
diff --git a/gst/gaudieffects/gstsolarize.c b/gst/gaudieffects/gstsolarize.c
index a45feb2..f5d98b8 100644
--- a/gst/gaudieffects/gstsolarize.c
+++ b/gst/gaudieffects/gstsolarize.c
@@ -52,7 +52,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v videotestsrc ! solarize ! videoconvert ! autovideosink
+ * gst-launch-1.0 -v videotestsrc ! solarize ! videoconvert ! autovideosink
  * ]| This pipeline shows the effect of solarize on a test stream
  * </refsect2>
  */
diff --git a/gst/gdp/Makefile.in b/gst/gdp/Makefile.in
index a389f91..eabc65b 100644
--- a/gst/gdp/Makefile.in
+++ b/gst/gdp/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/gdp/README b/gst/gdp/README
index 6b84afc..1056703 100644
--- a/gst/gdp/README
+++ b/gst/gdp/README
@@ -2,21 +2,21 @@
 - replacing tcpserversink protocol=gdp with gdppay ! tcpserversink:
   - raw audio:
     - server:
-      gst-launch -v audiotestsrc ! gdppay version=0.2 ! tcpserversink
+      gst-launch-1.0 -v audiotestsrc ! gdppay version=0.2 ! tcpserversink
     - client:
-      gst-launch -v tcpclientsrc protocol=gdp ! alsasink sync=FALSE
+      gst-launch-1.0 -v tcpclientsrc protocol=gdp ! alsasink sync=FALSE
 
   - vorbis packets:
     - server:
-      gst-launch -v audiotestsrc ! audioconvert ! vorbisenc ! gdppay version=0.2 ! tcpserversink
+      gst-launch-1.0 -v audiotestsrc ! audioconvert ! vorbisenc ! gdppay version=0.2 ! tcpserversink
     - client:
-      gst-launch -v tcpclientsrc protocol=gdp ! vorbisdec ! audioconvert ! alsasink sync=FALSE
+      gst-launch-1.0 -v tcpclientsrc protocol=gdp ! vorbisdec ! audioconvert ! alsasink sync=FALSE
 
   - ogg packets:
     - server:
-      gst-launch -v audiotestsrc ! audioconvert ! vorbisenc ! oggmux ! gdppay version=0.2 ! tcpserversink
+      gst-launch-1.0 -v audiotestsrc ! audioconvert ! vorbisenc ! oggmux ! gdppay version=0.2 ! tcpserversink
     - client:
-      gst-launch -v tcpclientsrc protocol=gdp ! oggdemux ! vorbisdec ! audioconvert ! alsasink sync=FALSE
+      gst-launch-1.0 -v tcpclientsrc protocol=gdp ! oggdemux ! vorbisdec ! audioconvert ! alsasink sync=FALSE
 
   In all the client pipelines, tcpclientsrc protocol=gdp can be replaced with
   tcpclientsrc ! gdpdepay
diff --git a/gst/gdp/gstgdpdepay.c b/gst/gdp/gstgdpdepay.c
index faa3642..b16a9c8 100644
--- a/gst/gdp/gstgdpdepay.c
+++ b/gst/gdp/gstgdpdepay.c
@@ -26,7 +26,7 @@
  *
  * <refsect2>
  * |[
- * gst-launch -v -m filesrc location=test.gdp ! gdpdepay ! xvimagesink
+ * gst-launch-1.0 -v -m filesrc location=test.gdp ! gdpdepay ! xvimagesink
  * ]| This pipeline plays back a serialized video stream as created in the
  * example for gdppay.
  * </refsect2>
diff --git a/gst/gdp/gstgdppay.c b/gst/gdp/gstgdppay.c
index 33ac591..b428462 100644
--- a/gst/gdp/gstgdppay.c
+++ b/gst/gdp/gstgdppay.c
@@ -27,7 +27,7 @@
  *
  * <refsect2>
  * |[
- * gst-launch -v -m videotestsrc num-buffers=50 ! gdppay ! filesink location=test.gdp
+ * gst-launch-1.0 -v -m videotestsrc num-buffers=50 ! gdppay ! filesink location=test.gdp
  * ]| This pipeline creates a serialized video stream that can be played back
  * with the example shown in gdpdepay.
  * </refsect2>
@@ -577,6 +577,8 @@
     flowret = gst_gdp_queue_buffer (this, outbuffer);
     if (flowret != GST_FLOW_OK)
       goto push_error;
+  } else {
+    gst_buffer_unref (outbuffer);
   }
 
 done:
diff --git a/gst/geometrictransform/Makefile.in b/gst/geometrictransform/Makefile.in
index 4be8867..03401d8 100644
--- a/gst/geometrictransform/Makefile.in
+++ b/gst/geometrictransform/Makefile.in
@@ -297,6 +297,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -334,6 +336,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -361,6 +365,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -379,6 +385,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -389,6 +397,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -414,6 +424,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -439,6 +451,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -570,6 +584,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -627,8 +643,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -698,6 +718,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/geometrictransform/geometricmath.c b/gst/geometrictransform/geometricmath.c
index 1ca5a78..6c7949e 100644
--- a/gst/geometrictransform/geometricmath.c
+++ b/gst/geometrictransform/geometricmath.c
@@ -54,7 +54,7 @@
 #define B  0x100
 #define BM 0xff
 
-struct _Noise
+struct _GstGMNoise
 {
   gdouble p[2 * B + 2];
   gdouble g2[2 * B + 2][2];
@@ -69,10 +69,10 @@
   v[1] = v[1] / s;
 }
 
-Noise *
-noise_new (void)
+GstGMNoise *
+gst_gm_noise_new (void)
 {
-  Noise *noise = g_new0 (Noise, 1);
+  GstGMNoise *noise = g_new0 (GstGMNoise, 1);
   gint i, j, k;
 
   for (i = 0; i < B; i++) {
@@ -102,7 +102,7 @@
 }
 
 void
-noise_free (Noise * noise)
+gst_gm_noise_free (GstGMNoise * noise)
 {
   g_free (noise);
 }
@@ -120,7 +120,7 @@
 }
 
 gdouble
-noise_2 (Noise * noise, gdouble x, gdouble y)
+gst_gm_noise_2 (GstGMNoise * noise, gdouble x, gdouble y)
 {
   gint bx0, bx1, by0, by1, b00, b10, b01, b11;
   gdouble rx0, rx1, ry0, ry1, sx, sy, a, b, t, u, v;
@@ -169,7 +169,7 @@
  * This differs from the % operator with respect to negative numbers
  */
 gdouble
-mod_float (gdouble a, gdouble b)
+gst_gm_mod_float (gdouble a, gdouble b)
 {
   gint n = (gint) (a / b);
 
@@ -183,9 +183,9 @@
  * Returns a repeating triangle shape in the range 0..1 with wavelength 1.0
  */
 gdouble
-geometric_math_triangle (gdouble x)
+gst_gm_triangle (gdouble x)
 {
-  gdouble r = mod_float (x, 1.0);
+  gdouble r = gst_gm_mod_float (x, 1.0);
 
   return 2.0 * (r < 0.5 ? r : 1 - r);
 }
@@ -194,7 +194,7 @@
  * Hermite interpolation
  */
 gdouble
-smoothstep (gdouble edge0, gdouble edge1, gdouble x)
+gst_gm_smoothstep (gdouble edge0, gdouble edge1, gdouble x)
 {
   gdouble t = CLAMP ((x - edge0) / (edge1 - edge0), 0.0, 1.0);
   return t * t * (3.0 - 2.0 * t);
diff --git a/gst/geometrictransform/geometricmath.h b/gst/geometrictransform/geometricmath.h
index 0c6ccdc..40451d8 100644
--- a/gst/geometrictransform/geometricmath.h
+++ b/gst/geometrictransform/geometricmath.h
@@ -54,16 +54,16 @@
 
 G_BEGIN_DECLS
 
-typedef struct _Noise Noise;
+typedef struct _GstGMNoise GstGMNoise;
 
-Noise * noise_new (void);
-void noise_free (Noise * noise);
-gdouble noise_2 (Noise * noise, gdouble x, gdouble y);
+GstGMNoise * gst_gm_noise_new (void);
+void gst_gm_noise_free (GstGMNoise * noise);
+gdouble gst_gm_noise_2 (GstGMNoise * noise, gdouble x, gdouble y);
 
-gdouble mod_float (gdouble a, gdouble b);
-gdouble geometric_math_triangle (gdouble x);
+gdouble gst_gm_mod_float (gdouble a, gdouble b);
+gdouble gst_gm_triangle (gdouble x);
 
-gdouble smoothstep (gdouble edge0, gdouble edge1, gdouble x);
+gdouble gst_gm_smoothstep (gdouble edge0, gdouble edge1, gdouble x);
 
 G_END_DECLS
 
diff --git a/gst/geometrictransform/gstbulge.c b/gst/geometrictransform/gstbulge.c
index 5864c83..98a7849 100644
--- a/gst/geometrictransform/gstbulge.c
+++ b/gst/geometrictransform/gstbulge.c
@@ -41,6 +41,21 @@
  * Boston, MA 02110-1301, USA.
  */
 
+/**
+ * SECTION:element-bulge
+ * @see_also: geometrictransform
+ *
+ * Bugle is a geometric image transform element. It adds a protuberance in the
+ * center point.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 -v videotestsrc ! bulge ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
+
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
 #endif
@@ -140,8 +155,8 @@
    * zoom is achieved dividing */
 
   scale =
-      1.0 / (bulge->zoom + ((1.0 - bulge->zoom) * smoothstep (0, cgt->radius,
-              r)));
+      1.0 / (bulge->zoom + ((1.0 - bulge->zoom) * gst_gm_smoothstep (0,
+              cgt->radius, r)));
 
   norm_x *= scale;
   norm_y *= scale;
diff --git a/gst/geometrictransform/gstcircle.c b/gst/geometrictransform/gstcircle.c
index cbbd415..da4f48b 100644
--- a/gst/geometrictransform/gstcircle.c
+++ b/gst/geometrictransform/gstcircle.c
@@ -47,6 +47,20 @@
  * his code.
  */
 
+/**
+ * SECTION:element-circle
+ * @see_also: geometrictransform
+ *
+ * Circle is a geometric image transform element. It warps the picture into an
+ * arc shaped form.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 -v videotestsrc ! circle ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
 
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
@@ -158,7 +172,7 @@
   distance = sqrt (dx * dx + dy * dy);
   theta = atan2 (-dy, -dx) + circle->angle;
 
-  theta = mod_float (theta, 2 * G_PI);
+  theta = gst_gm_mod_float (theta, 2 * G_PI);
 
   *in_x = gt->width * theta / (circle->spread_angle + 0.0001);
   *in_y =
diff --git a/gst/geometrictransform/gstdiffuse.c b/gst/geometrictransform/gstdiffuse.c
index 97225c1..03009c7 100644
--- a/gst/geometrictransform/gstdiffuse.c
+++ b/gst/geometrictransform/gstdiffuse.c
@@ -47,6 +47,20 @@
  * his code.
  */
 
+/**
+ * SECTION:element-diffuse
+ * @see_also: geometrictransform
+ *
+ * Diffuse is a geometric image transform element. It diffuses the image by
+ * moving its pixels in random directions.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 -v videotestsrc ! diffuse ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
 
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
diff --git a/gst/geometrictransform/gstfisheye.c b/gst/geometrictransform/gstfisheye.c
index 0d9f2b9..d08069c 100644
--- a/gst/geometrictransform/gstfisheye.c
+++ b/gst/geometrictransform/gstfisheye.c
@@ -41,6 +41,21 @@
  * Boston, MA 02110-1301, USA.
  */
 
+/**
+ * SECTION:element-fisheye
+ * @see_also: geometrictransform
+ *
+ * Fisheye is a geometric image transform element. It simulates a fisheye lens
+ * by zooming on the center of the image and compressing the edges.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 -v videotestsrc ! fisheye ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
+
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
 #endif
diff --git a/gst/geometrictransform/gstgeometrictransform.c b/gst/geometrictransform/gstgeometrictransform.c
index 7cfaafd..94910ed 100644
--- a/gst/geometrictransform/gstgeometrictransform.c
+++ b/gst/geometrictransform/gstgeometrictransform.c
@@ -181,8 +181,8 @@
       break;
 
     case GST_GT_OFF_EDGES_PIXELS_WRAP:
-      in_x = mod_float (in_x, gt->width);
-      in_y = mod_float (in_y, gt->height);
+      in_x = gst_gm_mod_float (in_x, gt->width);
+      in_y = gst_gm_mod_float (in_y, gt->height);
       if (in_x < 0)
         in_x += gt->width;
       if (in_y < 0)
diff --git a/gst/geometrictransform/gstkaleidoscope.c b/gst/geometrictransform/gstkaleidoscope.c
index 9caf7f4..bb1bdfc 100644
--- a/gst/geometrictransform/gstkaleidoscope.c
+++ b/gst/geometrictransform/gstkaleidoscope.c
@@ -47,6 +47,20 @@
  * his code.
  */
 
+/**
+ * SECTION:element-kaleidoscope
+ * @see_also: geometrictransform
+ *
+ * The kaleidscope element applies 'kaleidoscope' geometric transform to the
+ * image.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 -v videotestsrc ! kaleidoscope ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
 
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
@@ -158,12 +172,12 @@
   distance = sqrt (dx * dx + dy * dy);
   theta = atan2 (dy, dx) - kaleidoscope->angle - kaleidoscope->angle2;
 
-  theta = geometric_math_triangle (theta / G_PI * kaleidoscope->sides * 0.5);
+  theta = gst_gm_triangle (theta / G_PI * kaleidoscope->sides * 0.5);
 
   if (cgt->precalc_radius != 0) {
     gdouble radiusc = cgt->precalc_radius / cos (theta);
 
-    distance = radiusc * geometric_math_triangle (distance / radiusc);
+    distance = radiusc * gst_gm_triangle (distance / radiusc);
   }
   theta += kaleidoscope->angle;
 
diff --git a/gst/geometrictransform/gstmarble.c b/gst/geometrictransform/gstmarble.c
index 08bbd3c..6898453 100644
--- a/gst/geometrictransform/gstmarble.c
+++ b/gst/geometrictransform/gstmarble.c
@@ -47,6 +47,20 @@
  * his code.
  */
 
+/**
+ * SECTION:element-marble
+ * @see_also: geometrictransform
+ *
+ * Marble is a geometric image transform element. It applies a marbling effect
+ * to the image.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 -v videotestsrc ! marble ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
 
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
@@ -158,7 +172,7 @@
 {
   GstMarble *marble = GST_MARBLE_CAST (obj);
 
-  noise_free (marble->noise);
+  gst_gm_noise_free (marble->noise);
   g_free (marble->sin_table);
   g_free (marble->cos_table);
 
@@ -172,7 +186,7 @@
   gint i;
 
   if (!marble->noise) {
-    marble->noise = noise_new ();
+    marble->noise = gst_gm_noise_new ();
   }
 
   g_free (marble->sin_table);
@@ -197,7 +211,7 @@
   GstMarble *marble = GST_MARBLE_CAST (gt);
   gint displacement;
 
-  displacement = 127 * (1 + noise_2 (marble->noise, x / marble->xscale,
+  displacement = 127 * (1 + gst_gm_noise_2 (marble->noise, x / marble->xscale,
           y / marble->xscale));
   displacement = CLAMP (displacement, 0, 255);
 
diff --git a/gst/geometrictransform/gstmarble.h b/gst/geometrictransform/gstmarble.h
index b74768f..2665775 100644
--- a/gst/geometrictransform/gstmarble.h
+++ b/gst/geometrictransform/gstmarble.h
@@ -76,7 +76,7 @@
   gdouble turbulence;
   gdouble amount;
 
-  Noise *noise;
+  GstGMNoise *noise;
   gdouble *sin_table;
   gdouble *cos_table;
 };
diff --git a/gst/geometrictransform/gstmirror.c b/gst/geometrictransform/gstmirror.c
index db8afbf..df18234 100644
--- a/gst/geometrictransform/gstmirror.c
+++ b/gst/geometrictransform/gstmirror.c
@@ -41,6 +41,21 @@
  * Boston, MA 02110-1301, USA.
  */
 
+/**
+ * SECTION:element-mirror
+ * @see_also: geometrictransform
+ *
+ * Mirror is a geometric transform element. It splits the image into two halves
+ * and reflects one over each other.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 -v videotestsrc ! mirror ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
+
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
 #endif
@@ -97,23 +112,23 @@
 
   switch (prop_id) {
     case PROP_MODE:
-      {
-        gint mode;
+    {
+      gint mode;
 
-        GST_OBJECT_LOCK (filter);
-        mode = g_value_get_enum (value);
+      GST_OBJECT_LOCK (filter);
+      mode = g_value_get_enum (value);
 
-        if (mode != filter->mode) {
-          GstGeometricTransform *gt;
+      if (mode != filter->mode) {
+        GstGeometricTransform *gt;
 
-          gt = GST_GEOMETRIC_TRANSFORM_CAST (object);
-          filter->mode = mode;
-          gst_geometric_transform_set_need_remap (gt);
-        }
-
-        GST_OBJECT_UNLOCK (filter);
-        break;
+        gt = GST_GEOMETRIC_TRANSFORM_CAST (object);
+        filter->mode = mode;
+        gst_geometric_transform_set_need_remap (gt);
       }
+
+      GST_OBJECT_UNLOCK (filter);
+      break;
+    }
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
diff --git a/gst/geometrictransform/gstperspective.c b/gst/geometrictransform/gstperspective.c
index e9ed230..bafa1fc 100644
--- a/gst/geometrictransform/gstperspective.c
+++ b/gst/geometrictransform/gstperspective.c
@@ -47,6 +47,20 @@
  * http://docs.oracle.com/cd/E17802_01/products/products/java-media/jai/forDevelopers/jai-apidocs/javax/media/jai/PerspectiveTransform.html
  */
 
+/**
+ * SECTION:element-perspective
+ * @see_also: geometrictransform
+ *
+ * The perspective element applies a 2D perspective transform.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 -v videotestsrc ! perspective ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
+
 /* FIXME: suppress warnings for deprecated API such as GValueArray
  * with newer GLib versions (>= 2.31.0)
  *
diff --git a/gst/geometrictransform/gstpinch.c b/gst/geometrictransform/gstpinch.c
index 296b84a..d68dcd1 100644
--- a/gst/geometrictransform/gstpinch.c
+++ b/gst/geometrictransform/gstpinch.c
@@ -47,6 +47,19 @@
  * his code.
  */
 
+/**
+ * SECTION:element-pinch
+ * @see_also: geometrictransform
+ *
+ * Pinch applies a 'pinch' geometric transform to the image.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 -v videotestsrc ! pinch ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
 
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
diff --git a/gst/geometrictransform/gstrotate.c b/gst/geometrictransform/gstrotate.c
index 693c898..1e03339 100644
--- a/gst/geometrictransform/gstrotate.c
+++ b/gst/geometrictransform/gstrotate.c
@@ -47,6 +47,19 @@
  * his code.
  */
 
+/**
+ * SECTION:element-rotate
+ * @see_also: geometrictransform
+ *
+ * The rotate element transforms the image by rotating it by a specified angle.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 -v videotestsrc ! rotate angle=0.78 ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
 
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
diff --git a/gst/geometrictransform/gstsphere.c b/gst/geometrictransform/gstsphere.c
index a425470..5f39a47 100644
--- a/gst/geometrictransform/gstsphere.c
+++ b/gst/geometrictransform/gstsphere.c
@@ -47,6 +47,19 @@
  * his code.
  */
 
+/**
+ * SECTION:element-sphere
+ * @see_also: geometrictransform
+ *
+ * The sphere element applies a 'sphere' geometric transform to the image.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 -v videotestsrc ! sphere ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
 
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
diff --git a/gst/geometrictransform/gstsquare.c b/gst/geometrictransform/gstsquare.c
index 8e4c99c..4b044f1 100644
--- a/gst/geometrictransform/gstsquare.c
+++ b/gst/geometrictransform/gstsquare.c
@@ -41,6 +41,20 @@
  * Boston, MA 02110-1301, USA.
  */
 
+/**
+ * SECTION:element-square
+ * @see_also: geometrictransform
+ *
+ * The square element distorts the center part of the image into a square.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 -v videotestsrc ! square zoom=100 ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
+
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
 #endif
@@ -157,12 +171,12 @@
   /* zoom at the center, smoothstep around half quadrant and get back to normal */
   norm_x *=
       (1.0 / square->zoom) * (1.0 + (square->zoom -
-          1.0) * smoothstep (square->width - 0.125, square->width + 0.125,
-          ABS (norm_x)));
+          1.0) * gst_gm_smoothstep (square->width - 0.125,
+          square->width + 0.125, ABS (norm_x)));
   norm_y *=
       (1.0 / square->zoom) * (1.0 + (square->zoom -
-          1.0) * smoothstep (square->height - 0.125, square->height + 0.125,
-          ABS (norm_y)));
+          1.0) * gst_gm_smoothstep (square->height - 0.125,
+          square->height + 0.125, ABS (norm_y)));
 
   /* unnormalize */
   *in_x = 0.5 * (norm_x + 1.0) * width;
diff --git a/gst/geometrictransform/gststretch.c b/gst/geometrictransform/gststretch.c
index f9b3344..61eed37 100644
--- a/gst/geometrictransform/gststretch.c
+++ b/gst/geometrictransform/gststretch.c
@@ -41,6 +41,20 @@
  * Boston, MA 02110-1301, USA.
  */
 
+/**
+ * SECTION:element-stretch
+ * @see_also: geometrictransform
+ *
+ * The stretch element stretches the image in a circle around the center point.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 -v videotestsrc ! stretch ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
+
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
 #endif
@@ -145,8 +159,8 @@
   a = 1.0 + (MAX_SHRINK_AMOUNT - 1.0) * stretch->intensity;
   b = a - 1.0;
 
-  norm_x *= a - b * smoothstep (0.0, cgt->radius, r);
-  norm_y *= a - b * smoothstep (0.0, cgt->radius, r);
+  norm_x *= a - b * gst_gm_smoothstep (0.0, cgt->radius, r);
+  norm_y *= a - b * gst_gm_smoothstep (0.0, cgt->radius, r);
 
   /* unnormalize */
   *in_x = (0.5 * norm_x + cgt->x_center) * width;
diff --git a/gst/geometrictransform/gsttunnel.c b/gst/geometrictransform/gsttunnel.c
index a71f0ef..94b6070 100644
--- a/gst/geometrictransform/gsttunnel.c
+++ b/gst/geometrictransform/gsttunnel.c
@@ -41,6 +41,21 @@
  * Boston, MA 02110-1301, USA.
  */
 
+/**
+ * SECTION:element-tunnel
+ * @see_also: geometrictransform
+ *
+ * Tunnel is a geometric image transform element. It applies a light tunnel
+ * effect.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 -v videotestsrc ! tunnel ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
+
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
 #endif
diff --git a/gst/geometrictransform/gsttwirl.c b/gst/geometrictransform/gsttwirl.c
index 33222c8..962d3ba 100644
--- a/gst/geometrictransform/gsttwirl.c
+++ b/gst/geometrictransform/gsttwirl.c
@@ -47,6 +47,19 @@
  * his code.
  */
 
+/**
+ * SECTION:element-twirl
+ * @see_also: geometrictransform
+ *
+ * The twirl element twists the image from the center out.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 -v videotestsrc ! twirl ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
 
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
diff --git a/gst/geometrictransform/gstwaterripple.c b/gst/geometrictransform/gstwaterripple.c
index 4daff2a..96af6e8 100644
--- a/gst/geometrictransform/gstwaterripple.c
+++ b/gst/geometrictransform/gstwaterripple.c
@@ -47,6 +47,19 @@
  * his code.
  */
 
+/**
+ * SECTION:element-waterripple
+ * @see_also: geometrictransform
+ *
+ * The waterripple element creates a water ripple effect on the image.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 -v videotestsrc ! waterripple ! videoconvert ! autovideosink
+ * ]|
+ * </refsect2>
+ */
 
 #ifdef HAVE_CONFIG_H
 #  include <config.h>
diff --git a/gst/hdvparse/Makefile.in b/gst/hdvparse/Makefile.in
index 2072b90..3bd46c6 100644
--- a/gst/hdvparse/Makefile.in
+++ b/gst/hdvparse/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/id3tag/Makefile.in b/gst/id3tag/Makefile.in
index bdb12d2..6e0ddee 100644
--- a/gst/id3tag/Makefile.in
+++ b/gst/id3tag/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/id3tag/gstid3mux.c b/gst/id3tag/gstid3mux.c
index 89a8127..6417538 100644
--- a/gst/id3tag/gstid3mux.c
+++ b/gst/id3tag/gstid3mux.c
@@ -37,12 +37,12 @@
  * <refsect2>
  * <title>Example pipelines</title>
  * |[
- * gst-launch -v filesrc location=foo.ogg ! decodebin ! audioconvert ! lame ! id3mux ! filesink location=foo.mp3
+ * gst-launch-1.0 -v filesrc location=foo.ogg ! decodebin ! audioconvert ! id3mux ! filesink location=foo.mp3
  * ]| A pipeline that transcodes a file from Ogg/Vorbis to mp3 format with
  * ID3 tags that contain the same metadata as the the Ogg/Vorbis file.
  * Make sure the Ogg/Vorbis file actually has comments to preserve.
  * |[
- * gst-launch -m filesrc location=foo.mp3 ! id3demux ! fakesink silent=TRUE 2&gt; /dev/null | grep taglist
+ * gst-launch-1.0 -m filesrc location=foo.mp3 ! id3demux ! fakesink silent=TRUE
  * ]| Verify that tags have been written.
  * </refsect2>
  */
diff --git a/gst/id3tag/id3tag.c b/gst/id3tag/id3tag.c
index c12a77c..3a602d1 100644
--- a/gst/id3tag/id3tag.c
+++ b/gst/id3tag/id3tag.c
@@ -462,7 +462,58 @@
   g_free (strings);
 }
 
-/* FIXME: id3v2-private frames need to be extracted as samples */
+static void
+add_private_data_tag (GstId3v2Tag * id3v2tag, const GstTagList * list,
+    const gchar * tag, guint num_tags, const gchar * frame_id)
+{
+  gint n;
+
+  for (n = 0; n < num_tags; ++n) {
+    GstId3v2Frame frame;
+    GstSample *sample = NULL;
+    const GstStructure *structure = NULL;
+    GstBuffer *binary = NULL;
+    GstBuffer *priv_frame = NULL;
+    const gchar *owner_str = NULL;
+    guint owner_len = 0;
+    GstMapInfo mapinfo;
+
+    if (!gst_tag_list_get_sample_index (list, tag, n, &sample))
+      continue;
+
+    structure = gst_sample_get_info (sample);
+    if (structure != NULL
+        && !strcmp (gst_structure_get_name (structure), "ID3PrivateFrame")) {
+      owner_str = gst_structure_get_string (structure, "owner");
+
+      if (owner_str != NULL) {
+        owner_len = strlen (owner_str) + 1;
+        priv_frame = gst_buffer_new_and_alloc (owner_len);
+        gst_buffer_fill (priv_frame, 0, owner_str, owner_len);
+
+        binary = gst_buffer_ref (gst_sample_get_buffer (sample));
+        priv_frame = gst_buffer_append (priv_frame, binary);
+
+        id3v2_frame_init (&frame, frame_id, 0);
+
+        if (gst_buffer_map (priv_frame, &mapinfo, GST_MAP_READ)) {
+          id3v2_frame_write_bytes (&frame, mapinfo.data, mapinfo.size);
+          g_array_append_val (id3v2tag->frames, frame);
+          gst_buffer_unmap (priv_frame, &mapinfo);
+        } else {
+          GST_WARNING ("Couldn't map priv frame tag buffer");
+          id3v2_frame_unset (&frame);
+        }
+
+        gst_buffer_unref (priv_frame);
+        gst_sample_unref (sample);
+      }
+    } else {
+      GST_WARNING ("Couldn't find ID3PrivateFrame structure");
+    }
+  }
+}
+
 static void
 add_id3v2frame_tag (GstId3v2Tag * id3v2tag, const GstTagList * list,
     const gchar * tag, guint num_tags, const gchar * unused)
@@ -1095,6 +1146,7 @@
   GST_TAG_MUSICAL_KEY, add_text_tag, "TKEY"}, {
 
     /* Private frames */
+  GST_TAG_PRIVATE_DATA, add_private_data_tag, "PRIV"}, {
   GST_ID3_DEMUX_TAG_ID3V2_FRAME, add_id3v2frame_tag, NULL}, {
 
     /* Track and album numbers */
diff --git a/gst/inter/Makefile.in b/gst/inter/Makefile.in
index 9b89b37..e2b9c6c 100644
--- a/gst/inter/Makefile.in
+++ b/gst/inter/Makefile.in
@@ -291,6 +291,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -328,6 +330,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -355,6 +359,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -373,6 +379,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -383,6 +391,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -408,6 +418,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -433,6 +445,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -564,6 +578,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -621,8 +637,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -692,6 +712,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/inter/gstinteraudiosink.c b/gst/inter/gstinteraudiosink.c
index 58e7832..261ed25 100644
--- a/gst/inter/gstinteraudiosink.c
+++ b/gst/inter/gstinteraudiosink.c
@@ -26,10 +26,10 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v audiotestsrc ! queue ! interaudiosink
+ * gst-launch-1.0 -v audiotestsrc ! queue ! interaudiosink
  * ]|
  *
- * The interaudiosink element cannot be used effectively with gst-launch,
+ * The interaudiosink element cannot be used effectively with gst-launch-1.0,
  * as it requires a second pipeline in the application to receive the
  * audio.
  * See the gstintertest.c example in the gst-plugins-bad source code for
diff --git a/gst/inter/gstinteraudiosrc.c b/gst/inter/gstinteraudiosrc.c
index 2eeff65..1d4b68b 100644
--- a/gst/inter/gstinteraudiosrc.c
+++ b/gst/inter/gstinteraudiosrc.c
@@ -25,10 +25,10 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v interaudiosrc ! queue ! audiosink
+ * gst-launch-1.0 -v interaudiosrc ! queue ! autoaudiosink
  * ]|
  * 
- * The interaudiosrc element cannot be used effectively with gst-launch,
+ * The interaudiosrc element cannot be used effectively with gst-launch-1.0,
  * as it requires a second pipeline in the application to send audio.
  * See the gstintertest.c example in the gst-plugins-bad source code for
  * more details.
diff --git a/gst/inter/gstintersubsink.c b/gst/inter/gstintersubsink.c
index b907c0a..77bc484 100644
--- a/gst/inter/gstintersubsink.c
+++ b/gst/inter/gstintersubsink.c
@@ -25,10 +25,10 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v ... ! intersubsink
+ * gst-launch-1.0 -v ... ! intersubsink
  * ]|
  * 
- * The intersubsink element cannot be used effectively with gst-launch,
+ * The intersubsink element cannot be used effectively with gst-launch-1.0,
  * as it requires a second pipeline in the application to send audio.
  * See the gstintertest.c example in the gst-plugins-bad source code for
  * more details.
diff --git a/gst/inter/gstintersubsrc.c b/gst/inter/gstintersubsrc.c
index 24efc9f..482a20f 100644
--- a/gst/inter/gstintersubsrc.c
+++ b/gst/inter/gstintersubsrc.c
@@ -26,10 +26,10 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v intersubsrc ! kateenc ! oggmux ! filesink location=out.ogv
+ * gst-launch-1.0 -v intersubsrc ! kateenc ! oggmux ! filesink location=out.ogv
  * ]|
  * 
- * The intersubsrc element cannot be used effectively with gst-launch,
+ * The intersubsrc element cannot be used effectively with gst-launch-1.0,
  * as it requires a second pipeline in the application to send subtitles.
  * See the gstintertest.c example in the gst-plugins-bad source code for
  * more details.
diff --git a/gst/inter/gstintertest.c b/gst/inter/gstintertest.c
index cff4f0d..3b1abdb 100644
--- a/gst/inter/gstintertest.c
+++ b/gst/inter/gstintertest.c
@@ -85,6 +85,8 @@
   g_option_context_add_group (context, gst_init_get_option_group ());
   if (!g_option_context_parse (context, &argc, &argv, &error)) {
     g_print ("option parsing failed: %s\n", error->message);
+    g_option_context_free (context);
+    g_clear_error (&error);
     exit (1);
   }
   g_option_context_free (context);
@@ -199,6 +201,7 @@
   if (error) {
     g_print ("pipeline parsing error: %s\n", error->message);
     gst_object_unref (pipeline);
+    g_clear_error (&error);
     return;
   }
 
@@ -236,6 +239,7 @@
   if (error) {
     g_print ("pipeline parsing error: %s\n", error->message);
     gst_object_unref (pipeline);
+    g_clear_error (&error);
     return;
   }
 
@@ -352,7 +356,7 @@
 
       gst_message_parse_error (message, &error, &debug);
       gst_inter_test_handle_error (intertest, error, debug);
-      g_error_free (error);
+      g_clear_error (&error);
       g_free (debug);
     }
       break;
@@ -363,7 +367,7 @@
 
       gst_message_parse_warning (message, &error, &debug);
       gst_inter_test_handle_warning (intertest, error, debug);
-      g_error_free (error);
+      g_clear_error (&error);
       g_free (debug);
     }
       break;
@@ -374,7 +378,7 @@
 
       gst_message_parse_info (message, &error, &debug);
       gst_inter_test_handle_info (intertest, error, debug);
-      g_error_free (error);
+      g_clear_error (&error);
       g_free (debug);
     }
       break;
diff --git a/gst/inter/gstintervideosink.c b/gst/inter/gstintervideosink.c
index aebce28..ca357d6 100644
--- a/gst/inter/gstintervideosink.c
+++ b/gst/inter/gstintervideosink.c
@@ -26,10 +26,10 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v videotestsrc ! intervideosink
+ * gst-launch-1.0 -v videotestsrc ! intervideosink
  * ]|
  * 
- * The intervideosink element cannot be used effectively with gst-launch,
+ * The intervideosink element cannot be used effectively with gst-launch-1.0,
  * as it requires a second pipeline in the application to send video to.
  * See the gstintertest.c example in the gst-plugins-bad source code for
  * more details.
diff --git a/gst/inter/gstintervideosrc.c b/gst/inter/gstintervideosrc.c
index 6553ed1..8cab648 100644
--- a/gst/inter/gstintervideosrc.c
+++ b/gst/inter/gstintervideosrc.c
@@ -26,10 +26,10 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v intervideosrc ! queue ! xvimagesink
+ * gst-launch-1.0 -v intervideosrc ! queue ! xvimagesink
  * ]|
  * 
- * The intersubsrc element cannot be used effectively with gst-launch,
+ * The intersubsrc element cannot be used effectively with gst-launch-1.0,
  * as it requires a second pipeline in the application to send subtitles.
  * </refsect2>
  */
diff --git a/gst/interlace/Makefile.in b/gst/interlace/Makefile.in
index 356b5a6..4fd3cb2 100644
--- a/gst/interlace/Makefile.in
+++ b/gst/interlace/Makefile.in
@@ -271,6 +271,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -308,6 +310,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -335,6 +339,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -353,6 +359,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -363,6 +371,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -388,6 +398,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -413,6 +425,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -544,6 +558,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -601,8 +617,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -672,6 +692,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/interlace/gstinterlace.c b/gst/interlace/gstinterlace.c
index 6cd369b..269a847 100644
--- a/gst/interlace/gstinterlace.c
+++ b/gst/interlace/gstinterlace.c
@@ -28,23 +28,23 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v videotestsrc pattern=ball ! interlace ! xvimagesink
+ * gst-launch-1.0 -v videotestsrc pattern=ball ! interlace ! xvimagesink
  * ]|
  * This pipeline illustrates the combing effects caused by displaying
  * two interlaced fields as one progressive frame.
  * |[
- * gst-launch -v filesrc location=/path/to/file ! decodebin ! videorate !
+ * gst-launch-1.0 -v filesrc location=/path/to/file ! decodebin ! videorate !
  *   videoscale ! video/x-raw,format=\(string\)I420,width=720,height=480,
  *   framerate=60000/1001,pixel-aspect-ratio=11/10 ! 
- *   interlace top-field-first=false ! ...
+ *   interlace top-field-first=false ! autovideosink
  * ]|
  * This pipeline converts a progressive video stream into an interlaced
  * stream suitable for standard definition NTSC.
  * |[
- * gst-launch -v videotestsrc pattern=ball ! video/x-raw,
+ * gst-launch-1.0 -v videotestsrc pattern=ball ! video/x-raw,
  *   format=\(string\)I420,width=720,height=480,framerate=24000/1001,
- *   pixel-aspect-ratio=11/10 ! interlace pattern=2:3 !
- *   ...
+ *   pixel-aspect-ratio=11/10 ! interlace !
+ *   autovideosink
  * ]|
  * This pipeline converts a 24 frames per second progressive film stream into a
  * 30000/1001 2:3:2:3... pattern telecined stream suitable for displaying film
diff --git a/gst/ivfparse/Makefile.in b/gst/ivfparse/Makefile.in
index 4f4080f..fb0e17d 100644
--- a/gst/ivfparse/Makefile.in
+++ b/gst/ivfparse/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/ivfparse/gstivfparse.c b/gst/ivfparse/gstivfparse.c
index 4e3ea8b..bea1e19 100644
--- a/gst/ivfparse/gstivfparse.c
+++ b/gst/ivfparse/gstivfparse.c
@@ -331,15 +331,20 @@
 
     /* Detect resolution changes on key frames */
     if (gst_buffer_map (frame->out_buffer, &map, GST_MAP_READ)) {
-      guint32 frame_tag, width, height;
+      guint32 width, height;
 
-      frame_tag = GST_READ_UINT24_LE (map.data);
-      if (!(frame_tag & 0x01) && map.size >= 10) {      /* key frame */
-        GST_DEBUG_OBJECT (ivf, "key frame detected");
+      if (ivf->fourcc == GST_MAKE_FOURCC ('V', 'P', '8', '0')) {
+        guint32 frame_tag;
+        frame_tag = GST_READ_UINT24_LE (map.data);
+        if (!(frame_tag & 0x01) && map.size >= 10) {    /* key frame */
+          GST_DEBUG_OBJECT (ivf, "key frame detected");
 
-        width = GST_READ_UINT16_LE (map.data + 6) & 0x3fff;
-        height = GST_READ_UINT16_LE (map.data + 8) & 0x3fff;
-        gst_ivf_parse_set_size (ivf, width, height);
+          width = GST_READ_UINT16_LE (map.data + 6) & 0x3fff;
+          height = GST_READ_UINT16_LE (map.data + 8) & 0x3fff;
+          gst_ivf_parse_set_size (ivf, width, height);
+        }
+      } else {
+        /* Fixme: Add vp9 frame header parsing? */
       }
       gst_buffer_unmap (frame->out_buffer, &map);
     }
diff --git a/gst/ivtc/Makefile.in b/gst/ivtc/Makefile.in
index 1bbbc37..4027f80 100644
--- a/gst/ivtc/Makefile.in
+++ b/gst/ivtc/Makefile.in
@@ -272,6 +272,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -309,6 +311,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -336,6 +340,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -354,6 +360,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -364,6 +372,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -389,6 +399,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -414,6 +426,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -545,6 +559,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -602,8 +618,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -673,6 +693,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/ivtc/gstcombdetect.c b/gst/ivtc/gstcombdetect.c
index f69e656..2356b96 100644
--- a/gst/ivtc/gstcombdetect.c
+++ b/gst/ivtc/gstcombdetect.c
@@ -26,7 +26,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v filesrc location=file.mov ! decodebin ! combdetect !
+ * gst-launch-1.0 -v filesrc location=file.mov ! decodebin ! combdetect !
  *     xvimagesink
  * ]|
  * </refsect2>
@@ -153,8 +153,8 @@
       GstStructure *structure = gst_caps_get_structure (othercaps, i);
       gst_structure_set_value (structure, "interlace-mode", &value);
     }
-    g_value_reset (&value);
-    g_value_reset (&v);
+    g_value_unset (&value);
+    g_value_unset (&v);
   } else {
     for (i = 0; i < gst_caps_get_size (othercaps); i++) {
       GstStructure *structure = gst_caps_get_structure (othercaps, i);
diff --git a/gst/ivtc/gstivtc.c b/gst/ivtc/gstivtc.c
index 02f382b..6dd0c8d 100644
--- a/gst/ivtc/gstivtc.c
+++ b/gst/ivtc/gstivtc.c
@@ -27,8 +27,8 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v videotestsrc pattern=ball ! video/x-raw,framerate=24/1 !
- *     interlace field-pattern=3:2 !
+ * gst-launch-1.0 -v videotestsrc pattern=ball ! video/x-raw,framerate=24/1 !
+ *     interlace !
  *     ivtc ! video/x-raw,framerate=24/1 ! fakesink
  * ]|
  *
@@ -169,8 +169,8 @@
       gst_structure_set_value (structure, "interlace-mode", &value);
       gst_structure_remove_field (structure, "framerate");
     }
-    g_value_reset (&value);
-    g_value_reset (&v);
+    g_value_unset (&value);
+    g_value_unset (&v);
   } else {
     for (i = 0; i < gst_caps_get_size (othercaps); i++) {
       GstStructure *structure = gst_caps_get_structure (othercaps, i);
diff --git a/gst/jp2kdecimator/Makefile.in b/gst/jp2kdecimator/Makefile.in
index 05d6073..637eafa 100644
--- a/gst/jp2kdecimator/Makefile.in
+++ b/gst/jp2kdecimator/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/jp2kdecimator/gstjp2kdecimator.c b/gst/jp2kdecimator/gstjp2kdecimator.c
index 78c1fd4..cb95cc0 100644
--- a/gst/jp2kdecimator/gstjp2kdecimator.c
+++ b/gst/jp2kdecimator/gstjp2kdecimator.c
@@ -25,7 +25,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v videotestsrc num-buffers=1 ! jp2kenc ! \
+ * gst-launch-1.0 -v videotestsrc num-buffers=1 ! jp2kenc ! \
  *   gstjp2kdecimator max-decomposition-levels=2 ! jp2kdec ! \
  *   videoconvert ! autovideosink
  * ]|
diff --git a/gst/jpegformat/Makefile.in b/gst/jpegformat/Makefile.in
index ac620fb..946a9f2 100644
--- a/gst/jpegformat/Makefile.in
+++ b/gst/jpegformat/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/jpegformat/gstjifmux.c b/gst/jpegformat/gstjifmux.c
index 719067a..3a6b6fd 100644
--- a/gst/jpegformat/gstjifmux.c
+++ b/gst/jpegformat/gstjifmux.c
@@ -31,7 +31,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v videotestsrc num-buffers=1 ! jpegenc ! jifmux ! filesink location=...
+ * gst-launch-1.0 -v videotestsrc num-buffers=1 ! jpegenc ! jifmux ! filesink location=...
  * ]|
  * The above pipeline renders a frame, encodes to jpeg, adds metadata and writes
  * it to disk.
@@ -46,8 +46,8 @@
 file trailer: EOI
 
 tests:
-gst-launch videotestsrc num-buffers=1 ! jpegenc ! jifmux ! filesink location=test1.jpeg
-gst-launch videotestsrc num-buffers=1 ! jpegenc ! taginject tags="comment=\"test image\"" ! jifmux ! filesink location=test2.jpeg
+gst-launch-1.0 videotestsrc num-buffers=1 ! jpegenc ! jifmux ! filesink location=test1.jpeg
+gst-launch-1.0 videotestsrc num-buffers=1 ! jpegenc ! taginject tags="comment=test image" ! jifmux ! filesink location=test2.jpeg
 */
 
 #ifdef HAVE_CONFIG_H
diff --git a/gst/jpegformat/gstjpegparse.c b/gst/jpegformat/gstjpegparse.c
index d55b84f..77e53a6 100644
--- a/gst/jpegformat/gstjpegparse.c
+++ b/gst/jpegformat/gstjpegparse.c
@@ -33,7 +33,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v souphttpsrc location=... ! jpegparse ! matroskamux ! filesink location=...
+ * gst-launch-1.0 -v souphttpsrc location=... ! jpegparse ! matroskamux ! filesink location=...
  * ]|
  * The above pipeline fetches a motion JPEG stream from an IP camera over
  * HTTP and stores it in a matroska file.
diff --git a/gst/librfb/Makefile.in b/gst/librfb/Makefile.in
index 38a1ab9..1d8527c 100644
--- a/gst/librfb/Makefile.in
+++ b/gst/librfb/Makefile.in
@@ -284,6 +284,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -321,6 +323,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -348,6 +352,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -366,6 +372,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -376,6 +384,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -401,6 +411,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -426,6 +438,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -557,6 +571,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -614,8 +630,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -685,6 +705,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/librfb/rfbdecoder.c b/gst/librfb/rfbdecoder.c
index 88f3b03..bd225ad 100644
--- a/gst/librfb/rfbdecoder.c
+++ b/gst/librfb/rfbdecoder.c
@@ -89,8 +89,7 @@
 
   g_clear_error (&decoder->error);
 
-  if (decoder->data)
-    g_free (decoder->data);
+  g_free (decoder->data);
 
   g_free (decoder);
 }
@@ -234,8 +233,7 @@
   g_return_val_if_fail (len > 0, NULL);
 
   if (G_UNLIKELY (len > decoder->data_len)) {
-    if (decoder->data)
-      g_free (decoder->data);
+    g_free (decoder->data);
     decoder->data = g_malloc (len);
     decoder->data_len = len;
   }
diff --git a/gst/liveadder/Makefile.am b/gst/liveadder/Makefile.am
deleted file mode 100644
index e6f5d44..0000000
--- a/gst/liveadder/Makefile.am
+++ /dev/null
@@ -1,11 +0,0 @@
-plugin_LTLIBRARIES = libgstliveadder.la
-
-libgstliveadder_la_SOURCES = liveadder.c
-libgstliveadder_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
-libgstliveadder_la_LIBADD = \
-	$(GST_PLUGINS_BASE_LIBS) -lgstaudio-@GST_API_VERSION@ \
-	$(GST_BASE_LIBS) $(GST_LIBS)
-libgstliveadder_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libgstliveadder_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
-
-noinst_HEADERS = liveadder.h
diff --git a/gst/liveadder/liveadder.c b/gst/liveadder/liveadder.c
deleted file mode 100644
index a660419..0000000
--- a/gst/liveadder/liveadder.c
+++ /dev/null
@@ -1,1538 +0,0 @@
-/*
- * GStreamer
- *
- *  Copyright 2012 Collabora Ltd
- *  Copyright 2008 Nokia Corporation
- *   @author: Olivier Crete <olivier.crete@collabora.co.uk>
- *
- * With parts copied from the adder plugin which is
- * Copyright (C) 1999,2000 Erik Walthinsen <omega@cse.ogi.edu>
- *                    2001 Thomas <thomas@apestaart.org>
- *               2005,2006 Wim Taymans <wim@fluendo.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
- *
- */
-/**
- * SECTION:element-liveadder
- * @see_also: adder
- *
- * The live adder allows to mix several streams into one by adding the data.
- * Mixed data is clamped to the min/max values of the data format.
- *
- * Unlike the adder, the liveadder mixes the streams according the their
- * timestamps and waits for some milli-seconds before trying doing the mixing.
- */
-
-#ifdef HAVE_CONFIG_H
-#include "config.h"
-#endif
-
-#include "liveadder.h"
-
-#include <gst/audio/audio.h>
-
-#include <string.h>
-
-#define DEFAULT_LATENCY_MS 60
-
-GST_DEBUG_CATEGORY_STATIC (live_adder_debug);
-#define GST_CAT_DEFAULT (live_adder_debug)
-
-static GstStaticPadTemplate gst_live_adder_sink_template =
-GST_STATIC_PAD_TEMPLATE ("sink_%u",
-    GST_PAD_SINK,
-    GST_PAD_REQUEST,
-    GST_STATIC_CAPS (GST_AUDIO_CAPS_MAKE ("{ S8, U8, "
-            GST_AUDIO_NE (S16) "," GST_AUDIO_NE (U16) ","
-            GST_AUDIO_NE (S32) "," GST_AUDIO_NE (U32) ","
-            GST_AUDIO_NE (F32) "," GST_AUDIO_NE (F64) "}"))
-    );
-
-static GstStaticPadTemplate gst_live_adder_src_template =
-GST_STATIC_PAD_TEMPLATE ("src",
-    GST_PAD_SRC,
-    GST_PAD_ALWAYS,
-    GST_STATIC_CAPS (GST_AUDIO_CAPS_MAKE ("{ S8, U8, "
-            GST_AUDIO_NE (S16) "," GST_AUDIO_NE (U16) ","
-            GST_AUDIO_NE (S32) "," GST_AUDIO_NE (U32) ","
-            GST_AUDIO_NE (F32) "," GST_AUDIO_NE (F64) "}"))
-    );
-
-/* Valve signals and args */
-enum
-{
-  /* FILL ME */
-  LAST_SIGNAL
-};
-
-enum
-{
-  PROP_0,
-  PROP_LATENCY,
-};
-
-typedef struct _GstLiveAdderPadPrivate
-{
-  GstSegment segment;
-  gboolean eos;
-
-  GstClockTime expected_timestamp;
-
-} GstLiveAdderPadPrivate;
-
-G_DEFINE_TYPE (GstLiveAdder, gst_live_adder, GST_TYPE_ELEMENT);
-
-static void gst_live_adder_finalize (GObject * object);
-static void
-gst_live_adder_set_property (GObject * object,
-    guint prop_id, const GValue * value, GParamSpec * pspec);
-static void
-gst_live_adder_get_property (GObject * object,
-    guint prop_id, GValue * value, GParamSpec * pspec);
-
-static GstPad *gst_live_adder_request_new_pad (GstElement * element,
-    GstPadTemplate * templ, const gchar * name, const GstCaps * caps);
-static void gst_live_adder_release_pad (GstElement * element, GstPad * pad);
-static GstStateChangeReturn
-gst_live_adder_change_state (GstElement * element, GstStateChange transition);
-
-static gboolean gst_live_adder_setcaps (GstLiveAdder * adder, GstPad * pad,
-    GstCaps * caps);
-static GstCaps *gst_live_adder_sink_getcaps (GstLiveAdder * adder, GstPad * pad,
-    GstCaps * filter);
-static gboolean gst_live_adder_src_activate_mode (GstPad * pad,
-    GstObject * parent, GstPadMode mode, gboolean active);
-static gboolean gst_live_adder_src_event (GstPad * pad, GstObject * parent,
-    GstEvent * event);
-
-static void gst_live_adder_loop (gpointer data);
-static gboolean gst_live_adder_src_query (GstPad * pad, GstObject * parent,
-    GstQuery * query);
-static gboolean gst_live_adder_sink_query (GstPad * pad, GstObject * parent,
-    GstQuery * query);
-static gboolean gst_live_adder_sink_event (GstPad * pad, GstObject * parent,
-    GstEvent * event);
-
-
-static void reset_pad_private (GstPad * pad);
-
-/* clipping versions */
-#define MAKE_FUNC(name,type,ttype,min,max)                      \
-static void name (type *out, type *in, gint bytes) {            \
-  gint i;                                                       \
-  for (i = 0; i < bytes / sizeof (type); i++)                   \
-    out[i] = CLAMP ((ttype)out[i] + (ttype)in[i], min, max);    \
-}
-
-/* non-clipping versions (for float) */
-#define MAKE_FUNC_NC(name,type,ttype)                           \
-static void name (type *out, type *in, gint bytes) {            \
-  gint i;                                                       \
-  for (i = 0; i < bytes / sizeof (type); i++)                   \
-    out[i] = (ttype)out[i] + (ttype)in[i];                      \
-}
-
-/* *INDENT-OFF* */
-MAKE_FUNC (add_int32, gint32, gint64, G_MININT32, G_MAXINT32)
-MAKE_FUNC (add_int16, gint16, gint32, G_MININT16, G_MAXINT16)
-MAKE_FUNC (add_int8, gint8, gint16, G_MININT8, G_MAXINT8)
-MAKE_FUNC (add_uint32, guint32, guint64, 0, G_MAXUINT32)
-MAKE_FUNC (add_uint16, guint16, guint32, 0, G_MAXUINT16)
-MAKE_FUNC (add_uint8, guint8, guint16, 0, G_MAXUINT8)
-MAKE_FUNC_NC (add_float64, gdouble, gdouble)
-MAKE_FUNC_NC (add_float32, gfloat, gfloat)
-/* *INDENT-ON* */
-
-
-static void
-gst_live_adder_class_init (GstLiveAdderClass * klass)
-{
-  GObjectClass *gobject_class = (GObjectClass *) klass;
-  GstElementClass *gstelement_class = (GstElementClass *) klass;
-
-  GST_DEBUG_CATEGORY_INIT (live_adder_debug, "liveadder", 0, "Live Adder");
-
-  gst_element_class_add_pad_template (gstelement_class,
-      gst_static_pad_template_get (&gst_live_adder_src_template));
-  gst_element_class_add_pad_template (gstelement_class,
-      gst_static_pad_template_get (&gst_live_adder_sink_template));
-  gst_element_class_set_static_metadata (gstelement_class, "Live Adder element",
-      "Generic/Audio",
-      "Mixes live/discontinuous audio streams",
-      "Olivier Crete <olivier.crete@collabora.co.uk>");
-
-  gobject_class->finalize = gst_live_adder_finalize;
-  gobject_class->set_property = gst_live_adder_set_property;
-  gobject_class->get_property = gst_live_adder_get_property;
-
-  gstelement_class->request_new_pad = gst_live_adder_request_new_pad;
-  gstelement_class->release_pad = gst_live_adder_release_pad;
-  gstelement_class->change_state = gst_live_adder_change_state;
-
-  g_object_class_install_property (gobject_class, PROP_LATENCY,
-      g_param_spec_uint ("latency", "Buffering latency",
-          "Amount of data to buffer (in milliseconds)",
-          0, G_MAXUINT, DEFAULT_LATENCY_MS,
-          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
-}
-
-static void
-gst_live_adder_init (GstLiveAdder * adder)
-{
-  adder->srcpad =
-      gst_pad_new_from_static_template (&gst_live_adder_src_template, "src");
-  gst_pad_set_query_function (adder->srcpad,
-      GST_DEBUG_FUNCPTR (gst_live_adder_src_query));
-  gst_pad_set_event_function (adder->srcpad,
-      GST_DEBUG_FUNCPTR (gst_live_adder_src_event));
-  gst_pad_set_activatemode_function (adder->srcpad,
-      GST_DEBUG_FUNCPTR (gst_live_adder_src_activate_mode));
-  gst_element_add_pad (GST_ELEMENT (adder), adder->srcpad);
-
-  adder->padcount = 0;
-  adder->func = NULL;
-  g_cond_init (&adder->not_empty_cond);
-
-  adder->next_timestamp = GST_CLOCK_TIME_NONE;
-
-  adder->latency_ms = DEFAULT_LATENCY_MS;
-
-  adder->buffers = g_queue_new ();
-}
-
-
-static void
-gst_live_adder_finalize (GObject * object)
-{
-  GstLiveAdder *adder = GST_LIVE_ADDER (object);
-
-  g_cond_clear (&adder->not_empty_cond);
-
-  g_queue_foreach (adder->buffers, (GFunc) gst_mini_object_unref, NULL);
-  while (g_queue_pop_head (adder->buffers)) {
-  }
-  g_queue_free (adder->buffers);
-
-  g_list_free (adder->sinkpads);
-
-  G_OBJECT_CLASS (gst_live_adder_parent_class)->finalize (object);
-}
-
-
-static void
-gst_live_adder_set_property (GObject * object,
-    guint prop_id, const GValue * value, GParamSpec * pspec)
-{
-  GstLiveAdder *adder = GST_LIVE_ADDER (object);
-
-  switch (prop_id) {
-    case PROP_LATENCY:
-    {
-      guint64 new_latency, old_latency;
-
-      new_latency = g_value_get_uint (value);
-
-      GST_OBJECT_LOCK (adder);
-      old_latency = adder->latency_ms;
-      adder->latency_ms = new_latency;
-      GST_OBJECT_UNLOCK (adder);
-
-      /* post message if latency changed, this will inform the parent pipeline
-       * that a latency reconfiguration is possible/needed. */
-      if (new_latency != old_latency) {
-        GST_DEBUG_OBJECT (adder, "latency changed to: %" GST_TIME_FORMAT,
-            GST_TIME_ARGS (new_latency));
-
-        gst_element_post_message (GST_ELEMENT_CAST (adder),
-            gst_message_new_latency (GST_OBJECT_CAST (adder)));
-      }
-      break;
-    }
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-      break;
-  }
-}
-
-
-static void
-gst_live_adder_get_property (GObject * object,
-    guint prop_id, GValue * value, GParamSpec * pspec)
-{
-  GstLiveAdder *adder = GST_LIVE_ADDER (object);
-
-  switch (prop_id) {
-    case PROP_LATENCY:
-      GST_OBJECT_LOCK (adder);
-      g_value_set_uint (value, adder->latency_ms);
-      GST_OBJECT_UNLOCK (adder);
-      break;
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-      break;
-  }
-}
-
-
-/* we can only accept caps that we and downstream can handle. */
-static GstCaps *
-gst_live_adder_sink_getcaps (GstLiveAdder * adder, GstPad * pad,
-    GstCaps * filter)
-{
-  GstCaps *result, *peercaps, *sinkcaps;
-
-  /* get the downstream possible caps */
-  peercaps = gst_pad_peer_query_caps (adder->srcpad, filter);
-  /* get the allowed caps on this sinkpad, we use the fixed caps function so
-   * that it does not call recursively in this function. */
-  sinkcaps = gst_pad_get_current_caps (pad);
-  if (!sinkcaps)
-    sinkcaps = gst_pad_get_pad_template_caps (pad);
-  if (peercaps) {
-    /* if the peer has caps, intersect */
-    GST_DEBUG_OBJECT (adder, "intersecting peer and template caps");
-    result = gst_caps_intersect (peercaps, sinkcaps);
-    gst_caps_unref (sinkcaps);
-    gst_caps_unref (peercaps);
-  } else {
-    /* the peer has no caps (or there is no peer), just use the allowed caps
-     * of this sinkpad. */
-    GST_DEBUG_OBJECT (adder, "no peer caps, using sinkcaps");
-    result = sinkcaps;
-  }
-
-  return result;
-}
-
-struct SetCapsIterCtx
-{
-  GstPad *pad;
-  GstCaps *caps;
-  gboolean all_valid;
-};
-
-static void
-check_other_caps (const GValue * item, gpointer user_data)
-{
-  GstPad *otherpad = GST_PAD (g_value_get_object (item));
-  struct SetCapsIterCtx *ctx = user_data;
-
-  if (otherpad == ctx->pad)
-    return;
-
-  if (!gst_pad_peer_query_accept_caps (otherpad, ctx->caps))
-    ctx->all_valid = FALSE;
-}
-
-static void
-set_other_caps (const GValue * item, gpointer user_data)
-{
-  GstPad *otherpad = GST_PAD (g_value_get_object (item));
-  struct SetCapsIterCtx *ctx = user_data;
-
-  if (otherpad == ctx->pad)
-    return;
-
-  if (!gst_pad_set_caps (otherpad, ctx->caps))
-    ctx->all_valid = FALSE;
-}
-
-/* the first caps we receive on any of the sinkpads will define the caps for all
- * the other sinkpads because we can only mix streams with the same caps.
- * */
-static gboolean
-gst_live_adder_setcaps (GstLiveAdder * adder, GstPad * pad, GstCaps * caps)
-{
-  GstIterator *iter;
-  struct SetCapsIterCtx ctx;
-
-  GST_LOG_OBJECT (adder, "setting caps on pad %p,%s to %" GST_PTR_FORMAT, pad,
-      GST_PAD_NAME (pad), caps);
-
-  /* FIXME, see if the other pads can accept the format. Also lock the
-   * format on the other pads to this new format. */
-  iter = gst_element_iterate_sink_pads (GST_ELEMENT (adder));
-  ctx.pad = pad;
-  ctx.caps = caps;
-  ctx.all_valid = TRUE;
-  while (gst_iterator_foreach (iter, check_other_caps, &ctx) ==
-      GST_ITERATOR_RESYNC) {
-    ctx.all_valid = TRUE;
-    gst_iterator_resync (iter);
-  }
-  if (!ctx.all_valid) {
-    GST_WARNING_OBJECT (adder, "Caps are not acceptable by other sinkpads");
-    gst_iterator_free (iter);
-    return FALSE;
-  }
-
-  while (gst_iterator_foreach (iter, set_other_caps, &ctx) ==
-      GST_ITERATOR_RESYNC) {
-    ctx.all_valid = TRUE;
-    gst_iterator_resync (iter);
-  }
-  gst_iterator_free (iter);
-
-  if (!ctx.all_valid) {
-    GST_WARNING_OBJECT (adder, "Could not set caps on the other sink pads");
-    return FALSE;
-  }
-
-  if (!gst_pad_set_caps (adder->srcpad, caps)) {
-    GST_WARNING_OBJECT (adder, "Could not set caps downstream");
-    return FALSE;
-  }
-
-  GST_OBJECT_LOCK (adder);
-  /* parse caps now */
-  if (!gst_audio_info_from_caps (&adder->info, caps))
-    goto not_supported;
-
-  if (GST_AUDIO_INFO_IS_INTEGER (&adder->info)) {
-    switch (GST_AUDIO_INFO_WIDTH (&adder->info)) {
-      case 8:
-        adder->func = GST_AUDIO_INFO_IS_SIGNED (&adder->info) ?
-            (GstLiveAdderFunction) add_int8 : (GstLiveAdderFunction) add_uint8;
-        break;
-      case 16:
-        adder->func = GST_AUDIO_INFO_IS_SIGNED (&adder->info) ?
-            (GstLiveAdderFunction) add_int16 : (GstLiveAdderFunction)
-            add_uint16;
-        break;
-      case 32:
-        adder->func = GST_AUDIO_INFO_IS_SIGNED (&adder->info) ?
-            (GstLiveAdderFunction) add_int32 : (GstLiveAdderFunction)
-            add_uint32;
-        break;
-      default:
-        goto not_supported;
-    }
-  } else if (GST_AUDIO_INFO_IS_FLOAT (&adder->info)) {
-    switch (GST_AUDIO_INFO_WIDTH (&adder->info)) {
-      case 32:
-        adder->func = (GstLiveAdderFunction) add_float32;
-        break;
-      case 64:
-        adder->func = (GstLiveAdderFunction) add_float64;
-        break;
-      default:
-        goto not_supported;
-    }
-  } else {
-    goto not_supported;
-  }
-
-  GST_OBJECT_UNLOCK (adder);
-  return TRUE;
-
-  /* ERRORS */
-not_supported:
-  {
-    GST_OBJECT_UNLOCK (adder);
-    GST_DEBUG_OBJECT (adder, "unsupported format set as caps");
-    return FALSE;
-  }
-}
-
-static void
-gst_live_adder_flush_start (GstLiveAdder * adder)
-{
-  GST_DEBUG_OBJECT (adder, "Disabling pop on queue");
-
-  GST_OBJECT_LOCK (adder);
-  /* mark ourselves as flushing */
-  adder->srcresult = GST_FLOW_FLUSHING;
-
-  /* Empty the queue */
-  g_queue_foreach (adder->buffers, (GFunc) gst_mini_object_unref, NULL);
-  while (g_queue_pop_head (adder->buffers));
-
-  /* unlock clock, we just unschedule, the entry will be released by the
-   * locking streaming thread. */
-  if (adder->clock_id)
-    gst_clock_id_unschedule (adder->clock_id);
-
-  g_cond_broadcast (&adder->not_empty_cond);
-  GST_OBJECT_UNLOCK (adder);
-}
-
-static gboolean
-gst_live_adder_src_activate_mode (GstPad * pad, GstObject * parent,
-    GstPadMode mode, gboolean active)
-{
-  GstLiveAdder *adder = GST_LIVE_ADDER (parent);
-  gboolean result = TRUE;
-
-  if (mode == GST_PAD_MODE_PULL)
-    return FALSE;
-
-  if (active) {
-    /* Mark as non flushing */
-    GST_OBJECT_LOCK (adder);
-    adder->srcresult = GST_FLOW_OK;
-    GST_OBJECT_UNLOCK (adder);
-
-    /* start pushing out buffers */
-    GST_DEBUG_OBJECT (adder, "Starting task on srcpad");
-    gst_pad_start_task (adder->srcpad,
-        (GstTaskFunction) gst_live_adder_loop, adder, NULL);
-  } else {
-    /* make sure all data processing stops ASAP */
-    gst_live_adder_flush_start (adder);
-
-    /* NOTE this will hardlock if the state change is called from the src pad
-     * task thread because we will _join() the thread. */
-    GST_DEBUG_OBJECT (adder, "Stopping task on srcpad");
-    result = gst_pad_stop_task (pad);
-  }
-
-  return result;
-}
-
-static gboolean
-gst_live_adder_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
-{
-  GstLiveAdder *adder = GST_LIVE_ADDER (parent);
-  GstLiveAdderPadPrivate *padprivate = NULL;
-  gboolean ret = TRUE;
-
-  padprivate = gst_pad_get_element_private (pad);
-
-  if (!padprivate)
-    return FALSE;
-
-  GST_LOG_OBJECT (adder, "received %s", GST_EVENT_TYPE_NAME (event));
-
-  switch (GST_EVENT_TYPE (event)) {
-    case GST_EVENT_CAPS:
-    {
-      GstCaps *caps;
-
-      gst_event_parse_caps (event, &caps);
-      ret = gst_live_adder_setcaps (adder, pad, caps);
-      gst_event_unref (event);
-      break;
-    }
-    case GST_EVENT_SEGMENT:
-    {
-      const GstSegment *segment;
-      GstSegment livesegment;
-
-      gst_event_parse_segment (event, &segment);
-
-      /* we need time for now */
-      if (segment->format != GST_FORMAT_TIME)
-        goto newseg_wrong_format;
-
-      /* now configure the values, we need these to time the release of the
-       * buffers on the srcpad. */
-      GST_OBJECT_LOCK (adder);
-      gst_segment_copy_into (segment, &padprivate->segment);
-      GST_OBJECT_UNLOCK (adder);
-      gst_event_unref (event);
-
-      gst_segment_init (&livesegment, GST_FORMAT_TIME);
-      gst_pad_push_event (adder->srcpad, gst_event_new_segment (&livesegment));
-      break;
-    }
-    case GST_EVENT_FLUSH_START:
-      gst_live_adder_flush_start (adder);
-      ret = gst_pad_push_event (adder->srcpad, event);
-      break;
-    case GST_EVENT_FLUSH_STOP:
-      GST_OBJECT_LOCK (adder);
-      adder->next_timestamp = GST_CLOCK_TIME_NONE;
-      reset_pad_private (pad);
-      GST_OBJECT_UNLOCK (adder);
-      ret = gst_pad_push_event (adder->srcpad, event);
-      ret &=
-          gst_live_adder_src_activate_mode (adder->srcpad, GST_OBJECT (adder),
-          GST_PAD_MODE_PUSH, TRUE);
-      break;
-    case GST_EVENT_EOS:
-    {
-      GST_OBJECT_LOCK (adder);
-
-      ret = adder->srcresult == GST_FLOW_OK;
-      if (ret && !padprivate->eos) {
-        GST_DEBUG_OBJECT (adder, "queuing EOS");
-        padprivate->eos = TRUE;
-        g_cond_broadcast (&adder->not_empty_cond);
-      } else if (padprivate->eos) {
-        GST_DEBUG_OBJECT (adder, "dropping EOS, we are already EOS");
-      } else {
-        GST_DEBUG_OBJECT (adder, "dropping EOS, reason %s",
-            gst_flow_get_name (adder->srcresult));
-      }
-
-      GST_OBJECT_UNLOCK (adder);
-
-      gst_event_unref (event);
-      break;
-    }
-    default:
-      ret = gst_pad_push_event (adder->srcpad, event);
-      break;
-  }
-
-done:
-
-  return ret;
-
-  /* ERRORS */
-newseg_wrong_format:
-  {
-    GST_DEBUG_OBJECT (adder, "received non TIME segment");
-    ret = FALSE;
-    goto done;
-  }
-}
-
-static gboolean
-gst_live_adder_query_pos_dur (GstLiveAdder * adder, GstFormat format,
-    gboolean position, gint64 * outvalue)
-{
-  GValue item = { 0 };
-  gint64 max = G_MININT64;
-  gboolean res = TRUE;
-  GstIterator *it;
-  gboolean done = FALSE;
-
-  it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (adder));
-  while (!done) {
-    switch (gst_iterator_next (it, &item)) {
-      case GST_ITERATOR_DONE:
-        done = TRUE;
-        break;
-      case GST_ITERATOR_OK:
-      {
-        GstPad *pad = GST_PAD_CAST (g_value_get_object (&item));
-        gint64 value;
-        gboolean curres;
-
-        /* ask sink peer for duration */
-        if (position)
-          curres = gst_pad_peer_query_position (pad, format, &value);
-        else
-          curres = gst_pad_peer_query_duration (pad, format, &value);
-
-        /* take max from all valid return values */
-        /* Only if the format is the one we requested, otherwise ignore it ?
-         */
-
-        if (curres) {
-          res &= curres;
-
-          /* valid unknown length, stop searching */
-          if (value == -1) {
-            max = value;
-            done = TRUE;
-          } else if (value > max) {
-            max = value;
-          }
-        }
-        g_value_reset (&item);
-        break;
-      }
-      case GST_ITERATOR_RESYNC:
-        max = -1;
-        res = TRUE;
-        break;
-      default:
-        res = FALSE;
-        done = TRUE;
-        break;
-    }
-  }
-
-  g_value_unset (&item);
-  gst_iterator_free (it);
-
-  if (res)
-    *outvalue = max;
-
-  return res;
-}
-
-/* FIXME:
- *
- * When we add a new stream (or remove a stream) the duration might
- * also become invalid again and we need to post a new DURATION
- * message to notify this fact to the parent.
- * For now we take the max of all the upstream elements so the simple
- * cases work at least somewhat.
- */
-static gboolean
-gst_live_adder_query_duration (GstLiveAdder * adder, GstQuery * query)
-{
-  GstFormat format;
-  gint64 max;
-  gboolean res;
-
-  /* parse format */
-  gst_query_parse_duration (query, &format, NULL);
-
-  res = gst_live_adder_query_pos_dur (adder, format, FALSE, &max);
-
-  if (res) {
-    /* and store the max */
-    gst_query_set_duration (query, format, max);
-  }
-
-  return res;
-}
-
-static gboolean
-gst_live_adder_query_position (GstLiveAdder * adder, GstQuery * query)
-{
-  GstFormat format;
-  gint64 max;
-  gboolean res;
-
-  /* parse format */
-  gst_query_parse_position (query, &format, NULL);
-
-  res = gst_live_adder_query_pos_dur (adder, format, TRUE, &max);
-
-  if (res) {
-    /* and store the max */
-    gst_query_set_position (query, format, max);
-  }
-
-  return res;
-}
-
-
-
-static gboolean
-gst_live_adder_src_query (GstPad * pad, GstObject * parent, GstQuery * query)
-{
-  GstLiveAdder *adder = GST_LIVE_ADDER (parent);
-  gboolean res = FALSE;
-
-  switch (GST_QUERY_TYPE (query)) {
-    case GST_QUERY_LATENCY:
-    {
-      /* We need to send the query upstream and add the returned latency to our
-       * own */
-      res = gst_pad_query_default (pad, parent, query);
-
-      if (res) {
-        GstClockTime my_latency = adder->latency_ms * GST_MSECOND;
-        GstClockTime min_latency, max_latency;
-        gboolean live;
-
-        gst_query_parse_latency (query, &live, &min_latency, &max_latency);
-
-        GST_OBJECT_LOCK (adder);
-        adder->peer_latency = min_latency;
-        min_latency += my_latency;
-        GST_OBJECT_UNLOCK (adder);
-
-        /* Make sure we don't risk an overflow */
-        if (max_latency < G_MAXUINT64 - my_latency)
-          max_latency += my_latency;
-        else
-          max_latency = G_MAXUINT64;
-        gst_query_set_latency (query, TRUE, min_latency, max_latency);
-        GST_DEBUG_OBJECT (adder, "Calculated total latency : min %"
-            GST_TIME_FORMAT " max %" GST_TIME_FORMAT,
-            GST_TIME_ARGS (min_latency), GST_TIME_ARGS (max_latency));
-      }
-      break;
-    }
-    case GST_QUERY_DURATION:
-      res = gst_live_adder_query_duration (adder, query);
-      break;
-    case GST_QUERY_POSITION:
-      res = gst_live_adder_query_position (adder, query);
-      break;
-    default:
-      res = gst_pad_query_default (pad, parent, query);
-      break;
-  }
-
-  return res;
-}
-
-static gboolean
-gst_live_adder_sink_query (GstPad * pad, GstObject * parent, GstQuery * query)
-{
-  GstLiveAdder *adder = GST_LIVE_ADDER (parent);
-  gboolean res;
-
-  switch (GST_QUERY_TYPE (query)) {
-    case GST_QUERY_CAPS:
-    {
-      GstCaps *filter;
-      GstCaps *result;
-
-      gst_query_parse_caps (query, &filter);
-      result = gst_live_adder_sink_getcaps (adder, pad, filter);
-      gst_query_set_caps_result (query, result);
-      gst_caps_unref (result);
-      res = TRUE;
-      break;
-    }
-    default:
-      res = gst_pad_query_default (pad, parent, query);
-      break;
-  }
-
-  return res;
-}
-
-static gboolean
-forward_event_func (const GValue * item, GValue * ret, gpointer user_data)
-{
-  GstPad *pad = GST_PAD (g_value_get_object (item));
-  GstEvent *event = user_data;
-
-  gst_event_ref (event);
-  GST_LOG_OBJECT (pad, "About to send event %s", GST_EVENT_TYPE_NAME (event));
-  if (!gst_pad_push_event (pad, event)) {
-    g_value_set_boolean (ret, FALSE);
-    GST_WARNING_OBJECT (pad, "Sending event  %p (%s) failed.",
-        event, GST_EVENT_TYPE_NAME (event));
-  } else {
-    GST_LOG_OBJECT (pad, "Sent event  %p (%s).",
-        event, GST_EVENT_TYPE_NAME (event));
-  }
-  return TRUE;
-}
-
-/* forwards the event to all sinkpads, takes ownership of the
- * event
- *
- * Returns: TRUE if the event could be forwarded on all
- * sinkpads.
- */
-static gboolean
-forward_event (GstLiveAdder * adder, GstEvent * event)
-{
-  GstIterator *it;
-  GValue vret = { 0 };
-
-  GST_LOG_OBJECT (adder, "Forwarding event %p (%s)", event,
-      GST_EVENT_TYPE_NAME (event));
-
-  g_value_init (&vret, G_TYPE_BOOLEAN);
-  g_value_set_boolean (&vret, TRUE);
-  it = gst_element_iterate_sink_pads (GST_ELEMENT_CAST (adder));
-  gst_iterator_fold (it, forward_event_func, &vret, event);
-  gst_iterator_free (it);
-
-  return g_value_get_boolean (&vret);
-}
-
-
-static gboolean
-gst_live_adder_src_event (GstPad * pad, GstObject * parent, GstEvent * event)
-{
-  GstLiveAdder *adder = GST_LIVE_ADDER (parent);
-  gboolean result;
-
-  switch (GST_EVENT_TYPE (event)) {
-    case GST_EVENT_QOS:
-      /* TODO : QoS might be tricky */
-      result = FALSE;
-      break;
-    case GST_EVENT_NAVIGATION:
-      /* TODO : navigation is rather pointless. */
-      result = FALSE;
-      break;
-    default:
-      /* just forward the rest for now */
-      result = forward_event (adder, event);
-      break;
-  }
-
-  gst_event_unref (event);
-
-  return result;
-}
-
-static guint
-gst_live_adder_length_from_duration (GstLiveAdder * adder,
-    GstClockTime duration)
-{
-  guint64 ret = GST_AUDIO_INFO_BPF (&adder->info) *
-      gst_util_uint64_scale_int_round (duration,
-      GST_AUDIO_INFO_RATE (&adder->info), GST_SECOND);
-
-  return (guint) ret;
-}
-
-static GstClockTime
-gst_live_adder_length_to_duration (GstLiveAdder * adder, guint size)
-{
-  return GST_FRAMES_TO_CLOCK_TIME ((size /
-          GST_AUDIO_INFO_BPF (&adder->info)),
-      GST_AUDIO_INFO_RATE (&adder->info));
-}
-
-static GstFlowReturn
-gst_live_adder_chain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
-{
-  GstLiveAdder *adder = GST_LIVE_ADDER (parent);
-  GstLiveAdderPadPrivate *padprivate = NULL;
-  GstFlowReturn ret = GST_FLOW_OK;
-  GList *item = NULL;
-  GstClockTime skip = 0;
-  gint64 drift = 0;             /* Positive if new buffer after old buffer */
-  gsize buffer_size = 0;
-  gsize subbuffer_size = 0;
-  gsize offset = 0;
-
-  GST_OBJECT_LOCK (adder);
-
-  ret = adder->srcresult;
-
-  GST_DEBUG ("Incoming buffer time:%" GST_TIME_FORMAT " duration:%"
-      GST_TIME_FORMAT, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)),
-      GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)));
-
-  if (ret != GST_FLOW_OK) {
-    GST_DEBUG_OBJECT (adder, "Passing non-ok result from src: %s",
-        gst_flow_get_name (ret));
-    gst_buffer_unref (buffer);
-    goto out;
-  }
-
-  padprivate = gst_pad_get_element_private (pad);
-
-  if (!padprivate) {
-    ret = GST_FLOW_NOT_LINKED;
-    gst_buffer_unref (buffer);
-    goto out;
-  }
-
-  if (padprivate->eos) {
-    GST_DEBUG_OBJECT (adder, "Received buffer after EOS");
-    ret = GST_FLOW_EOS;
-    gst_buffer_unref (buffer);
-    goto out;
-  }
-
-  if (!GST_BUFFER_TIMESTAMP_IS_VALID (buffer))
-    goto invalid_timestamp;
-
-  if (padprivate->segment.format == GST_FORMAT_UNDEFINED) {
-    GST_WARNING_OBJECT (adder, "No new-segment received,"
-        " initializing segment with time 0..-1");
-    gst_segment_init (&padprivate->segment, GST_FORMAT_TIME);
-  }
-
-  buffer = gst_buffer_make_writable (buffer);
-
-  drift = GST_BUFFER_TIMESTAMP (buffer) - padprivate->expected_timestamp;
-
-  /* Just see if we receive invalid timestamp/durations */
-  if (GST_CLOCK_TIME_IS_VALID (padprivate->expected_timestamp) &&
-      !GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_DISCONT) &&
-      (drift != 0)) {
-    GST_LOG_OBJECT (adder,
-        "Timestamp discontinuity without the DISCONT flag set"
-        " (expected %" GST_TIME_FORMAT ", got %" GST_TIME_FORMAT
-        " drift:%" G_GINT64_FORMAT "ms)",
-        GST_TIME_ARGS (padprivate->expected_timestamp),
-        GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)), drift / GST_MSECOND);
-
-    /* We accept drifts of 10ms */
-    if (ABS (drift) < (10 * GST_MSECOND)) {
-      GST_DEBUG ("Correcting minor drift");
-      GST_BUFFER_TIMESTAMP (buffer) = padprivate->expected_timestamp;
-    }
-  }
-
-
-  /* If there is no duration, lets set one */
-  if (!GST_BUFFER_DURATION_IS_VALID (buffer)) {
-    GST_BUFFER_DURATION (buffer) = (gst_buffer_get_size (buffer) * GST_SECOND) /
-        (GST_AUDIO_INFO_BPF (&adder->info) *
-        GST_AUDIO_INFO_RATE (&adder->info));
-    padprivate->expected_timestamp = GST_CLOCK_TIME_NONE;
-  } else {
-    padprivate->expected_timestamp = GST_BUFFER_TIMESTAMP (buffer) +
-        GST_BUFFER_DURATION (buffer);
-  }
-
-
-  /*
-   * Lets clip the buffer to the segment (so we don't have to worry about
-   * cliping afterwards).
-   * This should also guarantee us that we'll have valid timestamps and
-   * durations afterwards
-   */
-
-  buffer = gst_audio_buffer_clip (buffer, &padprivate->segment,
-      GST_AUDIO_INFO_RATE (&adder->info), GST_AUDIO_INFO_BPF (&adder->info));
-
-  /* buffer can be NULL if it's completely outside of the segment */
-  if (!buffer) {
-    GST_DEBUG ("Buffer completely outside of configured segment, dropping it");
-    goto out;
-  }
-
-  /*
-   * Make sure all incoming buffers share the same timestamping
-   */
-  GST_BUFFER_TIMESTAMP (buffer) =
-      gst_segment_to_running_time (&padprivate->segment,
-      padprivate->segment.format, GST_BUFFER_TIMESTAMP (buffer));
-
-
-  if (GST_CLOCK_TIME_IS_VALID (adder->next_timestamp) &&
-      GST_BUFFER_TIMESTAMP (buffer) < adder->next_timestamp) {
-    if (GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer) <
-        adder->next_timestamp) {
-      GST_DEBUG_OBJECT (adder, "Buffer is late, dropping (ts: %" GST_TIME_FORMAT
-          " duration: %" GST_TIME_FORMAT ")",
-          GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)),
-          GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)));
-      gst_buffer_unref (buffer);
-      goto out;
-    } else {
-      skip = adder->next_timestamp - GST_BUFFER_TIMESTAMP (buffer);
-      GST_DEBUG_OBJECT (adder, "Buffer is partially late, skipping %"
-          GST_TIME_FORMAT, GST_TIME_ARGS (skip));
-    }
-  }
-
-  /* If our new buffer's head is higher than the queue's head, lets wake up,
-   * we may not have to wait for as long
-   */
-  if (adder->clock_id &&
-      g_queue_peek_head (adder->buffers) != NULL &&
-      GST_BUFFER_TIMESTAMP (buffer) + skip <
-      GST_BUFFER_TIMESTAMP (g_queue_peek_head (adder->buffers)))
-    gst_clock_id_unschedule (adder->clock_id);
-
-  for (item = g_queue_peek_head_link (adder->buffers);
-      item; item = g_list_next (item)) {
-    GstBuffer *oldbuffer = item->data;
-    GstClockTime old_skip = 0;
-    GstClockTime mix_duration = 0;
-    GstClockTime mix_start = 0;
-    GstClockTime mix_end = 0;
-    GstMapInfo oldmap, map;
-
-    /* We haven't reached our place yet */
-    if (GST_BUFFER_TIMESTAMP (buffer) + skip >=
-        GST_BUFFER_TIMESTAMP (oldbuffer) + GST_BUFFER_DURATION (oldbuffer))
-      continue;
-
-    /* We're past our place, lets insert ouselves here */
-    if (GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer) <=
-        GST_BUFFER_TIMESTAMP (oldbuffer))
-      break;
-
-    /* if we reach this spot, we have overlap, so we must mix */
-
-    /* First make a subbuffer with the non-overlapping part */
-    if (GST_BUFFER_TIMESTAMP (buffer) + skip < GST_BUFFER_TIMESTAMP (oldbuffer)) {
-      GstBuffer *subbuffer = NULL;
-      GstClockTime subbuffer_duration = GST_BUFFER_TIMESTAMP (oldbuffer) -
-          (GST_BUFFER_TIMESTAMP (buffer) + skip);
-
-      buffer_size = gst_buffer_get_size (buffer);
-      offset = gst_live_adder_length_from_duration (adder, skip);
-      subbuffer_size = gst_live_adder_length_from_duration (adder,
-          subbuffer_duration);
-
-      if (offset + subbuffer_size > buffer_size) {
-        subbuffer_size = buffer_size - offset;
-        subbuffer_duration = gst_live_adder_length_to_duration (adder,
-            subbuffer_size);
-      }
-
-      subbuffer = gst_buffer_copy_region (buffer, GST_BUFFER_COPY_ALL,
-          offset, subbuffer_size);
-
-      GST_BUFFER_TIMESTAMP (subbuffer) = GST_BUFFER_TIMESTAMP (buffer) + skip;
-      GST_BUFFER_DURATION (subbuffer) = subbuffer_duration;
-
-      skip += subbuffer_duration;
-
-      g_queue_insert_before (adder->buffers, item, subbuffer);
-    }
-
-    /* Now we are on the overlapping part */
-    oldbuffer = gst_buffer_make_writable (oldbuffer);
-    item->data = oldbuffer;
-
-    old_skip = GST_BUFFER_TIMESTAMP (buffer) + skip -
-        GST_BUFFER_TIMESTAMP (oldbuffer);
-
-    mix_start = GST_BUFFER_TIMESTAMP (oldbuffer) + old_skip;
-
-    if (GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer) <
-        GST_BUFFER_TIMESTAMP (oldbuffer) + GST_BUFFER_DURATION (oldbuffer))
-      mix_end = GST_BUFFER_TIMESTAMP (buffer) + GST_BUFFER_DURATION (buffer);
-    else
-      mix_end = GST_BUFFER_TIMESTAMP (oldbuffer) +
-          GST_BUFFER_DURATION (oldbuffer);
-
-    mix_duration = mix_end - mix_start;
-
-    if (!GST_BUFFER_FLAG_IS_SET (buffer, GST_BUFFER_FLAG_GAP)) {
-      GST_BUFFER_FLAG_UNSET (oldbuffer, GST_BUFFER_FLAG_GAP);
-      gst_buffer_map (oldbuffer, &oldmap, GST_MAP_WRITE);
-      gst_buffer_map (buffer, &map, GST_MAP_READ);
-      adder->func (oldmap.data +
-          gst_live_adder_length_from_duration (adder, old_skip),
-          map.data +
-          gst_live_adder_length_from_duration (adder, skip),
-          gst_live_adder_length_from_duration (adder, mix_duration));
-      gst_buffer_unmap (oldbuffer, &oldmap);
-      gst_buffer_unmap (buffer, &map);
-    }
-    skip += mix_duration;
-  }
-
-  g_cond_broadcast (&adder->not_empty_cond);
-
-  if (skip == GST_BUFFER_DURATION (buffer)) {
-    gst_buffer_unref (buffer);
-  } else {
-    if (skip) {
-      GstClockTime subbuffer_duration = GST_BUFFER_DURATION (buffer) - skip;
-      GstClockTime subbuffer_ts = GST_BUFFER_TIMESTAMP (buffer) + skip;
-      GstBuffer *new_buffer;
-
-      buffer_size = gst_buffer_get_size (buffer);
-      offset = gst_live_adder_length_from_duration (adder, skip);
-      subbuffer_size = gst_live_adder_length_from_duration (adder,
-          subbuffer_duration);
-
-      if (offset + subbuffer_size > buffer_size) {
-        subbuffer_size = buffer_size - offset;
-        subbuffer_duration = gst_live_adder_length_to_duration (adder,
-            subbuffer_size);
-      }
-
-      new_buffer = gst_buffer_copy_region (buffer,
-          GST_BUFFER_COPY_ALL, offset, subbuffer_size);
-
-      gst_buffer_unref (buffer);
-      buffer = new_buffer;
-      GST_BUFFER_PTS (buffer) = subbuffer_ts;
-      GST_BUFFER_DURATION (buffer) = subbuffer_duration;
-    }
-
-    if (item)
-      g_queue_insert_before (adder->buffers, item, buffer);
-    else
-      g_queue_push_tail (adder->buffers, buffer);
-  }
-
-out:
-
-  GST_OBJECT_UNLOCK (adder);
-
-  return ret;
-
-invalid_timestamp:
-
-  GST_OBJECT_UNLOCK (adder);
-  gst_buffer_unref (buffer);
-  GST_ELEMENT_ERROR (adder, STREAM, FAILED,
-      ("Buffer without a valid timestamp received"),
-      ("Invalid timestamp received on buffer"));
-
-  return GST_FLOW_ERROR;
-}
-
-/*
- * This only works because the GstObject lock is taken
- *
- * It checks if all sink pads are EOS
- */
-static gboolean
-check_eos_locked (GstLiveAdder * adder)
-{
-  GList *item;
-
-  /* We can't be EOS if we have no sinkpads */
-  if (adder->sinkpads == NULL)
-    return FALSE;
-
-  for (item = adder->sinkpads; item; item = g_list_next (item)) {
-    GstPad *pad = item->data;
-    GstLiveAdderPadPrivate *padprivate = gst_pad_get_element_private (pad);
-
-    if (padprivate && padprivate->eos != TRUE)
-      return FALSE;
-  }
-
-  return TRUE;
-}
-
-static void
-gst_live_adder_loop (gpointer data)
-{
-  GstLiveAdder *adder = GST_LIVE_ADDER (data);
-  GstClockTime buffer_timestamp = 0;
-  GstClockTime sync_time = 0;
-  GstClock *clock = NULL;
-  GstClockID id = NULL;
-  GstClockReturn ret;
-  GstBuffer *buffer = NULL;
-  GstFlowReturn result;
-
-  GST_OBJECT_LOCK (adder);
-
-again:
-
-  for (;;) {
-    if (adder->srcresult != GST_FLOW_OK)
-      goto flushing;
-    if (!g_queue_is_empty (adder->buffers))
-      break;
-    if (check_eos_locked (adder))
-      goto eos;
-    g_cond_wait (&adder->not_empty_cond, GST_OBJECT_GET_LOCK (adder));
-  }
-
-  buffer_timestamp = GST_BUFFER_TIMESTAMP (g_queue_peek_head (adder->buffers));
-
-  clock = GST_ELEMENT_CLOCK (adder);
-
-  /* If we have no clock, then we can't do anything.. error */
-  if (!clock) {
-    if (adder->playing)
-      goto no_clock;
-    else
-      goto push_buffer;
-  }
-
-  GST_DEBUG_OBJECT (adder, "sync to timestamp %" GST_TIME_FORMAT,
-      GST_TIME_ARGS (buffer_timestamp));
-
-  sync_time = buffer_timestamp + GST_ELEMENT_CAST (adder)->base_time;
-  /* add latency, this includes our own latency and the peer latency. */
-  sync_time += adder->latency_ms * GST_MSECOND;
-  sync_time += adder->peer_latency;
-
-  /* create an entry for the clock */
-  id = adder->clock_id = gst_clock_new_single_shot_id (clock, sync_time);
-  GST_OBJECT_UNLOCK (adder);
-
-  ret = gst_clock_id_wait (id, NULL);
-
-  GST_OBJECT_LOCK (adder);
-
-  /* and free the entry */
-  gst_clock_id_unref (id);
-  adder->clock_id = NULL;
-
-  /* at this point, the clock could have been unlocked by a timeout, a new
-   * head element was added to the queue or because we are shutting down. Check
-   * for shutdown first. */
-
-  if (adder->srcresult != GST_FLOW_OK)
-    goto flushing;
-
-  if (ret == GST_CLOCK_UNSCHEDULED) {
-    GST_DEBUG_OBJECT (adder,
-        "Wait got unscheduled, will retry to push with new buffer");
-    goto again;
-  }
-
-  if (ret != GST_CLOCK_OK && ret != GST_CLOCK_EARLY)
-    goto clock_error;
-
-push_buffer:
-
-  buffer = g_queue_pop_head (adder->buffers);
-
-  if (!buffer)
-    goto again;
-
-  /*
-   * We make sure the timestamps are exactly contiguous
-   * If its only small skew (due to rounding errors), we correct it
-   * silently. Otherwise we put the discont flag
-   */
-  if (GST_CLOCK_TIME_IS_VALID (adder->next_timestamp) &&
-      GST_BUFFER_TIMESTAMP (buffer) != adder->next_timestamp) {
-    GstClockTimeDiff diff = GST_CLOCK_DIFF (GST_BUFFER_TIMESTAMP (buffer),
-        adder->next_timestamp);
-    if (diff < 0)
-      diff = -diff;
-
-    if (diff < GST_SECOND / GST_AUDIO_INFO_RATE (&adder->info)) {
-      GST_BUFFER_TIMESTAMP (buffer) = adder->next_timestamp;
-      GST_DEBUG_OBJECT (adder, "Correcting slight skew");
-      GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_DISCONT);
-    } else {
-      GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT);
-      GST_DEBUG_OBJECT (adder, "Expected buffer at %" GST_TIME_FORMAT
-          ", but is at %" GST_TIME_FORMAT ", setting discont",
-          GST_TIME_ARGS (adder->next_timestamp),
-          GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)));
-    }
-  } else {
-    GST_BUFFER_FLAG_UNSET (buffer, GST_BUFFER_FLAG_DISCONT);
-  }
-
-  GST_BUFFER_OFFSET (buffer) = GST_BUFFER_OFFSET_NONE;
-  GST_BUFFER_OFFSET_END (buffer) = GST_BUFFER_OFFSET_NONE;
-
-  if (GST_BUFFER_DURATION_IS_VALID (buffer))
-    adder->next_timestamp = GST_BUFFER_TIMESTAMP (buffer) +
-        GST_BUFFER_DURATION (buffer);
-  else
-    adder->next_timestamp = GST_CLOCK_TIME_NONE;
-  GST_OBJECT_UNLOCK (adder);
-
-  GST_LOG_OBJECT (adder, "About to push buffer time:%" GST_TIME_FORMAT
-      " duration:%" GST_TIME_FORMAT,
-      GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (buffer)),
-      GST_TIME_ARGS (GST_BUFFER_DURATION (buffer)));
-
-  result = gst_pad_push (adder->srcpad, buffer);
-  if (result != GST_FLOW_OK)
-    goto pause;
-
-  return;
-
-flushing:
-  {
-    GST_DEBUG_OBJECT (adder, "we are flushing");
-    gst_pad_pause_task (adder->srcpad);
-    GST_OBJECT_UNLOCK (adder);
-    return;
-  }
-
-clock_error:
-  {
-    gst_pad_pause_task (adder->srcpad);
-    GST_OBJECT_UNLOCK (adder);
-    GST_ELEMENT_ERROR (adder, STREAM, MUX, ("Error with the clock"),
-        ("Error with the clock: %d", ret));
-    GST_ERROR_OBJECT (adder, "Error with the clock: %d", ret);
-    return;
-  }
-
-no_clock:
-  {
-    gst_pad_pause_task (adder->srcpad);
-    GST_OBJECT_UNLOCK (adder);
-    GST_ELEMENT_ERROR (adder, STREAM, MUX, ("No available clock"),
-        ("No available clock"));
-    GST_ERROR_OBJECT (adder, "No available clock");
-    return;
-  }
-
-pause:
-  {
-    GST_DEBUG_OBJECT (adder, "pausing task, reason %s",
-        gst_flow_get_name (result));
-
-    GST_OBJECT_LOCK (adder);
-
-    /* store result */
-    adder->srcresult = result;
-    /* we don't post errors or anything because upstream will do that for us
-     * when we pass the return value upstream. */
-    gst_pad_pause_task (adder->srcpad);
-    GST_OBJECT_UNLOCK (adder);
-    return;
-  }
-
-eos:
-  {
-    /* store result, we are flushing now */
-    GST_DEBUG_OBJECT (adder, "We are EOS, pushing EOS downstream");
-    adder->srcresult = GST_FLOW_EOS;
-    gst_pad_pause_task (adder->srcpad);
-    GST_OBJECT_UNLOCK (adder);
-    gst_pad_push_event (adder->srcpad, gst_event_new_eos ());
-    return;
-  }
-}
-
-static GstPad *
-gst_live_adder_request_new_pad (GstElement * element, GstPadTemplate * templ,
-    const gchar * ignored_name, const GstCaps * caps)
-{
-  gchar *name;
-  GstLiveAdder *adder;
-  GstPad *newpad;
-  gint padcount;
-  GstLiveAdderPadPrivate *padprivate = NULL;
-
-  if (templ->direction != GST_PAD_SINK)
-    goto not_sink;
-
-  adder = GST_LIVE_ADDER (element);
-
-  /* increment pad counter */
-  padcount = g_atomic_int_add (&adder->padcount, 1);
-
-  name = g_strdup_printf ("sink_%u", padcount);
-  newpad = gst_pad_new_from_template (templ, name);
-  GST_DEBUG_OBJECT (adder, "request new pad %s", name);
-  g_free (name);
-
-  gst_pad_set_event_function (newpad,
-      GST_DEBUG_FUNCPTR (gst_live_adder_sink_event));
-  gst_pad_set_query_function (newpad,
-      GST_DEBUG_FUNCPTR (gst_live_adder_sink_query));
-
-  padprivate = g_new0 (GstLiveAdderPadPrivate, 1);
-
-  gst_segment_init (&padprivate->segment, GST_FORMAT_UNDEFINED);
-  padprivate->eos = FALSE;
-  padprivate->expected_timestamp = GST_CLOCK_TIME_NONE;
-
-  gst_pad_set_element_private (newpad, padprivate);
-
-  gst_pad_set_chain_function (newpad, gst_live_adder_chain);
-
-
-  if (!gst_pad_set_active (newpad, TRUE))
-    goto could_not_activate;
-
-  /* takes ownership of the pad */
-  if (!gst_element_add_pad (GST_ELEMENT (adder), newpad))
-    goto could_not_add;
-
-  GST_OBJECT_LOCK (adder);
-  adder->sinkpads = g_list_prepend (adder->sinkpads, newpad);
-  GST_OBJECT_UNLOCK (adder);
-
-  return newpad;
-
-  /* errors */
-not_sink:
-  {
-    g_warning ("gstadder: request new pad that is not a SINK pad\n");
-    return NULL;
-  }
-could_not_add:
-  {
-    GST_DEBUG_OBJECT (adder, "could not add pad");
-    g_free (padprivate);
-    gst_object_unref (newpad);
-    return NULL;
-  }
-could_not_activate:
-  {
-    GST_DEBUG_OBJECT (adder, "could not activate new pad");
-    g_free (padprivate);
-    gst_object_unref (newpad);
-    return NULL;
-  }
-}
-
-static void
-gst_live_adder_release_pad (GstElement * element, GstPad * pad)
-{
-  GstLiveAdder *adder;
-  GstLiveAdderPadPrivate *padprivate;
-
-  adder = GST_LIVE_ADDER (element);
-
-  GST_DEBUG_OBJECT (adder, "release pad %s:%s", GST_DEBUG_PAD_NAME (pad));
-
-  GST_OBJECT_LOCK (element);
-  padprivate = gst_pad_get_element_private (pad);
-  gst_pad_set_element_private (pad, NULL);
-  adder->sinkpads = g_list_remove_all (adder->sinkpads, pad);
-  GST_OBJECT_UNLOCK (element);
-
-  g_free (padprivate);
-
-  gst_element_remove_pad (element, pad);
-}
-
-static void
-reset_pad_private (GstPad * pad)
-{
-  GstLiveAdderPadPrivate *padprivate;
-
-  padprivate = gst_pad_get_element_private (pad);
-
-  if (!padprivate)
-    return;
-
-  gst_segment_init (&padprivate->segment, GST_FORMAT_UNDEFINED);
-
-  padprivate->expected_timestamp = GST_CLOCK_TIME_NONE;
-  padprivate->eos = FALSE;
-}
-
-static GstStateChangeReturn
-gst_live_adder_change_state (GstElement * element, GstStateChange transition)
-{
-  GstLiveAdder *adder;
-  GstStateChangeReturn ret;
-
-  adder = GST_LIVE_ADDER (element);
-
-  switch (transition) {
-    case GST_STATE_CHANGE_READY_TO_PAUSED:
-      GST_OBJECT_LOCK (adder);
-      adder->segment_pending = TRUE;
-      adder->peer_latency = 0;
-      adder->next_timestamp = GST_CLOCK_TIME_NONE;
-      g_list_foreach (adder->sinkpads, (GFunc) reset_pad_private, NULL);
-      GST_OBJECT_UNLOCK (adder);
-      break;
-    case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
-      GST_OBJECT_LOCK (adder);
-      adder->playing = FALSE;
-      GST_OBJECT_UNLOCK (adder);
-      break;
-    default:
-      break;
-  }
-
-  ret = GST_ELEMENT_CLASS (gst_live_adder_parent_class)->change_state (element,
-      transition);
-
-  switch (transition) {
-    case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
-      GST_OBJECT_LOCK (adder);
-      adder->playing = TRUE;
-      GST_OBJECT_UNLOCK (adder);
-      break;
-    default:
-      break;
-  }
-
-  return ret;
-}
-
-
-static gboolean
-plugin_init (GstPlugin * plugin)
-{
-  if (!gst_element_register (plugin, "liveadder", GST_RANK_NONE,
-          GST_TYPE_LIVE_ADDER)) {
-    return FALSE;
-  }
-
-  return TRUE;
-}
-
-GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
-    GST_VERSION_MINOR,
-    liveadder,
-    "Adds multiple live discontinuous streams",
-    plugin_init, VERSION, GST_LICENSE, GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/gst/liveadder/liveadder.h b/gst/liveadder/liveadder.h
deleted file mode 100644
index 3755edf..0000000
--- a/gst/liveadder/liveadder.h
+++ /dev/null
@@ -1,91 +0,0 @@
-/*
- * GStreamer
- *
- *  Copyright 2008 Collabora Ltd
- *  Copyright 2008 Nokia Corporation
- *   @author: Olivier Crete <olivier.crete@collabora.co.uk>
- *
- * 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_LIVE_ADDER_H__
-#define __GST_LIVE_ADDER_H__
-
-#include <gst/gst.h>
-#include <gst/audio/audio.h>
-
-G_BEGIN_DECLS
-#define GST_TYPE_LIVE_ADDER            (gst_live_adder_get_type())
-#define GST_LIVE_ADDER(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_LIVE_ADDER,GstLiveAdder))
-#define GST_IS_LIVE_ADDER(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_LIVE_ADDER))
-#define GST_LIVE_ADDER_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_LIVE_ADDER,GstLiveAdderClass))
-#define GST_IS_LIVE_ADDER_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_LIVE_ADDER))
-#define GST_LIVE_ADDER_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_LIVE_ADDER,GstLiveAdderClass))
-typedef struct _GstLiveAdder GstLiveAdder;
-typedef struct _GstLiveAdderClass GstLiveAdderClass;
-
-typedef void (*GstLiveAdderFunction) (gpointer out, gpointer in, guint size);
-
-/**
- * GstLiveAdder:
- *
- * The adder object structure.
- */
-struct _GstLiveAdder
-{
-  /*< private >*/
-  GstElement element;
-
-  GstPad *srcpad;
-  /* pad counter, used for creating unique request pads */
-  gint padcount;
-  GList *sinkpads;
-
-  GstFlowReturn srcresult;
-  GstClockID clock_id;
-
-  /* the queue is ordered head to tail */
-  GQueue *buffers;
-  GCond not_empty_cond;
-
-  GstClockTime next_timestamp;
-
-  /* the next are valid for both int and float */
-  GstAudioInfo info;
-
-  /* function to add samples */
-  GstLiveAdderFunction func;
-
-  GstClockTime latency_ms;
-  GstClockTime peer_latency;
-
-  gboolean segment_pending;
-
-  gboolean playing;
-};
-
-struct _GstLiveAdderClass
-{
-  GstElementClass parent_class;
-};
-
-GType gst_live_adder_get_type (void);
-
-G_END_DECLS
-#endif /* __GST_LIVE_ADDER_H__ */
diff --git a/gst/midi/Makefile.in b/gst/midi/Makefile.in
index b3ea144..0427cf9 100644
--- a/gst/midi/Makefile.in
+++ b/gst/midi/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/mpegdemux/Makefile.in b/gst/mpegdemux/Makefile.in
index 4d5370a..e9af940 100644
--- a/gst/mpegdemux/Makefile.in
+++ b/gst/mpegdemux/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/mpegpsmux/Makefile.in b/gst/mpegpsmux/Makefile.in
index 364d26e..cd804d6 100644
--- a/gst/mpegpsmux/Makefile.in
+++ b/gst/mpegpsmux/Makefile.in
@@ -277,6 +277,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -314,6 +316,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -341,6 +345,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -359,6 +365,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -369,6 +377,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -394,6 +404,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -419,6 +431,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -550,6 +564,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -607,8 +623,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -678,6 +698,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/mpegtsdemux/Makefile.am b/gst/mpegtsdemux/Makefile.am
index b4e053c..f0475c6 100644
--- a/gst/mpegtsdemux/Makefile.am
+++ b/gst/mpegtsdemux/Makefile.am
@@ -15,8 +15,8 @@
 	$(top_builddir)/gst-libs/gst/mpegts/libgstmpegts-$(GST_API_VERSION).la \
 	$(top_builddir)/gst-libs/gst/codecparsers/libgstcodecparsers-$(GST_API_VERSION).la \
 	$(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_API_VERSION) \
-	-lgstpbutils-@GST_API_VERSION@ \
-	$(GST_BASE_LIBS) $(GST_LIBS)
+	-lgstpbutils-@GST_API_VERSION@ -lgstaudio-$(GST_API_VERSION) \
+	$(GST_BASE_LIBS) $(GST_LIBS) $(LIBM)
 libgstmpegtsdemux_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
 libgstmpegtsdemux_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
 
diff --git a/gst/mpegtsdemux/Makefile.in b/gst/mpegtsdemux/Makefile.in
index 8a7f235..cf5e9cd 100644
--- a/gst/mpegtsdemux/Makefile.in
+++ b/gst/mpegtsdemux/Makefile.in
@@ -167,7 +167,7 @@
 libgstmpegtsdemux_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/mpegts/libgstmpegts-$(GST_API_VERSION).la \
 	$(top_builddir)/gst-libs/gst/codecparsers/libgstcodecparsers-$(GST_API_VERSION).la \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
 am_libgstmpegtsdemux_la_OBJECTS =  \
 	libgstmpegtsdemux_la-mpegtspacketizer.lo \
 	libgstmpegtsdemux_la-mpegtsbase.lo \
@@ -282,6 +282,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -319,6 +321,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -346,6 +350,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -364,6 +370,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -374,6 +382,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -399,6 +409,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -424,6 +436,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -555,6 +569,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -612,8 +628,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -683,6 +703,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -786,8 +807,8 @@
 	$(top_builddir)/gst-libs/gst/mpegts/libgstmpegts-$(GST_API_VERSION).la \
 	$(top_builddir)/gst-libs/gst/codecparsers/libgstcodecparsers-$(GST_API_VERSION).la \
 	$(GST_PLUGINS_BASE_LIBS) -lgsttag-$(GST_API_VERSION) \
-	-lgstpbutils-@GST_API_VERSION@ \
-	$(GST_BASE_LIBS) $(GST_LIBS)
+	-lgstpbutils-@GST_API_VERSION@ -lgstaudio-$(GST_API_VERSION) \
+	$(GST_BASE_LIBS) $(GST_LIBS) $(LIBM)
 
 libgstmpegtsdemux_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
 libgstmpegtsdemux_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
diff --git a/gst/mpegtsdemux/gstmpegdesc.h b/gst/mpegtsdemux/gstmpegdesc.h
index d1256a6..bd9235f 100644
--- a/gst/mpegtsdemux/gstmpegdesc.h
+++ b/gst/mpegtsdemux/gstmpegdesc.h
@@ -232,5 +232,6 @@
 #define DRF_ID_ETV1       0x45545631
 #define DRF_ID_HEVC       0x48455643
 #define DRF_ID_KLVA       0x4b4c5641   /* defined in RP217 */
+#define DRF_ID_OPUS       0x4f707573
 
 #endif /* __GST_MPEG_DESC_H__ */
diff --git a/gst/mpegtsdemux/mpegtsbase.c b/gst/mpegtsdemux/mpegtsbase.c
index d46a47e..3dcde60 100644
--- a/gst/mpegtsdemux/mpegtsbase.c
+++ b/gst/mpegtsdemux/mpegtsbase.c
@@ -74,6 +74,8 @@
     GValue * value, GParamSpec * pspec);
 
 static void mpegts_base_free_program (MpegTSBaseProgram * program);
+static void mpegts_base_deactivate_program (MpegTSBase * base,
+    MpegTSBaseProgram * program);
 static gboolean mpegts_base_sink_activate (GstPad * pad, GstObject * parent);
 static gboolean mpegts_base_sink_activate_mode (GstPad * pad,
     GstObject * parent, GstPadMode mode, gboolean active);
@@ -105,12 +107,21 @@
 G_DEFINE_TYPE_WITH_CODE (MpegTSBase, mpegts_base, GST_TYPE_ELEMENT,
     _extra_init ());
 
+/* Default implementation is that mpegtsbase can remove any program */
+static gboolean
+mpegts_base_can_remove_program (MpegTSBase * base, MpegTSBaseProgram * program)
+{
+  return TRUE;
+}
+
 static void
 mpegts_base_class_init (MpegTSBaseClass * klass)
 {
   GObjectClass *gobject_class;
   GstElementClass *element_class;
 
+  klass->can_remove_program = mpegts_base_can_remove_program;
+
   element_class = GST_ELEMENT_CLASS (klass);
   element_class->change_state = mpegts_base_change_state;
 
@@ -411,6 +422,16 @@
 }
 
 void
+mpegts_base_deactivate_and_free_program (MpegTSBase * base,
+    MpegTSBaseProgram * program)
+{
+  GST_DEBUG_OBJECT (base, "program_number : %d", program->program_number);
+
+  mpegts_base_deactivate_program (base, program);
+  mpegts_base_free_program (program);
+}
+
+static void
 mpegts_base_remove_program (MpegTSBase * base, gint program_number)
 {
   GST_DEBUG_OBJECT (base, "program_number : %d", program_number);
@@ -472,7 +493,7 @@
   return bstream;
 }
 
-void
+static void
 mpegts_base_program_remove_stream (MpegTSBase * base,
     MpegTSBaseProgram * program, guint16 pid)
 {
@@ -771,6 +792,7 @@
   }
 
   if (old_pat) {
+    MpegTSBaseClass *klass = GST_MPEGTS_BASE_GET_CLASS (base);
     /* deactivate the old table */
     GST_LOG ("Deactivating old Program Association Table");
 
@@ -791,8 +813,10 @@
       GST_INFO_OBJECT (base, "PAT removing program 0x%04x 0x%04x",
           patp->program_number, patp->network_or_program_map_PID);
 
-      mpegts_base_deactivate_program (base, program);
-      mpegts_base_remove_program (base, patp->program_number);
+      if (klass->can_remove_program (base, program)) {
+        mpegts_base_deactivate_program (base, program);
+        mpegts_base_remove_program (base, patp->program_number);
+      }
       /* FIXME: when this happens it may still be pmt pid of another
        * program, so setting to False may make it go through expensive
        * path in is_psi unnecessarily */
@@ -854,6 +878,7 @@
 
   /* If the current program is active, this means we have a new program */
   if (old_program->active) {
+    MpegTSBaseClass *klass = GST_MPEGTS_BASE_GET_CLASS (base);
     old_program = mpegts_base_steal_program (base, program_number);
     program = mpegts_base_new_program (base, program_number, section->pid);
     program->patcount = old_program->patcount;
@@ -861,8 +886,12 @@
         GINT_TO_POINTER (program_number), program);
 
     /* Desactivate the old program */
-    mpegts_base_deactivate_program (base, old_program);
-    mpegts_base_free_program (old_program);
+    /* FIXME : THIS IS BREAKING THE STREAM SWITCHING LOGIC !
+     *  */
+    if (klass->can_remove_program (base, old_program)) {
+      mpegts_base_deactivate_program (base, old_program);
+      mpegts_base_free_program (old_program);
+    }
     initial_program = FALSE;
   } else
     program = old_program;
diff --git a/gst/mpegtsdemux/mpegtsbase.h b/gst/mpegtsdemux/mpegtsbase.h
index c427bd7..fc0c651 100644
--- a/gst/mpegtsdemux/mpegtsbase.h
+++ b/gst/mpegtsdemux/mpegtsbase.h
@@ -174,6 +174,10 @@
   void (*program_started) (MpegTSBase *base, MpegTSBaseProgram *program);
   /* program_stopped gets called when pat no longer has program's pmt */
   void (*program_stopped) (MpegTSBase *base, MpegTSBaseProgram *program);
+  /* Whether mpegtbase can deactivate/free a program or whether the subclass will do it
+   * If the subclass responds TRUE, it should call mpegts_base_deactivate_and_free_program()
+   * when it wants to remove it */
+  gboolean (*can_remove_program) (MpegTSBase *base, MpegTSBaseProgram *program);
 
   /* stream_added is called whenever a new stream has been identified */
   void (*stream_added) (MpegTSBase *base, MpegTSBaseStream *stream, MpegTSBaseProgram *program);
@@ -222,9 +226,8 @@
 
 G_GNUC_INTERNAL gboolean gst_mpegtsbase_plugin_init (GstPlugin * plugin);
 
-G_GNUC_INTERNAL void mpegts_base_program_remove_stream (MpegTSBase * base, MpegTSBaseProgram * program, guint16 pid);
+G_GNUC_INTERNAL void mpegts_base_deactivate_and_free_program (MpegTSBase *base, MpegTSBaseProgram *program);
 
-G_GNUC_INTERNAL void mpegts_base_remove_program(MpegTSBase *base, gint program_number);
 G_END_DECLS
 
 #endif /* GST_MPEG_TS_BASE_H */
diff --git a/gst/mpegtsdemux/mpegtspacketizer.c b/gst/mpegtsdemux/mpegtspacketizer.c
index 1cdb9e9..3e348a6 100644
--- a/gst/mpegtsdemux/mpegtspacketizer.c
+++ b/gst/mpegtsdemux/mpegtspacketizer.c
@@ -212,8 +212,7 @@
   stream->section_length = 0;
   stream->section_offset = 0;
   stream->table_id = TABLE_ID_UNSET;
-  if (stream->section_data)
-    g_free (stream->section_data);
+  g_free (stream->section_data);
   stream->section_data = NULL;
 }
 
@@ -228,8 +227,6 @@
 mpegts_packetizer_stream_free (MpegTSPacketizerStream * stream)
 {
   mpegts_packetizer_clear_section (stream);
-  if (stream->section_data)
-    g_free (stream->section_data);
   g_slist_foreach (stream->subtables,
       (GFunc) mpegts_packetizer_stream_subtable_free, NULL);
   g_slist_free (stream->subtables);
@@ -984,6 +981,7 @@
       GST_LOG
           ("PID 0x%04x PUSI and pointer == 0, skipping straight to section_start parsing",
           packet->pid);
+      mpegts_packetizer_clear_section (stream);
       goto section_start;
     }
   }
diff --git a/gst/mpegtsdemux/mpegtsparse.c b/gst/mpegtsdemux/mpegtsparse.c
index 743da4f..6e4faf5 100644
--- a/gst/mpegtsdemux/mpegtsparse.c
+++ b/gst/mpegtsdemux/mpegtsparse.c
@@ -825,8 +825,7 @@
 
     /* Free this list node and move to the next */
     p = g_list_previous (l);
-    parse->pending_buffers = g_list_remove_link (parse->pending_buffers, l);
-    g_list_free_1 (l);
+    parse->pending_buffers = g_list_delete_link (parse->pending_buffers, l);
     l = p;
   }
 
diff --git a/gst/mpegtsdemux/tsdemux.c b/gst/mpegtsdemux/tsdemux.c
index 5231c05..b54a7d3 100644
--- a/gst/mpegtsdemux/tsdemux.c
+++ b/gst/mpegtsdemux/tsdemux.c
@@ -37,6 +37,8 @@
 #include <glib.h>
 #include <gst/tag/tag.h>
 #include <gst/pbutils/pbutils.h>
+#include <gst/base/base.h>
+#include <gst/audio/audio.h>
 
 #include "mpegtsbase.h"
 #include "tsdemux.h"
@@ -46,7 +48,10 @@
 #include "pesparse.h"
 #include <gst/codecparsers/gsth264parser.h>
 #include <gst/codecparsers/gstmpegvideoparser.h>
-#include <gst/base/gstbytewriter.h>
+
+#include <math.h>
+
+#define _gst_log2(x) (log(x)/log(2))
 
 /*
  * tsdemux
@@ -230,12 +235,13 @@
       "mute = (boolean) { FALSE, TRUE }; " \
     "audio/x-ac3; audio/x-eac3;" \
     "audio/x-dts;" \
+    "audio/x-opus;" \
     "audio/x-private-ts-lpcm" \
   )
 
 /* Can also use the subpicture pads for text subtitles? */
 #define SUBPICTURE_CAPS \
-    GST_STATIC_CAPS ("subpicture/x-pgs; subpicture/x-dvd")
+    GST_STATIC_CAPS ("subpicture/x-pgs; subpicture/x-dvd; subpicture/x-dvb")
 
 static GstStaticPadTemplate video_template =
 GST_STATIC_PAD_TEMPLATE ("video_%04x", GST_PAD_SRC,
@@ -276,6 +282,9 @@
 gst_ts_demux_program_started (MpegTSBase * base, MpegTSBaseProgram * program);
 static void
 gst_ts_demux_program_stopped (MpegTSBase * base, MpegTSBaseProgram * program);
+static gboolean
+gst_ts_demux_can_remove_program (MpegTSBase * base,
+    MpegTSBaseProgram * program);
 static void gst_ts_demux_reset (MpegTSBase * base);
 static GstFlowReturn
 gst_ts_demux_push (MpegTSBase * base, MpegTSPacketizerPacket * packet,
@@ -373,6 +382,7 @@
   ts_class->push_event = GST_DEBUG_FUNCPTR (push_event);
   ts_class->program_started = GST_DEBUG_FUNCPTR (gst_ts_demux_program_started);
   ts_class->program_stopped = GST_DEBUG_FUNCPTR (gst_ts_demux_program_stopped);
+  ts_class->can_remove_program = gst_ts_demux_can_remove_program;
   ts_class->stream_added = gst_ts_demux_stream_added;
   ts_class->stream_removed = gst_ts_demux_stream_removed;
   ts_class->seek = GST_DEBUG_FUNCPTR (gst_ts_demux_do_seek);
@@ -1171,7 +1181,7 @@
           GST_MTS_DESC_DVB_SUBTITLING);
       if (desc) {
         GST_LOG ("subtitling");
-        is_private = TRUE;
+        is_subpicture = TRUE;
         caps = gst_caps_new_empty_simple ("subpicture/x-dvb");
         sparse = TRUE;
         break;
@@ -1189,6 +1199,179 @@
           is_audio = TRUE;
           caps = gst_caps_new_empty_simple ("audio/x-smpte-302m");
           break;
+        case DRF_ID_OPUS:
+          desc = mpegts_get_descriptor_from_stream (bstream,
+              GST_MTS_DESC_DVB_EXTENSION);
+          if (desc != NULL && desc->tag_extension == 0x80 && desc->length >= 1) {       /* User defined (provisional Opus) */
+            guint8 channel_config_code;
+            GstByteReader br;
+
+            /* skip tag, length and tag_extension */
+            gst_byte_reader_init (&br, desc->data + 3, desc->length - 1);
+            channel_config_code = gst_byte_reader_get_uint8_unchecked (&br);
+
+            if ((channel_config_code & 0x8f) <= 8) {
+              static const guint8 coupled_stream_counts[9] = {
+                1, 0, 1, 1, 2, 2, 2, 3, 3
+              };
+              static const guint8 channel_map_a[8][8] = {
+                {0},
+                {0, 1},
+                {0, 2, 1},
+                {0, 1, 2, 3},
+                {0, 4, 1, 2, 3},
+                {0, 4, 1, 2, 3, 5},
+                {0, 4, 1, 2, 3, 5, 6},
+                {0, 6, 1, 2, 3, 4, 5, 7},
+              };
+              static const guint8 channel_map_b[8][8] = {
+                {0},
+                {0, 1},
+                {0, 1, 2},
+                {0, 1, 2, 3},
+                {0, 1, 2, 3, 4},
+                {0, 1, 2, 3, 4, 5},
+                {0, 1, 2, 3, 4, 5, 6},
+                {0, 1, 2, 3, 4, 5, 6, 7},
+              };
+
+              gint channels = -1, stream_count, coupled_count, mapping_family;
+              guint8 *channel_mapping = NULL;
+
+              channels = channel_config_code ? (channel_config_code & 0x0f) : 2;
+              if (channel_config_code == 0 || channel_config_code == 0x80) {
+                /* Dual Mono */
+                mapping_family = 255;
+                if (channel_config_code == 0) {
+                  stream_count = 1;
+                  coupled_count = 1;
+                } else {
+                  stream_count = 2;
+                  coupled_count = 0;
+                }
+                channel_mapping = g_new0 (guint8, channels);
+                memcpy (channel_mapping, &channel_map_a[1], channels);
+              } else if (channel_config_code <= 8) {
+                mapping_family = (channels > 2) ? 1 : 0;
+                stream_count =
+                    channel_config_code -
+                    coupled_stream_counts[channel_config_code];
+                coupled_count = coupled_stream_counts[channel_config_code];
+                if (mapping_family != 0) {
+                  channel_mapping = g_new0 (guint8, channels);
+                  memcpy (channel_mapping, &channel_map_a[channels - 1],
+                      channels);
+                }
+              } else if (channel_config_code >= 0x82
+                  && channel_config_code <= 0x88) {
+                mapping_family = 1;
+                stream_count = channels;
+                coupled_count = 0;
+                channel_mapping = g_new0 (guint8, channels);
+                memcpy (channel_mapping, &channel_map_b[channels - 1],
+                    channels);
+              } else if (channel_config_code == 0x81) {
+                if (gst_byte_reader_get_remaining (&br) < 2) {
+                  GST_WARNING_OBJECT (demux,
+                      "Invalid Opus descriptor with extended channel configuration");
+                  channels = -1;
+                  break;
+                }
+
+                channels = gst_byte_reader_get_uint8_unchecked (&br);
+                mapping_family = gst_byte_reader_get_uint8_unchecked (&br);
+
+                /* Overwrite values from above */
+                if (channels == 0) {
+                  GST_WARNING_OBJECT (demux,
+                      "Invalid Opus descriptor with extended channel configuration");
+                  channels = -1;
+                  break;
+                }
+
+                if (mapping_family == 0 && channels <= 2) {
+                  stream_count = channels - coupled_stream_counts[channels];
+                  coupled_count = coupled_stream_counts[channels];
+                } else {
+                  GstBitReader breader;
+                  guint8 stream_count_minus_one, coupled_stream_count;
+                  gint stream_count_minus_one_len, coupled_stream_count_len;
+                  gint channel_mapping_len, i;
+
+                  gst_bit_reader_init (&breader,
+                      gst_byte_reader_get_data_unchecked
+                      (&br, gst_byte_reader_get_remaining
+                          (&br)), gst_byte_reader_get_remaining (&br));
+
+                  stream_count_minus_one_len = ceil (_gst_log2 (channels));
+                  if (!gst_bit_reader_get_bits_uint8 (&breader,
+                          &stream_count_minus_one,
+                          stream_count_minus_one_len)) {
+                    GST_WARNING_OBJECT (demux,
+                        "Invalid Opus descriptor with extended channel configuration");
+                    channels = -1;
+                    break;
+                  }
+
+                  stream_count = stream_count_minus_one + 1;
+                  coupled_stream_count_len =
+                      ceil (_gst_log2 (stream_count_minus_one + 2));
+
+                  if (!gst_bit_reader_get_bits_uint8 (&breader,
+                          &coupled_stream_count, coupled_stream_count_len)) {
+                    GST_WARNING_OBJECT (demux,
+                        "Invalid Opus descriptor with extended channel configuration");
+                    channels = -1;
+                    break;
+                  }
+
+                  coupled_count = coupled_stream_count;
+
+                  channel_mapping_len =
+                      ceil (_gst_log2 (stream_count_minus_one + 1 +
+                          coupled_stream_count + 1));
+                  channel_mapping = g_new0 (guint8, channels);
+                  for (i = 0; i < channels; i++) {
+                    if (!gst_bit_reader_get_bits_uint8 (&breader,
+                            &channel_mapping[i], channel_mapping_len)) {
+                      GST_WARNING_OBJECT (demux,
+                          "Invalid Opus descriptor with extended channel configuration");
+                      break;
+                    }
+                  }
+
+                  /* error above */
+                  if (i != channels) {
+                    channels = -1;
+                    g_free (channel_mapping);
+                    channel_mapping = NULL;
+                    break;
+                  }
+                }
+              } else {
+                g_assert_not_reached ();
+              }
+
+              if (channels != -1) {
+                is_audio = TRUE;
+                template = gst_static_pad_template_get (&audio_template);
+                name = g_strdup_printf ("audio_%04x", bstream->pid);
+
+                caps =
+                    gst_codec_utils_opus_create_caps (48000, channels,
+                    mapping_family, stream_count, coupled_count,
+                    channel_mapping);
+
+                g_free (channel_mapping);
+              }
+            } else {
+              GST_WARNING_OBJECT (demux,
+                  "unexpected channel config code 0x%02x", channel_config_code);
+            }
+          } else {
+            GST_WARNING_OBJECT (demux, "Opus, but no extension descriptor");
+          }
+          break;
         case DRF_ID_HEVC:
           is_video = TRUE;
           caps = gst_caps_new_simple ("video/x-h265",
@@ -1400,8 +1583,7 @@
     gst_pad_set_event_function (pad, gst_ts_demux_srcpad_event);
   }
 
-  if (name)
-    g_free (name);
+  g_free (name);
   if (template)
     gst_object_unref (template);
   if (caps)
@@ -1513,16 +1695,8 @@
     gst_element_add_pad ((GstElement *) tsdemux, stream->pad);
     stream->active = TRUE;
     GST_DEBUG_OBJECT (stream->pad, "done adding pad");
-    /* force sending of pending sticky events which have been stored on the
-     * pad already and which otherwise would only be sent on the first buffer
-     * or serialized event (which means very late in case of subtitle streams),
-     * and playsink waits for stream-start or another serialized event */
-    if (stream->sparse) {
-      GST_DEBUG_OBJECT (stream->pad, "sparse stream, pushing GAP event");
-      gst_pad_push_event (stream->pad, gst_event_new_gap (0, 0));
-    }
   } else if (((MpegTSBaseStream *) stream)->stream_type != 0xff) {
-    GST_WARNING_OBJECT (tsdemux,
+    GST_DEBUG_OBJECT (tsdemux,
         "stream %p (pid 0x%04x, type:0x%02x) has no pad", stream,
         ((MpegTSBaseStream *) stream)->pid,
         ((MpegTSBaseStream *) stream)->stream_type);
@@ -1535,8 +1709,7 @@
 {
   GST_DEBUG ("flushing stream %p", stream);
 
-  if (stream->data)
-    g_free (stream->data);
+  g_free (stream->data);
   stream->data = NULL;
   stream->state = PENDING_PACKET_EMPTY;
   stream->expected_size = 0;
@@ -1583,6 +1756,24 @@
     gst_ts_demux_stream_flush (walk->data, demux, hard);
 }
 
+static gboolean
+gst_ts_demux_can_remove_program (MpegTSBase * base, MpegTSBaseProgram * program)
+{
+  GstTSDemux *demux = GST_TS_DEMUX (base);
+
+  /* If it's our current active program, we return FALSE, we'll deactivate it
+   * ourselves when the next program gets activated */
+  if (demux->program == program) {
+    GST_DEBUG
+        ("Attempting to remove current program, delaying until new program gets activated");
+    demux->previous_program = program;
+    demux->program_number = -1;
+    return FALSE;
+  }
+  return TRUE;
+}
+
+
 static void
 gst_ts_demux_program_started (MpegTSBase * base, MpegTSBaseProgram * program)
 {
@@ -1607,11 +1798,45 @@
       demux->segment_event = NULL;
     }
 
+    /* DRAIN ALL STREAMS FIRST ! */
+    if (demux->previous_program) {
+      GList *tmp;
+      GST_DEBUG_OBJECT (demux, "Draining previous program");
+      for (tmp = demux->previous_program->stream_list; tmp; tmp = tmp->next) {
+        TSDemuxStream *stream = (TSDemuxStream *) tmp->data;
+        if (stream->pad)
+          gst_ts_demux_push_pending_data (demux, stream);
+      }
+    }
+
     /* Add all streams, then fire no-more-pads */
     for (tmp = program->stream_list; tmp; tmp = tmp->next) {
       TSDemuxStream *stream = (TSDemuxStream *) tmp->data;
       activate_pad_for_stream (demux, stream);
     }
+
+    /* If there was a previous program, now is the time to deactivate it
+     * and remove old pads (including pushing EOS) */
+    if (demux->previous_program) {
+      GST_DEBUG ("Deactivating previous program");
+      mpegts_base_deactivate_and_free_program (base, demux->previous_program);
+      demux->previous_program = NULL;
+    }
+    /* If any of the stream is sparse, push a GAP event before anything else
+     * This is done here, and not in activate_pad_for_stream() because pushing
+     * a GAP event *is* considering data, and we want to ensure the (potential)
+     * old pads are all removed before we push any data on the new ones */
+    for (tmp = program->stream_list; tmp; tmp = tmp->next) {
+      TSDemuxStream *stream = (TSDemuxStream *) tmp->data;
+      if (stream->sparse) {
+        /* force sending of pending sticky events which have been stored on the
+         * pad already and which otherwise would only be sent on the first buffer
+         * or serialized event (which means very late in case of subtitle streams),
+         * and playsink waits for stream-start or another serialized event */
+        GST_DEBUG_OBJECT (stream->pad, "sparse stream, pushing GAP event");
+        gst_pad_push_event (stream->pad, gst_event_new_gap (0, 0));
+      }
+    }
     gst_element_no_more_pads ((GstElement *) demux);
   }
 }
@@ -2132,14 +2357,106 @@
   }
 }
 
+static GstBufferList *
+parse_opus_access_unit (TSDemuxStream * stream)
+{
+  GstByteReader reader;
+  GstBufferList *buffer_list = NULL;
+
+  buffer_list = gst_buffer_list_new ();
+  gst_byte_reader_init (&reader, stream->data, stream->current_size);
+
+  do {
+    GstBuffer *buffer;
+    guint16 id;
+    guint au_size = 0;
+    guint8 b;
+    gboolean start_trim_flag, end_trim_flag, control_extension_flag;
+    guint16 start_trim = 0, end_trim = 0;
+    guint8 *packet_data;
+    guint packet_size;
+
+    if (!gst_byte_reader_get_uint16_be (&reader, &id))
+      goto error;
+
+    /* No control header */
+    if ((id >> 5) != 0x3ff)
+      goto error;
+
+    do {
+      if (!gst_byte_reader_get_uint8 (&reader, &b))
+        goto error;
+      au_size += b;
+    } while (b == 0xff);
+
+    start_trim_flag = (id >> 4) & 0x1;
+    end_trim_flag = (id >> 3) & 0x1;
+    control_extension_flag = (id >> 2) & 0x1;
+
+    if (start_trim_flag) {
+      if (!gst_byte_reader_get_uint16_be (&reader, &start_trim))
+        goto error;
+    }
+
+    if (end_trim_flag) {
+      if (!gst_byte_reader_get_uint16_be (&reader, &end_trim))
+        goto error;
+    }
+
+    if (control_extension_flag) {
+      if (!gst_byte_reader_get_uint8 (&reader, &b))
+        goto error;
+
+      if (!gst_byte_reader_skip (&reader, b))
+        goto error;
+    }
+
+    packet_size = au_size;
+
+    /* FIXME: this should be
+     *   packet_size = au_size - gst_byte_reader_get_pos (&reader);
+     * but ffmpeg and the only available sample stream from obe.tv
+     * are not including the control header size in au_size
+     */
+    if (gst_byte_reader_get_remaining (&reader) < packet_size)
+      goto error;
+    if (!gst_byte_reader_dup_data (&reader, packet_size, &packet_data))
+      goto error;
+
+    buffer = gst_buffer_new_wrapped (packet_data, packet_size);
+
+    if (start_trim != 0 || end_trim != 0) {
+      gst_buffer_add_audio_clipping_meta (buffer, GST_FORMAT_DEFAULT,
+          start_trim, end_trim);
+    }
+
+    gst_buffer_list_add (buffer_list, buffer);
+  } while (gst_byte_reader_get_remaining (&reader) > 0);
+
+  g_free (stream->data);
+  stream->data = NULL;
+  stream->current_size = 0;
+
+  return buffer_list;
+
+error:
+  {
+    GST_ERROR ("Failed to parse Opus access unit");
+    g_free (stream->data);
+    stream->data = NULL;
+    stream->current_size = 0;
+    gst_buffer_list_unref (buffer_list);
+    return NULL;
+  }
+}
+
 static GstFlowReturn
 gst_ts_demux_push_pending_data (GstTSDemux * demux, TSDemuxStream * stream)
 {
   GstFlowReturn res = GST_FLOW_OK;
-#ifndef GST_DISABLE_GST_DEBUG
   MpegTSBaseStream *bs = (MpegTSBaseStream *) stream;
-#endif
   GstBuffer *buffer = NULL;
+  GstBufferList *buffer_list = NULL;
 
   GST_DEBUG_OBJECT (stream->pad,
       "stream:%p, pid:0x%04x stream_type:%d state:%d", stream, bs->pid,
@@ -2174,7 +2491,24 @@
       GST_DEBUG_OBJECT (stream->pad,
           "Got Keyframe, ready to go at %" GST_TIME_FORMAT,
           GST_TIME_ARGS (stream->pts));
-      buffer = gst_buffer_new_wrapped (stream->data, stream->current_size);
+
+      if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_PRIVATE_PES_PACKETS &&
+          bs->registration_id == DRF_ID_OPUS) {
+        buffer_list = parse_opus_access_unit (stream);
+        if (!buffer_list) {
+          res = GST_FLOW_ERROR;
+          goto beach;
+        }
+
+        if (gst_buffer_list_length (buffer_list) == 1) {
+          buffer = gst_buffer_ref (gst_buffer_list_get (buffer_list, 0));
+          gst_buffer_list_unref (buffer_list);
+          buffer_list = NULL;
+        }
+      } else {
+        buffer = gst_buffer_new_wrapped (stream->data, stream->current_size);
+      }
+
       stream->seeked_pts = stream->pts;
       stream->seeked_dts = stream->dts;
       stream->needs_keyframe = FALSE;
@@ -2192,15 +2526,45 @@
       goto beach;
     }
   } else {
-    buffer = gst_buffer_new_wrapped (stream->data, stream->current_size);
+    if (bs->stream_type == GST_MPEGTS_STREAM_TYPE_PRIVATE_PES_PACKETS &&
+        bs->registration_id == DRF_ID_OPUS) {
+      buffer_list = parse_opus_access_unit (stream);
+      if (!buffer_list) {
+        res = GST_FLOW_ERROR;
+        goto beach;
+      }
+
+      if (gst_buffer_list_length (buffer_list) == 1) {
+        buffer = gst_buffer_ref (gst_buffer_list_get (buffer_list, 0));
+        gst_buffer_list_unref (buffer_list);
+        buffer_list = NULL;
+      }
+    } else {
+      buffer = gst_buffer_new_wrapped (stream->data, stream->current_size);
+    }
 
     if (G_UNLIKELY (stream->pending_ts && !check_pending_buffers (demux))) {
-      PendingBuffer *pend;
-      pend = g_slice_new0 (PendingBuffer);
-      pend->buffer = buffer;
-      pend->pts = stream->raw_pts;
-      pend->dts = stream->raw_dts;
-      stream->pending = g_list_append (stream->pending, pend);
+      if (buffer) {
+        PendingBuffer *pend;
+        pend = g_slice_new0 (PendingBuffer);
+        pend->buffer = buffer;
+        pend->pts = stream->raw_pts;
+        pend->dts = stream->raw_dts;
+        stream->pending = g_list_append (stream->pending, pend);
+      } else {
+        guint i, n;
+
+        n = gst_buffer_list_length (buffer_list);
+        for (i = 0; i < n; i++) {
+          PendingBuffer *pend;
+          pend = g_slice_new0 (PendingBuffer);
+          pend->buffer = gst_buffer_ref (gst_buffer_list_get (buffer_list, i));
+          pend->pts = i == 0 ? stream->raw_pts : -1;
+          pend->dts = i == 0 ? stream->raw_dts : -1;
+          stream->pending = g_list_append (stream->pending, pend);
+        }
+        gst_buffer_list_unref (buffer_list);
+      }
       GST_DEBUG ("Not enough information to push buffers yet, storing buffer");
       goto beach;
     }
@@ -2242,34 +2606,52 @@
         "(seeked PTS: %" GST_TIME_FORMAT " DTS: %" GST_TIME_FORMAT ")",
         GST_TIME_ARGS (stream->pts), GST_TIME_ARGS (stream->dts),
         GST_TIME_ARGS (stream->seeked_pts), GST_TIME_ARGS (stream->seeked_dts));
-    gst_buffer_unref (buffer);
+    if (buffer)
+      gst_buffer_unref (buffer);
+    if (buffer_list)
+      gst_buffer_list_unref (buffer_list);
     goto beach;
   }
 
   GST_DEBUG_OBJECT (stream->pad, "stream->pts %" GST_TIME_FORMAT,
       GST_TIME_ARGS (stream->pts));
+
+  /* Decorate buffer or first buffer of the buffer list */
+  if (buffer_list)
+    buffer = gst_buffer_list_get (buffer_list, 0);
+
   if (GST_CLOCK_TIME_IS_VALID (stream->pts))
     GST_BUFFER_PTS (buffer) = stream->pts;
   if (GST_CLOCK_TIME_IS_VALID (stream->dts))
     GST_BUFFER_DTS (buffer) = stream->dts;
 
-  GST_DEBUG_OBJECT (stream->pad,
-      "Pushing buffer with PTS: %" GST_TIME_FORMAT " , DTS: %" GST_TIME_FORMAT,
-      GST_TIME_ARGS (GST_BUFFER_PTS (buffer)),
-      GST_TIME_ARGS (GST_BUFFER_DTS (buffer)));
-
   if (stream->discont)
     GST_BUFFER_FLAG_SET (buffer, GST_BUFFER_FLAG_DISCONT);
   stream->discont = FALSE;
 
-  if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_DTS (buffer)))
-    demux->segment.position = GST_BUFFER_DTS (buffer);
-  else if (GST_CLOCK_TIME_IS_VALID (GST_BUFFER_PTS (buffer)))
-    demux->segment.position = GST_BUFFER_PTS (buffer);
+  if (buffer_list)
+    buffer = NULL;
 
-  res = gst_pad_push (stream->pad, buffer);
-  /* Record that a buffer was pushed */
-  stream->nb_out_buffers += 1;
+  GST_DEBUG_OBJECT (stream->pad,
+      "Pushing buffer%s with PTS: %" GST_TIME_FORMAT " , DTS: %"
+      GST_TIME_FORMAT, (buffer_list ? "list" : ""), GST_TIME_ARGS (stream->pts),
+      GST_TIME_ARGS (stream->dts));
+
+  if (GST_CLOCK_TIME_IS_VALID (stream->dts))
+    demux->segment.position = stream->dts;
+  else if (GST_CLOCK_TIME_IS_VALID (stream->pts))
+    demux->segment.position = stream->pts;
+
+  if (buffer) {
+    res = gst_pad_push (stream->pad, buffer);
+    /* Record that a buffer was pushed */
+    stream->nb_out_buffers += 1;
+  } else {
+    guint n = gst_buffer_list_length (buffer_list);
+    res = gst_pad_push_list (stream->pad, buffer_list);
+    /* Record that a buffer was pushed */
+    stream->nb_out_buffers += n;
+  }
   GST_DEBUG_OBJECT (stream->pad, "Returned %s", gst_flow_get_name (res));
   res = gst_flow_combiner_update_flow (demux->flowcombiner, res);
   GST_DEBUG_OBJECT (stream->pad, "combined %s", gst_flow_get_name (res));
diff --git a/gst/mpegtsdemux/tsdemux.h b/gst/mpegtsdemux/tsdemux.h
index b689412..b416733 100644
--- a/gst/mpegtsdemux/tsdemux.h
+++ b/gst/mpegtsdemux/tsdemux.h
@@ -65,6 +65,8 @@
 
   /*< private >*/
   MpegTSBaseProgram *program;	/* Current program */
+  MpegTSBaseProgram *previous_program; /* Previous program, to deactivate once
+					* the new program becomes active */
 
   /* segments to be sent */
   GstSegment segment;
diff --git a/gst/mpegtsmux/Makefile.am b/gst/mpegtsmux/Makefile.am
index 8e3cdba..0fa78d7 100644
--- a/gst/mpegtsmux/Makefile.am
+++ b/gst/mpegtsmux/Makefile.am
@@ -5,17 +5,21 @@
 libgstmpegtsmux_la_SOURCES = \
 	mpegtsmux.c \
 	mpegtsmux_aac.c \
-	mpegtsmux_ttxt.c
+	mpegtsmux_ttxt.c \
+	mpegtsmux_opus.c
 
 libgstmpegtsmux_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
 			    $(GST_BASE_CFLAGS) $(GST_CFLAGS)
 libgstmpegtsmux_la_LIBADD = $(top_builddir)/gst/mpegtsmux/tsmux/libtsmux.la \
-	-lgsttag-@GST_API_VERSION@ \
-	$(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_API_VERSION@ $(GST_BASE_LIBS) $(GST_LIBS)
+	$(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_API_VERSION@ \
+	-lgstaudio-@GST_API_VERSION@ -lgsttag-@GST_API_VERSION@ \
+	-lgstpbutils-@GST_API_VERSION@ \
+	$(GST_BASE_LIBS) $(GST_LIBS)
 libgstmpegtsmux_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
 libgstmpegtsmux_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
 
 noinst_HEADERS = \
 	mpegtsmux.h \
 	mpegtsmux_aac.h \
-	mpegtsmux_ttxt.h
+	mpegtsmux_ttxt.h \
+	mpegtsmux_opus.h
diff --git a/gst/mpegtsmux/Makefile.in b/gst/mpegtsmux/Makefile.in
index 47f5ddc..671a23a 100644
--- a/gst/mpegtsmux/Makefile.in
+++ b/gst/mpegtsmux/Makefile.in
@@ -170,7 +170,8 @@
 	$(am__DEPENDENCIES_1)
 am_libgstmpegtsmux_la_OBJECTS = libgstmpegtsmux_la-mpegtsmux.lo \
 	libgstmpegtsmux_la-mpegtsmux_aac.lo \
-	libgstmpegtsmux_la-mpegtsmux_ttxt.lo
+	libgstmpegtsmux_la-mpegtsmux_ttxt.lo \
+	libgstmpegtsmux_la-mpegtsmux_opus.lo
 libgstmpegtsmux_la_OBJECTS = $(am_libgstmpegtsmux_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
@@ -320,6 +321,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -357,6 +360,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -384,6 +389,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -402,6 +409,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -412,6 +421,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -437,6 +448,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -462,6 +475,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -593,6 +608,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -650,8 +667,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -721,6 +742,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -812,21 +834,25 @@
 libgstmpegtsmux_la_SOURCES = \
 	mpegtsmux.c \
 	mpegtsmux_aac.c \
-	mpegtsmux_ttxt.c
+	mpegtsmux_ttxt.c \
+	mpegtsmux_opus.c
 
 libgstmpegtsmux_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
 			    $(GST_BASE_CFLAGS) $(GST_CFLAGS)
 
 libgstmpegtsmux_la_LIBADD = $(top_builddir)/gst/mpegtsmux/tsmux/libtsmux.la \
-	-lgsttag-@GST_API_VERSION@ \
-	$(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_API_VERSION@ $(GST_BASE_LIBS) $(GST_LIBS)
+	$(GST_PLUGINS_BASE_LIBS) -lgstvideo-@GST_API_VERSION@ \
+	-lgstaudio-@GST_API_VERSION@ -lgsttag-@GST_API_VERSION@ \
+	-lgstpbutils-@GST_API_VERSION@ \
+	$(GST_BASE_LIBS) $(GST_LIBS)
 
 libgstmpegtsmux_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
 libgstmpegtsmux_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
 noinst_HEADERS = \
 	mpegtsmux.h \
 	mpegtsmux_aac.h \
-	mpegtsmux_ttxt.h
+	mpegtsmux_ttxt.h \
+	mpegtsmux_opus.h
 
 all: all-recursive
 
@@ -908,6 +934,7 @@
 
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmpegtsmux_la-mpegtsmux.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmpegtsmux_la-mpegtsmux_aac.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmpegtsmux_la-mpegtsmux_opus.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstmpegtsmux_la-mpegtsmux_ttxt.Plo@am__quote@
 
 .c.o:
@@ -955,6 +982,13 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmpegtsmux_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmpegtsmux_la_CFLAGS) $(CFLAGS) -c -o libgstmpegtsmux_la-mpegtsmux_ttxt.lo `test -f 'mpegtsmux_ttxt.c' || echo '$(srcdir)/'`mpegtsmux_ttxt.c
 
+libgstmpegtsmux_la-mpegtsmux_opus.lo: mpegtsmux_opus.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmpegtsmux_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmpegtsmux_la_CFLAGS) $(CFLAGS) -MT libgstmpegtsmux_la-mpegtsmux_opus.lo -MD -MP -MF $(DEPDIR)/libgstmpegtsmux_la-mpegtsmux_opus.Tpo -c -o libgstmpegtsmux_la-mpegtsmux_opus.lo `test -f 'mpegtsmux_opus.c' || echo '$(srcdir)/'`mpegtsmux_opus.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstmpegtsmux_la-mpegtsmux_opus.Tpo $(DEPDIR)/libgstmpegtsmux_la-mpegtsmux_opus.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='mpegtsmux_opus.c' object='libgstmpegtsmux_la-mpegtsmux_opus.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstmpegtsmux_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstmpegtsmux_la_CFLAGS) $(CFLAGS) -c -o libgstmpegtsmux_la-mpegtsmux_opus.lo `test -f 'mpegtsmux_opus.c' || echo '$(srcdir)/'`mpegtsmux_opus.c
+
 mostlyclean-libtool:
 	-rm -f *.lo
 
diff --git a/gst/mpegtsmux/mpegtsmux.c b/gst/mpegtsmux/mpegtsmux.c
index ce00333..1d208a7 100644
--- a/gst/mpegtsmux/mpegtsmux.c
+++ b/gst/mpegtsmux/mpegtsmux.c
@@ -91,11 +91,13 @@
 #include <gst/tag/tag.h>
 #include <gst/video/video.h>
 #include <gst/mpegts/mpegts.h>
+#include <gst/pbutils/pbutils.h>
 
 #include "mpegtsmux.h"
 
 #include "mpegtsmux_aac.h"
 #include "mpegtsmux_ttxt.h"
+#include "mpegtsmux_opus.h"
 
 GST_DEBUG_CATEGORY (mpegtsmux_debug);
 #define GST_CAT_DEFAULT mpegtsmux_debug
@@ -142,6 +144,9 @@
         "mute = (boolean) { FALSE, TRUE }; "
         "audio/x-ac3, framed = (boolean) TRUE;"
         "audio/x-dts, framed = (boolean) TRUE;"
+        "audio/x-opus, "
+        "channels = (int) [1, 8], "
+        "channel-mapping-family = (int) {0, 1};"
         "subpicture/x-dvb; application/x-teletext; meta/x-klv, parsed=true"));
 
 static GstStaticPadTemplate mpegtsmux_src_factory =
@@ -580,6 +585,7 @@
   const gchar *mt;
   const GValue *value = NULL;
   GstBuffer *codec_data = NULL;
+  guint8 opus_channel_config_code = 0;
 
   pad = ts_data->collect.pad;
   caps = gst_pad_get_current_caps (pad);
@@ -667,6 +673,66 @@
     st = TSMUX_ST_PS_TELETEXT;
     /* needs a particularly sized layout */
     ts_data->prepare_func = mpegtsmux_prepare_teletext;
+  } else if (strcmp (mt, "audio/x-opus") == 0) {
+    guint8 channels, mapping_family, stream_count, coupled_count;
+    guint8 channel_mapping[256];
+
+    if (!gst_codec_utils_opus_parse_caps (caps, NULL, &channels,
+            &mapping_family, &stream_count, &coupled_count, channel_mapping)) {
+      GST_ERROR_OBJECT (pad, "Incomplete Opus caps");
+      goto not_negotiated;
+    }
+
+    if (channels <= 2 && mapping_family == 0) {
+      opus_channel_config_code = channels;
+    } else if (channels == 2 && mapping_family == 255 && stream_count == 1
+        && coupled_count == 1) {
+      /* Dual mono */
+      opus_channel_config_code = 0;
+    } else if (channels >= 2 && channels <= 8 && mapping_family == 1) {
+      static const guint8 coupled_stream_counts[9] = {
+        1, 0, 1, 1, 2, 2, 2, 3, 3
+      };
+      static const guint8 channel_map_a[8][8] = {
+        {0},
+        {0, 1},
+        {0, 2, 1},
+        {0, 1, 2, 3},
+        {0, 4, 1, 2, 3},
+        {0, 4, 1, 2, 3, 5},
+        {0, 4, 1, 2, 3, 5, 6},
+        {0, 6, 1, 2, 3, 4, 5, 7},
+      };
+      static const guint8 channel_map_b[8][8] = {
+        {0},
+        {0, 1},
+        {0, 1, 2},
+        {0, 1, 2, 3},
+        {0, 1, 2, 3, 4},
+        {0, 1, 2, 3, 4, 5},
+        {0, 1, 2, 3, 4, 5, 6},
+        {0, 1, 2, 3, 4, 5, 6, 7},
+      };
+
+      /* Vorbis mapping */
+      if (stream_count == channels - coupled_stream_counts[channels] &&
+          coupled_count == coupled_stream_counts[channels] &&
+          memcmp (channel_mapping, channel_map_a[channels - 1],
+              channels) == 0) {
+        opus_channel_config_code = channels;
+      } else if (stream_count == channels - coupled_stream_counts[channels] &&
+          coupled_count == coupled_stream_counts[channels] &&
+          memcmp (channel_mapping, channel_map_b[channels - 1],
+              channels) == 0) {
+        opus_channel_config_code = channels | 0x80;
+      } else {
+        GST_FIXME_OBJECT (pad, "Opus channel mapping not handled");
+        goto not_negotiated;
+      }
+    }
+
+    st = TSMUX_ST_PS_OPUS;
+    ts_data->prepare_func = mpegtsmux_prepare_opus;
   } else if (strcmp (mt, "meta/x-klv") == 0) {
     st = TSMUX_ST_PS_KLV;
   }
@@ -683,6 +749,8 @@
     gst_structure_get_int (s, "channels", &ts_data->stream->audio_channels);
     gst_structure_get_int (s, "bitrate", &ts_data->stream->audio_bitrate);
 
+    ts_data->stream->opus_channel_config_code = opus_channel_config_code;
+
     tsmux_stream_set_buffer_release_func (ts_data->stream, release_buffer_cb);
     tsmux_program_add_stream (ts_data->prog, ts_data->stream);
 
@@ -1097,15 +1165,6 @@
     pad_data->dts = GST_CLOCK_STIME_NONE;
   }
 
-  buf = *outbuf;
-  if (pad_data->prepare_func) {
-    MpegTsMux *mux = (MpegTsMux *) user_data;
-
-    *outbuf = pad_data->prepare_func (buf, pad_data, mux);
-    g_assert (*outbuf);
-    gst_buffer_unref (buf);
-  }
-
 beach:
   return GST_FLOW_OK;
 }
@@ -1126,8 +1185,11 @@
 
   if (G_UNLIKELY (mux->first)) {
     ret = mpegtsmux_create_streams (mux);
-    if (G_UNLIKELY (ret != GST_FLOW_OK))
+    if (G_UNLIKELY (ret != GST_FLOW_OK)) {
+      if (buf)
+        gst_buffer_unref (buf);
       return ret;
+    }
 
     mpegtsmux_prepare_srcpad (mux);
 
@@ -1142,6 +1204,9 @@
     mpegtsmux_push_packets (mux, TRUE);
     gst_pad_push_event (mux->srcpad, gst_event_new_eos ());
 
+    if (buf)
+      gst_buffer_unref (buf);
+
     return GST_FLOW_OK;
   }
 
@@ -1151,6 +1216,15 @@
 
   g_assert (buf != NULL);
 
+  if (best->prepare_func) {
+    GstBuffer *tmp;
+
+    tmp = best->prepare_func (buf, best, mux);
+    g_assert (tmp);
+    gst_buffer_unref (buf);
+    buf = tmp;
+  }
+
   if (mux->force_key_unit_event != NULL && best->stream->is_video_stream) {
     GstEvent *event;
 
@@ -1207,9 +1281,8 @@
 
   if (GST_CLOCK_STIME_IS_VALID (best->dts)) {
     dts = GSTTIME_TO_MPEGTIME (best->dts);
-    GST_DEBUG_OBJECT (mux, "Buffer has DTS %s%" GST_TIME_FORMAT " dts %"
-        G_GINT64_FORMAT, best->dts >= 0 ? " " : "-",
-        GST_TIME_ARGS (ABS (best->dts)), dts);
+    GST_DEBUG_OBJECT (mux, "Buffer has DTS %" GST_STIME_FORMAT " dts %"
+        G_GINT64_FORMAT, GST_STIME_ARGS (best->dts), dts);
   }
 
   /* should not have a DTS without PTS */
@@ -1235,6 +1308,8 @@
 
   if (best->stream->is_meta && gst_buffer_get_size (buf) > (G_MAXUINT16 - 3)) {
     GST_WARNING_OBJECT (mux, "KLV meta unit too big, splitting not supported");
+
+    gst_buffer_unref (buf);
     return GST_FLOW_OK;
   }
 
@@ -1274,6 +1349,8 @@
   }
 no_program:
   {
+    if (buf)
+      gst_buffer_unref (buf);
     GST_ELEMENT_ERROR (mux, STREAM, MUX,
         ("Stream on pad %" GST_PTR_FORMAT
             " is not associated with any program", COLLECT_DATA_PAD (best)),
diff --git a/gst/mpegtsmux/mpegtsmux_opus.c b/gst/mpegtsmux/mpegtsmux_opus.c
new file mode 100644
index 0000000..26176b2
--- /dev/null
+++ b/gst/mpegtsmux/mpegtsmux_opus.c
@@ -0,0 +1,149 @@
+/* 
+ * Copyright 2006, 2007, 2008 Fluendo S.A. 
+ *  Authors: Jan Schmidt <jan@fluendo.com>
+ *           Kapil Agrawal <kapil@fluendo.com>
+ *           Julien Moutte <julien@fluendo.com>
+ *
+ * This library is licensed under 4 different licenses and you
+ * can choose to use it under the terms of any one of them. The
+ * four licenses are the MPL 1.1, the LGPL, the GPL and the MIT
+ * license.
+ *
+ * MPL:
+ * 
+ * The contents of this file are subject to the Mozilla Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/.
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ *
+ * LGPL:
+ *
+ * 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.
+ *
+ * GPL:
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * MIT:
+ *
+ * Unless otherwise indicated, Source Code is licensed under MIT license.
+ * See further explanation attached in License Statement (distributed in the file
+ * LICENSE).
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is furnished to do
+ * so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "mpegtsmux_opus.h"
+#include <string.h>
+#include <gst/audio/audio.h>
+
+#define GST_CAT_DEFAULT mpegtsmux_debug
+
+GstBuffer *
+mpegtsmux_prepare_opus (GstBuffer * buf, MpegTsPadData * pad_data,
+    MpegTsMux * mux)
+{
+  gssize insize = gst_buffer_get_size (buf);
+  gsize outsize;
+  GstBuffer *outbuf;
+  GstMapInfo map;
+  guint n;
+  GstAudioClippingMeta *cmeta = gst_buffer_get_audio_clipping_meta (buf);
+
+  g_assert (!cmeta || cmeta->format == GST_FORMAT_DEFAULT);
+
+  outsize = 2 + insize / 255 + 1;
+  if (cmeta && cmeta->start)
+    outsize += 2;
+  if (cmeta && cmeta->end)
+    outsize += 2;
+
+  outbuf = gst_buffer_new_and_alloc (outsize);
+  gst_buffer_copy_into (outbuf, buf,
+      GST_BUFFER_COPY_METADATA | GST_BUFFER_COPY_TIMESTAMPS, 0, 0);
+  gst_buffer_map (outbuf, &map, GST_MAP_WRITE);
+  map.data[0] = 0x7f;
+  map.data[1] = 0xe0;
+
+  if (cmeta && cmeta->start)
+    map.data[1] |= 0x10;
+  if (cmeta && cmeta->end)
+    map.data[1] |= 0x08;
+
+  n = 2;
+  do {
+    g_assert (n < outsize);
+    /* FIXME: this should be using insize for writing here but ffmpeg and the
+     * only available sample stream from obe.tv are not including the control
+     * header size in au_size
+     */
+    map.data[n] = MIN (insize, 255);
+    insize -= 255;
+    n++;
+  } while (insize >= 0);
+
+  if (cmeta && cmeta->start) {
+    GST_WRITE_UINT16_BE (&map.data[n], cmeta->start);
+    n += 2;
+  }
+
+  if (cmeta && cmeta->end)
+    GST_WRITE_UINT16_BE (&map.data[n], cmeta->end);
+
+  gst_buffer_unmap (outbuf, &map);
+
+  outbuf = gst_buffer_append (outbuf, gst_buffer_ref (buf));
+
+  return outbuf;
+}
diff --git a/gst/mpegtsmux/mpegtsmux_opus.h b/gst/mpegtsmux/mpegtsmux_opus.h
new file mode 100644
index 0000000..fdf25d8
--- /dev/null
+++ b/gst/mpegtsmux/mpegtsmux_opus.h
@@ -0,0 +1,91 @@
+/* 
+ * Copyright 2006, 2007, 2008 Fluendo S.A. 
+ *  Authors: Jan Schmidt <jan@fluendo.com>
+ *           Kapil Agrawal <kapil@fluendo.com>
+ *           Julien Moutte <julien@fluendo.com>
+ *
+ * This library is licensed under 4 different licenses and you
+ * can choose to use it under the terms of any one of them. The
+ * four licenses are the MPL 1.1, the LGPL, the GPL and the MIT
+ * license.
+ *
+ * MPL:
+ * 
+ * The contents of this file are subject to the Mozilla Public License
+ * Version 1.1 (the "License"); you may not use this file except in
+ * compliance with the License. You may obtain a copy of the License at
+ * http://www.mozilla.org/MPL/.
+ *
+ * Software distributed under the License is distributed on an "AS IS"
+ * basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
+ * License for the specific language governing rights and limitations
+ * under the License.
+ *
+ * LGPL:
+ *
+ * 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.
+ *
+ * GPL:
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ * MIT:
+ *
+ * Unless otherwise indicated, Source Code is licensed under MIT license.
+ * See further explanation attached in License Statement (distributed in the file
+ * LICENSE).
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a copy of
+ * this software and associated documentation files (the "Software"), to deal in
+ * the Software without restriction, including without limitation the rights to
+ * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
+ * of the Software, and to permit persons to whom the Software is furnished to do
+ * so, subject to the following conditions:
+ * 
+ * The above copyright notice and this permission notice shall be included in all
+ * copies or substantial portions of the Software.
+ * 
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+ * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+ * SOFTWARE.
+ *
+ */
+ 
+#ifndef __MPEGTSMUX_OPUS_H__
+#define __MPEGTSMUX_OPUS_H__
+ 
+#include "mpegtsmux.h"
+
+GstBuffer * mpegtsmux_prepare_opus (GstBuffer * buf, MpegTsPadData * data,
+    MpegTsMux * mux);
+ 
+#endif /* __MPEGTSMUX_OPUS_H__ */
diff --git a/gst/mpegtsmux/tsmux/Makefile.in b/gst/mpegtsmux/tsmux/Makefile.in
index ca34a8d..ace58fb 100644
--- a/gst/mpegtsmux/tsmux/Makefile.in
+++ b/gst/mpegtsmux/tsmux/Makefile.in
@@ -246,6 +246,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -283,6 +285,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -310,6 +314,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -328,6 +334,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -338,6 +346,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -363,6 +373,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -388,6 +400,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -519,6 +533,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -576,8 +592,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -647,6 +667,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/mpegtsmux/tsmux/tsmux.c b/gst/mpegtsmux/tsmux/tsmux.c
index 293aed9..00e1203 100644
--- a/gst/mpegtsmux/tsmux/tsmux.c
+++ b/gst/mpegtsmux/tsmux/tsmux.c
@@ -934,8 +934,7 @@
   return TRUE;
 
 fail:
-  if (packet)
-    g_free (packet);
+  g_free (packet);
   if (section_buffer)
     gst_buffer_unref (section_buffer);
   return FALSE;
diff --git a/gst/mpegtsmux/tsmux/tsmuxstream.c b/gst/mpegtsmux/tsmux/tsmuxstream.c
index 1094c3e..31fd196 100644
--- a/gst/mpegtsmux/tsmux/tsmuxstream.c
+++ b/gst/mpegtsmux/tsmux/tsmuxstream.c
@@ -200,6 +200,13 @@
           TSMUX_PACKET_FLAG_PES_FULL_HEADER |
           TSMUX_PACKET_FLAG_PES_DATA_ALIGNMENT;
       break;
+    case TSMUX_ST_PS_OPUS:
+      /* FIXME: assign sequential extended IDs? */
+      stream->id = 0xBD;
+      stream->stream_type = TSMUX_ST_PRIVATE_DATA;
+      stream->is_opus = TRUE;
+      stream->pi.flags |= TSMUX_PACKET_FLAG_PES_FULL_HEADER;
+      break;
     default:
       g_critical ("Stream type 0x%0x not yet implemented", stream_type);
       break;
@@ -910,9 +917,20 @@
         g_ptr_array_add (pmt_stream->descriptors, descriptor);
         break;
       }
+      if (stream->is_opus) {
+        descriptor = gst_mpegts_descriptor_from_registration ("Opus", NULL, 0);
+        g_ptr_array_add (pmt_stream->descriptors, descriptor);
+
+        descriptor =
+            gst_mpegts_descriptor_from_custom_with_extension
+            (GST_MTS_DESC_DVB_EXTENSION, 0x80,
+            &stream->opus_channel_config_code, 1);
+
+        g_ptr_array_add (pmt_stream->descriptors, descriptor);
+      }
       if (stream->is_meta) {
         descriptor = gst_mpegts_descriptor_from_registration ("KLVA", NULL, 0);
-        GST_ERROR ("adding KLVA registration descriptor!");
+        GST_DEBUG ("adding KLVA registration descriptor");
         g_ptr_array_add (pmt_stream->descriptors, descriptor);
       }
     default:
diff --git a/gst/mpegtsmux/tsmux/tsmuxstream.h b/gst/mpegtsmux/tsmux/tsmuxstream.h
index c355ae2..26fe207 100644
--- a/gst/mpegtsmux/tsmux/tsmuxstream.h
+++ b/gst/mpegtsmux/tsmux/tsmuxstream.h
@@ -141,6 +141,7 @@
   TSMUX_ST_PS_DVB_SUBPICTURE          = 0x8c,
   TSMUX_ST_PS_TELETEXT                = 0x8d,
   TSMUX_ST_PS_KLV                     = 0x8e,    /* only used internally */
+  TSMUX_ST_PS_OPUS                    = 0x8f,    /* only used internally */
   TSMUX_ST_PS_DVD_SUBPICTURE          = 0xff,
 
   /* Non-standard definitions */
@@ -209,6 +210,10 @@
   gchar language[4];
 
   gboolean is_meta;
+
+  /* Opus */
+  gboolean is_opus;
+  guint8 opus_channel_config_code;
 };
 
 /* stream management */
diff --git a/gst/mve/Makefile.in b/gst/mve/Makefile.in
index aa254cb..ff46b84 100644
--- a/gst/mve/Makefile.in
+++ b/gst/mve/Makefile.in
@@ -278,6 +278,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -315,6 +317,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -342,6 +346,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -360,6 +366,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -370,6 +378,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -395,6 +405,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -420,6 +432,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -551,6 +565,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -608,8 +624,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -679,6 +699,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/mve/gstmvemux.c b/gst/mve/gstmvemux.c
index 043211c..a7a32cb 100644
--- a/gst/mve/gstmvemux.c
+++ b/gst/mve/gstmvemux.c
@@ -18,7 +18,7 @@
  */
 
 /*
-gst-launch-0.10 filesrc location=movie.mve ! mvedemux name=d !
+gst-launch-1.0 filesrc location=movie.mve ! mvedemux name=d !
     video/x-raw-rgb ! mvemux quick=true name=m !
     filesink location=test.mve d. ! audio/x-raw-int ! m.
 */
diff --git a/gst/mxf/Makefile.am b/gst/mxf/Makefile.am
index 6ec4a78..2d87907 100644
--- a/gst/mxf/Makefile.am
+++ b/gst/mxf/Makefile.am
@@ -19,10 +19,19 @@
 	mxfvc3.c \
 	mxfdms1.c
 
-libgstmxf_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS)
-libgstmxf_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) \
+libgstmxf_la_CFLAGS = \
+	-I$(top_srcdir)/gst-libs \
+	-I$(top_builddir)/gst-libs \
+	$(GST_PLUGINS_BASE_CFLAGS) \
+	$(GST_BASE_CFLAGS) \
+	$(GST_CFLAGS)
+libgstmxf_la_LIBADD = \
+	$(top_builddir)/gst-libs/gst/base/libgstbadbase-$(GST_API_VERSION).la \
+	$(GST_PLUGINS_BASE_LIBS) \
 	-lgstvideo-@GST_API_VERSION@ \
-	-lgstaudio-@GST_API_VERSION@
+	-lgstaudio-@GST_API_VERSION@ \
+	$(GST_BASE_LIBS) \
+	$(GST_LIBS)
 libgstmxf_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
 libgstmxf_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
 
diff --git a/gst/mxf/Makefile.in b/gst/mxf/Makefile.in
index fd85115..af2151a 100644
--- a/gst/mxf/Makefile.in
+++ b/gst/mxf/Makefile.in
@@ -164,8 +164,9 @@
 am__installdirs = "$(DESTDIR)$(plugindir)"
 LTLIBRARIES = $(plugin_LTLIBRARIES)
 am__DEPENDENCIES_1 =
-libgstmxf_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
+libgstmxf_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/base/libgstbadbase-$(GST_API_VERSION).la \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1)
 am_libgstmxf_la_OBJECTS = libgstmxf_la-mxf.lo libgstmxf_la-mxful.lo \
 	libgstmxf_la-mxftypes.lo libgstmxf_la-mxfmetadata.lo \
 	libgstmxf_la-mxfessence.lo libgstmxf_la-mxfquark.lo \
@@ -282,6 +283,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -319,6 +322,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -346,6 +351,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -364,6 +371,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -374,6 +383,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -399,6 +410,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -424,6 +437,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -555,6 +570,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -612,8 +629,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -683,6 +704,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -789,10 +811,20 @@
 	mxfvc3.c \
 	mxfdms1.c
 
-libgstmxf_la_CFLAGS = $(GST_CFLAGS) $(GST_BASE_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS)
-libgstmxf_la_LIBADD = $(GST_LIBS) $(GST_BASE_LIBS) $(GST_PLUGINS_BASE_LIBS) \
+libgstmxf_la_CFLAGS = \
+	-I$(top_srcdir)/gst-libs \
+	-I$(top_builddir)/gst-libs \
+	$(GST_PLUGINS_BASE_CFLAGS) \
+	$(GST_BASE_CFLAGS) \
+	$(GST_CFLAGS)
+
+libgstmxf_la_LIBADD = \
+	$(top_builddir)/gst-libs/gst/base/libgstbadbase-$(GST_API_VERSION).la \
+	$(GST_PLUGINS_BASE_LIBS) \
 	-lgstvideo-@GST_API_VERSION@ \
-	-lgstaudio-@GST_API_VERSION@
+	-lgstaudio-@GST_API_VERSION@ \
+	$(GST_BASE_LIBS) \
+	$(GST_LIBS)
 
 libgstmxf_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
 libgstmxf_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
diff --git a/gst/mxf/mxf.c b/gst/mxf/mxf.c
index 6634d18..324462b 100644
--- a/gst/mxf/mxf.c
+++ b/gst/mxf/mxf.c
@@ -71,8 +71,9 @@
 
   /* mxfmux is disabled for now - it compiles but is completely untested */
   if (!gst_element_register (plugin, "mxfdemux", GST_RANK_PRIMARY,
-          GST_TYPE_MXF_DEMUX))
-    /* || !gst_element_register (plugin, "mxfmux", GST_RANK_PRIMARY, GST_TYPE_MXF_MUX)) */
+          GST_TYPE_MXF_DEMUX)
+      || !gst_element_register (plugin, "mxfmux", GST_RANK_PRIMARY,
+          GST_TYPE_MXF_MUX))
     return FALSE;
 
   return TRUE;
diff --git a/gst/mxf/mxfaes-bwf.c b/gst/mxf/mxfaes-bwf.c
index 7649973..633f3af 100644
--- a/gst/mxf/mxfaes-bwf.c
+++ b/gst/mxf/mxfaes-bwf.c
@@ -1266,7 +1266,8 @@
           descriptor->channel_count) / 8;
 
     audio_format =
-        gst_audio_format_build_integer (block_align != 1, G_LITTLE_ENDIAN,
+        gst_audio_format_build_integer (block_align !=
+        descriptor->channel_count, G_LITTLE_ENDIAN,
         (block_align / descriptor->channel_count) * 8,
         (block_align / descriptor->channel_count) * 8);
     ret =
@@ -1297,7 +1298,8 @@
           descriptor->channel_count) / 8;
 
     audio_format =
-        gst_audio_format_build_integer (block_align != 1, G_BIG_ENDIAN,
+        gst_audio_format_build_integer (block_align !=
+        descriptor->channel_count, G_BIG_ENDIAN,
         (block_align / descriptor->channel_count) * 8,
         (block_align / descriptor->channel_count) * 8);
     ret =
@@ -1374,8 +1376,8 @@
         descriptor->channel_count) / 8;
 
   audio_format =
-      gst_audio_format_build_integer (block_align != 1, G_LITTLE_ENDIAN,
-      (block_align / descriptor->channel_count) * 8,
+      gst_audio_format_build_integer (block_align != descriptor->channel_count,
+      G_LITTLE_ENDIAN, (block_align / descriptor->channel_count) * 8,
       (block_align / descriptor->channel_count) * 8);
   ret =
       mxf_metadata_generic_sound_essence_descriptor_create_caps (descriptor,
diff --git a/gst/mxf/mxfdemux.c b/gst/mxf/mxfdemux.c
index e45e49c..f11d604 100644
--- a/gst/mxf/mxfdemux.c
+++ b/gst/mxf/mxfdemux.c
@@ -25,7 +25,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v filesrc location=/path/to/mxf ! mxfdemux ! audioconvert ! autoaudiosink
+ * gst-launch-1.0 -v filesrc location=/path/to/mxf ! mxfdemux ! audioconvert ! autoaudiosink
  * ]| This pipeline demuxes an MXF file and outputs one of the contained raw audio streams.
  * </refsect2>
  */
@@ -78,6 +78,8 @@
 gst_mxf_demux_handle_index_table_segment (GstMXFDemux * demux,
     const MXFUL * key, GstBuffer * buffer, guint64 offset);
 
+static void collect_index_table_segments (GstMXFDemux * demux);
+
 GType gst_mxf_demux_pad_get_type (void);
 G_DEFINE_TYPE (GstMXFDemuxPad, gst_mxf_demux_pad, GST_TYPE_PAD);
 
@@ -277,6 +279,18 @@
     demux->pending_index_table_segments = NULL;
   }
 
+  if (demux->index_tables) {
+    GList *l;
+
+    for (l = demux->index_tables; l; l = l->next) {
+      GstMXFDemuxIndexTable *t = l->data;
+      g_array_free (t->offsets, TRUE);
+      g_free (t);
+    }
+    g_list_free (demux->index_tables);
+    demux->index_tables = NULL;
+  }
+
   demux->index_table_segments_collected = FALSE;
 
   gst_mxf_demux_reset_mxf_state (demux);
@@ -716,6 +730,7 @@
 
         memset (&tmp, 0, sizeof (tmp));
         tmp.body_sid = edata->body_sid;
+        tmp.index_sid = edata->index_sid;
         tmp.track_number = track->parent.track_number;
         tmp.track_id = track->parent.track_id;
         memcpy (&tmp.source_package_uid, &package->parent.package_uid, 32);
@@ -1713,6 +1728,36 @@
   if (outbuf)
     keyframe = !GST_BUFFER_FLAG_IS_SET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT);
 
+  /* Prefer keyframe information from index tables over everything else */
+  if (demux->index_tables && outbuf) {
+    GList *l;
+    GstMXFDemuxIndexTable *index_table = NULL;
+
+    for (l = demux->index_tables; l; l = l->next) {
+      GstMXFDemuxIndexTable *tmp = l->data;
+
+      if (tmp->body_sid == etrack->body_sid
+          && tmp->index_sid == etrack->index_sid) {
+        index_table = tmp;
+        break;
+      }
+    }
+
+    if (index_table && index_table->offsets->len > etrack->position) {
+      GstMXFDemuxIndex *index =
+          &g_array_index (index_table->offsets, GstMXFDemuxIndex,
+          etrack->position);
+      if (index->offset != 0) {
+        keyframe = index->keyframe;
+
+        if (keyframe)
+          GST_BUFFER_FLAG_UNSET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT);
+        else
+          GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DELTA_UNIT);
+      }
+    }
+  }
+
   if (!etrack->offsets)
     etrack->offsets = g_array_new (FALSE, TRUE, sizeof (GstMXFDemuxIndex));
 
@@ -1821,10 +1866,12 @@
 
     GST_DEBUG_OBJECT (demux,
         "Pushing buffer of size %" G_GSIZE_FORMAT " for track %u: timestamp %"
-        GST_TIME_FORMAT " duration %" GST_TIME_FORMAT,
-        gst_buffer_get_size (outbuf), pad->material_track->parent.track_id,
+        GST_TIME_FORMAT " duration %" GST_TIME_FORMAT " position %"
+        G_GUINT64_FORMAT, gst_buffer_get_size (outbuf),
+        pad->material_track->parent.track_id,
         GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (outbuf)),
-        GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)));
+        GST_TIME_ARGS (GST_BUFFER_DURATION (outbuf)),
+        pad->current_essence_track_position);
 
     if (pad->discont) {
       GST_BUFFER_FLAG_SET (outbuf, GST_BUFFER_FLAG_DISCONT);
@@ -1896,33 +1943,74 @@
 }
 
 static void
-read_partition_header (GstMXFDemux * demux, guint64 offset)
+read_partition_header (GstMXFDemux * demux)
 {
   GstBuffer *buf;
   MXFUL key;
   guint read;
 
-  if (gst_mxf_demux_pull_klv_packet (demux, offset, &key, &buf, &read)
+  if (gst_mxf_demux_pull_klv_packet (demux, demux->offset, &key, &buf, &read)
       != GST_FLOW_OK)
     return;
-  offset += read;
 
   if (!mxf_is_partition_pack (&key)) {
     gst_buffer_unref (buf);
     return;
   }
 
-  do {
+  if (gst_mxf_demux_handle_partition_pack (demux, &key, buf) != GST_FLOW_OK) {
     gst_buffer_unref (buf);
-    if (gst_mxf_demux_pull_klv_packet (demux, offset, &key, &buf, &read)
+    return;
+  }
+  demux->offset += read;
+  gst_buffer_unref (buf);
+
+  if (gst_mxf_demux_pull_klv_packet (demux, demux->offset, &key, &buf, &read)
+      != GST_FLOW_OK)
+    return;
+
+  while (mxf_is_fill (&key)) {
+    demux->offset += read;
+    gst_buffer_unref (buf);
+    if (gst_mxf_demux_pull_klv_packet (demux, demux->offset, &key, &buf, &read)
         != GST_FLOW_OK)
       return;
-    offset += read;
   }
-  while (mxf_is_fill (&key));
 
-  if (mxf_is_index_table_segment (&key)) {
-    gst_mxf_demux_handle_index_table_segment (demux, &key, buf, offset);
+  if (!mxf_is_index_table_segment (&key)
+      && demux->current_partition->partition.header_byte_count) {
+    gst_buffer_unref (buf);
+    demux->offset += demux->current_partition->partition.header_byte_count;
+    if (gst_mxf_demux_pull_klv_packet (demux, demux->offset, &key, &buf, &read)
+        != GST_FLOW_OK)
+      return;
+  }
+
+  while (mxf_is_index_table_segment (&key)) {
+    gst_mxf_demux_handle_index_table_segment (demux, &key, buf, demux->offset);
+    demux->offset += read;
+
+    gst_buffer_unref (buf);
+    if (gst_mxf_demux_pull_klv_packet (demux, demux->offset, &key, &buf, &read)
+        != GST_FLOW_OK)
+      return;
+  }
+
+  while (mxf_is_fill (&key)) {
+    demux->offset += read;
+    gst_buffer_unref (buf);
+    if (gst_mxf_demux_pull_klv_packet (demux, demux->offset, &key, &buf, &read)
+        != GST_FLOW_OK)
+      return;
+  }
+
+  if (mxf_is_generic_container_system_item (&key) ||
+      mxf_is_generic_container_essence_element (&key) ||
+      mxf_is_avid_essence_container_essence_element (&key)) {
+    if (demux->current_partition->essence_container_offset == 0)
+      demux->current_partition->essence_container_offset =
+          demux->offset - demux->current_partition->partition.this_partition -
+          demux->run_in;
   }
 
   gst_buffer_unref (buf);
@@ -2001,19 +2089,6 @@
   return GST_FLOW_OK;
 }
 
-static gint
-compare_index_table_segments (gconstpointer comparee, gconstpointer compared)
-{
-  MXFIndexTableSegment *comparee_segment, *compared_segment;
-
-  comparee_segment = (MXFIndexTableSegment *) comparee;
-  compared_segment = (MXFIndexTableSegment *) compared;
-
-  /* FIXME : is that the correct comparison ? */
-  return comparee_segment->index_start_position -
-      compared_segment->index_start_position;
-}
-
 static GstFlowReturn
 gst_mxf_demux_handle_index_table_segment (GstMXFDemux * demux,
     const MXFUL * key, GstBuffer * buffer, guint64 offset)
@@ -2021,21 +2096,15 @@
   MXFIndexTableSegment *segment;
   GstMapInfo map;
   gboolean ret;
-  GList *l;
 
   GST_DEBUG_OBJECT (demux,
       "Handling index table segment of size %" G_GSIZE_FORMAT " at offset %"
       G_GUINT64_FORMAT, gst_buffer_get_size (buffer), offset);
 
-  if (!demux->current_partition->primer.mappings) {
-    GST_WARNING_OBJECT (demux, "Invalid primer pack");
-  }
-
   segment = g_new0 (MXFIndexTableSegment, 1);
 
   gst_buffer_map (buffer, &map, GST_MAP_READ);
-  ret = mxf_index_table_segment_parse (key, segment,
-      &demux->current_partition->primer, map.data, map.size);
+  ret = mxf_index_table_segment_parse (key, segment, map.data, map.size);
   gst_buffer_unmap (buffer, &map);
 
   if (!ret) {
@@ -2043,18 +2112,8 @@
     return GST_FLOW_ERROR;
   }
 
-  segment->stream_offset = offset;
-  l = g_list_find_custom (demux->pending_index_table_segments, segment,
-      (GCompareFunc) compare_index_table_segments);
-
-  /* Prevent duplicates */
-  if (l == NULL) {
-    demux->pending_index_table_segments =
-        g_list_prepend (demux->pending_index_table_segments, segment);
-  } else {
-    mxf_index_table_segment_reset (segment);
-    g_free (segment);
-  }
+  demux->pending_index_table_segments =
+      g_list_prepend (demux->pending_index_table_segments, segment);
 
   return GST_FLOW_OK;
 }
@@ -2166,6 +2225,7 @@
   guint64 old_offset = demux->offset;
   MXFUL key;
   GstMapInfo map;
+  GstFlowReturn flow_ret;
 
   if (!gst_pad_peer_query_duration (demux->sinkpad, fmt, &filesize) ||
       fmt != GST_FORMAT_BYTES || filesize == -1) {
@@ -2219,9 +2279,14 @@
     return;
   }
 
-  gst_mxf_demux_handle_random_index_pack (demux, &key, buffer);
+  flow_ret = gst_mxf_demux_handle_random_index_pack (demux, &key, buffer);
   gst_buffer_unref (buffer);
   demux->offset = old_offset;
+
+  if (flow_ret == GST_FLOW_OK && !demux->index_table_segments_collected) {
+    collect_index_table_segments (demux);
+    demux->index_table_segments_collected = TRUE;
+  }
 }
 
 static void
@@ -2461,6 +2526,12 @@
         buffer, peek);
   } else if (mxf_is_random_index_pack (key)) {
     ret = gst_mxf_demux_handle_random_index_pack (demux, key, buffer);
+
+    if (ret == GST_FLOW_OK && demux->random_access
+        && !demux->index_table_segments_collected) {
+      collect_index_table_segments (demux);
+      demux->index_table_segments_collected = TRUE;
+    }
   } else if (mxf_is_index_table_segment (key)) {
     ret =
         gst_mxf_demux_handle_index_table_segment (demux, key, buffer,
@@ -2524,28 +2595,66 @@
 }
 
 static guint64
-get_offset_from_index_table_segments (GstMXFDemux * demux, gint64 position,
-    gint64 * index_start_position)
+find_offset (GArray * offsets, gint64 * position, gboolean keyframe)
 {
-  GList *l;
-  gint64 start, end;
-  gboolean return_offset = FALSE;
+  GstMXFDemuxIndex *idx;
+  guint64 current_offset = -1;
+  gint64 current_position = *position;
 
-  for (l = demux->pending_index_table_segments; l != NULL; l = l->next) {
-    MXFIndexTableSegment *segment = (MXFIndexTableSegment *) l->data;
-    start = segment->index_start_position;
-    end = start + segment->index_duration;
+  if (!offsets || offsets->len <= *position)
+    return -1;
 
-    if (return_offset)
-      return segment->stream_offset;
-
-    if (start <= position && position < end) {
-      *index_start_position = segment->index_start_position;
-      return_offset = TRUE;
+  idx = &g_array_index (offsets, GstMXFDemuxIndex, *position);
+  if (idx->offset != 0 && (!keyframe || idx->keyframe)) {
+    current_offset = idx->offset;
+  } else if (idx->offset != 0) {
+    current_position--;
+    while (current_position >= 0) {
+      idx = &g_array_index (offsets, GstMXFDemuxIndex, current_position);
+      if (idx->offset == 0) {
+        break;
+      } else if (!idx->keyframe) {
+        current_position--;
+        continue;
+      } else {
+        current_offset = idx->offset;
+        break;
+      }
     }
   }
 
-  return 0;
+  if (current_offset == -1)
+    return -1;
+
+  *position = current_position;
+  return current_offset;
+}
+
+static guint64
+find_closest_offset (GArray * offsets, gint64 * position, gboolean keyframe)
+{
+  GstMXFDemuxIndex *idx;
+  gint64 current_position = *position;
+
+  if (!offsets || offsets->len == 0)
+    return -1;
+
+  current_position = MIN (current_position, offsets->len - 1);
+
+  idx = &g_array_index (offsets, GstMXFDemuxIndex, current_position);
+  while (idx->offset == 0 || (keyframe && !idx->keyframe)) {
+    current_position--;
+    if (current_position < 0)
+      break;
+    idx = &g_array_index (offsets, GstMXFDemuxIndex, current_position);
+  }
+
+  if (idx->offset != 0 && (!keyframe || idx->keyframe)) {
+    *position = current_position;
+    return idx->offset;
+  }
+
+  return -1;
 }
 
 static guint64
@@ -2556,11 +2665,28 @@
   guint64 old_offset = demux->offset;
   GstMXFDemuxPartition *old_partition = demux->current_partition;
   gint i;
+  guint64 offset;
+  gint64 requested_position = *position;
+  GstMXFDemuxIndexTable *index_table = NULL;
 
   GST_DEBUG_OBJECT (demux, "Trying to find essence element %" G_GINT64_FORMAT
       " of track %u with body_sid %u (keyframe %d)", *position,
       etrack->track_number, etrack->body_sid, keyframe);
 
+  if (demux->index_tables) {
+    GList *l;
+
+    for (l = demux->index_tables; l; l = l->next) {
+      GstMXFDemuxIndexTable *tmp = l->data;
+
+      if (tmp->body_sid == etrack->body_sid
+          && tmp->index_sid == etrack->index_sid) {
+        index_table = tmp;
+        break;
+      }
+    }
+  }
+
 from_index:
 
   if (etrack->duration > 0 && *position >= etrack->duration) {
@@ -2569,84 +2695,66 @@
   }
 
   /* First try to find an offset in our index */
-  if (etrack->offsets && etrack->offsets->len > *position) {
-    GstMXFDemuxIndex *idx =
-        &g_array_index (etrack->offsets, GstMXFDemuxIndex, *position);
-    guint64 current_offset = -1;
-    gint64 current_position = *position;
-
-    if (idx->offset != 0 && (!keyframe || idx->keyframe)) {
-      current_offset = idx->offset;
-    } else if (idx->offset != 0) {
-      current_position--;
-      while (current_position >= 0) {
-        idx =
-            &g_array_index (etrack->offsets, GstMXFDemuxIndex,
-            current_position);
-        if (idx->offset == 0) {
-          break;
-        } else if (!idx->keyframe) {
-          current_position--;
-          continue;
-        } else {
-          current_offset = idx->offset;
-          break;
-        }
-      }
-    }
-
-    if (current_offset != -1) {
-      GST_DEBUG_OBJECT (demux, "Found in index at offset %" G_GUINT64_FORMAT,
-          current_offset);
-      *position = current_position;
-      return current_offset;
-    }
+  offset = find_offset (etrack->offsets, position, keyframe);
+  if (offset != -1) {
+    GST_DEBUG_OBJECT (demux,
+        "Found edit unit %" G_GINT64_FORMAT " for %" G_GINT64_FORMAT
+        " in generated index at offset %" G_GUINT64_FORMAT, *position,
+        requested_position, offset);
+    return offset;
   }
 
   GST_DEBUG_OBJECT (demux, "Not found in index");
   if (!demux->random_access) {
-    guint64 new_offset = -1;
-    gint64 new_position = -1;
-
-    if (etrack->offsets && etrack->offsets->len) {
-      for (i = etrack->offsets->len - 1; i >= 0; i--) {
-        GstMXFDemuxIndex *idx =
-            &g_array_index (etrack->offsets, GstMXFDemuxIndex, i);
-
-        if (idx->offset != 0 && i <= *position && (!keyframe || idx->keyframe)) {
-          new_offset = idx->offset;
-          new_position = i;
-          break;
-        }
-      }
+    offset = find_closest_offset (etrack->offsets, position, keyframe);
+    if (offset != -1) {
+      GST_DEBUG_OBJECT (demux,
+          "Starting with edit unit %" G_GINT64_FORMAT " for %" G_GINT64_FORMAT
+          " in generated index at offset %" G_GUINT64_FORMAT, *position,
+          requested_position, offset);
+      return offset;
     }
 
-    if (new_offset != -1) {
-      *position = new_position;
-      return new_offset;
+    if (index_table) {
+      offset = find_closest_offset (index_table->offsets, position, keyframe);
+      if (offset != -1) {
+        GST_DEBUG_OBJECT (demux,
+            "Starting with edit unit %" G_GINT64_FORMAT " for %" G_GINT64_FORMAT
+            " in index at offset %" G_GUINT64_FORMAT, *position,
+            requested_position, offset);
+        return offset;
+      }
     }
   } else if (demux->random_access) {
-    gint64 index_start_position = -1;
-    guint64 offset;
+    gint64 index_start_position = *position;
 
     demux->offset = demux->run_in;
-    if (etrack->offsets && etrack->offsets->len) {
-      for (i = etrack->offsets->len - 1; i >= 0; i--) {
-        GstMXFDemuxIndex *idx =
-            &g_array_index (etrack->offsets, GstMXFDemuxIndex, i);
-
-        if (idx->offset != 0 && i <= *position) {
-          demux->offset = idx->offset + demux->run_in;
-          break;
-        }
-      }
-    }
 
     offset =
-        get_offset_from_index_table_segments (demux, *position,
-        &index_start_position);
+        find_closest_offset (etrack->offsets, &index_start_position, FALSE);
+    if (offset != -1) {
+      demux->offset = offset + demux->run_in;
+      GST_DEBUG_OBJECT (demux,
+          "Starting with edit unit %" G_GINT64_FORMAT " for %" G_GINT64_FORMAT
+          " in generated index at offset %" G_GUINT64_FORMAT,
+          index_start_position, requested_position, offset);
+    } else {
+      index_start_position = -1;
+    }
 
-    demux->offset = offset;
+    if (index_table) {
+      gint64 tmp_position = *position;
+
+      offset = find_closest_offset (index_table->offsets, &tmp_position, TRUE);
+      if (offset != -1 && tmp_position > index_start_position) {
+        demux->offset = offset + demux->run_in;
+        index_start_position = tmp_position;
+        GST_DEBUG_OBJECT (demux,
+            "Starting with edit unit %" G_GINT64_FORMAT " for %" G_GINT64_FORMAT
+            " in index at offset %" G_GUINT64_FORMAT, index_start_position,
+            requested_position, offset);
+      }
+    }
 
     gst_mxf_demux_set_partition_for_offset (demux, demux->offset);
 
@@ -2654,7 +2762,7 @@
       GstMXFDemuxEssenceTrack *t =
           &g_array_index (demux->essence_tracks, GstMXFDemuxEssenceTrack, i);
 
-      if (index_start_position != -1)
+      if (index_start_position != -1 && t == etrack)
         t->position = index_start_position;
       else
         t->position = (demux->offset == demux->run_in) ? 0 : -1;
@@ -3400,14 +3508,15 @@
 static void
 collect_index_table_segments (GstMXFDemux * demux)
 {
-  guint i;
   GList *l;
+  guint i;
+  guint64 old_offset = demux->offset;
+  GstMXFDemuxPartition *old_partition = demux->current_partition;
 
   if (!demux->random_index_pack)
     return;
 
   for (i = 0; i < demux->random_index_pack->len; i++) {
-    GstMXFDemuxPartition *p = NULL;
     MXFRandomIndexPackEntry *e =
         &g_array_index (demux->random_index_pack, MXFRandomIndexPackEntry, i);
 
@@ -3416,19 +3525,92 @@
       return;
     }
 
-    for (l = demux->partitions; l; l = l->next) {
-      GstMXFDemuxPartition *tmp = l->data;
+    demux->offset = e->offset;
+    read_partition_header (demux);
+  }
 
-      if (tmp->partition.this_partition + demux->run_in == e->offset) {
-        p = tmp;
+  demux->offset = old_offset;
+  demux->current_partition = old_partition;
+
+  for (l = demux->pending_index_table_segments; l; l = l->next) {
+    MXFIndexTableSegment *segment = l->data;
+    GstMXFDemuxIndexTable *t = NULL;
+    GList *k;
+    guint64 start, end;
+
+    for (k = demux->index_tables; k; k = k->next) {
+      GstMXFDemuxIndexTable *tmp = k->data;
+
+      if (tmp->body_sid == segment->body_sid
+          && tmp->index_sid == segment->index_sid) {
+        t = tmp;
         break;
       }
     }
 
-    if (p) {
-      read_partition_header (demux, p->partition.this_partition);
+    if (!t) {
+      t = g_new0 (GstMXFDemuxIndexTable, 1);
+      t->body_sid = segment->body_sid;
+      t->index_sid = segment->index_sid;
+      t->offsets = g_array_new (FALSE, TRUE, sizeof (GstMXFDemuxIndex));
+      demux->index_tables = g_list_prepend (demux->index_tables, t);
+    }
+
+    start = segment->index_start_position;
+    end = start + segment->index_duration;
+
+    if (t->offsets->len < end)
+      g_array_set_size (t->offsets, end);
+
+    for (i = 0; i < segment->n_index_entries; i++) {
+      GstMXFDemuxIndex *index =
+          &g_array_index (t->offsets, GstMXFDemuxIndex, start + i);
+      guint64 offset = segment->index_entries[i].stream_offset;
+      GList *m;
+      GstMXFDemuxPartition *offset_partition = NULL, *next_partition = NULL;
+
+      for (m = demux->partitions; m; m = m->next) {
+        GstMXFDemuxPartition *partition = m->data;
+
+        if (!next_partition && offset_partition)
+          next_partition = partition;
+
+        if (partition->partition.body_sid != t->body_sid)
+          continue;
+        if (partition->partition.body_offset > offset)
+          break;
+
+        offset_partition = partition;
+        next_partition = NULL;
+      }
+
+      if (offset_partition && offset >= offset_partition->partition.body_offset
+          && (offset - offset_partition->partition.body_offset)) {
+        offset =
+            offset_partition->partition.this_partition +
+            offset_partition->essence_container_offset + (offset -
+            offset_partition->partition.body_offset);
+
+        if (next_partition
+            && offset >= next_partition->partition.this_partition) {
+          GST_ERROR_OBJECT (demux,
+              "Invalid index table segment going into next unrelated partition");
+        } else {
+          index->offset = offset;
+          index->keyframe = ! !(segment->index_entries[i].flags & 0x80)
+              || (segment->index_entries[i].key_frame_offset == 0);
+        }
+      }
     }
   }
+
+  for (l = demux->pending_index_table_segments; l; l = l->next) {
+    MXFIndexTableSegment *s = l->data;
+    mxf_index_table_segment_reset (s);
+    g_free (s);
+  }
+  g_list_free (demux->pending_index_table_segments);
+  demux->pending_index_table_segments = NULL;
 }
 
 static gboolean
@@ -3945,6 +4127,9 @@
         } else {
           GST_WARNING_OBJECT (demux,
               "Seek to remaining part of the file failed");
+          p->eos = TRUE;
+          gst_pad_push_event (GST_PAD_CAST (p), gst_event_new_eos ());
+          continue;
         }
       }
 
diff --git a/gst/mxf/mxfdemux.h b/gst/mxf/mxfdemux.h
index 3324093..b4d7242 100644
--- a/gst/mxf/mxfdemux.h
+++ b/gst/mxf/mxfdemux.h
@@ -65,6 +65,7 @@
 typedef struct
 {
   guint32 body_sid;
+  guint32 index_sid;
   guint32 track_number;
 
   guint32 track_id;
@@ -87,6 +88,13 @@
   GstCaps *caps;
 } GstMXFDemuxEssenceTrack;
 
+typedef struct
+{
+  guint32 body_sid;
+  guint32 index_sid;
+  GArray *offsets;
+} GstMXFDemuxIndexTable;
+
 struct _GstMXFDemuxPad
 {
   GstPad parent;
@@ -153,8 +161,9 @@
   GstMXFDemuxPartition *current_partition;
 
   GArray *essence_tracks;
-  GList *pending_index_table_segments;
 
+  GList *pending_index_table_segments;
+  GList *index_tables; /* one per BodySID / IndexSID */
   gboolean index_table_segments_collected;
 
   GArray *random_index_pack;
diff --git a/gst/mxf/mxfjpeg2000.c b/gst/mxf/mxfjpeg2000.c
index 1679279..17daf7d 100644
--- a/gst/mxf/mxfjpeg2000.c
+++ b/gst/mxf/mxfjpeg2000.c
@@ -221,7 +221,7 @@
 
   /* TODO: What about other field values? */
   caps =
-      gst_caps_new_simple ("image/x-jpc", "fields", G_TYPE_INT, 1, "colorspace",
+      gst_caps_new_simple ("image/x-jpc", "colorspace",
       G_TYPE_STRING, colorspace, NULL);
   if (p) {
     mxf_metadata_generic_picture_essence_descriptor_set_caps (p, caps);
@@ -360,7 +360,7 @@
   mxf_jpeg2000_essence_element_writer.pad_template =
       gst_pad_template_new ("jpeg2000_video_sink_%u", GST_PAD_SINK,
       GST_PAD_REQUEST,
-      gst_caps_from_string ("image/x-jpc, fields = 1, width = "
+      gst_caps_from_string ("image/x-jpc, width = "
           GST_VIDEO_SIZE_RANGE ", height = " GST_VIDEO_SIZE_RANGE
           ", framerate = " GST_VIDEO_FPS_RANGE
           ", colorspace = (string) { \"sRGB\", \"sYUV\" }"));
diff --git a/gst/mxf/mxfmetadata.c b/gst/mxf/mxfmetadata.c
index e306a55..172bc2e 100644
--- a/gst/mxf/mxfmetadata.c
+++ b/gst/mxf/mxfmetadata.c
@@ -1718,7 +1718,7 @@
     t->data = g_slice_alloc (4);
     t->g_slice = TRUE;
     GST_WRITE_UINT32_BE (t->data, self->index_sid);
-    mxf_primer_pack_add_mapping (primer, 0x3f07, &t->ul);
+    mxf_primer_pack_add_mapping (primer, 0x3f06, &t->ul);
     ret = g_list_prepend (ret, t);
   }
 
diff --git a/gst/mxf/mxfmpeg.c b/gst/mxf/mxfmpeg.c
index c26fa99..da35722 100644
--- a/gst/mxf/mxfmpeg.c
+++ b/gst/mxf/mxfmpeg.c
@@ -600,7 +600,7 @@
     0x03, 0x02, 0x04, 0x00}
 };
 
-static const MXFUL sound_essence_compression_mpeg1_layer12 = { {
+static const MXFUL sound_essence_compression_mpeg1_layer23 = { {
         0x06, 0x0E, 0x2B, 0x34, 0x04, 0x01, 0x01, 0x01, 0x04, 0x02, 0x02, 0x02,
     0x03, 0x02, 0x05, 0x00}
 };
@@ -701,8 +701,9 @@
     } else if ((p->picture_essence_coding.u[13] >> 4) == 0x03) {
       /* RP 2008 */
 
-      /* TODO: What about codec_data for AVC1 streams? */
-      caps = gst_caps_new_empty_simple ("video/x-h264");
+      caps =
+          gst_caps_new_simple ("video/x-h264", "stream-format", G_TYPE_STRING,
+          "byte-stream", NULL);
       codec_name = "h.264 Video";
       t = MXF_MPEG_ESSENCE_TYPE_VIDEO_AVC;
       memcpy (mdata, &t, sizeof (MXFMPEGEssenceType));
@@ -731,7 +732,7 @@
           "layer", G_TYPE_INT, 1, NULL);
       codec_name = "MPEG-1 Layer 1 Audio";
     } else if (mxf_ul_is_equal (&s->sound_essence_compression,
-            &sound_essence_compression_mpeg1_layer12)) {
+            &sound_essence_compression_mpeg1_layer23)) {
       caps =
           gst_caps_new_simple ("audio/mpeg", "mpegversion", G_TYPE_INT, 1,
           NULL);
@@ -890,17 +891,16 @@
   } else if (f->essence_container.u[13] == 0x0f) {
     GST_DEBUG ("Found h264 NAL unit stream");
     /* RP 2008 */
-    /* TODO: What about codec_data? */
     caps =
         gst_caps_new_simple ("video/x-h264", "stream-format", G_TYPE_STRING,
-        "avc", NULL);
+        "byte-stream", NULL);
 
     if (!*tags)
       *tags = gst_tag_list_new_empty ();
     gst_tag_list_add (*tags, GST_TAG_MERGE_APPEND, GST_TAG_VIDEO_CODEC,
         "h.264 Video", NULL);
   } else if (f->essence_container.u[13] == 0x10) {
-    GST_DEBUG ("Found h264 byte stream stream");
+    GST_DEBUG ("Found h264 byte-stream stream");
     /* RP 2008 */
     caps =
         gst_caps_new_simple ("video/x-h264", "stream-format", G_TYPE_STRING,
@@ -979,9 +979,9 @@
       if (mpegaudioversion == 1 && layer == 1)
         memcpy (&ret->sound_essence_compression,
             &sound_essence_compression_mpeg1_layer1, 16);
-      else if (mpegaudioversion == 1 && layer == 2)
+      else if (mpegaudioversion == 1 && (layer == 2 || layer == 3))
         memcpy (&ret->sound_essence_compression,
-            &sound_essence_compression_mpeg1_layer12, 16);
+            &sound_essence_compression_mpeg1_layer23, 16);
       else if (mpegaudioversion == 2 && layer == 1)
         memcpy (&ret->sound_essence_compression,
             &sound_essence_compression_mpeg2_layer1, 16);
@@ -1308,6 +1308,7 @@
     *mapping_data = g_new0 (MXFMPEGEssenceType, 1);
     memcpy (*mapping_data, &type, sizeof (MXFMPEGEssenceType));
     ret->parent.parent.picture_essence_coding.u[13] = 0x30;
+    ret->parent.parent.parent.essence_container.u[13] = 0x10;
   } else {
     g_assert_not_reached ();
   }
@@ -1364,6 +1365,7 @@
 "height = " GST_VIDEO_SIZE_RANGE ", " \
 "framerate = " GST_VIDEO_FPS_RANGE "; " \
 "video/x-h264, " \
+"stream-format = (string) byte-stream, " \
 "width = " GST_VIDEO_SIZE_RANGE ", " \
 "height = " GST_VIDEO_SIZE_RANGE ", " \
 "framerate = " GST_VIDEO_FPS_RANGE
diff --git a/gst/mxf/mxfmux.c b/gst/mxf/mxfmux.c
index 273d3b6..c36ae90 100644
--- a/gst/mxf/mxfmux.c
+++ b/gst/mxf/mxfmux.c
@@ -25,7 +25,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v filesrc location=/path/to/audio ! decodebin ! queue ! mxfmux name=m ! filesink location=file.mxf   filesrc location=/path/to/video ! decodebin ! queue ! m.
+ * gst-launch-1.0 -v filesrc location=/path/to/audio ! decodebin ! queue ! mxfmux name=m ! filesink location=file.mxf   filesrc location=/path/to/video ! decodebin ! queue ! m.
  * ]| This pipeline muxes an audio and video file into a single MXF file.
  * </refsect2>
  */
@@ -46,6 +46,66 @@
 GST_DEBUG_CATEGORY_STATIC (mxfmux_debug);
 #define GST_CAT_DEFAULT mxfmux_debug
 
+#define GST_TYPE_MXF_MUX_PAD            (gst_mxf_mux_pad_get_type())
+#define GST_MXF_MUX_PAD(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_MXF_MUX_PAD, GstMXFMuxPad))
+#define GST_MXF_MUX_PAD_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_MXF_MUX_PAD, GstMXFMuxPadClass))
+#define GST_MXF_MUX_PAD_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),GST_TYPE_MXF_MUX_PAD, GstMXFMuxPadClass))
+#define GST_IS_MXF_MUX_PAD(obj)         (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_MXF_MUX_PAD))
+#define GST_IS_MXF_MUX_PAD_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_MXF_MUX_PAD))
+
+typedef struct
+{
+  GstAggregatorPad parent;
+
+  guint64 pos;
+  GstClockTime last_timestamp;
+
+  MXFMetadataFileDescriptor *descriptor;
+
+  GstAdapter *adapter;
+  gboolean have_complete_edit_unit;
+
+  gpointer mapping_data;
+  const MXFEssenceElementWriter *writer;
+  MXFEssenceElementWriteFunc write_func;
+
+  MXFMetadataSourcePackage *source_package;
+  MXFMetadataTimelineTrack *source_track;
+} GstMXFMuxPad;
+
+typedef struct
+{
+  GstAggregatorPadClass parent_class;
+} GstMXFMuxPadClass;
+
+GType gst_mxf_mux_pad_get_type (void);
+
+G_DEFINE_TYPE (GstMXFMuxPad, gst_mxf_mux_pad, GST_TYPE_AGGREGATOR_PAD);
+
+static void
+gst_mxf_mux_pad_finalize (GObject * object)
+{
+  GstMXFMuxPad *pad = GST_MXF_MUX_PAD (object);
+
+  g_object_unref (pad->adapter);
+  g_free (pad->mapping_data);
+
+  G_OBJECT_CLASS (gst_mxf_mux_pad_parent_class)->finalize (object);
+}
+
+static void
+gst_mxf_mux_pad_class_init (GstMXFMuxPadClass * klass)
+{
+  GObjectClass *object_class = (GObjectClass *) klass;
+
+  object_class->finalize = gst_mxf_mux_pad_finalize;
+}
+
+static void
+gst_mxf_mux_pad_init (GstMXFMuxPad * pad)
+{
+}
+
 static GstStaticPadTemplate src_templ = GST_STATIC_PAD_TEMPLATE ("src",
     GST_PAD_SRC,
     GST_PAD_ALWAYS,
@@ -58,27 +118,20 @@
 };
 
 #define gst_mxf_mux_parent_class parent_class
-G_DEFINE_TYPE (GstMXFMux, gst_mxf_mux, GST_TYPE_ELEMENT);
+G_DEFINE_TYPE (GstMXFMux, gst_mxf_mux, GST_TYPE_AGGREGATOR);
 
 static void gst_mxf_mux_finalize (GObject * object);
-static void gst_mxf_mux_set_property (GObject * object,
-    guint prop_id, const GValue * value, GParamSpec * pspec);
-static void gst_mxf_mux_get_property (GObject * object,
-    guint prop_id, GValue * value, GParamSpec * pspec);
 
-static GstFlowReturn gst_mxf_mux_collected (GstCollectPads * pads,
-    gpointer user_data);
+static GstFlowReturn gst_mxf_mux_aggregate (GstAggregator * aggregator,
+    gboolean timeout);
+static gboolean gst_mxf_mux_stop (GstAggregator * aggregator);
 
-static gboolean gst_mxf_mux_handle_src_event (GstPad * pad, GstObject * parent,
+static gboolean gst_mxf_mux_src_event (GstAggregator * aggregator,
     GstEvent * event);
-static gboolean gst_mxf_mux_handle_sink_event (GstCollectPads * pads,
-    GstCollectData * data, GstEvent * event, gpointer user_data);
-static GstPad *gst_mxf_mux_request_new_pad (GstElement * element,
+static gboolean gst_mxf_mux_sink_event (GstAggregator * aggregator,
+    GstAggregatorPad * aggpad, GstEvent * event);
+static GstAggregatorPad *gst_mxf_mux_create_new_pad (GstAggregator * aggregator,
     GstPadTemplate * templ, const gchar * name, const GstCaps * caps);
-static void gst_mxf_mux_release_pad (GstElement * element, GstPad * pad);
-
-static GstStateChangeReturn
-gst_mxf_mux_change_state (GstElement * element, GstStateChange transition);
 
 static void gst_mxf_mux_reset (GstMXFMux * mux);
 
@@ -88,7 +141,7 @@
   guint size = gst_buffer_get_size (buf);
   GstFlowReturn ret;
 
-  ret = gst_pad_push (mux->srcpad, buf);
+  ret = gst_aggregator_finish_buffer (GST_AGGREGATOR (mux), buf);
   mux->offset += size;
 
   return ret;
@@ -99,21 +152,24 @@
 {
   GObjectClass *gobject_class;
   GstElementClass *gstelement_class;
+  GstAggregatorClass *gstaggregator_class;
   const GstPadTemplate **p;
 
   GST_DEBUG_CATEGORY_INIT (mxfmux_debug, "mxfmux", 0, "MXF muxer");
 
   gobject_class = (GObjectClass *) klass;
   gstelement_class = (GstElementClass *) klass;
+  gstaggregator_class = (GstAggregatorClass *) klass;
 
   gobject_class->finalize = gst_mxf_mux_finalize;
-  gobject_class->set_property = gst_mxf_mux_set_property;
-  gobject_class->get_property = gst_mxf_mux_get_property;
 
-  gstelement_class->change_state = GST_DEBUG_FUNCPTR (gst_mxf_mux_change_state);
-  gstelement_class->request_new_pad =
-      GST_DEBUG_FUNCPTR (gst_mxf_mux_request_new_pad);
-  gstelement_class->release_pad = GST_DEBUG_FUNCPTR (gst_mxf_mux_release_pad);
+  gstaggregator_class->create_new_pad =
+      GST_DEBUG_FUNCPTR (gst_mxf_mux_create_new_pad);
+  gstaggregator_class->src_event = GST_DEBUG_FUNCPTR (gst_mxf_mux_src_event);
+  gstaggregator_class->sink_event = GST_DEBUG_FUNCPTR (gst_mxf_mux_sink_event);
+  gstaggregator_class->stop = GST_DEBUG_FUNCPTR (gst_mxf_mux_stop);
+  gstaggregator_class->aggregate = GST_DEBUG_FUNCPTR (gst_mxf_mux_aggregate);
+  gstaggregator_class->sinkpads_type = GST_TYPE_MXF_MUX_PAD;
 
   gst_element_class_add_pad_template (gstelement_class,
       gst_static_pad_template_get (&src_templ));
@@ -134,21 +190,7 @@
 static void
 gst_mxf_mux_init (GstMXFMux * mux)
 {
-  GstCaps *caps;
-
-  mux->srcpad = gst_pad_new_from_static_template (&src_templ, "src");
-  gst_pad_set_event_function (mux->srcpad, gst_mxf_mux_handle_src_event);
-  caps = gst_caps_new_empty_simple ("application/mxf");
-  gst_pad_set_caps (mux->srcpad, caps);
-  gst_caps_unref (caps);
-  gst_element_add_pad (GST_ELEMENT (mux), mux->srcpad);
-
-  mux->collect = gst_collect_pads_new ();
-  gst_collect_pads_set_event_function (mux->collect,
-      GST_DEBUG_FUNCPTR (gst_mxf_mux_handle_sink_event), mux);
-  gst_collect_pads_set_function (mux->collect,
-      GST_DEBUG_FUNCPTR (gst_mxf_mux_collected), mux);
-
+  mux->index_table = g_array_new (FALSE, FALSE, sizeof (MXFIndexTableSegment));
   gst_mxf_mux_reset (mux);
 }
 
@@ -166,50 +208,30 @@
     mux->metadata_list = NULL;
   }
 
-  gst_object_unref (mux->collect);
+  if (mux->index_table) {
+    g_array_free (mux->index_table, TRUE);
+    mux->index_table = NULL;
+  }
 
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
 static void
-gst_mxf_mux_set_property (GObject * object,
-    guint prop_id, const GValue * value, GParamSpec * pspec)
-{
-  //GstMXFMux *mux = GST_MXF_MUX (object);
-
-  switch (prop_id) {
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-      break;
-  }
-}
-
-static void
-gst_mxf_mux_get_property (GObject * object,
-    guint prop_id, GValue * value, GParamSpec * pspec)
-{
-  //GstMXFMux *mux = GST_MXF_MUX (object);
-
-  switch (prop_id) {
-    default:
-      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
-      break;
-  }
-}
-
-static void
 gst_mxf_mux_reset (GstMXFMux * mux)
 {
-  GSList *sl;
+  GList *l;
 
-  while ((sl = mux->collect->data) != NULL) {
-    GstMXFMuxPad *cpad = (GstMXFMuxPad *) sl->data;
+  GST_OBJECT_LOCK (mux);
+  while ((l = GST_ELEMENT_CAST (mux)->sinkpads) != NULL) {
+    GstPad *pad = (GstPad *) l->data;
 
-    g_object_unref (cpad->adapter);
-    g_free (cpad->mapping_data);
-
-    gst_collect_pads_remove_pad (mux->collect, cpad->collect.pad);
+    gst_object_ref (pad);
+    GST_OBJECT_UNLOCK (mux);
+    gst_element_release_request_pad (GST_ELEMENT_CAST (mux), pad);
+    gst_object_unref (pad);
+    GST_OBJECT_LOCK (mux);
   }
+  GST_OBJECT_UNLOCK (mux);
 
   mux->state = GST_MXF_MUX_STATE_HEADER;
   mux->n_pads = 0;
@@ -228,35 +250,32 @@
   mux->last_gc_timestamp = 0;
   mux->last_gc_position = 0;
   mux->offset = 0;
+
+  g_array_set_size (mux->index_table, 0);
 }
 
 static gboolean
-gst_mxf_mux_handle_src_event (GstPad * pad, GstObject * parent,
-    GstEvent * event)
+gst_mxf_mux_src_event (GstAggregator * aggregator, GstEvent * event)
 {
-  GstEventType type;
-
-  type = event ? GST_EVENT_TYPE (event) : GST_EVENT_UNKNOWN;
-
-  switch (type) {
+  switch (GST_EVENT_TYPE (event)) {
     case GST_EVENT_SEEK:
       /* disable seeking for now */
+      gst_event_unref (event);
       return FALSE;
     default:
+      return GST_AGGREGATOR_CLASS (parent_class)->src_event (aggregator, event);
       break;
   }
 
-  return gst_pad_event_default (pad, parent, event);
+  g_assert_not_reached ();
 }
 
 static gboolean
-gst_mxf_mux_event_caps (GstPad * pad, GstCaps * caps)
+gst_mxf_mux_set_caps (GstMXFMux * mux, GstMXFMuxPad * pad, GstCaps * caps)
 {
-  GstMXFMux *mux = GST_MXF_MUX (gst_pad_get_parent (pad));
-  GstMXFMuxPad *cpad = (GstMXFMuxPad *) gst_pad_get_element_private (pad);
   gboolean ret = TRUE;
   MXFUUID d_instance_uid = { {0,} };
-  MXFMetadataFileDescriptor *old_descriptor = cpad->descriptor;
+  MXFMetadataFileDescriptor *old_descriptor = pad->descriptor;
   GList *l;
 
   GST_DEBUG_OBJECT (pad, "Setting caps %" GST_PTR_FORMAT, caps);
@@ -264,27 +283,26 @@
   if (old_descriptor) {
     memcpy (&d_instance_uid, &MXF_METADATA_BASE (old_descriptor)->instance_uid,
         16);
-    cpad->descriptor = NULL;
-    g_free (cpad->mapping_data);
-    cpad->mapping_data = NULL;
+    pad->descriptor = NULL;
+    g_free (pad->mapping_data);
+    pad->mapping_data = NULL;
   }
 
-  cpad->descriptor =
-      cpad->writer->get_descriptor (GST_PAD_PAD_TEMPLATE (pad), caps,
-      &cpad->write_func, &cpad->mapping_data);
+  pad->descriptor =
+      pad->writer->get_descriptor (GST_PAD_PAD_TEMPLATE (pad), caps,
+      &pad->write_func, &pad->mapping_data);
 
-  if (!cpad->descriptor) {
+  if (!pad->descriptor) {
     GST_ERROR_OBJECT (mux,
         "Couldn't get descriptor for pad '%s' with caps %" GST_PTR_FORMAT,
         GST_PAD_NAME (pad), caps);
-    gst_object_unref (mux);
     return FALSE;
   }
 
   if (mxf_uuid_is_zero (&d_instance_uid))
     mxf_uuid_init (&d_instance_uid, mux->metadata);
 
-  memcpy (&MXF_METADATA_BASE (cpad->descriptor)->instance_uid, &d_instance_uid,
+  memcpy (&MXF_METADATA_BASE (pad->descriptor)->instance_uid, &d_instance_uid,
       16);
 
   if (old_descriptor) {
@@ -292,16 +310,16 @@
       MXFMetadataBase *tmp = l->data;
 
       if (mxf_uuid_is_equal (&d_instance_uid, &tmp->instance_uid)) {
-        l->data = cpad->descriptor;
+        l->data = pad->descriptor;
         break;
       }
     }
   } else {
-    mux->metadata_list = g_list_prepend (mux->metadata_list, cpad->descriptor);
+    mux->metadata_list = g_list_prepend (mux->metadata_list, pad->descriptor);
   }
 
   g_hash_table_replace (mux->metadata,
-      &MXF_METADATA_BASE (cpad->descriptor)->instance_uid, cpad->descriptor);
+      &MXF_METADATA_BASE (pad->descriptor)->instance_uid, pad->descriptor);
 
   if (old_descriptor) {
     if (mux->preface && mux->preface->content_storage &&
@@ -330,55 +348,52 @@
             if (tmp->sub_descriptors[j] ==
                 MXF_METADATA_GENERIC_DESCRIPTOR (old_descriptor)) {
               tmp->sub_descriptors[j] =
-                  MXF_METADATA_GENERIC_DESCRIPTOR (cpad->descriptor);
+                  MXF_METADATA_GENERIC_DESCRIPTOR (pad->descriptor);
               memcpy (&tmp->sub_descriptors_uids[j], &d_instance_uid, 16);
             }
           }
         } else if (package->descriptor ==
             MXF_METADATA_GENERIC_DESCRIPTOR (old_descriptor)) {
           package->descriptor =
-              MXF_METADATA_GENERIC_DESCRIPTOR (cpad->descriptor);
+              MXF_METADATA_GENERIC_DESCRIPTOR (pad->descriptor);
           memcpy (&package->descriptor_uid, &d_instance_uid, 16);
         }
       }
     }
   }
 
-  gst_object_unref (mux);
-
   return ret;
 }
 
 static gboolean
-gst_mxf_mux_handle_sink_event (GstCollectPads * pads, GstCollectData * data,
-    GstEvent * event, gpointer user_data)
+gst_mxf_mux_sink_event (GstAggregator * aggregator,
+    GstAggregatorPad * aggpad, GstEvent * event)
 {
-  GstCaps *caps;
+  GstMXFMux *mux = GST_MXF_MUX (aggregator);
   gboolean ret = TRUE;
 
   switch (GST_EVENT_TYPE (event)) {
     case GST_EVENT_TAG:
       /* TODO: do something with the tags */
       break;
-    case GST_EVENT_SEGMENT:
-      /* We don't support SEGMENT events */
-      ret = FALSE;
-      gst_event_unref (event);
-      break;
-    case GST_EVENT_CAPS:
+    case GST_EVENT_CAPS:{
+      GstCaps *caps;
+
       gst_event_parse_caps (event, &caps);
 
-      gst_mxf_mux_event_caps (data->pad, caps);
+      ret = gst_mxf_mux_set_caps (mux, GST_MXF_MUX_PAD (aggpad), caps);
 
-      gst_caps_unref (caps);
       break;
+    }
     default:
       break;
   }
 
-  /* now GstCollectPads can take care of the rest, e.g. EOS */
+  /* now GstAggregator can take care of the rest, e.g. EOS */
   if (ret)
-    ret = gst_collect_pads_event_default (pads, data, event, FALSE);
+    ret =
+        GST_AGGREGATOR_CLASS (parent_class)->sink_event (aggregator, aggpad,
+        event);
 
   return ret;
 }
@@ -395,13 +410,12 @@
   return g_string_free (string, FALSE);
 }
 
-static GstPad *
-gst_mxf_mux_request_new_pad (GstElement * element,
+static GstAggregatorPad *
+gst_mxf_mux_create_new_pad (GstAggregator * aggregator,
     GstPadTemplate * templ, const gchar * pad_name, const GstCaps * caps)
 {
-  GstMXFMux *mux = GST_MXF_MUX (element);
-  GstMXFMuxPad *cpad;
-  GstPad *pad = NULL;
+  GstMXFMux *mux = GST_MXF_MUX (aggregator);
+  GstMXFMuxPad *pad;
   guint pad_number;
   gchar *name = NULL;
   const MXFEssenceElementWriter *writer;
@@ -420,58 +434,52 @@
   name = gst_mxf_mux_create_pad_name (templ, pad_number);
 
   GST_DEBUG_OBJECT (mux, "Creating pad '%s'", name);
-  pad = gst_pad_new_from_template (templ, name);
+  pad =
+      g_object_new (GST_TYPE_MXF_MUX_PAD, "name", name, "direction",
+      GST_PAD_SINK, "template", templ, NULL);
   g_free (name);
-  cpad = (GstMXFMuxPad *)
-      gst_collect_pads_add_pad (mux->collect, pad, sizeof (GstMXFMuxPad), NULL,
-      TRUE);
-  cpad->last_timestamp = 0;
-  cpad->adapter = gst_adapter_new ();
-  cpad->writer = writer;
+  pad->last_timestamp = 0;
+  pad->adapter = gst_adapter_new ();
+  pad->writer = writer;
 
-  gst_pad_use_fixed_caps (pad);
-  gst_pad_set_active (pad, TRUE);
-  gst_element_add_pad (element, pad);
+  gst_pad_use_fixed_caps (GST_PAD_CAST (pad));
 
-  return pad;
-}
-
-static void
-gst_mxf_mux_release_pad (GstElement * element, GstPad * pad)
-{
-  /*GstMXFMux *mux = GST_MXF_MUX (GST_PAD_PARENT (pad));
-     GstMXFMuxPad *cpad = (GstMXFMuxPad *) gst_pad_get_element_private (pad);
-
-     g_object_unref (cpad->adapter);
-     g_free (cpad->mapping_data);
-
-     gst_collect_pads_remove_pad (mux->collect, pad);
-     gst_element_remove_pad (element, pad); */
+  return GST_AGGREGATOR_PAD (pad);
 }
 
 static GstFlowReturn
 gst_mxf_mux_create_metadata (GstMXFMux * mux)
 {
   GstFlowReturn ret = GST_FLOW_OK;
-  GSList *l;
+  GList *l;
   GArray *tmp;
 
   GST_DEBUG_OBJECT (mux, "Creating MXF metadata");
 
-  for (l = mux->collect->data; l; l = l->next) {
-    GstMXFMuxPad *cpad = l->data;
+  GST_OBJECT_LOCK (mux);
+
+  for (l = GST_ELEMENT_CAST (mux)->sinkpads; l; l = l->next) {
+    GstMXFMuxPad *pad = l->data;
     GstCaps *caps;
+    GstBuffer *buffer;
 
-    if (!cpad || !cpad->descriptor)
+    if (!pad || !pad->descriptor) {
+      GST_OBJECT_UNLOCK (mux);
       return GST_FLOW_ERROR;
+    }
 
-    caps = gst_pad_get_current_caps (cpad->collect.pad);
-    if (!caps)
+    caps = gst_pad_get_current_caps (GST_PAD_CAST (pad));
+    if (!caps) {
+      GST_OBJECT_UNLOCK (mux);
       return GST_FLOW_ERROR;
+    }
 
-    if (cpad->writer->update_descriptor)
-      cpad->writer->update_descriptor (cpad->descriptor,
-          caps, cpad->mapping_data, cpad->collect.buffer);
+    buffer = gst_aggregator_pad_get_buffer (GST_AGGREGATOR_PAD (pad));
+    if (pad->writer->update_descriptor)
+      pad->writer->update_descriptor (pad->descriptor,
+          caps, pad->mapping_data, buffer);
+    if (buffer)
+      gst_buffer_unref (buffer);
     gst_caps_unref (caps);
   }
 
@@ -492,17 +500,19 @@
       TRUE, FALSE);
 
   tmp = g_array_new (FALSE, FALSE, sizeof (MXFUL));
-  for (l = mux->collect->data; l; l = l->next) {
-    GstMXFMuxPad *cpad = l->data;
+  for (l = GST_ELEMENT_CAST (mux)->sinkpads; l; l = l->next) {
+    GstMXFMuxPad *pad = l->data;
     guint i;
     gboolean found = FALSE;
 
-    if (!cpad || !cpad->descriptor ||
-        mxf_ul_is_zero (&cpad->descriptor->essence_container))
+    if (!pad || !pad->descriptor ||
+        mxf_ul_is_zero (&pad->descriptor->essence_container)) {
+      GST_OBJECT_UNLOCK (mux);
       return GST_FLOW_ERROR;
+    }
 
     for (i = 0; i < tmp->len; i++) {
-      if (mxf_ul_is_equal (&cpad->descriptor->essence_container,
+      if (mxf_ul_is_equal (&pad->descriptor->essence_container,
               &g_array_index (tmp, MXFUL, i))) {
         found = TRUE;
         break;
@@ -512,7 +522,7 @@
     if (found)
       continue;
 
-    g_array_append_val (tmp, cpad->descriptor->essence_container);
+    g_array_append_val (tmp, pad->descriptor->essence_container);
   }
   mux->preface->n_essence_containers = tmp->len;
   mux->preface->essence_containers = (MXFUL *) g_array_free (tmp, FALSE);
@@ -623,7 +633,7 @@
       memcpy (&p->parent.package_modified_date,
           &mux->preface->last_modified_date, sizeof (MXFTimestamp));
 
-      p->parent.n_tracks = g_slist_length (mux->collect->data);
+      p->parent.n_tracks = GST_ELEMENT_CAST (mux)->numsinkpads;
       p->parent.tracks = g_new0 (MXFMetadataTrack *, p->parent.n_tracks);
 
       if (p->parent.n_tracks > 1) {
@@ -647,12 +657,13 @@
         guint n = 0;
 
         /* Essence tracks */
-        for (l = mux->collect->data; l; l = l->next) {
-          GstMXFMuxPad *cpad = l->data;
+        for (l = GST_ELEMENT_CAST (mux)->sinkpads; l; l = l->next) {
+          GstMXFMuxPad *pad = l->data;
           MXFMetadataTimelineTrack *track;
           MXFMetadataSequence *sequence;
           MXFMetadataSourceClip *clip;
           GstCaps *caps;
+          GstBuffer *buffer;
 
           p->parent.tracks[n] = (MXFMetadataTrack *)
               g_object_new (MXF_TYPE_METADATA_TIMELINE_TRACK, NULL);
@@ -663,15 +674,21 @@
               &MXF_METADATA_BASE (track)->instance_uid, track);
           mux->metadata_list = g_list_prepend (mux->metadata_list, track);
 
-          caps = gst_pad_get_current_caps (cpad->collect.pad);
+          caps = gst_pad_get_current_caps (GST_PAD_CAST (pad));
+          buffer = gst_aggregator_pad_get_buffer (GST_AGGREGATOR_PAD (pad));
           track->parent.track_id = n + 1;
           track->parent.track_number =
-              cpad->writer->get_track_number_template (cpad->descriptor,
-              caps, cpad->mapping_data);
+              pad->writer->get_track_number_template (pad->descriptor,
+              caps, pad->mapping_data);
 
-          cpad->writer->get_edit_rate (cpad->descriptor,
-              caps, cpad->mapping_data,
-              cpad->collect.buffer, p, track, &track->edit_rate);
+          /* FIXME: All tracks in a source package must have the same edit
+           * rate! This means that if we have different edit rates, we need to
+           * make them different source packages and essence containers with
+           * a different BodySID */
+          pad->writer->get_edit_rate (pad->descriptor,
+              caps, pad->mapping_data, buffer, p, track, &track->edit_rate);
+          if (buffer)
+            gst_buffer_unref (buffer);
           gst_caps_unref (caps);
 
           sequence = track->parent.sequence = (MXFMetadataSequence *)
@@ -682,7 +699,7 @@
               &MXF_METADATA_BASE (sequence)->instance_uid, sequence);
           mux->metadata_list = g_list_prepend (mux->metadata_list, sequence);
 
-          memcpy (&sequence->data_definition, &cpad->writer->data_definition,
+          memcpy (&sequence->data_definition, &pad->writer->data_definition,
               16);
 
           sequence->n_structural_components = 1;
@@ -703,15 +720,15 @@
               16);
           clip->start_position = 0;
 
-          cpad->source_package = p;
-          cpad->source_track = track;
-          cpad->descriptor->linked_track_id = n + 1;
+          pad->source_package = p;
+          pad->source_track = track;
+          pad->descriptor->linked_track_id = n + 1;
           if (p->parent.n_tracks == 1) {
-            p->descriptor = (MXFMetadataGenericDescriptor *) cpad->descriptor;
+            p->descriptor = (MXFMetadataGenericDescriptor *) pad->descriptor;
           } else {
             MXF_METADATA_MULTIPLE_DESCRIPTOR (p->
                 descriptor)->sub_descriptors[n] =
-                (MXFMetadataGenericDescriptor *) cpad->descriptor;
+                (MXFMetadataGenericDescriptor *) pad->descriptor;
           }
 
           n++;
@@ -743,7 +760,7 @@
       memcpy (&p->package_modified_date, &mux->preface->last_modified_date,
           sizeof (MXFTimestamp));
 
-      p->n_tracks = g_slist_length (mux->collect->data) + 1;
+      p->n_tracks = GST_ELEMENT_CAST (mux)->numsinkpads + 1;
       p->tracks = g_new0 (MXFMetadataTrack *, p->n_tracks);
 
       /* Tracks */
@@ -752,9 +769,10 @@
 
         n = 1;
         /* Essence tracks */
-        for (l = mux->collect->data; l; l = l->next) {
-          GstMXFMuxPad *cpad = l->data;
+        for (l = GST_ELEMENT_CAST (mux)->sinkpads; l; l = l->next) {
+          GstMXFMuxPad *pad = l->data;
           GstCaps *caps;
+          GstBuffer *buffer;
           MXFMetadataSourcePackage *source_package;
           MXFMetadataTimelineTrack *track, *source_track;
           MXFMetadataSequence *sequence;
@@ -777,11 +795,13 @@
           track->parent.track_id = n + 1;
           track->parent.track_number = 0;
 
-          caps = gst_pad_get_current_caps (cpad->collect.pad);
-          cpad->writer->get_edit_rate (cpad->descriptor,
-              caps, cpad->mapping_data,
-              cpad->collect.buffer, source_package, source_track,
-              &track->edit_rate);
+          caps = gst_pad_get_current_caps (GST_PAD_CAST (pad));
+          buffer = gst_aggregator_pad_get_buffer (GST_AGGREGATOR_PAD (pad));
+          pad->writer->get_edit_rate (pad->descriptor,
+              caps, pad->mapping_data,
+              buffer, source_package, source_track, &track->edit_rate);
+          if (buffer)
+            gst_buffer_unref (buffer);
           gst_caps_unref (caps);
 
           if (track->edit_rate.n != source_track->edit_rate.n ||
@@ -792,6 +812,7 @@
 
           if (track->edit_rate.d <= 0 || track->edit_rate.n <= 0) {
             GST_ERROR_OBJECT (mux, "Invalid edit rate");
+            GST_OBJECT_UNLOCK (mux);
             return GST_FLOW_ERROR;
           }
 
@@ -810,7 +831,7 @@
               &MXF_METADATA_BASE (sequence)->instance_uid, sequence);
           mux->metadata_list = g_list_prepend (mux->metadata_list, sequence);
 
-          memcpy (&sequence->data_definition, &cpad->writer->data_definition,
+          memcpy (&sequence->data_definition, &pad->writer->data_definition,
               16);
           sequence->n_structural_components = 1;
           sequence->structural_components =
@@ -949,7 +970,7 @@
 
     cstorage->essence_container_data[0]->linked_package =
         MXF_METADATA_SOURCE_PACKAGE (cstorage->packages[1]);
-    cstorage->essence_container_data[0]->index_sid = 0;
+    cstorage->essence_container_data[0]->index_sid = 1;
     cstorage->essence_container_data[0]->body_sid = 1;
   }
 
@@ -988,6 +1009,8 @@
     }
   }
 
+  GST_OBJECT_UNLOCK (mux);
+
   mux->metadata_list = g_list_reverse (mux->metadata_list);
 
   return ret;
@@ -996,7 +1019,7 @@
 static GstFlowReturn
 gst_mxf_mux_init_partition_pack (GstMXFMux * mux)
 {
-  GSList *l;
+  GList *l;
   guint i = 0;
 
   mxf_partition_pack_reset (&mux->partition);
@@ -1004,7 +1027,7 @@
   mux->partition.closed = mux->partition.complete = FALSE;
   mux->partition.major_version = 0x0001;
   mux->partition.minor_version = 0x0002;
-  mux->partition.kag_size = 0;
+  mux->partition.kag_size = 1;
   mux->partition.this_partition = 0;
   mux->partition.prev_partition = 0;
   mux->partition.footer_partition = 0;
@@ -1017,17 +1040,18 @@
   memcpy (&mux->partition.operational_pattern,
       &mux->preface->operational_pattern, 16);
 
-  mux->partition.n_essence_containers = g_slist_length (mux->collect->data);
+  GST_OBJECT_LOCK (mux);
+  mux->partition.n_essence_containers = GST_ELEMENT_CAST (mux)->numsinkpads;
   mux->partition.essence_containers =
       g_new0 (MXFUL, mux->partition.n_essence_containers);
 
-  for (l = mux->collect->data; l; l = l->next) {
-    GstMXFMuxPad *cpad = l->data;
+  for (l = GST_ELEMENT_CAST (mux)->sinkpads; l; l = l->next) {
+    GstMXFMuxPad *pad = l->data;
     guint j;
     gboolean found = FALSE;
 
     for (j = 0; j <= i; j++) {
-      if (mxf_ul_is_equal (&cpad->descriptor->essence_container,
+      if (mxf_ul_is_equal (&pad->descriptor->essence_container,
               &mux->partition.essence_containers[j])) {
         found = TRUE;
         break;
@@ -1038,10 +1062,11 @@
       continue;
 
     memcpy (&mux->partition.essence_containers[i],
-        &cpad->descriptor->essence_container, 16);
+        &pad->descriptor->essence_container, 16);
     i++;
   }
   mux->partition.n_essence_containers = i;
+  GST_OBJECT_UNLOCK (mux);
 
   return GST_FLOW_OK;
 }
@@ -1096,93 +1121,138 @@
 }
 
 static const guint8 _gc_essence_element_ul[] = {
-  0x06, 0x0e, 0x2b, 0x34, 0x01, 0x02, 0x01, 0x00,
+  0x06, 0x0e, 0x2b, 0x34, 0x01, 0x02, 0x01, 0x01,
   0x0d, 0x01, 0x03, 0x01, 0x00, 0x00, 0x00, 0x00
 };
 
 static GstFlowReturn
-gst_mxf_mux_handle_buffer (GstMXFMux * mux, GstMXFMuxPad * cpad)
+gst_mxf_mux_handle_buffer (GstMXFMux * mux, GstMXFMuxPad * pad)
 {
-  GstBuffer *buf = NULL;
+  GstBuffer *buf = gst_aggregator_pad_get_buffer (GST_AGGREGATOR_PAD (pad));
   GstBuffer *outbuf = NULL;
-  GstBuffer *packet;
   GstMapInfo map;
-  GstMapInfo readmap;
+  gsize buf_size;
   GstFlowReturn ret = GST_FLOW_OK;
   guint8 slen, ber[9];
-  gboolean flush = ((cpad->collect.state & GST_COLLECT_PADS_STATE_EOS)
-      && !cpad->have_complete_edit_unit && cpad->collect.buffer == NULL);
+  gboolean flush = gst_aggregator_pad_is_eos (GST_AGGREGATOR_PAD (pad))
+      && !pad->have_complete_edit_unit && buf == NULL;
+  gboolean is_keyframe = buf ?
+      !GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT) : TRUE;
 
-  if (cpad->have_complete_edit_unit) {
-    GST_DEBUG_OBJECT (cpad->collect.pad,
+  if (pad->have_complete_edit_unit) {
+    GST_DEBUG_OBJECT (pad,
         "Handling remaining buffer for track %u at position %" G_GINT64_FORMAT,
-        cpad->source_track->parent.track_id, cpad->pos);
+        pad->source_track->parent.track_id, pad->pos);
+    if (buf)
+      gst_buffer_unref (buf);
     buf = NULL;
   } else if (!flush) {
-    buf = gst_collect_pads_pop (mux->collect, &cpad->collect);
+    if (buf)
+      gst_buffer_unref (buf);
+    buf = gst_aggregator_pad_steal_buffer (GST_AGGREGATOR_PAD (pad));
   }
 
   if (buf) {
-    GST_DEBUG_OBJECT (cpad->collect.pad,
+    GST_DEBUG_OBJECT (pad,
         "Handling buffer of size %" G_GSIZE_FORMAT " for track %u at position %"
         G_GINT64_FORMAT, gst_buffer_get_size (buf),
-        cpad->source_track->parent.track_id, cpad->pos);
+        pad->source_track->parent.track_id, pad->pos);
   } else {
     flush = TRUE;
-    GST_DEBUG_OBJECT (cpad->collect.pad,
+    GST_DEBUG_OBJECT (pad,
         "Flushing for track %u at position %" G_GINT64_FORMAT,
-        cpad->source_track->parent.track_id, cpad->pos);
+        pad->source_track->parent.track_id, pad->pos);
   }
 
-  ret = cpad->write_func (buf,
-      cpad->mapping_data, cpad->adapter, &outbuf, flush);
+  ret = pad->write_func (buf, pad->mapping_data, pad->adapter, &outbuf, flush);
   if (ret != GST_FLOW_OK && ret != GST_FLOW_CUSTOM_SUCCESS) {
-    GST_ERROR_OBJECT (cpad->collect.pad,
+    GST_ERROR_OBJECT (pad,
         "Failed handling buffer for track %u, reason %s",
-        cpad->source_track->parent.track_id, gst_flow_get_name (ret));
+        pad->source_track->parent.track_id, gst_flow_get_name (ret));
     return ret;
   }
 
   if (ret == GST_FLOW_CUSTOM_SUCCESS) {
-    cpad->have_complete_edit_unit = TRUE;
+    pad->have_complete_edit_unit = TRUE;
     ret = GST_FLOW_OK;
   } else {
-    cpad->have_complete_edit_unit = FALSE;
+    pad->have_complete_edit_unit = FALSE;
   }
 
   buf = outbuf;
   if (buf == NULL)
     return ret;
 
-  gst_buffer_map (buf, &readmap, GST_MAP_READ);
-  slen = mxf_ber_encode_size (readmap.size, ber);
-  packet = gst_buffer_new_and_alloc (16 + slen + readmap.size);
-  gst_buffer_map (packet, &map, GST_MAP_WRITE);
+  /* We currently only index the first essence stream */
+  if (pad == (GstMXFMuxPad *) GST_ELEMENT_CAST (mux)->sinkpads->data) {
+    MXFIndexTableSegment *segment;
+    const gint max_segment_size = G_MAXUINT16 / 11;
+
+    if (mux->index_table->len == 0 ||
+        g_array_index (mux->index_table, MXFIndexTableSegment,
+            mux->index_table->len - 1).index_duration >= max_segment_size) {
+      MXFIndexTableSegment s;
+
+      memset (&segment, 0, sizeof (segment));
+
+      mxf_uuid_init (&s.instance_id, mux->metadata);
+      memcpy (&s.index_edit_rate, &pad->source_track->edit_rate,
+          sizeof (s.index_edit_rate));
+      s.index_start_position = pad->pos;
+      s.index_duration = 0;
+      s.edit_unit_byte_count = 0;
+      s.index_sid =
+          mux->preface->content_storage->essence_container_data[0]->index_sid;
+      s.body_sid =
+          mux->preface->content_storage->essence_container_data[0]->body_sid;
+      s.slice_count = 0;
+      s.pos_table_count = 0;
+      s.n_delta_entries = 0;
+      s.delta_entries = NULL;
+      s.n_index_entries = 0;
+      s.index_entries = g_new0 (MXFIndexEntry, max_segment_size);
+      g_array_append_val (mux->index_table, s);
+    }
+    segment =
+        &g_array_index (mux->index_table, MXFIndexTableSegment,
+        mux->index_table->len - 1);
+
+    segment->index_entries[segment->n_index_entries].temporal_offset = 0;
+    segment->index_entries[segment->n_index_entries].key_frame_offset = 0;
+    segment->index_entries[segment->n_index_entries].flags = is_keyframe ? 0x80 : 0x20; /* FIXME: Need to distinguish all the cases */
+    segment->index_entries[segment->n_index_entries].stream_offset =
+        mux->partition.body_offset;
+
+    segment->n_index_entries++;
+    segment->index_duration++;
+  }
+
+  buf_size = gst_buffer_get_size (buf);
+  slen = mxf_ber_encode_size (buf_size, ber);
+  outbuf = gst_buffer_new_and_alloc (16 + slen);
+  gst_buffer_map (outbuf, &map, GST_MAP_WRITE);
   memcpy (map.data, _gc_essence_element_ul, 16);
-  map.data[7] = cpad->descriptor->essence_container.u[7];
-  GST_WRITE_UINT32_BE (map.data + 12, cpad->source_track->parent.track_number);
+  GST_WRITE_UINT32_BE (map.data + 12, pad->source_track->parent.track_number);
   memcpy (map.data + 16, ber, slen);
-  memcpy (map.data + 16 + slen, readmap.data, readmap.size);
-  gst_buffer_unmap (buf, &readmap);
+  gst_buffer_unmap (outbuf, &map);
+  outbuf = gst_buffer_append (outbuf, buf);
 
-  gst_buffer_unref (buf);
+  GST_DEBUG_OBJECT (pad,
+      "Pushing buffer of size %" G_GSIZE_FORMAT " for track %u",
+      gst_buffer_get_size (outbuf), pad->source_track->parent.track_id);
 
-  GST_DEBUG_OBJECT (cpad->collect.pad,
-      "Pushing buffer of size %" G_GSIZE_FORMAT " for track %u", map.size,
-      cpad->source_track->parent.track_id);
-  gst_buffer_unmap (packet, &map);
-
-  if ((ret = gst_mxf_mux_push (mux, packet)) != GST_FLOW_OK) {
-    GST_ERROR_OBJECT (cpad->collect.pad,
+  mux->partition.body_offset += gst_buffer_get_size (outbuf);
+  if ((ret = gst_mxf_mux_push (mux, outbuf)) != GST_FLOW_OK) {
+    GST_ERROR_OBJECT (pad,
         "Failed pushing buffer for track %u, reason %s",
-        cpad->source_track->parent.track_id, gst_flow_get_name (ret));
+        pad->source_track->parent.track_id, gst_flow_get_name (ret));
     return ret;
   }
 
-  cpad->pos++;
-  cpad->last_timestamp =
-      gst_util_uint64_scale (GST_SECOND * cpad->pos,
-      cpad->source_track->edit_rate.d, cpad->source_track->edit_rate.n);
+  pad->pos++;
+  pad->last_timestamp =
+      gst_util_uint64_scale (GST_SECOND * pad->pos,
+      pad->source_track->edit_rate.d, pad->source_track->edit_rate.n);
 
   return ret;
 }
@@ -1210,7 +1280,7 @@
 static GstFlowReturn
 gst_mxf_mux_handle_eos (GstMXFMux * mux)
 {
-  GSList *l;
+  GList *l;
   gboolean have_data = FALSE;
   GstBuffer *packet;
 
@@ -1219,33 +1289,40 @@
 
     have_data = FALSE;
 
-    for (l = mux->collect->data; l; l = l->next) {
-      GstMXFMuxPad *cpad = l->data;
+    GST_OBJECT_LOCK (mux);
+    for (l = GST_ELEMENT_CAST (mux)->sinkpads; l; l = l->next) {
+      GstMXFMuxPad *pad = l->data;
+      GstBuffer *buffer =
+          gst_aggregator_pad_get_buffer (GST_AGGREGATOR_PAD (pad));
+
       GstClockTime next_gc_timestamp =
           gst_util_uint64_scale ((mux->last_gc_position + 1) * GST_SECOND,
           mux->min_edit_rate.d, mux->min_edit_rate.n);
 
-      best = NULL;
-
-      if (cpad->have_complete_edit_unit ||
-          gst_adapter_available (cpad->adapter) > 0 || cpad->collect.buffer) {
+      if (pad->have_complete_edit_unit ||
+          gst_adapter_available (pad->adapter) > 0 || buffer) {
         have_data = TRUE;
-        if (cpad->last_timestamp < next_gc_timestamp) {
-          best = cpad;
+        if (pad->last_timestamp < next_gc_timestamp) {
+          best = gst_object_ref (pad);
+          if (buffer)
+            gst_buffer_unref (buffer);
           break;
         }
       }
+      if (buffer)
+        gst_buffer_unref (buffer);
 
       if (have_data && !l->next) {
         mux->last_gc_position++;
         mux->last_gc_timestamp = next_gc_timestamp;
-        best = NULL;
         break;
       }
     }
+    GST_OBJECT_UNLOCK (mux);
 
     if (best) {
       gst_mxf_mux_handle_buffer (mux, best);
+      gst_object_unref (best);
       have_data = TRUE;
     }
   } while (have_data);
@@ -1256,14 +1333,15 @@
       mux->min_edit_rate.d, mux->min_edit_rate.n);
 
   /* Update essence track durations */
-  for (l = mux->collect->data; l; l = l->next) {
-    GstMXFMuxPad *cpad = l->data;
+  GST_OBJECT_LOCK (mux);
+  for (l = GST_ELEMENT_CAST (mux)->sinkpads; l; l = l->next) {
+    GstMXFMuxPad *pad = l->data;
     guint i;
 
     /* Update durations */
-    cpad->source_track->parent.sequence->duration = cpad->pos;
-    MXF_METADATA_SOURCE_CLIP (cpad->source_track->parent.
-        sequence->structural_components[0])->parent.duration = cpad->pos;
+    pad->source_track->parent.sequence->duration = pad->pos;
+    MXF_METADATA_SOURCE_CLIP (pad->source_track->parent.
+        sequence->structural_components[0])->parent.duration = pad->pos;
     for (i = 0; i < mux->preface->content_storage->packages[0]->n_tracks; i++) {
       MXFMetadataTimelineTrack *track;
 
@@ -1279,12 +1357,13 @@
           content_storage->packages[0]->tracks[i]);
       if (MXF_METADATA_SOURCE_CLIP (track->parent.
               sequence->structural_components[0])->source_track_id ==
-          cpad->source_track->parent.track_id) {
-        track->parent.sequence->structural_components[0]->duration = cpad->pos;
-        track->parent.sequence->duration = cpad->pos;
+          pad->source_track->parent.track_id) {
+        track->parent.sequence->structural_components[0]->duration = pad->pos;
+        track->parent.sequence->duration = pad->pos;
       }
     }
   }
+  GST_OBJECT_UNLOCK (mux);
 
   /* Update timecode track duration */
   {
@@ -1307,6 +1386,18 @@
     GstFlowReturn ret;
     GstSegment segment;
     MXFRandomIndexPackEntry entry;
+    GList *index_entries = NULL, *l;
+    guint index_byte_count = 0;
+    guint i;
+
+    for (i = 0; i < mux->index_table->len; i++) {
+      MXFIndexTableSegment *segment =
+          &g_array_index (mux->index_table, MXFIndexTableSegment, i);
+      GstBuffer *segment_buffer = mxf_index_table_segment_to_buffer (segment);
+
+      index_byte_count += gst_buffer_get_size (segment_buffer);
+      index_entries = g_list_prepend (index_entries, segment_buffer);
+    }
 
     mux->partition.type = MXF_PARTITION_PACK_FOOTER;
     mux->partition.closed = TRUE;
@@ -1315,13 +1406,22 @@
     mux->partition.prev_partition = body_partition;
     mux->partition.footer_partition = mux->offset;
     mux->partition.header_byte_count = 0;
-    mux->partition.index_byte_count = 0;
-    mux->partition.index_sid = 0;
+    mux->partition.index_byte_count = index_byte_count;
+    mux->partition.index_sid =
+        mux->preface->content_storage->essence_container_data[0]->index_sid;
     mux->partition.body_offset = 0;
     mux->partition.body_sid = 0;
 
     gst_mxf_mux_write_header_metadata (mux);
 
+    index_entries = g_list_reverse (index_entries);
+    for (l = index_entries; l; l = l->next) {
+      if ((ret = gst_mxf_mux_push (mux, l->data)) != GST_FLOW_OK) {
+        GST_ERROR_OBJECT (mux, "Failed pushing index table segment");
+      }
+    }
+    g_list_free (index_entries);
+
     rip = g_array_sized_new (FALSE, FALSE, sizeof (MXFRandomIndexPackEntry), 3);
     entry.offset = 0;
     entry.body_sid = 0;
@@ -1341,13 +1441,14 @@
 
     /* Rewrite header partition with updated values */
     gst_segment_init (&segment, GST_FORMAT_BYTES);
-    if (gst_pad_push_event (mux->srcpad, gst_event_new_segment (&segment))) {
+    if (gst_pad_push_event (GST_AGGREGATOR_SRC_PAD (mux),
+            gst_event_new_segment (&segment))) {
       mux->offset = 0;
       mux->partition.type = MXF_PARTITION_PACK_HEADER;
       mux->partition.closed = TRUE;
       mux->partition.complete = TRUE;
       mux->partition.this_partition = 0;
-      mux->partition.prev_partition = footer_partition;
+      mux->partition.prev_partition = 0;
       mux->partition.footer_partition = footer_partition;
       mux->partition.header_byte_count = 0;
       mux->partition.index_byte_count = 0;
@@ -1384,16 +1485,33 @@
       pa->source_track->parent.track_number;
 }
 
-static GstFlowReturn
-gst_mxf_mux_collected (GstCollectPads * pads, gpointer user_data)
+
+static gboolean
+gst_mxf_mux_stop (GstAggregator * aggregator)
 {
-  GstMXFMux *mux = GST_MXF_MUX (user_data);
+  GstMXFMux *mux = GST_MXF_MUX (aggregator);
+
+  gst_mxf_mux_reset (mux);
+
+  return TRUE;
+}
+
+static GstFlowReturn
+gst_mxf_mux_aggregate (GstAggregator * aggregator, gboolean timeout)
+{
+  GstMXFMux *mux = GST_MXF_MUX (aggregator);
   GstMXFMuxPad *best = NULL;
   GstFlowReturn ret;
-  GstSegment segment;
-  GSList *sl;
+  GList *l;
   gboolean eos = TRUE;
 
+  if (timeout) {
+    GST_ELEMENT_ERROR (mux, STREAM, MUX, (NULL),
+        ("Live mixing and got a timeout. This is not supported yet"));
+    ret = GST_FLOW_ERROR;
+    goto error;
+  }
+
   if (mux->state == GST_MXF_MUX_STATE_ERROR) {
     GST_ERROR_OBJECT (mux, "Had an error before -- returning");
     return GST_FLOW_ERROR;
@@ -1403,31 +1521,33 @@
   }
 
   if (mux->state == GST_MXF_MUX_STATE_HEADER) {
-    if (mux->collect->data == NULL) {
+    GstCaps *caps;
+
+    if (GST_ELEMENT_CAST (mux)->sinkpads == NULL) {
       GST_ELEMENT_ERROR (mux, STREAM, MUX, (NULL),
           ("No input streams configured"));
       ret = GST_FLOW_ERROR;
       goto error;
     }
 
-    gst_segment_init (&segment, GST_FORMAT_BYTES);
-    if (gst_pad_push_event (mux->srcpad, gst_event_new_segment (&segment))) {
-      if ((ret = gst_mxf_mux_create_metadata (mux)) != GST_FLOW_OK)
-        goto error;
+    caps = gst_caps_new_empty_simple ("application/mxf");
+    gst_aggregator_set_src_caps (GST_AGGREGATOR (mux), caps);
+    gst_caps_unref (caps);
 
-      if ((ret = gst_mxf_mux_init_partition_pack (mux)) != GST_FLOW_OK)
-        goto error;
+    if ((ret = gst_mxf_mux_create_metadata (mux)) != GST_FLOW_OK)
+      goto error;
 
-      ret = gst_mxf_mux_write_header_metadata (mux);
-    } else {
-      ret = GST_FLOW_ERROR;
-    }
+    if ((ret = gst_mxf_mux_init_partition_pack (mux)) != GST_FLOW_OK)
+      goto error;
 
-    if (ret != GST_FLOW_OK)
+    if ((ret = gst_mxf_mux_write_header_metadata (mux)) != GST_FLOW_OK)
       goto error;
 
     /* Sort pads, we will always write in that order */
-    mux->collect->data = g_slist_sort (mux->collect->data, _sort_mux_pads);
+    GST_OBJECT_LOCK (mux);
+    GST_ELEMENT_CAST (mux)->sinkpads =
+        g_list_sort (GST_ELEMENT_CAST (mux)->sinkpads, _sort_mux_pads);
+    GST_OBJECT_UNLOCK (mux);
 
     /* Write body partition */
     ret = gst_mxf_mux_write_body_partition (mux);
@@ -1439,43 +1559,59 @@
   g_return_val_if_fail (g_hash_table_size (mux->metadata) > 0, GST_FLOW_ERROR);
 
   do {
-    for (sl = mux->collect->data; sl; sl = sl->next) {
+    GST_OBJECT_LOCK (mux);
+    for (l = GST_ELEMENT_CAST (mux)->sinkpads; l; l = l->next) {
       gboolean pad_eos;
-      GstMXFMuxPad *cpad = sl->data;
+      GstMXFMuxPad *pad = l->data;
+      GstBuffer *buffer;
       GstClockTime next_gc_timestamp =
           gst_util_uint64_scale ((mux->last_gc_position + 1) * GST_SECOND,
           mux->min_edit_rate.d, mux->min_edit_rate.n);
 
-      pad_eos = cpad->collect.state & GST_COLLECT_PADS_STATE_EOS;
+      pad_eos = gst_aggregator_pad_is_eos (GST_AGGREGATOR_PAD (pad));
       if (!pad_eos)
         eos = FALSE;
 
-      if ((!pad_eos || cpad->have_complete_edit_unit ||
-              gst_adapter_available (cpad->adapter) > 0 || cpad->collect.buffer)
-          && cpad->last_timestamp < next_gc_timestamp) {
-        best = cpad;
+      buffer = gst_aggregator_pad_get_buffer (GST_AGGREGATOR_PAD (pad));
+
+      if ((!pad_eos || pad->have_complete_edit_unit ||
+              gst_adapter_available (pad->adapter) > 0 || buffer)
+          && pad->last_timestamp < next_gc_timestamp) {
+        if (buffer)
+          gst_buffer_unref (buffer);
+        best = gst_object_ref (pad);
         break;
-      } else if (!eos && !sl->next) {
+      } else if (!eos && !l->next) {
         mux->last_gc_position++;
         mux->last_gc_timestamp = next_gc_timestamp;
         eos = FALSE;
+        if (buffer)
+          gst_buffer_unref (buffer);
         best = NULL;
         break;
       }
+      if (buffer)
+        gst_buffer_unref (buffer);
     }
+    GST_OBJECT_UNLOCK (mux);
   } while (!eos && best == NULL);
 
   if (!eos && best) {
     ret = gst_mxf_mux_handle_buffer (mux, best);
+    gst_object_unref (best);
     if (ret != GST_FLOW_OK)
       goto error;
   } else if (eos) {
     GST_DEBUG_OBJECT (mux, "Handling EOS");
 
+    if (best)
+      gst_object_unref (best);
+
     gst_mxf_mux_handle_eos (mux);
-    gst_pad_push_event (mux->srcpad, gst_event_new_eos ());
     mux->state = GST_MXF_MUX_STATE_EOS;
     return GST_FLOW_EOS;
+  } else {
+    g_assert_not_reached ();
   }
 
   return GST_FLOW_OK;
@@ -1483,45 +1619,6 @@
 error:
   {
     mux->state = GST_MXF_MUX_STATE_ERROR;
-    gst_pad_push_event (mux->srcpad, gst_event_new_eos ());
     return ret;
   }
 }
-
-static GstStateChangeReturn
-gst_mxf_mux_change_state (GstElement * element, GstStateChange transition)
-{
-  GstStateChangeReturn ret;
-  GstMXFMux *mux = GST_MXF_MUX (element);
-
-  switch (transition) {
-    case GST_STATE_CHANGE_NULL_TO_READY:
-      break;
-    case GST_STATE_CHANGE_READY_TO_PAUSED:
-      gst_collect_pads_start (mux->collect);
-      break;
-    case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
-      break;
-    case GST_STATE_CHANGE_PAUSED_TO_READY:
-      gst_collect_pads_stop (mux->collect);
-      break;
-    default:
-      break;
-  }
-
-  ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
-
-  switch (transition) {
-    case GST_STATE_CHANGE_PLAYING_TO_PAUSED:
-      break;
-    case GST_STATE_CHANGE_PAUSED_TO_READY:
-      gst_mxf_mux_reset (mux);
-      break;
-    case GST_STATE_CHANGE_READY_TO_NULL:
-      break;
-    default:
-      break;
-  }
-
-  return ret;
-}
diff --git a/gst/mxf/mxfmux.h b/gst/mxf/mxfmux.h
index 7b83427..e887362 100644
--- a/gst/mxf/mxfmux.h
+++ b/gst/mxf/mxfmux.h
@@ -22,7 +22,7 @@
 
 #include <gst/gst.h>
 #include <gst/base/gstadapter.h>
-#include <gst/base/gstcollectpads.h>
+#include <gst/base/gstaggregator.h>
 
 #include "mxfessence.h"
 
@@ -39,26 +39,6 @@
 #define GST_IS_MXF_MUX_CLASS(klass) \
   (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_MXF_MUX))
 
-typedef struct
-{
-  GstCollectData collect;
-
-  guint64 pos;
-  GstClockTime last_timestamp;
-
-  MXFMetadataFileDescriptor *descriptor;
-
-  GstAdapter *adapter;
-  gboolean have_complete_edit_unit;
-
-  gpointer mapping_data;
-  const MXFEssenceElementWriter *writer;
-  MXFEssenceElementWriteFunc write_func;
-
-  MXFMetadataSourcePackage *source_package;
-  MXFMetadataTimelineTrack *source_track;
-} GstMXFMuxPad;
-
 typedef enum
 {
   GST_MXF_MUX_STATE_HEADER,
@@ -68,14 +48,9 @@
 } GstMXFMuxState;
 
 typedef struct _GstMXFMux {
-  GstElement element;
-
-  GstPad *srcpad;
-  GstCollectPads *collect;
+  GstAggregator parent;
 
   /* <private> */
-  GstPadEventFunction collect_event;
-
   GstMXFMuxState state;
   guint n_pads;
 
@@ -83,7 +58,7 @@
 
   MXFPartitionPack partition;
   MXFPrimerPack primer;
-  
+
   GHashTable *metadata;
   GList *metadata_list;
   MXFMetadataPreface *preface;
@@ -93,10 +68,12 @@
   GstClockTime last_gc_timestamp;
 
   gchar *application;
+
+  GArray *index_table;
 } GstMXFMux;
 
 typedef struct _GstMXFMuxClass {
-  GstElementClass parent;
+  GstAggregatorClass parent;
 } GstMXFMuxClass;
 
 GType gst_mxf_mux_get_type (void);
diff --git a/gst/mxf/mxftypes.c b/gst/mxf/mxftypes.c
index 55ac8be..ab04427 100644
--- a/gst/mxf/mxftypes.c
+++ b/gst/mxf/mxftypes.c
@@ -22,6 +22,7 @@
 #endif
 
 #include <gst/gst.h>
+#include <gst/base/gstbytewriter.h>
 #include <string.h>
 
 #include "mxftypes.h"
@@ -746,13 +747,13 @@
   else if (pattern == MXF_OP_1c || pattern == MXF_OP_2c || pattern == MXF_OP_3c)
     ul->u[13] = 0x02;
 
-  ul->u[14] = 0x80;
+  ul->u[14] = 0x08;
   if (!internal_essence)
-    ul->u[14] |= 0x40;
+    ul->u[14] |= 0x04;
   if (!streamable)
-    ul->u[14] |= 0x20;
+    ul->u[14] |= 0x02;
   if (!single_track)
-    ul->u[14] |= 0x10;
+    ul->u[14] |= 0x01;
 
   ul->u[15] = 0;
 }
@@ -1061,8 +1062,7 @@
 /* SMPTE 377M 10.2.3 */
 gboolean
 mxf_index_table_segment_parse (const MXFUL * ul,
-    MXFIndexTableSegment * segment, const MXFPrimerPack * primer,
-    const guint8 * data, guint size)
+    MXFIndexTableSegment * segment, const guint8 * data, guint size)
 {
 #ifndef GST_DISABLE_GST_DEBUG
   gchar str[48];
@@ -1072,7 +1072,6 @@
 
   g_return_val_if_fail (ul != NULL, FALSE);
   g_return_val_if_fail (data != NULL, FALSE);
-  g_return_val_if_fail (primer != NULL, FALSE);
 
   memset (segment, 0, sizeof (MXFIndexTableSegment));
 
@@ -1082,8 +1081,11 @@
   GST_DEBUG ("Parsing index table segment:");
 
   while (mxf_local_tag_parse (data, size, &tag, &tag_size, &tag_data)) {
+    data += 4 + tag_size;
+    size -= 4 + tag_size;
+
     if (tag_size == 0 || tag == 0x0000)
-      goto next;
+      continue;
 
     switch (tag) {
       case 0x3c0a:
@@ -1154,7 +1156,7 @@
         segment->n_delta_entries = len;
         GST_DEBUG ("  number of delta entries = %u", segment->n_delta_entries);
         if (len == 0)
-          goto next;
+          continue;
         tag_data += 4;
         tag_size -= 4;
 
@@ -1202,7 +1204,7 @@
         segment->n_index_entries = len;
         GST_DEBUG ("  number of index entries = %u", segment->n_index_entries);
         if (len == 0)
-          goto next;
+          continue;
         tag_data += 4;
         tag_size -= 4;
 
@@ -1265,18 +1267,11 @@
         break;
       }
       default:
-        if (!primer->mappings) {
-          GST_WARNING ("No valid primer pack for this partition");
-        } else if (!mxf_local_tag_add_to_hash_table (primer, tag, tag_data,
-                tag_size, &segment->other_tags)) {
-          goto error;
-        }
+        GST_WARNING
+            ("Unknown local tag 0x%04x of size %d in index table segment", tag,
+            tag_size);
         break;
     }
-
-  next:
-    data += 4 + tag_size;
-    size -= 4 + tag_size;
   }
   return TRUE;
 
@@ -1301,12 +1296,128 @@
   g_free (segment->index_entries);
   g_free (segment->delta_entries);
 
-  if (segment->other_tags)
-    g_hash_table_destroy (segment->other_tags);
-
   memset (segment, 0, sizeof (MXFIndexTableSegment));
 }
 
+GstBuffer *
+mxf_index_table_segment_to_buffer (const MXFIndexTableSegment * segment)
+{
+  guint len, slen, i;
+  guint8 ber[9];
+  GstBuffer *ret;
+  GstMapInfo map;
+  GstByteWriter bw;
+
+  g_return_val_if_fail (segment != NULL, NULL);
+  g_return_val_if_fail (segment->n_delta_entries * 6 < G_MAXUINT16, NULL);
+  g_return_val_if_fail (segment->n_index_entries * (11 +
+          4 * segment->slice_count + 8 * segment->pos_table_count) <
+      G_MAXUINT16, NULL);
+
+  len =
+      16 + 4 + 8 + 4 + 8 + 4 + 8 + 4 + 4 + 4 + 4 + 4 + 4 + 4 + 1 + 4 + 1 + 4 +
+      4 + 8 + segment->n_delta_entries * 6 + 4 + 8 +
+      segment->n_index_entries * (11 + 4 * segment->slice_count +
+      8 * segment->pos_table_count);
+  slen = mxf_ber_encode_size (len, ber);
+
+  ret = gst_buffer_new_and_alloc (16 + slen + len);
+  gst_buffer_map (ret, &map, GST_MAP_WRITE);
+
+  gst_byte_writer_init_with_data (&bw, map.data, map.size, FALSE);
+
+  gst_byte_writer_put_data_unchecked (&bw,
+      (const guint8 *) MXF_UL (INDEX_TABLE_SEGMENT), 16);
+  gst_byte_writer_put_data_unchecked (&bw, ber, slen);
+
+  gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3c0a);
+  gst_byte_writer_put_uint16_be_unchecked (&bw, 16);
+  gst_byte_writer_put_data_unchecked (&bw,
+      (const guint8 *) &segment->instance_id, 16);
+
+  gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3f0b);
+  gst_byte_writer_put_uint16_be_unchecked (&bw, 8);
+  gst_byte_writer_put_uint32_be_unchecked (&bw, segment->index_edit_rate.n);
+  gst_byte_writer_put_uint32_be_unchecked (&bw, segment->index_edit_rate.d);
+
+  gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3f0c);
+  gst_byte_writer_put_uint16_be_unchecked (&bw, 8);
+  gst_byte_writer_put_uint64_be_unchecked (&bw, segment->index_start_position);
+
+  gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3f0d);
+  gst_byte_writer_put_uint16_be_unchecked (&bw, 8);
+  gst_byte_writer_put_uint64_be_unchecked (&bw, segment->index_duration);
+
+  gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3f05);
+  gst_byte_writer_put_uint16_be_unchecked (&bw, 4);
+  gst_byte_writer_put_uint32_be_unchecked (&bw, segment->edit_unit_byte_count);
+
+  gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3f06);
+  gst_byte_writer_put_uint16_be_unchecked (&bw, 4);
+  gst_byte_writer_put_uint32_be_unchecked (&bw, segment->index_sid);
+
+  gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3f07);
+  gst_byte_writer_put_uint16_be_unchecked (&bw, 4);
+  gst_byte_writer_put_uint32_be_unchecked (&bw, segment->body_sid);
+
+  gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3f08);
+  gst_byte_writer_put_uint16_be_unchecked (&bw, 1);
+  gst_byte_writer_put_uint8 (&bw, segment->slice_count);
+
+  gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3f0e);
+  gst_byte_writer_put_uint16_be_unchecked (&bw, 1);
+  gst_byte_writer_put_uint8 (&bw, segment->pos_table_count);
+
+  gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3f09);
+  gst_byte_writer_put_uint16_be_unchecked (&bw,
+      8 + segment->n_delta_entries * 6);
+  gst_byte_writer_put_uint32_be_unchecked (&bw, segment->n_delta_entries);
+  gst_byte_writer_put_uint32_be_unchecked (&bw, 6);
+  for (i = 0; i < segment->n_delta_entries; i++) {
+    gst_byte_writer_put_uint8_unchecked (&bw,
+        segment->delta_entries[i].pos_table_index);
+    gst_byte_writer_put_uint8_unchecked (&bw, segment->delta_entries[i].slice);
+    gst_byte_writer_put_uint32_be_unchecked (&bw,
+        segment->delta_entries[i].element_delta);
+  }
+
+  gst_byte_writer_put_uint16_be_unchecked (&bw, 0x3f0a);
+  gst_byte_writer_put_uint16_be_unchecked (&bw,
+      8 + segment->n_index_entries * (11 + 4 * segment->slice_count +
+          8 * segment->pos_table_count));
+  gst_byte_writer_put_uint32_be_unchecked (&bw, segment->n_index_entries);
+  gst_byte_writer_put_uint32_be_unchecked (&bw,
+      (11 + 4 * segment->slice_count + 8 * segment->pos_table_count));
+  for (i = 0; i < segment->n_index_entries; i++) {
+    guint j;
+
+    gst_byte_writer_put_uint8_unchecked (&bw,
+        segment->index_entries[i].temporal_offset);
+    gst_byte_writer_put_uint8_unchecked (&bw,
+        segment->index_entries[i].key_frame_offset);
+    gst_byte_writer_put_uint8_unchecked (&bw, segment->index_entries[i].flags);
+    gst_byte_writer_put_uint64_be_unchecked (&bw,
+        segment->index_entries[i].stream_offset);
+
+    for (j = 0; j < segment->slice_count; j++)
+      gst_byte_writer_put_uint32_be_unchecked (&bw,
+          segment->index_entries[i].slice_offset[j]);
+
+    for (j = 0; j < segment->pos_table_count; j++) {
+      gst_byte_writer_put_uint32_be_unchecked (&bw,
+          segment->index_entries[i].pos_table[j].n);
+      gst_byte_writer_put_uint32_be_unchecked (&bw,
+          segment->index_entries[i].pos_table[j].d);
+    }
+  }
+
+  g_assert (gst_byte_writer_get_pos (&bw) == map.size);
+
+  gst_buffer_unmap (ret, &map);
+
+  return ret;
+}
+
 /* SMPTE 377M 8.2 Table 1 and 2 */
 
 static void
diff --git a/gst/mxf/mxftypes.h b/gst/mxf/mxftypes.h
index 0c338e7..c96590e 100644
--- a/gst/mxf/mxftypes.h
+++ b/gst/mxf/mxftypes.h
@@ -148,7 +148,7 @@
 
   guint8 flags;
   guint64 stream_offset;
-  
+
   guint32 *slice_offset;
   MXFFraction *pos_table;
 } MXFIndexEntry;
@@ -169,9 +169,6 @@
 
   guint32 n_index_entries;
   MXFIndexEntry *index_entries;
-
-  GHashTable *other_tags;
-  guint64 stream_offset;
 } MXFIndexTableSegment;
 
 #define GST_TAG_MXF_UMID "mxf-umid"
@@ -254,8 +251,9 @@
 gboolean mxf_random_index_pack_parse (const MXFUL *ul, const guint8 *data, guint size, GArray **array);
 GstBuffer * mxf_random_index_pack_to_buffer (const GArray *array);
 
-gboolean mxf_index_table_segment_parse (const MXFUL *ul, MXFIndexTableSegment *segment, const MXFPrimerPack *primer, const guint8 *data, guint size);
+gboolean mxf_index_table_segment_parse (const MXFUL *ul, MXFIndexTableSegment *segment, const guint8 *data, guint size);
 void mxf_index_table_segment_reset (MXFIndexTableSegment *segment);
+GstBuffer * mxf_index_table_segment_to_buffer (const MXFIndexTableSegment *segment);
 
 gboolean mxf_local_tag_parse (const guint8 * data, guint size, guint16 * tag,
     guint16 * tag_size, const guint8 ** tag_data);
diff --git a/gst/mxf/mxfvc3.c b/gst/mxf/mxfvc3.c
index bd2ca29..2f2e5b0 100644
--- a/gst/mxf/mxfvc3.c
+++ b/gst/mxf/mxfvc3.c
@@ -120,7 +120,7 @@
                 parent.descriptor[i])))
       continue;
 
-    switch (track->parent.descriptor[i]->essence_container.u[15]) {
+    switch (track->parent.descriptor[i]->essence_container.u[14]) {
       case 0x01:
         return MXF_ESSENCE_WRAPPING_FRAME_WRAPPING;
         break;
diff --git a/gst/nuvdemux/Makefile.in b/gst/nuvdemux/Makefile.in
index d625c6c..15a3d2e 100644
--- a/gst/nuvdemux/Makefile.in
+++ b/gst/nuvdemux/Makefile.in
@@ -273,6 +273,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -310,6 +312,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -337,6 +341,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -355,6 +361,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -365,6 +373,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -390,6 +400,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -415,6 +427,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -546,6 +560,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -603,8 +619,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -674,6 +694,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/nuvdemux/gstnuvdemux.c b/gst/nuvdemux/gstnuvdemux.c
index ce4e98d..765025f 100644
--- a/gst/nuvdemux/gstnuvdemux.c
+++ b/gst/nuvdemux/gstnuvdemux.c
@@ -31,7 +31,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch filesrc test.nuv ! nuvdemux name=demux  demux.audio_00 ! decodebin ! audioconvert ! audioresample ! autoaudiosink   demux.video_00 ! queue ! decodebin ! videoconvert ! videoscale ! autovideosink
+ * gst-launch-1.0 filesrc test.nuv ! nuvdemux name=demux  demux.audio_00 ! decodebin ! audioconvert ! audioresample ! autoaudiosink   demux.video_00 ! queue ! decodebin ! videoconvert ! videoscale ! autovideosink
  * ]| Play (parse and decode) an .nuv file and try to output it to
  * an automatically detected soundcard and videosink. If the NUV file contains
  * compressed audio or video data, this will only work if you have the
diff --git a/gst/onvif/Makefile.in b/gst/onvif/Makefile.in
index 6d5b486..99ab850 100644
--- a/gst/onvif/Makefile.in
+++ b/gst/onvif/Makefile.in
@@ -273,6 +273,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -310,6 +312,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -337,6 +341,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -355,6 +361,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -365,6 +373,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -390,6 +400,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -415,6 +427,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -546,6 +560,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -603,8 +619,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -674,6 +694,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/onvif/gstrtponviftimestamp.c b/gst/onvif/gstrtponviftimestamp.c
index 818c8af..4abece1 100644
--- a/gst/onvif/gstrtponviftimestamp.c
+++ b/gst/onvif/gstrtponviftimestamp.c
@@ -30,6 +30,8 @@
 
 #include "gstrtponviftimestamp.h"
 
+#define GST_NTP_OFFSET_EVENT_NAME "GstNtpOffset"
+
 #define DEFAULT_NTP_OFFSET GST_CLOCK_TIME_NONE
 #define DEFAULT_CSEQ 0
 #define DEFAULT_SET_E_BIT FALSE
@@ -42,6 +44,11 @@
 static GstFlowReturn gst_rtp_onvif_timestamp_chain_list (GstPad * pad,
     GstObject * parent, GstBufferList * list);
 
+static GstFlowReturn handle_and_push_buffer (GstRtpOnvifTimestamp * self,
+    GstBuffer * buf);
+static GstFlowReturn handle_and_push_buffer_list (GstRtpOnvifTimestamp * self,
+    GstBufferList * list);
+
 static GstStaticPadTemplate sink_template_factory =
 GST_STATIC_PAD_TEMPLATE ("sink",
     GST_PAD_SINK,
@@ -112,6 +119,64 @@
   }
 }
 
+/* send cached buffer or list, and events, if present */
+static GstFlowReturn
+send_cached_buffer_and_events (GstRtpOnvifTimestamp * self)
+{
+  GstFlowReturn ret = GST_FLOW_OK;
+
+  g_assert (!(self->buffer && self->list));
+
+  if (self->buffer) {
+    GST_DEBUG_OBJECT (self, "pushing %" GST_PTR_FORMAT, self->buffer);
+    ret = handle_and_push_buffer (self, self->buffer);
+    self->buffer = NULL;
+  }
+  if (self->list) {
+    GST_DEBUG_OBJECT (self, "pushing %" GST_PTR_FORMAT, self->list);
+    ret = handle_and_push_buffer_list (self, self->list);
+    self->list = NULL;
+  }
+
+  if (ret != GST_FLOW_OK)
+    goto out;
+
+  while (!g_queue_is_empty (self->event_queue)) {
+    GstEvent *event;
+
+    event = GST_EVENT_CAST (g_queue_pop_head (self->event_queue));
+    GST_LOG_OBJECT (self->sinkpad, "sending %" GST_PTR_FORMAT, event);
+    (void) gst_pad_send_event (self->sinkpad, event);
+  }
+
+out:
+  return ret;
+}
+
+static void
+purge_cached_buffer_and_events (GstRtpOnvifTimestamp * self)
+{
+  g_assert (!(self->buffer && self->list));
+
+  if (self->buffer) {
+    GST_DEBUG_OBJECT (self, "purging %" GST_PTR_FORMAT, self->buffer);
+    gst_buffer_unref (self->buffer);
+    self->buffer = NULL;
+  }
+  if (self->list) {
+    GST_DEBUG_OBJECT (self, "purging %" GST_PTR_FORMAT, self->list);
+    gst_buffer_list_unref (self->list);
+    self->list = NULL;
+  }
+
+  while (!g_queue_is_empty (self->event_queue)) {
+    GstEvent *event;
+
+    event = GST_EVENT_CAST (g_queue_pop_head (self->event_queue));
+    gst_event_unref (event);
+  }
+}
+
 static GstStateChangeReturn
 gst_rtp_onvif_timestamp_change_state (GstElement * element,
     GstStateChange transition)
@@ -121,6 +186,7 @@
 
   switch (transition) {
     case GST_STATE_CHANGE_PAUSED_TO_READY:
+      purge_cached_buffer_and_events (self);
       gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);
       break;
     default:
@@ -135,19 +201,11 @@
 
   switch (transition) {
     case GST_STATE_CHANGE_READY_TO_PAUSED:
-      if (GST_CLOCK_TIME_IS_VALID (self->prop_ntp_offset))
-        self->ntp_offset = self->prop_ntp_offset;
-      else
-        self->ntp_offset = GST_CLOCK_TIME_NONE;
-      break;
-    case GST_STATE_CHANGE_PAUSED_TO_PLAYING:
-      if (!GST_CLOCK_TIME_IS_VALID (self->prop_ntp_offset) &&
-          GST_ELEMENT_CLOCK (element) == NULL) {
-        GST_ELEMENT_ERROR (element, CORE, CLOCK, ("Missing NTP offset"),
-            ("Set the \"ntp-offset\" property to,"
-                " can't guess it without a clock on the pipeline."));
-        return GST_STATE_CHANGE_FAILURE;
-      }
+      self->ntp_offset = self->prop_ntp_offset;
+      GST_DEBUG_OBJECT (self, "ntp-offset: %" GST_TIME_FORMAT,
+          GST_TIME_ARGS (self->ntp_offset));
+      self->set_d_bit = FALSE;
+      self->set_e_bit = FALSE;
       break;
     default:
       break;
@@ -161,10 +219,7 @@
 {
   GstRtpOnvifTimestamp *self = GST_RTP_ONVIF_TIMESTAMP (object);
 
-  if (self->buffer)
-    gst_buffer_unref (self->buffer);
-  if (self->list)
-    gst_buffer_list_unref (self->list);
+  g_queue_free (self->event_queue);
 
   G_OBJECT_CLASS (gst_rtp_onvif_timestamp_parent_class)->finalize (object);
 }
@@ -219,42 +274,128 @@
       0, "ONVIF NTP timestamps RTP extension");
 }
 
-static GstFlowReturn handle_and_push_buffer (GstRtpOnvifTimestamp * self,
-    GstBuffer * buf, gboolean end_contiguous);
-static GstFlowReturn handle_and_push_buffer_list (GstRtpOnvifTimestamp * self,
-    GstBufferList * list, gboolean end_contiguous);
+static gboolean
+parse_event_ntp_offset (GstRtpOnvifTimestamp * self, GstEvent * event,
+    GstClockTime * offset, gboolean * discont)
+{
+  const GstStructure *structure = gst_event_get_structure (event);
+  GstClockTime event_offset;
+  gboolean event_discont;
+
+  if (!gst_structure_get_clock_time (structure, "ntp-offset", &event_offset)) {
+    GST_ERROR_OBJECT (self, "no ntp-offset in %" GST_PTR_FORMAT, event);
+    return FALSE;
+  }
+  if (!gst_structure_get_boolean (structure, "discont", &event_discont)) {
+    GST_ERROR_OBJECT (self, "no discontinue in %" GST_PTR_FORMAT, event);
+    return FALSE;
+  }
+
+  if (offset)
+    *offset = event_offset;
+
+  if (discont)
+    *discont = event_discont;
+
+  return TRUE;
+}
 
 static gboolean
 gst_rtp_onvif_timestamp_sink_event (GstPad * pad, GstObject * parent,
     GstEvent * event)
 {
   GstRtpOnvifTimestamp *self = GST_RTP_ONVIF_TIMESTAMP (parent);
+  gboolean drop = FALSE;
+  gboolean ret = TRUE;
 
   GST_DEBUG_OBJECT (pad, "handling event %s", GST_EVENT_TYPE_NAME (event));
 
+  /* handle serialized events, which, should not be enqueued */
   switch (GST_EVENT_TYPE (event)) {
-    case GST_EVENT_SEGMENT:
-      gst_event_copy_segment (event, &self->segment);
-      break;
-    case GST_EVENT_FLUSH_STOP:
-      gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);
+    case GST_EVENT_CUSTOM_DOWNSTREAM:
+      /* if the "set-e-bit" property is set, an offset event might mark the
+       * stream as discontinued. We need to check if the currently cached buffer
+       * needs the e-bit before it's pushed */
+      if (self->prop_set_e_bit &&
+          gst_event_has_name (event, GST_NTP_OFFSET_EVENT_NAME)) {
+        gboolean discont;
+        if (parse_event_ntp_offset (self, event, NULL, &discont)) {
+          GST_DEBUG_OBJECT (self, "stream %s discontinued",
+              (discont ? "is" : "is not"));
+          self->set_e_bit = discont;
+        } else {
+          drop = TRUE;
+          ret = FALSE;
+          goto out;
+        }
+      }
       break;
     case GST_EVENT_EOS:
+    {
+      GstFlowReturn res;
       /* Push pending buffers, if any */
-      if (self->buffer) {
-        handle_and_push_buffer (self, self->buffer, TRUE);
-        self->buffer = NULL;
+      self->set_e_bit = TRUE;
+      res = send_cached_buffer_and_events (self);
+      if (res != GST_FLOW_OK) {
+        drop = TRUE;
+        ret = FALSE;
+        goto out;
       }
-      if (self->list) {
-        handle_and_push_buffer_list (self, self->list, TRUE);
-        self->list = NULL;
-      }
+      break;
+    }
+    case GST_EVENT_FLUSH_STOP:
+      purge_cached_buffer_and_events (self);
+      self->set_d_bit = FALSE;
+      self->set_e_bit = FALSE;
+      gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);
       break;
     default:
       break;
   }
 
-  return gst_pad_event_default (pad, parent, event);
+  /* enqueue serialized events if there is a cached buffer */
+  if (GST_EVENT_IS_SERIALIZED (event) && (self->buffer || self->list)) {
+    GST_DEBUG ("enqueueing serialized event");
+    g_queue_push_tail (self->event_queue, event);
+    event = NULL;
+    goto out;
+  }
+
+  /* handle rest of the events */
+  switch (GST_EVENT_TYPE (event)) {
+    case GST_EVENT_CUSTOM_DOWNSTREAM:
+      /* update the ntp-offset after any cached buffer/buffer list has been
+       * pushed. the d-bit of the next buffer/buffer list should be set if
+       * the stream is discontinued */
+      if (gst_event_has_name (event, GST_NTP_OFFSET_EVENT_NAME)) {
+        GstClockTime offset;
+        gboolean discont;
+        if (parse_event_ntp_offset (self, event, &offset, &discont)) {
+          GST_DEBUG_OBJECT (self, "new ntp-offset: %" GST_TIME_FORMAT
+              ", stream %s discontinued", GST_TIME_ARGS (offset),
+              (discont ? "is" : "is not"));
+          self->ntp_offset = offset;
+          self->set_d_bit = discont;
+        } else {
+          ret = FALSE;
+        }
+        drop = TRUE;
+      }
+      break;
+    case GST_EVENT_SEGMENT:
+      gst_event_copy_segment (event, &self->segment);
+      break;
+    default:
+      break;
+  }
+
+out:
+  if (drop)
+    gst_event_unref (event);
+  else if (event)
+    ret = gst_pad_event_default (pad, parent, event);
+
+  return ret;
 }
 
 static void
@@ -278,18 +419,18 @@
   self->prop_ntp_offset = DEFAULT_NTP_OFFSET;
   self->prop_set_e_bit = DEFAULT_SET_E_BIT;
 
+  gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);
+
+  self->event_queue = g_queue_new ();
   self->buffer = NULL;
   self->list = NULL;
-
-  gst_segment_init (&self->segment, GST_FORMAT_UNDEFINED);
 }
 
 #define EXTENSION_ID 0xABAC
 #define EXTENSION_SIZE 3
 
 static gboolean
-handle_buffer (GstRtpOnvifTimestamp * self, GstBuffer * buf,
-    gboolean end_contiguous)
+handle_buffer (GstRtpOnvifTimestamp * self, GstBuffer * buf)
 {
   GstRTPBuffer rtp = GST_RTP_BUFFER_INIT;
   guint8 *data;
@@ -315,12 +456,17 @@
 
       self->ntp_offset = real_time - running_time;
 
+      GST_DEBUG_OBJECT (self, "new ntp-offset: %" GST_TIME_FORMAT,
+          GST_TIME_ARGS (self->ntp_offset));
+
       gst_object_unref (clock);
     } else {
+      GST_ELEMENT_ERROR (self, STREAM, FAILED, ("No ntp-offset present"),
+          ("Can not guess ntp-offset with no clock."));
       /* Received a buffer in PAUSED, so we can't guess the match
        * between the running time and the NTP clock yet.
        */
-      return TRUE;
+      return FALSE;
     }
   }
 
@@ -353,10 +499,10 @@
 
   /* NTP timestamp */
   if (GST_BUFFER_DTS_IS_VALID (buf)) {
-    time = gst_segment_to_running_time (&self->segment, GST_FORMAT_TIME,
+    time = gst_segment_to_stream_time (&self->segment, GST_FORMAT_TIME,
         GST_BUFFER_DTS (buf));
   } else if (GST_BUFFER_PTS_IS_VALID (buf)) {
-    time = gst_segment_to_running_time (&self->segment, GST_FORMAT_TIME,
+    time = gst_segment_to_stream_time (&self->segment, GST_FORMAT_TIME,
         GST_BUFFER_PTS (buf));
   } else {
     GST_ERROR_OBJECT (self,
@@ -365,7 +511,7 @@
   }
 
   if (time == GST_CLOCK_TIME_NONE) {
-    GST_ERROR_OBJECT (self, "Failed to get running time");
+    GST_ERROR_OBJECT (self, "Failed to get stream time");
     goto done;
   }
 
@@ -391,15 +537,17 @@
   }
 
   /* Set E if the next buffer has DISCONT */
-  if (end_contiguous) {
+  if (self->set_e_bit) {
     GST_DEBUG_OBJECT (self, "set E flag");
     field |= (1 << 6);
+    self->set_e_bit = FALSE;
   }
 
   /* Set D if the buffer has the DISCONT flag */
-  if (GST_BUFFER_IS_DISCONT (buf)) {
+  if (self->set_d_bit) {
     GST_DEBUG_OBJECT (self, "set D flag");
     field |= (1 << 5);
+    self->set_d_bit = FALSE;
   }
 
   GST_WRITE_UINT8 (data + 8, field);
@@ -414,12 +562,11 @@
   return TRUE;
 }
 
-/* @buf: (transfer all) */
+/* @buf: (transfer full) */
 static GstFlowReturn
-handle_and_push_buffer (GstRtpOnvifTimestamp * self, GstBuffer * buf,
-    gboolean end_contiguous)
+handle_and_push_buffer (GstRtpOnvifTimestamp * self, GstBuffer * buf)
 {
-  if (!handle_buffer (self, buf, end_contiguous)) {
+  if (!handle_buffer (self, buf)) {
     gst_buffer_unref (buf);
     return GST_FLOW_ERROR;
   }
@@ -436,32 +583,26 @@
 
   if (!self->prop_set_e_bit) {
     /* Modify and push this buffer right away */
-    return handle_and_push_buffer (self, buf, FALSE);
+    return handle_and_push_buffer (self, buf);
   }
 
-  /* We have to wait for the *next* buffer before pushing this one */
+  /* send any previously cached item(s), this leaves an empty queue */
+  result = send_cached_buffer_and_events (self);
 
-  if (self->buffer) {
-    /* push the *previous* buffer received */
-    result = handle_and_push_buffer (self, self->buffer,
-        GST_BUFFER_IS_DISCONT (buf));
-  }
-
-  /* Transfer ownership */
+  /* enqueue the new item, as the only item in the queue */
   self->buffer = buf;
   return result;
 }
 
-/* @buf: (transfer all) */
+/* @buf: (transfer full) */
 static GstFlowReturn
-handle_and_push_buffer_list (GstRtpOnvifTimestamp * self,
-    GstBufferList * list, gboolean end_contiguous)
+handle_and_push_buffer_list (GstRtpOnvifTimestamp * self, GstBufferList * list)
 {
   GstBuffer *buf;
 
   /* Set the extension on the *first* buffer */
   buf = gst_buffer_list_get (list, 0);
-  if (!handle_buffer (self, buf, end_contiguous)) {
+  if (!handle_buffer (self, buf)) {
     gst_buffer_list_unref (list);
     return GST_FLOW_ERROR;
   }
@@ -478,23 +619,15 @@
 {
   GstRtpOnvifTimestamp *self = GST_RTP_ONVIF_TIMESTAMP (parent);
   GstFlowReturn result = GST_FLOW_OK;
-  GstBuffer *buf;
 
   if (!self->prop_set_e_bit) {
-    return handle_and_push_buffer_list (self, list, FALSE);
+    return handle_and_push_buffer_list (self, list);
   }
 
-  /* We have to wait for the *next* list before pushing this one */
+  /* send any previously cached item(s), this leaves an empty queue */
+  result = send_cached_buffer_and_events (self);
 
-  if (self->list) {
-    /* push the *previous* list received */
-    buf = gst_buffer_list_get (list, 0);
-
-    result = handle_and_push_buffer_list (self, self->list,
-        GST_BUFFER_IS_DISCONT (buf));
-  }
-
-  /* Transfer ownership */
+  /* enqueue the new item, as the only item in the queue */
   self->list = list;
   return result;
 }
diff --git a/gst/onvif/gstrtponviftimestamp.h b/gst/onvif/gstrtponviftimestamp.h
index 40ad8d3..1fb3199 100644
--- a/gst/onvif/gstrtponviftimestamp.h
+++ b/gst/onvif/gstrtponviftimestamp.h
@@ -52,11 +52,17 @@
   guint prop_cseq;
   gboolean prop_set_e_bit;
 
+  /* currently used ntp-offset
+   *(can be changed runtime with a GstNtpOffset event)
+   */
   GstClockTime ntp_offset;
+  /* a GstNtpOffset event might mark the stream as discontinued */
+  gboolean set_d_bit;
+  gboolean set_e_bit;
 
   GstSegment segment;
-  gboolean received_segment;
   /* Buffer waiting to be handled, only used if prop_set_e_bit is TRUE */
+  GQueue *event_queue;
   GstBuffer *buffer;
   GstBufferList *list;
 };
diff --git a/gst/patchdetect/Makefile.in b/gst/patchdetect/Makefile.in
index afe30c3..9958c65 100644
--- a/gst/patchdetect/Makefile.in
+++ b/gst/patchdetect/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/pcapparse/Makefile.in b/gst/pcapparse/Makefile.in
index 4df81bd..2bb8ec6 100644
--- a/gst/pcapparse/Makefile.in
+++ b/gst/pcapparse/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/pcapparse/gstirtspparse.c b/gst/pcapparse/gstirtspparse.c
index 8f5f6f6..88a0096 100644
--- a/gst/pcapparse/gstirtspparse.c
+++ b/gst/pcapparse/gstirtspparse.c
@@ -30,7 +30,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch-0.10 filesrc location=h264crasher.pcap ! pcapparse ! irtspparse
+ * gst-launch-1.0 filesrc location=h264crasher.pcap ! pcapparse ! irtspparse
  * ! rtph264depay ! ffdec_h264 ! fakesink
  * ]| Read from a pcap dump file using filesrc, extract the raw TCP packets,
  * depayload and decode them.
diff --git a/gst/pcapparse/gstpcapparse.c b/gst/pcapparse/gstpcapparse.c
index d7f8efd..21e0cab 100644
--- a/gst/pcapparse/gstpcapparse.c
+++ b/gst/pcapparse/gstpcapparse.c
@@ -28,7 +28,7 @@
  * <refsect2>
  * <title>Example pipelines</title>
  * |[
- * gst-launch-0.10 filesrc location=h264crasher.pcap ! pcapparse ! rtph264depay
+ * gst-launch-1.0 filesrc location=h264crasher.pcap ! pcapparse ! rtph264depay
  * ! ffdec_h264 ! fakesink
  * ]| Read from a pcap dump file using filesrc, extract the raw UDP packets,
  * depayload and decode them.
@@ -490,7 +490,11 @@
              * buffer with a single memory, since the RTP depayloaders expect
              * the complete RTP header to be in the first memory if there are
              * multiple ones and we can't guarantee that with _fast() */
-            out_buf = gst_adapter_take_buffer (self->adapter, payload_size);
+            if (payload_size > 0) {
+              out_buf = gst_adapter_take_buffer (self->adapter, payload_size);
+            } else {
+              out_buf = gst_buffer_new ();
+            }
             gst_adapter_flush (self->adapter,
                 self->cur_packet_size - offset - payload_size);
 
diff --git a/gst/pnm/Makefile.in b/gst/pnm/Makefile.in
index 4bb9f2a..38bef83 100644
--- a/gst/pnm/Makefile.in
+++ b/gst/pnm/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/pnm/gstpnmdec.c b/gst/pnm/gstpnmdec.c
index 8bcb094..93c4140 100644
--- a/gst/pnm/gstpnmdec.c
+++ b/gst/pnm/gstpnmdec.c
@@ -25,7 +25,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch filesrc location=test.pnm ! pnmdec ! videoconvert ! autovideosink
+ * gst-launch-1.0 filesrc location=test.pnm ! pnmdec ! videoconvert ! autovideosink
  * ]| The above pipeline reads a pnm file and renders it to the screen.
  * </refsect2>
  */
@@ -138,6 +138,10 @@
     pnmdec->input_state = NULL;
   }
 
+  if (pnmdec->buf) {
+    gst_buffer_unref (pnmdec->buf);
+    pnmdec->buf = NULL;
+  }
   return TRUE;
 }
 
@@ -186,6 +190,7 @@
       case G_TOKEN_INT:
         if (i == target) {
           GST_DEBUG_OBJECT (s, "PNM file contains too much data.");
+          g_scanner_destroy (scanner);
           goto drop_error;
         }
         outdata[i++] = scanner->value.v_int;
diff --git a/gst/pnm/gstpnmenc.c b/gst/pnm/gstpnmenc.c
index 8a0461c..32fd6f6 100644
--- a/gst/pnm/gstpnmenc.c
+++ b/gst/pnm/gstpnmenc.c
@@ -27,7 +27,7 @@
  * <refsect>
  * <title>Example launch line</title>
  * |[
- * gst-launch videotestsrc num_buffers=1 ! videoconvert ! "video/x-raw,format=GRAY8" ! pnmenc ascii=true ! filesink location=test.pnm
+ * gst-launch-1.0 videotestsrc num_buffers=1 ! videoconvert ! "video/x-raw,format=GRAY8" ! pnmenc ascii=true ! filesink location=test.pnm
  * ]| The above pipeline writes a test pnm file (ASCII encoding).
  * </refsect2>
  */
@@ -174,7 +174,7 @@
   GstPnmenc *pnmenc;
   guint size, pixels;
   GstMapInfo omap, imap;
-  gchar *header;
+  gchar *header = NULL;
   GstVideoInfo *info;
   GstFlowReturn ret = GST_FLOW_OK;
   guint i_rowstride, o_rowstride;
@@ -202,10 +202,10 @@
 
   if (pnmenc->info.encoding == GST_PNM_ENCODING_ASCII) {
     /* Per component 4 bytes are used in case of ASCII encoding */
-    size = size * 4;
+    size = size * 4 + size / 20;
     size += strlen (header);
     frame->output_buffer =
-        gst_video_encoder_allocate_output_buffer (encoder, (size + size / 20));
+        gst_video_encoder_allocate_output_buffer (encoder, (size));
   } else {
     size += strlen (header);
     frame->output_buffer =
@@ -284,6 +284,7 @@
     goto done;
 
 done:
+  g_free (header);
   return ret;
 }
 
diff --git a/gst/rawparse/Makefile.in b/gst/rawparse/Makefile.in
index d153576..0dd2393 100644
--- a/gst/rawparse/Makefile.in
+++ b/gst/rawparse/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/rawparse/README b/gst/rawparse/README
index 417e926..9e21be2 100644
--- a/gst/rawparse/README
+++ b/gst/rawparse/README
@@ -9,7 +9,7 @@
 Creating example data
 =====================
 
-gst-launch videotestsrc num_buffers=300 ! \
+gst-launch-1.0 videotestsrc num_buffers=300 ! \
   video/x-raw,format=\(string\)I420,width=320,height=240 ! \
   filesink location=raw
 
@@ -17,7 +17,7 @@
 Reading example data
 ====================
 
-gst-launch filesrc location=raw ! \
+gst-launch-1.0 filesrc location=raw ! \
   videoparse format=I420 width=320 height=240 framerate=30/1 ! \
   xvimagesink
 
diff --git a/gst/removesilence/Makefile.in b/gst/removesilence/Makefile.in
index 0f83524..ecd0b53 100644
--- a/gst/removesilence/Makefile.in
+++ b/gst/removesilence/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/removesilence/gstremovesilence.c b/gst/removesilence/gstremovesilence.c
index d63c60a..7707817 100644
--- a/gst/removesilence/gstremovesilence.c
+++ b/gst/removesilence/gstremovesilence.c
@@ -26,7 +26,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v -m filesrc location="audiofile" ! decodebin ! removesilence remove=true ! wavenc ! filesink location=without_audio.wav
+ * gst-launch-1.0 -v -m filesrc location="audiofile" ! decodebin ! removesilence remove=true ! wavenc ! filesink location=without_audio.wav
  * ]|
  * </refsect2>
  */
diff --git a/gst/rtp/Makefile.in b/gst/rtp/Makefile.in
index 76ae1e0..381e8b1 100644
--- a/gst/rtp/Makefile.in
+++ b/gst/rtp/Makefile.in
@@ -278,6 +278,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -315,6 +317,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -342,6 +346,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -360,6 +366,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -370,6 +378,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -395,6 +405,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -420,6 +432,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -551,6 +565,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -608,8 +624,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -679,6 +699,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/sdi/Makefile.in b/gst/sdi/Makefile.in
index 1cad9fa..193debf 100644
--- a/gst/sdi/Makefile.in
+++ b/gst/sdi/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/sdp/Makefile.in b/gst/sdp/Makefile.in
index 0e9b048..6fb3443 100644
--- a/gst/sdp/Makefile.in
+++ b/gst/sdp/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/sdp/gstsdpdemux.c b/gst/sdp/gstsdpdemux.c
index 67e4afd..a2ab691 100644
--- a/gst/sdp/gstsdpdemux.c
+++ b/gst/sdp/gstsdpdemux.c
@@ -35,7 +35,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch gnomevfssrc location=http://some.server/session.sdp ! sdpdemux ! fakesink
+ * gst-launch-1.0 souphttpsrc location=http://some.server/session.sdp ! sdpdemux ! fakesink
  * ]| Establish a connection to an HTTP server that contains an SDP session description
  * that gets parsed by sdpdemux and send the raw RTP packets to a fakesink.
  * </refsect2>
diff --git a/gst/segmentclip/Makefile.in b/gst/segmentclip/Makefile.in
index 371ad02..52dc3a5 100644
--- a/gst/segmentclip/Makefile.in
+++ b/gst/segmentclip/Makefile.in
@@ -278,6 +278,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -315,6 +317,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -342,6 +346,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -360,6 +366,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -370,6 +378,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -395,6 +405,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -420,6 +432,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -551,6 +565,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -608,8 +624,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -679,6 +699,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/siren/Makefile.in b/gst/siren/Makefile.in
index 6c99b97..d62cb76 100644
--- a/gst/siren/Makefile.in
+++ b/gst/siren/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/smooth/Makefile.in b/gst/smooth/Makefile.in
index fe82fc1..e2942b3 100644
--- a/gst/smooth/Makefile.in
+++ b/gst/smooth/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/speed/Makefile.in b/gst/speed/Makefile.in
index 64eec62..81e8a5f 100644
--- a/gst/speed/Makefile.in
+++ b/gst/speed/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/speed/gstspeed.c b/gst/speed/gstspeed.c
index 9fcdad3..c0f9198 100644
--- a/gst/speed/gstspeed.c
+++ b/gst/speed/gstspeed.c
@@ -31,7 +31,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch filesrc location=test.ogg ! decodebin ! audioconvert ! speed speed=1.5 ! audioconvert ! audioresample ! autoaudiosink
+ * gst-launch-1.0 filesrc location=test.ogg ! decodebin ! audioconvert ! speed speed=1.5 ! audioconvert ! audioresample ! autoaudiosink
  * ]| Plays an .ogg file at 1.5x speed.
  * </refsect2>
  */
diff --git a/gst/stereo/Makefile.in b/gst/stereo/Makefile.in
index ace080c..0b803d2 100644
--- a/gst/stereo/Makefile.in
+++ b/gst/stereo/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/stereo/gststereo.c b/gst/stereo/gststereo.c
index ebadf9a..f7e013b 100644
--- a/gst/stereo/gststereo.c
+++ b/gst/stereo/gststereo.c
@@ -29,7 +29,7 @@
  * <refsect2>
  * <title>Example pipelines</title>
  * |[
- * gst-launch -v filesrc location=sine.ogg ! oggdemux ! vorbisdec ! audioconvert ! stereo ! audioconvert ! audioresample ! alsasink
+ * gst-launch-1.0 -v filesrc location=sine.ogg ! oggdemux ! vorbisdec ! audioconvert ! stereo ! audioconvert ! audioresample ! alsasink
  * ]| Play an Ogg/Vorbis file.
  * </refsect2>
  */
diff --git a/gst/subenc/Makefile.in b/gst/subenc/Makefile.in
index c0d52ef..a49deb6 100644
--- a/gst/subenc/Makefile.in
+++ b/gst/subenc/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/tta/Makefile.in b/gst/tta/Makefile.in
index 007225d..84567cc 100644
--- a/gst/tta/Makefile.in
+++ b/gst/tta/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/videofilters/Makefile.in b/gst/videofilters/Makefile.in
index 79c0530..7bed430 100644
--- a/gst/videofilters/Makefile.in
+++ b/gst/videofilters/Makefile.in
@@ -280,6 +280,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -317,6 +319,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -344,6 +348,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -362,6 +368,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -372,6 +380,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -397,6 +407,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -422,6 +434,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -553,6 +567,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -610,8 +626,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -681,6 +701,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/videofilters/gstscenechange.c b/gst/videofilters/gstscenechange.c
index 7abfc8b..5adf3ce 100644
--- a/gst/videofilters/gstscenechange.c
+++ b/gst/videofilters/gstscenechange.c
@@ -35,7 +35,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v filesrc location=some_file.ogv ! decodebin ! 
+ * gst-launch-1.0 -v filesrc location=some_file.ogv ! decodebin !
  *   scenechange ! theoraenc ! fakesink
  * ]|
  * </refsect2>
diff --git a/gst/videofilters/gstvideodiff.c b/gst/videofilters/gstvideodiff.c
index c6cdc86..6f5b35e 100644
--- a/gst/videofilters/gstvideodiff.c
+++ b/gst/videofilters/gstvideodiff.c
@@ -24,7 +24,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v fakesrc ! videodiff ! FIXME ! fakesink
+ * gst-launch-1.0 -v fakesrc ! videodiff ! FIXME ! fakesink
  * ]|
  * FIXME Describe what the pipeline does.
  * </refsect2>
diff --git a/gst/videofilters/gstzebrastripe.c b/gst/videofilters/gstzebrastripe.c
index 0b08100..81f58b8 100644
--- a/gst/videofilters/gstzebrastripe.c
+++ b/gst/videofilters/gstzebrastripe.c
@@ -30,7 +30,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v videotestsrc ! zebrastripe ! xvimagesink
+ * gst-launch-1.0 -v videotestsrc ! zebrastripe ! xvimagesink
  * ]|
  * Marks overexposed areas of the video with zebra stripes.
  *
diff --git a/gst/videoframe_audiolevel/Makefile.am b/gst/videoframe_audiolevel/Makefile.am
new file mode 100644
index 0000000..2619729
--- /dev/null
+++ b/gst/videoframe_audiolevel/Makefile.am
@@ -0,0 +1,9 @@
+plugin_LTLIBRARIES = libgstvideoframe_audiolevel.la
+
+libgstvideoframe_audiolevel_la_SOURCES = gstvideoframe-audiolevel.c
+libgstvideoframe_audiolevel_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgstvideoframe_audiolevel_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_API_VERSION) $(GST_BASE_LIBS) $(LIBM)
+libgstvideoframe_audiolevel_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstvideoframe_audiolevel_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
+
+noinst_HEADERS = gstvideoframe-audiolevel.h
diff --git a/gst/liveadder/Makefile.in b/gst/videoframe_audiolevel/Makefile.in
similarity index 89%
rename from gst/liveadder/Makefile.in
rename to gst/videoframe_audiolevel/Makefile.in
index ba9e5a2..e0b9775 100644
--- a/gst/liveadder/Makefile.in
+++ b/gst/videoframe_audiolevel/Makefile.in
@@ -90,7 +90,7 @@
 build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
-subdir = gst/liveadder
+subdir = gst/videoframe_audiolevel
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
 	$(top_srcdir)/common/m4/as-auto-alt.m4 \
@@ -164,18 +164,21 @@
 am__installdirs = "$(DESTDIR)$(plugindir)"
 LTLIBRARIES = $(plugin_LTLIBRARIES)
 am__DEPENDENCIES_1 =
-libgstliveadder_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+libgstvideoframe_audiolevel_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_libgstliveadder_la_OBJECTS = libgstliveadder_la-liveadder.lo
-libgstliveadder_la_OBJECTS = $(am_libgstliveadder_la_OBJECTS)
+am_libgstvideoframe_audiolevel_la_OBJECTS =  \
+	libgstvideoframe_audiolevel_la-gstvideoframe-audiolevel.lo
+libgstvideoframe_audiolevel_la_OBJECTS =  \
+	$(am_libgstvideoframe_audiolevel_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
-libgstliveadder_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
-	$(libgstliveadder_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
-	$(CCLD) $(libgstliveadder_la_CFLAGS) $(CFLAGS) \
-	$(libgstliveadder_la_LDFLAGS) $(LDFLAGS) -o $@
+libgstvideoframe_audiolevel_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(libgstvideoframe_audiolevel_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
+	--mode=link $(CCLD) $(libgstvideoframe_audiolevel_la_CFLAGS) \
+	$(CFLAGS) $(libgstvideoframe_audiolevel_la_LDFLAGS) $(LDFLAGS) \
+	-o $@
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -210,8 +213,8 @@
 am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = $(libgstliveadder_la_SOURCES)
-DIST_SOURCES = $(libgstliveadder_la_SOURCES)
+SOURCES = $(libgstvideoframe_audiolevel_la_SOURCES)
+DIST_SOURCES = $(libgstvideoframe_audiolevel_la_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -274,6 +277,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +316,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +345,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +365,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +377,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +404,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +431,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +564,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +623,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +698,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -761,16 +785,13 @@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 wayland_scanner = @wayland_scanner@
-plugin_LTLIBRARIES = libgstliveadder.la
-libgstliveadder_la_SOURCES = liveadder.c
-libgstliveadder_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
-libgstliveadder_la_LIBADD = \
-	$(GST_PLUGINS_BASE_LIBS) -lgstaudio-@GST_API_VERSION@ \
-	$(GST_BASE_LIBS) $(GST_LIBS)
-
-libgstliveadder_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libgstliveadder_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
-noinst_HEADERS = liveadder.h
+plugin_LTLIBRARIES = libgstvideoframe_audiolevel.la
+libgstvideoframe_audiolevel_la_SOURCES = gstvideoframe-audiolevel.c
+libgstvideoframe_audiolevel_la_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS)
+libgstvideoframe_audiolevel_la_LIBADD = $(GST_PLUGINS_BASE_LIBS) -lgstaudio-$(GST_API_VERSION) $(GST_BASE_LIBS) $(LIBM)
+libgstvideoframe_audiolevel_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstvideoframe_audiolevel_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
+noinst_HEADERS = gstvideoframe-audiolevel.h
 all: all-am
 
 .SUFFIXES:
@@ -784,9 +805,9 @@
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/liveadder/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/videoframe_audiolevel/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu gst/liveadder/Makefile
+	  $(AUTOMAKE) --gnu gst/videoframe_audiolevel/Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -840,8 +861,8 @@
 	  rm -f $${locs}; \
 	}
 
-libgstliveadder.la: $(libgstliveadder_la_OBJECTS) $(libgstliveadder_la_DEPENDENCIES) $(EXTRA_libgstliveadder_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(libgstliveadder_la_LINK) -rpath $(plugindir) $(libgstliveadder_la_OBJECTS) $(libgstliveadder_la_LIBADD) $(LIBS)
+libgstvideoframe_audiolevel.la: $(libgstvideoframe_audiolevel_la_OBJECTS) $(libgstvideoframe_audiolevel_la_DEPENDENCIES) $(EXTRA_libgstvideoframe_audiolevel_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(libgstvideoframe_audiolevel_la_LINK) -rpath $(plugindir) $(libgstvideoframe_audiolevel_la_OBJECTS) $(libgstvideoframe_audiolevel_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -849,7 +870,7 @@
 distclean-compile:
 	-rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstliveadder_la-liveadder.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstvideoframe_audiolevel_la-gstvideoframe-audiolevel.Plo@am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@@ -875,12 +896,12 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
-libgstliveadder_la-liveadder.lo: liveadder.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstliveadder_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstliveadder_la_CFLAGS) $(CFLAGS) -MT libgstliveadder_la-liveadder.lo -MD -MP -MF $(DEPDIR)/libgstliveadder_la-liveadder.Tpo -c -o libgstliveadder_la-liveadder.lo `test -f 'liveadder.c' || echo '$(srcdir)/'`liveadder.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstliveadder_la-liveadder.Tpo $(DEPDIR)/libgstliveadder_la-liveadder.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='liveadder.c' object='libgstliveadder_la-liveadder.lo' libtool=yes @AMDEPBACKSLASH@
+libgstvideoframe_audiolevel_la-gstvideoframe-audiolevel.lo: gstvideoframe-audiolevel.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoframe_audiolevel_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoframe_audiolevel_la_CFLAGS) $(CFLAGS) -MT libgstvideoframe_audiolevel_la-gstvideoframe-audiolevel.lo -MD -MP -MF $(DEPDIR)/libgstvideoframe_audiolevel_la-gstvideoframe-audiolevel.Tpo -c -o libgstvideoframe_audiolevel_la-gstvideoframe-audiolevel.lo `test -f 'gstvideoframe-audiolevel.c' || echo '$(srcdir)/'`gstvideoframe-audiolevel.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstvideoframe_audiolevel_la-gstvideoframe-audiolevel.Tpo $(DEPDIR)/libgstvideoframe_audiolevel_la-gstvideoframe-audiolevel.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstvideoframe-audiolevel.c' object='libgstvideoframe_audiolevel_la-gstvideoframe-audiolevel.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstliveadder_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstliveadder_la_CFLAGS) $(CFLAGS) -c -o libgstliveadder_la-liveadder.lo `test -f 'liveadder.c' || echo '$(srcdir)/'`liveadder.c
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstvideoframe_audiolevel_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstvideoframe_audiolevel_la_CFLAGS) $(CFLAGS) -c -o libgstvideoframe_audiolevel_la-gstvideoframe-audiolevel.lo `test -f 'gstvideoframe-audiolevel.c' || echo '$(srcdir)/'`gstvideoframe-audiolevel.c
 
 mostlyclean-libtool:
 	-rm -f *.lo
diff --git a/gst/videoframe_audiolevel/gstvideoframe-audiolevel.c b/gst/videoframe_audiolevel/gstvideoframe-audiolevel.c
new file mode 100644
index 0000000..ade9966
--- /dev/null
+++ b/gst/videoframe_audiolevel/gstvideoframe-audiolevel.c
@@ -0,0 +1,789 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Vivia Nikolaidou <vivia@toolsonair.com>
+ *
+ * Based on gstlevel.c:
+ * Copyright (C) 2000,2001,2002,2003,2005
+ *           Thomas Vander Stichele <thomas at apestaart dot org>
+ *
+ * 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.
+ */
+
+/**
+ * SECTION:element-videoframe-audiolevel
+ *
+ * This element acts like a synchronized audio/video "level". It gathers
+ * all audio buffers sent between two video frames, and then sends a message
+ * that contains the RMS value of all samples for these buffers.
+ *
+ * <refsect2>
+ * <title>Example launch line</title>
+ * |[
+ * gst-launch-1.0 -m filesrc location="file.mkv" ! decodebin name=d ! "audio/x-raw" ! videoframe-audiolevel name=l ! autoaudiosink d. ! "video/x-raw" ! l. l. ! queue ! autovideosink ]|
+ * </refsect2>
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+/* FIXME 2.0: suppress warnings for deprecated API such as GValueArray
+ * with newer GLib versions (>= 2.31.0) */
+#define GLIB_DISABLE_DEPRECATION_WARNINGS
+
+#include "gstvideoframe-audiolevel.h"
+#include <math.h>
+
+#define GST_CAT_DEFAULT gst_videoframe_audiolevel_debug
+#if G_BYTE_ORDER == G_LITTLE_ENDIAN
+# define FORMATS "{ S8, S16LE, S32LE, F32LE, F64LE }"
+#else
+# define FORMATS "{ S8, S16BE, S32BE, F32BE, F64BE }"
+#endif
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_DEFAULT);
+
+static GstStaticPadTemplate audio_sink_template =
+GST_STATIC_PAD_TEMPLATE ("asink",
+    GST_PAD_SINK,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS (GST_AUDIO_CAPS_MAKE (FORMATS))
+    );
+
+static GstStaticPadTemplate audio_src_template =
+GST_STATIC_PAD_TEMPLATE ("asrc",
+    GST_PAD_SRC,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS (GST_AUDIO_CAPS_MAKE (FORMATS))
+    );
+
+static GstStaticPadTemplate video_sink_template =
+GST_STATIC_PAD_TEMPLATE ("vsink",
+    GST_PAD_SINK,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS ("video/x-raw")
+    );
+
+static GstStaticPadTemplate video_src_template =
+GST_STATIC_PAD_TEMPLATE ("vsrc",
+    GST_PAD_SRC,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS ("video/x-raw")
+    );
+
+#define parent_class gst_videoframe_audiolevel_parent_class
+G_DEFINE_TYPE (GstVideoFrameAudioLevel, gst_videoframe_audiolevel,
+    GST_TYPE_ELEMENT);
+
+static GstFlowReturn gst_videoframe_audiolevel_asink_chain (GstPad * pad,
+    GstObject * parent, GstBuffer * inbuf);
+static GstFlowReturn gst_videoframe_audiolevel_vsink_chain (GstPad * pad,
+    GstObject * parent, GstBuffer * inbuf);
+static gboolean gst_videoframe_audiolevel_asink_event (GstPad * pad,
+    GstObject * parent, GstEvent * event);
+static gboolean gst_videoframe_audiolevel_vsink_event (GstPad * pad,
+    GstObject * parent, GstEvent * event);
+static GstIterator *gst_videoframe_audiolevel_iterate_internal_links (GstPad *
+    pad, GstObject * parent);
+
+static void gst_videoframe_audiolevel_finalize (GObject * gobject);
+
+static GstStateChangeReturn gst_videoframe_audiolevel_change_state (GstElement *
+    element, GstStateChange transition);
+
+static void
+gst_videoframe_audiolevel_class_init (GstVideoFrameAudioLevelClass * klass)
+{
+  GstElementClass *gstelement_class;
+  GObjectClass *gobject_class = (GObjectClass *) klass;
+
+  GST_DEBUG_CATEGORY_INIT (gst_videoframe_audiolevel_debug,
+      "videoframe-audiolevel", 0, "Synchronized audio/video level");
+
+  gstelement_class = (GstElementClass *) klass;
+
+  gst_element_class_set_static_metadata (gstelement_class,
+      "Video-frame audio level", "Filter/Analyzer/Audio",
+      "Synchronized audio/video RMS Level messenger for audio/raw",
+      "Vivia Nikolaidou <vivia@toolsonair.com>");
+
+  gobject_class->finalize = gst_videoframe_audiolevel_finalize;
+  gstelement_class->change_state = gst_videoframe_audiolevel_change_state;
+
+  gst_element_class_add_pad_template (gstelement_class,
+      gst_static_pad_template_get (&audio_src_template));
+  gst_element_class_add_pad_template (gstelement_class,
+      gst_static_pad_template_get (&audio_sink_template));
+
+  gst_element_class_add_pad_template (gstelement_class,
+      gst_static_pad_template_get (&video_src_template));
+  gst_element_class_add_pad_template (gstelement_class,
+      gst_static_pad_template_get (&video_sink_template));
+}
+
+static void
+gst_videoframe_audiolevel_init (GstVideoFrameAudioLevel * self)
+{
+  self->asinkpad =
+      gst_pad_new_from_static_template (&audio_sink_template, "asink");
+  gst_pad_set_chain_function (self->asinkpad,
+      GST_DEBUG_FUNCPTR (gst_videoframe_audiolevel_asink_chain));
+  gst_pad_set_event_function (self->asinkpad,
+      GST_DEBUG_FUNCPTR (gst_videoframe_audiolevel_asink_event));
+  gst_pad_set_iterate_internal_links_function (self->asinkpad,
+      GST_DEBUG_FUNCPTR (gst_videoframe_audiolevel_iterate_internal_links));
+  gst_element_add_pad (GST_ELEMENT (self), self->asinkpad);
+
+  self->vsinkpad =
+      gst_pad_new_from_static_template (&video_sink_template, "vsink");
+  gst_pad_set_chain_function (self->vsinkpad,
+      GST_DEBUG_FUNCPTR (gst_videoframe_audiolevel_vsink_chain));
+  gst_pad_set_event_function (self->vsinkpad,
+      GST_DEBUG_FUNCPTR (gst_videoframe_audiolevel_vsink_event));
+  gst_pad_set_iterate_internal_links_function (self->vsinkpad,
+      GST_DEBUG_FUNCPTR (gst_videoframe_audiolevel_iterate_internal_links));
+  gst_element_add_pad (GST_ELEMENT (self), self->vsinkpad);
+
+  self->asrcpad =
+      gst_pad_new_from_static_template (&audio_src_template, "asrc");
+  gst_pad_set_iterate_internal_links_function (self->asrcpad,
+      GST_DEBUG_FUNCPTR (gst_videoframe_audiolevel_iterate_internal_links));
+  gst_element_add_pad (GST_ELEMENT (self), self->asrcpad);
+
+  self->vsrcpad =
+      gst_pad_new_from_static_template (&video_src_template, "vsrc");
+  gst_pad_set_iterate_internal_links_function (self->vsrcpad,
+      GST_DEBUG_FUNCPTR (gst_videoframe_audiolevel_iterate_internal_links));
+  gst_element_add_pad (GST_ELEMENT (self), self->vsrcpad);
+
+  GST_PAD_SET_PROXY_CAPS (self->asinkpad);
+  GST_PAD_SET_PROXY_ALLOCATION (self->asinkpad);
+
+  GST_PAD_SET_PROXY_CAPS (self->asrcpad);
+  GST_PAD_SET_PROXY_SCHEDULING (self->asrcpad);
+
+  GST_PAD_SET_PROXY_CAPS (self->vsinkpad);
+  GST_PAD_SET_PROXY_ALLOCATION (self->vsinkpad);
+
+  GST_PAD_SET_PROXY_CAPS (self->vsrcpad);
+  GST_PAD_SET_PROXY_SCHEDULING (self->vsrcpad);
+
+  self->adapter = gst_adapter_new ();
+
+  g_queue_init (&self->vtimeq);
+  self->first_time = GST_CLOCK_TIME_NONE;
+  self->total_frames = 0;
+  /* alignment_threshold and discont_wait should become properties if needed */
+  self->alignment_threshold = 40 * GST_MSECOND;
+  self->discont_time = GST_CLOCK_TIME_NONE;
+  self->next_offset = -1;
+  self->discont_wait = 1 * GST_SECOND;
+
+  self->video_eos_flag = FALSE;
+  self->audio_flush_flag = FALSE;
+  self->shutdown_flag = FALSE;
+
+  g_mutex_init (&self->mutex);
+  g_cond_init (&self->cond);
+}
+
+static GstStateChangeReturn
+gst_videoframe_audiolevel_change_state (GstElement * element,
+    GstStateChange transition)
+{
+  GstStateChangeReturn ret;
+  GstVideoFrameAudioLevel *self = GST_VIDEOFRAME_AUDIOLEVEL (element);
+
+  switch (transition) {
+    case GST_STATE_CHANGE_PAUSED_TO_READY:
+      g_mutex_lock (&self->mutex);
+      self->shutdown_flag = TRUE;
+      g_cond_signal (&self->cond);
+      g_mutex_unlock (&self->mutex);
+      break;
+    case GST_STATE_CHANGE_READY_TO_PAUSED:
+      g_mutex_lock (&self->mutex);
+      self->shutdown_flag = FALSE;
+      self->video_eos_flag = FALSE;
+      self->audio_flush_flag = FALSE;
+      g_mutex_unlock (&self->mutex);
+    default:
+      break;
+  }
+
+  ret = GST_ELEMENT_CLASS (parent_class)->change_state (element, transition);
+
+  switch (transition) {
+    case GST_STATE_CHANGE_PAUSED_TO_READY:
+      g_mutex_lock (&self->mutex);
+      self->first_time = GST_CLOCK_TIME_NONE;
+      self->total_frames = 0;
+      gst_segment_init (&self->asegment, GST_FORMAT_UNDEFINED);
+      gst_segment_init (&self->vsegment, GST_FORMAT_UNDEFINED);
+      self->vsegment.position = GST_CLOCK_TIME_NONE;
+      gst_adapter_clear (self->adapter);
+      g_queue_foreach (&self->vtimeq, (GFunc) g_free, NULL);
+      g_queue_clear (&self->vtimeq);
+      if (self->CS) {
+        g_free (self->CS);
+        self->CS = NULL;
+      }
+      g_mutex_unlock (&self->mutex);
+      break;
+    default:
+      break;
+  }
+
+  return ret;
+}
+
+static void
+gst_videoframe_audiolevel_finalize (GObject * object)
+{
+  GstVideoFrameAudioLevel *self = GST_VIDEOFRAME_AUDIOLEVEL (object);
+
+  if (self->adapter) {
+    g_object_unref (self->adapter);
+    self->adapter = NULL;
+  }
+  g_queue_foreach (&self->vtimeq, (GFunc) g_free, NULL);
+  g_queue_clear (&self->vtimeq);
+  self->first_time = GST_CLOCK_TIME_NONE;
+  self->total_frames = 0;
+  if (self->CS) {
+    g_free (self->CS);
+    self->CS = NULL;
+  }
+
+  g_mutex_clear (&self->mutex);
+  g_cond_clear (&self->cond);
+
+  G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+#define DEFINE_INT_LEVEL_CALCULATOR(TYPE, RESOLUTION)                         \
+static void inline                                                            \
+gst_videoframe_audiolevel_calculate_##TYPE (gpointer data, guint num, guint channels,        \
+                            gdouble *NCS)                                     \
+{                                                                             \
+  TYPE * in = (TYPE *)data;                                                   \
+  register guint j;                                                           \
+  gdouble squaresum = 0.0;           /* square sum of the input samples */    \
+  register gdouble square = 0.0;     /* Square */                             \
+  gdouble normalizer;                /* divisor to get a [-1.0, 1.0] range */ \
+                                                                              \
+  /* *NCS = 0.0; Normalized Cumulative Square */                              \
+                                                                              \
+  for (j = 0; j < num; j += channels) {                                       \
+    square = ((gdouble) in[j]) * in[j];                                       \
+    squaresum += square;                                                      \
+  }                                                                           \
+                                                                              \
+  normalizer = (gdouble) (G_GINT64_CONSTANT(1) << (RESOLUTION * 2));          \
+  *NCS = squaresum / normalizer;                                              \
+}
+
+DEFINE_INT_LEVEL_CALCULATOR (gint32, 31);
+DEFINE_INT_LEVEL_CALCULATOR (gint16, 15);
+DEFINE_INT_LEVEL_CALCULATOR (gint8, 7);
+
+#define DEFINE_FLOAT_LEVEL_CALCULATOR(TYPE)                                   \
+static void inline                                                            \
+gst_videoframe_audiolevel_calculate_##TYPE (gpointer data, guint num, guint channels,        \
+                            gdouble *NCS)                                     \
+{                                                                             \
+  TYPE * in = (TYPE *)data;                                                   \
+  register guint j;                                                           \
+  gdouble squaresum = 0.0;           /* square sum of the input samples */    \
+  register gdouble square = 0.0;     /* Square */                             \
+                                                                              \
+  /* *NCS = 0.0; Normalized Cumulative Square */                              \
+                                                                              \
+  for (j = 0; j < num; j += channels) {                                       \
+    square = ((gdouble) in[j]) * in[j];                                       \
+    squaresum += square;                                                      \
+  }                                                                           \
+                                                                              \
+  *NCS = squaresum;                                                           \
+}
+
+DEFINE_FLOAT_LEVEL_CALCULATOR (gfloat);
+DEFINE_FLOAT_LEVEL_CALCULATOR (gdouble);
+
+static gboolean
+gst_videoframe_audiolevel_vsink_event (GstPad * pad, GstObject * parent,
+    GstEvent * event)
+{
+  GstVideoFrameAudioLevel *self = GST_VIDEOFRAME_AUDIOLEVEL (parent);
+  GST_LOG_OBJECT (pad, "Got %s event", GST_EVENT_TYPE_NAME (event));
+
+  switch (GST_EVENT_TYPE (event)) {
+    case GST_EVENT_SEGMENT:
+      g_mutex_lock (&self->mutex);
+      g_queue_foreach (&self->vtimeq, (GFunc) g_free, NULL);
+      g_queue_clear (&self->vtimeq);
+      g_mutex_unlock (&self->mutex);
+      gst_event_copy_segment (event, &self->vsegment);
+      if (self->vsegment.format != GST_FORMAT_TIME)
+        return FALSE;
+      self->vsegment.position = GST_CLOCK_TIME_NONE;
+      break;
+    case GST_EVENT_GAP:
+      return TRUE;
+    case GST_EVENT_EOS:
+      g_mutex_lock (&self->mutex);
+      self->video_eos_flag = TRUE;
+      g_cond_signal (&self->cond);
+      g_mutex_unlock (&self->mutex);
+      break;
+    case GST_EVENT_FLUSH_STOP:
+      g_mutex_lock (&self->mutex);
+      g_queue_foreach (&self->vtimeq, (GFunc) g_free, NULL);
+      g_queue_clear (&self->vtimeq);
+      gst_segment_init (&self->vsegment, GST_FORMAT_UNDEFINED);
+      g_cond_signal (&self->cond);
+      g_mutex_unlock (&self->mutex);
+      self->vsegment.position = GST_CLOCK_TIME_NONE;
+      break;
+    default:
+      break;
+  }
+  return gst_pad_event_default (pad, parent, event);
+}
+
+static gboolean
+gst_videoframe_audiolevel_asink_event (GstPad * pad, GstObject * parent,
+    GstEvent * event)
+{
+  GstVideoFrameAudioLevel *self = GST_VIDEOFRAME_AUDIOLEVEL (parent);
+  GST_LOG_OBJECT (pad, "Got %s event", GST_EVENT_TYPE_NAME (event));
+
+  switch (GST_EVENT_TYPE (event)) {
+    case GST_EVENT_SEGMENT:
+      self->first_time = GST_CLOCK_TIME_NONE;
+      self->total_frames = 0;
+      gst_adapter_clear (self->adapter);
+      gst_event_copy_segment (event, &self->asegment);
+      if (self->asegment.format != GST_FORMAT_TIME)
+        return FALSE;
+      break;
+    case GST_EVENT_FLUSH_START:
+      g_mutex_lock (&self->mutex);
+      self->audio_flush_flag = TRUE;
+      g_cond_signal (&self->cond);
+      g_mutex_unlock (&self->mutex);
+      break;
+    case GST_EVENT_FLUSH_STOP:
+      self->audio_flush_flag = FALSE;
+      self->total_frames = 0;
+      self->first_time = GST_CLOCK_TIME_NONE;
+      gst_adapter_clear (self->adapter);
+      gst_segment_init (&self->asegment, GST_FORMAT_UNDEFINED);
+      break;
+    case GST_EVENT_CAPS:{
+      GstCaps *caps;
+      gint channels;
+      gst_event_parse_caps (event, &caps);
+      GST_DEBUG_OBJECT (self, "Got caps %" GST_PTR_FORMAT, caps);
+      if (!gst_audio_info_from_caps (&self->ainfo, caps))
+        return FALSE;
+      switch (GST_AUDIO_INFO_FORMAT (&self->ainfo)) {
+        case GST_AUDIO_FORMAT_S8:
+          self->process = gst_videoframe_audiolevel_calculate_gint8;
+          break;
+        case GST_AUDIO_FORMAT_S16:
+          self->process = gst_videoframe_audiolevel_calculate_gint16;
+          break;
+        case GST_AUDIO_FORMAT_S32:
+          self->process = gst_videoframe_audiolevel_calculate_gint32;
+          break;
+        case GST_AUDIO_FORMAT_F32:
+          self->process = gst_videoframe_audiolevel_calculate_gfloat;
+          break;
+        case GST_AUDIO_FORMAT_F64:
+          self->process = gst_videoframe_audiolevel_calculate_gdouble;
+          break;
+        default:
+          self->process = NULL;
+          break;
+      }
+      gst_adapter_clear (self->adapter);
+      channels = GST_AUDIO_INFO_CHANNELS (&self->ainfo);
+      self->first_time = GST_CLOCK_TIME_NONE;
+      self->total_frames = 0;
+      if (self->CS)
+        g_free (self->CS);
+      self->CS = g_new0 (gdouble, channels);
+      break;
+    }
+    default:
+      break;
+  }
+
+  return gst_pad_event_default (pad, parent, event);
+}
+
+static GstMessage *
+update_rms_from_buffer (GstVideoFrameAudioLevel * self, GstBuffer * inbuf)
+{
+  GstMapInfo map;
+  guint8 *in_data;
+  gsize in_size;
+  gdouble CS;
+  guint i;
+  guint num_frames, frames;
+  guint num_int_samples = 0;    /* number of interleaved samples
+                                 * ie. total count for all channels combined */
+  gint channels, rate, bps;
+  GValue v = G_VALUE_INIT;
+  GValue va = G_VALUE_INIT;
+  GValueArray *a;
+  GstStructure *s;
+  GstMessage *msg;
+  GstClockTime duration, running_time;
+
+  channels = GST_AUDIO_INFO_CHANNELS (&self->ainfo);
+  bps = GST_AUDIO_INFO_BPS (&self->ainfo);
+  rate = GST_AUDIO_INFO_RATE (&self->ainfo);
+
+  gst_buffer_map (inbuf, &map, GST_MAP_READ);
+  in_data = map.data;
+  in_size = map.size;
+
+  num_int_samples = in_size / bps;
+
+  GST_LOG_OBJECT (self, "analyzing %u sample frames at ts %" GST_TIME_FORMAT,
+      num_int_samples, GST_TIME_ARGS (GST_BUFFER_TIMESTAMP (inbuf)));
+
+  g_return_val_if_fail (num_int_samples % channels == 0, NULL);
+
+  num_frames = num_int_samples / channels;
+  frames = num_frames;
+  duration = GST_FRAMES_TO_CLOCK_TIME (frames, rate);
+  if (num_frames > 0) {
+    for (i = 0; i < channels; ++i) {
+      self->process (in_data + (bps * i), num_int_samples, channels, &CS);
+      GST_LOG_OBJECT (self,
+          "[%d]: cumulative squares %lf, over %d samples/%d channels",
+          i, CS, num_int_samples, channels);
+      self->CS[i] += CS;
+    }
+    in_data += num_frames * bps;
+
+    self->total_frames += num_frames;
+  }
+  running_time =
+      self->first_time + gst_util_uint64_scale (self->total_frames, GST_SECOND,
+      rate);
+
+  a = g_value_array_new (channels);
+  s = gst_structure_new ("videoframe-audiolevel", "running-time", G_TYPE_UINT64,
+      running_time, "duration", G_TYPE_UINT64, duration, NULL);
+
+  g_value_init (&v, G_TYPE_DOUBLE);
+  g_value_init (&va, G_TYPE_VALUE_ARRAY);
+  for (i = 0; i < channels; i++) {
+    gdouble rms;
+    if (frames == 0 || self->CS[i] == 0) {
+      rms = 0;                  /* empty buffer */
+    } else {
+      rms = sqrt (self->CS[i] / frames);
+    }
+    self->CS[i] = 0.0;
+    g_value_set_double (&v, rms);
+    g_value_array_append (a, &v);
+  }
+  g_value_take_boxed (&va, a);
+  gst_structure_take_value (s, "rms", &va);
+  msg = gst_message_new_element (GST_OBJECT (self), s);
+
+  gst_buffer_unmap (inbuf, &map);
+
+  return msg;
+}
+
+static GstFlowReturn
+gst_videoframe_audiolevel_vsink_chain (GstPad * pad, GstObject * parent,
+    GstBuffer * inbuf)
+{
+  GstClockTime timestamp;
+  GstVideoFrameAudioLevel *self = GST_VIDEOFRAME_AUDIOLEVEL (parent);
+  GstClockTime duration;
+  GstClockTime *ptrtime = g_new (GstClockTime, 1);
+
+  timestamp = GST_BUFFER_TIMESTAMP (inbuf);
+  *ptrtime =
+      gst_segment_to_running_time (&self->vsegment, GST_FORMAT_TIME, timestamp);
+  g_mutex_lock (&self->mutex);
+  self->vsegment.position = timestamp;
+  duration = GST_BUFFER_DURATION (inbuf);
+  if (duration != GST_CLOCK_TIME_NONE)
+    self->vsegment.position += duration;
+  g_queue_push_tail (&self->vtimeq, ptrtime);
+  g_cond_signal (&self->cond);
+  GST_DEBUG_OBJECT (pad, "Pushed a frame");
+  g_mutex_unlock (&self->mutex);
+  return gst_pad_push (self->vsrcpad, inbuf);
+}
+
+static GstFlowReturn
+gst_videoframe_audiolevel_asink_chain (GstPad * pad, GstObject * parent,
+    GstBuffer * inbuf)
+{
+  GstClockTime timestamp, cur_time;
+  GstVideoFrameAudioLevel *self = GST_VIDEOFRAME_AUDIOLEVEL (parent);
+  GstBuffer *buf;
+  gsize inbuf_size;
+  guint64 start_offset, end_offset;
+  GstClockTime running_time;
+  gint rate, bpf;
+  gboolean discont = FALSE;
+
+  timestamp = GST_BUFFER_TIMESTAMP (inbuf);
+  running_time =
+      gst_segment_to_running_time (&self->asegment, GST_FORMAT_TIME, timestamp);
+
+  rate = GST_AUDIO_INFO_RATE (&self->ainfo);
+  bpf = GST_AUDIO_INFO_BPF (&self->ainfo);
+  start_offset = gst_util_uint64_scale (timestamp, rate, GST_SECOND);
+  inbuf_size = gst_buffer_get_size (inbuf);
+  end_offset = start_offset + inbuf_size / bpf;
+
+  g_mutex_lock (&self->mutex);
+
+  if (GST_BUFFER_IS_DISCONT (inbuf)
+      || GST_BUFFER_FLAG_IS_SET (inbuf, GST_BUFFER_FLAG_RESYNC)
+      || self->first_time == GST_CLOCK_TIME_NONE) {
+    discont = TRUE;
+  } else {
+    guint64 diff, max_sample_diff;
+
+    /* Check discont, based on audiobasesink */
+    if (start_offset <= self->next_offset)
+      diff = self->next_offset - start_offset;
+    else
+      diff = start_offset - self->next_offset;
+
+    max_sample_diff =
+        gst_util_uint64_scale_int (self->alignment_threshold, rate, GST_SECOND);
+
+    /* Discont! */
+    if (G_UNLIKELY (diff >= max_sample_diff)) {
+      if (self->discont_wait > 0) {
+        if (self->discont_time == GST_CLOCK_TIME_NONE) {
+          self->discont_time = timestamp;
+        } else if (timestamp - self->discont_time >= self->discont_wait) {
+          discont = TRUE;
+          self->discont_time = GST_CLOCK_TIME_NONE;
+        }
+      } else {
+        discont = TRUE;
+      }
+    } else if (G_UNLIKELY (self->discont_time != GST_CLOCK_TIME_NONE)) {
+      /* we have had a discont, but are now back on track! */
+      self->discont_time = GST_CLOCK_TIME_NONE;
+    }
+  }
+
+  if (discont) {
+    /* Have discont, need resync */
+    if (self->next_offset != -1)
+      GST_INFO_OBJECT (pad, "Have discont. Expected %"
+          G_GUINT64_FORMAT ", got %" G_GUINT64_FORMAT,
+          self->next_offset, start_offset);
+    self->total_frames = 0;
+    self->first_time = running_time;
+    self->next_offset = end_offset;
+  } else {
+    self->next_offset += inbuf_size / bpf;
+  }
+
+  gst_adapter_push (self->adapter, gst_buffer_ref (inbuf));
+
+  GST_DEBUG_OBJECT (self, "Queue length %i",
+      g_queue_get_length (&self->vtimeq));
+
+  while (TRUE) {
+    GstClockTime *vt0, *vt1;
+    GstClockTime vtemp;
+    GstMessage *msg;
+    gsize bytes, available_bytes;
+
+    vtemp = GST_CLOCK_TIME_NONE;
+
+    while (!(g_queue_get_length (&self->vtimeq) >= 2 || self->video_eos_flag
+            || self->audio_flush_flag || self->shutdown_flag))
+      g_cond_wait (&self->cond, &self->mutex);
+
+    if (self->audio_flush_flag || self->shutdown_flag) {
+      g_mutex_unlock (&self->mutex);
+      gst_buffer_unref (inbuf);
+      return GST_FLOW_FLUSHING;
+    } else if (self->video_eos_flag) {
+      GST_DEBUG_OBJECT (self, "Video EOS flag alert");
+      /* nothing to do here if queue is empty */
+      if (g_queue_get_length (&self->vtimeq) == 0)
+        break;
+
+      if (g_queue_get_length (&self->vtimeq) < 2) {
+        vtemp = self->vsegment.position;
+      } else if (self->vsegment.position == GST_CLOCK_TIME_NONE) {
+        /* g_queue_get_length is surely >= 2 at this point
+         * so the adapter isn't empty */
+        buf =
+            gst_adapter_take_buffer (self->adapter,
+            gst_adapter_available (self->adapter));
+        if (buf != NULL) {
+          GstMessage *msg;
+          msg = update_rms_from_buffer (self, buf);
+          g_mutex_unlock (&self->mutex);
+          gst_element_post_message (GST_ELEMENT (self), msg);
+          gst_buffer_unref (buf);
+          g_mutex_lock (&self->mutex);  /* we unlock again later */
+        }
+        break;
+      }
+    } else if (g_queue_get_length (&self->vtimeq) < 2) {
+      continue;
+    }
+
+    vt0 = g_queue_pop_head (&self->vtimeq);
+    if (vtemp == GST_CLOCK_TIME_NONE)
+      vt1 = g_queue_peek_head (&self->vtimeq);
+    else
+      vt1 = &vtemp;
+
+    cur_time =
+        self->first_time + gst_util_uint64_scale (self->total_frames,
+        GST_SECOND, rate);
+    GST_DEBUG_OBJECT (self,
+        "Processing: current time is %" GST_TIME_FORMAT,
+        GST_TIME_ARGS (cur_time));
+    GST_DEBUG_OBJECT (self, "Total frames is %i with a rate of %d",
+        self->total_frames, rate);
+    GST_DEBUG_OBJECT (self, "Start time is %" GST_TIME_FORMAT,
+        GST_TIME_ARGS (self->first_time));
+    GST_DEBUG_OBJECT (self, "Time on top is %" GST_TIME_FORMAT,
+        GST_TIME_ARGS (*vt0));
+
+    if (cur_time < *vt0) {
+      guint num_frames =
+          gst_util_uint64_scale (*vt0 - cur_time, rate, GST_SECOND);
+      bytes = num_frames * GST_AUDIO_INFO_BPF (&self->ainfo);
+      available_bytes = gst_adapter_available (self->adapter);
+      if (available_bytes == 0) {
+        g_queue_push_head (&self->vtimeq, vt0);
+        break;
+      }
+      if (bytes == 0) {
+        cur_time = *vt0;
+      } else {
+        GST_DEBUG_OBJECT (self,
+            "Flushed %" G_GSIZE_FORMAT " out of %" G_GSIZE_FORMAT " bytes",
+            bytes, available_bytes);
+        gst_adapter_flush (self->adapter, MIN (bytes, available_bytes));
+        self->total_frames += num_frames;
+        if (available_bytes <= bytes) {
+          g_queue_push_head (&self->vtimeq, vt0);
+          break;
+        }
+        cur_time =
+            self->first_time + gst_util_uint64_scale (self->total_frames,
+            GST_SECOND, rate);
+      }
+    }
+    if (*vt1 > cur_time) {
+      bytes =
+          GST_AUDIO_INFO_BPF (&self->ainfo) * gst_util_uint64_scale (*vt1 -
+          cur_time, rate, GST_SECOND);
+    } else {
+      bytes = 0;                /* We just need to discard vt0 */
+    }
+    available_bytes = gst_adapter_available (self->adapter);
+    GST_DEBUG_OBJECT (self,
+        "Adapter contains %" G_GSIZE_FORMAT " out of %" G_GSIZE_FORMAT " bytes",
+        available_bytes, bytes);
+
+    if (available_bytes < bytes) {
+      g_queue_push_head (&self->vtimeq, vt0);
+      goto done;
+    }
+
+    if (bytes > 0) {
+      buf = gst_adapter_take_buffer (self->adapter, bytes);
+      g_assert (buf != NULL);
+    } else {
+      /* Just an empty buffer */
+      buf = gst_buffer_new ();
+    }
+    msg = update_rms_from_buffer (self, buf);
+    g_mutex_unlock (&self->mutex);
+    gst_element_post_message (GST_ELEMENT (self), msg);
+    g_mutex_lock (&self->mutex);
+
+    gst_buffer_unref (buf);
+    g_free (vt0);
+    if (available_bytes == bytes)
+      break;
+  }
+done:
+  g_mutex_unlock (&self->mutex);
+  return gst_pad_push (self->asrcpad, inbuf);
+}
+
+static GstIterator *
+gst_videoframe_audiolevel_iterate_internal_links (GstPad * pad,
+    GstObject * parent)
+{
+  GstIterator *it = NULL;
+  GstPad *opad;
+  GValue val = { 0, };
+  GstVideoFrameAudioLevel *self = GST_VIDEOFRAME_AUDIOLEVEL (parent);
+
+  if (self->asinkpad == pad)
+    opad = gst_object_ref (self->asrcpad);
+  else if (self->asrcpad == pad)
+    opad = gst_object_ref (self->asinkpad);
+  else if (self->vsinkpad == pad)
+    opad = gst_object_ref (self->vsrcpad);
+  else if (self->vsrcpad == pad)
+    opad = gst_object_ref (self->vsinkpad);
+  else
+    goto out;
+
+  g_value_init (&val, GST_TYPE_PAD);
+  g_value_set_object (&val, opad);
+  it = gst_iterator_new_single (GST_TYPE_PAD, &val);
+  g_value_unset (&val);
+
+  gst_object_unref (opad);
+
+out:
+  return it;
+}
+
+static gboolean
+gst_videoframe_audiolevel_plugin_init (GstPlugin * plugin)
+{
+  return gst_element_register (plugin, "videoframe-audiolevel",
+      GST_RANK_NONE, GST_TYPE_VIDEOFRAME_AUDIOLEVEL);
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+    GST_VERSION_MINOR,
+    videoframe_audiolevel,
+    "Video frame-synchronized audio level",
+    gst_videoframe_audiolevel_plugin_init, VERSION, GST_LICENSE,
+    GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN);
diff --git a/gst/videoframe_audiolevel/gstvideoframe-audiolevel.h b/gst/videoframe_audiolevel/gstvideoframe-audiolevel.h
new file mode 100644
index 0000000..83332e5
--- /dev/null
+++ b/gst/videoframe_audiolevel/gstvideoframe-audiolevel.h
@@ -0,0 +1,73 @@
+/* 
+ * GStreamer
+ * Copyright (C) 2015 Vivia Nikolaidou <vivia@toolsonair.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_VIDEOFRAME_AUDIOLEVEL_H__
+#define __GST_VIDEOFRAME_AUDIOLEVEL_H__
+
+#include <gst/gst.h>
+#include <gst/audio/audio.h>
+
+G_BEGIN_DECLS
+#define GST_TYPE_VIDEOFRAME_AUDIOLEVEL                    (gst_videoframe_audiolevel_get_type())
+#define GST_VIDEOFRAME_AUDIOLEVEL(obj)                    (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_VIDEOFRAME_AUDIOLEVEL,GstVideoFrameAudioLevel))
+#define GST_IS_VIDEOFRAME_AUDIOLEVEL(obj)                 (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_VIDEOFRAME_AUDIOLEVEL))
+#define GST_VIDEOFRAME_AUDIOLEVEL_CLASS(klass)            (G_TYPE_CHECK_CLASS_CAST((klass) ,GST_TYPE_VIDEOFRAME_AUDIOLEVEL,GstVideoFrameAudioLevelClass))
+#define GST_IS_VIDEOFRAME_AUDIOLEVEL_CLASS(klass)         (G_TYPE_CHECK_CLASS_TYPE((klass) ,GST_TYPE_VIDEOFRAME_AUDIOLEVEL))
+#define GST_VIDEOFRAME_AUDIOLEVEL_GET_CLASS(obj)          (G_TYPE_INSTANCE_GET_CLASS((obj) ,GST_TYPE_VIDEOFRAME_AUDIOLEVEL,GstVideoFrameAudioLevelClass))
+typedef struct _GstVideoFrameAudioLevel GstVideoFrameAudioLevel;
+typedef struct _GstVideoFrameAudioLevelClass GstVideoFrameAudioLevelClass;
+
+struct _GstVideoFrameAudioLevel
+{
+  GstElement parent;
+
+  GstPad *asrcpad, *asinkpad, *vsrcpad, *vsinkpad;
+
+  GstAudioInfo ainfo;
+
+  gdouble *CS;                  /* normalized Cumulative Square */
+
+  GstSegment asegment, vsegment;
+
+  void (*process) (gpointer, guint, guint, gdouble *);
+
+  GQueue vtimeq;
+  GstAdapter *adapter;
+  GstClockTime first_time;
+  guint total_frames;
+  guint64 next_offset, alignment_threshold, discont_time, discont_wait;
+
+  gboolean video_eos_flag;
+  gboolean audio_flush_flag;
+  gboolean shutdown_flag;
+
+  GCond cond;
+  GMutex mutex;
+};
+
+struct _GstVideoFrameAudioLevelClass
+{
+  GstElementClass parent_class;
+};
+
+GType gst_videoframe_audiolevel_get_type (void);
+
+G_END_DECLS
+#endif /* __GST_VIDEOFRAME_AUDIOLEVEL_H__ */
diff --git a/gst/videomeasure/Makefile.in b/gst/videomeasure/Makefile.in
index 70af382..84a4ca4 100644
--- a/gst/videomeasure/Makefile.in
+++ b/gst/videomeasure/Makefile.in
@@ -278,6 +278,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -315,6 +317,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -342,6 +346,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -360,6 +366,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -370,6 +378,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -395,6 +405,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -420,6 +432,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -551,6 +565,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -608,8 +624,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -679,6 +699,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/videomeasure/gstvideomeasure_ssim.c b/gst/videomeasure/gstvideomeasure_ssim.c
index e85d68f..13ba035 100644
--- a/gst/videomeasure/gstvideomeasure_ssim.c
+++ b/gst/videomeasure/gstvideomeasure_ssim.c
@@ -1176,11 +1176,7 @@
     goto could_not_add_sink;
   else
     /* increment pad counter */
-#if GLIB_CHECK_VERSION(2,29,5)
     padcount = g_atomic_int_add (&ssim->padcount, 1);
-#else
-    padcount = g_atomic_int_exchange_and_add (&ssim->padcount, 1);
-#endif
 
   if (num != -1) {
     GstSSimOutputContext *c;
diff --git a/gst/videoparsers/Makefile.in b/gst/videoparsers/Makefile.in
index e9251d1..2db81aa 100644
--- a/gst/videoparsers/Makefile.in
+++ b/gst/videoparsers/Makefile.in
@@ -287,6 +287,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -324,6 +326,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -351,6 +355,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -369,6 +375,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -379,6 +387,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -404,6 +414,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -429,6 +441,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -560,6 +574,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -617,8 +633,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -688,6 +708,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/videoparsers/gstdiracparse.c b/gst/videoparsers/gstdiracparse.c
index ea3cd9d..93f00c6 100644
--- a/gst/videoparsers/gstdiracparse.c
+++ b/gst/videoparsers/gstdiracparse.c
@@ -24,7 +24,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v fakesrc ! gstdiracparse ! FIXME ! fakesink
+ * gst-launch-1.0 -v fakesrc ! gstdiracparse ! FIXME ! fakesink
  * ]|
  * FIXME Describe what the pipeline does.
  * </refsect2>
@@ -396,10 +396,19 @@
     GstTagList *taglist;
     GstCaps *caps;
 
-    taglist = gst_tag_list_new_empty ();
-
     /* codec tag */
     caps = gst_pad_get_current_caps (GST_BASE_PARSE_SRC_PAD (parse));
+    if (G_UNLIKELY (caps == NULL)) {
+      if (GST_PAD_IS_FLUSHING (GST_BASE_PARSE_SRC_PAD (parse))) {
+        GST_INFO_OBJECT (parse, "Src pad is flushing");
+        return GST_FLOW_FLUSHING;
+      } else {
+        GST_INFO_OBJECT (parse, "Src pad is not negotiated!");
+        return GST_FLOW_NOT_NEGOTIATED;
+      }
+    }
+
+    taglist = gst_tag_list_new_empty ();
     gst_pb_utils_add_codec_description_to_tag_list (taglist,
         GST_TAG_VIDEO_CODEC, caps);
     gst_caps_unref (caps);
diff --git a/gst/videoparsers/gsth263parse.c b/gst/videoparsers/gsth263parse.c
index eb6290b..370cbb1 100644
--- a/gst/videoparsers/gsth263parse.c
+++ b/gst/videoparsers/gsth263parse.c
@@ -439,10 +439,19 @@
     GstTagList *taglist;
     GstCaps *caps;
 
-    taglist = gst_tag_list_new_empty ();
-
     /* codec tag */
     caps = gst_pad_get_current_caps (GST_BASE_PARSE_SRC_PAD (parse));
+    if (G_UNLIKELY (caps == NULL)) {
+      if (GST_PAD_IS_FLUSHING (GST_BASE_PARSE_SRC_PAD (parse))) {
+        GST_INFO_OBJECT (parse, "Src pad is flushing");
+        return GST_FLOW_FLUSHING;
+      } else {
+        GST_INFO_OBJECT (parse, "Src pad is not negotiated!");
+        return GST_FLOW_NOT_NEGOTIATED;
+      }
+    }
+
+    taglist = gst_tag_list_new_empty ();
     gst_pb_utils_add_codec_description_to_tag_list (taglist,
         GST_TAG_VIDEO_CODEC, caps);
     gst_caps_unref (caps);
diff --git a/gst/videoparsers/gsth264parse.c b/gst/videoparsers/gsth264parse.c
index 915c2d7..21df95e 100644
--- a/gst/videoparsers/gsth264parse.c
+++ b/gst/videoparsers/gsth264parse.c
@@ -2197,8 +2197,6 @@
     GstTagList *taglist;
     GstCaps *caps;
 
-    taglist = gst_tag_list_new_empty ();
-
     /* codec tag */
     caps = gst_pad_get_current_caps (GST_BASE_PARSE_SRC_PAD (parse));
     if (caps == NULL) {
@@ -2210,6 +2208,8 @@
         return GST_FLOW_NOT_NEGOTIATED;
       }
     }
+
+    taglist = gst_tag_list_new_empty ();
     gst_pb_utils_add_codec_description_to_tag_list (taglist,
         GST_TAG_VIDEO_CODEC, caps);
     gst_caps_unref (caps);
@@ -2702,6 +2702,7 @@
     case GST_EVENT_FLUSH_STOP:
       h264parse->dts = GST_CLOCK_TIME_NONE;
       h264parse->ts_trn_nb = GST_CLOCK_TIME_NONE;
+      h264parse->push_codec = TRUE;
 
       res = GST_BASE_PARSE_CLASS (parent_class)->sink_event (parse, event);
       break;
diff --git a/gst/videoparsers/gsth265parse.c b/gst/videoparsers/gsth265parse.c
index d649681..67a16c6 100644
--- a/gst/videoparsers/gsth265parse.c
+++ b/gst/videoparsers/gsth265parse.c
@@ -1765,10 +1765,19 @@
     GstTagList *taglist;
     GstCaps *caps;
 
-    taglist = gst_tag_list_new_empty ();
-
     /* codec tag */
     caps = gst_pad_get_current_caps (GST_BASE_PARSE_SRC_PAD (parse));
+    if (G_UNLIKELY (caps == NULL)) {
+      if (GST_PAD_IS_FLUSHING (GST_BASE_PARSE_SRC_PAD (parse))) {
+        GST_INFO_OBJECT (parse, "Src pad is flushing");
+        return GST_FLOW_FLUSHING;
+      } else {
+        GST_INFO_OBJECT (parse, "Src pad is not negotiated!");
+        return GST_FLOW_NOT_NEGOTIATED;
+      }
+    }
+
+    taglist = gst_tag_list_new_empty ();
     gst_pb_utils_add_codec_description_to_tag_list (taglist,
         GST_TAG_VIDEO_CODEC, caps);
     gst_caps_unref (caps);
@@ -2188,7 +2197,7 @@
       break;
     }
     case GST_EVENT_FLUSH_STOP:
-
+      h265parse->push_codec = TRUE;
       res = GST_BASE_PARSE_CLASS (parent_class)->sink_event (parse, event);
       break;
     case GST_EVENT_SEGMENT:
diff --git a/gst/videoparsers/gstmpeg4videoparse.c b/gst/videoparsers/gstmpeg4videoparse.c
index 53db2d5..a1fd3b2 100644
--- a/gst/videoparsers/gstmpeg4videoparse.c
+++ b/gst/videoparsers/gstmpeg4videoparse.c
@@ -722,10 +722,19 @@
     GstTagList *taglist;
     GstCaps *caps;
 
-    taglist = gst_tag_list_new_empty ();
-
     /* codec tag */
     caps = gst_pad_get_current_caps (GST_BASE_PARSE_SRC_PAD (parse));
+    if (G_UNLIKELY (caps == NULL)) {
+      if (GST_PAD_IS_FLUSHING (GST_BASE_PARSE_SRC_PAD (parse))) {
+        GST_INFO_OBJECT (parse, "Src pad is flushing");
+        return GST_FLOW_FLUSHING;
+      } else {
+        GST_INFO_OBJECT (parse, "Src pad is not negotiated!");
+        return GST_FLOW_NOT_NEGOTIATED;
+      }
+    }
+
+    taglist = gst_tag_list_new_empty ();
     gst_pb_utils_add_codec_description_to_tag_list (taglist,
         GST_TAG_VIDEO_CODEC, caps);
     gst_caps_unref (caps);
diff --git a/gst/videoparsers/gstmpegvideoparse.c b/gst/videoparsers/gstmpegvideoparse.c
index 54ee13b..5fa7165 100644
--- a/gst/videoparsers/gstmpegvideoparse.c
+++ b/gst/videoparsers/gstmpegvideoparse.c
@@ -948,8 +948,18 @@
     GstCaps *caps;
 
     /* codec tag */
-    taglist = gst_tag_list_new_empty ();
     caps = gst_pad_get_current_caps (GST_BASE_PARSE_SRC_PAD (parse));
+    if (G_UNLIKELY (caps == NULL)) {
+      if (GST_PAD_IS_FLUSHING (GST_BASE_PARSE_SRC_PAD (parse))) {
+        GST_INFO_OBJECT (parse, "Src pad is flushing");
+        return GST_FLOW_FLUSHING;
+      } else {
+        GST_INFO_OBJECT (parse, "Src pad is not negotiated!");
+        return GST_FLOW_NOT_NEGOTIATED;
+      }
+    }
+
+    taglist = gst_tag_list_new_empty ();
     gst_pb_utils_add_codec_description_to_tag_list (taglist,
         GST_TAG_VIDEO_CODEC, caps);
     gst_caps_unref (caps);
diff --git a/gst/videoparsers/gstpngparse.c b/gst/videoparsers/gstpngparse.c
index e08fe71..e9d0768 100644
--- a/gst/videoparsers/gstpngparse.c
+++ b/gst/videoparsers/gstpngparse.c
@@ -259,10 +259,19 @@
     GstTagList *taglist;
     GstCaps *caps;
 
-    taglist = gst_tag_list_new_empty ();
-
     /* codec tag */
     caps = gst_pad_get_current_caps (GST_BASE_PARSE_SRC_PAD (parse));
+    if (G_UNLIKELY (caps == NULL)) {
+      if (GST_PAD_IS_FLUSHING (GST_BASE_PARSE_SRC_PAD (parse))) {
+        GST_INFO_OBJECT (parse, "Src pad is flushing");
+        return GST_FLOW_FLUSHING;
+      } else {
+        GST_INFO_OBJECT (parse, "Src pad is not negotiated!");
+        return GST_FLOW_NOT_NEGOTIATED;
+      }
+    }
+
+    taglist = gst_tag_list_new_empty ();
     gst_pb_utils_add_codec_description_to_tag_list (taglist,
         GST_TAG_VIDEO_CODEC, caps);
     gst_caps_unref (caps);
diff --git a/gst/videoparsers/gstvc1parse.c b/gst/videoparsers/gstvc1parse.c
index 63de4e9..e72f4f6 100644
--- a/gst/videoparsers/gstvc1parse.c
+++ b/gst/videoparsers/gstvc1parse.c
@@ -1700,10 +1700,19 @@
     GstTagList *taglist;
     GstCaps *caps;
 
-    taglist = gst_tag_list_new_empty ();
-
     /* codec tag */
     caps = gst_pad_get_current_caps (GST_BASE_PARSE_SRC_PAD (parse));
+    if (G_UNLIKELY (caps == NULL)) {
+      if (GST_PAD_IS_FLUSHING (GST_BASE_PARSE_SRC_PAD (parse))) {
+        GST_INFO_OBJECT (parse, "Src pad is flushing");
+        return GST_FLOW_FLUSHING;
+      } else {
+        GST_INFO_OBJECT (parse, "Src pad is not negotiated!");
+        return GST_FLOW_NOT_NEGOTIATED;
+      }
+    }
+
+    taglist = gst_tag_list_new_empty ();
     gst_pb_utils_add_codec_description_to_tag_list (taglist,
         GST_TAG_VIDEO_CODEC, caps);
     gst_caps_unref (caps);
@@ -1962,6 +1971,7 @@
           g_assert_not_reached ();
           break;
       }
+      break;
 
     case VC1_STREAM_FORMAT_FRAME_LAYER:
       switch (vc1parse->input_stream_format) {
diff --git a/gst/videosignal/Makefile.in b/gst/videosignal/Makefile.in
index 21d19de..ce5367b 100644
--- a/gst/videosignal/Makefile.in
+++ b/gst/videosignal/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/videosignal/gstsimplevideomark.c b/gst/videosignal/gstsimplevideomark.c
index 9d57b52..2a527c3 100644
--- a/gst/videosignal/gstsimplevideomark.c
+++ b/gst/videosignal/gstsimplevideomark.c
@@ -36,7 +36,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch videotestsrc ! simplevideomark ! ximagesink
+ * gst-launch-1.0 videotestsrc ! simplevideomark ! videoconvert ! ximagesink
  * ]| Add the default black/white squares at the bottom left of the video frames.
  * </refsect2>
  */
diff --git a/gst/videosignal/gstsimplevideomarkdetect.c b/gst/videosignal/gstsimplevideomarkdetect.c
index d5f093f..1e95c81 100644
--- a/gst/videosignal/gstsimplevideomarkdetect.c
+++ b/gst/videosignal/gstsimplevideomarkdetect.c
@@ -87,7 +87,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch videotestsrc ! simplevideomarkdetect ! videoconvert ! ximagesink
+ * gst-launch-1.0 videotestsrc ! simplevideomarkdetect ! videoconvert ! ximagesink
  * ]|
  * </refsect2>
  */
diff --git a/gst/videosignal/gstvideoanalyse.c b/gst/videosignal/gstvideoanalyse.c
index 3ca4d03..b7ed7e1 100644
--- a/gst/videosignal/gstvideoanalyse.c
+++ b/gst/videosignal/gstvideoanalyse.c
@@ -72,7 +72,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -m videotestsrc ! videoanalyse ! videoconvert ! ximagesink
+ * gst-launch-1.0 -m videotestsrc ! videoanalyse ! videoconvert ! ximagesink
  * ]| This pipeline emits messages to the console for each frame that has been analysed. 
  * </refsect2>
  */
diff --git a/gst/vmnc/Makefile.in b/gst/vmnc/Makefile.in
index 77c60cc..ed80898 100644
--- a/gst/vmnc/Makefile.in
+++ b/gst/vmnc/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/y4m/Makefile.in b/gst/y4m/Makefile.in
index 0d66844..dd313f5 100644
--- a/gst/y4m/Makefile.in
+++ b/gst/y4m/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/y4m/gsty4mdec.c b/gst/y4m/gsty4mdec.c
index 6bf27a8..c6b2065 100644
--- a/gst/y4m/gsty4mdec.c
+++ b/gst/y4m/gsty4mdec.c
@@ -24,7 +24,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v filesrc location=file.y4m ! y4mdec ! xvimagesink
+ * gst-launch-1.0 -v filesrc location=file.y4m ! y4mdec ! xvimagesink
  * ]|
  * </refsect2>
  */
diff --git a/gst/yadif/Makefile.in b/gst/yadif/Makefile.in
index 586fd74..749d8d9 100644
--- a/gst/yadif/Makefile.in
+++ b/gst/yadif/Makefile.in
@@ -272,6 +272,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -309,6 +311,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -336,6 +340,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -354,6 +360,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -364,6 +372,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -389,6 +399,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -414,6 +426,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -545,6 +559,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -602,8 +618,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -673,6 +693,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/gst/yadif/gstyadif.c b/gst/yadif/gstyadif.c
index e4fed61..1dcf2ca 100644
--- a/gst/yadif/gstyadif.c
+++ b/gst/yadif/gstyadif.c
@@ -29,7 +29,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v videotestsrc pattern=ball ! interlace ! yadif ! xvimagesink
+ * gst-launch-1.0 -v videotestsrc pattern=ball ! interlace ! yadif ! xvimagesink
  * ]|
  * This pipeline creates an interlaced test pattern, and then deinterlaces
  * it using the yadif filter.
@@ -243,8 +243,8 @@
     gst_value_list_append_value (&value, &v);
 
     gst_caps_set_value (othercaps, "interlace-mode", &value);
-    g_value_reset (&value);
-    g_value_reset (&v);
+    g_value_unset (&value);
+    g_value_unset (&v);
   } else {
     gst_caps_set_simple (othercaps, "interlace-mode", G_TYPE_STRING,
         "progressive", NULL);
diff --git a/gst/yadif/vf_yadif.c b/gst/yadif/vf_yadif.c
index 82e9e9e..a0bec4a 100644
--- a/gst/yadif/vf_yadif.c
+++ b/gst/yadif/vf_yadif.c
@@ -56,12 +56,15 @@
         int temporal_diff2 =(FFABS(next[mrefs] - c) + FFABS(next[prefs] - e) )>>1; \
         int diff = FFMAX3(temporal_diff0 >> 1, temporal_diff1, temporal_diff2); \
         int spatial_pred = (c+e) >> 1; \
-        int spatial_score = FFABS(cur[mrefs - 1] - cur[prefs - 1]) + FFABS(c-e) \
-                          + FFABS(cur[mrefs + 1] - cur[prefs + 1]) - 1; \
+        int spatial_score = -1; \
  \
-        CHECK(-1) CHECK(-2) }} }} \
-        CHECK( 1) CHECK( 2) }} }} \
+        if (mrefs > 0 && prefs > 0) { \
+            spatial_score = FFABS(cur[mrefs - 1] - cur[prefs - 1]) + FFABS(c-e) \
+                            + FFABS(cur[mrefs + 1] - cur[prefs + 1]) - 1; \
  \
+            CHECK(-1) CHECK(-2) }} }} \
+            CHECK( 1) CHECK( 2) }} }} \
+        } \
         if (mode < 2) { \
             int b = (prev2[2 * mrefs] + next2[2 * mrefs])>>1; \
             int f = (prev2[2 * prefs] + next2[2 * prefs])>>1; \
diff --git a/m4/Makefile.in b/m4/Makefile.in
index 6941d86..ba90575 100644
--- a/m4/Makefile.in
+++ b/m4/Makefile.in
@@ -188,6 +188,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -225,6 +227,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -252,6 +256,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -270,6 +276,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -280,6 +288,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -305,6 +315,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -330,6 +342,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -461,6 +475,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -518,8 +534,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -589,6 +609,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/pkgconfig/Makefile.am b/pkgconfig/Makefile.am
index 3e53a6e..c75ec36 100644
--- a/pkgconfig/Makefile.am
+++ b/pkgconfig/Makefile.am
@@ -4,13 +4,15 @@
 	gstreamer-plugins-bad-@GST_API_VERSION@.pc \
 	gstreamer-codecparsers-@GST_API_VERSION@.pc \
 	gstreamer-insertbin-@GST_API_VERSION@.pc \
-	gstreamer-mpegts-@GST_API_VERSION@.pc
+	gstreamer-mpegts-@GST_API_VERSION@.pc \
+	gstreamer-player-@GST_API_VERSION@.pc
 
 pcverfiles_uninstalled = \
 	gstreamer-plugins-bad-@GST_API_VERSION@-uninstalled.pc \
 	gstreamer-codecparsers-@GST_API_VERSION@-uninstalled.pc \
 	gstreamer-insertbin-@GST_API_VERSION@-uninstalled.pc \
-	gstreamer-mpegts-@GST_API_VERSION@-uninstalled.pc
+	gstreamer-mpegts-@GST_API_VERSION@-uninstalled.pc \
+	gstreamer-player-@GST_API_VERSION@-uninstalled.pc
 
 if HAVE_GST_GL
 pcverfiles += gstreamer-gl-@GST_API_VERSION@.pc
@@ -38,7 +40,8 @@
            gstreamer-codecparsers.pc.in gstreamer-codecparsers-uninstalled.pc.in \
            gstreamer-gl.pc.in gstreamer-gl-uninstalled.pc.in \
            gstreamer-insertbin.pc.in gstreamer-insertbin-uninstalled.pc.in \
-           gstreamer-mpegts.pc.in gstreamer-mpegts-uninstalled.pc.in
+           gstreamer-mpegts.pc.in gstreamer-mpegts-uninstalled.pc.in \
+           gstreamer-player.pc.in gstreamer-player-uninstalled.pc.in
 
 DISTCLEANFILES = $(pcinfiles:.in=)
 EXTRA_DIST = $(pcinfiles)
diff --git a/pkgconfig/Makefile.in b/pkgconfig/Makefile.in
index 6cc928e..d495ae9 100644
--- a/pkgconfig/Makefile.in
+++ b/pkgconfig/Makefile.in
@@ -137,7 +137,8 @@
 	gstreamer-codecparsers-uninstalled.pc gstreamer-insertbin.pc \
 	gstreamer-insertbin-uninstalled.pc gstreamer-gl.pc \
 	gstreamer-gl-uninstalled.pc gstreamer-mpegts.pc \
-	gstreamer-mpegts-uninstalled.pc gstreamer-wayland.pc \
+	gstreamer-mpegts-uninstalled.pc gstreamer-player.pc \
+	gstreamer-player-uninstalled.pc gstreamer-wayland.pc \
 	gstreamer-wayland-uninstalled.pc gstreamer-bad-base.pc \
 	gstreamer-bad-base-uninstalled.pc gstreamer-bad-video.pc \
 	gstreamer-bad-video-uninstalled.pc
@@ -204,6 +205,8 @@
 	$(srcdir)/gstreamer-insertbin.pc.in \
 	$(srcdir)/gstreamer-mpegts-uninstalled.pc.in \
 	$(srcdir)/gstreamer-mpegts.pc.in \
+	$(srcdir)/gstreamer-player-uninstalled.pc.in \
+	$(srcdir)/gstreamer-player.pc.in \
 	$(srcdir)/gstreamer-plugins-bad-uninstalled.pc.in \
 	$(srcdir)/gstreamer-plugins-bad.pc.in \
 	$(srcdir)/gstreamer-wayland-uninstalled.pc.in \
@@ -244,6 +247,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -281,6 +286,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -308,6 +315,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -326,6 +335,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -336,6 +347,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -361,6 +374,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -386,6 +401,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -517,6 +534,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -574,8 +593,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -645,6 +668,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -736,12 +760,14 @@
 pcverfiles = gstreamer-plugins-bad-@GST_API_VERSION@.pc \
 	gstreamer-codecparsers-@GST_API_VERSION@.pc \
 	gstreamer-insertbin-@GST_API_VERSION@.pc \
-	gstreamer-mpegts-@GST_API_VERSION@.pc $(am__append_1)
+	gstreamer-mpegts-@GST_API_VERSION@.pc \
+	gstreamer-player-@GST_API_VERSION@.pc $(am__append_1)
 pcverfiles_uninstalled =  \
 	gstreamer-plugins-bad-@GST_API_VERSION@-uninstalled.pc \
 	gstreamer-codecparsers-@GST_API_VERSION@-uninstalled.pc \
 	gstreamer-insertbin-@GST_API_VERSION@-uninstalled.pc \
 	gstreamer-mpegts-@GST_API_VERSION@-uninstalled.pc \
+	gstreamer-player-@GST_API_VERSION@-uninstalled.pc \
 	$(am__append_2)
 cp_verbose = $(cp_verbose_$(V))
 cp_verbose_ = $(cp_verbose_$(AM_DEFAULT_VERBOSITY))
@@ -754,7 +780,8 @@
            gstreamer-codecparsers.pc.in gstreamer-codecparsers-uninstalled.pc.in \
            gstreamer-gl.pc.in gstreamer-gl-uninstalled.pc.in \
            gstreamer-insertbin.pc.in gstreamer-insertbin-uninstalled.pc.in \
-           gstreamer-mpegts.pc.in gstreamer-mpegts-uninstalled.pc.in
+           gstreamer-mpegts.pc.in gstreamer-mpegts-uninstalled.pc.in \
+           gstreamer-player.pc.in gstreamer-player-uninstalled.pc.in
 
 DISTCLEANFILES = $(pcinfiles:.in=)
 EXTRA_DIST = $(pcinfiles)
@@ -810,6 +837,10 @@
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 gstreamer-mpegts-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-mpegts-uninstalled.pc.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-player.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-player.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
+gstreamer-player-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-player-uninstalled.pc.in
+	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 gstreamer-wayland.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-wayland.pc.in
 	cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@
 gstreamer-wayland-uninstalled.pc: $(top_builddir)/config.status $(srcdir)/gstreamer-wayland-uninstalled.pc.in
diff --git a/pkgconfig/gstreamer-player-uninstalled.pc.in b/pkgconfig/gstreamer-player-uninstalled.pc.in
new file mode 100644
index 0000000..82e6ee6
--- /dev/null
+++ b/pkgconfig/gstreamer-player-uninstalled.pc.in
@@ -0,0 +1,12 @@
+prefix=
+exec_prefix=
+libdir=${pcfiledir}/../gst-libs/gst/player
+includedir=${pcfiledir}/../gst-libs
+
+Name: GStreamer Player, Uninstalled
+Description: GStreamer Player convenience library, uninstalled
+Requires: gstreamer-@GST_API_VERSION@
+Version: @VERSION@
+Libs: -L${libdir} ${libdir}/libgstplayer-@GST_API_VERSION@.la
+Cflags: -I${includedir}
+
diff --git a/pkgconfig/gstreamer-player.pc.in b/pkgconfig/gstreamer-player.pc.in
new file mode 100644
index 0000000..f296e7f
--- /dev/null
+++ b/pkgconfig/gstreamer-player.pc.in
@@ -0,0 +1,12 @@
+prefix=@prefix@
+exec_prefix=@exec_prefix@
+libdir=@libdir@
+includedir=@includedir@/gstreamer-@GST_API_VERSION@
+
+Name: GStreamer Player
+Description: GStreamer Player convenience library
+Requires: gstreamer-@GST_API_VERSION@
+Version: @VERSION@
+Libs: -L${libdir} -lgstplayer-@GST_API_VERSION@
+Cflags: -I${includedir}
+
diff --git a/po/POTFILES.in b/po/POTFILES.in
index ad42318..ddfa7d0 100644
--- a/po/POTFILES.in
+++ b/po/POTFILES.in
@@ -1,7 +1,7 @@
 ext/dash/gstdashdemux.c
 ext/gl/gstgltestsrc.c
 ext/gsettings/org.freedesktop.gstreamer.default-elements.gschema.xml.in
-ext/opencv/gsttemplatematch.c
+ext/opencv/gsttemplatematch.cpp
 ext/resindvd/resindvdsrc.c
 ext/smoothstreaming/gstmssdemux.c
 ext/sndfile/gstsfdec.c
diff --git a/po/af.gmo b/po/af.gmo
index 85ea08d..87fe849 100644
--- a/po/af.gmo
+++ b/po/af.gmo
Binary files differ
diff --git a/po/af.po b/po/af.po
index 59d3ac5..d331c90 100644
--- a/po/af.po
+++ b/po/af.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins 0.7.6\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2004-03-18 14:16+0200\n"
 "Last-Translator: Petri Jooste <rkwjpj@puk.ac.za>\n"
 "Language-Team: Afrikaans <i18n@af.org.za>\n"
diff --git a/po/az.gmo b/po/az.gmo
index 43e39d1..195e8df 100644
--- a/po/az.gmo
+++ b/po/az.gmo
Binary files differ
diff --git a/po/az.po b/po/az.po
index 1628610..5df1b5e 100644
--- a/po/az.po
+++ b/po/az.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-0.8.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2004-03-19 18:29+0200\n"
 "Last-Translator: Metin Amiroff <metin@karegen.com>\n"
 "Language-Team: Azerbaijani <translation-team-az@lists.sourceforge.net>\n"
diff --git a/po/bg.gmo b/po/bg.gmo
index 7a64695..fed9ab7 100644
--- a/po/bg.gmo
+++ b/po/bg.gmo
Binary files differ
diff --git a/po/bg.po b/po/bg.po
index 18d08d2..15a8265 100644
--- a/po/bg.po
+++ b/po/bg.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.21.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2011-04-26 22:30+0300\n"
 "Last-Translator: Alexander Shopov <ash@kambanaria.org>\n"
 "Language-Team: Bulgarian <dict@fsa-bg.org>\n"
diff --git a/po/ca.gmo b/po/ca.gmo
index 323bdd3..a1233e0 100644
--- a/po/ca.gmo
+++ b/po/ca.gmo
Binary files differ
diff --git a/po/ca.po b/po/ca.po
index 5e71b7b..fde5beb 100644
--- a/po/ca.po
+++ b/po/ca.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.21.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2012-01-01 14:19+0100\n"
 "Last-Translator: Gil Forcada <gforcada@gnome.org>\n"
 "Language-Team: Catalan <ca@dodds.net>\n"
diff --git a/po/cs.gmo b/po/cs.gmo
index 1bfb7ca..ed35eed 100644
--- a/po/cs.gmo
+++ b/po/cs.gmo
Binary files differ
diff --git a/po/cs.po b/po/cs.po
index be757e7..4f8e12d 100644
--- a/po/cs.po
+++ b/po/cs.po
@@ -11,7 +11,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2015-10-15 20:54+0200\n"
 "Last-Translator: Marek Černocký <marek@manet.cz>\n"
 "Language-Team: Czech <translation-team-cs@lists.sourceforge.net>\n"
diff --git a/po/da.gmo b/po/da.gmo
index fe90517..662c13f 100644
--- a/po/da.gmo
+++ b/po/da.gmo
Binary files differ
diff --git a/po/da.po b/po/da.po
index 36026e8..5016f54 100644
--- a/po/da.po
+++ b/po/da.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad-1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2015-12-05 11:28+0200\n"
 "Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n"
 "Language-Team: Danish <dansk@dansk-gruppen.dk>\n"
diff --git a/po/de.gmo b/po/de.gmo
index fb089d3..379f68f 100644
--- a/po/de.gmo
+++ b/po/de.gmo
Binary files differ
diff --git a/po/de.po b/po/de.po
index 2416cc1..7be2b92 100644
--- a/po/de.po
+++ b/po/de.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2015-10-21 00:15+0200\n"
 "Last-Translator: Christian Kirbach <christian.kirbach@gmail.com>\n"
 "Language-Team: German <translation-team-de@lists.sourceforge.net>\n"
diff --git a/po/el.gmo b/po/el.gmo
index 28fb55d..59a59b0 100644
--- a/po/el.gmo
+++ b/po/el.gmo
Binary files differ
diff --git a/po/el.po b/po/el.po
index 4a248d1..9998a20 100644
--- a/po/el.po
+++ b/po/el.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.21.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2012-05-05 19:17+0100\n"
 "Last-Translator: Savvas Radevic <vicedar@gmail.com>\n"
 "Language-Team: Greek <team@lists.gnome.gr>\n"
diff --git a/po/en_GB.gmo b/po/en_GB.gmo
index c7ddb39..85983e2 100644
--- a/po/en_GB.gmo
+++ b/po/en_GB.gmo
Binary files differ
diff --git a/po/en_GB.po b/po/en_GB.po
index 8f3e194..98f9629 100644
--- a/po/en_GB.po
+++ b/po/en_GB.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins 0.8.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2004-04-26 10:41-0400\n"
 "Last-Translator: Gareth Owen <gowen72@yahoo.com>\n"
 "Language-Team: English (British) <en_gb@li.org>\n"
diff --git a/po/eo.gmo b/po/eo.gmo
index f152100..8de5054 100644
--- a/po/eo.gmo
+++ b/po/eo.gmo
Binary files differ
diff --git a/po/eo.po b/po/eo.po
index 5913930..35cecb6 100644
--- a/po/eo.po
+++ b/po/eo.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.21.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2011-06-04 22:18+0200\n"
 "Last-Translator: Kristjan SCHMIDT <kristjan.schmidt@googlemail.com>\n"
 "Language-Team: Esperanto <translation-team-eo@lists.sourceforge.net>\n"
diff --git a/po/es.gmo b/po/es.gmo
index 37ac6bd..9c35661 100644
--- a/po/es.gmo
+++ b/po/es.gmo
Binary files differ
diff --git a/po/es.po b/po/es.po
index f37facf..a158c10 100644
--- a/po/es.po
+++ b/po/es.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.21.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2011-10-02 15:47+0200\n"
 "Last-Translator: Jorge González González <aloriel@gmail.com>\n"
 "Language-Team: Spanish <es@li.org>\n"
diff --git a/po/eu.gmo b/po/eu.gmo
index 10fe1ef..0a57839 100644
--- a/po/eu.gmo
+++ b/po/eu.gmo
Binary files differ
diff --git a/po/eu.po b/po/eu.po
index d22d247..40efb54 100644
--- a/po/eu.po
+++ b/po/eu.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad-0.10.17.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2010-03-25 12:30+0100\n"
 "Last-Translator: Mikel Olasagasti Uranga <hey_neken@mundurat.net>\n"
 "Language-Team: Basque <translation-team-eu@lists.sourceforge.net>\n"
diff --git a/po/fi.gmo b/po/fi.gmo
index c10e2b2..d2b19ae 100644
--- a/po/fi.gmo
+++ b/po/fi.gmo
Binary files differ
diff --git a/po/fi.po b/po/fi.po
index c83e6df..eb2ff58 100644
--- a/po/fi.po
+++ b/po/fi.po
@@ -11,7 +11,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.13.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2009-08-12 22:13+0300\n"
 "Last-Translator: Tommi Vainikainen <Tommi.Vainikainen@iki.fi>\n"
 "Language-Team: Finnish <translation-team-fi@lists.sourceforge.net>\n"
diff --git a/po/fr.gmo b/po/fr.gmo
index 188e098..dbd6ad1 100644
--- a/po/fr.gmo
+++ b/po/fr.gmo
Binary files differ
diff --git a/po/fr.po b/po/fr.po
index cbb1474..d041434 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.4.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2015-04-26 19:24+0200\n"
 "Last-Translator: Stéphane Aulery <lkppo@free.fr>\n"
 "Language-Team: French <traduc@traduc.org>\n"
diff --git a/po/gl.gmo b/po/gl.gmo
index 51b94aa..76fc086 100644
--- a/po/gl.gmo
+++ b/po/gl.gmo
Binary files differ
diff --git a/po/gl.po b/po/gl.po
index 4ad0602..b6e1cf6 100644
--- a/po/gl.po
+++ b/po/gl.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.21.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2011-09-05 12:50+0200\n"
 "Last-Translator: Fran Dieguez <frandieguez@ubuntu.com>\n"
 "Language-Team: Galician <proxecto@trasno.net>\n"
diff --git a/po/gst-plugins-bad-1.0.pot b/po/gst-plugins-bad-1.0.pot
index ba9629a..48b7ad4 100644
--- a/po/gst-plugins-bad-1.0.pot
+++ b/po/gst-plugins-bad-1.0.pot
@@ -5,9 +5,9 @@
 #, fuzzy
 msgid ""
 msgstr ""
-"Project-Id-Version: gst-plugins-bad 1.6.2\n"
+"Project-Id-Version: gst-plugins-bad 1.7.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
 "Language-Team: LANGUAGE <LL@li.org>\n"
@@ -16,7 +16,7 @@
 "Content-Type: text/plain; charset=CHARSET\n"
 "Content-Transfer-Encoding: 8bit\n"
 
-#: ext/gl/gstgltestsrc.c:673
+#: ext/gl/gstgltestsrc.c:680
 msgid "format wasn't negotiated before get function"
 msgstr ""
 
@@ -137,7 +137,7 @@
 msgid "Describes the selected visualization element."
 msgstr ""
 
-#: ext/opencv/gsttemplatematch.c:442
+#: ext/opencv/gsttemplatematch.cpp:188
 msgid "OpenCV failed to load template image"
 msgstr ""
 
@@ -154,18 +154,18 @@
 msgid "Failed to set PGC based seeking."
 msgstr ""
 
-#: ext/resindvd/resindvdsrc.c:1166
+#: ext/resindvd/resindvdsrc.c:1165
 msgid ""
 "Could not read DVD. This may be because the DVD is encrypted and a DVD "
 "decryption library is not installed."
 msgstr ""
 
-#: ext/resindvd/resindvdsrc.c:1171 ext/resindvd/resindvdsrc.c:1180
+#: ext/resindvd/resindvdsrc.c:1170 ext/resindvd/resindvdsrc.c:1179
 msgid "Could not read DVD."
 msgstr ""
 
-#: ext/smoothstreaming/gstmssdemux.c:381
-#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:525
+#: ext/smoothstreaming/gstmssdemux.c:403
+#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:619
 msgid "This file contains no playable streams."
 msgstr ""
 
@@ -215,18 +215,18 @@
 msgid "Subpicture format was not configured before data flow"
 msgstr ""
 
-#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:2081
+#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:2531
 msgid "Failed to get fragment URL."
 msgstr ""
 
-#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:2282
-#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:2446
-#: gst/mpegtsdemux/mpegtsbase.c:1342 gst/mpegtsdemux/mpegtsbase.c:1346
+#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:2761
+#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:2955
+#: gst/mpegtsdemux/mpegtsbase.c:1371 gst/mpegtsdemux/mpegtsbase.c:1375
 #: gst/nuvdemux/gstnuvdemux.c:736
 msgid "Internal data stream error."
 msgstr ""
 
-#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:2383
+#: gst-libs/gst/adaptivedemux/gstadaptivedemux.c:2873
 msgid "Couldn't download fragments"
 msgstr ""
 
@@ -269,20 +269,20 @@
 msgid "Could not open file \"%s\" for reading."
 msgstr ""
 
-#: sys/dvb/parsechannels.c:168
+#: sys/dvb/parsechannels.c:165
 msgid "Couldn't find DVB channel configuration file"
 msgstr ""
 
-#: sys/dvb/parsechannels.c:171
+#: sys/dvb/parsechannels.c:168
 #, c-format
 msgid "Couldn't load DVB channel configuration file: %s"
 msgstr ""
 
-#: sys/dvb/parsechannels.c:180
+#: sys/dvb/parsechannels.c:175
 msgid "DVB channel configuration file doesn't contain any channels"
 msgstr ""
 
-#: sys/dvb/parsechannels.c:456
+#: sys/dvb/parsechannels.c:449
 #, c-format
 msgid "Couldn't find details for DVB channel %s"
 msgstr ""
diff --git a/po/hr.gmo b/po/hr.gmo
index a145c2e..9f4cf77 100644
--- a/po/hr.gmo
+++ b/po/hr.gmo
Binary files differ
diff --git a/po/hr.po b/po/hr.po
index 4d16999..6526564 100644
--- a/po/hr.po
+++ b/po/hr.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.21.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2012-04-16 02:06+0200\n"
 "Last-Translator: Tomislav Krznar <tomislav.krznar@gmail.com>\n"
 "Language-Team: Croatian <lokalizacija@linux.hr>\n"
diff --git a/po/hu.gmo b/po/hu.gmo
index 362760f..e8c1730 100644
--- a/po/hu.gmo
+++ b/po/hu.gmo
Binary files differ
diff --git a/po/hu.po b/po/hu.po
index 927f1be..bea72b9 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2015-11-20 23:46+0100\n"
 "Last-Translator: Balázs Úr <urbalazs@gmail.com>\n"
 "Language-Team: Hungarian <translation-team-hu@lists.sourceforge.net>\n"
diff --git a/po/id.gmo b/po/id.gmo
index 4bce531..bb3fbc1 100644
--- a/po/id.gmo
+++ b/po/id.gmo
Binary files differ
diff --git a/po/id.po b/po/id.po
index ad4bd09..6c99ddb 100644
--- a/po/id.po
+++ b/po/id.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.3.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2014-05-31 22:16+0700\n"
 "Last-Translator: Andhika Padmawan <andhika.padmawan@gmail.com>\n"
 "Language-Team: Indonesian <translation-team-id@lists.sourceforge.net>\n"
diff --git a/po/it.gmo b/po/it.gmo
index a152658..9530649 100644
--- a/po/it.gmo
+++ b/po/it.gmo
Binary files differ
diff --git a/po/it.po b/po/it.po
index 656c29b..8e0efd2 100644
--- a/po/it.po
+++ b/po/it.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.13.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2009-08-14 00:12+0200\n"
 "Last-Translator: Luca Ferretti <elle.uca@infinito.it>\n"
 "Language-Team: Italian <tp@lists.linux.it>\n"
diff --git a/po/ja.gmo b/po/ja.gmo
index e70608b..7bec83b 100644
--- a/po/ja.gmo
+++ b/po/ja.gmo
Binary files differ
diff --git a/po/ja.po b/po/ja.po
index 7b7912d..8eb9643 100644
--- a/po/ja.po
+++ b/po/ja.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.21.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2011-04-26 19:38+0900\n"
 "Last-Translator: Makoto Kato <makoto.kt@gmail.com>\n"
 "Language-Team: Japanese <translation-team-ja@lists.sourceforge.net>\n"
diff --git a/po/ky.gmo b/po/ky.gmo
index 83cc7cb..26103e3 100644
--- a/po/ky.gmo
+++ b/po/ky.gmo
Binary files differ
diff --git a/po/ky.po b/po/ky.po
index b6aaa7f..980cec0 100644
--- a/po/ky.po
+++ b/po/ky.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.5\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2007-11-13 17:16+0600\n"
 "Last-Translator: Ilyas Bakirov <just_ilyas@yahoo.com>\n"
 "Language-Team: Kirghiz <i18n-team-ky-kyrgyz@lists.sourceforge.net>\n"
diff --git a/po/lt.gmo b/po/lt.gmo
index 47ddcc6..ac49d8d 100644
--- a/po/lt.gmo
+++ b/po/lt.gmo
Binary files differ
diff --git a/po/lt.po b/po/lt.po
index 3418ded..c745c81 100644
--- a/po/lt.po
+++ b/po/lt.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad-0.10.6.3\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2008-05-14 02:13+0300\n"
 "Last-Translator: Gintautas Miliauskas <gintas@akl.lt>\n"
 "Language-Team: Lithuanian <komp_lt@konferencijos.lt>\n"
diff --git a/po/lv.gmo b/po/lv.gmo
index 67793fb..a1c82eb 100644
--- a/po/lv.gmo
+++ b/po/lv.gmo
Binary files differ
diff --git a/po/lv.po b/po/lv.po
index 62213b1..d84f5df 100644
--- a/po/lv.po
+++ b/po/lv.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.2.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2014-04-20 15:52+0300\n"
 "Last-Translator: Rihards Prieditis <rprieditis@gmail.com>\n"
 "Language-Team: Latvian <translation-team-lv@lists.sourceforge.net>\n"
diff --git a/po/mt.gmo b/po/mt.gmo
index 279a135..9b1b4b1 100644
--- a/po/mt.gmo
+++ b/po/mt.gmo
Binary files differ
diff --git a/po/mt.po b/po/mt.po
index c4722c2..963e919 100644
--- a/po/mt.po
+++ b/po/mt.po
@@ -5,7 +5,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad-0.10.8.3\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2008-10-26 20:27+0100\n"
 "Last-Translator: Michel Bugeja <michelbugeja@rabatmalta.com>\n"
 "Language-Team: Maltese <translation-team-mt@lists.sourceforge.net>\n"
diff --git a/po/nb.gmo b/po/nb.gmo
index ef0b049..8fe2d8d 100644
--- a/po/nb.gmo
+++ b/po/nb.gmo
Binary files differ
diff --git a/po/nb.po b/po/nb.po
index 996e01d..34fcae3 100644
--- a/po/nb.po
+++ b/po/nb.po
@@ -6,17 +6,17 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: gst-plugins-bad 1.5.1\n"
+"Project-Id-Version: gst-plugins-bad 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
-"PO-Revision-Date: 2015-07-11 01:15+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
+"PO-Revision-Date: 2015-12-22 21:08+0100\n"
 "Last-Translator: Johnny A. Solbu <johnny@solbu.net>\n"
 "Language-Team: Norwegian Bokmaal <i18n-nb@lister.ping.uio.no>\n"
 "Language: nb_NO\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 1.5.7\n"
+"X-Generator: Poedit 1.6.9\n"
 
 msgid "format wasn't negotiated before get function"
 msgstr "formatet ble ikke forhandlet før get-funksjon"
@@ -181,9 +181,8 @@
 msgstr ""
 "Filplassering er satt til NULL, vennligst sett den til et gyldig filnavn"
 
-#, fuzzy
 msgid "Digitalzoom element couldn't be created"
-msgstr "Digitalzoom element kunne ikke opprettes"
+msgstr "Digitalzoom-element kunne ikke opprettes"
 
 msgid "Subpicture format was not configured before data flow"
 msgstr "Underbildeformat er ikke konfigurert før dataflyt"
diff --git a/po/nl.gmo b/po/nl.gmo
index e45eee3..1819eb4 100644
--- a/po/nl.gmo
+++ b/po/nl.gmo
Binary files differ
diff --git a/po/nl.po b/po/nl.po
index 48f08bf..3542833 100644
--- a/po/nl.po
+++ b/po/nl.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2015-10-17 12:35+0200\n"
 "Last-Translator: Freek de Kruijf <f.de.kruijf@gmail.com>\n"
 "Language-Team: Dutch <vertaling@vrijschrift.org>\n"
diff --git a/po/or.gmo b/po/or.gmo
index d2e0b99..462c25a 100644
--- a/po/or.gmo
+++ b/po/or.gmo
Binary files differ
diff --git a/po/or.po b/po/or.po
index 9390d53..57025b6 100644
--- a/po/or.po
+++ b/po/or.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-0.8.3\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2004-09-27 13:32+0530\n"
 "Last-Translator: Gora Mohanty <gora_mohanty@yahoo.co.in>\n"
 "Language-Team: Oriya <gora_mohanty@yahoo.co.in>\n"
diff --git a/po/pl.gmo b/po/pl.gmo
index 8b7cd45..97f6848 100644
--- a/po/pl.gmo
+++ b/po/pl.gmo
Binary files differ
diff --git a/po/pl.po b/po/pl.po
index 40b5963..87f3a71 100644
--- a/po/pl.po
+++ b/po/pl.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2015-10-15 20:50+0200\n"
 "Last-Translator: Jakub Bogusz <qboosh@pld-linux.org>\n"
 "Language-Team: Polish <translation-team-pl@lists.sourceforge.net>\n"
diff --git a/po/pt_BR.gmo b/po/pt_BR.gmo
index 6af5be1..301e4c3 100644
--- a/po/pt_BR.gmo
+++ b/po/pt_BR.gmo
Binary files differ
diff --git a/po/pt_BR.po b/po/pt_BR.po
index bd9abd4..a3d9a46 100644
--- a/po/pt_BR.po
+++ b/po/pt_BR.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad-1.4.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2015-02-01 18:24-0200\n"
 "Last-Translator: Fabrício Godoy <skarllot@gmail.com>\n"
 "Language-Team: Brazilian Portuguese <ldpbr-translation@lists.sourceforge."
diff --git a/po/ro.gmo b/po/ro.gmo
index b26d021..6e65672 100644
--- a/po/ro.gmo
+++ b/po/ro.gmo
Binary files differ
diff --git a/po/ro.po b/po/ro.po
index ae06561..d415301 100644
--- a/po/ro.po
+++ b/po/ro.po
@@ -5,7 +5,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.18.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2010-08-16 03:11+0300\n"
 "Last-Translator: Lucian Adrian Grijincu <lucian.grijincu@gmail.com>\n"
 "Language-Team: Romanian <translation-team-ro@lists.sourceforge.net>\n"
diff --git a/po/ru.gmo b/po/ru.gmo
index dac02d5..0e19c79 100644
--- a/po/ru.gmo
+++ b/po/ru.gmo
Binary files differ
diff --git a/po/ru.po b/po/ru.po
index afb2763..d77accc 100644
--- a/po/ru.po
+++ b/po/ru.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2015-10-18 13:40+0300\n"
 "Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n"
 "Language-Team: Russian <gnu@d07.ru>\n"
diff --git a/po/sk.gmo b/po/sk.gmo
index 0480cf7..a0bc36d 100644
--- a/po/sk.gmo
+++ b/po/sk.gmo
Binary files differ
diff --git a/po/sk.po b/po/sk.po
index c523206..301fc17 100644
--- a/po/sk.po
+++ b/po/sk.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.2.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2014-01-30 10:44+0100\n"
 "Last-Translator: Peter Tuharsky <tuharsky@misbb.sk>\n"
 "Language-Team: Slovak <sk-i18n@lists.linux.sk>\n"
diff --git a/po/sl.gmo b/po/sl.gmo
index d6ccdbc..3e47b59 100644
--- a/po/sl.gmo
+++ b/po/sl.gmo
Binary files differ
diff --git a/po/sl.po b/po/sl.po
index 2c7810b..6a28bca 100644
--- a/po/sl.po
+++ b/po/sl.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.21.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2011-04-26 15:21+0100\n"
 "Last-Translator: Klemen Košir <klemen.kosir@gmx.com>\n"
 "Language-Team: Slovenian <translation-team-sl@lists.sourceforge.net>\n"
diff --git a/po/sq.gmo b/po/sq.gmo
index 5bf2b72..3827420 100644
--- a/po/sq.gmo
+++ b/po/sq.gmo
Binary files differ
diff --git a/po/sq.po b/po/sq.po
index 5a4005b..fc72a64 100644
--- a/po/sq.po
+++ b/po/sq.po
@@ -6,7 +6,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 0.10.7.2\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2008-08-15 16:07+0200\n"
 "Last-Translator: Laurent Dhima <laurenti@alblinux.net>\n"
 "Language-Team: Albanian <translation-team-sq@lists.sourceforge.net>\n"
diff --git a/po/sr.gmo b/po/sr.gmo
index a37aae6..857bae4 100644
--- a/po/sr.gmo
+++ b/po/sr.gmo
Binary files differ
diff --git a/po/sr.po b/po/sr.po
index 8cd564d..c27706d 100644
--- a/po/sr.po
+++ b/po/sr.po
@@ -2,13 +2,13 @@
 # Copyright (C) 2014 Free Software Foundation, Inc.
 # This file is distributed under the same license as the gst-plugins-bad package.
 # Danilo Segan <dsegan@gmx.net>, 2004.
-# Мирослав Николић <miroslavnikolic@rocketmail.com>, 2011—2014.
+# Мирослав Николић <miroslavnikolic@rocketmail.com>, 2011—2015.
 msgid ""
 msgstr ""
-"Project-Id-Version: gst-plugins-bad-1.4.1\n"
+"Project-Id-Version: gst-plugins-bad-1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
-"PO-Revision-Date: 2014-09-13 10:39+0200\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
+"PO-Revision-Date: 2015-12-24 11:34+0200\n"
 "Last-Translator: Мирослав Николић <miroslavnikolic@rocketmail.com>\n"
 "Language-Team: Serbian <(nothing)>\n"
 "Language: sr\n"
@@ -24,7 +24,6 @@
 msgid "default GStreamer sound events audiosink"
 msgstr "основни аудио усклађивач звучних догађаја Гстримера"
 
-#, fuzzy
 msgid ""
 "GStreamer can play audio using any number of output elements. Some possible "
 "choices are osssink, pulsesink and alsasink. The audiosink can be a partial "
@@ -129,7 +128,7 @@
 msgstr "Описује изабрани елемент приказивања."
 
 msgid "OpenCV failed to load template image"
-msgstr ""
+msgstr "ОтворениЦВ није успео да учита слику шаблона"
 
 msgid "Could not read title information for DVD."
 msgstr "Не могу да прочитам информације о наслову ДВД-а."
@@ -184,7 +183,7 @@
 "Место датотеке је подешено на НИШТА, подесите га на исправан назив датотеке"
 
 msgid "Digitalzoom element couldn't be created"
-msgstr ""
+msgstr "Елемент дигиталног зума не може бити направљен"
 
 msgid "Subpicture format was not configured before data flow"
 msgstr "Запис подслике није подешен пре протока података"
diff --git a/po/sv.gmo b/po/sv.gmo
index 3aa24d1..e898dff 100644
--- a/po/sv.gmo
+++ b/po/sv.gmo
Binary files differ
diff --git a/po/sv.po b/po/sv.po
index 2fc9b39..50eb41b 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2015-11-01 00:48+0100\n"
 "Last-Translator: Sebastian Rasmussen <sebras@gmail.com>\n"
 "Language-Team: Swedish <tp-sv@listor.tp-sv.se>\n"
diff --git a/po/tr.gmo b/po/tr.gmo
index 970c302..ef7dec7 100644
--- a/po/tr.gmo
+++ b/po/tr.gmo
Binary files differ
diff --git a/po/tr.po b/po/tr.po
index 7701928..2a9582d 100644
--- a/po/tr.po
+++ b/po/tr.po
@@ -7,7 +7,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad-1.4.1\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2015-01-10 21:07+0100\n"
 "Last-Translator: Volkan Gezer <volkangezer@gmail.com>\n"
 "Language-Team: Turkish <gnu-tr-u12a@lists.sourceforge.net>\n"
diff --git a/po/uk.gmo b/po/uk.gmo
index 751ccf8..80a0132 100644
--- a/po/uk.gmo
+++ b/po/uk.gmo
Binary files differ
diff --git a/po/uk.po b/po/uk.po
index 6ad36e4..bf12352 100644
--- a/po/uk.po
+++ b/po/uk.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2015-10-15 20:44+0300\n"
 "Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
 "Language-Team: Ukrainian <translation-team-uk@lists.sourceforge.net>\n"
diff --git a/po/vi.gmo b/po/vi.gmo
index da41cd5..8ee969e 100644
--- a/po/vi.gmo
+++ b/po/vi.gmo
Binary files differ
diff --git a/po/vi.po b/po/vi.po
index c7f305e..259fc0a 100644
--- a/po/vi.po
+++ b/po/vi.po
@@ -8,7 +8,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2015-10-16 08:27+0700\n"
 "Last-Translator: Trần Ngọc Quân <vnwildman@gmail.com>\n"
 "Language-Team: Vietnamese <translation-team-vi@lists.sourceforge.net>\n"
diff --git a/po/zh_CN.gmo b/po/zh_CN.gmo
index 916983b..89c6a1d 100644
--- a/po/zh_CN.gmo
+++ b/po/zh_CN.gmo
Binary files differ
diff --git a/po/zh_CN.po b/po/zh_CN.po
index 8b6b6d8..73a0da0 100644
--- a/po/zh_CN.po
+++ b/po/zh_CN.po
@@ -9,7 +9,7 @@
 msgstr ""
 "Project-Id-Version: gst-plugins-bad 1.6.0\n"
 "Report-Msgid-Bugs-To: http://bugzilla.gnome.org/\n"
-"POT-Creation-Date: 2015-12-14 19:23+0100\n"
+"POT-Creation-Date: 2015-12-24 13:55+0100\n"
 "PO-Revision-Date: 2015-10-16 19:27+0800\n"
 "Last-Translator: Tianze Wang <zwpwjwtz@126.com>\n"
 "Language-Team: Chinese (simplified) <i18n-zh@googlegroups.com>\n"
diff --git a/sys/Makefile.am b/sys/Makefile.am
index 1051ce5..a0d7ca6 100644
--- a/sys/Makefile.am
+++ b/sys/Makefile.am
@@ -142,9 +142,16 @@
 UVCH264_DIR=
 endif
 
-SUBDIRS = $(ACM_DIR) $(ANDROID_MEDIA_DIR) $(APPLE_MEDIA_DIR) $(AVC_DIR) $(BLUEZ_DIR) $(D3DVIDEOSINK_DIR) $(DECKLINK_DIR) $(DIRECTSOUND_DIR) $(WINKS_DIR) $(DVB_DIR) $(FBDEV_DIR) $(LINSYS_DIR) $(OPENSLES_DIR) $(PVR_DIR) $(SHM_DIR) $(UVCH264_DIR) $(VCD_DIR) $(VDPAU_DIR) $(WININET_DIR) $(WINSCREENCAP_DIR) $(WASAPI_DIR)
+if USE_NVENC
+NVENC_DIR=nvenc
+else
+NVENC_DIR=
+endif
+
+SUBDIRS = $(ACM_DIR) $(ANDROID_MEDIA_DIR) $(APPLE_MEDIA_DIR) $(AVC_DIR) $(BLUEZ_DIR) $(D3DVIDEOSINK_DIR) $(DECKLINK_DIR) $(DIRECTSOUND_DIR) $(WINKS_DIR) $(DVB_DIR) $(FBDEV_DIR) $(LINSYS_DIR) $(OPENSLES_DIR) $(PVR_DIR) $(SHM_DIR) $(UVCH264_DIR) $(VCD_DIR) $(VDPAU_DIR) $(WININET_DIR) $(WINSCREENCAP_DIR) $(WASAPI_DIR) $(NVENC_DIR)
 
 DIST_SUBDIRS = acmenc acmmp3dec androidmedia applemedia applemedia-nonpublic avc bluez d3dvideosink decklink directsound dvb linsys fbdev dshowdecwrapper dshowsrcwrapper dshowvideosink \
-		opensles pvr2d shm uvch264 vcd vdpau wasapi wininet winks winscreencap
+		opensles pvr2d shm uvch264 vcd vdpau wasapi wininet winks winscreencap \
+		nvenc
 
 include $(top_srcdir)/common/parallel-subdirs.mak
diff --git a/sys/Makefile.in b/sys/Makefile.in
index 4644fa7..a6e83b8 100644
--- a/sys/Makefile.in
+++ b/sys/Makefile.in
@@ -253,6 +253,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -290,6 +292,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -317,6 +321,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -335,6 +341,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -345,6 +353,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -370,6 +380,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -395,6 +407,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -526,6 +540,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -583,8 +599,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -654,6 +674,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -800,9 +821,12 @@
 @USE_WINSCREENCAP_TRUE@WINSCREENCAP_DIR = winscreencap
 @USE_UVCH264_FALSE@UVCH264_DIR = 
 @USE_UVCH264_TRUE@UVCH264_DIR = uvch264
-SUBDIRS = $(ACM_DIR) $(ANDROID_MEDIA_DIR) $(APPLE_MEDIA_DIR) $(AVC_DIR) $(BLUEZ_DIR) $(D3DVIDEOSINK_DIR) $(DECKLINK_DIR) $(DIRECTSOUND_DIR) $(WINKS_DIR) $(DVB_DIR) $(FBDEV_DIR) $(LINSYS_DIR) $(OPENSLES_DIR) $(PVR_DIR) $(SHM_DIR) $(UVCH264_DIR) $(VCD_DIR) $(VDPAU_DIR) $(WININET_DIR) $(WINSCREENCAP_DIR) $(WASAPI_DIR)
+@USE_NVENC_FALSE@NVENC_DIR = 
+@USE_NVENC_TRUE@NVENC_DIR = nvenc
+SUBDIRS = $(ACM_DIR) $(ANDROID_MEDIA_DIR) $(APPLE_MEDIA_DIR) $(AVC_DIR) $(BLUEZ_DIR) $(D3DVIDEOSINK_DIR) $(DECKLINK_DIR) $(DIRECTSOUND_DIR) $(WINKS_DIR) $(DVB_DIR) $(FBDEV_DIR) $(LINSYS_DIR) $(OPENSLES_DIR) $(PVR_DIR) $(SHM_DIR) $(UVCH264_DIR) $(VCD_DIR) $(VDPAU_DIR) $(WININET_DIR) $(WINSCREENCAP_DIR) $(WASAPI_DIR) $(NVENC_DIR)
 DIST_SUBDIRS = acmenc acmmp3dec androidmedia applemedia applemedia-nonpublic avc bluez d3dvideosink decklink directsound dvb linsys fbdev dshowdecwrapper dshowsrcwrapper dshowvideosink \
-		opensles pvr2d shm uvch264 vcd vdpau wasapi wininet winks winscreencap
+		opensles pvr2d shm uvch264 vcd vdpau wasapi wininet winks winscreencap \
+		nvenc
 
 all: all-recursive
 
diff --git a/sys/acmenc/Makefile.in b/sys/acmenc/Makefile.in
index 1fcf3e8..bb753fe 100644
--- a/sys/acmenc/Makefile.in
+++ b/sys/acmenc/Makefile.in
@@ -271,6 +271,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -308,6 +310,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -335,6 +339,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -353,6 +359,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -363,6 +371,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -388,6 +398,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -413,6 +425,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -544,6 +558,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -601,8 +617,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -672,6 +692,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/acmenc/acmenc.c b/sys/acmenc/acmenc.c
index 99a0804..601c937 100644
--- a/sys/acmenc/acmenc.c
+++ b/sys/acmenc/acmenc.c
@@ -50,7 +50,7 @@
 
 static GstStaticPadTemplate acmenc_sink_template =
 GST_STATIC_PAD_TEMPLATE ("sink",
-    GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw-int, "
+    GST_PAD_SINK, GST_PAD_ALWAYS, GST_STATIC_CAPS ("audio/x-raw, "
         "depth = (int)16, "
         "width = (int)16, "
         "endianness = (int)" G_STRINGIFY (G_BYTE_ORDER) ", "
@@ -106,7 +106,7 @@
 acmenc_caps_from_format (WAVEFORMATEX * fmt)
 {
   return gst_riff_create_audio_caps (fmt->wFormatTag, NULL,
-      (gst_riff_strf_auds *) fmt, NULL, NULL, NULL);
+      (gst_riff_strf_auds *) fmt, NULL, NULL, NULL, NULL);
 }
 
 static gboolean
@@ -261,10 +261,8 @@
     gst_caps_unref (enc->output_caps);
     enc->output_caps = NULL;
   }
-  if (enc->header.pbSrc)
-    g_free (enc->header.pbSrc);
-  if (enc->header.pbDst)
-    g_free (enc->header.pbDst);
+  g_free (enc->header.pbSrc);
+  g_free (enc->header.pbDst);
   memset (&enc->header, 0, sizeof (enc->header));
   if (enc->stream) {
     acmStreamClose (enc->stream, 0);
@@ -300,8 +298,18 @@
   GstFlowReturn ret = GST_FLOW_OK;
   if (enc->header.cbDstLengthUsed > 0) {
     GstBuffer *outbuf = gst_buffer_new_and_alloc (enc->header.cbDstLengthUsed);
-    memcpy (GST_BUFFER_DATA (outbuf), enc->header.pbDst,
-        enc->header.cbDstLengthUsed);
+    if (!outbuf) {
+      GST_WARNING_OBJECT (enc, "cannot allocate a new GstBuffer");
+      goto done_push_output;
+    }
+
+    if (gst_buffer_fill (outbuf, 0, enc->header.pbDst,
+            enc->header.cbDstLengthUsed) != enc->header.cbDstLengthUsed) {
+      gst_buffer_unref (outbuf);
+      GST_WARNING_OBJECT (enc, "unable to fill output buffer");
+      goto done_push_output;
+    }
+
     if (enc->outfmt->nAvgBytesPerSec > 0) {
 
       /* We have a bitrate, so we can create a timestamp, hopefully */
@@ -314,18 +322,24 @@
         enc->header.cbDstLengthUsed);
     ret = gst_pad_push (enc->srcpad, outbuf);
   }
+
+done_push_output:
   return ret;
 }
 
 static GstFlowReturn
-acmenc_chain (GstPad * pad, GstBuffer * buf)
+acmenc_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
 {
   MMRESULT res;
   ACMEnc *enc = (ACMEnc *) GST_PAD_PARENT (pad);
-  guchar *data = GST_BUFFER_DATA (buf);
-  gint len = GST_BUFFER_SIZE (buf);
+  GstMapInfo map;
+  guchar *data;
+  gint len;
   int chunklen;
   GstFlowReturn ret = GST_FLOW_OK;
+  gst_buffer_map (buf, &map, GST_MAP_READ);
+  len = map.size;
+  data = map.data;
   while (len) {
     chunklen = MIN (len, ACM_BUFFER_SIZE - enc->offset);
     memcpy (enc->header.pbSrc + enc->offset, data, chunklen);
@@ -358,6 +372,7 @@
     /* Write out any data produced */
     acmenc_push_output (enc);
   }
+  gst_buffer_unmap (buf, &map);
   return ret;
 }
 
@@ -383,11 +398,17 @@
 }
 
 static gboolean
-acmenc_sink_event (GstPad * pad, GstEvent * event)
+acmenc_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
 {
   ACMEnc *enc = (ACMEnc *) GST_PAD_PARENT (pad);
   gboolean res;
   switch (GST_EVENT_TYPE (event)) {
+    case GST_EVENT_CAPS:{
+      GstCaps *caps;
+      gst_event_parse_caps (event, &caps);
+      return acmenc_sink_setcaps (pad, caps);
+      break;
+    }
     case GST_EVENT_EOS:
       acmenc_finish_stream (enc);
       res = gst_pad_push_event (enc->srcpad, event);
@@ -411,8 +432,6 @@
 {
   enc->sinkpad =
       gst_pad_new_from_static_template (&acmenc_sink_template, "sink");
-  gst_pad_set_setcaps_function (enc->sinkpad,
-      GST_DEBUG_FUNCPTR (acmenc_sink_setcaps));
   gst_pad_set_chain_function (enc->sinkpad, GST_DEBUG_FUNCPTR (acmenc_chain));
   gst_pad_set_event_function (enc->sinkpad,
       GST_DEBUG_FUNCPTR (acmenc_sink_event));
@@ -453,6 +472,12 @@
 acmenc_class_init (ACMEncClass * klass)
 {
   GObjectClass *gobjectclass = (GObjectClass *) klass;
+  GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+  ACMEncParams *params;
+  ACMDRIVERDETAILS driverdetails;
+  gchar *shortname, *longname, *detail, *description;
+  MMRESULT res;
+
   parent_class = (GstElementClass *) g_type_class_peek_parent (klass);
   gobjectclass->dispose = acmenc_dispose;
   gobjectclass->set_property = acmenc_set_property;
@@ -460,15 +485,6 @@
   g_object_class_install_property (gobjectclass, ARG_BITRATE,
       g_param_spec_int ("bitrate", "Bitrate", "Bitrate to encode at (in bps)",
           0, 1000000, DEFAULT_BITRATE, G_PARAM_READWRITE));
-} static void
-
-acmenc_base_init (ACMEncClass * klass)
-{
-  GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
-  ACMEncParams *params;
-  ACMDRIVERDETAILS driverdetails;
-  gchar *shortname, *longname, *detail, *description;
-  MMRESULT res;
 
   gst_element_class_add_pad_template (element_class,
       gst_static_pad_template_get (&acmenc_sink_template));
@@ -547,7 +563,7 @@
   GType type;
   GTypeInfo typeinfo = {
     sizeof (ACMEncClass),
-    (GBaseInitFunc) acmenc_base_init, NULL,
+    NULL, NULL,
     (GClassInitFunc) acmenc_class_init, NULL, NULL, sizeof (ACMEnc),
     0, (GInstanceInitFunc) acmenc_init,
   };
diff --git a/sys/acmmp3dec/Makefile.in b/sys/acmmp3dec/Makefile.in
index ec4be54..125375f 100644
--- a/sys/acmmp3dec/Makefile.in
+++ b/sys/acmmp3dec/Makefile.in
@@ -271,6 +271,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -308,6 +310,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -335,6 +339,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -353,6 +359,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -363,6 +371,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -388,6 +398,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -413,6 +425,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -544,6 +558,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -601,8 +617,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -672,6 +692,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/acmmp3dec/acmmp3dec.c b/sys/acmmp3dec/acmmp3dec.c
index e6d34ba..a0b9c36 100644
--- a/sys/acmmp3dec/acmmp3dec.c
+++ b/sys/acmmp3dec/acmmp3dec.c
@@ -36,6 +36,12 @@
       (acmmp3dec_get_type())
 #define GST_ACM_MP3_DEC(obj) \
       (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_ACM_MP3_DEC,ACMMP3Dec))
+#define GST_ACM_MP3_DEC_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_ACM_MP3_DEC,ACMMP3DecClass))
+#define GST_IS_ACM_MP3_DEC(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_ACM_MP3_DEC))
+#define GST_IS_ACM_MP3_DEC_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_ACM_MP3_DEC))
 
 #define GST_CAT_DEFAULT acmmp3dec_debug
 GST_DEBUG_CATEGORY_STATIC (acmmp3dec_debug);
@@ -44,7 +50,7 @@
 GST_STATIC_PAD_TEMPLATE ("src",
     GST_PAD_SRC,
     GST_PAD_ALWAYS,
-    GST_STATIC_CAPS ("audio/x-raw-int, "
+    GST_STATIC_CAPS ("audio/x-raw, "
         "depth = (int)16, "
         "width = (int)16, "
         "endianness = (int)" G_STRINGIFY (G_BYTE_ORDER) ", "
@@ -96,13 +102,14 @@
 
 GType acmmp3dec_get_type (void);
 
-GST_BOILERPLATE (ACMMP3Dec, acmmp3dec, GstElement, GST_TYPE_ELEMENT);
+#define acmmp3dec_parent_class parent_class
+G_DEFINE_TYPE (ACMMP3Dec, acmmp3dec, GST_TYPE_ELEMENT);
 
 static GstCaps *
 acmmp3dec_caps_from_format (WAVEFORMATEX * fmt)
 {
   return gst_riff_create_audio_caps (fmt->wFormatTag,
-      NULL, (gst_riff_strf_auds *) fmt, NULL, NULL, NULL);
+      NULL, (gst_riff_strf_auds *) fmt, NULL, NULL, NULL, NULL);
 }
 
 static gboolean
@@ -201,10 +208,8 @@
 
   if (dec->header.fdwStatus & ACMSTREAMHEADER_STATUSF_PREPARED)
     acmStreamUnprepareHeader (dec->stream, &dec->header, 0);
-  if (dec->header.pbSrc)
-    g_free (dec->header.pbSrc);
-  if (dec->header.pbDst)
-    g_free (dec->header.pbDst);
+  g_free (dec->header.pbSrc);
+  g_free (dec->header.pbDst);
   memset (&dec->header, 0, sizeof (dec->header));
 
   if (dec->stream) {
@@ -241,21 +246,28 @@
 
   if (dec->header.cbDstLengthUsed > 0) {
     GstBuffer *outbuf = gst_buffer_new_and_alloc (dec->header.cbDstLengthUsed);
-    memcpy (GST_BUFFER_DATA (outbuf), dec->header.pbDst,
-        dec->header.cbDstLengthUsed);
+    if (!outbuf) {
+      GST_WARNING_OBJECT (dec, "cannot allocate a new GstBuffer");
+      goto done_push_output;
+    }
+
+    if (gst_buffer_fill (outbuf, 0, dec->header.pbDst,
+            dec->header.cbDstLengthUsed) != dec->header.cbDstLengthUsed) {
+      gst_buffer_unref (outbuf);
+      GST_WARNING_OBJECT (dec, "unable to fill output buffer");
+      goto done_push_output;
+    }
 
     if (dec->timestamp != GST_CLOCK_TIME_NONE)
       GST_BUFFER_TIMESTAMP (outbuf) = dec->timestamp;
     GST_BUFFER_DURATION (outbuf) =
-        gst_util_uint64_scale_int (GST_BUFFER_SIZE (outbuf), GST_SECOND,
+        gst_util_uint64_scale_int (dec->header.cbDstLengthUsed, GST_SECOND,
         dec->rate * dec->channels * 2);
 
     GST_DEBUG_OBJECT (dec, "decoded buffer has ts %d, duration %d",
         (int) (GST_BUFFER_TIMESTAMP (outbuf)),
         (int) (GST_BUFFER_DURATION (outbuf)));
 
-    gst_buffer_set_caps (outbuf, dec->output_caps);
-
     if (dec->timestamp != GST_CLOCK_TIME_NONE)
       dec->timestamp += GST_BUFFER_DURATION (outbuf);
 
@@ -265,20 +277,21 @@
   } else
     GST_DEBUG_OBJECT (dec, "Not pushing decoded buffer, no output");
 
-
+done_push_output:
   return ret;
 }
 
 static GstFlowReturn
-acmmp3dec_chain (GstPad * pad, GstBuffer * buf)
+acmmp3dec_chain (GstPad * pad, GstObject * parent, GstBuffer * buf)
 {
   MMRESULT res;
   ACMMP3Dec *dec = (ACMMP3Dec *) GST_PAD_PARENT (pad);
-  guchar *data = GST_BUFFER_DATA (buf);
-  gint len = GST_BUFFER_SIZE (buf);
+  GstMapInfo map;
   GstFlowReturn ret = GST_FLOW_OK;
 
-  if (len > ACM_BUFFER_SIZE) {
+  gst_buffer_map (buf, &map, GST_MAP_READ);
+
+  if (map.size > ACM_BUFFER_SIZE) {
     GST_WARNING_OBJECT (dec, "Impossibly large mp3 frame!");
     ret = GST_FLOW_ERROR;
     goto done;
@@ -290,8 +303,8 @@
     dec->timestamp = GST_BUFFER_TIMESTAMP (buf);
   }
 
-  memcpy (dec->header.pbSrc, data, len);
-  dec->header.cbSrcLength = len;
+  memcpy (dec->header.pbSrc, map.data, map.size);
+  dec->header.cbSrcLength = map.size;
 
   /* Now we have a buffer ready to go */
   res = acmStreamConvert (dec->stream, &dec->header,
@@ -316,6 +329,7 @@
   }
 
 done:
+  gst_buffer_unmap (buf, &map);
   gst_buffer_unref (buf);
 
   return ret;
@@ -342,11 +356,17 @@
 }
 
 static gboolean
-acmmp3dec_sink_event (GstPad * pad, GstEvent * event)
+acmmp3dec_sink_event (GstPad * pad, GstObject * parent, GstEvent * event)
 {
   ACMMP3Dec *dec = (ACMMP3Dec *) GST_PAD_PARENT (pad);
 
   switch (GST_EVENT_TYPE (event)) {
+    case GST_EVENT_CAPS:{
+      GstCaps *caps;
+      gst_event_parse_caps (event, &caps);
+      return acmmp3dec_sink_setcaps (pad, caps);
+      break;
+    }
     case GST_EVENT_EOS:
       acmmp3dec_finish_stream (dec);
       break;
@@ -375,12 +395,10 @@
 }
 
 static void
-acmmp3dec_init (ACMMP3Dec * dec, ACMMP3DecClass * decclass)
+acmmp3dec_init (ACMMP3Dec * dec)
 {
   dec->sinkpad =
       gst_pad_new_from_static_template (&acmmp3dec_sink_template, "sink");
-  gst_pad_set_setcaps_function (dec->sinkpad,
-      GST_DEBUG_FUNCPTR (acmmp3dec_sink_setcaps));
   gst_pad_set_chain_function (dec->sinkpad,
       GST_DEBUG_FUNCPTR (acmmp3dec_chain));
   gst_pad_set_event_function (dec->sinkpad,
@@ -397,13 +415,8 @@
 acmmp3dec_class_init (ACMMP3DecClass * klass)
 {
   GObjectClass *gobjectclass = (GObjectClass *) klass;
-  gobjectclass->dispose = acmmp3dec_dispose;
-}
-
-static void
-acmmp3dec_base_init (gpointer klass)
-{
   GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+  gobjectclass->dispose = acmmp3dec_dispose;
 
   gst_element_class_add_pad_template (element_class,
       gst_static_pad_template_get (&acmmp3dec_sink_template));
diff --git a/sys/androidmedia/Makefile.am b/sys/androidmedia/Makefile.am
index 5fcfb8f..a04b0ad 100644
--- a/sys/androidmedia/Makefile.am
+++ b/sys/androidmedia/Makefile.am
@@ -5,6 +5,8 @@
 	gstamcaudiodec.c \
 	gstamcvideodec.c \
 	gstamcvideoenc.c \
+	gstamcsurface.c \
+	gstamcsurfacetexture.c \
 	gstjniutils.c
 
 noinst_HEADERS = \
@@ -13,14 +15,19 @@
 	gstamcaudiodec.h \
 	gstamcvideodec.h \
 	gstamcvideoenc.h \
+	gstamcsurface.h \
+	gstamcsurfacetexture.h \
 	gstjniutils.h
 
 libgstandroidmedia_la_CFLAGS = \
+	-I$(top_srcdir)/gst-libs \
+	-I$(top_builddir)/gst-libs \
 	$(GST_PLUGINS_BASE_CFLAGS) \
 	$(GST_BASE_CFLAGS) \
 	$(GST_CFLAGS) \
 	$(ORC_CFLAGS)
 libgstandroidmedia_la_LIBADD = \
+	$(top_builddir)/gst-libs/gst/gl/libgstgl-$(GST_API_VERSION).la \
 	$(GST_PLUGINS_BASE_LIBS) \
 	-lgstaudio-@GST_API_VERSION@ \
 	-lgstpbutils-@GST_API_VERSION@ \
@@ -30,3 +37,6 @@
 	$(ORC_LIBS)
 libgstandroidmedia_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
 libgstandroidmedia_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
+
+androidmedia_java_classesdir = $(datadir)/gst-android/ndk-build/androidmedia/
+androidmedia_java_classes_DATA = org/freedesktop/gstreamer/androidmedia/GstAmcOnFrameAvailableListener.java
diff --git a/sys/androidmedia/Makefile.in b/sys/androidmedia/Makefile.in
index cad7484..898b742 100644
--- a/sys/androidmedia/Makefile.in
+++ b/sys/androidmedia/Makefile.in
@@ -15,6 +15,7 @@
 @SET_MAKE@
 
 
+
 VPATH = @srcdir@
 am__is_gnu_make = { \
   if test -z '$(MAKELEVEL)'; then \
@@ -161,16 +162,19 @@
     || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
          $(am__cd) "$$dir" && rm -f $$files; }; \
   }
-am__installdirs = "$(DESTDIR)$(plugindir)"
+am__installdirs = "$(DESTDIR)$(plugindir)" \
+	"$(DESTDIR)$(androidmedia_java_classesdir)"
 LTLIBRARIES = $(plugin_LTLIBRARIES)
 am__DEPENDENCIES_1 =
-libgstandroidmedia_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+libgstandroidmedia_la_DEPENDENCIES = $(top_builddir)/gst-libs/gst/gl/libgstgl-$(GST_API_VERSION).la \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1)
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
 am_libgstandroidmedia_la_OBJECTS = libgstandroidmedia_la-gstamc.lo \
 	libgstandroidmedia_la-gstamcaudiodec.lo \
 	libgstandroidmedia_la-gstamcvideodec.lo \
 	libgstandroidmedia_la-gstamcvideoenc.lo \
+	libgstandroidmedia_la-gstamcsurface.lo \
+	libgstandroidmedia_la-gstamcsurfacetexture.lo \
 	libgstandroidmedia_la-gstjniutils.lo
 libgstandroidmedia_la_OBJECTS = $(am_libgstandroidmedia_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
@@ -222,6 +226,7 @@
     n|no|NO) false;; \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
+DATA = $(androidmedia_java_classes_DATA)
 HEADERS = $(noinst_HEADERS)
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 # Read a list of newline-separated strings from the standard input,
@@ -279,6 +284,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -316,6 +323,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -343,6 +352,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -361,6 +372,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -371,6 +384,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -396,6 +411,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -421,6 +438,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -552,6 +571,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -609,8 +630,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -680,6 +705,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -772,6 +798,8 @@
 	gstamcaudiodec.c \
 	gstamcvideodec.c \
 	gstamcvideoenc.c \
+	gstamcsurface.c \
+	gstamcsurfacetexture.c \
 	gstjniutils.c
 
 noinst_HEADERS = \
@@ -780,15 +808,20 @@
 	gstamcaudiodec.h \
 	gstamcvideodec.h \
 	gstamcvideoenc.h \
+	gstamcsurface.h \
+	gstamcsurfacetexture.h \
 	gstjniutils.h
 
 libgstandroidmedia_la_CFLAGS = \
+	-I$(top_srcdir)/gst-libs \
+	-I$(top_builddir)/gst-libs \
 	$(GST_PLUGINS_BASE_CFLAGS) \
 	$(GST_BASE_CFLAGS) \
 	$(GST_CFLAGS) \
 	$(ORC_CFLAGS)
 
 libgstandroidmedia_la_LIBADD = \
+	$(top_builddir)/gst-libs/gst/gl/libgstgl-$(GST_API_VERSION).la \
 	$(GST_PLUGINS_BASE_LIBS) \
 	-lgstaudio-@GST_API_VERSION@ \
 	-lgstpbutils-@GST_API_VERSION@ \
@@ -799,6 +832,8 @@
 
 libgstandroidmedia_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
 libgstandroidmedia_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
+androidmedia_java_classesdir = $(datadir)/gst-android/ndk-build/androidmedia/
+androidmedia_java_classes_DATA = org/freedesktop/gstreamer/androidmedia/GstAmcOnFrameAvailableListener.java
 all: all-am
 
 .SUFFIXES:
@@ -879,6 +914,8 @@
 
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstandroidmedia_la-gstamc.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstandroidmedia_la-gstamcaudiodec.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstandroidmedia_la-gstamcsurface.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstandroidmedia_la-gstamcsurfacetexture.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstandroidmedia_la-gstamcvideodec.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstandroidmedia_la-gstamcvideoenc.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstandroidmedia_la-gstjniutils.Plo@am__quote@
@@ -935,6 +972,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstandroidmedia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstandroidmedia_la_CFLAGS) $(CFLAGS) -c -o libgstandroidmedia_la-gstamcvideoenc.lo `test -f 'gstamcvideoenc.c' || echo '$(srcdir)/'`gstamcvideoenc.c
 
+libgstandroidmedia_la-gstamcsurface.lo: gstamcsurface.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstandroidmedia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstandroidmedia_la_CFLAGS) $(CFLAGS) -MT libgstandroidmedia_la-gstamcsurface.lo -MD -MP -MF $(DEPDIR)/libgstandroidmedia_la-gstamcsurface.Tpo -c -o libgstandroidmedia_la-gstamcsurface.lo `test -f 'gstamcsurface.c' || echo '$(srcdir)/'`gstamcsurface.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstandroidmedia_la-gstamcsurface.Tpo $(DEPDIR)/libgstandroidmedia_la-gstamcsurface.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstamcsurface.c' object='libgstandroidmedia_la-gstamcsurface.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstandroidmedia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstandroidmedia_la_CFLAGS) $(CFLAGS) -c -o libgstandroidmedia_la-gstamcsurface.lo `test -f 'gstamcsurface.c' || echo '$(srcdir)/'`gstamcsurface.c
+
+libgstandroidmedia_la-gstamcsurfacetexture.lo: gstamcsurfacetexture.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstandroidmedia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstandroidmedia_la_CFLAGS) $(CFLAGS) -MT libgstandroidmedia_la-gstamcsurfacetexture.lo -MD -MP -MF $(DEPDIR)/libgstandroidmedia_la-gstamcsurfacetexture.Tpo -c -o libgstandroidmedia_la-gstamcsurfacetexture.lo `test -f 'gstamcsurfacetexture.c' || echo '$(srcdir)/'`gstamcsurfacetexture.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstandroidmedia_la-gstamcsurfacetexture.Tpo $(DEPDIR)/libgstandroidmedia_la-gstamcsurfacetexture.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstamcsurfacetexture.c' object='libgstandroidmedia_la-gstamcsurfacetexture.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstandroidmedia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstandroidmedia_la_CFLAGS) $(CFLAGS) -c -o libgstandroidmedia_la-gstamcsurfacetexture.lo `test -f 'gstamcsurfacetexture.c' || echo '$(srcdir)/'`gstamcsurfacetexture.c
+
 libgstandroidmedia_la-gstjniutils.lo: gstjniutils.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstandroidmedia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstandroidmedia_la_CFLAGS) $(CFLAGS) -MT libgstandroidmedia_la-gstjniutils.lo -MD -MP -MF $(DEPDIR)/libgstandroidmedia_la-gstjniutils.Tpo -c -o libgstandroidmedia_la-gstjniutils.lo `test -f 'gstjniutils.c' || echo '$(srcdir)/'`gstjniutils.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstandroidmedia_la-gstjniutils.Tpo $(DEPDIR)/libgstandroidmedia_la-gstjniutils.Plo
@@ -947,6 +998,27 @@
 
 clean-libtool:
 	-rm -rf .libs _libs
+install-androidmedia_java_classesDATA: $(androidmedia_java_classes_DATA)
+	@$(NORMAL_INSTALL)
+	@list='$(androidmedia_java_classes_DATA)'; test -n "$(androidmedia_java_classesdir)" || list=; \
+	if test -n "$$list"; then \
+	  echo " $(MKDIR_P) '$(DESTDIR)$(androidmedia_java_classesdir)'"; \
+	  $(MKDIR_P) "$(DESTDIR)$(androidmedia_java_classesdir)" || exit 1; \
+	fi; \
+	for p in $$list; do \
+	  if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \
+	  echo "$$d$$p"; \
+	done | $(am__base_list) | \
+	while read files; do \
+	  echo " $(INSTALL_DATA) $$files '$(DESTDIR)$(androidmedia_java_classesdir)'"; \
+	  $(INSTALL_DATA) $$files "$(DESTDIR)$(androidmedia_java_classesdir)" || exit $$?; \
+	done
+
+uninstall-androidmedia_java_classesDATA:
+	@$(NORMAL_UNINSTALL)
+	@list='$(androidmedia_java_classes_DATA)'; test -n "$(androidmedia_java_classesdir)" || list=; \
+	files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \
+	dir='$(DESTDIR)$(androidmedia_java_classesdir)'; $(am__uninstall_files_from_dir)
 
 ID: $(am__tagged_files)
 	$(am__define_uniq_tagged_files); mkid -fID $$unique
@@ -1032,9 +1104,9 @@
 	done
 check-am: all-am
 check: check-am
-all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+all-am: Makefile $(LTLIBRARIES) $(DATA) $(HEADERS)
 installdirs:
-	for dir in "$(DESTDIR)$(plugindir)"; do \
+	for dir in "$(DESTDIR)$(plugindir)" "$(DESTDIR)$(androidmedia_java_classesdir)"; do \
 	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
 	done
 install: install-am
@@ -1090,7 +1162,8 @@
 
 info-am:
 
-install-data-am: install-pluginLTLIBRARIES
+install-data-am: install-androidmedia_java_classesDATA \
+	install-pluginLTLIBRARIES
 
 install-dvi: install-dvi-am
 
@@ -1136,7 +1209,8 @@
 
 ps-am:
 
-uninstall-am: uninstall-pluginLTLIBRARIES
+uninstall-am: uninstall-androidmedia_java_classesDATA \
+	uninstall-pluginLTLIBRARIES
 
 .MAKE: install-am install-strip
 
@@ -1144,7 +1218,8 @@
 	clean-libtool clean-pluginLTLIBRARIES cscopelist-am ctags \
 	ctags-am distclean distclean-compile distclean-generic \
 	distclean-libtool distclean-tags distdir dvi dvi-am html \
-	html-am info info-am install install-am install-data \
+	html-am info info-am install install-am \
+	install-androidmedia_java_classesDATA install-data \
 	install-data-am install-dvi install-dvi-am install-exec \
 	install-exec-am install-html install-html-am install-info \
 	install-info-am install-man install-pdf install-pdf-am \
@@ -1153,6 +1228,7 @@
 	maintainer-clean maintainer-clean-generic mostlyclean \
 	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
 	pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
+	uninstall-androidmedia_java_classesDATA \
 	uninstall-pluginLTLIBRARIES
 
 .PRECIOUS: Makefile
diff --git a/sys/androidmedia/gstamc.c b/sys/androidmedia/gstamc.c
index 078e28a..f333820 100644
--- a/sys/androidmedia/gstamc.c
+++ b/sys/androidmedia/gstamc.c
@@ -185,8 +185,8 @@
 }
 
 gboolean
-gst_amc_codec_configure (GstAmcCodec * codec, GstAmcFormat * format, gint flags,
-    GError ** err)
+gst_amc_codec_configure (GstAmcCodec * codec, GstAmcFormat * format,
+    jobject surface, gint flags, GError ** err)
 {
   JNIEnv *env;
 
@@ -195,7 +195,7 @@
 
   env = gst_amc_jni_get_env ();
   return gst_amc_jni_call_void_method (env, err, codec->object,
-      media_codec.configure, format->object, NULL, NULL, flags);
+      media_codec.configure, format->object, surface, NULL, flags);
 }
 
 GstAmcFormat *
@@ -591,7 +591,7 @@
 
 gboolean
 gst_amc_codec_release_output_buffer (GstAmcCodec * codec, gint index,
-    GError ** err)
+    gboolean render, GError ** err)
 {
   JNIEnv *env;
 
@@ -599,7 +599,7 @@
 
   env = gst_amc_jni_get_env ();
   return gst_amc_jni_call_void_method (env, err, codec->object,
-      media_codec.release_output_buffer, index, JNI_FALSE);
+      media_codec.release_output_buffer, index, render);
 }
 
 GstAmcFormat *
@@ -1567,6 +1567,7 @@
       goto next_codec;
     }
     gst_codec_info->is_encoder = is_encoder;
+    gst_codec_info->gl_output_only = FALSE;
 
     supported_types =
         (*env)->CallObjectMethod (env, codec_info, get_supported_types_id);
@@ -1710,12 +1711,13 @@
           goto next_supported_type;
         }
 
-        if (!ignore_unknown_color_formats
-            && !accepted_color_formats (gst_codec_type, is_encoder)) {
-          GST_ERROR ("%s codec has unknown color formats, ignoring",
-              is_encoder ? "Encoder" : "Decoder");
-          valid_codec = FALSE;
-          goto next_supported_type;
+        if (!accepted_color_formats (gst_codec_type, is_encoder)) {
+          if (!ignore_unknown_color_formats) {
+            gst_codec_info->gl_output_only = TRUE;
+            GST_WARNING
+                ("%s %s has unknown color formats, only direct rendering will be supported",
+                gst_codec_type->mime, is_encoder ? "encoder" : "decoder");
+          }
         }
       }
 
@@ -2004,8 +2006,10 @@
   for (i = 0; i < type->n_color_formats; i++) {
     gboolean found = FALSE;
     /* We ignore this one */
-    if (type->color_formats[i] == COLOR_FormatAndroidOpaque)
+    if (type->color_formats[i] == COLOR_FormatAndroidOpaque) {
       all--;
+      continue;
+    }
 
     for (j = 0; j < G_N_ELEMENTS (color_format_mapping_table); j++) {
       if (color_format_mapping_table[j].color_format == type->color_formats[i]) {
@@ -2016,7 +2020,7 @@
     }
 
     if (!found) {
-      GST_DEBUG ("Unknown color format 0x%x, ignoring", type->color_formats[i]);
+      GST_ERROR ("Unknown color format 0x%x, ignoring", type->color_formats[i]);
     }
   }
 
@@ -2292,8 +2296,9 @@
     goto done;
   }
 
-  GST_DEBUG ("Sizes not equal (%d vs %d), doing slow line-by-line copying",
-      cbuffer_info->size, gst_buffer_get_size (vbuffer));
+  GST_DEBUG ("Sizes not equal (%d vs %" G_GSIZE_FORMAT
+      "), doing slow line-by-line copying", cbuffer_info->size,
+      gst_buffer_get_size (vbuffer));
 
   /* Different video format, try to convert */
   switch (cinfo->color_format) {
@@ -3458,7 +3463,8 @@
               gst_amc_color_format_to_video_format (codec_info,
               type->mime, type->color_formats[j]);
           if (format == GST_VIDEO_FORMAT_UNKNOWN) {
-            GST_WARNING ("Unknown color format 0x%08x", type->color_formats[j]);
+            GST_WARNING ("Unknown color format 0x%08x for codec %s",
+                type->color_formats[j], type->mime);
             continue;
           }
 
diff --git a/sys/androidmedia/gstamc.h b/sys/androidmedia/gstamc.h
index a3fb9bc..a640616 100644
--- a/sys/androidmedia/gstamc.h
+++ b/sys/androidmedia/gstamc.h
@@ -53,6 +53,7 @@
 struct _GstAmcCodecInfo {
   gchar *name;
   gboolean is_encoder;
+  gboolean gl_output_only;
   GstAmcCodecType *supported_types;
   gint n_supported_types;
 };
@@ -82,7 +83,7 @@
 GstAmcCodec * gst_amc_codec_new (const gchar *name, GError **err);
 void gst_amc_codec_free (GstAmcCodec * codec);
 
-gboolean gst_amc_codec_configure (GstAmcCodec * codec, GstAmcFormat * format, gint flags, GError **err);
+gboolean gst_amc_codec_configure (GstAmcCodec * codec, GstAmcFormat * format, jobject surface, gint flags, GError **err);
 GstAmcFormat * gst_amc_codec_get_output_format (GstAmcCodec * codec, GError **err);
 
 gboolean gst_amc_codec_start (GstAmcCodec * codec, GError **err);
@@ -97,7 +98,7 @@
 gint gst_amc_codec_dequeue_output_buffer (GstAmcCodec * codec, GstAmcBufferInfo *info, gint64 timeoutUs, GError **err);
 
 gboolean gst_amc_codec_queue_input_buffer (GstAmcCodec * codec, gint index, const GstAmcBufferInfo *info, GError **err);
-gboolean gst_amc_codec_release_output_buffer (GstAmcCodec * codec, gint index, GError **err);
+gboolean gst_amc_codec_release_output_buffer (GstAmcCodec * codec, gint index, gboolean render, GError **err);
 
 
 GstAmcFormat * gst_amc_format_new_audio (const gchar *mime, gint sample_rate, gint channels, GError **err);
@@ -184,6 +185,8 @@
   g_clear_error (&err); \
 } G_STMT_END
 
+GST_DEBUG_CATEGORY_EXTERN (gst_amc_debug);
+
 G_END_DECLS
 
 #endif /* __GST_AMC_H__ */
diff --git a/sys/androidmedia/gstamcaudiodec.c b/sys/androidmedia/gstamcaudiodec.c
index bc81907..ce86a96 100644
--- a/sys/androidmedia/gstamcaudiodec.c
+++ b/sys/androidmedia/gstamcaudiodec.c
@@ -573,7 +573,7 @@
     }
   }
 
-  if (!gst_amc_codec_release_output_buffer (self->codec, idx, &err)) {
+  if (!gst_amc_codec_release_output_buffer (self->codec, idx, FALSE, &err)) {
     if (self->flushing) {
       g_clear_error (&err);
       goto flushing;
@@ -703,7 +703,7 @@
   {
     GST_ELEMENT_ERROR (self, LIBRARY, FAILED, (NULL),
         ("Invalid buffer size %u (bfp %d)", buffer_info.size, self->info.bpf));
-    gst_amc_codec_release_output_buffer (self->codec, idx, &err);
+    gst_amc_codec_release_output_buffer (self->codec, idx, FALSE, &err);
     if (err && !self->flushing)
       GST_ELEMENT_WARNING_FROM_ERROR (self, err);
     g_clear_error (&err);
@@ -722,7 +722,7 @@
   {
     GST_ELEMENT_ERROR (self, LIBRARY, SETTINGS, (NULL),
         ("Failed to allocate output buffer"));
-    gst_amc_codec_release_output_buffer (self->codec, idx, &err);
+    gst_amc_codec_release_output_buffer (self->codec, idx, FALSE, &err);
     if (err && !self->flushing)
       GST_ELEMENT_WARNING_FROM_ERROR (self, err);
     g_clear_error (&err);
@@ -927,7 +927,7 @@
       GST_STR_NULL (format_string));
   g_free (format_string);
 
-  if (!gst_amc_codec_configure (self->codec, format, 0, &err)) {
+  if (!gst_amc_codec_configure (self->codec, format, NULL, 0, &err)) {
     GST_ERROR_OBJECT (self, "Failed to configure codec");
     GST_ELEMENT_ERROR_FROM_ERROR (self, err);
     return FALSE;
diff --git a/sys/androidmedia/gstamcsurface.c b/sys/androidmedia/gstamcsurface.c
new file mode 100644
index 0000000..33dc6a7
--- /dev/null
+++ b/sys/androidmedia/gstamcsurface.c
@@ -0,0 +1,193 @@
+/*
+ * Copyright (C) 2013, Fluendo S.A.
+ *   Author: Andoni Morales <amorales@fluendo.com>
+ *
+ * Copyright (C) 2015, Collabora Ltd.
+ *   Author: Matthieu Bouron <matthieu.bouron@collabora.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation
+ * version 2.1 of the License.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstjniutils.h"
+#include "gstamcsurface.h"
+
+G_DEFINE_TYPE (GstAmcSurface, gst_amc_surface, G_TYPE_OBJECT);
+
+static gpointer parent_class = NULL;
+static void gst_amc_surface_dispose (GObject * object);
+
+static gboolean
+_cache_java_class (GstAmcSurfaceClass * klass, GError ** err)
+{
+  JNIEnv *env;
+
+  gst_amc_jni_initialize ();
+
+  env = gst_amc_jni_get_env ();
+
+  klass->jklass = gst_amc_jni_get_class (env, err, "android/view/Surface");
+  if (!klass->jklass) {
+    return FALSE;
+  }
+
+  klass->constructor =
+      gst_amc_jni_get_method_id (env, err, klass->jklass, "<init>",
+      "(Landroid/graphics/SurfaceTexture;)V");
+  if (!klass->constructor) {
+    goto error;
+  }
+
+  klass->is_valid =
+      gst_amc_jni_get_method_id (env, err, klass->jklass, "isValid", "()Z");
+  if (!klass->is_valid) {
+    goto error;
+  }
+
+  klass->release =
+      gst_amc_jni_get_method_id (env, err, klass->jklass, "release", "()V");
+  if (!klass->release) {
+    goto error;
+  }
+
+  klass->describe_contents =
+      gst_amc_jni_get_method_id (env, err, klass->jklass, "describeContents",
+      "()I");
+  if (!klass->describe_contents) {
+    goto error;
+  }
+
+  return TRUE;
+
+error:
+  gst_amc_jni_object_unref (env, klass->jklass);
+  return FALSE;
+}
+
+static void
+gst_amc_surface_class_init (GstAmcSurfaceClass * klass)
+{
+  GError *err = NULL;
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  parent_class = g_type_class_peek_parent (klass);
+  gobject_class->dispose = gst_amc_surface_dispose;
+
+  if (!_cache_java_class (klass, &err)) {
+    g_log (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
+        "Could not cache java class android/view/Surface: %s", err->message);
+    g_clear_error (&err);
+  }
+}
+
+static void
+gst_amc_surface_init (GstAmcSurface * self)
+{
+  /* initialize the object */
+}
+
+static void
+gst_amc_surface_dispose (GObject * object)
+{
+  GstAmcSurface *self;
+  JNIEnv *env;
+  GError *err = NULL;
+
+  self = GST_AMC_SURFACE (object);
+  env = gst_amc_jni_get_env ();
+
+  if (!gst_amc_surface_release (self, &err)) {
+    if (err) {
+      GST_ERROR ("Error: %s", err->message);
+    }
+  }
+
+  if (self->jobject) {
+    gst_amc_jni_object_unref (env, self->jobject);
+  }
+
+  if (self->texture != NULL) {
+    g_object_unref (self->texture);
+    self->texture = NULL;
+  }
+
+  G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+GstAmcSurface *
+gst_amc_surface_new (GstAmcSurfaceTexture * texture, GError ** err)
+{
+  GstAmcSurface *surface;
+  GstAmcSurfaceClass *klass;
+  JNIEnv *env;
+
+  surface = g_object_new (GST_TYPE_AMC_SURFACE, NULL);
+  env = gst_amc_jni_get_env ();
+  klass = GST_AMC_SURFACE_GET_CLASS (surface);
+
+  surface->jobject = gst_amc_jni_new_object (env, err, TRUE, klass->jklass,
+      klass->constructor, texture->jobject);
+  if (surface->jobject == NULL) {
+    g_object_unref (surface);
+    return NULL;
+  }
+
+  surface->texture = g_object_ref (texture);
+  return surface;
+}
+
+gboolean
+gst_amc_surface_is_valid (GstAmcSurface * self, gboolean * result,
+    GError ** err)
+{
+  JNIEnv *env;
+  GstAmcSurfaceClass *klass;
+
+  env = gst_amc_jni_get_env ();
+  klass = GST_AMC_SURFACE_GET_CLASS (self);
+
+  return gst_amc_jni_call_boolean_method (env, err, self->jobject,
+      klass->is_valid, result);
+}
+
+gboolean
+gst_amc_surface_release (GstAmcSurface * self, GError ** err)
+{
+  JNIEnv *env;
+  GstAmcSurfaceClass *klass;
+
+  env = gst_amc_jni_get_env ();
+  klass = GST_AMC_SURFACE_GET_CLASS (self);
+
+  return gst_amc_jni_call_void_method (env, err, self->jobject, klass->release);
+}
+
+gboolean
+gst_amc_surface_describe_contents (GstAmcSurface * self, gint * result,
+    GError ** err)
+{
+  JNIEnv *env;
+  GstAmcSurfaceClass *klass;
+
+  env = gst_amc_jni_get_env ();
+  klass = GST_AMC_SURFACE_GET_CLASS (self);
+
+  return gst_amc_jni_call_int_method (env, err, self->jobject,
+      klass->describe_contents, result);
+}
diff --git a/sys/androidmedia/gstamcsurface.h b/sys/androidmedia/gstamcsurface.h
new file mode 100644
index 0000000..21f9969
--- /dev/null
+++ b/sys/androidmedia/gstamcsurface.h
@@ -0,0 +1,81 @@
+/*
+ * Copyright (C) 2013, Fluendo S.A.
+ *   Author: Andoni Morales <amorales@fluendo.com>
+ *
+ * Copyright (C) 2015, Collabora Ltd.
+ *   Author: Matthieu Bouron <matthieu.bouron@collabora.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation
+ * version 2.1 of the License.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
+ *
+ */
+
+#ifndef __GST_AMC_SURFACE_H__
+#define __GST_AMC_SURFACE_H__
+
+#include <glib-object.h>
+#include <jni.h>
+#include "gstamcsurfacetexture.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_AMC_SURFACE                  (gst_amc_surface_get_type ())
+#define GST_AMC_SURFACE(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_AMC_SURFACE, GstAmcSurface))
+#define GST_IS_AMC_SURFACE(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AMC_SURFACE))
+#define GST_AMC_SURFACE_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_AMC_SURFACE, GstAmcSurfaceClass))
+#define GST_IS_AMC_SURFACE_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AMC_SURFACE))
+#define GST_AMC_SURFACE_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_AMC_SURFACE, GstAmcSurfaceClass))
+
+typedef struct _GstAmcSurface        GstAmcSurface;
+typedef struct _GstAmcSurfaceClass   GstAmcSurfaceClass;
+
+struct _GstAmcSurface
+{
+  GObject parent_instance;
+
+  /* instance members */
+  jobject jobject;
+  GstAmcSurfaceTexture *texture;
+};
+
+struct _GstAmcSurfaceClass
+{
+  GObjectClass parent_class;
+
+  /* class members */
+  jclass jklass;
+  jmethodID constructor;
+  jmethodID is_valid;
+  jmethodID release;
+  jmethodID describe_contents;
+};
+
+GType gst_amc_surface_get_type (void);
+
+GstAmcSurface * gst_amc_surface_new           (GstAmcSurfaceTexture *texture,
+                                              GError ** err);
+
+gboolean gst_amc_surface_is_valid             (GstAmcSurface *surface,
+                                              gboolean * result,
+                                              GError ** err);
+
+gboolean gst_amc_surface_release              (GstAmcSurface *surface,
+                                              GError ** err);
+
+gboolean gst_amc_surface_describe_contents    (GstAmcSurface *surface,
+                                              gint * result,
+                                              GError ** err);
+
+G_END_DECLS
+#endif
diff --git a/sys/androidmedia/gstamcsurfacetexture.c b/sys/androidmedia/gstamcsurfacetexture.c
new file mode 100644
index 0000000..43c3142
--- /dev/null
+++ b/sys/androidmedia/gstamcsurfacetexture.c
@@ -0,0 +1,318 @@
+/*
+ * Copyright (C) 2013, Fluendo S.A.
+ *   Author: Andoni Morales <amorales@fluendo.com>
+ *
+ * Copyright (C) 2014, Collabora Ltd.
+ *   Author: Matthieu Bouron <matthieu.bouron@collabora.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation
+ * version 2.1 of the License.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include "gstjniutils.h"
+#include "gstamcsurfacetexture.h"
+
+G_DEFINE_TYPE (GstAmcSurfaceTexture, gst_amc_surface_texture, G_TYPE_OBJECT);
+
+static gpointer parent_class = NULL;
+static void gst_amc_surface_texture_dispose (GObject * object);
+
+static gboolean
+_cache_java_class (GstAmcSurfaceTextureClass * klass, GError ** err)
+{
+  JNIEnv *env;
+
+  gst_amc_jni_initialize ();
+  env = gst_amc_jni_get_env ();
+
+  klass->jklass =
+      gst_amc_jni_get_class (env, err, "android/graphics/SurfaceTexture");
+  if (!klass->jklass) {
+    return FALSE;
+  }
+
+  klass->constructor =
+      gst_amc_jni_get_method_id (env, err, klass->jklass, "<init>", "(I)V");
+  if (!klass->constructor) {
+    goto error;
+  }
+
+  klass->set_on_frame_available_listener =
+      gst_amc_jni_get_method_id (env, err, klass->jklass,
+      "setOnFrameAvailableListener",
+      "(Landroid/graphics/SurfaceTexture$OnFrameAvailableListener;)V");
+
+  klass->set_default_buffer_size =
+      gst_amc_jni_get_method_id (env, err, klass->jklass,
+      "setDefaultBufferSize", "(II)V");
+  if (!klass->set_default_buffer_size) {
+    goto error;
+  }
+
+  klass->update_tex_image =
+      gst_amc_jni_get_method_id (env, err, klass->jklass, "updateTexImage",
+      "()V");
+  if (!klass->update_tex_image) {
+    goto error;
+  }
+
+  klass->detach_from_gl_context =
+      gst_amc_jni_get_method_id (env, err, klass->jklass, "detachFromGLContext",
+      "()V");
+  if (!klass->detach_from_gl_context) {
+    goto error;
+  }
+
+  klass->attach_to_gl_context =
+      gst_amc_jni_get_method_id (env, err, klass->jklass, "attachToGLContext",
+      "(I)V");
+  if (!klass->attach_to_gl_context) {
+    goto error;
+  }
+
+  klass->get_transform_matrix =
+      gst_amc_jni_get_method_id (env, err, klass->jklass, "getTransformMatrix",
+      "([F)V");
+  if (!klass->get_transform_matrix) {
+    goto error;
+  }
+
+  klass->get_timestamp =
+      gst_amc_jni_get_method_id (env, err, klass->jklass, "getTimestamp",
+      "()J");
+  if (!klass->get_timestamp) {
+    goto error;
+  }
+
+  klass->release =
+      gst_amc_jni_get_method_id (env, err, klass->jklass, "release", "()V");
+  if (!klass->release) {
+    goto error;
+  }
+
+  return TRUE;
+
+error:
+  gst_amc_jni_object_unref (env, klass->constructor);
+  return FALSE;
+}
+
+static void
+gst_amc_surface_texture_init (GstAmcSurfaceTexture * self)
+{
+}
+
+static void
+gst_amc_surface_texture_class_init (GstAmcSurfaceTextureClass * klass)
+{
+  GError *err = NULL;
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+
+  parent_class = g_type_class_peek_parent (klass);
+  gobject_class->dispose = gst_amc_surface_texture_dispose;
+
+  if (!_cache_java_class (klass, &err)) {
+    g_log (G_LOG_DOMAIN, G_LOG_LEVEL_CRITICAL,
+        "Could not cache java class android/graphics/SurfaceTexture: %s",
+        err->message);
+    g_clear_error (&err);
+  }
+}
+
+static void
+gst_amc_surface_texture_dispose (GObject * object)
+{
+  GstAmcSurfaceTexture *self;
+  JNIEnv *env;
+  GError *err = NULL;
+
+  self = GST_AMC_SURFACE_TEXTURE (object);
+  env = gst_amc_jni_get_env ();
+
+  if (!gst_amc_surface_texture_release (self, &err)) {
+    GST_ERROR ("Could not release surface texture: %s", err->message);
+    g_clear_error (&err);
+  }
+
+  if (self->jobject) {
+    gst_amc_jni_object_unref (env, self->jobject);
+  }
+  G_OBJECT_CLASS (parent_class)->dispose (object);
+}
+
+GstAmcSurfaceTexture *
+gst_amc_surface_texture_new (GError ** err)
+{
+  GstAmcSurfaceTexture *texture = NULL;
+  GstAmcSurfaceTextureClass *klass;
+  JNIEnv *env;
+
+  texture = g_object_new (GST_TYPE_AMC_SURFACE_TEXTURE, NULL);
+  klass = GST_AMC_SURFACE_TEXTURE_GET_CLASS (texture);
+  env = gst_amc_jni_get_env ();
+
+  texture->texture_id = 0;
+
+  texture->jobject = gst_amc_jni_new_object (env, err, TRUE, klass->jklass,
+      klass->constructor, texture->texture_id);
+  if (texture->jobject == NULL) {
+    goto error;
+  }
+
+  if (!gst_amc_surface_texture_detach_from_gl_context (texture, err)) {
+    goto error;
+  }
+
+  return texture;
+
+error:
+  if (texture)
+    g_object_unref (texture);
+  return NULL;
+}
+
+gboolean
+gst_amc_surface_texture_set_default_buffer_size (GstAmcSurfaceTexture * self,
+    gint width, gint height, GError ** err)
+{
+  JNIEnv *env;
+  GstAmcSurfaceTextureClass *klass;
+
+  env = gst_amc_jni_get_env ();
+  klass = GST_AMC_SURFACE_TEXTURE_GET_CLASS (self);
+
+  return gst_amc_jni_call_void_method (env, err, self->jobject,
+      klass->set_default_buffer_size, width, height);
+}
+
+gboolean
+gst_amc_surface_texture_update_tex_image (GstAmcSurfaceTexture * self,
+    GError ** err)
+{
+  JNIEnv *env;
+  GstAmcSurfaceTextureClass *klass;
+
+  env = gst_amc_jni_get_env ();
+  klass = GST_AMC_SURFACE_TEXTURE_GET_CLASS (self);
+
+  return gst_amc_jni_call_void_method (env, err, self->jobject,
+      klass->update_tex_image);
+}
+
+gboolean
+gst_amc_surface_texture_detach_from_gl_context (GstAmcSurfaceTexture * self,
+    GError ** err)
+{
+  JNIEnv *env;
+  gboolean ret;
+  GstAmcSurfaceTextureClass *klass;
+
+  env = gst_amc_jni_get_env ();
+  klass = GST_AMC_SURFACE_TEXTURE_GET_CLASS (self);
+
+  ret =
+      gst_amc_jni_call_void_method (env, err, self->jobject,
+      klass->detach_from_gl_context);
+  self->texture_id = 0;
+  return ret;
+}
+
+gboolean
+gst_amc_surface_texture_attach_to_gl_context (GstAmcSurfaceTexture * self,
+    gint texture_id, GError ** err)
+{
+  JNIEnv *env;
+  gboolean ret;
+  GstAmcSurfaceTextureClass *klass;
+
+  env = gst_amc_jni_get_env ();
+  klass = GST_AMC_SURFACE_TEXTURE_GET_CLASS (self);
+
+  ret =
+      gst_amc_jni_call_void_method (env, err, self->jobject,
+      klass->attach_to_gl_context, texture_id);
+  self->texture_id = texture_id;
+  return ret;
+}
+
+gboolean
+gst_amc_surface_texture_get_transform_matrix (GstAmcSurfaceTexture * self,
+    const gfloat * matrix, GError ** err)
+{
+  JNIEnv *env;
+  gboolean ret;
+  GstAmcSurfaceTextureClass *klass;
+  /* 4x4 Matrix */
+  jsize size = 16;
+  jfloatArray floatarray;
+
+  env = gst_amc_jni_get_env ();
+  klass = GST_AMC_SURFACE_TEXTURE_GET_CLASS (self);
+
+  floatarray = (*env)->NewFloatArray (env, size);
+  ret =
+      gst_amc_jni_call_void_method (env, err, self->jobject,
+      klass->get_transform_matrix, floatarray);
+  if (ret) {
+    (*env)->GetFloatArrayRegion (env, floatarray, 0, size, (jfloat *) matrix);
+    (*env)->DeleteLocalRef (env, floatarray);
+  }
+
+  return ret;
+}
+
+gboolean
+gst_amc_surface_texture_get_timestamp (GstAmcSurfaceTexture * self,
+    gint64 * result, GError ** err)
+{
+  JNIEnv *env;
+  GstAmcSurfaceTextureClass *klass;
+
+  env = gst_amc_jni_get_env ();
+  klass = GST_AMC_SURFACE_TEXTURE_GET_CLASS (self);
+
+  return gst_amc_jni_call_long_method (env, err, self->jobject,
+      klass->get_timestamp, result);
+}
+
+gboolean
+gst_amc_surface_texture_release (GstAmcSurfaceTexture * self, GError ** err)
+{
+  JNIEnv *env;
+  GstAmcSurfaceTextureClass *klass;
+
+  env = gst_amc_jni_get_env ();
+  klass = GST_AMC_SURFACE_TEXTURE_GET_CLASS (self);
+
+  return gst_amc_jni_call_void_method (env, err, self->jobject, klass->release);
+}
+
+gboolean
+gst_amc_surface_texture_set_on_frame_available_listener (GstAmcSurfaceTexture *
+    self, jobject listener, GError ** err)
+{
+  JNIEnv *env;
+  GstAmcSurfaceTextureClass *klass;
+
+  env = gst_amc_jni_get_env ();
+  klass = GST_AMC_SURFACE_TEXTURE_GET_CLASS (self);
+
+  return gst_amc_jni_call_void_method (env, err, self->jobject,
+      klass->set_on_frame_available_listener, listener);
+}
diff --git a/sys/androidmedia/gstamcsurfacetexture.h b/sys/androidmedia/gstamcsurfacetexture.h
new file mode 100644
index 0000000..0d6ebf1
--- /dev/null
+++ b/sys/androidmedia/gstamcsurfacetexture.h
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 2013, Fluendo S.A.
+ *   Author: Andoni Morales <amorales@fluendo.com>
+ *
+ * Copyright (C) 2014, Collabora Ltd.
+ *   Author: Matthieu Bouron <matthieu.bouron@collabora.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation
+ * version 2.1 of the License.
+ *
+ * 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301 USA
+ *
+ */
+
+#ifndef __GST_AMC_SURFACE_TEXTURE_H__
+#define __GST_AMC_SURFACE_TEXTURE_H__
+
+#include <glib.h>
+#include <glib-object.h>
+#include <jni.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_AMC_SURFACE_TEXTURE                  (gst_amc_surface_texture_get_type ())
+#define GST_AMC_SURFACE_TEXTURE(obj)                  (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_AMC_SURFACE_TEXTURE, GstAmcSurfaceTexture))
+#define GST_IS_AMC_SURFACE_TEXTURE(obj)               (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_AMC_SURFACE_TEXTURE))
+#define GST_AMC_SURFACE_TEXTURE_CLASS(klass)          (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_AMC_SURFACE_TEXTURE, GstAmcSurfaceTextureClass))
+#define GST_IS_AMC_SURFACE_TEXTURE_CLASS(klass)       (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_AMC_SURFACE_TEXTURE))
+#define GST_AMC_SURFACE_TEXTURE_GET_CLASS(obj)        (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_AMC_SURFACE_TEXTURE, GstAmcSurfaceTextureClass))
+
+typedef struct _GstAmcSurfaceTexture        GstAmcSurfaceTexture;
+typedef struct _GstAmcSurfaceTextureClass   GstAmcSurfaceTextureClass;
+
+struct _GstAmcSurfaceTexture
+{
+  GObject parent_instance;
+
+  /* instance members */
+  gint texture_id;
+  jobject jobject;
+};
+
+struct _GstAmcSurfaceTextureClass
+{
+  GObjectClass parent_class;
+
+  /* class members */
+  gint texture_id;
+
+  jclass jklass;
+  jmethodID constructor;
+  jmethodID set_on_frame_available_listener;
+  jmethodID set_default_buffer_size;
+  jmethodID update_tex_image;
+  jmethodID detach_from_gl_context;
+  jmethodID attach_to_gl_context;
+  jmethodID get_transform_matrix;
+  jmethodID get_timestamp;
+  jmethodID release;
+};
+
+GType gst_amc_surface_texture_get_type                   (void);
+
+GstAmcSurfaceTexture * gst_amc_surface_texture_new       (GError ** err);
+
+gboolean gst_amc_surface_texture_set_default_buffer_size (GstAmcSurfaceTexture *texture,
+                                                         gint width,
+                                                         gint height,
+                                                         GError ** err);
+
+gboolean gst_amc_surface_texture_update_tex_image        (GstAmcSurfaceTexture *texture,
+                                                         GError ** err);
+
+gboolean gst_amc_surface_texture_detach_from_gl_context  (GstAmcSurfaceTexture *texture,
+                                                         GError ** err);
+
+gboolean gst_amc_surface_texture_attach_to_gl_context    (GstAmcSurfaceTexture *texture,
+                                                         gint index,
+                                                         GError ** err);
+
+gboolean gst_amc_surface_texture_get_transform_matrix    (GstAmcSurfaceTexture *texture,
+                                                         const gfloat *matrix,
+                                                         GError ** err);
+
+gboolean gst_amc_surface_texture_get_timestamp           (GstAmcSurfaceTexture *texture,
+                                                         gint64 * result,
+                                                         GError ** err);
+
+gboolean gst_amc_surface_texture_release                 (GstAmcSurfaceTexture *texture,
+                                                         GError ** err);
+
+gboolean gst_amc_surface_texture_set_on_frame_available_listener (GstAmcSurfaceTexture * self,
+                                                                 jobject listener,
+                                                                 GError ** err);
+
+G_END_DECLS
+#endif
diff --git a/sys/androidmedia/gstamcvideodec.c b/sys/androidmedia/gstamcvideodec.c
index 48b0dcd..1581d06 100644
--- a/sys/androidmedia/gstamcvideodec.c
+++ b/sys/androidmedia/gstamcvideodec.c
@@ -11,6 +11,14 @@
  *
  * Copyright (C) 2015, Sebastian Dröge <sebastian@centricular.com>
  *
+ * Copyright (C) 2014-2015, Collabora Ltd.
+ *   Author: Matthieu Bouron <matthieu.bouron@gcollabora.com>
+ *
+ * Copyright (C) 2015, Edward Hervey
+ *   Author: Edward Hervey <bilboed@gmail.com>
+ *
+ * Copyright (C) 2015, Matthew Waters <matthew@centricular.com>
+ *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
  * License as published by the Free Software Foundation
@@ -32,7 +40,9 @@
 #endif
 
 #include <gst/gst.h>
+#include <gst/gl/gl.h>
 #include <gst/video/gstvideometa.h>
+#include <gst/video/gstvideoaffinetransformationmeta.h>
 #include <gst/video/gstvideopool.h>
 #include <string.h>
 
@@ -58,12 +68,146 @@
   g_clear_error (&err); \
 } G_STMT_END
 
+#if GLIB_SIZEOF_VOID_P == 8
+#define JLONG_TO_GST_AMC_VIDEO_DEC(value) (GstAmcVideoDec *)(value)
+#define GST_AMC_VIDEO_DEC_TO_JLONG(value) (jlong)(value)
+#else
+#define JLONG_TO_GST_AMC_VIDEO_DEC(value) (GstAmcVideoDec *)(jint)(value)
+#define GST_AMC_VIDEO_DEC_TO_JLONG(value) (jlong)(jint)(value)
+#endif
+
 typedef struct _BufferIdentification BufferIdentification;
 struct _BufferIdentification
 {
   guint64 timestamp;
 };
 
+struct gl_sync_result
+{
+  gint refcount;
+  gint64 frame_available_ts;
+  gboolean updated;             /* only every call update_tex_image once */
+  gboolean released;            /* only every call release_output_buffer once */
+  gboolean rendered;            /* whether the release resulted in a render */
+};
+
+static struct gl_sync_result *
+_gl_sync_result_ref (struct gl_sync_result *result)
+{
+  g_assert (result != NULL);
+
+  g_atomic_int_inc (&result->refcount);
+
+  GST_TRACE ("gl_sync result %p ref", result);
+
+  return result;
+}
+
+static void
+_gl_sync_result_unref (struct gl_sync_result *result)
+{
+  g_assert (result != NULL);
+
+  GST_TRACE ("gl_sync result %p unref", result);
+
+  if (g_atomic_int_dec_and_test (&result->refcount)) {
+    GST_TRACE ("freeing gl_sync result %p", result);
+    g_free (result);
+  }
+}
+
+struct gl_sync
+{
+  gint refcount;
+  GstAmcVideoDec *sink;         /* back reference for statistics, lock, cond, etc */
+  gint buffer_idx;              /* idx of the AMC buffer we should render */
+  GstBuffer *buffer;            /* back reference to the buffer */
+  GstGLMemory *oes_mem;         /* where amc is rendering into. The same for every gl_sync */
+  GstAmcSurface *surface;       /* java wrapper for where amc is rendering into */
+  guint gl_frame_no;            /* effectively the frame id */
+  gint64 released_ts;           /* microseconds from g_get_monotonic_time() */
+  struct gl_sync_result *result;
+};
+
+static struct gl_sync *
+_gl_sync_ref (struct gl_sync *sync)
+{
+  g_assert (sync != NULL);
+
+  g_atomic_int_inc (&sync->refcount);
+
+  GST_TRACE ("gl_sync %p ref", sync);
+
+  return sync;
+}
+
+static void
+_gl_sync_unref (struct gl_sync *sync)
+{
+  g_assert (sync != NULL);
+
+  GST_TRACE ("gl_sync %p unref", sync);
+
+  if (g_atomic_int_dec_and_test (&sync->refcount)) {
+    GST_TRACE ("freeing gl_sync %p", sync);
+
+    _gl_sync_result_unref (sync->result);
+
+    g_object_unref (sync->surface);
+    gst_memory_unref ((GstMemory *) sync->oes_mem);
+
+    g_free (sync);
+  }
+}
+
+static gint
+_queue_compare_gl_sync (gconstpointer a, gconstpointer b)
+{
+  const struct gl_sync *sync = a;
+  guint frame = GPOINTER_TO_INT (b);
+
+  return sync->gl_frame_no - frame;
+}
+
+static GList *
+_find_gl_sync_for_frame (GstAmcVideoDec * dec, guint frame)
+{
+  return g_queue_find_custom (dec->gl_queue, GINT_TO_POINTER (frame),
+      (GCompareFunc) _queue_compare_gl_sync);
+}
+
+static void
+_attach_mem_to_context (GstGLContext * context, GstAmcVideoDec * self)
+{
+  GST_TRACE_OBJECT (self, "attaching texture %p id %u to current context",
+      self->surface->texture, self->oes_mem->tex_id);
+  if (!gst_amc_surface_texture_attach_to_gl_context (self->surface->texture,
+          self->oes_mem->tex_id, &self->gl_error)) {
+    GST_ERROR_OBJECT (self, "Failed to attach texture to the GL context");
+    GST_ELEMENT_ERROR_FROM_ERROR (self, self->gl_error);
+  } else {
+    self->gl_mem_attached = TRUE;
+  }
+}
+
+static void
+_dettach_mem_from_context (GstGLContext * context, GstAmcVideoDec * self)
+{
+  if (self->surface) {
+    guint tex_id = self->oes_mem ? self->oes_mem->tex_id : 0;
+
+    GST_TRACE_OBJECT (self, "detaching texture %p id %u from current context",
+        self->surface->texture, tex_id);
+
+    if (!gst_amc_surface_texture_detach_from_gl_context (self->surface->texture,
+            &self->gl_error)) {
+      GST_ERROR_OBJECT (self, "Failed to attach texture to the GL context");
+      GST_ELEMENT_ERROR_FROM_ERROR (self, self->gl_error);
+    }
+  }
+  self->gl_mem_attached = FALSE;
+}
+
 static BufferIdentification *
 buffer_identification_new (GstClockTime timestamp)
 {
@@ -86,6 +230,8 @@
 static GstStateChangeReturn
 gst_amc_video_dec_change_state (GstElement * element,
     GstStateChange transition);
+static void gst_amc_video_dec_set_context (GstElement * element,
+    GstContext * context);
 
 static gboolean gst_amc_video_dec_open (GstVideoDecoder * decoder);
 static gboolean gst_amc_video_dec_close (GstVideoDecoder * decoder);
@@ -99,8 +245,14 @@
 static GstFlowReturn gst_amc_video_dec_finish (GstVideoDecoder * decoder);
 static gboolean gst_amc_video_dec_decide_allocation (GstVideoDecoder * bdec,
     GstQuery * query);
+static gboolean gst_amc_video_dec_src_query (GstVideoDecoder * bdec,
+    GstQuery * query);
 
 static GstFlowReturn gst_amc_video_dec_drain (GstAmcVideoDec * self);
+static gboolean gst_amc_video_dec_check_codec_config (GstAmcVideoDec * self);
+static void
+gst_amc_video_dec_on_frame_available (JNIEnv * env, jobject thiz,
+    long long context, jobject surfaceTexture);
 
 enum
 {
@@ -190,7 +342,7 @@
   GstAmcVideoDecClass *amcvideodec_class = GST_AMC_VIDEO_DEC_CLASS (g_class);
   const GstAmcCodecInfo *codec_info;
   GstPadTemplate *templ;
-  GstCaps *sink_caps, *src_caps;
+  GstCaps *sink_caps, *src_caps, *all_src_caps;
   gchar *longname;
 
   codec_info =
@@ -202,15 +354,27 @@
   amcvideodec_class->codec_info = codec_info;
 
   gst_amc_codec_info_to_caps (codec_info, &sink_caps, &src_caps);
+
+  all_src_caps =
+      gst_caps_from_string ("video/x-raw(" GST_CAPS_FEATURE_MEMORY_GL_MEMORY
+      "), format = (string) RGBA, texture-target = (string) external-oes");
+
+  if (codec_info->gl_output_only) {
+    gst_caps_unref (src_caps);
+  } else {
+    gst_caps_append (all_src_caps, src_caps);
+  }
+
   /* Add pad templates */
   templ =
       gst_pad_template_new ("sink", GST_PAD_SINK, GST_PAD_ALWAYS, sink_caps);
   gst_element_class_add_pad_template (element_class, templ);
   gst_caps_unref (sink_caps);
 
-  templ = gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, src_caps);
+  templ =
+      gst_pad_template_new ("src", GST_PAD_SRC, GST_PAD_ALWAYS, all_src_caps);
   gst_element_class_add_pad_template (element_class, templ);
-  gst_caps_unref (src_caps);
+  gst_caps_unref (all_src_caps);
 
   longname = g_strdup_printf ("Android MediaCodec %s", codec_info->name);
   gst_element_class_set_metadata (element_class,
@@ -233,6 +397,8 @@
 
   element_class->change_state =
       GST_DEBUG_FUNCPTR (gst_amc_video_dec_change_state);
+  element_class->set_context =
+      GST_DEBUG_FUNCPTR (gst_amc_video_dec_set_context);
 
   videodec_class->start = GST_DEBUG_FUNCPTR (gst_amc_video_dec_start);
   videodec_class->stop = GST_DEBUG_FUNCPTR (gst_amc_video_dec_stop);
@@ -245,6 +411,7 @@
   videodec_class->finish = GST_DEBUG_FUNCPTR (gst_amc_video_dec_finish);
   videodec_class->decide_allocation =
       GST_DEBUG_FUNCPTR (gst_amc_video_dec_decide_allocation);
+  videodec_class->src_query = GST_DEBUG_FUNCPTR (gst_amc_video_dec_src_query);
 }
 
 static void
@@ -255,6 +422,11 @@
 
   g_mutex_init (&self->drain_lock);
   g_cond_init (&self->drain_cond);
+
+  g_mutex_init (&self->gl_lock);
+  g_cond_init (&self->gl_cond);
+
+  self->gl_queue = g_queue_new ();
 }
 
 static gboolean
@@ -271,6 +443,8 @@
     GST_ELEMENT_ERROR_FROM_ERROR (self, err);
     return FALSE;
   }
+  self->codec_config = AMC_CODEC_CONFIG_NONE;
+
   self->started = FALSE;
   self->flushing = TRUE;
 
@@ -286,6 +460,31 @@
 
   GST_DEBUG_OBJECT (self, "Closing decoder");
 
+  if (self->downstream_supports_gl
+      && self->codec_config == AMC_CODEC_CONFIG_WITH_SURFACE) {
+    g_mutex_lock (&self->gl_lock);
+    GST_INFO_OBJECT (self, "shutting down gl queue pushed %u ready %u "
+        "released %u", self->gl_pushed_frame_count, self->gl_ready_frame_count,
+        self->gl_released_frame_count);
+
+    g_queue_free_full (self->gl_queue, (GDestroyNotify) _gl_sync_unref);
+    self->gl_queue = g_queue_new ();
+    g_mutex_unlock (&self->gl_lock);
+
+    if (self->gl_mem_attached)
+      gst_gl_context_thread_add (self->gl_context,
+          (GstGLContextThreadFunc) _dettach_mem_from_context, self);
+  }
+  self->gl_pushed_frame_count = 0;
+  self->gl_ready_frame_count = 0;
+  self->gl_released_frame_count = 0;
+  self->gl_last_rendered_frame = 0;
+
+  if (self->surface) {
+    gst_object_unref (self->surface);
+    self->surface = NULL;
+  }
+
   if (self->codec) {
     GError *err = NULL;
 
@@ -295,10 +494,35 @@
 
     gst_amc_codec_free (self->codec);
   }
-  self->codec = NULL;
 
   self->started = FALSE;
   self->flushing = TRUE;
+  self->downstream_supports_gl = FALSE;
+
+  self->codec = NULL;
+  self->codec_config = AMC_CODEC_CONFIG_NONE;
+
+  GST_DEBUG_OBJECT (self, "Freeing GL context: %" GST_PTR_FORMAT,
+      self->gl_context);
+  if (self->gl_context) {
+    gst_object_unref (self->gl_context);
+    self->gl_context = NULL;
+  }
+
+  if (self->oes_mem) {
+    gst_memory_unref ((GstMemory *) self->oes_mem);
+    self->oes_mem = NULL;
+  }
+
+  if (self->gl_display) {
+    gst_object_unref (self->gl_display);
+    self->gl_display = NULL;
+  }
+
+  if (self->other_gl_context) {
+    gst_object_unref (self->other_gl_context);
+    self->other_gl_context = NULL;
+  }
 
   GST_DEBUG_OBJECT (self, "Closed decoder");
 
@@ -313,9 +537,28 @@
   g_mutex_clear (&self->drain_lock);
   g_cond_clear (&self->drain_cond);
 
+  g_mutex_clear (&self->gl_lock);
+  g_cond_clear (&self->gl_cond);
+
+  if (self->gl_queue) {
+    g_queue_free_full (self->gl_queue, (GDestroyNotify) _gl_sync_unref);
+    self->gl_queue = NULL;
+  }
+
   G_OBJECT_CLASS (parent_class)->finalize (object);
 }
 
+static void
+gst_amc_video_dec_set_context (GstElement * element, GstContext * context)
+{
+  GstAmcVideoDec *self = GST_AMC_VIDEO_DEC (element);
+
+  gst_gl_handle_set_context (element, context, &self->gl_display,
+      &self->other_gl_context);
+
+  GST_ELEMENT_CLASS (parent_class)->set_context (element, context);
+}
+
 static GstStateChangeReturn
 gst_amc_video_dec_change_state (GstElement * element, GstStateChange transition)
 {
@@ -327,6 +570,10 @@
       GST_STATE_CHANGE_FAILURE);
   self = GST_AMC_VIDEO_DEC (element);
 
+  GST_DEBUG_OBJECT (element, "changing state: %s => %s",
+      gst_element_state_get_name (GST_STATE_TRANSITION_CURRENT (transition)),
+      gst_element_state_get_name (GST_STATE_TRANSITION_NEXT (transition)));
+
   switch (transition) {
     case GST_STATE_CHANGE_NULL_TO_READY:
       break;
@@ -339,9 +586,11 @@
       break;
     case GST_STATE_CHANGE_PAUSED_TO_READY:
       self->flushing = TRUE;
-      gst_amc_codec_flush (self->codec, &err);
-      if (err)
-        GST_ELEMENT_WARNING_FROM_ERROR (self, err);
+      if (self->started) {
+        gst_amc_codec_flush (self->codec, &err);
+        if (err)
+          GST_ELEMENT_WARNING_FROM_ERROR (self, err);
+      }
       g_mutex_lock (&self->drain_lock);
       self->draining = FALSE;
       g_cond_broadcast (&self->drain_cond);
@@ -366,8 +615,6 @@
       self->downstream_flow_ret = GST_FLOW_FLUSHING;
       self->started = FALSE;
       break;
-    case GST_STATE_CHANGE_READY_TO_NULL:
-      break;
     default:
       break;
   }
@@ -464,6 +711,25 @@
 }
 
 static gboolean
+gst_amc_video_dec_check_codec_config (GstAmcVideoDec * self)
+{
+  gboolean ret = (self->codec_config == AMC_CODEC_CONFIG_NONE
+      || (self->codec_config == AMC_CODEC_CONFIG_WITH_SURFACE
+          && self->downstream_supports_gl)
+      || (self->codec_config == AMC_CODEC_CONFIG_WITHOUT_SURFACE
+          && !self->downstream_supports_gl));
+
+  if (!ret) {
+    GST_ERROR_OBJECT
+        (self,
+        "Codec configuration (%d) is not compatible with downstream which %s support GL output",
+        self->codec_config, self->downstream_supports_gl ? "does" : "does not");
+  }
+
+  return ret;
+}
+
+static gboolean
 gst_amc_video_dec_set_src_caps (GstAmcVideoDec * self, GstAmcFormat * format)
 {
   GstVideoCodecState *output_state;
@@ -528,6 +794,10 @@
       gst_amc_color_format_to_video_format (klass->codec_info, mime,
       color_format);
 
+  if (self->codec_config == AMC_CODEC_CONFIG_WITH_SURFACE) {
+    gst_format = GST_VIDEO_FORMAT_RGBA;
+  }
+
   if (gst_format == GST_VIDEO_FORMAT_UNKNOWN) {
     GST_ERROR_OBJECT (self, "Unknown color format 0x%08x", color_format);
     return FALSE;
@@ -542,7 +812,19 @@
         GST_VIDEO_MULTIVIEW_MODE_TOP_BOTTOM, GST_VIDEO_MULTIVIEW_FLAGS_NONE);
   }
 
+  if (self->codec_config == AMC_CODEC_CONFIG_WITH_SURFACE) {
+    if (output_state->caps)
+      gst_caps_unref (output_state->caps);
+    output_state->caps = gst_video_info_to_caps (&output_state->info);
+    gst_caps_set_features (output_state->caps, 0,
+        gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, NULL));
+    gst_caps_set_simple (output_state->caps, "texture-target", G_TYPE_STRING,
+        "external-oes", NULL);
+  }
+
   self->format = gst_format;
+  self->width = width;
+  self->height = height;
   if (!gst_amc_color_format_info_set (&self->color_format_info,
           klass->codec_info, mime, color_format, width, height, stride,
           slice_height, crop_left, crop_right, crop_top, crop_bottom)) {
@@ -551,9 +833,10 @@
   }
 
   GST_DEBUG_OBJECT (self,
-      "Color format info: {color_format=%d, width=%d, height=%d, "
+      "Color format info: {color_format=%d (0x%08x), width=%d, height=%d, "
       "stride=%d, slice-height=%d, crop-left=%d, crop-top=%d, "
       "crop-right=%d, crop-bottom=%d, frame-size=%d}",
+      self->color_format_info.color_format,
       self->color_format_info.color_format, self->color_format_info.width,
       self->color_format_info.height, self->color_format_info.stride,
       self->color_format_info.slice_height, self->color_format_info.crop_left,
@@ -561,6 +844,7 @@
       self->color_format_info.crop_bottom, self->color_format_info.frame_size);
 
   ret = gst_video_decoder_negotiate (GST_VIDEO_DECODER (self));
+
   gst_video_codec_state_unref (output_state);
   self->input_state_changed = FALSE;
 
@@ -584,6 +868,315 @@
   return ret;
 }
 
+static const gfloat yflip_matrix[16] = {
+  1.0f, 0.0f, 0.0f, 0.0f,
+  0.0f, -1.0f, 0.0f, 0.0f,
+  0.0f, 0.0f, 1.0f, 0.0f,
+  0.0f, 1.0f, 0.0f, 1.0f
+};
+
+static void
+_amc_gl_set_sync (GstGLSyncMeta * sync_meta, GstGLContext * context)
+{
+}
+
+static void
+_gl_sync_release_buffer (struct gl_sync *sync, gboolean render)
+{
+  GError *error = NULL;
+
+  if (!sync->result->released) {
+    sync->released_ts = g_get_monotonic_time ();
+
+    if ((gint) (sync->sink->gl_released_frame_count -
+            sync->sink->gl_ready_frame_count) > 0) {
+      guint diff =
+          sync->sink->gl_released_frame_count -
+          sync->sink->gl_ready_frame_count - 1u;
+      sync->sink->gl_ready_frame_count += diff;
+      GST_LOG ("gl_sync %p possible \'on_frame_available\' listener miss "
+          "detected, attempting to work around.  Jumping forward %u "
+          "frames for frame %u", sync, diff, sync->gl_frame_no);
+    }
+
+    GST_TRACE ("gl_sync %p release_output_buffer idx %u frame %u", sync,
+        sync->buffer_idx, sync->gl_frame_no);
+
+    /* Release the frame into the surface */
+    sync->sink->gl_released_frame_count++;
+    if (!gst_amc_codec_release_output_buffer (sync->sink->codec,
+            sync->buffer_idx, render, &error)) {
+      GST_ERROR_OBJECT (sync->sink,
+          "gl_sync %p Failed to render buffer, index %d frame %u", sync,
+          sync->buffer_idx, sync->gl_frame_no);
+      goto out;
+    }
+    sync->result->released = TRUE;
+    sync->result->rendered = render;
+  }
+
+out:
+  if (error) {
+    if (sync->sink->gl_error == NULL)
+      sync->sink->gl_error = error;
+    else
+      g_clear_error (&error);
+  }
+}
+
+static void
+_gl_sync_release_next_buffer (struct gl_sync *sync, gboolean render)
+{
+  GList *l;
+
+  if ((l = _find_gl_sync_for_frame (sync->sink, sync->gl_frame_no + 1))) {
+    struct gl_sync *next = l->data;
+
+    _gl_sync_release_buffer (next, render);
+  } else {
+    GST_TRACE ("gl_sync %p no next frame available", sync);
+  }
+}
+
+/* caller should remove from the gl_queue after calling this function.
+ * _gl_sync_release_buffer must be called before this function */
+static void
+_gl_sync_render_unlocked (struct gl_sync *sync)
+{
+  GstVideoAffineTransformationMeta *af_meta;
+  GError *error = NULL;
+  gfloat matrix[16];
+  gint64 ts = 0;
+
+  GST_TRACE ("gl_sync %p result %p render (updated:%u)", sync, sync->result,
+      sync->result->updated);
+
+  if (sync->result->updated || !sync->result->rendered)
+    return;
+
+  /* FIXME: if this ever starts returning valid values we should attempt
+   * to use it */
+  if (!gst_amc_surface_texture_get_timestamp (sync->surface->texture, &ts,
+          &error)) {
+    GST_ERROR_OBJECT (sync->sink, "Failed to update texture image");
+    GST_ELEMENT_ERROR_FROM_ERROR (sync->sink, error);
+    goto out;
+  }
+  GST_TRACE ("gl_sync %p rendering timestamp before update %" G_GINT64_FORMAT,
+      sync, ts);
+
+  GST_TRACE ("gl_sync %p update_tex_image", sync);
+  if (!gst_amc_surface_texture_update_tex_image (sync->surface->texture,
+          &error)) {
+    GST_ERROR_OBJECT (sync->sink, "Failed to update texture image");
+    GST_ELEMENT_ERROR_FROM_ERROR (sync->sink, error);
+    goto out;
+  }
+  GST_TRACE ("gl_sync result %p updated", sync->result);
+  sync->result->updated = TRUE;
+  sync->sink->gl_last_rendered_frame = sync->gl_frame_no;
+
+  if (!gst_amc_surface_texture_get_timestamp (sync->surface->texture, &ts,
+          &error)) {
+    GST_ERROR_OBJECT (sync->sink, "Failed to update texture image");
+    GST_ELEMENT_ERROR_FROM_ERROR (sync->sink, error);
+    goto out;
+  }
+  GST_TRACE ("gl_sync %p rendering timestamp after update %" G_GINT64_FORMAT,
+      sync, ts);
+
+  af_meta = gst_buffer_get_video_affine_transformation_meta (sync->buffer);
+  if (!af_meta) {
+    GST_WARNING ("Failed to retreive the transformation meta from the "
+        "gl_sync %p buffer %p", sync, sync->buffer);
+  } else if (gst_amc_surface_texture_get_transform_matrix (sync->surface->
+          texture, matrix, &error)) {
+
+    gst_video_affine_transformation_meta_apply_matrix (af_meta, matrix);
+    gst_video_affine_transformation_meta_apply_matrix (af_meta, yflip_matrix);
+  }
+
+  GST_LOG ("gl_sync %p successfully updated SurfaceTexture %p into "
+      "OES texture %u", sync, sync->surface->texture, sync->oes_mem->tex_id);
+
+out:
+  if (error) {
+    if (sync->sink->gl_error == NULL)
+      sync->sink->gl_error = error;
+    else
+      g_clear_error (&error);
+  }
+
+  _gl_sync_release_next_buffer (sync, TRUE);
+}
+
+static gboolean
+_amc_gl_possibly_wait_for_gl_sync (struct gl_sync *sync, gint64 end_time)
+{
+  GST_TRACE ("gl_sync %p waiting for frame %u current %u updated %u ", sync,
+      sync->gl_frame_no, sync->sink->gl_ready_frame_count,
+      sync->result->updated);
+
+  if ((gint) (sync->sink->gl_last_rendered_frame - sync->gl_frame_no) > 0) {
+    GST_ERROR ("gl_sync %p unsuccessfully waited for frame %u. out of order "
+        "wait detected", sync, sync->gl_frame_no);
+    return FALSE;
+  }
+
+  /* The number of frame callbacks (gl_ready_frame_count) is not a direct
+   * relationship with the number of pushed buffers (gl_pushed_frame_count)
+   * or even, the number of released buffers (gl_released_frame_count)
+   * as, from the frameworks/native/include/gui/ConsumerBase.h file,
+   *
+   *    "...frames that are queued while in asynchronous mode only trigger the
+   *    callback if no previous frames are pending."
+   *
+   * As a result, we need to advance the ready counter somehow ourselves when
+   * such events happen. There is no reliable way of knowing when/if the frame
+   * listener is going to fire.  The only uniqueu identifier,
+   * SurfaceTexture::get_timestamp seems to always return 0.
+   *
+   * The maximum queue size as defined in
+   * frameworks/native/include/gui/BufferQueue.h
+   * is 32 of which a maximum of 30 can be acquired at a time so we picked a
+   * number less than that to wait for before updating the ready frame count.
+   */
+
+  while (!sync->result->updated
+      && (gint) (sync->sink->gl_ready_frame_count - sync->gl_frame_no) < 0) {
+    /* The time limit is need otherwise when amc decides to not emit the
+     * frame listener (say, on orientation changes) we don't wait foreever */
+    if (end_time == -1 || !g_cond_wait_until (&sync->sink->gl_cond,
+            &sync->sink->gl_lock, end_time)) {
+      GST_LOG ("gl_sync %p unsuccessfully waited for frame %u", sync,
+          sync->gl_frame_no);
+      return FALSE;
+    }
+  }
+  GST_LOG ("gl_sync %p successfully waited for frame %u", sync,
+      sync->gl_frame_no);
+
+  return TRUE;
+}
+
+static gboolean
+_amc_gl_iterate_queue_unlocked (GstGLSyncMeta * sync_meta, gboolean wait)
+{
+  struct gl_sync *sync = sync_meta->data;
+  struct gl_sync *tmp;
+  gboolean ret = TRUE;
+  gint64 end_time;
+
+  while ((tmp = g_queue_peek_head (sync->sink->gl_queue))) {
+    /* skip frames that are ahead of the current wait frame */
+    if ((gint) (sync->gl_frame_no - tmp->gl_frame_no) < 0) {
+      GST_TRACE ("gl_sync %p frame %u is ahead of gl_sync %p frame %u", tmp,
+          tmp->gl_frame_no, sync, sync->gl_frame_no);
+      break;
+    }
+
+    _gl_sync_release_buffer (tmp, wait);
+
+    /* Frames are currently pushed in order and waits need to be performed
+     * in the same order */
+
+    end_time = 30 * G_TIME_SPAN_MILLISECOND + tmp->released_ts;
+    if (!_amc_gl_possibly_wait_for_gl_sync (tmp, end_time))
+      ret = FALSE;
+
+    _gl_sync_render_unlocked (tmp);
+
+    g_queue_pop_head (tmp->sink->gl_queue);
+    _gl_sync_unref (tmp);
+  }
+
+  return ret;
+}
+
+struct gl_wait
+{
+  GstGLSyncMeta *sync_meta;
+  gboolean ret;
+};
+
+static void
+_amc_gl_wait_gl (GstGLContext * context, struct gl_wait *wait)
+{
+  struct gl_sync *sync = wait->sync_meta->data;
+
+  g_mutex_lock (&sync->sink->gl_lock);
+  wait->ret = _amc_gl_iterate_queue_unlocked (wait->sync_meta, TRUE);
+  g_mutex_unlock (&sync->sink->gl_lock);
+}
+
+static void
+_amc_gl_wait (GstGLSyncMeta * sync_meta, GstGLContext * context)
+{
+  struct gl_sync *sync = sync_meta->data;
+  struct gl_wait wait;
+
+  wait.sync_meta = sync_meta;
+  wait.ret = FALSE;
+  gst_gl_context_thread_add (context,
+      (GstGLContextThreadFunc) _amc_gl_wait_gl, &wait);
+
+  if (!wait.ret)
+    GST_WARNING ("gl_sync %p could not wait for frame, took too long", sync);
+}
+
+static void
+_amc_gl_copy (GstGLSyncMeta * src, GstBuffer * sbuffer, GstGLSyncMeta * dest,
+    GstBuffer * dbuffer)
+{
+  struct gl_sync *sync = src->data;
+  struct gl_sync *tmp;
+
+  tmp = g_new0 (struct gl_sync, 1);
+
+  GST_TRACE ("copying gl_sync %p to %p", sync, tmp);
+
+  g_mutex_lock (&sync->sink->gl_lock);
+
+  tmp->refcount = 1;
+  tmp->sink = sync->sink;
+  tmp->buffer = dbuffer;
+  tmp->oes_mem = (GstGLMemory *) gst_memory_ref ((GstMemory *) sync->oes_mem);
+  tmp->surface = g_object_ref (sync->surface);
+  tmp->gl_frame_no = sync->gl_frame_no;
+  tmp->released_ts = sync->released_ts;
+  tmp->result = sync->result;
+  _gl_sync_result_ref (tmp->result);
+  dest->data = tmp;
+
+  g_mutex_unlock (&sync->sink->gl_lock);
+}
+
+static void
+_amc_gl_render_on_free (GstGLContext * context, GstGLSyncMeta * sync_meta)
+{
+  struct gl_sync *sync = sync_meta->data;
+
+  g_mutex_lock (&sync->sink->gl_lock);
+  /* just render as many frames as we have */
+  _amc_gl_iterate_queue_unlocked (sync_meta, FALSE);
+  g_mutex_unlock (&sync->sink->gl_lock);
+}
+
+static void
+_amc_gl_free (GstGLSyncMeta * sync_meta, GstGLContext * context)
+{
+  struct gl_sync *sync = sync_meta->data;
+
+  /* The wait render queue inside android is not very deep so when we drop
+   * frames we need to signal that we have rendered them if we have any chance
+   * of keeping up between the decoder, the android GL queue and downstream
+   * OpenGL. If we don't do this, once we start dropping frames downstream,
+   * it is very near to impossible for the pipeline to catch up. */
+  gst_gl_context_thread_add (context,
+      (GstGLContextThreadFunc) _amc_gl_render_on_free, sync_meta);
+  _gl_sync_unref (sync);
+}
+
 static void
 gst_amc_video_dec_loop (GstAmcVideoDec * self)
 {
@@ -595,6 +1188,7 @@
   GstAmcBufferInfo buffer_info;
   gint idx;
   GError *err = NULL;
+  gboolean release_buffer = TRUE;
 
   GST_VIDEO_DECODER_STREAM_LOCK (self);
 
@@ -612,6 +1206,8 @@
   GST_VIDEO_DECODER_STREAM_LOCK (self);
   /*} */
 
+  GST_DEBUG_OBJECT (self, "dequeueOutputBuffer() returned %d (0x%x)", idx, idx);
+
   if (idx < 0) {
     if (self->flushing) {
       g_clear_error (&err);
@@ -683,10 +1279,104 @@
           gst_video_decoder_get_max_decode_time (GST_VIDEO_DECODER (self),
               frame)) < 0) {
     GST_WARNING_OBJECT (self,
-        "Frame is too late, dropping (deadline %" GST_TIME_FORMAT ")",
-        GST_TIME_ARGS (-deadline));
+        "Frame is too late, dropping (deadline %" GST_STIME_FORMAT ")",
+        GST_STIME_ARGS (deadline));
     flow_ret = gst_video_decoder_drop_frame (GST_VIDEO_DECODER (self), frame);
-  } else if (!frame && buffer_info.size > 0) {
+  } else if (self->codec_config == AMC_CODEC_CONFIG_WITH_SURFACE) {
+    GstBuffer *outbuf;
+    GstGLSyncMeta *sync_meta;
+    GstVideoCodecState *state;
+    struct gl_sync *sync;
+    gboolean first_buffer = FALSE;
+
+    g_mutex_lock (&self->gl_lock);
+    if (self->gl_error) {
+      GST_ELEMENT_ERROR_FROM_ERROR (self, self->gl_error);
+      g_mutex_unlock (&self->gl_lock);
+      goto gl_output_error;
+    }
+    g_mutex_unlock (&self->gl_lock);
+
+    outbuf = gst_buffer_new ();
+
+    state = gst_video_decoder_get_output_state (GST_VIDEO_DECODER (self));
+
+    if (!self->oes_mem) {
+      GstGLBaseMemoryAllocator *base_mem_alloc;
+      GstGLVideoAllocationParams *params;
+
+      base_mem_alloc =
+          GST_GL_BASE_MEMORY_ALLOCATOR (gst_allocator_find
+          (GST_GL_MEMORY_ALLOCATOR_NAME));
+
+      params = gst_gl_video_allocation_params_new (self->gl_context, NULL,
+          &state->info, 0, NULL, GST_GL_TEXTURE_TARGET_EXTERNAL_OES);
+
+      self->oes_mem = (GstGLMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
+          (GstGLAllocationParams *) params);
+      gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
+      gst_object_unref (base_mem_alloc);
+
+      gst_gl_context_thread_add (self->gl_context,
+          (GstGLContextThreadFunc) _attach_mem_to_context, self);
+
+      first_buffer = TRUE;
+    }
+
+    gst_video_codec_state_unref (state);
+
+    gst_buffer_append_memory (outbuf,
+        gst_memory_ref ((GstMemory *) self->oes_mem));
+
+    sync = g_new0 (struct gl_sync, 1);
+    sync->refcount = 1;
+    sync->sink = self;
+    sync->buffer = outbuf;
+    sync->surface = g_object_ref (self->surface);
+    sync->oes_mem =
+        (GstGLMemory *) gst_memory_ref ((GstMemory *) self->oes_mem);
+    sync->buffer_idx = idx;
+    sync->result = g_new0 (struct gl_sync_result, 1);
+    sync->result->refcount = 1;
+    sync->result->updated = FALSE;
+
+    GST_TRACE ("new gl_sync %p result %p", sync, sync->result);
+
+    sync_meta = gst_buffer_add_gl_sync_meta_full (self->gl_context, outbuf,
+        sync);
+    sync_meta->set_sync = _amc_gl_set_sync;
+    sync_meta->wait = _amc_gl_wait;
+    sync_meta->copy = _amc_gl_copy;
+    sync_meta->free = _amc_gl_free;
+
+    /* The meta needs to be created now:
+     * Later (in _gl_sync_render_unlocked) the buffer will be locked.
+     */
+    gst_buffer_add_video_affine_transformation_meta (outbuf);
+
+    g_mutex_lock (&self->gl_lock);
+
+    self->gl_pushed_frame_count++;
+    sync->gl_frame_no = self->gl_pushed_frame_count;
+    g_queue_push_tail (self->gl_queue, _gl_sync_ref (sync));
+
+    if (first_buffer) {
+      _gl_sync_release_buffer (sync, TRUE);
+      if (self->gl_error) {
+        gst_buffer_unref (outbuf);
+        g_mutex_unlock (&self->gl_lock);
+        goto gl_output_error;
+      }
+    }
+    g_mutex_unlock (&self->gl_lock);
+
+    GST_DEBUG_OBJECT (self, "push GL frame %u", sync->gl_frame_no);
+    frame->output_buffer = outbuf;
+    flow_ret = gst_video_decoder_finish_frame (GST_VIDEO_DECODER (self), frame);
+
+    release_buffer = FALSE;
+  } else if (self->codec_config == AMC_CODEC_CONFIG_WITHOUT_SURFACE && !frame
+      && buffer_info.size > 0) {
     GstBuffer *outbuf;
 
     /* This sometimes happens at EOS or if the input is not properly framed,
@@ -700,7 +1390,7 @@
 
     if (!gst_amc_video_dec_fill_buffer (self, buf, &buffer_info, outbuf)) {
       gst_buffer_unref (outbuf);
-      if (!gst_amc_codec_release_output_buffer (self->codec, idx, &err))
+      if (!gst_amc_codec_release_output_buffer (self->codec, idx, FALSE, &err))
         GST_ERROR_OBJECT (self, "Failed to release output buffer index %d",
             idx);
       if (err && !self->flushing)
@@ -715,11 +1405,13 @@
         gst_util_uint64_scale (buffer_info.presentation_time_us, GST_USECOND,
         1);
     flow_ret = gst_pad_push (GST_VIDEO_DECODER_SRC_PAD (self), outbuf);
-  } else if (buffer_info.size > 0) {
-    if ((flow_ret = gst_video_decoder_allocate_output_frame (GST_VIDEO_DECODER
-                (self), frame)) != GST_FLOW_OK) {
+  } else if (self->codec_config == AMC_CODEC_CONFIG_WITHOUT_SURFACE && frame
+      && buffer_info.size > 0) {
+    if ((flow_ret =
+            gst_video_decoder_allocate_output_frame (GST_VIDEO_DECODER (self),
+                frame)) != GST_FLOW_OK) {
       GST_ERROR_OBJECT (self, "Failed to allocate buffer");
-      if (!gst_amc_codec_release_output_buffer (self->codec, idx, &err))
+      if (!gst_amc_codec_release_output_buffer (self->codec, idx, FALSE, &err))
         GST_ERROR_OBJECT (self, "Failed to release output buffer index %d",
             idx);
       if (err && !self->flushing)
@@ -734,7 +1426,7 @@
             frame->output_buffer)) {
       gst_buffer_replace (&frame->output_buffer, NULL);
       gst_video_decoder_drop_frame (GST_VIDEO_DECODER (self), frame);
-      if (!gst_amc_codec_release_output_buffer (self->codec, idx, &err))
+      if (!gst_amc_codec_release_output_buffer (self->codec, idx, FALSE, &err))
         GST_ERROR_OBJECT (self, "Failed to release output buffer index %d",
             idx);
       if (err && !self->flushing)
@@ -753,12 +1445,14 @@
   gst_amc_buffer_free (buf);
   buf = NULL;
 
-  if (!gst_amc_codec_release_output_buffer (self->codec, idx, &err)) {
-    if (self->flushing) {
-      g_clear_error (&err);
-      goto flushing;
+  if (release_buffer) {
+    if (!gst_amc_codec_release_output_buffer (self->codec, idx, FALSE, &err)) {
+      if (self->flushing) {
+        g_clear_error (&err);
+        goto flushing;
+      }
+      goto failed_release;
     }
-    goto failed_release;
   }
 
   if (is_eos || flow_ret == GST_FLOW_EOS) {
@@ -894,6 +1588,18 @@
     g_mutex_unlock (&self->drain_lock);
     return;
   }
+gl_output_error:
+  {
+    gst_pad_push_event (GST_VIDEO_DECODER_SRC_PAD (self), gst_event_new_eos ());
+    gst_pad_pause_task (GST_VIDEO_DECODER_SRC_PAD (self));
+    self->downstream_flow_ret = GST_FLOW_NOT_NEGOTIATED;
+    GST_VIDEO_DECODER_STREAM_UNLOCK (self);
+    g_mutex_lock (&self->drain_lock);
+    self->draining = FALSE;
+    g_cond_broadcast (&self->drain_cond);
+    g_mutex_unlock (&self->drain_lock);
+    return;
+  }
 }
 
 static gboolean
@@ -946,11 +1652,71 @@
   return TRUE;
 }
 
+static jobject
+gst_amc_video_dec_new_on_frame_available_listener (GstAmcVideoDec * decoder,
+    JNIEnv * env, GError ** err)
+{
+  jobject listener = NULL;
+  jclass listener_cls = NULL;
+  jmethodID constructor_id = 0;
+  jmethodID set_context_id = 0;
+
+  JNINativeMethod amcOnFrameAvailableListener = {
+    "native_onFrameAvailable",
+    "(JLandroid/graphics/SurfaceTexture;)V",
+    (void *) gst_amc_video_dec_on_frame_available,
+  };
+
+  listener_cls =
+      gst_amc_jni_get_application_class (env,
+      "org/freedesktop/gstreamer/androidmedia/GstAmcOnFrameAvailableListener",
+      err);
+  if (!listener_cls) {
+    return FALSE;
+  }
+
+  (*env)->RegisterNatives (env, listener_cls, &amcOnFrameAvailableListener, 1);
+  if ((*env)->ExceptionCheck (env)) {
+    (*env)->ExceptionClear (env);
+    goto done;
+  }
+
+  constructor_id =
+      gst_amc_jni_get_method_id (env, err, listener_cls, "<init>", "()V");
+  if (!constructor_id) {
+    goto done;
+  }
+
+  set_context_id =
+      gst_amc_jni_get_method_id (env, err, listener_cls, "setContext", "(J)V");
+  if (!set_context_id) {
+    goto done;
+  }
+
+  listener =
+      gst_amc_jni_new_object (env, err, TRUE, listener_cls, constructor_id);
+  if (!listener) {
+    goto done;
+  }
+
+  if (!gst_amc_jni_call_void_method (env, err, listener,
+          set_context_id, GST_AMC_VIDEO_DEC_TO_JLONG (decoder))) {
+    gst_amc_jni_object_unref (env, listener);
+    listener = NULL;
+  }
+
+done:
+  gst_amc_jni_object_unref (env, listener_cls);
+
+  return listener;
+}
+
 static gboolean
 gst_amc_video_dec_set_format (GstVideoDecoder * decoder,
     GstVideoCodecState * state)
 {
   GstAmcVideoDec *self;
+  GstAmcVideoDecClass *klass;
   GstAmcFormat *format;
   const gchar *mime;
   gboolean is_format_change = FALSE;
@@ -959,8 +1725,10 @@
   guint8 *codec_data = NULL;
   gsize codec_data_size = 0;
   GError *err = NULL;
+  jobject jsurface = NULL;
 
   self = GST_AMC_VIDEO_DEC (decoder);
+  klass = GST_AMC_VIDEO_DEC_GET_CLASS (self);
 
   GST_DEBUG_OBJECT (self, "Setting new caps %" GST_PTR_FORMAT, state->caps);
 
@@ -1052,6 +1820,140 @@
       GST_ELEMENT_WARNING_FROM_ERROR (self, err);
   }
 
+  {
+    gboolean downstream_supports_gl = FALSE;
+    GstVideoDecoder *decoder = GST_VIDEO_DECODER (self);
+    GstPad *src_pad = GST_VIDEO_DECODER_SRC_PAD (decoder);
+    GstCaps *templ_caps = gst_pad_get_pad_template_caps (src_pad);
+    GstCaps *downstream_caps = gst_pad_peer_query_caps (src_pad, templ_caps);
+
+    gst_caps_unref (templ_caps);
+
+    if (downstream_caps) {
+      guint i, n;
+      GstStaticCaps static_caps =
+          GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE_WITH_FEATURES
+          (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, "RGBA"));
+      GstCaps *gl_memory_caps = gst_static_caps_get (&static_caps);
+
+      GST_DEBUG_OBJECT (self, "Available downstream caps: %" GST_PTR_FORMAT,
+          downstream_caps);
+
+      /* Check if downstream caps supports
+       * video/x-raw(memory:GLMemory),format=RGBA */
+      n = gst_caps_get_size (downstream_caps);
+      for (i = 0; i < n; i++) {
+        GstCaps *caps = NULL;
+        GstStructure *structure = gst_caps_get_structure (downstream_caps, i);
+        GstCapsFeatures *features = gst_caps_get_features (downstream_caps, i);
+
+        caps = gst_caps_new_full (gst_structure_copy (structure), NULL);
+        if (!caps)
+          continue;
+
+        gst_caps_set_features (caps, 0, gst_caps_features_copy (features));
+
+        if (gst_caps_can_intersect (caps, gl_memory_caps)) {
+          downstream_supports_gl = TRUE;
+        }
+
+        gst_caps_unref (caps);
+        if (downstream_supports_gl)
+          break;
+      }
+
+      gst_caps_unref (gl_memory_caps);
+
+      /* If video/x-raw(memory:GLMemory),format=RGBA is supported,
+       * update the video decoder output state accordingly and negotiate */
+      if (downstream_supports_gl) {
+        GstVideoCodecState *output_state = NULL;
+        GstVideoCodecState *prev_output_state = NULL;
+
+        prev_output_state = gst_video_decoder_get_output_state (decoder);
+
+        output_state =
+            gst_video_decoder_set_output_state (decoder, GST_VIDEO_FORMAT_RGBA,
+            state->info.width, state->info.height, state);
+
+        if (output_state->caps) {
+          gst_caps_unref (output_state->caps);
+        }
+
+        output_state->caps = gst_video_info_to_caps (&output_state->info);
+        gst_caps_set_features (output_state->caps, 0,
+            gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, NULL));
+
+        /* gst_amc_video_dec_decide_allocation will update
+         * self->downstream_supports_gl */
+        if (!gst_video_decoder_negotiate (decoder)) {
+          GST_ERROR_OBJECT (self, "Failed to negotiate");
+
+          /* Rollback output state changes */
+          if (prev_output_state) {
+            output_state->info = prev_output_state->info;
+            gst_caps_replace (&output_state->caps, prev_output_state->caps);
+          } else {
+            gst_video_info_init (&output_state->info);
+            gst_caps_replace (&output_state->caps, NULL);
+          }
+        }
+        if (prev_output_state) {
+          gst_video_codec_state_unref (prev_output_state);
+        }
+      }
+    }
+  }
+
+  GST_INFO_OBJECT (self, "GL output: %s",
+      self->downstream_supports_gl ? "enabled" : "disabled");
+
+  if (klass->codec_info->gl_output_only && !self->downstream_supports_gl) {
+    GST_ERROR_OBJECT (self,
+        "Codec only supports GL output but downstream does not");
+    return FALSE;
+  }
+
+  if (self->downstream_supports_gl && self->surface) {
+    jsurface = self->surface->jobject;
+  } else if (self->downstream_supports_gl && !self->surface) {
+    int ret = TRUE;
+    JNIEnv *env = NULL;
+    jobject listener = NULL;
+    GstAmcSurfaceTexture *surface_texture = NULL;
+
+    env = gst_amc_jni_get_env ();
+    surface_texture = gst_amc_surface_texture_new (&err);
+    if (!surface_texture) {
+      GST_ELEMENT_ERROR_FROM_ERROR (self, err);
+      return FALSE;
+    }
+
+    listener =
+        gst_amc_video_dec_new_on_frame_available_listener (self, env, &err);
+    if (!listener) {
+      ret = FALSE;
+      goto done;
+    }
+
+    if (!gst_amc_surface_texture_set_on_frame_available_listener
+        (surface_texture, listener, &err)) {
+      ret = FALSE;
+      goto done;
+    }
+
+    self->surface = gst_amc_surface_new (surface_texture, &err);
+    jsurface = self->surface->jobject;
+
+  done:
+    g_object_unref (surface_texture);
+    gst_amc_jni_object_unref (env, listener);
+    if (!ret) {
+      GST_ELEMENT_ERROR_FROM_ERROR (self, err);
+      return FALSE;
+    }
+  }
+
   format_string = gst_amc_format_to_string (format, &err);
   if (err)
     GST_ELEMENT_WARNING_FROM_ERROR (self, err);
@@ -1059,11 +1961,16 @@
       GST_STR_NULL (format_string));
   g_free (format_string);
 
-  if (!gst_amc_codec_configure (self->codec, format, 0, &err)) {
+  if (!gst_amc_codec_configure (self->codec, format, jsurface, 0, &err)) {
     GST_ERROR_OBJECT (self, "Failed to configure codec");
     GST_ELEMENT_ERROR_FROM_ERROR (self, err);
     return FALSE;
   }
+  if (jsurface) {
+    self->codec_config = AMC_CODEC_CONFIG_WITH_SURFACE;
+  } else {
+    self->codec_config = AMC_CODEC_CONFIG_WITHOUT_SURFACE;
+  }
 
   gst_amc_format_free (format);
 
@@ -1253,9 +2160,9 @@
 
     offset += buffer_info.size;
     GST_DEBUG_OBJECT (self,
-        "Queueing buffer %d: size %d time %" G_GINT64_FORMAT " flags 0x%08x",
-        idx, buffer_info.size, buffer_info.presentation_time_us,
-        buffer_info.flags);
+        "Queueing buffer %d: size %d time %" G_GINT64_FORMAT
+        " flags 0x%08x", idx, buffer_info.size,
+        buffer_info.presentation_time_us, buffer_info.flags);
     if (!gst_amc_codec_queue_input_buffer (self->codec, idx, &buffer_info,
             &err)) {
       if (self->flushing) {
@@ -1413,25 +2320,176 @@
 }
 
 static gboolean
+gst_amc_video_dec_src_query (GstVideoDecoder * bdec, GstQuery * query)
+{
+  GstAmcVideoDec *self = GST_AMC_VIDEO_DEC (bdec);
+  gboolean ret;
+
+  switch (GST_QUERY_TYPE (query)) {
+    case GST_QUERY_CONTEXT:
+    {
+      const gchar *context_type;
+      GstContext *context, *old_context;
+
+      ret = gst_gl_handle_context_query ((GstElement *) self, query,
+          &self->gl_display, &self->other_gl_context);
+      gst_query_parse_context_type (query, &context_type);
+
+      if (g_strcmp0 (context_type, "gst.gl.local_context") == 0) {
+        GstStructure *s;
+
+        gst_query_parse_context (query, &old_context);
+
+        if (old_context)
+          context = gst_context_copy (old_context);
+        else
+          context = gst_context_new ("gst.gl.local_context", FALSE);
+
+        s = gst_context_writable_structure (context);
+        gst_structure_set (s, "context", GST_GL_TYPE_CONTEXT, self->gl_context,
+            NULL);
+        gst_query_set_context (query, context);
+        gst_context_unref (context);
+
+        ret = self->gl_context != NULL;
+      }
+      GST_LOG_OBJECT (self, "context query of type %s %i", context_type, ret);
+
+      if (ret)
+        return ret;
+
+      break;
+    }
+    default:
+      break;
+  }
+
+  return GST_VIDEO_DECODER_CLASS (parent_class)->src_query (bdec, query);
+}
+
+static gboolean
+_caps_are_rgba_with_gl_memory (GstCaps * caps)
+{
+  GstVideoInfo info;
+  GstCapsFeatures *features;
+
+  if (!caps)
+    return FALSE;
+
+  if (!gst_video_info_from_caps (&info, caps))
+    return FALSE;
+
+  if (info.finfo->format != GST_VIDEO_FORMAT_RGBA)
+    return FALSE;
+
+  if (!(features = gst_caps_get_features (caps, 0)))
+    return FALSE;
+
+  return gst_caps_features_contains (features,
+      GST_CAPS_FEATURE_MEMORY_GL_MEMORY);
+}
+
+static gboolean
+_find_local_gl_context (GstAmcVideoDec * self)
+{
+  GstQuery *query;
+  GstContext *context;
+  const GstStructure *s;
+
+  if (self->gl_context)
+    return TRUE;
+
+  query = gst_query_new_context ("gst.gl.local_context");
+  if (!self->gl_context
+      && gst_gl_run_query (GST_ELEMENT (self), query, GST_PAD_SRC)) {
+    gst_query_parse_context (query, &context);
+    if (context) {
+      s = gst_context_get_structure (context);
+      gst_structure_get (s, "context", GST_GL_TYPE_CONTEXT, &self->gl_context,
+          NULL);
+    }
+  }
+
+  GST_DEBUG_OBJECT (self, "found local context %p", self->gl_context);
+
+  gst_query_unref (query);
+
+  if (self->gl_context)
+    return TRUE;
+
+  return FALSE;
+}
+
+static gboolean
 gst_amc_video_dec_decide_allocation (GstVideoDecoder * bdec, GstQuery * query)
 {
-  GstBufferPool *pool;
-  GstStructure *config;
+  GstAmcVideoDec *self = GST_AMC_VIDEO_DEC (bdec);
+  gboolean need_pool = FALSE;
+  GstCaps *caps = NULL;
+//  GError *error = NULL;
 
   if (!GST_VIDEO_DECODER_CLASS (parent_class)->decide_allocation (bdec, query))
     return FALSE;
 
-  g_assert (gst_query_get_n_allocation_pools (query) > 0);
-  gst_query_parse_nth_allocation_pool (query, 0, &pool, NULL, NULL, NULL);
-  g_assert (pool != NULL);
+  self->downstream_supports_gl = FALSE;
+  gst_query_parse_allocation (query, &caps, &need_pool);
+  if (_caps_are_rgba_with_gl_memory (caps)) {
 
-  config = gst_buffer_pool_get_config (pool);
-  if (gst_query_find_allocation_meta (query, GST_VIDEO_META_API_TYPE, NULL)) {
-    gst_buffer_pool_config_add_option (config,
-        GST_BUFFER_POOL_OPTION_VIDEO_META);
+    if (!gst_gl_ensure_element_data (self, &self->gl_display,
+            &self->other_gl_context))
+      return FALSE;
+
+    if (!_find_local_gl_context (self))
+      goto out;
+#if 0
+    if (!self->gl_context) {
+      GST_OBJECT_LOCK (self->gl_display);
+      do {
+        if (self->gl_context) {
+          gst_object_unref (self->gl_context);
+          self->gl_context = NULL;
+        }
+        /* just get a GL context.  we don't care */
+        self->gl_context =
+            gst_gl_display_get_gl_context_for_thread (self->gl_display, NULL);
+        if (!self->gl_context) {
+          if (!gst_gl_display_create_context (self->gl_display,
+                  self->other_gl_context, &self->gl_context, &error)) {
+            GST_OBJECT_UNLOCK (mix->display);
+            goto context_error;
+          }
+        }
+      } while (!gst_gl_display_add_context (self->gl_display,
+              self->gl_context));
+      GST_OBJECT_UNLOCK (self->gl_display);
+    }
+#endif
+
+    self->downstream_supports_gl = TRUE;
   }
-  gst_buffer_pool_set_config (pool, config);
-  gst_object_unref (pool);
 
-  return TRUE;
+out:
+  return gst_amc_video_dec_check_codec_config (self);
+#if 0
+context_error:
+  {
+    GST_ELEMENT_ERROR (self, RESOURCE, NOT_FOUND, ("%s", error->message),
+        (NULL));
+    g_clear_error (&error);
+    return FALSE;
+  }
+#endif
+}
+
+static void
+gst_amc_video_dec_on_frame_available (JNIEnv * env, jobject thiz,
+    long long context, jobject surfaceTexture)
+{
+  GstAmcVideoDec *self = JLONG_TO_GST_AMC_VIDEO_DEC (context);
+
+  g_mutex_lock (&self->gl_lock);
+  self->gl_ready_frame_count++;
+  GST_LOG_OBJECT (self, "frame %u available", self->gl_ready_frame_count);
+  g_cond_broadcast (&self->gl_cond);
+  g_mutex_unlock (&self->gl_lock);
 }
diff --git a/sys/androidmedia/gstamcvideodec.h b/sys/androidmedia/gstamcvideodec.h
index c6c2b4f..eca39fe 100644
--- a/sys/androidmedia/gstamcvideodec.h
+++ b/sys/androidmedia/gstamcvideodec.h
@@ -22,10 +22,12 @@
 #define __GST_AMC_VIDEO_DEC_H__
 
 #include <gst/gst.h>
+#include <gst/gl/gl.h>
 
 #include <gst/video/gstvideodecoder.h>
 
 #include "gstamc.h"
+#include "gstamcsurface.h"
 
 G_BEGIN_DECLS
 
@@ -44,6 +46,14 @@
 
 typedef struct _GstAmcVideoDec GstAmcVideoDec;
 typedef struct _GstAmcVideoDecClass GstAmcVideoDecClass;
+typedef enum _GstAmcCodecConfig GstAmcCodecConfig;
+
+enum _GstAmcCodecConfig
+{
+  AMC_CODEC_CONFIG_NONE,
+  AMC_CODEC_CONFIG_WITH_SURFACE,
+  AMC_CODEC_CONFIG_WITHOUT_SURFACE,
+};
 
 struct _GstAmcVideoDec
 {
@@ -51,6 +61,7 @@
 
   /* < private > */
   GstAmcCodec *codec;
+  GstAmcCodecConfig codec_config;
 
   GstVideoCodecState *input_state;
   gboolean input_state_changed;
@@ -59,6 +70,10 @@
   GstVideoFormat format;
   GstAmcColorFormatInfo color_format_info;
 
+  /* Output dimensions */
+  guint width;
+  guint height;
+
   guint8 *codec_data;
   gsize codec_data_size;
   /* TRUE if the component is configured and saw
@@ -76,7 +91,25 @@
   /* TRUE if the component is drained currently */
   gboolean drained;
 
+  GstAmcSurface *surface;
+
+  GstGLDisplay *gl_display;
+  GstGLContext *gl_context;
+  GstGLContext *other_gl_context;
+
+  gboolean downstream_supports_gl;
   GstFlowReturn downstream_flow_ret;
+
+  gboolean gl_mem_attached;
+  GstGLMemory *oes_mem;
+  GError *gl_error;
+  GMutex gl_lock;
+  GCond gl_cond;
+  guint gl_last_rendered_frame;
+  guint gl_pushed_frame_count; /* n buffers pushed */
+  guint gl_ready_frame_count;  /* n buffers ready for GL access */
+  guint gl_released_frame_count;  /* n buffers released */
+  GQueue *gl_queue;
 };
 
 struct _GstAmcVideoDecClass
diff --git a/sys/androidmedia/gstamcvideoenc.c b/sys/androidmedia/gstamcvideoenc.c
index 4a42a30..5198fe6 100644
--- a/sys/androidmedia/gstamcvideoenc.c
+++ b/sys/androidmedia/gstamcvideoenc.c
@@ -1032,7 +1032,7 @@
   gst_amc_buffer_free (buf);
   buf = NULL;
 
-  if (!gst_amc_codec_release_output_buffer (self->codec, idx, &err)) {
+  if (!gst_amc_codec_release_output_buffer (self->codec, idx, FALSE, &err)) {
     if (self->flushing) {
       g_clear_error (&err);
       goto flushing;
@@ -1291,7 +1291,7 @@
       GST_STR_NULL (format_string));
   g_free (format_string);
 
-  if (!gst_amc_codec_configure (self->codec, format, 1, &err)) {
+  if (!gst_amc_codec_configure (self->codec, format, NULL, 1, &err)) {
     GST_ERROR_OBJECT (self, "Failed to configure codec");
     GST_ELEMENT_ERROR_FROM_ERROR (self, err);
     goto quit;
@@ -1525,8 +1525,9 @@
 buffer_fill_error:
   {
     GST_ELEMENT_ERROR (self, RESOURCE, WRITE, (NULL),
-        ("Failed to write input into the amc buffer(write %dB to a %dB buffer)",
-            self->color_format_info.frame_size, buf->size));
+        ("Failed to write input into the amc buffer(write %dB to a %"
+            G_GSIZE_FORMAT "B buffer)", self->color_format_info.frame_size,
+            buf->size));
     gst_video_codec_frame_unref (frame);
     return GST_FLOW_ERROR;
   }
diff --git a/sys/androidmedia/gstjniutils.c b/sys/androidmedia/gstjniutils.c
index f936027..7861002 100644
--- a/sys/androidmedia/gstjniutils.c
+++ b/sys/androidmedia/gstjniutils.c
@@ -41,6 +41,7 @@
 static JavaVM *java_vm;
 static gboolean started_java_vm = FALSE;
 static pthread_key_t current_jni_env;
+static jobject (*get_class_loader) (void);
 
 static struct
 {
@@ -211,12 +212,16 @@
 void
 gst_amc_jni_object_unref (JNIEnv * env, jobject object)
 {
+  g_return_if_fail (object != NULL);
+
   (*env)->DeleteGlobalRef (env, object);
 }
 
 void
 gst_amc_jni_object_local_unref (JNIEnv * env, jobject object)
 {
+  g_return_if_fail (object != NULL);
+
   (*env)->DeleteLocalRef (env, object);
 }
 
@@ -560,6 +565,26 @@
 }
 
 static gboolean
+check_application_class_loader (void)
+{
+  gboolean ret = TRUE;
+  GModule *module = NULL;
+
+  module = g_module_open (NULL, G_MODULE_BIND_LOCAL);
+  if (!module) {
+    return FALSE;
+  }
+  if (!g_module_symbol (module, "gst_android_get_application_class_loader",
+          (gpointer *) & get_class_loader)) {
+    ret = FALSE;
+  }
+
+  g_module_close (module);
+
+  return ret;
+}
+
+static gboolean
 initialize_classes (void)
 {
   JNIEnv *env;
@@ -619,6 +644,11 @@
     return FALSE;
   }
 
+  if (!check_application_class_loader ()) {
+    GST_ERROR ("Could not find application class loader provider");
+    return FALSE;
+  }
+
   return TRUE;
 }
 
@@ -798,6 +828,57 @@
   return started_java_vm;
 }
 
+jclass
+gst_amc_jni_get_application_class (JNIEnv * env, const gchar * name,
+    GError ** err)
+{
+  jclass tmp = NULL;
+  jclass class = NULL;
+  jstring name_jstr = NULL;
+
+  jobject class_loader = NULL;
+  jclass class_loader_cls = NULL;
+  jmethodID load_class_id = 0;
+
+
+  class_loader = get_class_loader ();
+  if (!class_loader) {
+    g_set_error (err, GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED,
+        "Could not retreive application class loader");
+    goto done;
+  }
+
+  class_loader_cls = (*env)->GetObjectClass (env, class_loader);
+  if (!class_loader_cls) {
+    g_set_error (err, GST_LIBRARY_ERROR, GST_LIBRARY_ERROR_FAILED,
+        "Could not retreive application class loader java class");
+    goto done;
+  }
+
+  load_class_id =
+      gst_amc_jni_get_method_id (env, err, class_loader_cls, "loadClass",
+      "(Ljava/lang/String;)Ljava/lang/Class;");
+  if (!class_loader_cls) {
+    goto done;
+  }
+
+  name_jstr = gst_amc_jni_string_from_gchar (env, err, FALSE, name);
+  if (!name_jstr) {
+    goto done;
+  }
+
+  if (gst_amc_jni_call_object_method (env, err, class_loader,
+          load_class_id, &tmp, name_jstr)) {
+    class = gst_amc_jni_object_make_global (env, tmp);
+  }
+
+done:
+  gst_amc_jni_object_local_unref (env, name_jstr);
+  gst_amc_jni_object_local_unref (env, class_loader_cls);
+
+  return class;
+}
+
 #define CALL_STATIC_TYPE_METHOD(_type, _name,  _jname)                                                     \
 gboolean gst_amc_jni_call_static_##_name##_method (JNIEnv *env, GError ** err, jclass klass, jmethodID methodID, _type * value, ...)   \
   {                                                                                                          \
diff --git a/sys/androidmedia/gstjniutils.h b/sys/androidmedia/gstjniutils.h
index a6bc68a..c323cf8 100644
--- a/sys/androidmedia/gstjniutils.h
+++ b/sys/androidmedia/gstjniutils.h
@@ -107,6 +107,10 @@
 
 JNIEnv *gst_amc_jni_get_env                  (void);
 
+jclass gst_amc_jni_get_application_class     (JNIEnv * env,
+                                             const gchar * name,
+                                             GError ** err);
+
 #define DEF_CALL_STATIC_TYPE_METHOD(_type, _name,  _jname, _retval) \
 gboolean gst_amc_jni_call_static_##_name##_method (JNIEnv *env, GError ** err, jclass klass, jmethodID methodID, _type * value, ...)
 
diff --git a/sys/applemedia-nonpublic/Makefile.in b/sys/applemedia-nonpublic/Makefile.in
index a473079..a898639 100644
--- a/sys/applemedia-nonpublic/Makefile.in
+++ b/sys/applemedia-nonpublic/Makefile.in
@@ -316,6 +316,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -353,6 +355,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -380,6 +384,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -398,6 +404,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -408,6 +416,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -433,6 +443,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -458,6 +470,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -589,6 +603,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -646,8 +662,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -717,6 +737,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/applemedia/Makefile.am b/sys/applemedia/Makefile.am
index 34a0169..c95b059 100644
--- a/sys/applemedia/Makefile.am
+++ b/sys/applemedia/Makefile.am
@@ -5,7 +5,7 @@
 	vtutil.c				\
 	corevideobuffer.c			\
 	coremediabuffer.c			\
-	corevideotexturecache.m 		\
+	videotexturecache.m 		\
 	atdec.c
 
 libgstapplemedia_la_CPPFLAGS =			\
@@ -22,10 +22,18 @@
 	$(GST_BASE_CFLAGS)			\
 	$(GST_PLUGINS_BASE_CFLAGS)
 
+if HAVE_IOS
+GST_OBJCFLAGS_WITH_VERSION = $(GST_OBJCFLAGS)
+else
+# Add min version in front so the user or cerbero can override it since it
+# always picks the last occurence when passing several -mmacosx-version-min.
+GST_OBJCFLAGS_WITH_VERSION = -mmacosx-version-min=10.8 $(GST_OBJCFLAGS)
+endif
+
 libgstapplemedia_la_OBJCFLAGS =			\
 	-I$(top_srcdir)/gst-libs                \
 	-I$(top_builddir)/gst-libs              \
-	$(GST_OBJCFLAGS)			\
+	$(GST_OBJCFLAGS_WITH_VERSION)		\
 	$(GST_BASE_CFLAGS)			\
 	$(GST_PLUGINS_BASE_CFLAGS)
 
@@ -62,7 +70,7 @@
 	vtutil.h				\
 	corevideobuffer.h			\
 	coremediabuffer.h			\
-	corevideotexturecache.h			\
+	videotexturecache.h			\
 	atdec.h 				\
 	iosassetsrc.h				\
 	avfassetsrc.h
@@ -79,11 +87,13 @@
 else
 
 libgstapplemedia_la_SOURCES +=			\
-	qtkitvideosrc.m
+	qtkitvideosrc.m 					\
+	iosurfacememory.c
 
 libgstapplemedia_la_LDFLAGS +=			\
 	-Wl,-framework -Wl,Cocoa		\
-	-Wl,-framework -Wl,QTKit
+	-Wl,-framework -Wl,QTKit		\
+	-Wl,-framework -Wl,IOSurface
 
 endif
 
diff --git a/sys/applemedia/Makefile.in b/sys/applemedia/Makefile.in
index e4d57c5..7d4155b 100644
--- a/sys/applemedia/Makefile.in
+++ b/sys/applemedia/Makefile.in
@@ -99,11 +99,13 @@
 @HAVE_IOS_TRUE@	-Wl,-framework -Wl,AssetsLibrary
 
 @HAVE_IOS_FALSE@am__append_4 = \
-@HAVE_IOS_FALSE@	qtkitvideosrc.m
+@HAVE_IOS_FALSE@	qtkitvideosrc.m 					\
+@HAVE_IOS_FALSE@	iosurfacememory.c
 
 @HAVE_IOS_FALSE@am__append_5 = \
 @HAVE_IOS_FALSE@	-Wl,-framework -Wl,Cocoa		\
-@HAVE_IOS_FALSE@	-Wl,-framework -Wl,QTKit
+@HAVE_IOS_FALSE@	-Wl,-framework -Wl,QTKit		\
+@HAVE_IOS_FALSE@	-Wl,-framework -Wl,IOSurface
 
 @HAVE_AVFOUNDATION_TRUE@am__append_6 = \
 @HAVE_AVFOUNDATION_TRUE@	avfvideosrc.m				\
@@ -196,11 +198,13 @@
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1)
 am__libgstapplemedia_la_SOURCES_DIST = plugin.m vtutil.c \
-	corevideobuffer.c coremediabuffer.c corevideotexturecache.m \
-	atdec.c iosassetsrc.m qtkitvideosrc.m avfvideosrc.m \
-	avfassetsrc.m avsamplevideosink.m vtenc.c vtdec.c
+	corevideobuffer.c coremediabuffer.c videotexturecache.m \
+	atdec.c iosassetsrc.m qtkitvideosrc.m iosurfacememory.c \
+	avfvideosrc.m avfassetsrc.m avsamplevideosink.m vtenc.c \
+	vtdec.c
 @HAVE_IOS_TRUE@am__objects_1 = libgstapplemedia_la-iosassetsrc.lo
-@HAVE_IOS_FALSE@am__objects_2 = libgstapplemedia_la-qtkitvideosrc.lo
+@HAVE_IOS_FALSE@am__objects_2 = libgstapplemedia_la-qtkitvideosrc.lo \
+@HAVE_IOS_FALSE@	libgstapplemedia_la-iosurfacememory.lo
 @HAVE_AVFOUNDATION_TRUE@am__objects_3 =  \
 @HAVE_AVFOUNDATION_TRUE@	libgstapplemedia_la-avfvideosrc.lo \
 @HAVE_AVFOUNDATION_TRUE@	libgstapplemedia_la-avfassetsrc.lo \
@@ -211,7 +215,7 @@
 	libgstapplemedia_la-vtutil.lo \
 	libgstapplemedia_la-corevideobuffer.lo \
 	libgstapplemedia_la-coremediabuffer.lo \
-	libgstapplemedia_la-corevideotexturecache.lo \
+	libgstapplemedia_la-videotexturecache.lo \
 	libgstapplemedia_la-atdec.lo $(am__objects_1) $(am__objects_2) \
 	$(am__objects_3) $(am__objects_4)
 libgstapplemedia_la_OBJECTS = $(am_libgstapplemedia_la_OBJECTS)
@@ -339,6 +343,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -376,6 +382,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -403,6 +411,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -421,6 +431,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -431,6 +443,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -456,6 +470,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -481,6 +497,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -612,6 +630,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -669,8 +689,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -740,6 +764,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -828,9 +853,8 @@
 wayland_scanner = @wayland_scanner@
 plugin_LTLIBRARIES = libgstapplemedia.la
 libgstapplemedia_la_SOURCES = plugin.m vtutil.c corevideobuffer.c \
-	coremediabuffer.c corevideotexturecache.m atdec.c \
-	$(am__append_2) $(am__append_4) $(am__append_6) \
-	$(am__append_8)
+	coremediabuffer.c videotexturecache.m atdec.c $(am__append_2) \
+	$(am__append_4) $(am__append_6) $(am__append_8)
 libgstapplemedia_la_CPPFLAGS = \
 	-Dgst_core_media_buffer_new=gst_core_media_buffer_priv_new		\
 	-Dgst_core_media_buffer_get_type=gst_core_media_buffer_priv_get_type	\
@@ -845,9 +869,13 @@
 	$(GST_BASE_CFLAGS)			\
 	$(GST_PLUGINS_BASE_CFLAGS)
 
+# Add min version in front so the user or cerbero can override it since it
+# always picks the last occurence when passing several -mmacosx-version-min.
+@HAVE_IOS_FALSE@GST_OBJCFLAGS_WITH_VERSION = -mmacosx-version-min=10.8 $(GST_OBJCFLAGS)
+@HAVE_IOS_TRUE@GST_OBJCFLAGS_WITH_VERSION = $(GST_OBJCFLAGS)
 libgstapplemedia_la_OBJCFLAGS = -I$(top_srcdir)/gst-libs \
-	-I$(top_builddir)/gst-libs $(GST_OBJCFLAGS) $(GST_BASE_CFLAGS) \
-	$(GST_PLUGINS_BASE_CFLAGS) $(am__append_1)
+	-I$(top_builddir)/gst-libs $(GST_OBJCFLAGS_WITH_VERSION) \
+	$(GST_BASE_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(am__append_1)
 libgstapplemedia_la_LIBADD = \
 	$(top_builddir)/gst-libs/gst/gl/libgstgl-$(GST_API_VERSION).la 	\
 	$(GST_BASE_LIBS)						\
@@ -872,7 +900,7 @@
 	vtutil.h				\
 	corevideobuffer.h			\
 	coremediabuffer.h			\
-	corevideotexturecache.h			\
+	videotexturecache.h			\
 	atdec.h 				\
 	iosassetsrc.h				\
 	avfassetsrc.h
@@ -961,10 +989,11 @@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_la-avsamplevideosink.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_la-coremediabuffer.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_la-corevideobuffer.Plo@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_la-corevideotexturecache.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_la-iosassetsrc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_la-iosurfacememory.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_la-plugin.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_la-qtkitvideosrc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_la-videotexturecache.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_la-vtdec.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_la-vtenc.Plo@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstapplemedia_la-vtutil.Plo@am__quote@
@@ -1021,6 +1050,13 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapplemedia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_la_CFLAGS) $(CFLAGS) -c -o libgstapplemedia_la-atdec.lo `test -f 'atdec.c' || echo '$(srcdir)/'`atdec.c
 
+libgstapplemedia_la-iosurfacememory.lo: iosurfacememory.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapplemedia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_la_CFLAGS) $(CFLAGS) -MT libgstapplemedia_la-iosurfacememory.lo -MD -MP -MF $(DEPDIR)/libgstapplemedia_la-iosurfacememory.Tpo -c -o libgstapplemedia_la-iosurfacememory.lo `test -f 'iosurfacememory.c' || echo '$(srcdir)/'`iosurfacememory.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstapplemedia_la-iosurfacememory.Tpo $(DEPDIR)/libgstapplemedia_la-iosurfacememory.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='iosurfacememory.c' object='libgstapplemedia_la-iosurfacememory.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapplemedia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_la_CFLAGS) $(CFLAGS) -c -o libgstapplemedia_la-iosurfacememory.lo `test -f 'iosurfacememory.c' || echo '$(srcdir)/'`iosurfacememory.c
+
 libgstapplemedia_la-vtenc.lo: vtenc.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstapplemedia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_la_CFLAGS) $(CFLAGS) -MT libgstapplemedia_la-vtenc.lo -MD -MP -MF $(DEPDIR)/libgstapplemedia_la-vtenc.Tpo -c -o libgstapplemedia_la-vtenc.lo `test -f 'vtenc.c' || echo '$(srcdir)/'`vtenc.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstapplemedia_la-vtenc.Tpo $(DEPDIR)/libgstapplemedia_la-vtenc.Plo
@@ -1066,12 +1102,12 @@
 @AMDEP_TRUE@@am__fastdepOBJC_FALSE@	DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepOBJC_FALSE@	$(AM_V_OBJC@am__nodep@)$(LIBTOOL) $(AM_V_lt) $(libgstapplemedia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_la_OBJCFLAGS) $(OBJCFLAGS) -c -o libgstapplemedia_la-plugin.lo `test -f 'plugin.m' || echo '$(srcdir)/'`plugin.m
 
-libgstapplemedia_la-corevideotexturecache.lo: corevideotexturecache.m
-@am__fastdepOBJC_TRUE@	$(AM_V_OBJC)$(LIBTOOL) $(AM_V_lt) $(libgstapplemedia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_la_OBJCFLAGS) $(OBJCFLAGS) -MT libgstapplemedia_la-corevideotexturecache.lo -MD -MP -MF $(DEPDIR)/libgstapplemedia_la-corevideotexturecache.Tpo -c -o libgstapplemedia_la-corevideotexturecache.lo `test -f 'corevideotexturecache.m' || echo '$(srcdir)/'`corevideotexturecache.m
-@am__fastdepOBJC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstapplemedia_la-corevideotexturecache.Tpo $(DEPDIR)/libgstapplemedia_la-corevideotexturecache.Plo
-@AMDEP_TRUE@@am__fastdepOBJC_FALSE@	$(AM_V_OBJC)source='corevideotexturecache.m' object='libgstapplemedia_la-corevideotexturecache.lo' libtool=yes @AMDEPBACKSLASH@
+libgstapplemedia_la-videotexturecache.lo: videotexturecache.m
+@am__fastdepOBJC_TRUE@	$(AM_V_OBJC)$(LIBTOOL) $(AM_V_lt) $(libgstapplemedia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_la_OBJCFLAGS) $(OBJCFLAGS) -MT libgstapplemedia_la-videotexturecache.lo -MD -MP -MF $(DEPDIR)/libgstapplemedia_la-videotexturecache.Tpo -c -o libgstapplemedia_la-videotexturecache.lo `test -f 'videotexturecache.m' || echo '$(srcdir)/'`videotexturecache.m
+@am__fastdepOBJC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstapplemedia_la-videotexturecache.Tpo $(DEPDIR)/libgstapplemedia_la-videotexturecache.Plo
+@AMDEP_TRUE@@am__fastdepOBJC_FALSE@	$(AM_V_OBJC)source='videotexturecache.m' object='libgstapplemedia_la-videotexturecache.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepOBJC_FALSE@	DEPDIR=$(DEPDIR) $(OBJCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepOBJC_FALSE@	$(AM_V_OBJC@am__nodep@)$(LIBTOOL) $(AM_V_lt) $(libgstapplemedia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_la_OBJCFLAGS) $(OBJCFLAGS) -c -o libgstapplemedia_la-corevideotexturecache.lo `test -f 'corevideotexturecache.m' || echo '$(srcdir)/'`corevideotexturecache.m
+@am__fastdepOBJC_FALSE@	$(AM_V_OBJC@am__nodep@)$(LIBTOOL) $(AM_V_lt) $(libgstapplemedia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_la_OBJCFLAGS) $(OBJCFLAGS) -c -o libgstapplemedia_la-videotexturecache.lo `test -f 'videotexturecache.m' || echo '$(srcdir)/'`videotexturecache.m
 
 libgstapplemedia_la-iosassetsrc.lo: iosassetsrc.m
 @am__fastdepOBJC_TRUE@	$(AM_V_OBJC)$(LIBTOOL) $(AM_V_lt) $(libgstapplemedia_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(OBJC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libgstapplemedia_la_CPPFLAGS) $(CPPFLAGS) $(libgstapplemedia_la_OBJCFLAGS) $(OBJCFLAGS) -MT libgstapplemedia_la-iosassetsrc.lo -MD -MP -MF $(DEPDIR)/libgstapplemedia_la-iosassetsrc.Tpo -c -o libgstapplemedia_la-iosassetsrc.lo `test -f 'iosassetsrc.m' || echo '$(srcdir)/'`iosassetsrc.m
diff --git a/sys/applemedia/atdec.c b/sys/applemedia/atdec.c
index d581fb8..c00f0b7 100644
--- a/sys/applemedia/atdec.c
+++ b/sys/applemedia/atdec.c
@@ -24,7 +24,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v filesrc location=file.mov ! qtdemux ! queue ! aacparse ! atdec ! autoaudiosink
+ * gst-launch-1.0 -v filesrc location=file.mov ! qtdemux ! queue ! aacparse ! atdec ! autoaudiosink
  * ]|
  * Decode aac audio from a mov file
  * </refsect2>
diff --git a/sys/applemedia/avfassetsrc.m b/sys/applemedia/avfassetsrc.m
index 0aaf3ad..38b986c 100644
--- a/sys/applemedia/avfassetsrc.m
+++ b/sys/applemedia/avfassetsrc.m
@@ -29,7 +29,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v -m avfassetsrc uri="file://movie.mp4" ! autovideosink
+ * gst-launch-1.0 -v -m avfassetsrc uri="file://movie.mp4" ! autovideosink
  * ]|
  * </refsect2>
  */
@@ -208,9 +208,7 @@
 
   switch (prop_id) {
     case PROP_URI:
-      if (self->uri) {
-        g_free (self->uri);
-      }
+      g_free (self->uri);
       self->uri = g_value_dup_string (value);
       break;
     default:
@@ -820,9 +818,7 @@
 
   if (asset.playable) {
     ret = TRUE;
-    if (self->uri) {
-      g_free (self->uri);
-    }
+    g_free (self->uri);
     self->uri = g_strdup (uri);
   } else {
     g_set_error (error, GST_URI_ERROR, GST_URI_ERROR_BAD_URI,
diff --git a/sys/applemedia/avfvideosrc.m b/sys/applemedia/avfvideosrc.m
index a033ac0..075adff 100644
--- a/sys/applemedia/avfvideosrc.m
+++ b/sys/applemedia/avfvideosrc.m
@@ -30,7 +30,7 @@
 #include <gst/video/video.h>
 #include <gst/gl/gstglcontext.h>
 #include "coremediabuffer.h"
-#include "corevideotexturecache.h"
+#include "videotexturecache.h"
 
 #define DEFAULT_DEVICE_INDEX  -1
 #define DEFAULT_DO_STATS      FALSE
@@ -46,7 +46,19 @@
 static GstStaticPadTemplate src_template = GST_STATIC_PAD_TEMPLATE ("src",
     GST_PAD_SRC,
     GST_PAD_ALWAYS,
-    GST_STATIC_CAPS ("video/x-raw, "
+    GST_STATIC_CAPS (
+#if !HAVE_IOS
+        GST_VIDEO_CAPS_MAKE_WITH_FEATURES
+        (GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
+            "UYVY") ", "
+        "texture-target = " GST_GL_TEXTURE_TARGET_RECTANGLE_STR ";"
+#else
+        GST_VIDEO_CAPS_MAKE_WITH_FEATURES
+        (GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
+            "BGRA") ", "
+        "texture-target = " GST_GL_TEXTURE_TARGET_2D_STR "; "
+#endif
+        "video/x-raw, "
         "format = (string) { NV12, UYVY, YUY2 }, "
         "framerate = " GST_VIDEO_FPS_RANGE ", "
         "width = " GST_VIDEO_SIZE_RANGE ", "
@@ -57,10 +69,6 @@
         "framerate = " GST_VIDEO_FPS_RANGE ", "
         "width = " GST_VIDEO_SIZE_RANGE ", "
         "height = " GST_VIDEO_SIZE_RANGE "; "
-
-        GST_VIDEO_CAPS_MAKE_WITH_FEATURES
-        (GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
-            "RGBA") "; "
 ));
 
 typedef enum _QueueState {
@@ -93,7 +101,6 @@
   BOOL stopRequest;
 
   GstCaps *caps;
-  GstVideoFormat internalFormat;
   GstVideoFormat format;
   gint width, height;
   GstClockTime latency;
@@ -107,7 +114,7 @@
   BOOL captureScreenMouseClicks;
 
   BOOL useVideoMeta;
-  GstCoreVideoTextureCache *textureCache;
+  GstVideoTextureCache *textureCache;
 }
 
 - (id)init;
@@ -129,7 +136,7 @@
 #if !HAVE_IOS
 - (CGDirectDisplayID)getDisplayIdFromDeviceIndex;
 #endif
-- (BOOL)getDeviceCaps:(GstCaps *)result;
+- (GstCaps *)getDeviceCaps;
 - (BOOL)setDeviceCaps:(GstVideoInfo *)info;
 - (BOOL)getSessionPresetCaps:(GstCaps *)result;
 - (BOOL)setSessionPresetCaps:(GstVideoInfo *)info;
@@ -142,6 +149,7 @@
 - (BOOL)query:(GstQuery *)query;
 - (GstStateChangeReturn)changeState:(GstStateChange)transition;
 - (GstFlowReturn)create:(GstBuffer **)buf;
+- (GstCaps *)fixate:(GstCaps *)caps;
 - (void)updateStatistics;
 - (void)captureOutput:(AVCaptureOutput *)captureOutput
 didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer
@@ -373,9 +381,6 @@
   case kCVPixelFormatType_32BGRA: /* BGRA */
     gst_format = GST_VIDEO_FORMAT_BGRA;
     break;
-  case kCVPixelFormatType_32RGBA: /* RGBA */
-    gst_format = GST_VIDEO_FORMAT_RGBA;
-    break;
   case kCVPixelFormatType_422YpCbCr8_yuvs: /* yuvs */
     gst_format = GST_VIDEO_FORMAT_YUY2;
     break;
@@ -408,13 +413,22 @@
 }
 #endif
 
-- (BOOL)getDeviceCaps:(GstCaps *)result
+- (GstCaps *)getDeviceCaps
 {
   NSArray *formats = [device valueForKey:@"formats"];
   NSArray *pixel_formats = output.availableVideoCVPixelFormatTypes;
+  GstCaps *result_caps, *result_gl_caps;
+#if !HAVE_IOS
+  GstVideoFormat gl_format = GST_VIDEO_FORMAT_UYVY;
+#else
+  GstVideoFormat gl_format = GST_VIDEO_FORMAT_BGRA;
+#endif
 
   GST_DEBUG_OBJECT (element, "Getting device caps");
 
+  result_caps = gst_caps_new_empty ();
+  result_gl_caps = gst_caps_new_empty ();
+
   /* Do not use AVCaptureDeviceFormat or AVFrameRateRange only
    * available in iOS >= 7.0. We use a dynamic approach with key-value
    * coding or performSelector */
@@ -437,27 +451,48 @@
 
       for (NSNumber *pixel_format in pixel_formats) {
         GstVideoFormat gst_format = [self getGstVideoFormat:pixel_format];
+
         if (gst_format != GST_VIDEO_FORMAT_UNKNOWN) {
           if (min_fps != max_fps)
-            gst_caps_append (result, GST_AVF_FPS_RANGE_CAPS_NEW (gst_format, dimensions.width, dimensions.height, min_fps_n, min_fps_d, max_fps_n, max_fps_d));
+            gst_caps_append (result_caps, GST_AVF_FPS_RANGE_CAPS_NEW (gst_format, dimensions.width, dimensions.height, min_fps_n, min_fps_d, max_fps_n, max_fps_d));
           else
-            gst_caps_append (result, GST_AVF_CAPS_NEW (gst_format, dimensions.width, dimensions.height, max_fps_n, max_fps_d));
+            gst_caps_append (result_caps, GST_AVF_CAPS_NEW (gst_format, dimensions.width, dimensions.height, max_fps_n, max_fps_d));
         }
 
-        if (gst_format == GST_VIDEO_FORMAT_BGRA) {
-          GstCaps *rgba_caps;
-          if (min_fps != max_fps)
-            rgba_caps = GST_AVF_FPS_RANGE_CAPS_NEW (GST_VIDEO_FORMAT_RGBA, dimensions.width, dimensions.height, min_fps_n, min_fps_d, max_fps_n, max_fps_d);
-          else
-            rgba_caps = GST_AVF_CAPS_NEW (GST_VIDEO_FORMAT_RGBA, dimensions.width, dimensions.height, max_fps_n, max_fps_d);
-          gst_caps_set_features (rgba_caps, 0, gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, NULL));
-          gst_caps_append (result, rgba_caps);
+        if (gst_format == gl_format) {
+          GstCaps *gl_caps;
+          if (min_fps != max_fps) {
+            gl_caps = GST_AVF_FPS_RANGE_CAPS_NEW (gl_format,
+                    dimensions.width, dimensions.height,
+                    min_fps_n, min_fps_d,
+                    max_fps_n, max_fps_d);
+          } else {
+            gl_caps = GST_AVF_CAPS_NEW (gl_format,
+                    dimensions.width, dimensions.height,
+                    max_fps_n, max_fps_d);
+          }
+          gst_caps_set_features (gl_caps, 0,
+                  gst_caps_features_new (GST_CAPS_FEATURE_MEMORY_GL_MEMORY,
+                      NULL));
+          gst_caps_set_simple (gl_caps,
+                  "texture-target", G_TYPE_STRING,
+#if !HAVE_IOS
+                  GST_GL_TEXTURE_TARGET_RECTANGLE_STR,
+#else
+                  GST_GL_TEXTURE_TARGET_2D_STR,
+#endif
+                  NULL);
+          gst_caps_append (result_gl_caps, gl_caps);
         }
       }
     }
   }
-  GST_LOG_OBJECT (element, "Device returned the following caps %" GST_PTR_FORMAT, result);
-  return YES;
+
+  result_gl_caps = gst_caps_simplify (gst_caps_merge (result_gl_caps, result_caps));
+
+  GST_INFO_OBJECT (element, "Device returned the following caps %" GST_PTR_FORMAT, result_gl_caps);
+
+  return result_gl_caps;
 }
 
 - (BOOL)setDeviceCaps:(GstVideoInfo *)info
@@ -618,11 +653,8 @@
   }
 
   @try {
-
-    [self getDeviceCaps:result];
-
+    result = gst_caps_merge (result, [self getDeviceCaps]);
   } @catch (NSException *exception) {
-
     if (![[exception name] isEqualToString:NSUndefinedKeyException]) {
       GST_WARNING ("An unexcepted error occured: %s", [exception.reason UTF8String]);
       return result;
@@ -646,7 +678,6 @@
   width = info.width;
   height = info.height;
   format = info.finfo->format;
-  internalFormat = GST_VIDEO_FORMAT_UNKNOWN;
   latency = gst_util_uint64_scale (GST_SECOND, info.fps_d, info.fps_n);
 
   dispatch_sync (mainQueue, ^{
@@ -686,7 +717,6 @@
       }
     }
 
-    internalFormat = format;
     switch (format) {
       case GST_VIDEO_FORMAT_NV12:
         newformat = kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange;
@@ -697,15 +727,6 @@
       case GST_VIDEO_FORMAT_YUY2:
         newformat = kCVPixelFormatType_422YpCbCr8_yuvs;
         break;
-      case GST_VIDEO_FORMAT_RGBA:
-#if !HAVE_IOS
-        newformat = kCVPixelFormatType_422YpCbCr8;
-        internalFormat = GST_VIDEO_FORMAT_UYVY;
-#else
-        newformat = kCVPixelFormatType_32BGRA;
-        internalFormat = GST_VIDEO_FORMAT_BGRA;
-#endif
-        break;
       case GST_VIDEO_FORMAT_BGRA:
         newformat = kCVPixelFormatType_32BGRA;
         break;
@@ -716,10 +737,9 @@
         return;
     }
 
-    GST_INFO_OBJECT(element,
-        "width: %d height: %d format: %s internalFormat: %s", width, height,
-        gst_video_format_to_string (format),
-        gst_video_format_to_string (internalFormat));
+    GST_INFO_OBJECT (element,
+        "width: %d height: %d format: %s", width, height,
+        gst_video_format_to_string (format));
 
     output.videoSettings = [NSDictionary
         dictionaryWithObject:[NSNumber numberWithInt:newformat]
@@ -728,6 +748,22 @@
     if (caps)
       gst_caps_unref (caps);
     caps = gst_caps_copy (new_caps);
+
+    if (textureCache)
+      gst_video_texture_cache_free (textureCache);
+    textureCache = NULL;
+
+    GstCapsFeatures *features = gst_caps_get_features (caps, 0);
+    if (gst_caps_features_contains (features, GST_CAPS_FEATURE_MEMORY_GL_MEMORY)) {
+      GstGLContext *context = query_gl_context (GST_BASE_SRC_PAD (baseSrc));
+      textureCache = gst_video_texture_cache_new (context);
+      gst_video_texture_cache_set_format (textureCache, format, caps);
+      gst_object_unref (context);
+    }
+
+    GST_INFO_OBJECT (element, "configured caps %"GST_PTR_FORMAT
+        ", pushing textures %d", caps, textureCache != NULL);
+
     [session startRunning];
 
     /* Unlock device configuration only after session is started so the session
@@ -765,7 +801,7 @@
   bufQueue = nil;
 
   if (textureCache)
-      gst_core_video_texture_cache_free (textureCache);
+      gst_video_texture_cache_free (textureCache);
   textureCache = NULL;
 
   return YES;
@@ -794,43 +830,6 @@
   return result;
 }
 
-- (BOOL)decideAllocation:(GstQuery *)query
-{
-  useVideoMeta = gst_query_find_allocation_meta (query,
-      GST_VIDEO_META_API_TYPE, NULL);
-
-  /* determine whether we can pass GL textures to downstream element */
-  GstCapsFeatures *features = gst_caps_get_features (caps, 0);
-  if (gst_caps_features_contains (features, GST_CAPS_FEATURE_MEMORY_GL_MEMORY)) {
-    GstGLContext *glContext = NULL;
-
-    /* get GL context from downstream element */
-    GstQuery *query = gst_query_new_context ("gst.gl.local_context");
-    if (gst_pad_peer_query (GST_BASE_SRC_PAD (element), query)) {
-      GstContext *context;
-      gst_query_parse_context (query, &context);
-      if (context) {
-        const GstStructure *s = gst_context_get_structure (context);
-        gst_structure_get (s, "context", GST_GL_TYPE_CONTEXT, &glContext,
-            NULL);
-      }
-    }
-    gst_query_unref (query);
-
-    if (glContext) {
-      GST_INFO_OBJECT (element, "pushing textures. Internal format %s, context %p",
-          gst_video_format_to_string (internalFormat), glContext);
-      textureCache = gst_core_video_texture_cache_new (glContext);
-      gst_core_video_texture_cache_set_format (textureCache, internalFormat, caps);
-      gst_object_unref (glContext);
-    } else {
-      GST_WARNING_OBJECT (element, "got memory:GLMemory caps but not GL context from downstream element");
-    }
-  } 
-
-  return YES;
-}
-
 - (BOOL)unlock
 {
   [bufQueueLock lock];
@@ -946,20 +945,10 @@
     CFRelease (sbuf);
     return GST_FLOW_ERROR;
   }
-
-  if (format == GST_VIDEO_FORMAT_RGBA) {
-    /* So now buf contains BGRA data (!) . Since downstream is actually going to
-     * use the GL upload meta to get RGBA textures (??), we need to override the
-     * VideoMeta format (!!!). Yes this is confusing, see setCaps:  */
-    GstVideoMeta *video_meta = gst_buffer_get_video_meta (*buf);
-    if (video_meta) {
-      video_meta->format = format;
-    }
-  }
   CFRelease (sbuf);
 
   if (textureCache != NULL) {
-    *buf = gst_core_video_texture_cache_get_gl_buffer (textureCache, *buf);
+    *buf = gst_video_texture_cache_get_gl_buffer (textureCache, *buf);
     if (*buf == NULL)
       return GST_FLOW_ERROR;
   }
@@ -975,6 +964,50 @@
   return GST_FLOW_OK;
 }
 
+static GstGLContext *
+query_gl_context (GstPad *srcpad)
+{
+  GstGLContext *gl_context = NULL;
+  GstContext *context = NULL;
+  GstQuery *query;
+
+  query = gst_query_new_context ("gst.gl.local_context");
+  if (gst_pad_peer_query (srcpad, query)) {
+    gst_query_parse_context (query, &context);
+    if (context) {
+      const GstStructure *s = gst_context_get_structure (context);
+      gst_structure_get (s, "context", GST_GL_TYPE_CONTEXT, &gl_context, NULL);
+    }
+  }
+  gst_query_unref (query);
+
+  return gl_context;
+}
+
+static gboolean
+caps_filter_out_gl_memory (GstCapsFeatures * features, GstStructure * structure,
+    gpointer user_data)
+{
+  return !gst_caps_features_contains (features,
+      GST_CAPS_FEATURE_MEMORY_GL_MEMORY);
+}
+
+
+- (GstCaps *)fixate:(GstCaps *)new_caps
+{
+  GstGLContext *context;
+
+  new_caps = gst_caps_make_writable (new_caps);
+
+  context = query_gl_context (GST_BASE_SRC_PAD (baseSrc));
+  if (!context)
+    gst_caps_filter_and_map_in_place (new_caps, caps_filter_out_gl_memory, NULL);
+  else
+    gst_object_unref (context);
+
+  return gst_caps_fixate (new_caps);
+}
+
 - (void)getSampleBuffer:(CMSampleBufferRef)sbuf
               timestamp:(GstClockTime *)outTimestamp
                duration:(GstClockTime *)outDuration
@@ -1099,13 +1132,13 @@
 static gboolean gst_avf_video_src_stop (GstBaseSrc * basesrc);
 static gboolean gst_avf_video_src_query (GstBaseSrc * basesrc,
     GstQuery * query);
-static gboolean gst_avf_video_src_decide_allocation (GstBaseSrc * basesrc,
-    GstQuery * query);
 static gboolean gst_avf_video_src_unlock (GstBaseSrc * basesrc);
 static gboolean gst_avf_video_src_unlock_stop (GstBaseSrc * basesrc);
 static GstFlowReturn gst_avf_video_src_create (GstPushSrc * pushsrc,
     GstBuffer ** buf);
 static gboolean gst_avf_video_src_negotiate (GstBaseSrc * basesrc);
+static GstCaps * gst_avf_video_src_fixate (GstBaseSrc * bsrc,
+    GstCaps * caps);
 
 
 static void
@@ -1129,7 +1162,7 @@
   gstbasesrc_class->query = gst_avf_video_src_query;
   gstbasesrc_class->unlock = gst_avf_video_src_unlock;
   gstbasesrc_class->unlock_stop = gst_avf_video_src_unlock_stop;
-  gstbasesrc_class->decide_allocation = gst_avf_video_src_decide_allocation;
+  gstbasesrc_class->fixate = gst_avf_video_src_fixate;
   gstbasesrc_class->negotiate = gst_avf_video_src_negotiate;
 
   gstpushsrc_class->create = gst_avf_video_src_create;
@@ -1338,18 +1371,6 @@
 }
 
 static gboolean
-gst_avf_video_src_decide_allocation (GstBaseSrc * basesrc, GstQuery * query)
-{
-  gboolean ret;
-
-  OBJC_CALLOUT_BEGIN ();
-  ret = [GST_AVF_VIDEO_SRC_IMPL (basesrc) decideAllocation:query];
-  OBJC_CALLOUT_END ();
-
-  return ret;
-}
-
-static gboolean
 gst_avf_video_src_unlock (GstBaseSrc * basesrc)
 {
   gboolean ret;
@@ -1395,3 +1416,15 @@
   return GST_BASE_SRC_CLASS (parent_class)->negotiate (basesrc);
 }
 
+
+static GstCaps *
+gst_avf_video_src_fixate (GstBaseSrc * bsrc, GstCaps * caps)
+{
+  GstCaps *ret;
+
+  OBJC_CALLOUT_BEGIN ();
+  ret = [GST_AVF_VIDEO_SRC_IMPL (bsrc) fixate:caps];
+  OBJC_CALLOUT_END ();
+
+  return ret;
+}
diff --git a/sys/applemedia/corevideotexturecache.m b/sys/applemedia/corevideotexturecache.m
deleted file mode 100644
index d5b9aeb..0000000
--- a/sys/applemedia/corevideotexturecache.m
+++ /dev/null
@@ -1,257 +0,0 @@
-/*
- * Copyright (C) 2010 Ole André Vadla Ravnås <oleavr@soundrop.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
-
-#if !HAVE_IOS
-#import <AppKit/AppKit.h>
-#include <gst/gl/cocoa/gstglcontext_cocoa.h>
-#endif
-#include "corevideotexturecache.h"
-#include "coremediabuffer.h"
-#include "corevideobuffer.h"
-#include "vtutil.h"
-
-typedef struct _ContextThreadData
-{
-  GstCoreVideoTextureCache *cache;
-  GstBuffer *input_buffer;
-  GstBuffer *output_buffer;
-} ContextThreadData;
-
-GstCoreVideoTextureCache *
-gst_core_video_texture_cache_new (GstGLContext * ctx)
-{
-  g_return_val_if_fail (ctx != NULL, NULL);
-
-  GstCoreVideoTextureCache *cache = g_new0 (GstCoreVideoTextureCache, 1);
-  cache->ctx = gst_object_ref (ctx);
-  gst_video_info_init (&cache->input_info);
-  cache->convert = gst_gl_color_convert_new (cache->ctx);
-
-#if !HAVE_IOS
-  CGLPixelFormatObj pixelFormat =
-      gst_gl_context_cocoa_get_pixel_format (GST_GL_CONTEXT_COCOA (ctx));
-  CGLContextObj platform_ctx =
-      (CGLContextObj) gst_gl_context_get_gl_context (ctx);
-  CVOpenGLTextureCacheCreate (kCFAllocatorDefault, NULL, platform_ctx,
-      pixelFormat, NULL, &cache->cache);
-#else
-  CFMutableDictionaryRef cache_attrs =
-      CFDictionaryCreateMutable (NULL, 0, &kCFTypeDictionaryKeyCallBacks,
-      &kCFTypeDictionaryValueCallBacks);
-  gst_vtutil_dict_set_i32 (cache_attrs,
-      kCVOpenGLESTextureCacheMaximumTextureAgeKey, 0);
-  CVOpenGLESTextureCacheCreate (kCFAllocatorDefault, (CFDictionaryRef) cache_attrs,
-      (CVEAGLContext) gst_gl_context_get_gl_context (ctx), NULL, &cache->cache);
-#endif
-
-  return cache;
-}
-
-void
-gst_core_video_texture_cache_free (GstCoreVideoTextureCache * cache)
-{
-  g_return_if_fail (cache != NULL);
-
-#if !HAVE_IOS
-  CVOpenGLTextureCacheRelease (cache->cache);
-#else
-  CFRelease (cache->cache); /* iOS has no "CVOpenGLESTextureCacheRelease" */
-#endif
-  gst_object_unref (cache->convert);
-  gst_object_unref (cache->ctx);
-  g_free (cache);
-}
-
-void
-gst_core_video_texture_cache_set_format (GstCoreVideoTextureCache * cache,
-    GstVideoFormat in_format, GstCaps * out_caps)
-{
-  GstCaps *in_caps;
-  GstCapsFeatures *features;
-
-  g_return_if_fail (gst_caps_is_fixed (out_caps));
-
-  out_caps = gst_caps_copy (out_caps);
-  features = gst_caps_get_features (out_caps, 0);
-  gst_caps_features_add (features, GST_CAPS_FEATURE_MEMORY_GL_MEMORY);
-  gst_video_info_from_caps (&cache->output_info, out_caps); 
-  
-  in_caps = gst_caps_copy (out_caps);
-  gst_caps_set_simple (in_caps, "format",
-          G_TYPE_STRING, gst_video_format_to_string (in_format), NULL);
-  features = gst_caps_get_features (in_caps, 0);
-  gst_caps_features_add (features, GST_CAPS_FEATURE_MEMORY_GL_MEMORY);
-  gst_video_info_from_caps (&cache->input_info, in_caps);
-
-  gst_gl_color_convert_set_caps (cache->convert, in_caps, out_caps);
-
-  gst_caps_unref (out_caps);
-  gst_caps_unref (in_caps);
-}
-
-static CVPixelBufferRef
-cv_pixel_buffer_from_gst_buffer (GstBuffer * buffer)
-{
-  GstCoreMediaMeta *cm_meta =
-      (GstCoreMediaMeta *) gst_buffer_get_meta (buffer,
-      gst_core_media_meta_api_get_type ());
-  GstCoreVideoMeta *cv_meta =
-      (GstCoreVideoMeta *) gst_buffer_get_meta (buffer,
-      gst_core_video_meta_api_get_type ());
-
-  g_return_val_if_fail (cm_meta || cv_meta, NULL);
-
-  return cm_meta ? cm_meta->pixel_buf : cv_meta->pixbuf;
-}
-
-static gboolean
-gl_mem_from_buffer (GstCoreVideoTextureCache * cache,
-        GstBuffer * buffer, GstMemory **mem1, GstMemory **mem2)
-{
-  gboolean ret = TRUE;
-#if !HAVE_IOS
-  CVOpenGLTextureRef texture = NULL;
-#else
-  CVOpenGLESTextureRef texture = NULL;
-#endif
-  CVPixelBufferRef pixel_buf = cv_pixel_buffer_from_gst_buffer (buffer);
-
-  *mem1 = NULL;
-  *mem2 = NULL;
-
-#if !HAVE_IOS
-  CVOpenGLTextureCacheFlush (cache->cache, 0);
-#else
-  CVOpenGLESTextureCacheFlush (cache->cache, 0);
-#endif
-
-  switch (GST_VIDEO_INFO_FORMAT (&cache->input_info)) {
-#if !HAVE_IOS
-      case GST_VIDEO_FORMAT_UYVY:
-        /* both avfvideosrc and vtdec on OSX when doing GLMemory negotiate UYVY
-         * under the hood, which means a single output texture. */
-        if (CVOpenGLTextureCacheCreateTextureFromImage (kCFAllocatorDefault,
-              cache->cache, pixel_buf, NULL, &texture) != kCVReturnSuccess)
-          goto error;
-
-        *mem1 = (GstMemory *) gst_gl_memory_wrapped_texture (cache->ctx,
-            CVOpenGLTextureGetName (texture), CVOpenGLTextureGetTarget (texture),
-            &cache->input_info, 0, NULL, texture, (GDestroyNotify) CFRelease);
-        break;
-#else
-      case GST_VIDEO_FORMAT_BGRA:
-        /* avfvideosrc does BGRA on iOS when doing GLMemory */
-        if (CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault,
-              cache->cache, pixel_buf, NULL, GL_TEXTURE_2D, GL_RGBA,
-              GST_VIDEO_INFO_WIDTH (&cache->input_info),
-              GST_VIDEO_INFO_HEIGHT (&cache->input_info),
-              GL_RGBA, GL_UNSIGNED_BYTE, 0, &texture) != kCVReturnSuccess)
-          goto error;
-
-        *mem1 = (GstMemory *) gst_gl_memory_wrapped_texture (cache->ctx,
-            CVOpenGLESTextureGetName (texture), CVOpenGLESTextureGetTarget (texture),
-            &cache->input_info, 0, NULL, texture, (GDestroyNotify) CFRelease);
-        break;
-      case GST_VIDEO_FORMAT_NV12: {
-        GstVideoGLTextureType textype;
-        GLenum texfmt;
-
-        textype = gst_gl_texture_type_from_format (cache->ctx, GST_VIDEO_FORMAT_NV12, 0);
-        texfmt = gst_gl_format_from_gl_texture_type (textype);
-
-        /* vtdec does NV12 on iOS when doing GLMemory */
-        if (CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault,
-              cache->cache, pixel_buf, NULL, GL_TEXTURE_2D, texfmt,
-              GST_VIDEO_INFO_WIDTH (&cache->input_info),
-              GST_VIDEO_INFO_HEIGHT (&cache->input_info),
-              texfmt, GL_UNSIGNED_BYTE, 0, &texture) != kCVReturnSuccess)
-          goto error;
-
-        *mem1 = (GstMemory *) gst_gl_memory_wrapped_texture (cache->ctx,
-            CVOpenGLESTextureGetName (texture), CVOpenGLESTextureGetTarget (texture),
-            &cache->input_info, 0, NULL, texture, (GDestroyNotify) CFRelease);
-
-        textype = gst_gl_texture_type_from_format (cache->ctx, GST_VIDEO_FORMAT_NV12, 1);
-        texfmt = gst_gl_format_from_gl_texture_type (textype);
-
-        if (CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault,
-              cache->cache, pixel_buf, NULL, GL_TEXTURE_2D, texfmt,
-              GST_VIDEO_INFO_WIDTH (&cache->input_info) / 2,
-              GST_VIDEO_INFO_HEIGHT (&cache->input_info) / 2,
-              texfmt, GL_UNSIGNED_BYTE, 1, &texture) != kCVReturnSuccess)
-          goto error;
-
-        *mem2 = (GstMemory *) gst_gl_memory_wrapped_texture (cache->ctx,
-            CVOpenGLESTextureGetName (texture), CVOpenGLESTextureGetTarget (texture),
-            &cache->input_info, 0, NULL, texture, (GDestroyNotify) CFRelease);
-        break;
-      }
-#endif
-      default:
-        g_warn_if_reached ();
-        ret = FALSE;
-    }
-
-  return ret;
-
-error:
-  ret = FALSE;
-
-  if (*mem1)
-      gst_memory_unref (*mem1);
-  if (*mem2)
-      gst_memory_unref (*mem2);
-
-  return ret;
-}
-
-static void
-_do_get_gl_buffer (GstGLContext * context, ContextThreadData * data)
-{
-  GstMemory *mem1 = NULL, *mem2 = NULL;
-  GstCoreVideoTextureCache *cache = data->cache;
-  GstBuffer *buffer = data->input_buffer;
-
-  if (!gl_mem_from_buffer (cache, buffer, &mem1, &mem2)) {
-    gst_buffer_unref (buffer);
-    data->output_buffer = NULL;
-    return;
-  }
-
-  gst_buffer_append_memory (buffer, mem1);
-  if (mem2)
-    gst_buffer_append_memory (buffer, mem2);
-
-  data->output_buffer = gst_gl_color_convert_perform (cache->convert, buffer);
-  gst_buffer_unref (buffer);
-}
-
-GstBuffer *
-gst_core_video_texture_cache_get_gl_buffer (GstCoreVideoTextureCache * cache,
-        GstBuffer * cv_buffer)
-{
-  ContextThreadData data = {cache, cv_buffer, NULL};
-  gst_gl_context_thread_add (cache->ctx,
-      (GstGLContextThreadFunc) _do_get_gl_buffer, &data);
-  return data.output_buffer;
-}
diff --git a/sys/applemedia/iosassetsrc.m b/sys/applemedia/iosassetsrc.m
index 9cf7498..0539340 100644
--- a/sys/applemedia/iosassetsrc.m
+++ b/sys/applemedia/iosassetsrc.m
@@ -29,7 +29,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch iosassetsrc uri=assets-library://asset/asset.M4V?id=11&ext=M4V ! decodebin ! autoaudiosink
+ * gst-launch-1.0 iosassetsrc uri=assets-library://asset/asset.M4V?id=11&ext=M4V ! decodebin ! autoaudiosink
  * ]| Plays asset with id a song.ogg from local dir.
  * </refsect2>
  */
diff --git a/sys/applemedia/iosurfacememory.c b/sys/applemedia/iosurfacememory.c
new file mode 100644
index 0000000..04acc51
--- /dev/null
+++ b/sys/applemedia/iosurfacememory.c
@@ -0,0 +1,242 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Alessandro Decina <twi@centricular.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 "iosurfacememory.h"
+
+GST_DEBUG_CATEGORY_STATIC (GST_CAT_IO_SURFACE_MEMORY);
+#define GST_CAT_DEFAULT GST_CAT_IO_SURFACE_MEMORY
+
+G_DEFINE_TYPE (GstIOSurfaceMemoryAllocator, gst_io_surface_memory_allocator,
+    GST_TYPE_GL_MEMORY_ALLOCATOR);
+
+static void _io_surface_memory_set_surface (GstIOSurfaceMemory * memory,
+    IOSurfaceRef surface);
+
+static GstAllocator *_io_surface_memory_allocator;
+
+static gboolean
+_io_surface_memory_create (GstGLBaseMemory * bmem, GError ** error)
+{
+  GstGLMemory *gl_mem = (GstGLMemory *) bmem;
+  GstGLContext *context = gl_mem->mem.context;
+  const GstGLFuncs *gl = context->gl_vtable;
+  GLuint target;
+
+  target = gst_gl_texture_target_to_gl (gl_mem->tex_target);
+  gl->GenTextures (1, &gl_mem->tex_id);
+  gl->BindTexture (target, gl_mem->tex_id);
+  gl->BindTexture (target, 0);
+
+  GST_LOG ("generated texture id:%d", gl_mem->tex_id);
+
+  return TRUE;
+}
+
+static void
+_io_surface_memory_destroy (GstGLBaseMemory * gl_mem)
+{
+  GST_GL_BASE_MEMORY_ALLOCATOR_CLASS
+      (gst_io_surface_memory_allocator_parent_class)->destroy (gl_mem);
+  _io_surface_memory_set_surface ((GstIOSurfaceMemory *) gl_mem, NULL);
+}
+
+static gpointer
+_io_surface_memory_allocator_map (GstGLBaseMemory * bmem,
+    GstMapInfo * info, gsize size)
+{
+  GstGLMemory *gl_mem = (GstGLMemory *) bmem;
+  GstIOSurfaceMemory *mem = (GstIOSurfaceMemory *) gl_mem;
+
+  GST_LOG ("mapping surface %p flags %d gl? %d",
+      mem->surface, info->flags, ((info->flags & GST_MAP_GL) != 0));
+
+  if (info->flags & GST_MAP_GL) {
+    return &gl_mem->tex_id;
+  } else if (!(info->flags & GST_MAP_WRITE)) {
+    IOSurfaceLock (mem->surface, kIOSurfaceLockReadOnly, NULL);
+    return IOSurfaceGetBaseAddressOfPlane (mem->surface, gl_mem->plane);
+  } else {
+    GST_ERROR ("couldn't map IOSurface %p flags %d", mem->surface, info->flags);
+    return NULL;
+  }
+}
+
+static void
+_io_surface_memory_allocator_unmap (GstGLBaseMemory * bmem, GstMapInfo * info)
+{
+  GstGLMemory *gl_mem = (GstGLMemory *) bmem;
+  GstIOSurfaceMemory *mem = (GstIOSurfaceMemory *) gl_mem;
+
+  GST_LOG ("unmapping surface %p flags %d gl? %d",
+      mem->surface, info->flags, ((info->flags & GST_MAP_GL) != 0));
+
+  if (!(info->flags & GST_MAP_GL)) {
+    IOSurfaceUnlock (mem->surface, kIOSurfaceLockReadOnly, NULL);
+  }
+}
+
+static GstMemory *
+_mem_alloc (GstAllocator * allocator, gsize size, GstAllocationParams * params)
+{
+  g_warning ("use gst_io_surface_memory_wrapped () to allocate from this "
+      "IOSurface allocator");
+
+  return NULL;
+}
+
+static void
+gst_io_surface_memory_allocator_class_init (GstIOSurfaceMemoryAllocatorClass *
+    klass)
+{
+  GstAllocatorClass *allocator_class = (GstAllocatorClass *) klass;
+  GstGLBaseMemoryAllocatorClass *gl_base_allocator_class =
+      (GstGLBaseMemoryAllocatorClass *) klass;
+
+  allocator_class->alloc = _mem_alloc;
+
+  gl_base_allocator_class->create = _io_surface_memory_create;
+  gl_base_allocator_class->destroy = _io_surface_memory_destroy;
+  gl_base_allocator_class->map = _io_surface_memory_allocator_map;
+  gl_base_allocator_class->unmap = _io_surface_memory_allocator_unmap;
+}
+
+static void
+gst_io_surface_memory_allocator_init (GstIOSurfaceMemoryAllocator * allocator)
+{
+  GstAllocator *alloc = GST_ALLOCATOR_CAST (allocator);
+
+  alloc->mem_type = GST_IO_SURFACE_MEMORY_ALLOCATOR_NAME;
+  GST_OBJECT_FLAG_SET (allocator, GST_ALLOCATOR_FLAG_CUSTOM_ALLOC);
+}
+
+void
+gst_ios_surface_memory_init (void)
+{
+  static volatile gsize _init = 0;
+
+  if (g_once_init_enter (&_init)) {
+    GST_DEBUG_CATEGORY_INIT (GST_CAT_IO_SURFACE_MEMORY, "iosurface", 0,
+        "IOSurface Buffer");
+
+    _io_surface_memory_allocator =
+        g_object_new (GST_TYPE_IO_SURFACE_MEMORY_ALLOCATOR, NULL);
+
+    gst_allocator_register (GST_IO_SURFACE_MEMORY_ALLOCATOR_NAME,
+        gst_object_ref (_io_surface_memory_allocator));
+    g_once_init_leave (&_init, 1);
+  }
+}
+
+gboolean
+gst_is_io_surface_memory (GstMemory * mem)
+{
+  return mem != NULL && mem->allocator != NULL &&
+      g_type_is_a (G_OBJECT_TYPE (mem->allocator),
+      GST_TYPE_IO_SURFACE_MEMORY_ALLOCATOR);
+}
+
+static GstIOSurfaceMemory *
+_io_surface_memory_new (GstGLContext * context,
+    IOSurfaceRef surface,
+    GstGLTextureTarget target,
+    GstVideoInfo * info,
+    guint plane,
+    GstVideoAlignment * valign, gpointer user_data, GDestroyNotify notify)
+{
+  GstIOSurfaceMemory *mem;
+
+  g_return_val_if_fail (target == GST_GL_TEXTURE_TARGET_RECTANGLE, NULL);
+
+  mem = g_slice_new0 (GstIOSurfaceMemory);
+  gst_gl_memory_init (&mem->gl_mem, _io_surface_memory_allocator, NULL, context,
+      target, NULL, info, plane, valign, user_data, notify);
+
+  GST_MINI_OBJECT_FLAG_SET (mem, GST_MEMORY_FLAG_READONLY);
+  GST_MINI_OBJECT_FLAG_SET (mem, GST_MEMORY_FLAG_NO_SHARE);
+
+  mem->surface = NULL;
+  _io_surface_memory_set_surface (mem, surface);
+
+  return mem;
+}
+
+GstIOSurfaceMemory *
+gst_io_surface_memory_wrapped (GstGLContext * context,
+    IOSurfaceRef surface,
+    GstGLTextureTarget target,
+    GstVideoInfo * info,
+    guint plane,
+    GstVideoAlignment * valign, gpointer user_data, GDestroyNotify notify)
+{
+  return _io_surface_memory_new (context, surface, target, info,
+      plane, valign, user_data, notify);
+}
+
+static void
+_io_surface_memory_set_surface (GstIOSurfaceMemory * memory,
+    IOSurfaceRef surface)
+{
+  GstGLMemory *gl_mem = (GstGLMemory *) memory;
+  GstGLContext *context = ((GstGLBaseMemory *) gl_mem)->context;
+  GstGLFuncs *gl = context->gl_vtable;
+
+  if (memory->surface)
+    IOSurfaceDecrementUseCount (memory->surface);
+  memory->surface = surface;
+  if (surface) {
+    GLuint tex_id, tex_target, texifmt, texfmt;
+    guint plane;
+    GstVideoGLTextureType textype;
+    CGLError cglError;
+
+    plane = gl_mem->plane;
+    tex_id = gl_mem->tex_id;
+    tex_target = gst_gl_texture_target_to_gl (gl_mem->tex_target);
+    textype = gst_gl_texture_type_from_format (context,
+        GST_VIDEO_INFO_FORMAT (&gl_mem->info), plane);
+    texifmt = gst_gl_format_from_gl_texture_type (textype);
+    texfmt =
+        gst_gl_sized_gl_format_from_gl_format_type (context, texifmt,
+        GL_UNSIGNED_BYTE);
+    gl->BindTexture (tex_target, tex_id);
+    cglError = CGLTexImageIOSurface2D ((CGLContextObj)
+        gst_gl_context_get_gl_context (context), tex_target, texifmt,
+        IOSurfaceGetWidthOfPlane (surface, plane),
+        IOSurfaceGetHeightOfPlane (surface, plane), texifmt, GL_UNSIGNED_BYTE,
+        surface, plane);
+    gl->BindTexture (tex_target, 0);
+    IOSurfaceIncrementUseCount (surface);
+    GST_DEBUG ("bound surface %p to texture %u: %d", surface, tex_id, cglError);
+  }
+}
+
+void
+gst_io_surface_memory_set_surface (GstIOSurfaceMemory * memory,
+    IOSurfaceRef surface)
+{
+  g_return_if_fail (gst_is_io_surface_memory ((GstMemory *) memory));
+  g_return_if_fail (memory->surface == NULL);
+
+  _io_surface_memory_set_surface (memory, surface);
+}
diff --git a/sys/applemedia/corevideotexturecache.h b/sys/applemedia/videotexturecache.h
similarity index 67%
rename from sys/applemedia/corevideotexturecache.h
rename to sys/applemedia/videotexturecache.h
index d53ec41..0b43566 100644
--- a/sys/applemedia/corevideotexturecache.h
+++ b/sys/applemedia/videotexturecache.h
@@ -22,29 +22,32 @@
 
 #include <gst/video/gstvideometa.h>
 #include <gst/gl/gstglcontext.h>
-#include "CoreVideo/CoreVideo.h"
+#include <CoreVideo/CoreVideo.h>
 
 G_BEGIN_DECLS
 
-typedef struct _GstCoreVideoTextureCache
+typedef struct _GstVideoTextureCache
 {
   GstGLContext *ctx;
-#if !HAVE_IOS
-  CVOpenGLTextureCacheRef cache;
-#else
+#if HAVE_IOS
   CVOpenGLESTextureCacheRef cache;
+#else
+  GstBufferPool *pool;
 #endif
   GstVideoInfo input_info;
   GstVideoInfo output_info;
-  GstGLColorConvert *convert;
-} GstCoreVideoTextureCache;
 
-GstCoreVideoTextureCache *gst_core_video_texture_cache_new (GstGLContext * ctx);
-void gst_core_video_texture_cache_free (GstCoreVideoTextureCache * cache);
-void gst_core_video_texture_cache_set_format (GstCoreVideoTextureCache * cache,
+  gboolean configured;
+  GstCaps *in_caps;
+  GstCaps *out_caps;
+} GstVideoTextureCache;
+
+GstVideoTextureCache *gst_video_texture_cache_new (GstGLContext * ctx);
+void gst_video_texture_cache_free (GstVideoTextureCache * cache);
+void gst_video_texture_cache_set_format (GstVideoTextureCache * cache,
     GstVideoFormat in_format, GstCaps * out_caps);
-gboolean gst_core_video_texture_cache_upload (GstVideoGLTextureUploadMeta * meta, guint texture_id[4]);
-GstBuffer * gst_core_video_texture_cache_get_gl_buffer (GstCoreVideoTextureCache * cache,
+gboolean gst_video_texture_cache_upload (GstVideoGLTextureUploadMeta * meta, guint texture_id[4]);
+GstBuffer * gst_video_texture_cache_get_gl_buffer (GstVideoTextureCache * cache,
         GstBuffer * cv_buffer);
 
 G_END_DECLS
diff --git a/sys/applemedia/videotexturecache.m b/sys/applemedia/videotexturecache.m
new file mode 100644
index 0000000..091339f
--- /dev/null
+++ b/sys/applemedia/videotexturecache.m
@@ -0,0 +1,300 @@
+/*
+ * Copyright (C) 2010 Ole André Vadla Ravnås <oleavr@soundrop.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
+
+#if !HAVE_IOS
+#import <AppKit/AppKit.h>
+#include <gst/gl/cocoa/gstglcontext_cocoa.h>
+#include <gst/gl/gstglbufferpool.h>
+#include "iosurfacememory.h"
+#endif
+#include "videotexturecache.h"
+#include "coremediabuffer.h"
+#include "corevideobuffer.h"
+#include "vtutil.h"
+
+typedef struct _ContextThreadData
+{
+  GstVideoTextureCache *cache;
+  GstBuffer *input_buffer;
+  GstBuffer *output_buffer;
+} ContextThreadData;
+
+GstVideoTextureCache *
+gst_video_texture_cache_new (GstGLContext * ctx)
+{
+  g_return_val_if_fail (ctx != NULL, NULL);
+
+  GstVideoTextureCache *cache = g_new0 (GstVideoTextureCache, 1);
+
+  cache->ctx = gst_object_ref (ctx);
+  gst_video_info_init (&cache->input_info);
+
+#if HAVE_IOS
+  CFMutableDictionaryRef cache_attrs =
+      CFDictionaryCreateMutable (NULL, 0, &kCFTypeDictionaryKeyCallBacks,
+      &kCFTypeDictionaryValueCallBacks);
+  gst_vtutil_dict_set_i32 (cache_attrs,
+      kCVOpenGLESTextureCacheMaximumTextureAgeKey, 0);
+  CVOpenGLESTextureCacheCreate (kCFAllocatorDefault, (CFDictionaryRef) cache_attrs,
+      (CVEAGLContext) gst_gl_context_get_gl_context (ctx), NULL, &cache->cache);
+#else
+  gst_ios_surface_memory_init ();
+#if 0
+  cache->pool = GST_BUFFER_POOL (gst_gl_buffer_pool_new (ctx));
+#endif
+#endif
+
+  return cache;
+}
+
+void
+gst_video_texture_cache_free (GstVideoTextureCache * cache)
+{
+  g_return_if_fail (cache != NULL);
+
+#if HAVE_IOS
+  CFRelease (cache->cache); /* iOS has no "CVOpenGLESTextureCacheRelease" */
+#else
+#if 0
+  gst_buffer_pool_set_active (cache->pool, FALSE);
+  gst_object_unref (cache->pool);
+#endif
+#endif
+  gst_object_unref (cache->ctx);
+  if (cache->in_caps)
+    gst_caps_unref (cache->in_caps);
+  if (cache->out_caps)
+    gst_caps_unref (cache->out_caps);
+  g_free (cache);
+}
+
+void
+gst_video_texture_cache_set_format (GstVideoTextureCache * cache,
+    GstVideoFormat in_format, GstCaps * out_caps)
+{
+  GstCaps *in_caps;
+  GstCapsFeatures *features;
+
+  g_return_if_fail (gst_caps_is_fixed (out_caps));
+
+  out_caps = gst_caps_copy (out_caps);
+  features = gst_caps_get_features (out_caps, 0);
+  gst_caps_features_add (features, GST_CAPS_FEATURE_MEMORY_GL_MEMORY);
+  gst_video_info_from_caps (&cache->output_info, out_caps);
+
+  in_caps = gst_caps_copy (out_caps);
+  gst_caps_set_simple (in_caps, "format",
+          G_TYPE_STRING, gst_video_format_to_string (in_format), NULL);
+  features = gst_caps_get_features (in_caps, 0);
+  gst_caps_features_add (features, GST_CAPS_FEATURE_MEMORY_GL_MEMORY);
+  gst_video_info_from_caps (&cache->input_info, in_caps);
+
+  if (cache->in_caps)
+    gst_caps_unref (cache->in_caps);
+  if (cache->out_caps)
+    gst_caps_unref (cache->out_caps);
+  cache->in_caps = in_caps;
+  cache->out_caps = out_caps;
+
+#if 0
+  GstStructure *config = gst_buffer_pool_get_config (cache->pool);
+  gst_buffer_pool_config_set_params (config, cache->in_caps,
+          GST_VIDEO_INFO_SIZE (&cache->input_info), 0, 0);
+  gst_buffer_pool_config_set_allocator (config,
+          gst_allocator_find (GST_IO_SURFACE_MEMORY_ALLOCATOR_NAME), NULL);
+  gst_buffer_pool_config_add_option (config,
+          GST_BUFFER_POOL_OPTION_GL_TEXTURE_TARGET_RECTANGLE);
+  gst_buffer_pool_set_config (cache->pool, config);
+  gst_buffer_pool_set_active (cache->pool, TRUE);
+#endif
+}
+
+static CVPixelBufferRef
+cv_pixel_buffer_from_gst_buffer (GstBuffer * buffer)
+{
+  GstCoreMediaMeta *cm_meta =
+      (GstCoreMediaMeta *) gst_buffer_get_meta (buffer,
+      gst_core_media_meta_api_get_type ());
+  GstCoreVideoMeta *cv_meta =
+      (GstCoreVideoMeta *) gst_buffer_get_meta (buffer,
+      gst_core_video_meta_api_get_type ());
+
+  g_return_val_if_fail (cm_meta || cv_meta, NULL);
+
+  return cm_meta ? cm_meta->pixel_buf : cv_meta->pixbuf;
+}
+
+#if HAVE_IOS
+static gboolean
+gl_mem_from_buffer (GstVideoTextureCache * cache,
+        GstBuffer * buffer, GstMemory **mem1, GstMemory **mem2)
+{
+  CVOpenGLESTextureRef texture = NULL;
+  CVPixelBufferRef pixel_buf = cv_pixel_buffer_from_gst_buffer (buffer);
+  GstGLTextureTarget gl_target;
+  GstGLBaseMemoryAllocator *base_mem_alloc;
+  GstGLVideoAllocationParams *params;
+
+  base_mem_alloc = GST_GL_BASE_MEMORY_ALLOCATOR (gst_gl_memory_allocator_get_default (cache->ctx));
+
+  *mem1 = NULL;
+  *mem2 = NULL;
+
+  CVOpenGLESTextureCacheFlush (cache->cache, 0);
+
+  switch (GST_VIDEO_INFO_FORMAT (&cache->input_info)) {
+      case GST_VIDEO_FORMAT_BGRA:
+        /* avfvideosrc does BGRA on iOS when doing GLMemory */
+        if (CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault,
+              cache->cache, pixel_buf, NULL, GL_TEXTURE_2D, GL_RGBA,
+              GST_VIDEO_INFO_WIDTH (&cache->input_info),
+              GST_VIDEO_INFO_HEIGHT (&cache->input_info),
+              GL_RGBA, GL_UNSIGNED_BYTE, 0, &texture) != kCVReturnSuccess)
+          goto error;
+
+        gl_target = gst_gl_texture_target_from_gl (CVOpenGLESTextureGetTarget (texture));
+        params = gst_gl_video_allocation_params_new_wrapped_texture (cache->ctx,
+            NULL, &cache->input_info, 0, NULL, gl_target,
+            CVOpenGLESTextureGetName (texture), texture,
+            (GDestroyNotify) CFRelease);
+
+        *mem1 = (GstMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
+            (GstGLAllocationParams *) params);
+        gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
+        break;
+      case GST_VIDEO_FORMAT_NV12: {
+        GstVideoGLTextureType textype;
+        GLenum texifmt, texfmt;
+
+        textype = gst_gl_texture_type_from_format (cache->ctx, GST_VIDEO_FORMAT_NV12, 0);
+        texifmt = gst_gl_format_from_gl_texture_type (textype);
+        texfmt = gst_gl_sized_gl_format_from_gl_format_type (cache->ctx, texifmt, GL_UNSIGNED_BYTE);
+
+        /* vtdec does NV12 on iOS when doing GLMemory */
+        if (CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault,
+              cache->cache, pixel_buf, NULL, GL_TEXTURE_2D, texifmt,
+              GST_VIDEO_INFO_WIDTH (&cache->input_info),
+              GST_VIDEO_INFO_HEIGHT (&cache->input_info),
+              texfmt, GL_UNSIGNED_BYTE, 0, &texture) != kCVReturnSuccess)
+          goto error;
+
+        gl_target = gst_gl_texture_target_from_gl (CVOpenGLESTextureGetTarget (texture));
+        params = gst_gl_video_allocation_params_new_wrapped_texture (cache->ctx,
+            NULL, &cache->input_info, 0, NULL, gl_target,
+            CVOpenGLESTextureGetName (texture), texture,
+            (GDestroyNotify) CFRelease);
+
+        *mem1 = (GstMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
+            (GstGLAllocationParams *) params);
+        gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
+
+        textype = gst_gl_texture_type_from_format (cache->ctx, GST_VIDEO_FORMAT_NV12, 1);
+        texifmt = gst_gl_format_from_gl_texture_type (textype);
+        texfmt = gst_gl_sized_gl_format_from_gl_format_type (cache->ctx, texifmt, GL_UNSIGNED_BYTE);
+
+        if (CVOpenGLESTextureCacheCreateTextureFromImage (kCFAllocatorDefault,
+              cache->cache, pixel_buf, NULL, GL_TEXTURE_2D, texifmt,
+              GST_VIDEO_INFO_WIDTH (&cache->input_info) / 2,
+              GST_VIDEO_INFO_HEIGHT (&cache->input_info) / 2,
+              texfmt, GL_UNSIGNED_BYTE, 1, &texture) != kCVReturnSuccess)
+          goto error;
+
+        gl_target = gst_gl_texture_target_from_gl (CVOpenGLESTextureGetTarget (texture));
+        params = gst_gl_video_allocation_params_new_wrapped_texture (cache->ctx,
+            NULL, &cache->input_info, 1, NULL, gl_target,
+            CVOpenGLESTextureGetName (texture), texture,
+            (GDestroyNotify) CFRelease);
+
+        *mem2 = (GstMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
+            (GstGLAllocationParams *) params);
+        gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
+        break;
+      }
+    default:
+      g_warn_if_reached ();
+      goto error;
+  }
+
+  gst_object_unref (base_mem_alloc);
+
+  return TRUE;
+
+error:
+  return FALSE;
+}
+#else /* !HAVE_IOS */
+
+static gboolean
+gl_mem_from_buffer (GstVideoTextureCache * cache,
+        GstBuffer * buffer, GstMemory **mem1, GstMemory **mem2)
+{
+  CVPixelBufferRef pixel_buf = cv_pixel_buffer_from_gst_buffer (buffer);
+  IOSurfaceRef surface = CVPixelBufferGetIOSurface(pixel_buf);
+
+  *mem1 = *mem2 = NULL;
+  for (int i = 0; i < GST_VIDEO_INFO_N_PLANES (&cache->input_info); i++) {
+    GstIOSurfaceMemory *mem;
+
+    CFRetain (pixel_buf);
+    mem = gst_io_surface_memory_wrapped (cache->ctx,
+            surface, GST_GL_TEXTURE_TARGET_RECTANGLE, &cache->input_info,
+            i, NULL, pixel_buf, (GDestroyNotify) CFRelease);
+
+    if (i == 0)
+        *mem1 = (GstMemory *) mem;
+    else
+        *mem2 = (GstMemory *) mem;
+  }
+
+  return TRUE;
+}
+#endif
+
+static void
+_do_get_gl_buffer (GstGLContext * context, ContextThreadData * data)
+{
+  GstMemory *mem1 = NULL, *mem2 = NULL;
+  GstVideoTextureCache *cache = data->cache;
+  GstBuffer *buffer = data->input_buffer;
+
+  if (!gl_mem_from_buffer (cache, buffer, &mem1, &mem2)) {
+    gst_buffer_unref (buffer);
+    return;
+  }
+
+  gst_buffer_append_memory (buffer, mem1);
+  if (mem2)
+    gst_buffer_append_memory (buffer, mem2);
+
+  data->output_buffer = buffer;
+}
+
+GstBuffer *
+gst_video_texture_cache_get_gl_buffer (GstVideoTextureCache * cache,
+        GstBuffer * cv_buffer)
+{
+  ContextThreadData data = {cache, cv_buffer, NULL};
+  gst_gl_context_thread_add (cache->ctx,
+      (GstGLContextThreadFunc) _do_get_gl_buffer, &data);
+  return data.output_buffer;
+}
diff --git a/sys/applemedia/vtdec.c b/sys/applemedia/vtdec.c
index 5c5a994..639ba56 100644
--- a/sys/applemedia/vtdec.c
+++ b/sys/applemedia/vtdec.c
@@ -25,7 +25,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v filesrc location=file.mov ! qtdemux ! queue ! h264parse ! vtdec ! videoconvert ! autovideosink
+ * gst-launch-1.0 -v filesrc location=file.mov ! qtdemux ! queue ! h264parse ! vtdec ! videoconvert ! autovideosink
  * ]|
  * Decode h264 video from a mov file.
  * </refsect2>
@@ -48,12 +48,18 @@
 GST_DEBUG_CATEGORY_STATIC (gst_vtdec_debug_category);
 #define GST_CAT_DEFAULT gst_vtdec_debug_category
 
+enum
+{
+  /* leave some headroom for new GstVideoCodecFrameFlags flags */
+  VTDEC_FRAME_FLAG_SKIP = (1 << 10),
+  VTDEC_FRAME_FLAG_DROP = (1 << 11),
+};
+
 static void gst_vtdec_finalize (GObject * object);
 
 static gboolean gst_vtdec_start (GstVideoDecoder * decoder);
 static gboolean gst_vtdec_stop (GstVideoDecoder * decoder);
-static gboolean gst_vtdec_decide_allocation (GstVideoDecoder * decoder,
-    GstQuery * query);
+static gboolean gst_vtdec_negotiate (GstVideoDecoder * decoder);
 static gboolean gst_vtdec_set_format (GstVideoDecoder * decoder,
     GstVideoCodecState * state);
 static gboolean gst_vtdec_flush (GstVideoDecoder * decoder);
@@ -102,22 +108,11 @@
 CFSTR ("RequireHardwareAcceleratedVideoDecoder");
 #endif
 
-#ifdef HAVE_IOS
-#define GST_VTDEC_VIDEO_FORMAT_STR "NV12"
-#else
-#define GST_VTDEC_VIDEO_FORMAT_STR "UYVY"
-#endif
-
-#ifdef HAVE_IOS
 #define VIDEO_SRC_CAPS \
-    GST_VIDEO_CAPS_MAKE_WITH_FEATURES \
-    (GST_CAPS_FEATURE_MEMORY_GL_MEMORY, \
-        "RGBA") ";" \
-    GST_VIDEO_CAPS_MAKE(GST_VTDEC_VIDEO_FORMAT_STR) ";"
-#else
-#define VIDEO_SRC_CAPS \
-    GST_VIDEO_CAPS_MAKE(GST_VTDEC_VIDEO_FORMAT_STR) ";"
-#endif
+    GST_VIDEO_CAPS_MAKE_WITH_FEATURES(GST_CAPS_FEATURE_MEMORY_GL_MEMORY,\
+        "NV12") ", "                                                    \
+    "texture-target = (string) rectangle;"                              \
+    GST_VIDEO_CAPS_MAKE("NV12") ";"
 
 G_DEFINE_TYPE (GstVtdec, gst_vtdec, GST_TYPE_VIDEO_DECODER);
 
@@ -145,8 +140,7 @@
   gobject_class->finalize = gst_vtdec_finalize;
   video_decoder_class->start = GST_DEBUG_FUNCPTR (gst_vtdec_start);
   video_decoder_class->stop = GST_DEBUG_FUNCPTR (gst_vtdec_stop);
-  video_decoder_class->decide_allocation =
-      GST_DEBUG_FUNCPTR (gst_vtdec_decide_allocation);
+  video_decoder_class->negotiate = GST_DEBUG_FUNCPTR (gst_vtdec_negotiate);
   video_decoder_class->set_format = GST_DEBUG_FUNCPTR (gst_vtdec_set_format);
   video_decoder_class->flush = GST_DEBUG_FUNCPTR (gst_vtdec_flush);
   video_decoder_class->finish = GST_DEBUG_FUNCPTR (gst_vtdec_finish);
@@ -188,11 +182,15 @@
 {
   GstVtdec *vtdec = GST_VTDEC (decoder);
 
+  if (vtdec->input_state)
+    gst_video_codec_state_unref (vtdec->input_state);
+  vtdec->input_state = NULL;
+
   if (vtdec->session)
     gst_vtdec_invalidate_session (vtdec);
 
   if (vtdec->texture_cache)
-    gst_core_video_texture_cache_free (vtdec->texture_cache);
+    gst_video_texture_cache_free (vtdec->texture_cache);
   vtdec->texture_cache = NULL;
 
   GST_DEBUG_OBJECT (vtdec, "stop");
@@ -200,112 +198,134 @@
   return TRUE;
 }
 
-static gboolean
-gst_vtdec_decide_allocation (GstVideoDecoder * decoder, GstQuery * query)
+static GstGLContext *
+query_gl_context (GstVtdec * vtdec)
 {
-  gboolean ret;
-  GstCaps *caps;
-  GstCapsFeatures *features;
-  GstVtdec *vtdec = GST_VTDEC (decoder);
+  GstGLContext *gl_context = NULL;
+  GstContext *context = NULL;
+  GstQuery *query;
 
-  ret =
-      GST_VIDEO_DECODER_CLASS (gst_vtdec_parent_class)->decide_allocation
-      (decoder, query);
-  if (!ret)
-    goto out;
-
-  gst_query_parse_allocation (query, &caps, NULL);
-  if (caps) {
-    GstGLContext *gl_context = NULL;
-    features = gst_caps_get_features (caps, 0);
-
-    if (gst_caps_features_contains (features,
-            GST_CAPS_FEATURE_MEMORY_GL_MEMORY)) {
-      GstContext *context = NULL;
-      GstQuery *query = gst_query_new_context ("gst.gl.local_context");
-      if (gst_pad_peer_query (GST_VIDEO_DECODER_SRC_PAD (decoder), query)) {
-
-        gst_query_parse_context (query, &context);
-        if (context) {
-          const GstStructure *s = gst_context_get_structure (context);
-          gst_structure_get (s, "context", GST_GL_TYPE_CONTEXT, &gl_context,
-              NULL);
-        }
-      }
-      gst_query_unref (query);
-
-      if (context) {
-        GstVideoFormat internal_format;
-        GstVideoCodecState *output_state =
-            gst_video_decoder_get_output_state (decoder);
-
-        GST_INFO_OBJECT (decoder, "pushing textures. GL context %p", context);
-        if (vtdec->texture_cache)
-          gst_core_video_texture_cache_free (vtdec->texture_cache);
-
-#ifdef HAVE_IOS
-        internal_format = GST_VIDEO_FORMAT_NV12;
-#else
-        internal_format = GST_VIDEO_FORMAT_UYVY;
-#endif
-        vtdec->texture_cache = gst_core_video_texture_cache_new (gl_context);
-        gst_core_video_texture_cache_set_format (vtdec->texture_cache,
-            internal_format, output_state->caps);
-        gst_video_codec_state_unref (output_state);
-        gst_object_unref (gl_context);
-      } else {
-        GST_WARNING_OBJECT (decoder,
-            "got memory:GLMemory caps but not GL context from downstream element");
-      }
+  query = gst_query_new_context ("gst.gl.local_context");
+  if (gst_pad_peer_query (GST_VIDEO_DECODER_SRC_PAD (vtdec), query)) {
+    gst_query_parse_context (query, &context);
+    if (context) {
+      const GstStructure *s = gst_context_get_structure (context);
+      gst_structure_get (s, "context", GST_GL_TYPE_CONTEXT, &gl_context, NULL);
     }
   }
+  gst_query_unref (query);
 
-out:
-  return ret;
+  return gl_context;
+}
+
+static void
+setup_texture_cache (GstVtdec * vtdec, GstGLContext * context)
+{
+  GstVideoCodecState *output_state;
+
+  g_return_if_fail (vtdec->texture_cache == NULL);
+
+  GST_INFO_OBJECT (vtdec, "Setting up texture cache. GL context %p", context);
+
+  output_state = gst_video_decoder_get_output_state (GST_VIDEO_DECODER (vtdec));
+  vtdec->texture_cache = gst_video_texture_cache_new (context);
+  gst_video_texture_cache_set_format (vtdec->texture_cache,
+      GST_VIDEO_FORMAT_NV12, output_state->caps);
+  gst_video_codec_state_unref (output_state);
 }
 
 static gboolean
-gst_vtdec_negotiate_output_format (GstVtdec * vtdec,
-    GstVideoCodecState * input_state)
+caps_filter_out_gl_memory (GstCapsFeatures * features, GstStructure * structure,
+    gpointer user_data)
 {
-  GstCaps *caps = NULL, *peercaps = NULL, *templcaps;
-  GstVideoFormat output_format;
+  return !gst_caps_features_contains (features,
+      GST_CAPS_FEATURE_MEMORY_GL_MEMORY);
+}
+
+static gboolean
+gst_vtdec_negotiate (GstVideoDecoder * decoder)
+{
   GstVideoCodecState *output_state = NULL;
-  GstCapsFeatures *features;
+  GstCaps *caps = NULL, *templcaps = NULL, *prevcaps = NULL;
+  GstVideoFormat format;
   GstStructure *structure;
   const gchar *s;
+  GstGLContext *context;
+  GstVtdec *vtdec;
+  gboolean ret = TRUE;
+  GstCapsFeatures *features = NULL;
+  gboolean output_textures;
 
-  peercaps = gst_pad_peer_query_caps (GST_VIDEO_DECODER_SRC_PAD (vtdec), NULL);
-
-  /* Check if output supports GL caps by preference */
-  templcaps = gst_pad_get_pad_template_caps (GST_VIDEO_DECODER_SRC_PAD (vtdec));
+  vtdec = GST_VTDEC (decoder);
+  templcaps =
+      gst_pad_get_pad_template_caps (GST_VIDEO_DECODER_SRC_PAD (decoder));
   caps =
-      gst_caps_intersect_full (templcaps, peercaps, GST_CAPS_INTERSECT_FIRST);
-
-  gst_caps_unref (peercaps);
+      gst_caps_make_writable (gst_pad_peer_query_caps (GST_VIDEO_DECODER_SRC_PAD
+          (vtdec), templcaps));
   gst_caps_unref (templcaps);
+  context = query_gl_context (vtdec);
+  if (!context)
+    gst_caps_filter_and_map_in_place (caps, caps_filter_out_gl_memory, NULL);
 
   caps = gst_caps_truncate (caps);
   structure = gst_caps_get_structure (caps, 0);
   s = gst_structure_get_string (structure, "format");
-  output_format = gst_video_format_from_string (s);
-  features = gst_caps_features_copy (gst_caps_get_features (caps, 0));
-
-  gst_caps_unref (caps);
-
-  if (!gst_vtdec_create_session (vtdec, output_format)) {
-    gst_caps_features_free (features);
-    return FALSE;
-  }
+  format = gst_video_format_from_string (s);
+  features = gst_caps_get_features (caps, 0);
+  if (features)
+    features = gst_caps_features_copy (features);
 
   output_state = gst_video_decoder_set_output_state (GST_VIDEO_DECODER (vtdec),
-      output_format, vtdec->video_info.width, vtdec->video_info.height,
-      input_state);
-
+      format, vtdec->video_info.width, vtdec->video_info.height,
+      vtdec->input_state);
   output_state->caps = gst_video_info_to_caps (&output_state->info);
-  gst_caps_set_features (output_state->caps, 0, features);
+  if (features) {
+    gst_caps_set_features (output_state->caps, 0, features);
+    output_textures =
+        gst_caps_features_contains (features,
+        GST_CAPS_FEATURE_MEMORY_GL_MEMORY);
+    if (output_textures)
+      gst_caps_set_simple (output_state->caps, "texture-target", G_TYPE_STRING,
+#if !HAVE_IOS
+          GST_GL_TEXTURE_TARGET_RECTANGLE_STR,
+#else
+          GST_GL_TEXTURE_TARGET_2D_STR,
+#endif
+          NULL);
+  }
+  gst_caps_unref (caps);
 
-  return TRUE;
+  prevcaps = gst_pad_get_current_caps (decoder->srcpad);
+  if (!prevcaps || !gst_caps_is_equal (prevcaps, output_state->caps)) {
+    GST_INFO_OBJECT (vtdec, "negotiated output format %" GST_PTR_FORMAT,
+        output_state->caps);
+
+    if (vtdec->session) {
+      gst_vtdec_push_frames_if_needed (vtdec, TRUE, FALSE);
+      gst_vtdec_invalidate_session (vtdec);
+    }
+
+    ret = gst_vtdec_create_session (vtdec, format);
+    if (ret) {
+      if (vtdec->texture_cache) {
+        gst_video_texture_cache_free (vtdec->texture_cache);
+        vtdec->texture_cache = NULL;
+      }
+
+      if (output_textures)
+        setup_texture_cache (vtdec, context);
+    }
+  }
+
+  if (prevcaps)
+    gst_caps_unref (prevcaps);
+  if (context)
+    gst_object_unref (context);
+
+  if (!ret)
+    return ret;
+
+  return GST_VIDEO_DECODER_CLASS (gst_vtdec_parent_class)->negotiate (decoder);
 }
 
 static gboolean
@@ -334,8 +354,10 @@
     return TRUE;
   }
 
-  if (vtdec->session)
+  if (vtdec->session) {
+    gst_vtdec_push_frames_if_needed (vtdec, TRUE, FALSE);
     gst_vtdec_invalidate_session (vtdec);
+  }
 
   gst_video_info_from_caps (&vtdec->video_info, state->caps);
 
@@ -355,8 +377,9 @@
     CFRelease (vtdec->format_description);
   vtdec->format_description = format_description;
 
-  if (!gst_vtdec_negotiate_output_format (vtdec, state))
-    return FALSE;
+  if (vtdec->input_state)
+    gst_video_codec_state_unref (vtdec->input_state);
+  vtdec->input_state = gst_video_codec_state_ref (state);
 
   return TRUE;
 }
@@ -433,6 +456,16 @@
   goto out;
 }
 
+static void
+gst_vtdec_invalidate_session (GstVtdec * vtdec)
+{
+  g_return_if_fail (vtdec->session);
+
+  VTDecompressionSessionInvalidate (vtdec->session);
+  CFRelease (vtdec->session);
+  vtdec->session = NULL;
+}
+
 static gboolean
 gst_vtdec_create_session (GstVtdec * vtdec, GstVideoFormat format)
 {
@@ -440,7 +473,9 @@
   VTDecompressionOutputCallbackRecord callback;
   CFMutableDictionaryRef videoDecoderSpecification;
   OSStatus status;
-  guint32 cv_format;
+  guint32 cv_format = 0;
+
+  g_return_val_if_fail (vtdec->session == NULL, FALSE);
 
   switch (format) {
     case GST_VIDEO_FORMAT_NV12:
@@ -450,11 +485,7 @@
       cv_format = kCVPixelFormatType_422YpCbCr8;
       break;
     case GST_VIDEO_FORMAT_RGBA:
-#ifdef HAVE_IOS
       cv_format = kCVPixelFormatType_420YpCbCr8BiPlanarVideoRange;
-#else
-      cv_format = kCVPixelFormatType_422YpCbCr8;
-#endif
       break;
     default:
       g_warn_if_reached ();
@@ -503,16 +534,6 @@
   return TRUE;
 }
 
-static void
-gst_vtdec_invalidate_session (GstVtdec * vtdec)
-{
-  g_return_if_fail (vtdec->session);
-
-  VTDecompressionSessionInvalidate (vtdec->session);
-  CFRelease (vtdec->session);
-  vtdec->session = NULL;
-}
-
 static CMFormatDescriptionRef
 create_format_description (GstVtdec * vtdec, CMVideoCodecType cm_format)
 {
@@ -702,8 +723,11 @@
 
   frame1 = (GstVideoCodecFrame *) f1;
   frame2 = (GstVideoCodecFrame *) f2;
-  pts1 = GST_BUFFER_PTS (frame1->output_buffer);
-  pts2 = GST_BUFFER_PTS (frame2->output_buffer);
+  pts1 = pts2 = GST_CLOCK_TIME_NONE;
+  if (frame1->output_buffer)
+    pts1 = GST_BUFFER_PTS (frame1->output_buffer);
+  if (frame2->output_buffer)
+    pts2 = GST_BUFFER_PTS (frame2->output_buffer);
 
   if (!GST_CLOCK_TIME_IS_VALID (pts1) || !GST_CLOCK_TIME_IS_VALID (pts2))
     return 0;
@@ -723,58 +747,47 @@
 {
   GstVtdec *vtdec = (GstVtdec *) decompression_output_ref_con;
   GstVideoCodecFrame *frame = (GstVideoCodecFrame *) source_frame_ref_con;
-  GstBuffer *buf;
   GstVideoCodecState *state;
 
   GST_LOG_OBJECT (vtdec, "got output frame %p %d and VT buffer %p", frame,
       frame->decode_frame_number, image_buffer);
 
+  frame->output_buffer = NULL;
+
   if (status != noErr) {
     GST_ERROR_OBJECT (vtdec, "Error decoding frame %d", (int) status);
-    goto drop;
   }
 
-  if (image_buffer == NULL) {
-    if (info_flags & kVTDecodeInfo_FrameDropped)
-      GST_DEBUG_OBJECT (vtdec, "Frame dropped by video toolbox");
-    else
+  if (image_buffer) {
+    GstBuffer *buf = NULL;
+
+    /* FIXME: use gst_video_decoder_allocate_output_buffer */
+    state = gst_video_decoder_get_output_state (GST_VIDEO_DECODER (vtdec));
+    if (state == NULL) {
+      GST_WARNING_OBJECT (vtdec, "Output state not configured, release buffer");
+      frame->flags &= VTDEC_FRAME_FLAG_SKIP;
+    } else {
+      buf =
+          gst_core_video_buffer_new (image_buffer, &state->info,
+          vtdec->texture_cache == NULL);
+      gst_video_codec_state_unref (state);
+      GST_BUFFER_PTS (buf) = pts.value;
+      GST_BUFFER_DURATION (buf) = duration.value;
+      frame->output_buffer = buf;
+    }
+  } else {
+    if (info_flags & kVTDecodeInfo_FrameDropped) {
+      GST_DEBUG_OBJECT (vtdec, "Frame dropped by video toolbox %p %d",
+          frame, frame->decode_frame_number);
+      frame->flags |= VTDEC_FRAME_FLAG_DROP;
+    } else {
       GST_DEBUG_OBJECT (vtdec, "Decoded frame is NULL");
-    goto drop;
+      frame->flags |= VTDEC_FRAME_FLAG_SKIP;
+    }
   }
 
-  /* FIXME: use gst_video_decoder_allocate_output_buffer */
-  state = gst_video_decoder_get_output_state (GST_VIDEO_DECODER (vtdec));
-  if (state == NULL) {
-    GST_WARNING_OBJECT (vtdec, "Output state not configured, release buffer");
-    /* release as this usually means that the baseclass isn't ready to do
-     * the QoS that _drop requires and will lead to an assertion with the
-     * segment.format being undefined */
-    goto release;
-  }
-  buf =
-      gst_core_video_buffer_new (image_buffer, &state->info,
-      vtdec->texture_cache == NULL);
-  gst_video_codec_state_unref (state);
-
-  GST_BUFFER_PTS (buf) = pts.value;
-  GST_BUFFER_DURATION (buf) = duration.value;
-  frame->output_buffer = buf;
   g_async_queue_push_sorted (vtdec->reorder_queue, frame,
       sort_frames_by_pts, NULL);
-
-  return;
-
-drop:
-  GST_WARNING_OBJECT (vtdec, "Frame dropped %p %d", frame,
-      frame->decode_frame_number);
-  gst_video_decoder_drop_frame (GST_VIDEO_DECODER (vtdec), frame);
-  return;
-
-release:
-  GST_WARNING_OBJECT (vtdec, "Frame released %p %d", frame,
-      frame->decode_frame_number);
-  gst_video_decoder_release_frame (GST_VIDEO_DECODER (vtdec), frame);
-  return;
 }
 
 static GstFlowReturn
@@ -785,13 +798,11 @@
   GstFlowReturn ret = GST_FLOW_OK;
   GstVideoDecoder *decoder = GST_VIDEO_DECODER (vtdec);
 
-  /* FIXME: Instead of this, implement GstVideoDecoder::negotiate() and
-   * just call gst_video_decoder_negotiate()
-   */
   /* negotiate now so that we know whether we need to use the GL upload meta or
    * not */
-  if (gst_pad_check_reconfigure (decoder->srcpad))
+  if (gst_pad_check_reconfigure (decoder->srcpad)) {
     gst_video_decoder_negotiate (decoder);
+  }
 
   if (drain)
     VTDecompressionSessionWaitForAsynchronousFrames (vtdec->session);
@@ -802,9 +813,9 @@
   while ((g_async_queue_length (vtdec->reorder_queue) >=
           vtdec->reorder_queue_length) || drain || flush) {
     frame = (GstVideoCodecFrame *) g_async_queue_try_pop (vtdec->reorder_queue);
-    if (frame && vtdec->texture_cache != NULL) {
+    if (frame && frame->output_buffer && vtdec->texture_cache != NULL) {
       frame->output_buffer =
-          gst_core_video_texture_cache_get_gl_buffer (vtdec->texture_cache,
+          gst_video_texture_cache_get_gl_buffer (vtdec->texture_cache,
           frame->output_buffer);
       if (!frame->output_buffer)
         GST_ERROR_OBJECT (vtdec, "couldn't get textures from buffer");
@@ -814,7 +825,9 @@
      * example) or we're draining/flushing
      */
     if (frame) {
-      if (flush)
+      if (flush || frame->flags & VTDEC_FRAME_FLAG_SKIP)
+        gst_video_decoder_release_frame (decoder, frame);
+      else if (frame->flags & VTDEC_FRAME_FLAG_DROP)
         gst_video_decoder_drop_frame (decoder, frame);
       else
         ret = gst_video_decoder_finish_frame (decoder, frame);
diff --git a/sys/applemedia/vtdec.h b/sys/applemedia/vtdec.h
index 4b9c788..7d194f4 100644
--- a/sys/applemedia/vtdec.h
+++ b/sys/applemedia/vtdec.h
@@ -25,7 +25,7 @@
 #include <gst/video/gstvideodecoder.h>
 #include <CoreMedia/CoreMedia.h>
 #include <VideoToolbox/VideoToolbox.h>
-#include "corevideotexturecache.h"
+#include "videotexturecache.h"
 
 G_BEGIN_DECLS
 
@@ -41,12 +41,13 @@
 struct _GstVtdec
 {
   GstVideoDecoder base_vtdec;
+  GstVideoCodecState *input_state;
   GstVideoInfo video_info;
   CMFormatDescriptionRef format_description;
   VTDecompressionSessionRef session;
   GAsyncQueue *reorder_queue;
   gint reorder_queue_length;
-  GstCoreVideoTextureCache *texture_cache;
+  GstVideoTextureCache *texture_cache;
 
   gboolean require_hardware;
 };
diff --git a/sys/avc/Makefile.in b/sys/avc/Makefile.in
index 722de5f..7f08043 100644
--- a/sys/avc/Makefile.in
+++ b/sys/avc/Makefile.in
@@ -275,6 +275,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -312,6 +314,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -339,6 +343,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -357,6 +363,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -367,6 +375,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -392,6 +402,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -417,6 +429,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -548,6 +562,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -605,8 +621,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -676,6 +696,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/bluez/Makefile.in b/sys/bluez/Makefile.in
index 6db6692..78bd35b 100644
--- a/sys/bluez/Makefile.in
+++ b/sys/bluez/Makefile.in
@@ -280,6 +280,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -317,6 +319,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -344,6 +348,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -362,6 +368,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -372,6 +380,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -397,6 +407,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -422,6 +434,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -553,6 +567,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -610,8 +626,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -681,6 +701,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/bluez/gsta2dpsink.c b/sys/bluez/gsta2dpsink.c
index 7b9f922..424b56c 100644
--- a/sys/bluez/gsta2dpsink.c
+++ b/sys/bluez/gsta2dpsink.c
@@ -157,8 +157,7 @@
       if (self->sink != NULL)
         gst_avdtp_sink_set_device (self->sink, g_value_get_string (value));
 
-      if (self->device != NULL)
-        g_free (self->device);
+      g_free (self->device);
       self->device = g_value_dup_string (value);
       break;
 
@@ -166,8 +165,7 @@
       if (self->sink != NULL)
         gst_avdtp_sink_set_transport (self->sink, g_value_get_string (value));
 
-      if (self->transport != NULL)
-        g_free (self->transport);
+      g_free (self->transport);
       self->transport = g_value_dup_string (value);
       break;
 
diff --git a/sys/bluez/gstavdtpsink.c b/sys/bluez/gstavdtpsink.c
index 70dc742..0f72a74 100644
--- a/sys/bluez/gstavdtpsink.c
+++ b/sys/bluez/gstavdtpsink.c
@@ -451,8 +451,7 @@
 void
 gst_avdtp_sink_set_device (GstAvdtpSink * self, const gchar * dev)
 {
-  if (self->conn.device != NULL)
-    g_free (self->conn.device);
+  g_free (self->conn.device);
 
   GST_LOG_OBJECT (self, "Setting device: %s", dev);
   self->conn.device = g_strdup (dev);
@@ -461,8 +460,7 @@
 void
 gst_avdtp_sink_set_transport (GstAvdtpSink * self, const gchar * trans)
 {
-  if (self->conn.transport != NULL)
-    g_free (self->conn.transport);
+  g_free (self->conn.transport);
 
   GST_LOG_OBJECT (self, "Setting transport: %s", trans);
   self->conn.transport = g_strdup (trans);
diff --git a/sys/bluez/gstavdtputil.c b/sys/bluez/gstavdtputil.c
index a435c6a..efc4f42 100644
--- a/sys/bluez/gstavdtputil.c
+++ b/sys/bluez/gstavdtputil.c
@@ -213,8 +213,7 @@
 void
 gst_avdtp_connection_set_device (GstAvdtpConnection * conn, const char *device)
 {
-  if (conn->device)
-    g_free (conn->device);
+  g_free (conn->device);
 
   conn->device = g_strdup (device);
 }
@@ -223,8 +222,7 @@
 gst_avdtp_connection_set_transport (GstAvdtpConnection * conn,
     const char *transport)
 {
-  if (conn->transport)
-    g_free (conn->transport);
+  g_free (conn->transport);
 
   conn->transport = g_strdup (transport);
 }
diff --git a/sys/d3dvideosink/Makefile.in b/sys/d3dvideosink/Makefile.in
index b37288a..de13582 100644
--- a/sys/d3dvideosink/Makefile.in
+++ b/sys/d3dvideosink/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/decklink/Makefile.in b/sys/decklink/Makefile.in
index a520545..8d6c297 100644
--- a/sys/decklink/Makefile.in
+++ b/sys/decklink/Makefile.in
@@ -296,6 +296,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -333,6 +335,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -360,6 +364,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -378,6 +384,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -388,6 +396,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -413,6 +423,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -438,6 +450,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -569,6 +583,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -626,8 +642,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -697,6 +717,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/decklink/gstdecklink.cpp b/sys/decklink/gstdecklink.cpp
index eb39bdb..c0d1128 100644
--- a/sys/decklink/gstdecklink.cpp
+++ b/sys/decklink/gstdecklink.cpp
@@ -358,6 +358,24 @@
   return caps;
 }
 
+const GstDecklinkMode *
+gst_decklink_find_mode_for_caps (GstCaps * caps)
+{
+  int i;
+  GstCaps *mode_caps;
+
+  for (i = 1; i < (int) G_N_ELEMENTS (modes); i++) {
+    mode_caps = gst_decklink_mode_get_caps ((GstDecklinkModeEnum) i);
+    if (gst_caps_can_intersect (caps, mode_caps)) {
+      gst_caps_unref (mode_caps);
+      return gst_decklink_get_mode ((GstDecklinkModeEnum) i);
+    }
+    gst_caps_unref (mode_caps);
+  }
+
+  return NULL;
+}
+
 #define GST_TYPE_DECKLINK_CLOCK \
   (gst_decklink_clock_get_type())
 #define GST_DECKLINK_CLOCK(obj) \
diff --git a/sys/decklink/gstdecklink.h b/sys/decklink/gstdecklink.h
index 353769f..493b48e 100644
--- a/sys/decklink/gstdecklink.h
+++ b/sys/decklink/gstdecklink.h
@@ -192,4 +192,6 @@
 GstDecklinkInput *  gst_decklink_acquire_nth_input (gint n, GstElement * src, gboolean is_audio);
 void                gst_decklink_release_nth_input (gint n, GstElement * src, gboolean is_audio);
 
+const GstDecklinkMode * gst_decklink_find_mode_for_caps (GstCaps * caps);
+
 #endif
diff --git a/sys/decklink/gstdecklinkaudiosrc.cpp b/sys/decklink/gstdecklinkaudiosrc.cpp
index a9284d1..e5ac8ae 100644
--- a/sys/decklink/gstdecklinkaudiosrc.cpp
+++ b/sys/decklink/gstdecklinkaudiosrc.cpp
@@ -688,8 +688,7 @@
 {
   GST_DEBUG_OBJECT (self, "Stopping");
 
-  g_queue_foreach (&self->current_packets, (GFunc) capture_packet_free,
-      NULL);
+  g_queue_foreach (&self->current_packets, (GFunc) capture_packet_free, NULL);
   g_queue_clear (&self->current_packets);
 
   if (self->input && self->input->audio_enabled) {
diff --git a/sys/decklink/gstdecklinkvideosink.cpp b/sys/decklink/gstdecklinkvideosink.cpp
index c50d09b..7111cb1 100644
--- a/sys/decklink/gstdecklinkvideosink.cpp
+++ b/sys/decklink/gstdecklinkvideosink.cpp
@@ -292,8 +292,17 @@
   self->output->output->SetScheduledFrameCompletionCallback (new
       GStreamerVideoOutputCallback (self));
 
-  mode = gst_decklink_get_mode (self->mode);
-  g_assert (mode != NULL);
+  if (self->mode == GST_DECKLINK_MODE_AUTO) {
+    mode = gst_decklink_find_mode_for_caps (caps);
+    if (mode == NULL) {
+      GST_WARNING_OBJECT (self,
+          "Failed to find compatible mode for caps  %" GST_PTR_FORMAT, caps);
+      return FALSE;
+    }
+  } else {
+    mode = gst_decklink_get_mode (self->mode);
+    g_assert (mode != NULL);
+  };
 
   ret = self->output->output->EnableVideoOutput (mode->mode,
       bmdVideoOutputFlagDefault);
@@ -318,7 +327,10 @@
   GstDecklinkVideoSink *self = GST_DECKLINK_VIDEO_SINK_CAST (bsink);
   GstCaps *mode_caps, *caps;
 
-  mode_caps = gst_decklink_mode_get_caps (self->mode);
+  if (self->mode == GST_DECKLINK_MODE_AUTO)
+    mode_caps = gst_decklink_mode_get_template_caps ();
+  else
+    mode_caps = gst_decklink_mode_get_caps (self->mode);
   mode_caps = gst_caps_make_writable (mode_caps);
   /* For output we support any framerate and only really care about timestamps */
   gst_caps_map_in_place (mode_caps, reset_framerate, NULL);
diff --git a/sys/directsound/Makefile.in b/sys/directsound/Makefile.in
index 48ca630..ebb8578 100644
--- a/sys/directsound/Makefile.in
+++ b/sys/directsound/Makefile.in
@@ -278,6 +278,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -315,6 +317,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -342,6 +346,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -360,6 +366,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -370,6 +378,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -395,6 +405,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -420,6 +432,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -551,6 +565,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -608,8 +624,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -679,6 +699,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/directsound/gstdirectsoundsrc.c b/sys/directsound/gstdirectsoundsrc.c
index 3b01f06..b88e68e 100644
--- a/sys/directsound/gstdirectsoundsrc.c
+++ b/sys/directsound/gstdirectsoundsrc.c
@@ -45,7 +45,7 @@
  */
 
 /*
-  TODO: add device selection and check rate etc.
+  TODO: add mixer device init for selection by device-guid
 */
 
 /**
@@ -56,7 +56,7 @@
  * <refsect2>
  * <title>Example pipelines</title>
  * |[
- * gst-launch -v directsoundsrc ! audioconvert ! vorbisenc ! oggmux ! filesink location=dsound.ogg
+ * gst-launch-1.0 -v directsoundsrc ! audioconvert ! vorbisenc ! oggmux ! filesink location=dsound.ogg
  * ]| Record from DirectSound and encode to Ogg/Vorbis.
  * </refsect2>
  */
@@ -87,6 +87,7 @@
 {
   PROP_0,
   PROP_DEVICE_NAME,
+  PROP_DEVICE,
   PROP_VOLUME,
   PROP_MUTE
 };
@@ -130,6 +131,11 @@
 static void gst_directsound_src_set_mute (GstDirectSoundSrc * dsoundsrc,
     gboolean mute);
 
+static const gchar *gst_directsound_src_get_device (GstDirectSoundSrc *
+    dsoundsrc);
+static void gst_directsound_src_set_device (GstDirectSoundSrc * dsoundsrc,
+    const gchar * device_id);
+
 static GstStaticPadTemplate directsound_src_src_factory =
 GST_STATIC_PAD_TEMPLATE ("src",
     GST_PAD_SRC,
@@ -158,6 +164,9 @@
   g_mutex_clear (&dsoundsrc->dsound_lock);
 
   g_free (dsoundsrc->device_name);
+
+  g_free (dsoundsrc->device_id);
+
   g_free (dsoundsrc->device_guid);
 
   G_OBJECT_CLASS (parent_class)->finalize (object);
@@ -212,6 +221,12 @@
       g_param_spec_string ("device-name", "Device name",
           "Human-readable name of the sound device", NULL, G_PARAM_READWRITE));
 
+  g_object_class_install_property (gobject_class,
+      PROP_DEVICE,
+      g_param_spec_string ("device", "Device",
+          "DirectSound playback device as a GUID string (volume and mute will not work!)",
+          NULL, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
   g_object_class_install_property
       (gobject_class, PROP_VOLUME,
       g_param_spec_double ("volume", "Volume",
@@ -251,7 +266,6 @@
       if (g_value_get_string (value)) {
         src->device_name = g_strdup (g_value_get_string (value));
       }
-
       break;
     case PROP_VOLUME:
       gst_directsound_src_set_volume (src, g_value_get_double (value));
@@ -259,6 +273,9 @@
     case PROP_MUTE:
       gst_directsound_src_set_mute (src, g_value_get_boolean (value));
       break;
+    case PROP_DEVICE:
+      gst_directsound_src_set_device (src, g_value_get_string (value));
+      break;
     default:
       G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
       break;
@@ -277,6 +294,9 @@
     case PROP_DEVICE_NAME:
       g_value_set_string (value, src->device_name);
       break;
+    case PROP_DEVICE:
+      g_value_set_string (value, gst_directsound_src_get_device (src));
+      break;
     case PROP_VOLUME:
       g_value_set_double (value, gst_directsound_src_get_volume (src));
       break;
@@ -301,6 +321,7 @@
   GST_DEBUG_OBJECT (src, "initializing directsoundsrc");
   g_mutex_init (&src->dsound_lock);
   src->device_guid = NULL;
+  src->device_id = NULL;
   src->device_name = NULL;
   src->mixer = NULL;
   src->control_id_mute = -1;
@@ -335,6 +356,28 @@
   return TRUE;
 }
 
+static LPGUID
+string_to_guid (const gchar * str)
+{
+  HRESULT ret;
+  gunichar2 *wstr;
+  LPGUID out;
+
+  wstr = g_utf8_to_utf16 (str, -1, NULL, NULL, NULL);
+  if (!wstr)
+    return NULL;
+
+  out = g_new (GUID, 1);
+  ret = CLSIDFromString ((LPOLESTR) wstr, out);
+  g_free (wstr);
+  if (ret != NOERROR) {
+    g_free (out);
+    return NULL;
+  }
+
+  return out;
+}
+
 static gboolean
 gst_directsound_src_open (GstAudioSrc * asrc)
 {
@@ -361,19 +404,37 @@
     goto capture_function;
   }
 
-  hRes = DirectSoundCaptureEnumerate ((LPDSENUMCALLBACK)
-      gst_directsound_enum_callback, (VOID *) dsoundsrc);
-  if (FAILED (hRes)) {
-    goto capture_enumerate;
-  }
+  if (dsoundsrc->device_id) {
+    GST_DEBUG_OBJECT (asrc, "device id set to: %s ", dsoundsrc->device_id);
+    dsoundsrc->device_guid = string_to_guid (dsoundsrc->device_id);
+    if (dsoundsrc->device_guid == NULL) {
+      GST_ELEMENT_ERROR (dsoundsrc, RESOURCE, OPEN_READ,
+          ("gst_directsound_src_open: device set, but guid not found: %s",
+              dsoundsrc->device_id), (NULL));
+      g_free (dsoundsrc->device_guid);
+      return FALSE;
+    }
+  } else {
 
+    hRes = DirectSoundCaptureEnumerate ((LPDSENUMCALLBACK)
+        gst_directsound_enum_callback, (VOID *) dsoundsrc);
+
+    if (FAILED (hRes)) {
+      goto capture_enumerate;
+    }
+  }
   /* Create capture object */
   hRes = pDSoundCaptureCreate (dsoundsrc->device_guid, &dsoundsrc->pDSC, NULL);
+
+
   if (FAILED (hRes)) {
     goto capture_object;
   }
+  // mixer is only supported when device-id is not set
+  if (!dsoundsrc->device_id) {
+    gst_directsound_src_mixer_init (dsoundsrc);
+  }
 
-  gst_directsound_src_mixer_init (dsoundsrc);
   return TRUE;
 
 capture_function:
@@ -936,3 +997,17 @@
   else
     dsoundsrc->mute = mute;
 }
+
+static const gchar *
+gst_directsound_src_get_device (GstDirectSoundSrc * dsoundsrc)
+{
+  return dsoundsrc->device_id;
+}
+
+static void
+gst_directsound_src_set_device (GstDirectSoundSrc * dsoundsrc,
+    const gchar * device_id)
+{
+  g_free (dsoundsrc->device_id);
+  dsoundsrc->device_id = g_strdup (device_id);
+}
diff --git a/sys/directsound/gstdirectsoundsrc.h b/sys/directsound/gstdirectsoundsrc.h
index a2ac6ff..9aa225f 100644
--- a/sys/directsound/gstdirectsoundsrc.h
+++ b/sys/directsound/gstdirectsoundsrc.h
@@ -1,97 +1,97 @@
-/*

- * GStreamer

- * Copyright 2005 Thomas Vander Stichele <thomas@apestaart.org>

- * Copyright 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>

- * Copyright 2005 Sébastien Moutte <sebastien@moutte.net>

- * Copyright 2006 Joni Valtanen <joni.valtanen@movial.fi>

- * 

- * Permission is hereby granted, free of charge, to any person obtaining a

- * copy of this software and associated documentation files (the "Software"),

- * to deal in the Software without restriction, including without limitation

- * the rights to use, copy, modify, merge, publish, distribute, sublicense,

- * and/or sell copies of the Software, and to permit persons to whom the

- * Software is furnished to do so, subject to the following conditions:

- *

- * The above copyright notice and this permission notice shall be included in

- * all copies or substantial portions of the Software.

- *

- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR

- * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,

- * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE

- * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER

- * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING

- * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER

- * DEALINGS IN THE SOFTWARE.

- *

- * Alternatively, the contents of this file may be used under the

- * GNU Lesser General Public License Version 2.1 (the "LGPL"), in

- * which case the following provisions apply instead of the ones

- * mentioned above:

- *

- * 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_DIRECTSOUNDSRC_H__

-#define __GST_DIRECTSOUNDSRC_H__

-

-#include <gst/gst.h>

-#include <gst/audio/audio.h>

-#include <gst/audio/gstaudiosrc.h>

-#include <windows.h>

-#include <dsound.h>

+/*
+ * GStreamer
+ * Copyright 2005 Thomas Vander Stichele <thomas@apestaart.org>
+ * Copyright 2005 Ronald S. Bultje <rbultje@ronald.bitfreak.net>
+ * Copyright 2005 Sébastien Moutte <sebastien@moutte.net>
+ * Copyright 2006 Joni Valtanen <joni.valtanen@movial.fi>
+ * 
+ * Permission is hereby granted, free of charge, to any person obtaining a
+ * copy of this software and associated documentation files (the "Software"),
+ * to deal in the Software without restriction, including without limitation
+ * the rights to use, copy, modify, merge, publish, distribute, sublicense,
+ * and/or sell copies of the Software, and to permit persons to whom the
+ * Software is furnished to do so, subject to the following conditions:
+ *
+ * The above copyright notice and this permission notice shall be included in
+ * all copies or substantial portions of the Software.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+ * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+ * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+ * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+ * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ *
+ * Alternatively, the contents of this file may be used under the
+ * GNU Lesser General Public License Version 2.1 (the "LGPL"), in
+ * which case the following provisions apply instead of the ones
+ * mentioned above:
+ *
+ * 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_DIRECTSOUNDSRC_H__
+#define __GST_DIRECTSOUNDSRC_H__
+
+#include <gst/gst.h>
+#include <gst/audio/audio.h>
+#include <gst/audio/gstaudiosrc.h>
+#include <windows.h>
+#include <dsound.h>
 #include <mmsystem.h>
-

-/* add here some headers if needed */

-

-

-G_BEGIN_DECLS

-

-/* #defines don't like whitespacey bits */

-#define GST_TYPE_DIRECTSOUND_SRC (gst_directsound_src_get_type())

-#define GST_DIRECTSOUND_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DIRECTSOUND_SRC,GstDirectSoundSrc))

-#define GST_DIRECTSOUND_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DIRECTSOUND_SRC,GstDirectSoundSrcClass))

-#define GST_IS_DIRECTSOUND_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DIRECTSOUND_SRC))

-#define GST_IS_DIRECTSOUND_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DIRECTSOUND_SRC))

-

-typedef struct _GstDirectSoundSrc      GstDirectSoundSrc;

-typedef struct _GstDirectSoundSrcClass GstDirectSoundSrcClass;

-

-#define GST_DSOUND_LOCK(obj)	(g_mutex_lock (&obj->dsound_lock))

-#define GST_DSOUND_UNLOCK(obj)	(g_mutex_unlock (&obj->dsound_lock))

-

-struct _GstDirectSoundSrc

-{

-

-  GstAudioSrc src;

-

-  HINSTANCE DSoundDLL; /* DLL instance */

-  LPDIRECTSOUNDCAPTURE pDSC; /* DirectSoundCapture*/

-  LPDIRECTSOUNDCAPTUREBUFFER pDSBSecondary;  /*Secondaty capturebuffer*/

-  DWORD current_circular_offset;

-

-  HANDLE rghEvent;

-  DWORD notifysize;

-

-  guint buffer_size;

-  guint latency_size;

-  guint bytes_per_sample;

-

-  guint buffer_time;

-  guint latency_time;

-

+
+/* add here some headers if needed */
+
+
+G_BEGIN_DECLS
+
+/* #defines don't like whitespacey bits */
+#define GST_TYPE_DIRECTSOUND_SRC (gst_directsound_src_get_type())
+#define GST_DIRECTSOUND_SRC(obj) (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_DIRECTSOUND_SRC,GstDirectSoundSrc))
+#define GST_DIRECTSOUND_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_DIRECTSOUND_SRC,GstDirectSoundSrcClass))
+#define GST_IS_DIRECTSOUND_SRC(obj) (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_DIRECTSOUND_SRC))
+#define GST_IS_DIRECTSOUND_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_DIRECTSOUND_SRC))
+
+typedef struct _GstDirectSoundSrc      GstDirectSoundSrc;
+typedef struct _GstDirectSoundSrcClass GstDirectSoundSrcClass;
+
+#define GST_DSOUND_LOCK(obj)	(g_mutex_lock (&obj->dsound_lock))
+#define GST_DSOUND_UNLOCK(obj)	(g_mutex_unlock (&obj->dsound_lock))
+
+struct _GstDirectSoundSrc
+{
+
+  GstAudioSrc src;
+
+  HINSTANCE DSoundDLL; /* DLL instance */
+  LPDIRECTSOUNDCAPTURE pDSC; /* DirectSoundCapture*/
+  LPDIRECTSOUNDCAPTUREBUFFER pDSBSecondary;  /*Secondaty capturebuffer*/
+  DWORD current_circular_offset;
+
+  HANDLE rghEvent;
+  DWORD notifysize;
+
+  guint buffer_size;
+  guint latency_size;
+  guint bytes_per_sample;
+
+  guint buffer_time;
+  guint latency_time;
+
   HMIXER mixer;
   DWORD mixerline_cchannels;
   gint control_id_volume;
@@ -101,21 +101,23 @@
 
   glong volume;
   gboolean mute;
-

-  GUID *device_guid;

-  char *device_name;

-

-  GMutex dsound_lock;

-

-};

-

-struct _GstDirectSoundSrcClass 

-{

-  GstAudioSrcClass parent_class;

-};

-

-GType gst_directsound_src_get_type (void);

-

-G_END_DECLS

-

-#endif /* __GST_DIRECTSOUNDSRC_H__ */

+
+  GUID *device_guid;
+
+  char *device_name;
+  char *device_id;
+
+  GMutex dsound_lock;
+
+};
+
+struct _GstDirectSoundSrcClass 
+{
+  GstAudioSrcClass parent_class;
+};
+
+GType gst_directsound_src_get_type (void);
+
+G_END_DECLS
+
+#endif /* __GST_DIRECTSOUNDSRC_H__ */
diff --git a/sys/dshowdecwrapper/Makefile.in b/sys/dshowdecwrapper/Makefile.in
index 6fc8b9c..2c5e598 100644
--- a/sys/dshowdecwrapper/Makefile.in
+++ b/sys/dshowdecwrapper/Makefile.in
@@ -280,6 +280,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -317,6 +319,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -344,6 +348,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -362,6 +368,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -372,6 +380,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -397,6 +407,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -422,6 +434,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -553,6 +567,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -610,8 +626,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -681,6 +701,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/dshowdecwrapper/gstdshowaudiodec.cpp b/sys/dshowdecwrapper/gstdshowaudiodec.cpp
index caebec5..9fb83e5 100644
--- a/sys/dshowdecwrapper/gstdshowaudiodec.cpp
+++ b/sys/dshowdecwrapper/gstdshowaudiodec.cpp
@@ -854,8 +854,7 @@
 static void
 dshowadec_free_mediatype (AM_MEDIA_TYPE *mediatype)
 {
-  if (mediatype->pbFormat)
-    g_free (mediatype->pbFormat);
+  g_free (mediatype->pbFormat);
   g_free (mediatype);
 }
 
diff --git a/sys/dshowdecwrapper/gstdshowvideodec.cpp b/sys/dshowdecwrapper/gstdshowvideodec.cpp
index eac0f72..9c2f59c 100644
--- a/sys/dshowdecwrapper/gstdshowvideodec.cpp
+++ b/sys/dshowdecwrapper/gstdshowvideodec.cpp
@@ -845,8 +845,7 @@
   if (caps_out)
     gst_caps_unref (caps_out);
   gst_object_unref (vdec);
-  if (input_vheader)
-    g_free (input_vheader);
+  g_free (input_vheader);
   if (srcfilter)
     srcfilter->Release();
   if (sinkfilter)
diff --git a/sys/dshowsrcwrapper/Makefile.in b/sys/dshowsrcwrapper/Makefile.in
index facda7c..57bd497 100644
--- a/sys/dshowsrcwrapper/Makefile.in
+++ b/sys/dshowsrcwrapper/Makefile.in
@@ -191,6 +191,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -228,6 +230,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -255,6 +259,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -273,6 +279,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -283,6 +291,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -308,6 +318,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -333,6 +345,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -464,6 +478,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -521,8 +537,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -592,6 +612,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/dshowsrcwrapper/gstdshow.cpp b/sys/dshowsrcwrapper/gstdshow.cpp
index 29266ba..705adc9 100644
--- a/sys/dshowsrcwrapper/gstdshow.cpp
+++ b/sys/dshowsrcwrapper/gstdshow.cpp
@@ -125,10 +125,8 @@
 void
 gst_dshow_free_pins_mediatypes (GList * pins_mediatypes)
 {
-  while (pins_mediatypes != NULL) {
-    gst_dshow_free_pin_mediatype (pins_mediatypes->data);
-    pins_mediatypes = g_list_remove_link (pins_mediatypes, pins_mediatypes);
-  }
+  g_list_free_full (pins_mediatypes,
+      (GDestroyNotify) gst_dshow_free_pin_mediatype);
 }
 
 gboolean
@@ -273,14 +271,12 @@
       filter_temp->Release ();
     }
 
-    if (friendly_name)
-      g_free (friendly_name);
+    g_free (friendly_name);
     moniker->Release ();
   }
 
 clean:
-  if (prefered_filter_upper)
-    g_free (prefered_filter_upper);
+  g_free (prefered_filter_upper);
   if (enum_moniker)
     enum_moniker->Release ();
   if (mapper)
diff --git a/sys/dshowsrcwrapper/gstdshowvideosrc.cpp b/sys/dshowsrcwrapper/gstdshowvideosrc.cpp
index 846c050..7725fcb 100644
--- a/sys/dshowsrcwrapper/gstdshowvideosrc.cpp
+++ b/sys/dshowsrcwrapper/gstdshowvideosrc.cpp
@@ -396,9 +396,7 @@
     }
   }
 
-  if (unidevice) {
-    g_free (unidevice);
-  }
+  g_free (unidevice);
 
   if (src->caps) {
     GstCaps *caps;
diff --git a/sys/dshowvideosink/Makefile.in b/sys/dshowvideosink/Makefile.in
index 57ab485..d73795f 100644
--- a/sys/dshowvideosink/Makefile.in
+++ b/sys/dshowvideosink/Makefile.in
@@ -191,6 +191,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -228,6 +230,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -255,6 +259,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -273,6 +279,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -283,6 +291,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -308,6 +318,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -333,6 +345,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -464,6 +478,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -521,8 +537,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -592,6 +612,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/dshowvideosink/dshowvideosink.cpp b/sys/dshowvideosink/dshowvideosink.cpp
index cd7b212..c3d4bc3 100644
--- a/sys/dshowvideosink/dshowvideosink.cpp
+++ b/sys/dshowvideosink/dshowvideosink.cpp
@@ -285,8 +285,7 @@
 {
   GstDshowVideoSink *sink = GST_DSHOWVIDEOSINK (gobject);
 
-  if (sink->preferredrenderer)
-    g_free (sink->preferredrenderer);
+  g_free (sink->preferredrenderer);
 
   /* signal the COM thread that it sould uninitialize COM */
   if (sink->comInitialized) {
@@ -315,9 +314,7 @@
 
   switch (prop_id) {
     case PROP_RENDERER:
-      if (sink->preferredrenderer)
-        g_free (sink->preferredrenderer);
-
+      g_free (sink->preferredrenderer);
       sink->preferredrenderer = g_value_dup_string (value);
       break;
     case PROP_KEEP_ASPECT_RATIO:
diff --git a/sys/dvb/Makefile.in b/sys/dvb/Makefile.in
index aab35d4..3461695 100644
--- a/sys/dvb/Makefile.in
+++ b/sys/dvb/Makefile.in
@@ -284,6 +284,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -321,6 +323,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -348,6 +352,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -366,6 +372,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -376,6 +384,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -401,6 +411,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -426,6 +438,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -557,6 +571,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -614,8 +630,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -685,6 +705,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/dvb/README b/sys/dvb/README
index 1329da9..4d3c83b 100644
--- a/sys/dvb/README
+++ b/sys/dvb/README
@@ -5,7 +5,7 @@
 
 Try:
 
-     gst-launch dvbsrc frequency=11954 polarity=h symbol-rate=27500 pids=210:220
+     gst-launch-1.0 dvbsrc frequency=11954 polarity=h symbol-rate=27500 pids=210:220
          ! mpegtsdemux es-pids=210:220 name=demux ! queue ! mpeg2dec
          ! xvimagesink demux. ! queue ! mad ! audioconvert ! autoaudiosink
 
diff --git a/sys/dvb/camswclient.c b/sys/dvb/camswclient.c
index f5d07cf..68a3d43 100644
--- a/sys/dvb/camswclient.c
+++ b/sys/dvb/camswclient.c
@@ -52,8 +52,7 @@
   if (client->sock)
     close (client->sock);
 
-  if (client->sock_path)
-    g_free (client->sock_path);
+  g_free (client->sock_path);
 }
 
 void
diff --git a/sys/dvb/dvbbasebin.c b/sys/dvb/dvbbasebin.c
index 2e6dcfd..f003355 100644
--- a/sys/dvb/dvbbasebin.c
+++ b/sys/dvb/dvbbasebin.c
@@ -597,8 +597,7 @@
 
   /* FIXME : Deactivate programs no longer selected */
 
-  if (dvbbasebin->program_numbers)
-    g_free (dvbbasebin->program_numbers);
+  g_free (dvbbasebin->program_numbers);
   dvbbasebin->program_numbers = g_strdup (pn);
 
   if (0)
diff --git a/sys/dvb/gstdvbsrc.c b/sys/dvb/gstdvbsrc.c
index adbc973..18544e7 100644
--- a/sys/dvb/gstdvbsrc.c
+++ b/sys/dvb/gstdvbsrc.c
@@ -28,16 +28,16 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch dvbsrc modulation="QAM 64" trans-mode=8k bandwidth=8 frequency=514000000 code-rate-lp=AUTO code-rate-hp=2/3 guard=4  hierarchy=0 ! mpegtsdemux name=demux ! queue max-size-buffers=0 max-size-time=0 ! mpeg2dec ! xvimagesink demux. ! queue max-size-buffers=0 max-size-time=0 ! mad ! alsasink
+ * gst-launch-1.0 dvbsrc modulation="QAM 64" trans-mode=8k bandwidth=8 frequency=514000000 code-rate-lp=AUTO code-rate-hp=2/3 guard=4  hierarchy=0 ! mpegtsdemux name=demux ! queue max-size-buffers=0 max-size-time=0 ! mpeg2dec ! xvimagesink demux. ! queue max-size-buffers=0 max-size-time=0 ! mad ! alsasink
  * ]| Captures a full transport stream from DVB card 0 that is a DVB-T card at tuned frequency 514000000 Hz with other parameters as seen in the pipeline and renders the first TV program on the transport stream.
  * |[
- * gst-launch dvbsrc modulation="QAM 64" trans-mode=8k bandwidth=8 frequency=514000000 code-rate-lp=AUTO code-rate-hp=2/3 guard=4  hierarchy=0 pids=100:256:257 ! mpegtsdemux name=demux ! queue max-size-buffers=0 max-size-time=0 ! mpeg2dec ! xvimagesink demux. ! queue max-size-buffers=0 max-size-time=0 ! mad ! alsasink
+ * gst-launch-1.0 dvbsrc modulation="QAM 64" trans-mode=8k bandwidth=8 frequency=514000000 code-rate-lp=AUTO code-rate-hp=2/3 guard=4  hierarchy=0 pids=100:256:257 ! mpegtsdemux name=demux ! queue max-size-buffers=0 max-size-time=0 ! mpeg2dec ! xvimagesink demux. ! queue max-size-buffers=0 max-size-time=0 ! mad ! alsasink
  * ]| Captures and renders a transport stream from DVB card 0 that is a DVB-T card for a program at tuned frequency 514000000 Hz with PMT PID 100 and elementary stream PIDs of 256, 257 with other parameters as seen in the pipeline.
  * |[
- * gst-launch dvbsrc polarity="h" frequency=11302000 symbol-rate=27500 diseqc-source=0 pids=50:102:103 ! mpegtsdemux name=demux ! queue max-size-buffers=0 max-size-time=0 ! mpeg2dec ! xvimagesink demux. ! queue max-size-buffers=0 max-size-time=0 ! mad ! alsasink
+ * gst-launch-1.0 dvbsrc polarity="h" frequency=11302000 symbol-rate=27500 diseqc-source=0 pids=50:102:103 ! mpegtsdemux name=demux ! queue max-size-buffers=0 max-size-time=0 ! mpeg2dec ! xvimagesink demux. ! queue max-size-buffers=0 max-size-time=0 ! mad ! alsasink
  * ]| Captures and renders a transport stream from DVB card 0 that is a DVB-S card for a program at tuned frequency 11302000 kHz, symbol rate of 27500 kBd (kilo bauds) with PMT PID of 50 and elementary stream PIDs of 102 and 103.
  * |[
- gst-launch dvbsrc frequency=515142857 guard=16 trans-mode="8k" isdbt-layer-enabled=7 isdbt-partial-reception=1 isdbt-layera-fec="2/3" isdbt-layera-modulation="QPSK" isdbt-layera-segment-count=1 isdbt-layera-time-interleaving=4 isdbt-layerb-fec="3/4" isdbt-layerb-modulation="qam-64" isdbt-layerb-segment-count=12 isdbt-layerb-time-interleaving=2 isdbt-layerc-fec="1/2" isdbt-layerc-modulation="qam-64" isdbt-layerc-segment-count=0 isdbt-layerc-time-interleaving=0 delsys="isdb-t" ! tsdemux ! "video/x-h264" ! h264parse ! queue ! avdec_h264 ! videoconvert ! queue ! autovideosink
+ gst-launch-1.0 dvbsrc frequency=515142857 guard=16 trans-mode="8k" isdbt-layer-enabled=7 isdbt-partial-reception=1 isdbt-layera-fec="2/3" isdbt-layera-modulation="QPSK" isdbt-layera-segment-count=1 isdbt-layera-time-interleaving=4 isdbt-layerb-fec="3/4" isdbt-layerb-modulation="qam-64" isdbt-layerb-segment-count=12 isdbt-layerb-time-interleaving=2 isdbt-layerc-fec="1/2" isdbt-layerc-modulation="qam-64" isdbt-layerc-segment-count=0 isdbt-layerc-time-interleaving=0 delsys="isdb-t" ! tsdemux ! "video/x-h264" ! h264parse ! queue ! avdec_h264 ! videoconvert ! queue ! autovideosink
  * ]| Captures and renders the video track of TV Paraíba HD (Globo affiliate) in Campina Grande, Brazil. This is an ISDB-T (Brazilian ISDB-Tb variant) broadcast.
  * </refsect2>
  */
@@ -2293,8 +2293,8 @@
     if (object->tuning_timeout)
       elapsed_time = GST_CLOCK_DIFF (start, gst_util_get_timestamp ());
     GST_LOG_OBJECT (object,
-        "Tuning. Time elapsed %" G_GUINT64_FORMAT " Limit %" G_GUINT64_FORMAT,
-        elapsed_time, object->tuning_timeout);
+        "Tuning. Time elapsed %" GST_STIME_FORMAT " Limit %" G_GUINT64_FORMAT,
+        GST_STIME_ARGS (elapsed_time), object->tuning_timeout);
   }
 
   if (!(status & FE_HAS_LOCK)) {
diff --git a/sys/dvb/parsechannels.c b/sys/dvb/parsechannels.c
index 9c46ddb..1d30580 100644
--- a/sys/dvb/parsechannels.c
+++ b/sys/dvb/parsechannels.c
@@ -54,6 +54,9 @@
   gchar **lines;
   gchar *line;
   gchar **fields;
+  int i, parsedchannels = 0;
+  GHashTable *res;
+  GError *err = NULL;
   const gchar *terrestrial[] = { "inversion", "bandwidth",
     "code-rate-hp", "code-rate-lp", "modulation", "transmission-mode",
     "guard", "hierarchy"
@@ -64,9 +67,6 @@
   const gchar *cable[] = { "inversion", "symbol-rate", "code-rate-hp",
     "modulation"
   };
-  int i, parsedchannels = 0;
-  GHashTable *res;
-  GError *err = NULL;
 
   GST_INFO_OBJECT (dvbbasebin, "parsing '%s'", filename);
 
@@ -79,18 +79,37 @@
   i = 0;
   line = lines[0];
   while (line != NULL) {
-    if (line[0] != '#') {
-      int numfields;
-      gboolean parsed = FALSE;
-      GHashTable *params = g_hash_table_new_full (g_str_hash, g_str_equal,
-          g_free, g_free);
+    GHashTable *params;
+    int j, numfields;
 
-      fields = g_strsplit (line, ":", 0);
-      numfields = g_strv_length (fields);
-      if (numfields == 8) {
-        /* satellite */
-        int j;
+    if (line[0] == '#')
+      goto next_line;
 
+    params = g_hash_table_new_full (g_str_hash, g_str_equal, g_free, g_free);
+    fields = g_strsplit (line, ":", 0);
+    numfields = g_strv_length (fields);
+
+    switch (numfields) {
+      case 13:                 /* terrestrial */
+        g_hash_table_insert (params, g_strdup ("type"),
+            g_strdup ("terrestrial"));
+        for (j = 2; j <= 9; j++) {
+          g_hash_table_insert (params, g_strdup (terrestrial[j - 2]),
+              g_strdup (fields[j]));
+        }
+        g_hash_table_insert (params, g_strdup ("frequency"),
+            g_strdup (fields[1]));
+        break;
+      case 9:                  /* cable */
+        g_hash_table_insert (params, g_strdup ("type"), g_strdup ("cable"));
+        for (j = 2; j <= 5; j++) {
+          g_hash_table_insert (params, g_strdup (cable[j - 2]),
+              g_strdup (fields[j]));
+        }
+        g_hash_table_insert (params, g_strdup ("frequency"),
+            g_strdup (fields[1]));
+        break;
+      case 8:                  /* satellite */
         g_hash_table_insert (params, g_strdup ("type"), g_strdup ("satellite"));
         for (j = 2; j <= 4; j++) {
           g_hash_table_insert (params, g_strdup (satellite[j - 2]),
@@ -107,52 +126,31 @@
           g_hash_table_insert (params, g_strdup ("frequency"),
               g_strdup_printf ("%d", atoi (fields[1])));
         }
-        parsed = TRUE;
-      } else if (numfields == 13) {
-        /* terrestrial */
-        int j;
-
-        g_hash_table_insert (params, g_strdup ("type"),
-            g_strdup ("terrestrial"));
-        for (j = 2; j <= 9; j++) {
-          g_hash_table_insert (params, g_strdup (terrestrial[j - 2]),
-              g_strdup (fields[j]));
-        }
-        g_hash_table_insert (params, g_strdup ("frequency"),
-            g_strdup (fields[1]));
-        parsed = TRUE;
-      } else if (numfields == 9) {
-        /* cable */
-        int j;
-
-        g_hash_table_insert (params, g_strdup ("type"), g_strdup ("cable"));
-        for (j = 2; j <= 5; j++) {
-          g_hash_table_insert (params, g_strdup (cable[j - 2]),
-              g_strdup (fields[j]));
-        }
-        g_hash_table_insert (params, g_strdup ("frequency"),
-            g_strdup (fields[1]));
-        parsed = TRUE;
-      } else if (numfields == 6) {
-        /* atsc (vsb/qam) */
+        break;
+      case 6:                  /* atsc (vsb/qam) */
         g_hash_table_insert (params, g_strdup ("type"), g_strdup ("atsc"));
         g_hash_table_insert (params, g_strdup ("modulation"),
             g_strdup (fields[2]));
 
         g_hash_table_insert (params, g_strdup ("frequency"),
             g_strdup (fields[1]));
-        parsed = TRUE;
-      }
-      if (parsed) {
-        g_hash_table_insert (params, g_strdup ("sid"),
-            g_strdup (fields[numfields - 1]));
-        g_hash_table_insert (res, g_strdup (fields[0]), params);
-        parsedchannels++;
-      }
-      g_strfreev (fields);
+        break;
+      default:
+        goto not_parsed;
     }
+
+    /* parsed */
+    g_hash_table_insert (params, g_strdup ("sid"),
+        g_strdup (fields[numfields - 1]));
+    g_hash_table_insert (res, g_strdup (fields[0]), params);
+    parsedchannels++;
+
+  not_parsed:
+    g_strfreev (fields);
+  next_line:
     line = lines[++i];
   }
+
   g_strfreev (lines);
   g_free (contents);
 
@@ -162,32 +160,27 @@
   return res;
 
 open_fail:
-  {
-    if (err->code == G_FILE_ERROR_NOENT) {
-      g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_NOT_FOUND,
-          _("Couldn't find DVB channel configuration file"));
-    } else {
-      g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_READ,
-          _("Couldn't load DVB channel configuration file: %s"), err->message);
-    }
-    g_clear_error (&err);
-    return NULL;
+  if (err->code == G_FILE_ERROR_NOENT) {
+    g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_NOT_FOUND,
+        _("Couldn't find DVB channel configuration file"));
+  } else {
+    g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_READ,
+        _("Couldn't load DVB channel configuration file: %s"), err->message);
   }
+  g_clear_error (&err);
+  return NULL;
 
 no_channels:
-  {
-    g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED,
-        _("DVB channel configuration file doesn't contain any channels"));
-    g_hash_table_unref (res);
-    return NULL;
-  }
+  g_set_error (error, GST_RESOURCE_ERROR, GST_RESOURCE_ERROR_FAILED,
+      _("DVB channel configuration file doesn't contain any channels"));
+  g_hash_table_unref (res);
+  return NULL;
 }
 
 static gboolean
 remove_channel_from_hash (gpointer key, gpointer value, gpointer user_data)
 {
-  if (key)
-    g_free (key);
+  g_free (key);
   if (value)
     g_hash_table_destroy ((GHashTable *) value);
   return TRUE;
diff --git a/sys/fbdev/Makefile.in b/sys/fbdev/Makefile.in
index 82a1d7d..0df6acc 100644
--- a/sys/fbdev/Makefile.in
+++ b/sys/fbdev/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/linsys/Makefile.in b/sys/linsys/Makefile.in
index 11ca764..d9dfa4d 100644
--- a/sys/linsys/Makefile.in
+++ b/sys/linsys/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/nvenc/Makefile.am b/sys/nvenc/Makefile.am
new file mode 100644
index 0000000..68c9a2c
--- /dev/null
+++ b/sys/nvenc/Makefile.am
@@ -0,0 +1,33 @@
+plugin_LTLIBRARIES = libgstnvenc.la
+
+libgstnvenc_la_SOURCES = \
+	gstnvenc.c \
+	gstnvbaseenc.c \
+	gstnvh264enc.c
+
+noinst_HEADERS = \
+	gstnvenc.h \
+	gstnvbaseenc.h \
+	gstnvh264enc.h
+
+libgstnvenc_la_CFLAGS = \
+	-I$(top_srcdir)/gst-libs \
+	$(GST_CFLAGS) \
+	$(GST_PBUTILS_CFLAGS) \
+	$(GST_VIDEO_CFLAGS) \
+	$(CUDA_CFLAGS) \
+	$(NVENCODE_CFLAGS)
+
+libgstnvenc_la_LIBADD = \
+	$(GST_LIBS) \
+	$(GST_PBUTILS_LIBS) \
+	$(GST_VIDEO_LIBS) \
+	$(CUDA_LIBS) \
+	$(NVENCODE_LIBS)
+
+if USE_NVENC_GST_GL
+libgstnvenc_la_LIBADD += \
+	$(top_builddir)/gst-libs/gst/gl/libgstgl-$(GST_API_VERSION).la
+endif
+libgstnvenc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstnvenc_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
diff --git a/gst/liveadder/Makefile.in b/sys/nvenc/Makefile.in
similarity index 84%
copy from gst/liveadder/Makefile.in
copy to sys/nvenc/Makefile.in
index ba9e5a2..ff60ba5 100644
--- a/gst/liveadder/Makefile.in
+++ b/sys/nvenc/Makefile.in
@@ -90,7 +90,10 @@
 build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
-subdir = gst/liveadder
+@USE_NVENC_GST_GL_TRUE@am__append_1 = \
+@USE_NVENC_GST_GL_TRUE@	$(top_builddir)/gst-libs/gst/gl/libgstgl-$(GST_API_VERSION).la
+
+subdir = sys/nvenc
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
 	$(top_srcdir)/common/m4/as-auto-alt.m4 \
@@ -164,18 +167,20 @@
 am__installdirs = "$(DESTDIR)$(plugindir)"
 LTLIBRARIES = $(plugin_LTLIBRARIES)
 am__DEPENDENCIES_1 =
-libgstliveadder_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_libgstliveadder_la_OBJECTS = libgstliveadder_la-liveadder.lo
-libgstliveadder_la_OBJECTS = $(am_libgstliveadder_la_OBJECTS)
+libgstnvenc_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) $(am__append_1)
+am_libgstnvenc_la_OBJECTS = libgstnvenc_la-gstnvenc.lo \
+	libgstnvenc_la-gstnvbaseenc.lo libgstnvenc_la-gstnvh264enc.lo
+libgstnvenc_la_OBJECTS = $(am_libgstnvenc_la_OBJECTS)
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
-libgstliveadder_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
-	$(libgstliveadder_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
-	$(CCLD) $(libgstliveadder_la_CFLAGS) $(CFLAGS) \
-	$(libgstliveadder_la_LDFLAGS) $(LDFLAGS) -o $@
+libgstnvenc_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(libgstnvenc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
+	$(CCLD) $(libgstnvenc_la_CFLAGS) $(CFLAGS) \
+	$(libgstnvenc_la_LDFLAGS) $(LDFLAGS) -o $@
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -210,8 +215,8 @@
 am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = $(libgstliveadder_la_SOURCES)
-DIST_SOURCES = $(libgstliveadder_la_SOURCES)
+SOURCES = $(libgstnvenc_la_SOURCES)
+DIST_SOURCES = $(libgstnvenc_la_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -237,7 +242,8 @@
   done | $(am__uniquify_input)`
 ETAGS = etags
 CTAGS = ctags
-am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp
+am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp README \
+	TODO
 DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)
 ACLOCAL = @ACLOCAL@
 ACLOCAL_AMFLAGS = @ACLOCAL_AMFLAGS@
@@ -274,6 +280,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +319,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +348,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +368,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +380,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +407,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +434,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +567,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +626,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +701,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -761,16 +788,30 @@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 wayland_scanner = @wayland_scanner@
-plugin_LTLIBRARIES = libgstliveadder.la
-libgstliveadder_la_SOURCES = liveadder.c
-libgstliveadder_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
-libgstliveadder_la_LIBADD = \
-	$(GST_PLUGINS_BASE_LIBS) -lgstaudio-@GST_API_VERSION@ \
-	$(GST_BASE_LIBS) $(GST_LIBS)
+plugin_LTLIBRARIES = libgstnvenc.la
+libgstnvenc_la_SOURCES = \
+	gstnvenc.c \
+	gstnvbaseenc.c \
+	gstnvh264enc.c
 
-libgstliveadder_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libgstliveadder_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
-noinst_HEADERS = liveadder.h
+noinst_HEADERS = \
+	gstnvenc.h \
+	gstnvbaseenc.h \
+	gstnvh264enc.h
+
+libgstnvenc_la_CFLAGS = \
+	-I$(top_srcdir)/gst-libs \
+	$(GST_CFLAGS) \
+	$(GST_PBUTILS_CFLAGS) \
+	$(GST_VIDEO_CFLAGS) \
+	$(CUDA_CFLAGS) \
+	$(NVENCODE_CFLAGS)
+
+libgstnvenc_la_LIBADD = $(GST_LIBS) $(GST_PBUTILS_LIBS) \
+	$(GST_VIDEO_LIBS) $(CUDA_LIBS) $(NVENCODE_LIBS) \
+	$(am__append_1)
+libgstnvenc_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
+libgstnvenc_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
 all: all-am
 
 .SUFFIXES:
@@ -784,9 +825,9 @@
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/liveadder/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu sys/nvenc/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu gst/liveadder/Makefile
+	  $(AUTOMAKE) --gnu sys/nvenc/Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -840,8 +881,8 @@
 	  rm -f $${locs}; \
 	}
 
-libgstliveadder.la: $(libgstliveadder_la_OBJECTS) $(libgstliveadder_la_DEPENDENCIES) $(EXTRA_libgstliveadder_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(libgstliveadder_la_LINK) -rpath $(plugindir) $(libgstliveadder_la_OBJECTS) $(libgstliveadder_la_LIBADD) $(LIBS)
+libgstnvenc.la: $(libgstnvenc_la_OBJECTS) $(libgstnvenc_la_DEPENDENCIES) $(EXTRA_libgstnvenc_la_DEPENDENCIES) 
+	$(AM_V_CCLD)$(libgstnvenc_la_LINK) -rpath $(plugindir) $(libgstnvenc_la_OBJECTS) $(libgstnvenc_la_LIBADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -849,7 +890,9 @@
 distclean-compile:
 	-rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstliveadder_la-liveadder.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstnvenc_la-gstnvbaseenc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstnvenc_la-gstnvenc.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstnvenc_la-gstnvh264enc.Plo@am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@@ -875,12 +918,26 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
-libgstliveadder_la-liveadder.lo: liveadder.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstliveadder_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstliveadder_la_CFLAGS) $(CFLAGS) -MT libgstliveadder_la-liveadder.lo -MD -MP -MF $(DEPDIR)/libgstliveadder_la-liveadder.Tpo -c -o libgstliveadder_la-liveadder.lo `test -f 'liveadder.c' || echo '$(srcdir)/'`liveadder.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstliveadder_la-liveadder.Tpo $(DEPDIR)/libgstliveadder_la-liveadder.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='liveadder.c' object='libgstliveadder_la-liveadder.lo' libtool=yes @AMDEPBACKSLASH@
+libgstnvenc_la-gstnvenc.lo: gstnvenc.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstnvenc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstnvenc_la_CFLAGS) $(CFLAGS) -MT libgstnvenc_la-gstnvenc.lo -MD -MP -MF $(DEPDIR)/libgstnvenc_la-gstnvenc.Tpo -c -o libgstnvenc_la-gstnvenc.lo `test -f 'gstnvenc.c' || echo '$(srcdir)/'`gstnvenc.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstnvenc_la-gstnvenc.Tpo $(DEPDIR)/libgstnvenc_la-gstnvenc.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstnvenc.c' object='libgstnvenc_la-gstnvenc.lo' libtool=yes @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstliveadder_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstliveadder_la_CFLAGS) $(CFLAGS) -c -o libgstliveadder_la-liveadder.lo `test -f 'liveadder.c' || echo '$(srcdir)/'`liveadder.c
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstnvenc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstnvenc_la_CFLAGS) $(CFLAGS) -c -o libgstnvenc_la-gstnvenc.lo `test -f 'gstnvenc.c' || echo '$(srcdir)/'`gstnvenc.c
+
+libgstnvenc_la-gstnvbaseenc.lo: gstnvbaseenc.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstnvenc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstnvenc_la_CFLAGS) $(CFLAGS) -MT libgstnvenc_la-gstnvbaseenc.lo -MD -MP -MF $(DEPDIR)/libgstnvenc_la-gstnvbaseenc.Tpo -c -o libgstnvenc_la-gstnvbaseenc.lo `test -f 'gstnvbaseenc.c' || echo '$(srcdir)/'`gstnvbaseenc.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstnvenc_la-gstnvbaseenc.Tpo $(DEPDIR)/libgstnvenc_la-gstnvbaseenc.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstnvbaseenc.c' object='libgstnvenc_la-gstnvbaseenc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstnvenc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstnvenc_la_CFLAGS) $(CFLAGS) -c -o libgstnvenc_la-gstnvbaseenc.lo `test -f 'gstnvbaseenc.c' || echo '$(srcdir)/'`gstnvbaseenc.c
+
+libgstnvenc_la-gstnvh264enc.lo: gstnvh264enc.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstnvenc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstnvenc_la_CFLAGS) $(CFLAGS) -MT libgstnvenc_la-gstnvh264enc.lo -MD -MP -MF $(DEPDIR)/libgstnvenc_la-gstnvh264enc.Tpo -c -o libgstnvenc_la-gstnvh264enc.lo `test -f 'gstnvh264enc.c' || echo '$(srcdir)/'`gstnvh264enc.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstnvenc_la-gstnvh264enc.Tpo $(DEPDIR)/libgstnvenc_la-gstnvh264enc.Plo
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='gstnvh264enc.c' object='libgstnvenc_la-gstnvh264enc.lo' libtool=yes @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstnvenc_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstnvenc_la_CFLAGS) $(CFLAGS) -c -o libgstnvenc_la-gstnvh264enc.lo `test -f 'gstnvh264enc.c' || echo '$(srcdir)/'`gstnvh264enc.c
 
 mostlyclean-libtool:
 	-rm -f *.lo
diff --git a/sys/nvenc/README b/sys/nvenc/README
new file mode 100644
index 0000000..62a52d1
--- /dev/null
+++ b/sys/nvenc/README
@@ -0,0 +1,30 @@
+This plugin is intended for use with NVIDIA hardware.  Specifically, the NVENC
+block available in recent NVIDIA GPU hardware.  This is provided by a
+libnvidia-encode library provided by NVIDIA graphic drivers.
+
+Requirements
+------------
+Cuda > 6.5
+NVENC 5.0
+
+See https://developer.nvidia.com/nvidia-video-codec-sdk for a list of
+supported GPU's.
+
+Building
+--------
+1. Retrieve the NVENC SDK
+from https://developer.nvidia.com/nvidia-video-codec-sdk
+- http://developer.download.nvidia.com/compute/nvenc/v5.0/nvenc_5.0.1_sdk.zip
+2. unzip this somewhere and retreive or note the location of the
+nvEncodeAPI.h under nvenc_api-5.0.1/Samples/common/inc/
+3. Retreive a version of cuda from
+https://developer.nvidia.com/cuda-downloads and install somewhere noting
+the installation prefix (typically /opt/cuda or /usr/local/cuda)
+4. Now that the dependencies are sorted, there are a couple of
+environment variables and/or or configure arguments that are needed to
+detect the necessary libraries/headers.
+
+More information is available from the following locations
+
+[1] - https://developer.nvidia.com/cuda-downloads
+[2] - https://developer.nvidia.com/nvidia-video-codec-sdk 
diff --git a/sys/nvenc/TODO b/sys/nvenc/TODO
new file mode 100644
index 0000000..27422ce
--- /dev/null
+++ b/sys/nvenc/TODO
@@ -0,0 +1,11 @@
+- check supported encoding formats (H.264 etc.), don't assume H.264
+
+- check performance (time taken) of first cuInit()
+
+- provide buffer pool
+
+- more formats
+
+- renegotiation
+
+- support outputting of AVC as well as byte-stream, negotiate automatically
diff --git a/sys/nvenc/gstnvbaseenc.c b/sys/nvenc/gstnvbaseenc.c
new file mode 100644
index 0000000..8e5b088
--- /dev/null
+++ b/sys/nvenc/gstnvbaseenc.c
@@ -0,0 +1,1581 @@
+/* GStreamer NVENC plugin
+ * Copyright (C) 2015 Centricular Ltd
+ *
+ * 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 "gstnvbaseenc.h"
+
+#include <gst/pbutils/codec-utils.h>
+
+#include <string.h>
+
+#if HAVE_NVENC_GST_GL
+#include <cuda.h>
+#include <cuda_runtime_api.h>
+#include <cuda_gl_interop.h>
+#include <gst/gl/gl.h>
+#endif
+
+/* TODO:
+ *  - reset last_flow on FLUSH_STOP (seeking)
+ */
+
+#define N_BUFFERS_PER_FRAME 1
+#define SUPPORTED_GL_APIS GST_GL_API_OPENGL3
+
+/* magic pointer value we can put in the async queue to signal shut down */
+#define SHUTDOWN_COOKIE ((gpointer)GINT_TO_POINTER (1))
+
+#define parent_class gst_nv_base_enc_parent_class
+G_DEFINE_ABSTRACT_TYPE (GstNvBaseEnc, gst_nv_base_enc, GST_TYPE_VIDEO_ENCODER);
+
+static GstStaticPadTemplate sink_factory = GST_STATIC_PAD_TEMPLATE ("sink",
+    GST_PAD_SINK,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS ("video/x-raw, " "format = (string) NV12, " // TODO: I420, YV12, Y444 support
+        "width = (int) [ 16, 4096 ], height = (int) [ 16, 2160 ], "
+        "framerate = (fraction) [0, MAX],"
+        "interlace-mode = { progressive, mixed, interleaved } "
+#if HAVE_NVENC_GST_GL
+        ";"
+        "video/x-raw(memory:GLMemory), "
+        "format = (string) { NV12, Y444 }, "
+        "width = (int) [ 16, 4096 ], height = (int) [ 16, 2160 ], "
+        "framerate = (fraction) [0, MAX],"
+        "interlace-mode = { progressive, mixed, interleaved } "
+#endif
+    ));
+
+enum
+{
+  PROP_0,
+  PROP_DEVICE_ID,
+};
+
+/* This lock is needed to prevent the situation where multiple encoders are
+ * initialised at the same time which appears to cause excessive CPU usage over
+ * some period of time. */
+G_LOCK_DEFINE_STATIC (initialization_lock);
+
+#if HAVE_NVENC_GST_GL
+struct gl_input_resource
+{
+  GstGLMemory *gl_mem[GST_VIDEO_MAX_PLANES];
+  struct cudaGraphicsResource *cuda_texture;
+  gpointer cuda_plane_pointers[GST_VIDEO_MAX_PLANES];
+  gpointer cuda_pointer;
+  gsize cuda_stride;
+  gsize cuda_num_bytes;
+  NV_ENC_REGISTER_RESOURCE nv_resource;
+  NV_ENC_MAP_INPUT_RESOURCE nv_mapped_resource;
+};
+#endif
+
+struct frame_state
+{
+  gint n_buffers;
+  gpointer in_bufs[N_BUFFERS_PER_FRAME];
+  gpointer out_bufs[N_BUFFERS_PER_FRAME];
+};
+
+static gboolean gst_nv_base_enc_open (GstVideoEncoder * enc);
+static gboolean gst_nv_base_enc_close (GstVideoEncoder * enc);
+static gboolean gst_nv_base_enc_start (GstVideoEncoder * enc);
+static gboolean gst_nv_base_enc_stop (GstVideoEncoder * enc);
+static void gst_nv_base_enc_set_context (GstElement * element,
+    GstContext * context);
+static gboolean gst_nv_base_enc_sink_query (GstVideoEncoder * enc,
+    GstQuery * query);
+static gboolean gst_nv_base_enc_set_format (GstVideoEncoder * enc,
+    GstVideoCodecState * state);
+static GstFlowReturn gst_nv_base_enc_handle_frame (GstVideoEncoder * enc,
+    GstVideoCodecFrame * frame);
+static void gst_nv_base_enc_free_buffers (GstNvBaseEnc * nvenc);
+static GstFlowReturn gst_nv_base_enc_finish (GstVideoEncoder * enc);
+static void gst_nv_base_enc_set_property (GObject * object, guint prop_id,
+    const GValue * value, GParamSpec * pspec);
+static void gst_nv_base_enc_get_property (GObject * object, guint prop_id,
+    GValue * value, GParamSpec * pspec);
+static void gst_nv_base_enc_finalize (GObject * obj);
+static GstCaps *gst_nv_base_enc_getcaps (GstVideoEncoder * enc,
+    GstCaps * filter);
+
+static void
+gst_nv_base_enc_class_init (GstNvBaseEncClass * klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+  GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+  GstVideoEncoderClass *videoenc_class = GST_VIDEO_ENCODER_CLASS (klass);
+
+  gobject_class->set_property = gst_nv_base_enc_set_property;
+  gobject_class->get_property = gst_nv_base_enc_get_property;
+  gobject_class->finalize = gst_nv_base_enc_finalize;
+
+  element_class->set_context = GST_DEBUG_FUNCPTR (gst_nv_base_enc_set_context);
+
+  videoenc_class->open = GST_DEBUG_FUNCPTR (gst_nv_base_enc_open);
+  videoenc_class->close = GST_DEBUG_FUNCPTR (gst_nv_base_enc_close);
+
+  videoenc_class->start = GST_DEBUG_FUNCPTR (gst_nv_base_enc_start);
+  videoenc_class->stop = GST_DEBUG_FUNCPTR (gst_nv_base_enc_stop);
+
+  videoenc_class->set_format = GST_DEBUG_FUNCPTR (gst_nv_base_enc_set_format);
+  videoenc_class->getcaps = GST_DEBUG_FUNCPTR (gst_nv_base_enc_getcaps);
+  videoenc_class->handle_frame =
+      GST_DEBUG_FUNCPTR (gst_nv_base_enc_handle_frame);
+  videoenc_class->finish = GST_DEBUG_FUNCPTR (gst_nv_base_enc_finish);
+  videoenc_class->sink_query = GST_DEBUG_FUNCPTR (gst_nv_base_enc_sink_query);
+
+  gst_element_class_add_pad_template (element_class,
+      gst_static_pad_template_get (&sink_factory));
+
+  g_object_class_install_property (gobject_class, PROP_DEVICE_ID,
+      g_param_spec_uint ("cuda-device-id",
+          "Cuda Device ID",
+          "Set the GPU device to use for operations",
+          0, G_MAXUINT, 0, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+}
+
+static gboolean
+_get_supported_input_formats (GstNvBaseEnc * nvenc)
+{
+  GstNvBaseEncClass *nvenc_class = GST_NV_BASE_ENC_GET_CLASS (nvenc);
+  guint64 format_mask = 0;
+  uint32_t i, num = 0;
+  NV_ENC_BUFFER_FORMAT formats[64];
+  GValue list = G_VALUE_INIT;
+  GValue val = G_VALUE_INIT;
+
+  NvEncGetInputFormats (nvenc->encoder, nvenc_class->codec_id, formats,
+      G_N_ELEMENTS (formats), &num);
+
+  for (i = 0; i < num; ++i) {
+    GST_INFO_OBJECT (nvenc, "input format: 0x%08x", formats[i]);
+    /* Apparently we can just ignore the tiled formats and can feed
+     * it the respective untiled planar format instead ?! */
+    switch (formats[i]) {
+      case NV_ENC_BUFFER_FORMAT_NV12_PL:
+      case NV_ENC_BUFFER_FORMAT_NV12_TILED16x16:
+      case NV_ENC_BUFFER_FORMAT_NV12_TILED64x16:
+        format_mask |= (1 << GST_VIDEO_FORMAT_NV12);
+        break;
+      case NV_ENC_BUFFER_FORMAT_YV12_PL:
+      case NV_ENC_BUFFER_FORMAT_YV12_TILED16x16:
+      case NV_ENC_BUFFER_FORMAT_YV12_TILED64x16:
+        format_mask |= (1 << GST_VIDEO_FORMAT_YV12);
+        break;
+      case NV_ENC_BUFFER_FORMAT_IYUV_PL:
+      case NV_ENC_BUFFER_FORMAT_IYUV_TILED16x16:
+      case NV_ENC_BUFFER_FORMAT_IYUV_TILED64x16:
+        format_mask |= (1 << GST_VIDEO_FORMAT_I420);
+        break;
+      case NV_ENC_BUFFER_FORMAT_YUV444_PL:
+      case NV_ENC_BUFFER_FORMAT_YUV444_TILED16x16:
+      case NV_ENC_BUFFER_FORMAT_YUV444_TILED64x16:{
+        NV_ENC_CAPS_PARAM caps_param = { 0, };
+        int yuv444_supported = 0;
+
+        caps_param.version = NV_ENC_CAPS_PARAM_VER;
+        caps_param.capsToQuery = NV_ENC_CAPS_SUPPORT_YUV444_ENCODE;
+
+        if (NvEncGetEncodeCaps (nvenc->encoder, nvenc_class->codec_id,
+                &caps_param, &yuv444_supported) != NV_ENC_SUCCESS)
+          yuv444_supported = 0;
+
+        if (yuv444_supported)
+          format_mask |= (1 << GST_VIDEO_FORMAT_Y444);
+        break;
+      }
+      default:
+        GST_FIXME ("unmapped input format: 0x%08x", formats[i]);
+        break;
+    }
+  }
+
+  if (format_mask == 0)
+    return FALSE;
+
+  /* process a second time so we can add formats in the order we want */
+  g_value_init (&list, GST_TYPE_LIST);
+  g_value_init (&val, G_TYPE_STRING);
+  if ((format_mask & (1 << GST_VIDEO_FORMAT_NV12))) {
+    g_value_set_static_string (&val, "NV12");
+    gst_value_list_append_value (&list, &val);
+  }
+  if ((format_mask & (1 << GST_VIDEO_FORMAT_YV12))) {
+    g_value_set_static_string (&val, "YV12");
+    gst_value_list_append_value (&list, &val);
+  }
+  if ((format_mask & (1 << GST_VIDEO_FORMAT_I420))) {
+    g_value_set_static_string (&val, "I420");
+    gst_value_list_append_value (&list, &val);
+  }
+  if ((format_mask & (1 << GST_VIDEO_FORMAT_Y444))) {
+    g_value_set_static_string (&val, "Y444");
+    gst_value_list_append_value (&list, &val);
+  }
+  g_value_unset (&val);
+
+  GST_OBJECT_LOCK (nvenc);
+  g_free (nvenc->input_formats);
+  nvenc->input_formats = g_memdup (&list, sizeof (GValue));
+  GST_OBJECT_UNLOCK (nvenc);
+
+  return TRUE;
+}
+
+static gboolean
+gst_nv_base_enc_open (GstVideoEncoder * enc)
+{
+  GstNvBaseEnc *nvenc = GST_NV_BASE_ENC (enc);
+
+  nvenc->cuda_ctx = gst_nvenc_create_cuda_context (nvenc->cuda_device_id);
+  if (nvenc->cuda_ctx == NULL) {
+    GST_ELEMENT_ERROR (enc, LIBRARY, INIT, (NULL),
+        ("Failed to create CUDA context, perhaps CUDA is not supported."));
+    return FALSE;
+  }
+
+  {
+    NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS params = { 0, };
+    NVENCSTATUS nv_ret;
+
+    params.version = NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS_VER;
+    params.apiVersion = NVENCAPI_VERSION;
+    params.device = nvenc->cuda_ctx;
+    params.deviceType = NV_ENC_DEVICE_TYPE_CUDA;
+    nv_ret = NvEncOpenEncodeSessionEx (&params, &nvenc->encoder);
+    if (nv_ret != NV_ENC_SUCCESS) {
+      GST_ERROR ("Failed to create NVENC encoder session, ret=%d", nv_ret);
+      if (gst_nvenc_destroy_cuda_context (nvenc->cuda_ctx))
+        nvenc->cuda_ctx = NULL;
+      return FALSE;
+    }
+    GST_INFO ("created NVENC encoder %p", nvenc->encoder);
+  }
+
+  /* query supported input formats */
+  if (!_get_supported_input_formats (nvenc)) {
+    GST_WARNING_OBJECT (nvenc, "No supported input formats");
+    gst_nv_base_enc_close (enc);
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
+static void
+gst_nv_base_enc_set_context (GstElement * element, GstContext * context)
+{
+  GstNvBaseEnc *nvenc = GST_NV_BASE_ENC (element);
+
+#if HAVE_NVENC_GST_GL
+  gst_gl_handle_set_context (element, context,
+      (GstGLDisplay **) & nvenc->display,
+      (GstGLContext **) & nvenc->other_context);
+  if (nvenc->display)
+    gst_gl_display_filter_gl_api (GST_GL_DISPLAY (nvenc->display),
+        SUPPORTED_GL_APIS);
+#endif
+
+  GST_ELEMENT_CLASS (parent_class)->set_context (element, context);
+}
+
+static gboolean
+gst_nv_base_enc_sink_query (GstVideoEncoder * enc, GstQuery * query)
+{
+  GstNvBaseEnc *nvenc = GST_NV_BASE_ENC (enc);
+
+  switch (GST_QUERY_TYPE (query)) {
+#if HAVE_NVENC_GST_GL
+    case GST_QUERY_CONTEXT:{
+      gboolean ret;
+
+      ret = gst_gl_handle_context_query ((GstElement *) nvenc, query,
+          (GstGLDisplay **) & nvenc->display,
+          (GstGLContext **) & nvenc->other_context);
+      if (nvenc->display)
+        gst_gl_display_filter_gl_api (GST_GL_DISPLAY (nvenc->display),
+            SUPPORTED_GL_APIS);
+
+      if (ret)
+        return ret;
+      break;
+    }
+#endif
+    default:
+      break;
+  }
+
+  return GST_VIDEO_ENCODER_CLASS (parent_class)->sink_query (enc, query);
+}
+
+static gboolean
+gst_nv_base_enc_start (GstVideoEncoder * enc)
+{
+  GstNvBaseEnc *nvenc = GST_NV_BASE_ENC (enc);
+
+  nvenc->bitstream_pool = g_async_queue_new ();
+  nvenc->bitstream_queue = g_async_queue_new ();
+  nvenc->in_bufs_pool = g_async_queue_new ();
+
+  nvenc->last_flow = GST_FLOW_OK;
+
+#if HAVE_NVENC_GST_GL
+  {
+    gst_gl_ensure_element_data (GST_ELEMENT (nvenc),
+        (GstGLDisplay **) & nvenc->display,
+        (GstGLContext **) & nvenc->other_context);
+    if (nvenc->display)
+      gst_gl_display_filter_gl_api (GST_GL_DISPLAY (nvenc->display),
+          SUPPORTED_GL_APIS);
+  }
+#endif
+
+  return TRUE;
+}
+
+static gboolean
+gst_nv_base_enc_stop (GstVideoEncoder * enc)
+{
+  GstNvBaseEnc *nvenc = GST_NV_BASE_ENC (enc);
+
+  gst_nv_base_enc_free_buffers (nvenc);
+
+  if (nvenc->bitstream_pool) {
+    g_async_queue_unref (nvenc->bitstream_pool);
+    nvenc->bitstream_pool = NULL;
+  }
+  if (nvenc->bitstream_queue) {
+    g_async_queue_unref (nvenc->bitstream_queue);
+    nvenc->bitstream_queue = NULL;
+  }
+  if (nvenc->in_bufs_pool) {
+    g_async_queue_unref (nvenc->in_bufs_pool);
+    nvenc->in_bufs_pool = NULL;
+  }
+  if (nvenc->display) {
+    gst_object_unref (nvenc->display);
+    nvenc->display = NULL;
+  }
+  if (nvenc->other_context) {
+    gst_object_unref (nvenc->other_context);
+    nvenc->other_context = NULL;
+  }
+
+  return TRUE;
+}
+
+static GValue *
+_get_interlace_modes (GstNvBaseEnc * nvenc)
+{
+  GstNvBaseEncClass *nvenc_class = GST_NV_BASE_ENC_GET_CLASS (nvenc);
+  NV_ENC_CAPS_PARAM caps_param = { 0, };
+  GValue *list = g_new0 (GValue, 1);
+  GValue val = G_VALUE_INIT;
+
+  g_value_init (list, GST_TYPE_LIST);
+  g_value_init (&val, G_TYPE_STRING);
+
+  g_value_set_static_string (&val, "progressive");
+  gst_value_list_append_value (list, &val);
+
+  caps_param.version = NV_ENC_CAPS_PARAM_VER;
+  caps_param.capsToQuery = NV_ENC_CAPS_SUPPORT_FIELD_ENCODING;
+
+  if (NvEncGetEncodeCaps (nvenc->encoder, nvenc_class->codec_id,
+          &caps_param, &nvenc->interlace_modes) != NV_ENC_SUCCESS)
+    nvenc->interlace_modes = 0;
+
+  if (nvenc->interlace_modes >= 1) {
+    g_value_set_static_string (&val, "interleaved");
+    gst_value_list_append_value (list, &val);
+    g_value_set_static_string (&val, "mixed");
+    gst_value_list_append_value (list, &val);
+  }
+  /* TODO: figure out what nvenc frame based interlacing means in gst terms */
+
+  return list;
+}
+
+static GstCaps *
+gst_nv_base_enc_getcaps (GstVideoEncoder * enc, GstCaps * filter)
+{
+  GstNvBaseEnc *nvenc = GST_NV_BASE_ENC (enc);
+  GstCaps *supported_incaps = NULL;
+  GstCaps *template_caps, *caps;
+
+  GST_OBJECT_LOCK (nvenc);
+
+  if (nvenc->input_formats != NULL) {
+    GValue *val;
+
+    template_caps = gst_pad_get_pad_template_caps (enc->sinkpad);
+    supported_incaps = gst_caps_copy (template_caps);
+    gst_caps_set_value (supported_incaps, "format", nvenc->input_formats);
+
+    val = _get_interlace_modes (nvenc);
+    gst_caps_set_value (supported_incaps, "interlace-mode", val);
+    g_free (val);
+
+    GST_LOG_OBJECT (enc, "codec input caps %" GST_PTR_FORMAT, supported_incaps);
+    GST_LOG_OBJECT (enc, "   template caps %" GST_PTR_FORMAT, template_caps);
+    caps = gst_caps_intersect (template_caps, supported_incaps);
+    gst_caps_unref (template_caps);
+    gst_caps_unref (supported_incaps);
+    supported_incaps = caps;
+    GST_LOG_OBJECT (enc, "  supported caps %" GST_PTR_FORMAT, supported_incaps);
+  }
+
+  GST_OBJECT_UNLOCK (nvenc);
+
+  caps = gst_video_encoder_proxy_getcaps (enc, supported_incaps, filter);
+
+  if (supported_incaps)
+    gst_caps_unref (supported_incaps);
+
+  GST_DEBUG_OBJECT (nvenc, "  returning caps %" GST_PTR_FORMAT, caps);
+
+  return caps;
+}
+
+static gboolean
+gst_nv_base_enc_close (GstVideoEncoder * enc)
+{
+  GstNvBaseEnc *nvenc = GST_NV_BASE_ENC (enc);
+
+  if (nvenc->encoder) {
+    if (NvEncDestroyEncoder (nvenc->encoder) != NV_ENC_SUCCESS)
+      return FALSE;
+    nvenc->encoder = NULL;
+  }
+
+  if (nvenc->cuda_ctx) {
+    if (!gst_nvenc_destroy_cuda_context (nvenc->cuda_ctx))
+      return FALSE;
+    nvenc->cuda_ctx = NULL;
+  }
+
+  GST_OBJECT_LOCK (nvenc);
+  g_free (nvenc->input_formats);
+  nvenc->input_formats = NULL;
+  GST_OBJECT_UNLOCK (nvenc);
+
+  if (nvenc->input_state) {
+    gst_video_codec_state_unref (nvenc->input_state);
+    nvenc->input_state = NULL;
+  }
+
+  if (nvenc->bitstream_pool != NULL) {
+    g_assert (g_async_queue_length (nvenc->bitstream_pool) == 0);
+    g_async_queue_unref (nvenc->bitstream_pool);
+    nvenc->bitstream_pool = NULL;
+  }
+
+  return TRUE;
+}
+
+static void
+gst_nv_base_enc_init (GstNvBaseEnc * nvenc)
+{
+  GstVideoEncoder *encoder = GST_VIDEO_ENCODER (nvenc);
+
+  GST_VIDEO_ENCODER_STREAM_LOCK (encoder);
+  GST_VIDEO_ENCODER_STREAM_UNLOCK (encoder);
+}
+
+static void
+gst_nv_base_enc_finalize (GObject * obj)
+{
+  G_OBJECT_CLASS (gst_nv_base_enc_parent_class)->finalize (obj);
+}
+
+static GstVideoCodecFrame *
+_find_frame_with_output_buffer (GstNvBaseEnc * nvenc, NV_ENC_OUTPUT_PTR out_buf)
+{
+  GList *l = gst_video_encoder_get_frames (GST_VIDEO_ENCODER (nvenc));
+  gint i;
+
+  for (; l; l = l->next) {
+    GstVideoCodecFrame *frame = (GstVideoCodecFrame *) l->data;
+    struct frame_state *state = frame->user_data;
+
+    for (i = 0; i < N_BUFFERS_PER_FRAME; i++) {
+      if (!state->out_bufs[i])
+        break;
+
+      if (state->out_bufs[i] == out_buf)
+        return frame;
+    }
+  }
+
+  return NULL;
+}
+
+static gpointer
+gst_nv_base_enc_bitstream_thread (gpointer user_data)
+{
+  GstVideoEncoder *enc = user_data;
+  GstNvBaseEnc *nvenc = user_data;
+
+  /* overview of operation:
+   * 1. retreive the next buffer submitted to the bitstream pool
+   * 2. wait for that buffer to be ready from nvenc (LockBitsream)
+   * 3. retreive the GstVideoCodecFrame associated with that buffer
+   * 4. for each buffer in the frame
+   * 4.1 (step 2): wait for that buffer to be ready from nvenc (LockBitsream)
+   * 4.2 create an output GstBuffer from the nvenc buffers
+   * 4.3 unlock the nvenc bitstream buffers UnlockBitsream
+   * 5. finish_frame()
+   * 6. cleanup
+   */
+  do {
+    GstBuffer *buffers[N_BUFFERS_PER_FRAME];
+    struct frame_state *state = NULL;
+    GstVideoCodecFrame *frame = NULL;
+    NVENCSTATUS nv_ret;
+    GstFlowReturn flow = GST_FLOW_OK;
+    gint i;
+
+    {
+      NV_ENC_LOCK_BITSTREAM lock_bs = { 0, };
+      NV_ENC_OUTPUT_PTR out_buf;
+
+      for (i = 0; i < N_BUFFERS_PER_FRAME; i++) {
+        /* get and lock bitstream buffers */
+        GstVideoCodecFrame *tmp_frame;
+
+        if (state && i >= state->n_buffers)
+          break;
+
+        GST_LOG_OBJECT (enc, "wait for bitstream buffer..");
+
+        /* assumes buffers are submitted in order */
+        out_buf = g_async_queue_pop (nvenc->bitstream_queue);
+        if ((gpointer) out_buf == SHUTDOWN_COOKIE)
+          break;
+
+        GST_LOG_OBJECT (nvenc, "waiting for output buffer %p to be ready",
+            out_buf);
+
+        lock_bs.version = NV_ENC_LOCK_BITSTREAM_VER;
+        lock_bs.outputBitstream = out_buf;
+        lock_bs.doNotWait = 0;
+
+        /* FIXME: this would need to be updated for other slice modes */
+        lock_bs.sliceOffsets = NULL;
+
+        nv_ret = NvEncLockBitstream (nvenc->encoder, &lock_bs);
+        if (nv_ret != NV_ENC_SUCCESS) {
+          /* FIXME: what to do here? */
+          GST_ELEMENT_ERROR (nvenc, STREAM, ENCODE, (NULL),
+              ("Failed to lock bitstream buffer %p, ret %d",
+                  lock_bs.outputBitstream, nv_ret));
+          out_buf = SHUTDOWN_COOKIE;
+          break;
+        }
+
+        GST_LOG_OBJECT (nvenc, "picture type %d", lock_bs.pictureType);
+
+        tmp_frame = _find_frame_with_output_buffer (nvenc, out_buf);
+        g_assert (tmp_frame != NULL);
+        if (frame)
+          g_assert (frame == tmp_frame);
+        frame = tmp_frame;
+
+        state = frame->user_data;
+        g_assert (state->out_bufs[i] == out_buf);
+
+        /* copy into output buffer */
+        buffers[i] =
+            gst_buffer_new_allocate (NULL, lock_bs.bitstreamSizeInBytes, NULL);
+        gst_buffer_fill (buffers[i], 0, lock_bs.bitstreamBufferPtr,
+            lock_bs.bitstreamSizeInBytes);
+
+        if (lock_bs.pictureType == NV_ENC_PIC_TYPE_IDR) {
+          GST_DEBUG_OBJECT (nvenc, "This is a keyframe");
+          GST_VIDEO_CODEC_FRAME_SET_SYNC_POINT (frame);
+        }
+
+        /* TODO: use lock_bs.outputTimeStamp and lock_bs.outputDuration */
+        /* TODO: check pts/dts is handled properly if there are B-frames */
+
+        nv_ret = NvEncUnlockBitstream (nvenc->encoder, state->out_bufs[i]);
+        if (nv_ret != NV_ENC_SUCCESS) {
+          /* FIXME: what to do here? */
+          GST_ELEMENT_ERROR (nvenc, STREAM, ENCODE, (NULL),
+              ("Failed to unlock bitstream buffer %p, ret %d",
+                  lock_bs.outputBitstream, nv_ret));
+          state->out_bufs[i] = SHUTDOWN_COOKIE;
+          break;
+        }
+
+        GST_LOG_OBJECT (nvenc, "returning bitstream buffer %p to pool",
+            state->out_bufs[i]);
+        g_async_queue_push (nvenc->bitstream_pool, state->out_bufs[i]);
+      }
+
+      if (out_buf == SHUTDOWN_COOKIE)
+        break;
+    }
+
+    {
+      GstBuffer *output_buffer = gst_buffer_new ();
+
+      for (i = 0; i < state->n_buffers; i++)
+        output_buffer = gst_buffer_append (output_buffer, buffers[i]);
+
+      frame->output_buffer = output_buffer;
+    }
+
+    for (i = 0; i < state->n_buffers; i++) {
+      void *in_buf = state->in_bufs[i];
+      g_assert (in_buf != NULL);
+
+#if HAVE_NVENC_GST_GL
+      if (nvenc->gl_input) {
+        struct gl_input_resource *in_gl_resource = in_buf;
+
+        nv_ret =
+            NvEncUnmapInputResource (nvenc->encoder,
+            in_gl_resource->nv_mapped_resource.mappedResource);
+        if (nv_ret != NV_ENC_SUCCESS) {
+          GST_ERROR_OBJECT (nvenc, "Failed to unmap input resource %p, ret %d",
+              in_gl_resource, nv_ret);
+          break;
+        }
+
+        memset (&in_gl_resource->nv_mapped_resource, 0,
+            sizeof (in_gl_resource->nv_mapped_resource));
+      }
+#endif
+
+      g_async_queue_push (nvenc->in_bufs_pool, in_buf);
+    }
+
+    flow = gst_video_encoder_finish_frame (enc, frame);
+    frame = NULL;
+
+    if (flow != GST_FLOW_OK) {
+      GST_INFO_OBJECT (enc, "got flow %s", gst_flow_get_name (flow));
+      g_atomic_int_set (&nvenc->last_flow, flow);
+      break;
+    }
+  }
+  while (TRUE);
+
+  GST_INFO_OBJECT (nvenc, "exiting thread");
+
+  return NULL;
+}
+
+static gboolean
+gst_nv_base_enc_start_bitstream_thread (GstNvBaseEnc * nvenc)
+{
+  gchar *name = g_strdup_printf ("%s-read-bits", GST_OBJECT_NAME (nvenc));
+
+  g_assert (nvenc->bitstream_thread == NULL);
+
+  g_assert (g_async_queue_length (nvenc->bitstream_queue) == 0);
+
+  nvenc->bitstream_thread =
+      g_thread_try_new (name, gst_nv_base_enc_bitstream_thread, nvenc, NULL);
+
+  g_free (name);
+
+  if (nvenc->bitstream_thread == NULL)
+    return FALSE;
+
+  GST_INFO_OBJECT (nvenc, "started thread to read bitstream");
+  return TRUE;
+}
+
+static gboolean
+gst_nv_base_enc_stop_bitstream_thread (GstNvBaseEnc * nvenc)
+{
+  gpointer out_buf;
+
+  if (nvenc->bitstream_thread == NULL)
+    return TRUE;
+
+  /* FIXME */
+  GST_FIXME_OBJECT (nvenc, "stop bitstream reading thread properly");
+  g_async_queue_lock (nvenc->bitstream_queue);
+  g_async_queue_lock (nvenc->bitstream_pool);
+  while ((out_buf = g_async_queue_try_pop_unlocked (nvenc->bitstream_queue))) {
+    GST_INFO_OBJECT (nvenc, "stole bitstream buffer %p from queue", out_buf);
+    g_async_queue_push_unlocked (nvenc->bitstream_pool, out_buf);
+  }
+  g_async_queue_push_unlocked (nvenc->bitstream_queue, SHUTDOWN_COOKIE);
+  g_async_queue_unlock (nvenc->bitstream_pool);
+  g_async_queue_unlock (nvenc->bitstream_queue);
+
+  /* temporary unlock, so other thread can find and push frame */
+  GST_VIDEO_ENCODER_STREAM_UNLOCK (nvenc);
+  g_thread_join (nvenc->bitstream_thread);
+  GST_VIDEO_ENCODER_STREAM_LOCK (nvenc);
+
+  nvenc->bitstream_thread = NULL;
+  return TRUE;
+}
+
+static void
+gst_nv_base_enc_reset_queues (GstNvBaseEnc * nvenc, gboolean refill)
+{
+  gpointer ptr;
+  gint i;
+
+  GST_INFO_OBJECT (nvenc, "clearing queues");
+
+  while ((ptr = g_async_queue_try_pop (nvenc->bitstream_queue))) {
+    /* do nothing */
+  }
+  while ((ptr = g_async_queue_try_pop (nvenc->bitstream_pool))) {
+    /* do nothing */
+  }
+  while ((ptr = g_async_queue_try_pop (nvenc->in_bufs_pool))) {
+    /* do nothing */
+  }
+
+  if (refill) {
+    GST_INFO_OBJECT (nvenc, "refilling buffer pools");
+    for (i = 0; i < nvenc->n_bufs; ++i) {
+      g_async_queue_push (nvenc->bitstream_pool, nvenc->input_bufs[i]);
+      g_async_queue_push (nvenc->in_bufs_pool, nvenc->output_bufs[i]);
+    }
+  }
+}
+
+static void
+gst_nv_base_enc_free_buffers (GstNvBaseEnc * nvenc)
+{
+  NVENCSTATUS nv_ret;
+  guint i;
+
+  if (nvenc->encoder == NULL)
+    return;
+
+  gst_nv_base_enc_reset_queues (nvenc, FALSE);
+
+  for (i = 0; i < nvenc->n_bufs; ++i) {
+    NV_ENC_OUTPUT_PTR out_buf = nvenc->output_bufs[i];
+
+#if HAVE_NVENC_GST_GL
+    if (nvenc->gl_input) {
+      struct gl_input_resource *in_gl_resource = nvenc->input_bufs[i];
+
+      cuCtxPushCurrent (nvenc->cuda_ctx);
+      nv_ret =
+          NvEncUnregisterResource (nvenc->encoder,
+          in_gl_resource->nv_resource.registeredResource);
+      if (nv_ret != NV_ENC_SUCCESS)
+        GST_ERROR_OBJECT (nvenc, "Failed to unregister resource %p, ret %d",
+            in_gl_resource, nv_ret);
+
+      g_free (in_gl_resource);
+      cuCtxPopCurrent (NULL);
+    } else
+#endif
+    {
+      NV_ENC_INPUT_PTR in_buf = (NV_ENC_INPUT_PTR) nvenc->input_bufs[i];
+
+      GST_DEBUG_OBJECT (nvenc, "Destroying input buffer %p", in_buf);
+      nv_ret = NvEncDestroyInputBuffer (nvenc->encoder, in_buf);
+      if (nv_ret != NV_ENC_SUCCESS) {
+        GST_ERROR_OBJECT (nvenc, "Failed to destroy input buffer %p, ret %d",
+            in_buf, nv_ret);
+      }
+    }
+
+    GST_DEBUG_OBJECT (nvenc, "Destroying output bitstream buffer %p", out_buf);
+    nv_ret = NvEncDestroyBitstreamBuffer (nvenc->encoder, out_buf);
+    if (nv_ret != NV_ENC_SUCCESS) {
+      GST_ERROR_OBJECT (nvenc, "Failed to destroy output buffer %p, ret %d",
+          out_buf, nv_ret);
+    }
+  }
+
+  nvenc->n_bufs = 0;
+  g_free (nvenc->output_bufs);
+  nvenc->output_bufs = NULL;
+  g_free (nvenc->input_bufs);
+  nvenc->input_bufs = NULL;
+}
+
+static inline guint
+_get_plane_width (GstVideoInfo * info, guint plane)
+{
+  if (GST_VIDEO_INFO_IS_YUV (info))
+    /* For now component width and plane width are the same and the
+     * plane-component mapping matches
+     */
+    return GST_VIDEO_INFO_COMP_WIDTH (info, plane);
+  else                          /* RGB, GRAY */
+    return GST_VIDEO_INFO_WIDTH (info);
+}
+
+static inline guint
+_get_plane_height (GstVideoInfo * info, guint plane)
+{
+  if (GST_VIDEO_INFO_IS_YUV (info))
+    /* For now component width and plane width are the same and the
+     * plane-component mapping matches
+     */
+    return GST_VIDEO_INFO_COMP_HEIGHT (info, plane);
+  else                          /* RGB, GRAY */
+    return GST_VIDEO_INFO_HEIGHT (info);
+}
+
+static inline gsize
+_get_frame_data_height (GstVideoInfo * info)
+{
+  gsize ret = 0;
+  gint i;
+
+  for (i = 0; i < GST_VIDEO_INFO_N_PLANES (info); i++) {
+    ret += _get_plane_height (info, i);
+  }
+
+  return ret;
+}
+
+void
+gst_nv_base_enc_set_max_encode_size (GstNvBaseEnc * nvenc, guint max_width,
+    guint max_height)
+{
+  nvenc->max_encode_width = max_width;
+  nvenc->max_encode_height = max_height;
+}
+
+void
+gst_nv_base_enc_get_max_encode_size (GstNvBaseEnc * nvenc, guint * max_width,
+    guint * max_height)
+{
+  *max_width = nvenc->max_encode_width;
+  *max_height = nvenc->max_encode_height;
+}
+
+static gboolean
+gst_nv_base_enc_set_format (GstVideoEncoder * enc, GstVideoCodecState * state)
+{
+  GstNvBaseEncClass *nvenc_class = GST_NV_BASE_ENC_GET_CLASS (enc);
+  GstNvBaseEnc *nvenc = GST_NV_BASE_ENC (enc);
+  GstVideoInfo *info = &state->info;
+  GstVideoCodecState *old_state = nvenc->input_state;
+  NVENCSTATUS nv_ret;
+
+  g_assert (nvenc_class->initialize_encoder);
+
+  G_LOCK (initialization_lock);
+  if (!nvenc_class->initialize_encoder (nvenc, old_state, state)) {
+    GST_ERROR_OBJECT (enc, "Subclass failed to reconfigure encoder");
+    G_UNLOCK (initialization_lock);
+    return FALSE;
+  }
+  G_UNLOCK (initialization_lock);
+
+  if (!nvenc->max_encode_width && !nvenc->max_encode_height) {
+    gst_nv_base_enc_set_max_encode_size (nvenc, GST_VIDEO_INFO_WIDTH (info),
+        GST_VIDEO_INFO_HEIGHT (info));
+  }
+
+  if (!old_state) {
+    nvenc->input_info = *info;
+    nvenc->gl_input = FALSE;
+  }
+
+  if (nvenc->input_state)
+    gst_video_codec_state_unref (nvenc->input_state);
+  nvenc->input_state = gst_video_codec_state_ref (state);
+  GST_INFO_OBJECT (nvenc, "configured encoder");
+
+  /* now allocate some buffers only on first configuration */
+  if (!old_state) {
+#if HAVE_NVENC_GST_GL
+    GstCapsFeatures *features;
+#endif
+    guint num_macroblocks, i;
+    guint input_width, input_height;
+
+    input_width = GST_VIDEO_INFO_WIDTH (info);
+    input_height = GST_VIDEO_INFO_HEIGHT (info);
+
+    num_macroblocks = (GST_ROUND_UP_16 (input_width) >> 4)
+        * (GST_ROUND_UP_16 (input_height) >> 4);
+    nvenc->n_bufs = (num_macroblocks >= 8160) ? 32 : 48;
+
+    /* input buffers */
+    nvenc->input_bufs = g_new0 (gpointer, nvenc->n_bufs);
+
+#if HAVE_NVENC_GST_GL
+    features = gst_caps_get_features (state->caps, 0);
+    if (gst_caps_features_contains (features,
+            GST_CAPS_FEATURE_MEMORY_GL_MEMORY)) {
+      guint pixel_depth = 0;
+      nvenc->gl_input = TRUE;
+
+      for (i = 0; i < GST_VIDEO_INFO_N_COMPONENTS (info); i++) {
+        pixel_depth += GST_VIDEO_INFO_COMP_DEPTH (info, i);
+      }
+
+      cuCtxPushCurrent (nvenc->cuda_ctx);
+      for (i = 0; i < nvenc->n_bufs; ++i) {
+        struct gl_input_resource *in_gl_resource =
+            g_new0 (struct gl_input_resource, 1);
+        CUresult cu_ret;
+
+        memset (&in_gl_resource->nv_resource, 0,
+            sizeof (in_gl_resource->nv_resource));
+        memset (&in_gl_resource->nv_mapped_resource, 0,
+            sizeof (in_gl_resource->nv_mapped_resource));
+
+        /* scratch buffer for non-contigious planer into a contigious buffer */
+        cu_ret =
+            cuMemAllocPitch ((CUdeviceptr *) & in_gl_resource->cuda_pointer,
+            &in_gl_resource->cuda_stride, input_width,
+            _get_frame_data_height (info), 16);
+        if (cu_ret != CUDA_SUCCESS) {
+          const gchar *err;
+
+          cuGetErrorString (cu_ret, &err);
+          GST_ERROR_OBJECT (nvenc, "failed to alocate cuda scratch buffer "
+              "ret %d error :%s", cu_ret, err);
+          g_assert_not_reached ();
+        }
+
+        in_gl_resource->nv_resource.version = NV_ENC_REGISTER_RESOURCE_VER;
+        in_gl_resource->nv_resource.resourceType =
+            NV_ENC_INPUT_RESOURCE_TYPE_CUDADEVICEPTR;
+        in_gl_resource->nv_resource.width = input_width;
+        in_gl_resource->nv_resource.height = input_height;
+        in_gl_resource->nv_resource.pitch = in_gl_resource->cuda_stride;
+        in_gl_resource->nv_resource.bufferFormat =
+            gst_nvenc_get_nv_buffer_format (GST_VIDEO_INFO_FORMAT (info));
+        in_gl_resource->nv_resource.resourceToRegister =
+            in_gl_resource->cuda_pointer;
+
+        nv_ret =
+            NvEncRegisterResource (nvenc->encoder,
+            &in_gl_resource->nv_resource);
+        if (nv_ret != NV_ENC_SUCCESS)
+          GST_ERROR_OBJECT (nvenc, "Failed to register resource %p, ret %d",
+              in_gl_resource, nv_ret);
+
+        nvenc->input_bufs[i] = in_gl_resource;
+        g_async_queue_push (nvenc->in_bufs_pool, nvenc->input_bufs[i]);
+      }
+
+      cuCtxPopCurrent (NULL);
+    } else
+#endif
+    {
+      for (i = 0; i < nvenc->n_bufs; ++i) {
+        NV_ENC_CREATE_INPUT_BUFFER cin_buf = { 0, };
+
+        cin_buf.version = NV_ENC_CREATE_INPUT_BUFFER_VER;
+
+        cin_buf.width = GST_ROUND_UP_32 (input_width);
+        cin_buf.height = GST_ROUND_UP_32 (input_height);
+
+        cin_buf.memoryHeap = NV_ENC_MEMORY_HEAP_SYSMEM_CACHED;
+        cin_buf.bufferFmt =
+            gst_nvenc_get_nv_buffer_format (GST_VIDEO_INFO_FORMAT (info));
+
+        nv_ret = NvEncCreateInputBuffer (nvenc->encoder, &cin_buf);
+
+        if (nv_ret != NV_ENC_SUCCESS) {
+          GST_WARNING_OBJECT (enc, "Failed to allocate input buffer: %d",
+              nv_ret);
+          /* FIXME: clean up */
+          return FALSE;
+        }
+
+        nvenc->input_bufs[i] = cin_buf.inputBuffer;
+
+        GST_INFO_OBJECT (nvenc, "allocated  input buffer %2d: %p", i,
+            nvenc->input_bufs[i]);
+
+        g_async_queue_push (nvenc->in_bufs_pool, nvenc->input_bufs[i]);
+      }
+    }
+
+    /* output buffers */
+    nvenc->output_bufs = g_new0 (NV_ENC_OUTPUT_PTR, nvenc->n_bufs);
+    for (i = 0; i < nvenc->n_bufs; ++i) {
+      NV_ENC_CREATE_BITSTREAM_BUFFER cout_buf = { 0, };
+
+      cout_buf.version = NV_ENC_CREATE_BITSTREAM_BUFFER_VER;
+
+      /* 1 MB should be large enough to hold most output frames.
+       * NVENC will automatically increase this if it's not enough. */
+      cout_buf.size = 1024 * 1024;
+      cout_buf.memoryHeap = NV_ENC_MEMORY_HEAP_SYSMEM_CACHED;
+
+      G_LOCK (initialization_lock);
+      nv_ret = NvEncCreateBitstreamBuffer (nvenc->encoder, &cout_buf);
+      G_UNLOCK (initialization_lock);
+
+      if (nv_ret != NV_ENC_SUCCESS) {
+        GST_WARNING_OBJECT (enc, "Failed to allocate input buffer: %d", nv_ret);
+        /* FIXME: clean up */
+        return FALSE;
+      }
+
+      nvenc->output_bufs[i] = cout_buf.bitstreamBuffer;
+
+      GST_INFO_OBJECT (nvenc, "allocated output buffer %2d: %p", i,
+          nvenc->output_bufs[i]);
+
+      g_async_queue_push (nvenc->bitstream_pool, nvenc->output_bufs[i]);
+    }
+
+#if 0
+    /* Get SPS/PPS */
+    {
+      NV_ENC_SEQUENCE_PARAM_PAYLOAD seq_param = { 0 };
+      uint32_t seq_size = 0;
+
+      seq_param.version = NV_ENC_SEQUENCE_PARAM_PAYLOAD_VER;
+      seq_param.spsppsBuffer = g_alloca (1024);
+      seq_param.inBufferSize = 1024;
+      seq_param.outSPSPPSPayloadSize = &seq_size;
+
+      nv_ret = NvEncGetSequenceParams (nvenc->encoder, &seq_param);
+      if (nv_ret != NV_ENC_SUCCESS) {
+        GST_WARNING_OBJECT (enc, "Failed to retrieve SPS/PPS: %d", nv_ret);
+        return FALSE;
+      }
+
+      /* FIXME: use SPS/PPS */
+      GST_MEMDUMP_OBJECT (enc, "SPS/PPS", seq_param.spsppsBuffer, seq_size);
+    }
+#endif
+  }
+
+  g_assert (nvenc_class->set_src_caps);
+  if (!nvenc_class->set_src_caps (nvenc, state)) {
+    GST_ERROR_OBJECT (nvenc, "Subclass failed to set output caps");
+    /* FIXME: clean up */
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
+static inline guint
+_plane_get_n_components (GstVideoInfo * info, guint plane)
+{
+  switch (GST_VIDEO_INFO_FORMAT (info)) {
+    case GST_VIDEO_FORMAT_RGBx:
+    case GST_VIDEO_FORMAT_BGRx:
+    case GST_VIDEO_FORMAT_xRGB:
+    case GST_VIDEO_FORMAT_xBGR:
+    case GST_VIDEO_FORMAT_RGBA:
+    case GST_VIDEO_FORMAT_BGRA:
+    case GST_VIDEO_FORMAT_ARGB:
+    case GST_VIDEO_FORMAT_ABGR:
+    case GST_VIDEO_FORMAT_AYUV:
+      return 4;
+    case GST_VIDEO_FORMAT_RGB:
+    case GST_VIDEO_FORMAT_BGR:
+    case GST_VIDEO_FORMAT_RGB16:
+    case GST_VIDEO_FORMAT_BGR16:
+      return 3;
+    case GST_VIDEO_FORMAT_GRAY16_BE:
+    case GST_VIDEO_FORMAT_GRAY16_LE:
+    case GST_VIDEO_FORMAT_YUY2:
+    case GST_VIDEO_FORMAT_UYVY:
+      return 2;
+    case GST_VIDEO_FORMAT_NV12:
+    case GST_VIDEO_FORMAT_NV21:
+      return plane == 0 ? 1 : 2;
+    case GST_VIDEO_FORMAT_GRAY8:
+    case GST_VIDEO_FORMAT_Y444:
+    case GST_VIDEO_FORMAT_Y42B:
+    case GST_VIDEO_FORMAT_Y41B:
+    case GST_VIDEO_FORMAT_I420:
+    case GST_VIDEO_FORMAT_YV12:
+      return 1;
+    default:
+      g_assert_not_reached ();
+      return 1;
+  }
+}
+
+#if HAVE_NVENC_GST_GL
+struct map_gl_input
+{
+  GstNvBaseEnc *nvenc;
+  GstVideoCodecFrame *frame;
+  GstVideoInfo *info;
+  struct gl_input_resource *in_gl_resource;
+};
+
+static void
+_map_gl_input_buffer (GstGLContext * context, struct map_gl_input *data)
+{
+  cudaError_t cuda_ret;
+  guint8 *data_pointer;
+  guint i;
+
+  cuCtxPushCurrent (data->nvenc->cuda_ctx);
+  data_pointer = data->in_gl_resource->cuda_pointer;
+  for (i = 0; i < GST_VIDEO_INFO_N_PLANES (data->info); i++) {
+    guint plane_n_components;
+    GstGLBaseBuffer *gl_buf_obj;
+    GstGLMemory *gl_mem;
+    guint src_stride, dest_stride;
+
+    gl_mem =
+        (GstGLMemory *) gst_buffer_peek_memory (data->frame->input_buffer, i);
+    g_assert (gst_is_gl_memory ((GstMemory *) gl_mem));
+    data->in_gl_resource->gl_mem[i] = gl_mem;
+    plane_n_components = _plane_get_n_components (data->info, i);
+
+    gl_buf_obj = (GstGLBaseBuffer *) gl_mem;
+
+    /* get the texture into the PBO */
+    gst_gl_memory_upload_transfer (gl_mem);
+    gst_gl_memory_download_transfer (gl_mem);
+
+    GST_LOG_OBJECT (data->nvenc, "attempting to copy texture %u into cuda",
+        gl_mem->tex_id);
+
+    cuda_ret =
+        cudaGraphicsGLRegisterBuffer (&data->in_gl_resource->cuda_texture,
+        gl_buf_obj->id, cudaGraphicsRegisterFlagsReadOnly);
+    if (cuda_ret != cudaSuccess) {
+      GST_ERROR_OBJECT (data->nvenc, "failed to register GL texture %u to cuda "
+          "ret :%d", gl_mem->tex_id, cuda_ret);
+      g_assert_not_reached ();
+    }
+
+    cuda_ret =
+        cudaGraphicsMapResources (1, &data->in_gl_resource->cuda_texture, 0);
+    if (cuda_ret != cudaSuccess) {
+      GST_ERROR_OBJECT (data->nvenc, "failed to map GL texture %u into cuda "
+          "ret :%d", gl_mem->tex_id, cuda_ret);
+      g_assert_not_reached ();
+    }
+
+    cuda_ret =
+        cudaGraphicsResourceGetMappedPointer (&data->in_gl_resource->
+        cuda_plane_pointers[i], &data->in_gl_resource->cuda_num_bytes,
+        data->in_gl_resource->cuda_texture);
+    if (cuda_ret != cudaSuccess) {
+      GST_ERROR_OBJECT (data->nvenc, "failed to get mapped pointer of map GL "
+          "texture %u in cuda ret :%d", gl_mem->tex_id, cuda_ret);
+      g_assert_not_reached ();
+    }
+
+    src_stride = GST_VIDEO_INFO_PLANE_STRIDE (data->info, i);
+    dest_stride = data->in_gl_resource->cuda_stride;
+
+    /* copy into scratch buffer */
+    cuda_ret =
+        cudaMemcpy2D (data_pointer, dest_stride,
+        data->in_gl_resource->cuda_plane_pointers[i], src_stride,
+        _get_plane_width (data->info, i) * plane_n_components,
+        _get_plane_height (data->info, i), cudaMemcpyDeviceToDevice);
+    if (cuda_ret != cudaSuccess) {
+      GST_ERROR_OBJECT (data->nvenc, "failed to copy GL texture %u into cuda "
+          "ret :%d", gl_mem->tex_id, cuda_ret);
+      g_assert_not_reached ();
+    }
+
+    cuda_ret =
+        cudaGraphicsUnmapResources (1, &data->in_gl_resource->cuda_texture, 0);
+    if (cuda_ret != cudaSuccess) {
+      GST_ERROR_OBJECT (data->nvenc, "failed to unmap GL texture %u from cuda "
+          "ret :%d", gl_mem->tex_id, cuda_ret);
+      g_assert_not_reached ();
+    }
+
+    cuda_ret =
+        cudaGraphicsUnregisterResource (data->in_gl_resource->cuda_texture);
+    if (cuda_ret != cudaSuccess) {
+      GST_ERROR_OBJECT (data->nvenc, "failed to unregister GL texture %u from "
+          "cuda ret :%d", gl_mem->tex_id, cuda_ret);
+      g_assert_not_reached ();
+    }
+
+    data_pointer =
+        data_pointer +
+        data->in_gl_resource->cuda_stride *
+        _get_plane_height (&data->nvenc->input_info, i);
+  }
+  cuCtxPopCurrent (NULL);
+}
+#endif
+
+static GstFlowReturn
+_acquire_input_buffer (GstNvBaseEnc * nvenc, gpointer * input)
+{
+  g_assert (input);
+
+  GST_LOG_OBJECT (nvenc, "acquiring input buffer..");
+  GST_VIDEO_ENCODER_STREAM_UNLOCK (nvenc);
+  *input = g_async_queue_pop (nvenc->in_bufs_pool);
+  GST_VIDEO_ENCODER_STREAM_LOCK (nvenc);
+
+  return GST_FLOW_OK;
+}
+
+static GstFlowReturn
+_submit_input_buffer (GstNvBaseEnc * nvenc, GstVideoCodecFrame * frame,
+    GstVideoFrame * vframe, void *inputBuffer, void *inputBufferPtr,
+    NV_ENC_BUFFER_FORMAT bufferFormat, void *outputBufferPtr)
+{
+  GstNvBaseEncClass *nvenc_class = GST_NV_BASE_ENC_GET_CLASS (nvenc);
+  NV_ENC_PIC_PARAMS pic_params = { 0, };
+  NVENCSTATUS nv_ret;
+
+  GST_LOG_OBJECT (nvenc, "%u: input buffer %p, output buffer %p, "
+      "pts %" GST_TIME_FORMAT, frame->system_frame_number, inputBuffer,
+      outputBufferPtr, GST_TIME_ARGS (frame->pts));
+
+  pic_params.version = NV_ENC_PIC_PARAMS_VER;
+  pic_params.inputBuffer = inputBufferPtr;
+  pic_params.bufferFmt = bufferFormat;
+
+  pic_params.inputWidth = GST_VIDEO_FRAME_WIDTH (vframe);
+  pic_params.inputHeight = GST_VIDEO_FRAME_HEIGHT (vframe);
+  pic_params.outputBitstream = outputBufferPtr;
+  pic_params.completionEvent = NULL;
+  if (GST_VIDEO_FRAME_IS_INTERLACED (vframe)) {
+    if (GST_VIDEO_FRAME_IS_TFF (vframe))
+      pic_params.pictureStruct = NV_ENC_PIC_STRUCT_FIELD_TOP_BOTTOM;
+    else
+      pic_params.pictureStruct = NV_ENC_PIC_STRUCT_FIELD_BOTTOM_TOP;
+  } else {
+    pic_params.pictureStruct = NV_ENC_PIC_STRUCT_FRAME;
+  }
+  pic_params.inputTimeStamp = frame->pts;
+  pic_params.inputDuration =
+      GST_CLOCK_TIME_IS_VALID (frame->duration) ? frame->duration : 0;
+  pic_params.frameIdx = frame->system_frame_number;
+
+  if (GST_VIDEO_CODEC_FRAME_IS_FORCE_KEYFRAME (frame))
+    pic_params.encodePicFlags = NV_ENC_PIC_FLAG_FORCEIDR;
+  else
+    pic_params.encodePicFlags = 0;
+
+  if (nvenc_class->set_pic_params
+      && !nvenc_class->set_pic_params (nvenc, frame, &pic_params)) {
+    GST_ERROR_OBJECT (nvenc, "Subclass failed to submit buffer");
+    return GST_FLOW_ERROR;
+  }
+
+  nv_ret = NvEncEncodePicture (nvenc->encoder, &pic_params);
+  if (nv_ret == NV_ENC_SUCCESS) {
+    GST_LOG_OBJECT (nvenc, "Encoded picture");
+  } else if (nv_ret == NV_ENC_ERR_NEED_MORE_INPUT) {
+    /* FIXME: we should probably queue pending output buffers here and only
+     * submit them to the async queue once we got sucess back */
+    GST_DEBUG_OBJECT (nvenc, "Encoded picture (encoder needs more input)");
+  } else {
+    GST_ERROR_OBJECT (nvenc, "Failed to encode picture: %d", nv_ret);
+    GST_DEBUG_OBJECT (nvenc, "re-enqueueing input buffer %p", inputBuffer);
+    g_async_queue_push (nvenc->in_bufs_pool, inputBuffer);
+    GST_DEBUG_OBJECT (nvenc, "re-enqueueing output buffer %p", outputBufferPtr);
+    g_async_queue_push (nvenc->bitstream_pool, outputBufferPtr);
+
+    return GST_FLOW_ERROR;
+  }
+
+  g_async_queue_push (nvenc->bitstream_queue, outputBufferPtr);
+
+  return GST_FLOW_OK;
+}
+
+static GstFlowReturn
+gst_nv_base_enc_handle_frame (GstVideoEncoder * enc, GstVideoCodecFrame * frame)
+{
+  gpointer input_buffer = NULL;
+  GstNvBaseEnc *nvenc = GST_NV_BASE_ENC (enc);
+  NV_ENC_OUTPUT_PTR out_buf;
+  NVENCSTATUS nv_ret;
+  GstVideoFrame vframe;
+  GstVideoInfo *info = &nvenc->input_state->info;
+  GstFlowReturn flow = GST_FLOW_OK;
+  GstMapFlags in_map_flags = GST_MAP_READ;
+  struct frame_state *state;
+  guint frame_n = 0;
+
+  g_assert (nvenc->encoder != NULL);
+
+#if HAVE_NVENC_GST_GL
+  if (nvenc->gl_input)
+    in_map_flags |= GST_MAP_GL;
+#endif
+
+  if (!gst_video_frame_map (&vframe, info, frame->input_buffer, in_map_flags))
+    return GST_FLOW_ERROR;
+
+  /* make sure our thread that waits for output to be ready is started */
+  if (nvenc->bitstream_thread == NULL) {
+    if (!gst_nv_base_enc_start_bitstream_thread (nvenc))
+      goto error;
+  }
+
+  flow = _acquire_input_buffer (nvenc, &input_buffer);
+  if (flow != GST_FLOW_OK)
+    return flow;
+  if (input_buffer == NULL)
+    return GST_FLOW_ERROR;
+
+  state = frame->user_data;
+  if (!state)
+    state = g_new0 (struct frame_state, 1);
+  state->n_buffers = 1;
+
+#if HAVE_NVENC_GST_GL
+  if (nvenc->gl_input) {
+    struct gl_input_resource *in_gl_resource = input_buffer;
+    struct map_gl_input data;
+
+    GST_LOG_OBJECT (enc, "got input buffer %p", in_gl_resource);
+
+    in_gl_resource->gl_mem[0] =
+        (GstGLMemory *) gst_buffer_peek_memory (frame->input_buffer, 0);
+    g_assert (gst_is_gl_memory ((GstMemory *) in_gl_resource->gl_mem[0]));
+
+    data.nvenc = nvenc;
+    data.frame = frame;
+    data.info = &vframe.info;
+    data.in_gl_resource = in_gl_resource;
+
+    gst_gl_context_thread_add (in_gl_resource->gl_mem[0]->mem.context,
+        (GstGLContextThreadFunc) _map_gl_input_buffer, &data);
+
+    in_gl_resource->nv_mapped_resource.version = NV_ENC_MAP_INPUT_RESOURCE_VER;
+    in_gl_resource->nv_mapped_resource.registeredResource =
+        in_gl_resource->nv_resource.registeredResource;
+
+    nv_ret =
+        NvEncMapInputResource (nvenc->encoder,
+        &in_gl_resource->nv_mapped_resource);
+    if (nv_ret != NV_ENC_SUCCESS) {
+      GST_ERROR_OBJECT (nvenc, "Failed to map input resource %p, ret %d",
+          in_gl_resource, nv_ret);
+      goto error;
+    }
+
+    out_buf = g_async_queue_try_pop (nvenc->bitstream_pool);
+    if (out_buf == NULL) {
+      GST_DEBUG_OBJECT (nvenc, "wait for output buf to become available again");
+      out_buf = g_async_queue_pop (nvenc->bitstream_pool);
+    }
+
+    state->in_bufs[frame_n] = in_gl_resource;
+    state->out_bufs[frame_n++] = out_buf;
+
+    frame->user_data = state;
+    frame->user_data_destroy_notify = (GDestroyNotify) g_free;
+
+    flow =
+        _submit_input_buffer (nvenc, frame, &vframe, in_gl_resource,
+        in_gl_resource->nv_mapped_resource.mappedResource,
+        in_gl_resource->nv_mapped_resource.mappedBufferFmt, out_buf);
+
+    /* encoder will keep frame in list internally, we'll look it up again later
+     * in the thread where we get the output buffers and finish it there */
+    gst_video_codec_frame_unref (frame);
+    frame = NULL;
+  }
+#endif
+
+  if (!nvenc->gl_input) {
+    NV_ENC_LOCK_INPUT_BUFFER in_buf_lock = { 0, };
+    NV_ENC_INPUT_PTR in_buf = input_buffer;
+    guint8 *src, *dest;
+    guint src_stride, dest_stride;
+    guint height, width;
+    guint y;
+
+    GST_LOG_OBJECT (enc, "got input buffer %p", in_buf);
+
+    in_buf_lock.version = NV_ENC_LOCK_INPUT_BUFFER_VER;
+    in_buf_lock.inputBuffer = in_buf;
+
+    nv_ret = NvEncLockInputBuffer (nvenc->encoder, &in_buf_lock);
+    if (nv_ret != NV_ENC_SUCCESS) {
+      GST_ERROR_OBJECT (nvenc, "Failed to lock input buffer: %d", nv_ret);
+      /* FIXME: post proper error message */
+      goto error;
+    }
+    GST_LOG_OBJECT (nvenc, "Locked input buffer %p", in_buf);
+
+    width = GST_VIDEO_FRAME_WIDTH (&vframe);
+    height = GST_VIDEO_FRAME_HEIGHT (&vframe);
+
+    // FIXME: this only works for NV12
+    g_assert (GST_VIDEO_FRAME_FORMAT (&vframe) == GST_VIDEO_FORMAT_NV12);
+
+    /* copy Y plane */
+    src = GST_VIDEO_FRAME_PLANE_DATA (&vframe, 0);
+    src_stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 0);
+    dest = in_buf_lock.bufferDataPtr;
+    dest_stride = in_buf_lock.pitch;
+    for (y = 0; y < height; ++y) {
+      memcpy (dest, src, width);
+      dest += dest_stride;
+      src += src_stride;
+    }
+
+    /* copy UV plane */
+    src = GST_VIDEO_FRAME_PLANE_DATA (&vframe, 1);
+    src_stride = GST_VIDEO_FRAME_PLANE_STRIDE (&vframe, 1);
+    dest =
+        (guint8 *) in_buf_lock.bufferDataPtr +
+        GST_ROUND_UP_32 (GST_VIDEO_INFO_HEIGHT (&nvenc->input_info)) *
+        in_buf_lock.pitch;
+    dest_stride = in_buf_lock.pitch;
+    for (y = 0; y < GST_ROUND_UP_2 (height) / 2; ++y) {
+      memcpy (dest, src, width);
+      dest += dest_stride;
+      src += src_stride;
+    }
+
+    nv_ret = NvEncUnlockInputBuffer (nvenc->encoder, in_buf);
+    if (nv_ret != NV_ENC_SUCCESS) {
+      GST_ERROR_OBJECT (nvenc, "Failed to unlock input buffer: %d", nv_ret);
+      goto error;
+    }
+
+    out_buf = g_async_queue_try_pop (nvenc->bitstream_pool);
+    if (out_buf == NULL) {
+      GST_DEBUG_OBJECT (nvenc, "wait for output buf to become available again");
+      out_buf = g_async_queue_pop (nvenc->bitstream_pool);
+    }
+
+    state->in_bufs[frame_n] = in_buf;
+    state->out_bufs[frame_n++] = out_buf;
+    frame->user_data = state;
+    frame->user_data_destroy_notify = (GDestroyNotify) g_free;
+
+    flow =
+        _submit_input_buffer (nvenc, frame, &vframe, in_buf, in_buf,
+        gst_nvenc_get_nv_buffer_format (GST_VIDEO_INFO_FORMAT (info)), out_buf);
+
+    /* encoder will keep frame in list internally, we'll look it up again later
+     * in the thread where we get the output buffers and finish it there */
+    gst_video_codec_frame_unref (frame);
+    frame = NULL;
+  }
+
+  if (flow != GST_FLOW_OK)
+    goto out;
+
+  flow = g_atomic_int_get (&nvenc->last_flow);
+
+out:
+
+  gst_video_frame_unmap (&vframe);
+
+  return flow;
+
+error:
+  flow = GST_FLOW_ERROR;
+  goto out;
+}
+
+static gboolean
+gst_nv_base_enc_drain_encoder (GstNvBaseEnc * nvenc)
+{
+  NV_ENC_PIC_PARAMS pic_params = { 0, };
+  NVENCSTATUS nv_ret;
+
+  GST_INFO_OBJECT (nvenc, "draining encoder");
+
+  if (nvenc->input_state == NULL) {
+    GST_DEBUG_OBJECT (nvenc, "no input state, nothing to do");
+    return TRUE;
+  }
+
+  pic_params.version = NV_ENC_PIC_PARAMS_VER;
+  pic_params.encodePicFlags = NV_ENC_PIC_FLAG_EOS;
+
+  nv_ret = NvEncEncodePicture (nvenc->encoder, &pic_params);
+  if (nv_ret != NV_ENC_SUCCESS) {
+    GST_LOG_OBJECT (nvenc, "Failed to drain encoder, ret %d", nv_ret);
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
+static GstFlowReturn
+gst_nv_base_enc_finish (GstVideoEncoder * enc)
+{
+  GstNvBaseEnc *nvenc = GST_NV_BASE_ENC (enc);
+
+  GST_FIXME_OBJECT (enc, "implement finish");
+
+  gst_nv_base_enc_drain_encoder (nvenc);
+
+  /* wait for encoder to output the remaining buffers */
+  gst_nv_base_enc_stop_bitstream_thread (nvenc);
+
+  return GST_FLOW_OK;
+}
+
+#if 0
+static gboolean
+gst_nv_base_enc_flush (GstVideoEncoder * enc)
+{
+  GstNvBaseEnc *nvenc = GST_NV_BASE_ENC (enc);
+  GST_INFO_OBJECT (nvenc, "done flushing encoder");
+  return TRUE;
+}
+#endif
+
+static void
+gst_nv_base_enc_set_property (GObject * object, guint prop_id,
+    const GValue * value, GParamSpec * pspec)
+{
+  GstNvBaseEnc *nvenc = GST_NV_BASE_ENC (object);
+
+  switch (prop_id) {
+    case PROP_DEVICE_ID:
+      nvenc->cuda_device_id = g_value_get_uint (value);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+gst_nv_base_enc_get_property (GObject * object, guint prop_id, GValue * value,
+    GParamSpec * pspec)
+{
+  GstNvBaseEnc *nvenc = GST_NV_BASE_ENC (object);
+
+  switch (prop_id) {
+    case PROP_DEVICE_ID:
+      g_value_set_uint (value, nvenc->cuda_device_id);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
diff --git a/sys/nvenc/gstnvbaseenc.h b/sys/nvenc/gstnvbaseenc.h
new file mode 100644
index 0000000..0a843e9
--- /dev/null
+++ b/sys/nvenc/gstnvbaseenc.h
@@ -0,0 +1,114 @@
+/* GStreamer NVENC plugin
+ * Copyright (C) 2015 Centricular Ltd
+ *
+ * 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_NV_BASE_ENC_H_INCLUDED__
+#define __GST_NV_BASE_ENC_H_INCLUDED__
+
+#include "gstnvenc.h"
+
+#include <gst/video/gstvideoencoder.h>
+
+#define GST_TYPE_NV_BASE_ENC \
+  (gst_nv_base_enc_get_type())
+#define GST_NV_BASE_ENC(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_NV_BASE_ENC,GstNvBaseEnc))
+#define GST_NV_BASE_ENC_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_NV_BASE_ENC,GstNvBaseEncClass))
+#define GST_NV_BASE_ENC_GET_CLASS(obj) \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_NV_BASE_ENC,GstNvBaseEncClass))
+#define GST_IS_NV_BASE_ENC(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_NV_BASE_ENC))
+#define GST_IS_NV_BASE_ENC_CLASS(obj) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_NV_BASE_ENC))
+
+typedef struct {
+  GstVideoEncoder video_encoder;
+
+  /* properties */
+  guint           cuda_device_id;
+
+  CUcontext       cuda_ctx;
+  void          * encoder;
+
+  /* the supported input formats */
+  GValue        * input_formats;                  /* OBJECT LOCK */
+
+  GstVideoCodecState *input_state;
+  gboolean            gl_input;
+
+  /* allocated buffers */
+  gpointer          *input_bufs;   /* array of n_allocs input buffers  */
+  NV_ENC_OUTPUT_PTR *output_bufs;  /* array of n_allocs output buffers */
+  guint              n_bufs;
+
+  /* input and output buffers currently available */
+  GAsyncQueue    *in_bufs_pool;
+  GAsyncQueue    *bitstream_pool;
+
+  /* output bufs in use (input bufs in use are tracked via the codec frames) */
+  GAsyncQueue    *bitstream_queue;
+
+  /* we spawn a thread that does the (blocking) waits for output buffers
+   * to become available, so we can continue to feed data to the encoder
+   * while we wait */
+  GThread        *bitstream_thread;
+
+  /* supported interlacing input modes.
+   * 0 = none, 1 = fields, 2 = interleaved */
+  gint            interlace_modes;
+
+  void           *display;            /* GstGLDisplay */
+  void           *other_context;      /* GstGLContext */
+
+  /* the maximum buffer size the encoder is configured for */
+  guint               max_encode_width;
+  guint               max_encode_height;
+
+  GstVideoInfo        input_info;     /* buffer configuration for buffers sent to NVENC */
+
+  GstFlowReturn   last_flow;          /* ATOMIC */
+} GstNvBaseEnc;
+
+typedef struct {
+  GstVideoEncoderClass video_encoder_class;
+
+  GUID codec_id;
+
+  gboolean (*initialize_encoder) (GstNvBaseEnc * nvenc,
+                                  GstVideoCodecState * old_state,
+                                  GstVideoCodecState * state);
+  gboolean (*set_src_caps)       (GstNvBaseEnc * nvenc,
+                                  GstVideoCodecState * state);
+  gboolean (*set_pic_params)     (GstNvBaseEnc * nvenc,
+                                  GstVideoCodecFrame * frame,
+                                  NV_ENC_PIC_PARAMS * pic_params);
+} GstNvBaseEncClass;
+
+G_GNUC_INTERNAL
+GType gst_nv_base_enc_get_type (void);
+
+
+void gst_nv_base_enc_get_max_encode_size      (GstNvBaseEnc * nvenc,
+                                               guint * max_width,
+                                               guint * max_height);
+void gst_nv_base_enc_set_max_encode_size      (GstNvBaseEnc * nvenc,
+                                               guint max_width,
+                                               guint max_height);
+
+#endif /* __GST_NV_BASE_ENC_H_INCLUDED__ */
diff --git a/sys/nvenc/gstnvenc.c b/sys/nvenc/gstnvenc.c
new file mode 100644
index 0000000..6b0d568
--- /dev/null
+++ b/sys/nvenc/gstnvenc.c
@@ -0,0 +1,328 @@
+/* GStreamer NVENC plugin
+ * Copyright (C) 2015 Centricular Ltd
+ *
+ * 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 "gstnvenc.h"
+#include "gstnvh264enc.h"
+
+GST_DEBUG_CATEGORY (gst_nvenc_debug);
+
+static NV_ENCODE_API_FUNCTION_LIST nvenc_api;
+
+NVENCSTATUS
+NvEncOpenEncodeSessionEx (NV_ENC_OPEN_ENCODE_SESSION_EX_PARAMS * params,
+    void **encoder)
+{
+  g_assert (nvenc_api.nvEncOpenEncodeSessionEx != NULL);
+  return nvenc_api.nvEncOpenEncodeSessionEx (params, encoder);
+}
+
+NVENCSTATUS
+NvEncDestroyEncoder (void *encoder)
+{
+  g_assert (nvenc_api.nvEncDestroyEncoder != NULL);
+  return nvenc_api.nvEncDestroyEncoder (encoder);
+}
+
+NVENCSTATUS
+NvEncGetEncodeGUIDs (void *encoder, GUID * array, uint32_t array_size,
+    uint32_t * count)
+{
+  g_assert (nvenc_api.nvEncGetEncodeGUIDs != NULL);
+  return nvenc_api.nvEncGetEncodeGUIDs (encoder, array, array_size, count);
+}
+
+NVENCSTATUS
+NvEncGetEncodeProfileGUIDCount (void *encoder, GUID encodeGUID,
+    uint32_t * encodeProfileGUIDCount)
+{
+  g_assert (nvenc_api.nvEncGetEncodeProfileGUIDCount != NULL);
+  return nvenc_api.nvEncGetEncodeProfileGUIDCount (encoder, encodeGUID,
+      encodeProfileGUIDCount);
+}
+
+NVENCSTATUS
+NvEncGetEncodeProfileGUIDs (void *encoder, GUID encodeGUID,
+    GUID * profileGUIDs, uint32_t guidArraySize, uint32_t * GUIDCount)
+{
+  g_assert (nvenc_api.nvEncGetEncodeProfileGUIDs != NULL);
+  return nvenc_api.nvEncGetEncodeProfileGUIDs (encoder, encodeGUID,
+      profileGUIDs, guidArraySize, GUIDCount);
+}
+
+NVENCSTATUS
+NvEncGetInputFormats (void *encoder, GUID enc_guid,
+    NV_ENC_BUFFER_FORMAT * array, uint32_t size, uint32_t * num)
+{
+  g_assert (nvenc_api.nvEncGetInputFormats != NULL);
+  return nvenc_api.nvEncGetInputFormats (encoder, enc_guid, array, size, num);
+}
+
+NVENCSTATUS
+NvEncGetEncodePresetConfig (void *encoder, GUID encodeGUID,
+    GUID presetGUID, NV_ENC_PRESET_CONFIG * presetConfig)
+{
+  g_assert (nvenc_api.nvEncGetEncodePresetConfig != NULL);
+  return nvenc_api.nvEncGetEncodePresetConfig (encoder, encodeGUID, presetGUID,
+      presetConfig);
+}
+
+NVENCSTATUS
+NvEncGetEncodeCaps (void *encoder, GUID encodeGUID,
+    NV_ENC_CAPS_PARAM * capsParam, int *capsVal)
+{
+  g_assert (nvenc_api.nvEncGetEncodeCaps != NULL);
+  return nvenc_api.nvEncGetEncodeCaps (encoder, encodeGUID, capsParam, capsVal);
+}
+
+NVENCSTATUS
+NvEncGetSequenceParams (void *encoder,
+    NV_ENC_SEQUENCE_PARAM_PAYLOAD * sequenceParamPayload)
+{
+  g_assert (nvenc_api.nvEncGetSequenceParams != NULL);
+  return nvenc_api.nvEncGetSequenceParams (encoder, sequenceParamPayload);
+}
+
+NVENCSTATUS
+NvEncInitializeEncoder (void *encoder, NV_ENC_INITIALIZE_PARAMS * params)
+{
+  g_assert (nvenc_api.nvEncInitializeEncoder != NULL);
+  return nvenc_api.nvEncInitializeEncoder (encoder, params);
+}
+
+NVENCSTATUS
+NvEncReconfigureEncoder (void *encoder, NV_ENC_RECONFIGURE_PARAMS * params)
+{
+  g_assert (nvenc_api.nvEncReconfigureEncoder != NULL);
+  return nvenc_api.nvEncReconfigureEncoder (encoder, params);
+}
+
+NVENCSTATUS
+NvEncRegisterResource (void *encoder, NV_ENC_REGISTER_RESOURCE * params)
+{
+  g_assert (nvenc_api.nvEncRegisterResource != NULL);
+  return nvenc_api.nvEncRegisterResource (encoder, params);
+}
+
+NVENCSTATUS
+NvEncUnregisterResource (void *encoder, NV_ENC_REGISTERED_PTR resource)
+{
+  g_assert (nvenc_api.nvEncUnregisterResource != NULL);
+  return nvenc_api.nvEncUnregisterResource (encoder, resource);
+}
+
+NVENCSTATUS
+NvEncMapInputResource (void *encoder, NV_ENC_MAP_INPUT_RESOURCE * params)
+{
+  g_assert (nvenc_api.nvEncMapInputResource != NULL);
+  return nvenc_api.nvEncMapInputResource (encoder, params);
+}
+
+NVENCSTATUS
+NvEncUnmapInputResource (void *encoder, NV_ENC_INPUT_PTR input_buffer)
+{
+  g_assert (nvenc_api.nvEncUnmapInputResource != NULL);
+  return nvenc_api.nvEncUnmapInputResource (encoder, input_buffer);
+}
+
+NVENCSTATUS
+NvEncCreateInputBuffer (void *encoder, NV_ENC_CREATE_INPUT_BUFFER * input_buf)
+{
+  g_assert (nvenc_api.nvEncCreateInputBuffer != NULL);
+  return nvenc_api.nvEncCreateInputBuffer (encoder, input_buf);
+}
+
+NVENCSTATUS
+NvEncLockInputBuffer (void *encoder, NV_ENC_LOCK_INPUT_BUFFER * input_buf)
+{
+  g_assert (nvenc_api.nvEncLockInputBuffer != NULL);
+  return nvenc_api.nvEncLockInputBuffer (encoder, input_buf);
+}
+
+NVENCSTATUS
+NvEncUnlockInputBuffer (void *encoder, NV_ENC_INPUT_PTR input_buf)
+{
+  g_assert (nvenc_api.nvEncUnlockInputBuffer != NULL);
+  return nvenc_api.nvEncUnlockInputBuffer (encoder, input_buf);
+}
+
+NVENCSTATUS
+NvEncDestroyInputBuffer (void *encoder, NV_ENC_INPUT_PTR input_buf)
+{
+  g_assert (nvenc_api.nvEncDestroyInputBuffer != NULL);
+  return nvenc_api.nvEncDestroyInputBuffer (encoder, input_buf);
+}
+
+NVENCSTATUS
+NvEncCreateBitstreamBuffer (void *encoder, NV_ENC_CREATE_BITSTREAM_BUFFER * bb)
+{
+  g_assert (nvenc_api.nvEncCreateBitstreamBuffer != NULL);
+  return nvenc_api.nvEncCreateBitstreamBuffer (encoder, bb);
+}
+
+NVENCSTATUS
+NvEncLockBitstream (void *encoder, NV_ENC_LOCK_BITSTREAM * lock_bs)
+{
+  g_assert (nvenc_api.nvEncLockBitstream != NULL);
+  return nvenc_api.nvEncLockBitstream (encoder, lock_bs);
+}
+
+NVENCSTATUS
+NvEncUnlockBitstream (void *encoder, NV_ENC_OUTPUT_PTR bb)
+{
+  g_assert (nvenc_api.nvEncUnlockBitstream != NULL);
+  return nvenc_api.nvEncUnlockBitstream (encoder, bb);
+}
+
+NVENCSTATUS
+NvEncDestroyBitstreamBuffer (void *encoder, NV_ENC_OUTPUT_PTR bit_buf)
+{
+  g_assert (nvenc_api.nvEncDestroyBitstreamBuffer != NULL);
+  return nvenc_api.nvEncDestroyBitstreamBuffer (encoder, bit_buf);
+}
+
+NVENCSTATUS
+NvEncEncodePicture (void *encoder, NV_ENC_PIC_PARAMS * pic_params)
+{
+  g_assert (nvenc_api.nvEncEncodePicture != NULL);
+  return nvenc_api.nvEncEncodePicture (encoder, pic_params);
+}
+
+gboolean
+gst_nvenc_cmp_guid (GUID g1, GUID g2)
+{
+  return (g1.Data1 == g2.Data1 && g1.Data2 == g2.Data2 && g1.Data3 == g2.Data3
+      && g1.Data4[0] == g2.Data4[0] && g1.Data4[1] == g2.Data4[1]
+      && g1.Data4[2] == g2.Data4[2] && g1.Data4[3] == g2.Data4[3]
+      && g1.Data4[4] == g2.Data4[4] && g1.Data4[5] == g2.Data4[5]
+      && g1.Data4[6] == g2.Data4[6] && g1.Data4[7] == g2.Data4[7]);
+}
+
+NV_ENC_BUFFER_FORMAT
+gst_nvenc_get_nv_buffer_format (GstVideoFormat fmt)
+{
+  switch (fmt) {
+    case GST_VIDEO_FORMAT_NV12:
+      return NV_ENC_BUFFER_FORMAT_NV12_PL;
+    case GST_VIDEO_FORMAT_YV12:
+      return NV_ENC_BUFFER_FORMAT_YV12_PL;
+    case GST_VIDEO_FORMAT_I420:
+      return NV_ENC_BUFFER_FORMAT_IYUV_PL;
+    case GST_VIDEO_FORMAT_Y444:
+      return NV_ENC_BUFFER_FORMAT_YUV444_PL;
+    default:
+      break;
+  }
+  return NV_ENC_BUFFER_FORMAT_UNDEFINED;
+}
+
+CUcontext
+gst_nvenc_create_cuda_context (guint device_id)
+{
+  CUcontext cuda_ctx, old_ctx;
+  CUresult cres = CUDA_SUCCESS;
+  CUdevice cdev = 0, cuda_dev = -1;
+  int dev_count = 0;
+  char name[256];
+  int min = 0, maj = 0;
+  int i;
+
+  GST_INFO ("Initialising CUDA..");
+
+  cres = cuInit (0);
+
+  if (cres != CUDA_SUCCESS) {
+    GST_WARNING ("Failed to initialise CUDA, error code: 0x%08x", cres);
+    return NULL;
+  }
+
+  GST_INFO ("Initialised CUDA");
+
+  cres = cuDeviceGetCount (&dev_count);
+  if (cres != CUDA_SUCCESS || dev_count == 0) {
+    GST_WARNING ("No CUDA devices detected");
+    return NULL;
+  }
+
+  GST_INFO ("%d CUDA device(s) detected", dev_count);
+  for (i = 0; i < dev_count; ++i) {
+    if (cuDeviceGet (&cdev, i) == CUDA_SUCCESS
+        && cuDeviceGetName (name, sizeof (name), cdev) == CUDA_SUCCESS
+        && cuDeviceComputeCapability (&maj, &min, cdev) == CUDA_SUCCESS) {
+      GST_INFO ("GPU #%d supports NVENC: %s (%s) (Compute SM %d.%d)",
+          i, (((maj << 4) + min) >= 0x30) ? "yes" : "no", name, maj, min);
+      if (i == device_id) {
+        cuda_dev = cdev;
+      }
+    }
+  }
+
+  if (cuda_dev == -1) {
+    GST_WARNING ("Device with id %d does not exist or does not support NVENC",
+        device_id);
+    return NULL;
+  }
+
+  if (cuCtxCreate (&cuda_ctx, 0, cuda_dev) != CUDA_SUCCESS) {
+    GST_WARNING ("Failed to create CUDA context for cuda device %d", cuda_dev);
+    return NULL;
+  }
+
+  if (cuCtxPopCurrent (&old_ctx) != CUDA_SUCCESS) {
+    return NULL;
+  }
+
+  GST_INFO ("Created CUDA context %p", cuda_ctx);
+
+  return cuda_ctx;
+}
+
+gboolean
+gst_nvenc_destroy_cuda_context (CUcontext ctx)
+{
+  GST_INFO ("Destroying CUDA context %p", ctx);
+  return (cuCtxDestroy (ctx) == CUDA_SUCCESS);
+}
+
+static gboolean
+plugin_init (GstPlugin * plugin)
+{
+  GST_DEBUG_CATEGORY_INIT (gst_nvenc_debug, "nvenc", 0, "Nvidia NVENC encoder");
+
+  nvenc_api.version = NV_ENCODE_API_FUNCTION_LIST_VER;
+  if (NvEncodeAPICreateInstance (&nvenc_api) != NV_ENC_SUCCESS) {
+    GST_ERROR ("Failed to get NVEncodeAPI function table!");
+  } else {
+    GST_INFO ("Created NVEncodeAPI instance, got function table");
+
+    gst_element_register (plugin, "nvh264enc", GST_RANK_PRIMARY * 2,
+        gst_nv_h264_enc_get_type ());
+  }
+
+  return TRUE;
+}
+
+GST_PLUGIN_DEFINE (GST_VERSION_MAJOR,
+    GST_VERSION_MINOR,
+    nvenc,
+    "GStreamer NVENC plugin",
+    plugin_init, VERSION, "LGPL", GST_PACKAGE_NAME, GST_PACKAGE_ORIGIN)
diff --git a/sys/nvenc/gstnvenc.h b/sys/nvenc/gstnvenc.h
new file mode 100644
index 0000000..f4eb34b
--- /dev/null
+++ b/sys/nvenc/gstnvenc.h
@@ -0,0 +1,40 @@
+/* GStreamer NVENC plugin
+ * Copyright (C) 2015 Centricular Ltd
+ *
+ * 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_NVENC_H_INCLUDED__
+#define __GST_NVENC_H_INCLUDED__
+
+#include <gst/gst.h>
+#include <gst/video/video.h>
+
+#include <nvEncodeAPI.h>
+#include <cuda.h>
+
+GST_DEBUG_CATEGORY_EXTERN (gst_nvenc_debug);
+#define GST_CAT_DEFAULT gst_nvenc_debug
+
+CUcontext               gst_nvenc_create_cuda_context (guint device_id);
+
+gboolean                gst_nvenc_destroy_cuda_context (CUcontext ctx);
+
+gboolean                gst_nvenc_cmp_guid (GUID g1, GUID g2);
+
+NV_ENC_BUFFER_FORMAT    gst_nvenc_get_nv_buffer_format (GstVideoFormat fmt);
+
+#endif /* __GST_NVENC_H_INCLUDED__ */
diff --git a/sys/nvenc/gstnvh264enc.c b/sys/nvenc/gstnvh264enc.c
new file mode 100644
index 0000000..170e3f7
--- /dev/null
+++ b/sys/nvenc/gstnvh264enc.c
@@ -0,0 +1,610 @@
+/* GStreamer NVENC plugin
+ * Copyright (C) 2015 Centricular Ltd
+ *
+ * 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 "gstnvh264enc.h"
+
+#include <gst/pbutils/codec-utils.h>
+
+#include <string.h>
+
+#if HAVE_GST_GL
+#include <cuda.h>
+#include <cuda_runtime_api.h>
+#include <cuda_gl_interop.h>
+#define GST_USE_UNSTABLE_API
+#include <gst/gl/gl.h>
+#endif
+
+#define parent_class gst_nv_h264_enc_parent_class
+G_DEFINE_TYPE (GstNvH264Enc, gst_nv_h264_enc, GST_TYPE_NV_BASE_ENC);
+
+/* *INDENT-OFF* */
+static GstStaticPadTemplate src_factory = GST_STATIC_PAD_TEMPLATE ("src",
+    GST_PAD_SRC,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS ("video/x-h264, "
+        "width = (int) [ 1, 4096 ], height = (int) [ 1, 2160 ], "
+        "framerate = (fraction) [0/1, MAX], "
+        "stream-format = (string) byte-stream, " // TODO: avc support
+        "alignment = (string) au, "
+        "profile = (string) { high, main, baseline }") // TODO: a couple of others
+    );
+/* *INDENT-ON* */
+
+static gboolean gst_nv_h264_enc_open (GstVideoEncoder * enc);
+static gboolean gst_nv_h264_enc_close (GstVideoEncoder * enc);
+static GstCaps *gst_nv_h264_enc_getcaps (GstVideoEncoder * enc,
+    GstCaps * filter);
+static gboolean gst_nv_h264_enc_set_src_caps (GstNvBaseEnc * nvenc,
+    GstVideoCodecState * state);
+static gboolean gst_nv_h264_enc_initialize_encoder (GstNvBaseEnc * nvenc,
+    GstVideoCodecState * old_state, GstVideoCodecState * state);
+static gboolean gst_nv_h264_enc_set_pic_params (GstNvBaseEnc * nvenc,
+    GstVideoCodecFrame * frame, NV_ENC_PIC_PARAMS * pic_params);
+static void gst_nv_h264_enc_set_property (GObject * object, guint prop_id,
+    const GValue * value, GParamSpec * pspec);
+static void gst_nv_h264_enc_get_property (GObject * object, guint prop_id,
+    GValue * value, GParamSpec * pspec);
+static void gst_nv_h264_enc_finalize (GObject * obj);
+
+static void
+gst_nv_h264_enc_class_init (GstNvH264EncClass * klass)
+{
+  GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
+  GstElementClass *element_class = GST_ELEMENT_CLASS (klass);
+  GstVideoEncoderClass *videoenc_class = GST_VIDEO_ENCODER_CLASS (klass);
+  GstNvBaseEncClass *nvenc_class = GST_NV_BASE_ENC_CLASS (klass);
+
+  gobject_class->set_property = gst_nv_h264_enc_set_property;
+  gobject_class->get_property = gst_nv_h264_enc_get_property;
+  gobject_class->finalize = gst_nv_h264_enc_finalize;
+
+  videoenc_class->open = GST_DEBUG_FUNCPTR (gst_nv_h264_enc_open);
+  videoenc_class->close = GST_DEBUG_FUNCPTR (gst_nv_h264_enc_close);
+
+  videoenc_class->getcaps = GST_DEBUG_FUNCPTR (gst_nv_h264_enc_getcaps);
+
+  nvenc_class->codec_id = NV_ENC_CODEC_H264_GUID;
+  nvenc_class->initialize_encoder = gst_nv_h264_enc_initialize_encoder;
+  nvenc_class->set_src_caps = gst_nv_h264_enc_set_src_caps;
+  nvenc_class->set_pic_params = gst_nv_h264_enc_set_pic_params;
+
+  gst_element_class_add_pad_template (element_class,
+      gst_static_pad_template_get (&src_factory));
+
+  gst_element_class_set_static_metadata (element_class,
+      "NVENC H.264 Video Encoder",
+      "Codec/Encoder/Video",
+      "Encode H.264 video streams using NVIDIA's hardware-accelerated NVENC encoder API",
+      "Tim-Philipp Müller <tim@centricular.com>\n"
+      "Matthew Waters <matthew@centricular.com>");
+}
+
+static void
+gst_nv_h264_enc_init (GstNvH264Enc * nvenc)
+{
+}
+
+static void
+gst_nv_h264_enc_finalize (GObject * obj)
+{
+  G_OBJECT_CLASS (gst_nv_h264_enc_parent_class)->finalize (obj);
+}
+
+static gboolean
+_get_supported_profiles (GstNvH264Enc * nvenc)
+{
+  NVENCSTATUS nv_ret;
+  GUID profile_guids[64];
+  GValue list = G_VALUE_INIT;
+  GValue val = G_VALUE_INIT;
+  guint i, n, n_profiles;
+
+  nv_ret =
+      NvEncGetEncodeProfileGUIDCount (GST_NV_BASE_ENC (nvenc)->encoder,
+      NV_ENC_CODEC_H264_GUID, &n);
+  if (nv_ret != NV_ENC_SUCCESS)
+    return FALSE;
+
+  nv_ret =
+      NvEncGetEncodeProfileGUIDs (GST_NV_BASE_ENC (nvenc)->encoder,
+      NV_ENC_CODEC_H264_GUID, profile_guids, G_N_ELEMENTS (profile_guids), &n);
+  if (nv_ret != NV_ENC_SUCCESS)
+    return FALSE;
+
+  n_profiles = 0;
+  g_value_init (&list, GST_TYPE_LIST);
+  for (i = 0; i < n; i++) {
+    g_value_init (&val, G_TYPE_STRING);
+
+    if (gst_nvenc_cmp_guid (profile_guids[i],
+            NV_ENC_H264_PROFILE_BASELINE_GUID)) {
+      g_value_set_static_string (&val, "baseline");
+      gst_value_list_append_value (&list, &val);
+      n_profiles++;
+    } else if (gst_nvenc_cmp_guid (profile_guids[i],
+            NV_ENC_H264_PROFILE_MAIN_GUID)) {
+      g_value_set_static_string (&val, "main");
+      gst_value_list_append_value (&list, &val);
+      n_profiles++;
+    } else if (gst_nvenc_cmp_guid (profile_guids[i],
+            NV_ENC_H264_PROFILE_HIGH_GUID)) {
+      g_value_set_static_string (&val, "high");
+      gst_value_list_append_value (&list, &val);
+      n_profiles++;
+    }
+    /* TODO: map HIGH_444, STEREO, CONSTRAINED_HIGH, SVC_TEMPORAL_SCALABILITY */
+
+    g_value_unset (&val);
+  }
+
+  if (n_profiles == 0)
+    return FALSE;
+
+  GST_OBJECT_LOCK (nvenc);
+  g_free (nvenc->supported_profiles);
+  nvenc->supported_profiles = g_memdup (&list, sizeof (GValue));
+  GST_OBJECT_UNLOCK (nvenc);
+
+  return TRUE;
+}
+
+static gboolean
+gst_nv_h264_enc_open (GstVideoEncoder * enc)
+{
+  GstNvH264Enc *nvenc = GST_NV_H264_ENC (enc);
+
+  if (!GST_VIDEO_ENCODER_CLASS (gst_nv_h264_enc_parent_class)->open (enc))
+    return FALSE;
+
+  /* Check if H.264 is supported */
+  {
+    uint32_t i, num = 0;
+    GUID guids[16];
+
+    NvEncGetEncodeGUIDs (GST_NV_BASE_ENC (nvenc)->encoder, guids,
+        G_N_ELEMENTS (guids), &num);
+
+    for (i = 0; i < num; ++i) {
+      if (gst_nvenc_cmp_guid (guids[i], NV_ENC_CODEC_H264_GUID))
+        break;
+    }
+    GST_INFO_OBJECT (enc, "H.264 encoding %ssupported", (i == num) ? "un" : "");
+    if (i == num) {
+      gst_nv_h264_enc_close (enc);
+      return FALSE;
+    }
+  }
+
+  /* query supported input formats */
+  if (!_get_supported_profiles (nvenc)) {
+    GST_WARNING_OBJECT (nvenc, "No supported encoding profiles");
+    gst_nv_h264_enc_close (enc);
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
+static gboolean
+gst_nv_h264_enc_close (GstVideoEncoder * enc)
+{
+  GstNvH264Enc *nvenc = GST_NV_H264_ENC (enc);
+
+  GST_OBJECT_LOCK (nvenc);
+  g_free (nvenc->supported_profiles);
+  nvenc->supported_profiles = NULL;
+  GST_OBJECT_UNLOCK (nvenc);
+
+  return GST_VIDEO_ENCODER_CLASS (gst_nv_h264_enc_parent_class)->close (enc);
+}
+
+static GValue *
+_get_interlace_modes (GstNvH264Enc * nvenc)
+{
+  NV_ENC_CAPS_PARAM caps_param = { 0, };
+  GValue *list = g_new0 (GValue, 1);
+  GValue val = G_VALUE_INIT;
+
+  g_value_init (list, GST_TYPE_LIST);
+  g_value_init (&val, G_TYPE_STRING);
+
+  g_value_set_static_string (&val, "progressive");
+  gst_value_list_append_value (list, &val);
+
+  caps_param.version = NV_ENC_CAPS_PARAM_VER;
+  caps_param.capsToQuery = NV_ENC_CAPS_SUPPORT_FIELD_ENCODING;
+
+  if (NvEncGetEncodeCaps (GST_NV_BASE_ENC (nvenc)->encoder,
+          NV_ENC_CODEC_H264_GUID, &caps_param,
+          &nvenc->interlace_modes) != NV_ENC_SUCCESS)
+    nvenc->interlace_modes = 0;
+
+  if (nvenc->interlace_modes >= 1) {
+    g_value_set_static_string (&val, "interleaved");
+    gst_value_list_append_value (list, &val);
+    g_value_set_static_string (&val, "mixed");
+    gst_value_list_append_value (list, &val);
+  }
+  /* TODO: figure out what nvenc frame based interlacing means in gst terms */
+
+  return list;
+}
+
+static GstCaps *
+gst_nv_h264_enc_getcaps (GstVideoEncoder * enc, GstCaps * filter)
+{
+  GstNvH264Enc *nvenc = GST_NV_H264_ENC (enc);
+  GstCaps *supported_incaps = NULL;
+  GstCaps *template_caps, *caps;
+  GValue *input_formats = GST_NV_BASE_ENC (enc)->input_formats;
+
+  GST_OBJECT_LOCK (nvenc);
+
+  if (input_formats != NULL) {
+    GValue *val;
+
+    template_caps = gst_pad_get_pad_template_caps (enc->sinkpad);
+    supported_incaps = gst_caps_copy (template_caps);
+    gst_caps_set_value (supported_incaps, "format", input_formats);
+
+    val = _get_interlace_modes (nvenc);
+    gst_caps_set_value (supported_incaps, "interlace-mode", val);
+    g_free (val);
+
+    GST_LOG_OBJECT (enc, "codec input caps %" GST_PTR_FORMAT, supported_incaps);
+    GST_LOG_OBJECT (enc, "   template caps %" GST_PTR_FORMAT, template_caps);
+    caps = gst_caps_intersect (template_caps, supported_incaps);
+    gst_caps_unref (template_caps);
+    gst_caps_unref (supported_incaps);
+    supported_incaps = caps;
+    GST_LOG_OBJECT (enc, "  supported caps %" GST_PTR_FORMAT, supported_incaps);
+  }
+
+  GST_OBJECT_UNLOCK (nvenc);
+
+  caps = gst_video_encoder_proxy_getcaps (enc, supported_incaps, filter);
+
+  if (supported_incaps)
+    gst_caps_unref (supported_incaps);
+
+  GST_DEBUG_OBJECT (nvenc, "  returning caps %" GST_PTR_FORMAT, caps);
+
+  return caps;
+}
+
+static gboolean
+gst_nv_h264_enc_set_profile_and_level (GstNvH264Enc * nvenc, GstCaps * caps)
+{
+#define N_BYTES_SPS 128
+  guint8 sps[N_BYTES_SPS];
+  NV_ENC_SEQUENCE_PARAM_PAYLOAD spp = { 0, };
+  GstStructure *s;
+  const gchar *profile;
+  GstCaps *allowed_caps;
+  GstStructure *s2;
+  const gchar *allowed_profile;
+  NVENCSTATUS nv_ret;
+  guint32 seq_size;
+
+  spp.version = NV_ENC_SEQUENCE_PARAM_PAYLOAD_VER;
+  spp.inBufferSize = N_BYTES_SPS;
+  spp.spsId = 0;
+  spp.ppsId = 0;
+  spp.spsppsBuffer = &sps;
+  spp.outSPSPPSPayloadSize = &seq_size;
+  nv_ret = NvEncGetSequenceParams (GST_NV_BASE_ENC (nvenc)->encoder, &spp);
+  if (nv_ret != NV_ENC_SUCCESS) {
+    GST_ELEMENT_ERROR (nvenc, STREAM, ENCODE, ("Encode header failed."),
+        ("NvEncGetSequenceParams return code=%d", nv_ret));
+    return FALSE;
+  }
+
+  if (seq_size < 8) {
+    GST_ELEMENT_ERROR (nvenc, STREAM, ENCODE, ("Encode header failed."),
+        ("NvEncGetSequenceParams returned incomplete data"));
+    return FALSE;
+  }
+
+  /* skip nal header and identifier */
+  gst_codec_utils_h264_caps_set_level_and_profile (caps, &sps[5], 3);
+
+  /* Constrained baseline is a strict subset of baseline. If downstream
+   * wanted baseline and we produced constrained baseline, we can just
+   * set the profile to baseline in the caps to make negotiation happy.
+   * Same goes for baseline as subset of main profile and main as a subset
+   * of high profile.
+   */
+  s = gst_caps_get_structure (caps, 0);
+  profile = gst_structure_get_string (s, "profile");
+
+  allowed_caps = gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (nvenc));
+
+  if (allowed_caps == NULL)
+    goto no_peer;
+
+  if (!gst_caps_can_intersect (allowed_caps, caps)) {
+    allowed_caps = gst_caps_make_writable (allowed_caps);
+    allowed_caps = gst_caps_truncate (allowed_caps);
+    s2 = gst_caps_get_structure (allowed_caps, 0);
+    gst_structure_fixate_field_string (s2, "profile", profile);
+    allowed_profile = gst_structure_get_string (s2, "profile");
+    if (!strcmp (allowed_profile, "high")) {
+      if (!strcmp (profile, "constrained-baseline")
+          || !strcmp (profile, "baseline") || !strcmp (profile, "main")) {
+        gst_structure_set (s, "profile", G_TYPE_STRING, "high", NULL);
+        GST_INFO_OBJECT (nvenc, "downstream requested high profile, but "
+            "encoder will now output %s profile (which is a subset), due "
+            "to how it's been configured", profile);
+      }
+    } else if (!strcmp (allowed_profile, "main")) {
+      if (!strcmp (profile, "constrained-baseline")
+          || !strcmp (profile, "baseline")) {
+        gst_structure_set (s, "profile", G_TYPE_STRING, "main", NULL);
+        GST_INFO_OBJECT (nvenc, "downstream requested main profile, but "
+            "encoder will now output %s profile (which is a subset), due "
+            "to how it's been configured", profile);
+      }
+    } else if (!strcmp (allowed_profile, "baseline")) {
+      if (!strcmp (profile, "constrained-baseline"))
+        gst_structure_set (s, "profile", G_TYPE_STRING, "baseline", NULL);
+    }
+  }
+  gst_caps_unref (allowed_caps);
+
+no_peer:
+
+  return TRUE;
+
+#undef N_BYTES_SPS
+}
+
+static gboolean
+gst_nv_h264_enc_set_src_caps (GstNvBaseEnc * nvenc, GstVideoCodecState * state)
+{
+  GstNvH264Enc *h264enc = GST_NV_H264_ENC (nvenc);
+  GstVideoCodecState *out_state;
+  GstStructure *s;
+  GstCaps *out_caps;
+
+  out_caps = gst_caps_new_empty_simple ("video/x-h264");
+  s = gst_caps_get_structure (out_caps, 0);
+
+  /* TODO: add support for avc format as well */
+  gst_structure_set (s, "stream-format", G_TYPE_STRING, "byte-stream",
+      "alignment", G_TYPE_STRING, "au", NULL);
+
+  if (!gst_nv_h264_enc_set_profile_and_level (h264enc, out_caps)) {
+    gst_caps_unref (out_caps);
+    return FALSE;
+  }
+
+  out_state = gst_video_encoder_set_output_state (GST_VIDEO_ENCODER (nvenc),
+      out_caps, state);
+
+  GST_INFO_OBJECT (nvenc, "output caps: %" GST_PTR_FORMAT, out_state->caps);
+
+  /* encoder will keep it around for us */
+  gst_video_codec_state_unref (out_state);
+
+  /* TODO: would be nice to also send some tags with the codec name */
+  return TRUE;
+}
+
+static gboolean
+gst_nv_h264_enc_initialize_encoder (GstNvBaseEnc * nvenc,
+    GstVideoCodecState * old_state, GstVideoCodecState * state)
+{
+  GstNvH264Enc *h264enc = GST_NV_H264_ENC (nvenc);
+  NV_ENC_RECONFIGURE_PARAMS reconfigure_params = { 0, };
+  NV_ENC_INITIALIZE_PARAMS init_params = { 0, };
+  NV_ENC_INITIALIZE_PARAMS *params;
+  NV_ENC_PRESET_CONFIG preset_config = { 0, };
+  NVENCSTATUS nv_ret;
+  GstVideoInfo *info = &state->info;
+  GstCaps *allowed_caps, *template_caps;
+  GUID selected_profile = NV_ENC_CODEC_PROFILE_AUTOSELECT_GUID;
+  int level_idc = NV_ENC_LEVEL_AUTOSELECT;
+
+  /* TODO: support reconfiguration */
+  if (old_state) {
+    reconfigure_params.version = NV_ENC_RECONFIGURE_PARAMS_VER;
+    params = &reconfigure_params.reInitEncodeParams;
+  } else {
+    params = &init_params;
+  }
+
+  template_caps = gst_static_pad_template_get_caps (&src_factory);
+  allowed_caps = gst_pad_get_allowed_caps (GST_VIDEO_ENCODER_SRC_PAD (h264enc));
+
+  if (template_caps == allowed_caps) {
+    GST_INFO_OBJECT (h264enc, "downstream has ANY caps");
+  } else if (allowed_caps) {
+    GstStructure *s;
+    const gchar *profile;
+    const gchar *level;
+
+    if (gst_caps_is_empty (allowed_caps)) {
+      gst_caps_unref (allowed_caps);
+      gst_caps_unref (template_caps);
+      return FALSE;
+    }
+
+    allowed_caps = gst_caps_make_writable (allowed_caps);
+    allowed_caps = gst_caps_fixate (allowed_caps);
+    s = gst_caps_get_structure (allowed_caps, 0);
+
+    profile = gst_structure_get_string (s, "profile");
+    if (profile) {
+      if (!strcmp (profile, "baseline")) {
+        selected_profile = NV_ENC_H264_PROFILE_BASELINE_GUID;
+      } else if (g_str_has_prefix (profile, "high-4:4:4")) {
+        selected_profile = NV_ENC_H264_PROFILE_HIGH_444_GUID;
+      } else if (g_str_has_prefix (profile, "high-10")) {
+        g_assert_not_reached ();
+      } else if (g_str_has_prefix (profile, "high-4:2:2")) {
+        g_assert_not_reached ();
+      } else if (g_str_has_prefix (profile, "high")) {
+        selected_profile = NV_ENC_H264_PROFILE_HIGH_GUID;
+      } else if (g_str_has_prefix (profile, "main")) {
+        selected_profile = NV_ENC_H264_PROFILE_MAIN_GUID;
+      } else {
+        g_assert_not_reached ();
+      }
+    }
+
+    level = gst_structure_get_string (s, "level");
+    if (level)
+      /* matches values stored in NV_ENC_LEVEL */
+      level_idc = gst_codec_utils_h264_get_level_idc (level);
+
+    gst_caps_unref (allowed_caps);
+  }
+  gst_caps_unref (template_caps);
+
+  params->version = NV_ENC_INITIALIZE_PARAMS_VER;
+  params->encodeGUID = NV_ENC_CODEC_H264_GUID;
+  params->encodeWidth = GST_VIDEO_INFO_WIDTH (info);
+  params->encodeHeight = GST_VIDEO_INFO_HEIGHT (info);
+  /* FIXME: make this a property */
+  params->presetGUID = NV_ENC_PRESET_HP_GUID;   // _DEFAULT
+  params->enablePTD = 1;
+  if (!old_state) {
+    /* this sets the required buffer size and the maximum allowed size on
+     * subsequent reconfigures */
+    /* FIXME: propertise this */
+    params->maxEncodeWidth = GST_VIDEO_INFO_WIDTH (info);
+    params->maxEncodeHeight = GST_VIDEO_INFO_HEIGHT (info);
+    gst_nv_base_enc_set_max_encode_size (GST_NV_BASE_ENC (h264enc),
+        params->maxEncodeWidth, params->maxEncodeHeight);
+  } else {
+    guint max_width, max_height;
+
+    gst_nv_base_enc_get_max_encode_size (GST_NV_BASE_ENC (h264enc),
+        &max_width, &max_height);
+
+    if (GST_VIDEO_INFO_WIDTH (info) > max_width
+        || GST_VIDEO_INFO_HEIGHT (info) > max_height) {
+      GST_ELEMENT_ERROR (h264enc, STREAM, FORMAT, ("%s", "Requested stream "
+              "size is larger than the maximum configured size"), (NULL));
+      return FALSE;
+    }
+  }
+
+  preset_config.version = NV_ENC_PRESET_CONFIG_VER;
+  preset_config.presetCfg.version = NV_ENC_CONFIG_VER;
+
+  nv_ret =
+      NvEncGetEncodePresetConfig (GST_NV_BASE_ENC (h264enc)->encoder,
+      params->encodeGUID, params->presetGUID, &preset_config);
+  if (nv_ret != NV_ENC_SUCCESS) {
+    GST_ELEMENT_ERROR (h264enc, LIBRARY, SETTINGS, (NULL),
+        ("Failed to get encode preset configuration: %d", nv_ret));
+    return FALSE;
+  }
+  params->encodeConfig = &preset_config.presetCfg;
+
+  /* override some defaults */
+  GST_LOG_OBJECT (h264enc, "setting parameters");
+  preset_config.presetCfg.version = NV_ENC_CONFIG_VER;
+  preset_config.presetCfg.profileGUID = selected_profile;
+  preset_config.presetCfg.encodeCodecConfig.h264Config.level = level_idc;
+  preset_config.presetCfg.encodeCodecConfig.h264Config.chromaFormatIDC = 1;
+  if (GST_VIDEO_INFO_FORMAT (info) == GST_VIDEO_FORMAT_Y444) {
+    GST_DEBUG_OBJECT (h264enc, "have Y444 input, setting config accordingly");
+    preset_config.presetCfg.encodeCodecConfig.
+        h264Config.separateColourPlaneFlag = 1;
+    preset_config.presetCfg.encodeCodecConfig.h264Config.chromaFormatIDC = 3;
+  }
+
+  /* FIXME: make property */
+  preset_config.presetCfg.encodeCodecConfig.h264Config.outputAUD = 1;
+
+  if (GST_VIDEO_INFO_IS_INTERLACED (info)) {
+    if (GST_VIDEO_INFO_INTERLACE_MODE (info) ==
+        GST_VIDEO_INTERLACE_MODE_INTERLEAVED
+        || GST_VIDEO_INFO_INTERLACE_MODE (info) ==
+        GST_VIDEO_INTERLACE_MODE_MIXED) {
+      preset_config.presetCfg.frameFieldMode =
+          NV_ENC_PARAMS_FRAME_FIELD_MODE_FIELD;
+    }
+  }
+
+  if (info->fps_d > 0 && info->fps_n > 0) {
+    params->frameRateNum = info->fps_n;
+    params->frameRateDen = info->fps_d;
+  } else {
+    GST_FIXME_OBJECT (h264enc, "variable framerate");
+  }
+
+  if (old_state) {
+    nv_ret =
+        NvEncReconfigureEncoder (GST_NV_BASE_ENC (h264enc)->encoder,
+        &reconfigure_params);
+  } else {
+    nv_ret =
+        NvEncInitializeEncoder (GST_NV_BASE_ENC (h264enc)->encoder, params);
+  }
+
+  if (nv_ret != NV_ENC_SUCCESS) {
+    GST_ELEMENT_ERROR (h264enc, LIBRARY, SETTINGS, (NULL),
+        ("Failed to %sinit encoder: %d", old_state ? "re" : "", nv_ret));
+    return FALSE;
+  }
+  GST_INFO_OBJECT (h264enc, "configured encoder");
+
+  return TRUE;
+}
+
+static gboolean
+gst_nv_h264_enc_set_pic_params (GstNvBaseEnc * enc, GstVideoCodecFrame * frame,
+    NV_ENC_PIC_PARAMS * pic_params)
+{
+  /* encode whole picture in one single slice */
+  pic_params->codecPicParams.h264PicParams.sliceMode = 0;
+  pic_params->codecPicParams.h264PicParams.sliceModeData = 0;
+
+  return TRUE;
+}
+
+static void
+gst_nv_h264_enc_set_property (GObject * object, guint prop_id,
+    const GValue * value, GParamSpec * pspec)
+{
+  switch (prop_id) {
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+gst_nv_h264_enc_get_property (GObject * object, guint prop_id, GValue * value,
+    GParamSpec * pspec)
+{
+  switch (prop_id) {
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
diff --git a/sys/nvenc/gstnvh264enc.h b/sys/nvenc/gstnvh264enc.h
new file mode 100644
index 0000000..8ed6574
--- /dev/null
+++ b/sys/nvenc/gstnvh264enc.h
@@ -0,0 +1,59 @@
+/* GStreamer NVENC plugin
+ * Copyright (C) 2015 Centricular Ltd
+ *
+ * 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_NV_H264_ENC_H_INCLUDED__
+#define __GST_NV_H264_ENC_H_INCLUDED__
+
+#include "gstnvbaseenc.h"
+
+#define GST_TYPE_NV_H264_ENC \
+  (gst_nv_h264_enc_get_type())
+#define GST_NV_H264_ENC(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_NV_H264_ENC,GstNvH264Enc))
+#define GST_NV_H264_ENC_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_NV_H264_ENC,GstNvH264EncClass))
+#define GST_NV_H264_ENC_GET_CLASS(obj) \
+  (G_TYPE_INSTANCE_GET_CLASS((obj),GST_TYPE_NV_H264_ENC,GstNvH264EncClass))
+#define GST_IS_NV_H264_ENC(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj),GST_TYPE_NV_H264_ENC))
+#define GST_IS_NV_H264_ENC_CLASS(obj) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass),GST_TYPE_NV_H264_ENC))
+
+typedef struct {
+  GstNvBaseEnc base_nvenc;
+
+  /* the supported input formats */
+  GValue        * supported_profiles;             /* OBJECT LOCK */
+
+  GstVideoCodecState *input_state;
+  gboolean            gl_input;
+
+  /* supported interlacing input modes.
+   * 0 = none, 1 = fields, 2 = interleaved */
+  gint            interlace_modes;
+} GstNvH264Enc;
+
+typedef struct {
+  GstNvBaseEncClass video_encoder_class;
+} GstNvH264EncClass;
+
+G_GNUC_INTERNAL
+GType gst_nv_h264_enc_get_type (void);
+
+#endif /* __GST_NV_H264_ENC_H_INCLUDED__ */
diff --git a/sys/opensles/Makefile.in b/sys/opensles/Makefile.in
index 04538b4..908b78e 100644
--- a/sys/opensles/Makefile.in
+++ b/sys/opensles/Makefile.in
@@ -277,6 +277,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -314,6 +316,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -341,6 +345,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -359,6 +365,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -369,6 +377,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -394,6 +404,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -419,6 +431,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -550,6 +564,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -607,8 +623,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -678,6 +698,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/opensles/openslessink.c b/sys/opensles/openslessink.c
index ce93d25..c2ec806 100644
--- a/sys/opensles/openslessink.c
+++ b/sys/opensles/openslessink.c
@@ -26,7 +26,7 @@
  * <refsect2>
  * <title>Example pipelines</title>
  * |[
- * gst-launch -v filesrc location=music.ogg ! oggdemux ! vorbisdec ! audioconvert ! audioresample ! opeslessink
+ * gst-launch-1.0 -v filesrc location=music.ogg ! oggdemux ! vorbisdec ! audioconvert ! audioresample ! opeslessink
  * ]| Play an Ogg/Vorbis file.
  * </refsect2>
  *
diff --git a/sys/opensles/openslessrc.c b/sys/opensles/openslessrc.c
index d0dfa32..6505ab1 100644
--- a/sys/opensles/openslessrc.c
+++ b/sys/opensles/openslessrc.c
@@ -26,7 +26,7 @@
  * <refsect2>
  * <title>Example pipelines</title>
  * |[
- * gst-launch -v openslessrc ! audioconvert ! vorbisenc ! oggmux ! filesink location=recorded.ogg
+ * gst-launch-1.0 -v openslessrc ! audioconvert ! vorbisenc ! oggmux ! filesink location=recorded.ogg
  * ]| Record from default audio input and encode to Ogg/Vorbis.
  * </refsect2>
  *
diff --git a/sys/pvr2d/Makefile.in b/sys/pvr2d/Makefile.in
index 4e8ae9f..110c966 100644
--- a/sys/pvr2d/Makefile.in
+++ b/sys/pvr2d/Makefile.in
@@ -278,6 +278,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -315,6 +317,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -342,6 +346,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -360,6 +366,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -370,6 +378,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -395,6 +405,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -420,6 +432,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -551,6 +565,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -608,8 +624,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -679,6 +699,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/pvr2d/gstpvrvideosink.c b/sys/pvr2d/gstpvrvideosink.c
index 6d117fb..7c10243 100644
--- a/sys/pvr2d/gstpvrvideosink.c
+++ b/sys/pvr2d/gstpvrvideosink.c
@@ -1316,11 +1316,8 @@
 {
   GST_DEBUG ("Freeing dcontext %p", dcontext);
 
-  if (dcontext->p_blt_info)
-    g_free (dcontext->p_blt_info);
-
-  if (dcontext->p_blt2d_info)
-    g_free (dcontext->p_blt2d_info);
+  g_free (dcontext->p_blt_info);
+  g_free (dcontext->p_blt2d_info);
 
   if (dcontext->x_lock)
     g_mutex_lock (dcontext->x_lock);
diff --git a/sys/shm/Makefile.in b/sys/shm/Makefile.in
index ed8651d..7824879 100644
--- a/sys/shm/Makefile.in
+++ b/sys/shm/Makefile.in
@@ -276,6 +276,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -313,6 +315,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -340,6 +344,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -358,6 +364,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -368,6 +376,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -393,6 +403,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -418,6 +430,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -549,6 +563,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -606,8 +622,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -677,6 +697,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/shm/gstshmsink.c b/sys/shm/gstshmsink.c
index bb700ca..784acca 100644
--- a/sys/shm/gstshmsink.c
+++ b/sys/shm/gstshmsink.c
@@ -26,7 +26,7 @@
  * <refsect2>
  * <title>Example launch lines</title>
  * |[
- * gst-launch -v videotestsrc !  shmsink socket-path=/tmp/blah shm-size=1000000
+ * gst-launch-1.0 -v videotestsrc !  shmsink socket-path=/tmp/blah shm-size=1000000
  * ]| Send video to shm buffers.
  * </refsect2>
  */
diff --git a/sys/shm/gstshmsrc.c b/sys/shm/gstshmsrc.c
index 1e69af7..3caf90b 100644
--- a/sys/shm/gstshmsrc.c
+++ b/sys/shm/gstshmsrc.c
@@ -26,9 +26,9 @@
  * <refsect2>
  * <title>Example launch lines</title>
  * |[
- * gst-launch shmsrc socket-path=/tmp/blah ! \
- * "video/x-raw-yuv, format=(fourcc)YUY2, color-matrix=(string)sdtv, \
- * chroma-site=(string)mpeg2, width=(int)320, height=(int)240, framerate=(fraction)30/1" ! autovideosink
+ * gst-launch-1.0 shmsrc socket-path=/tmp/blah ! \
+ * "video/x-yuv, format=YUY2, color-matrix=sdtv, \
+ * chroma-site=mpeg2, width=(int)320, height=(int)240, framerate=(fraction)30/1" ! autovideosink
  * ]| Render video from shm buffers.
  * </refsect2>
  */
diff --git a/sys/uvch264/Makefile.in b/sys/uvch264/Makefile.in
index 973da00..999ae6e 100644
--- a/sys/uvch264/Makefile.in
+++ b/sys/uvch264/Makefile.in
@@ -279,6 +279,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -316,6 +318,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -343,6 +347,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -361,6 +367,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -371,6 +379,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -396,6 +406,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -421,6 +433,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -552,6 +566,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -609,8 +625,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -680,6 +700,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/uvch264/gstuvch264_mjpgdemux.c b/sys/uvch264/gstuvch264_mjpgdemux.c
index 99734ad..1f9b1c4 100644
--- a/sys/uvch264/gstuvch264_mjpgdemux.c
+++ b/sys/uvch264/gstuvch264_mjpgdemux.c
@@ -296,8 +296,7 @@
   if (self->priv->nv12_caps)
     gst_caps_unref (self->priv->nv12_caps);
   self->priv->nv12_caps = NULL;
-  if (self->priv->clock_samples)
-    g_free (self->priv->clock_samples);
+  g_free (self->priv->clock_samples);
   self->priv->clock_samples = NULL;
 
   G_OBJECT_CLASS (parent_class)->dispose (object);
diff --git a/sys/vcd/Makefile.in b/sys/vcd/Makefile.in
index eacf382..229a5b3 100644
--- a/sys/vcd/Makefile.in
+++ b/sys/vcd/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/vdpau/Makefile.in b/sys/vdpau/Makefile.in
index 999ba9a..2204dc6 100644
--- a/sys/vdpau/Makefile.in
+++ b/sys/vdpau/Makefile.in
@@ -282,6 +282,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -319,6 +321,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -346,6 +350,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -364,6 +370,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -374,6 +382,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -399,6 +409,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -424,6 +436,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -555,6 +569,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -612,8 +628,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -683,6 +703,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/vdpau/gstvdpvideomemory.c b/sys/vdpau/gstvdpvideomemory.c
index 8d0fa51..8217653 100644
--- a/sys/vdpau/gstvdpvideomemory.c
+++ b/sys/vdpau/gstvdpvideomemory.c
@@ -222,8 +222,7 @@
 
   gst_object_unref (vmem->device);
 
-  if (vmem->cache)
-    g_free (vmem->cache);
+  g_free (vmem->cache);
 
   g_slice_free (GstVdpVideoMemory, vmem);
 }
diff --git a/sys/vdpau/mpeg/gstvdpmpegdec.c b/sys/vdpau/mpeg/gstvdpmpegdec.c
index efa836d..e6f6f95 100644
--- a/sys/vdpau/mpeg/gstvdpmpegdec.c
+++ b/sys/vdpau/mpeg/gstvdpmpegdec.c
@@ -26,7 +26,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v -m fakesrc ! vdpaumpegdec ! fakesink silent=TRUE
+ * gst-launch-1.0 -v -m fakesrc ! vdpaumpegdec ! fakesink silent=TRUE
  * ]|
  * </refsect2>
  */
diff --git a/sys/wasapi/Makefile.in b/sys/wasapi/Makefile.in
index 160a92b..fbb6325 100644
--- a/sys/wasapi/Makefile.in
+++ b/sys/wasapi/Makefile.in
@@ -278,6 +278,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -315,6 +317,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -342,6 +346,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -360,6 +366,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -370,6 +378,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -395,6 +405,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -420,6 +432,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -551,6 +565,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -608,8 +624,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -679,6 +699,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/wininet/Makefile.in b/sys/wininet/Makefile.in
index 54f4253..655c690 100644
--- a/sys/wininet/Makefile.in
+++ b/sys/wininet/Makefile.in
@@ -274,6 +274,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +313,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +342,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +362,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +374,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +401,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +428,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +561,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +620,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +695,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/winks/Makefile.in b/sys/winks/Makefile.in
index e87db5d..3ff4a9b 100644
--- a/sys/winks/Makefile.in
+++ b/sys/winks/Makefile.in
@@ -279,6 +279,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -316,6 +318,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -343,6 +347,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -361,6 +367,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -371,6 +379,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -396,6 +406,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -421,6 +433,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -552,6 +566,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -609,8 +625,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -680,6 +700,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/winks/gstksvideosrc.c b/sys/winks/gstksvideosrc.c
index 07cdf8b..c2bad34 100644
--- a/sys/winks/gstksvideosrc.c
+++ b/sys/winks/gstksvideosrc.c
@@ -26,11 +26,11 @@
  * <refsect2>
  * <title>Example pipelines</title>
  * |[
- * gst-launch -v ksvideosrc do-stats=TRUE ! ffmpegcolorspace ! dshowvideosink
+ * gst-launch-1.0 -v ksvideosrc do-stats=TRUE ! videoconvert ! dshowvideosink
  * ]| Capture from a camera and render using dshowvideosink.
  * |[
- * gst-launch -v ksvideosrc do-stats=TRUE ! image/jpeg, width=640, height=480
- * ! jpegdec ! ffmpegcolorspace ! dshowvideosink
+ * gst-launch-1.0 -v ksvideosrc do-stats=TRUE ! image/jpeg, width=640, height=480
+ * ! jpegdec ! videoconvert ! dshowvideosink
  * ]| Capture from an MJPEG camera and render using dshowvideosink.
  * </refsect2>
  */
@@ -98,8 +98,6 @@
   GstKsClock *ksclock;
   GstKsVideoDevice *device;
 
-  guint64 offset;
-  GstClockTime prev_ts;
   gboolean running;
 
   /* Worker thread */
@@ -343,10 +341,6 @@
   priv->count = 0;
   priv->fps = -1;
 
-  /* Reset timestamping state */
-  priv->offset = 0;
-  priv->prev_ts = GST_CLOCK_TIME_NONE;
-
   priv->running = FALSE;
 }
 
@@ -813,12 +807,11 @@
   GstKsVideoSrcPrivate *priv = GST_KS_VIDEO_SRC_GET_PRIVATE (self);
   GstClockTime duration;
   GstClock *clock;
-  GstClockTime timestamp;
+  GstClockTime timestamp, base_time;
 
   /* Don't timestamp muxed streams */
   if (gst_ks_video_device_stream_is_muxed (priv->device)) {
     duration = timestamp = GST_CLOCK_TIME_NONE;
-    priv->offset++;
     goto timestamp;
   }
 
@@ -828,88 +821,25 @@
   clock = GST_ELEMENT_CLOCK (self);
   if (clock != NULL) {
     gst_object_ref (clock);
-    timestamp = GST_ELEMENT (self)->base_time;
-
-    if (GST_CLOCK_TIME_IS_VALID (presentation_time)) {
-      if (presentation_time > GST_ELEMENT (self)->base_time)
-        presentation_time -= GST_ELEMENT (self)->base_time;
-      else
-        presentation_time = 0;
-    }
+    base_time = GST_ELEMENT (self)->base_time;
   } else {
     timestamp = GST_CLOCK_TIME_NONE;
   }
   GST_OBJECT_UNLOCK (self);
 
   if (clock != NULL) {
-
     /* The time according to the current clock */
-    timestamp = gst_clock_get_time (clock) - timestamp;
+    timestamp = gst_clock_get_time (clock) - base_time;
     if (timestamp > duration)
       timestamp -= duration;
     else
       timestamp = 0;
 
-    if (GST_CLOCK_TIME_IS_VALID (presentation_time)) {
-      /*
-       * We don't use this for anything yet, need to ponder how to deal
-       * with pins that use an internal clock and timestamp from 0.
-       */
-      GstClockTimeDiff diff = GST_CLOCK_DIFF (presentation_time, timestamp);
-      GST_DEBUG_OBJECT (self, "diff between gst and driver timestamp: %"
-          G_GINT64_FORMAT, diff);
-    }
-
     gst_object_unref (clock);
     clock = NULL;
-
-    /* Unless it's the first frame, align the current timestamp on a multiple
-     * of duration since the previous */
-    if (GST_CLOCK_TIME_IS_VALID (priv->prev_ts)) {
-      GstClockTime delta;
-      guint delta_remainder, delta_offset;
-
-      /* REVISIT: I've seen this happen with the GstSystemClock on Windows,
-       *          scary... */
-      if (timestamp < priv->prev_ts) {
-        GST_INFO_OBJECT (self, "clock is ticking backwards");
-        return FALSE;
-      }
-
-      /* Round to a duration boundary */
-      delta = timestamp - priv->prev_ts;
-      delta_remainder = delta % duration;
-
-      if (delta_remainder < duration / 3)
-        timestamp -= delta_remainder;
-      else
-        timestamp += duration - delta_remainder;
-
-      /* How many frames are we off then? */
-      delta = timestamp - priv->prev_ts;
-      delta_offset = delta / duration;
-
-      if (delta_offset == 1)    /* perfect */
-        GST_BUFFER_FLAG_UNSET (buf, GST_BUFFER_FLAG_DISCONT);
-      else if (delta_offset > 1) {
-        guint lost = delta_offset - 1;
-        GST_INFO_OBJECT (self, "lost %d frame%s, setting discont flag",
-            lost, (lost > 1) ? "s" : "");
-        GST_BUFFER_FLAG_SET (buf, GST_BUFFER_FLAG_DISCONT);
-      } else if (delta_offset == 0) {   /* overproduction, skip this frame */
-        GST_INFO_OBJECT (self, "skipping frame");
-        return FALSE;
-      }
-
-      priv->offset += delta_offset;
-    }
-
-    priv->prev_ts = timestamp;
   }
 
 timestamp:
-  GST_BUFFER_OFFSET (buf) = priv->offset;
-  GST_BUFFER_OFFSET_END (buf) = GST_BUFFER_OFFSET (buf) + 1;
   GST_BUFFER_PTS (buf) = timestamp;
   GST_BUFFER_DTS (buf) = GST_CLOCK_TIME_NONE;
   GST_BUFFER_DURATION (buf) = duration;
diff --git a/sys/winscreencap/Makefile.in b/sys/winscreencap/Makefile.in
index d79bfdd..126a337 100644
--- a/sys/winscreencap/Makefile.in
+++ b/sys/winscreencap/Makefile.in
@@ -278,6 +278,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -315,6 +317,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -342,6 +346,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -360,6 +366,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -370,6 +378,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -395,6 +405,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -420,6 +432,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -551,6 +565,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -608,8 +624,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -679,6 +699,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/sys/winscreencap/gstdx9screencapsrc.c b/sys/winscreencap/gstdx9screencapsrc.c
index 9a856e0..0f889b2 100644
--- a/sys/winscreencap/gstdx9screencapsrc.c
+++ b/sys/winscreencap/gstdx9screencapsrc.c
@@ -30,11 +30,11 @@
  * <refsect2>
  * <title>Example pipelines</title>
  * |[
- * gst-launch dx9screencapsrc ! ffmpegcolorspace ! dshowvideosink
+ * gst-launch-1.0 dx9screencapsrc ! videoconvert ! dshowvideosink
  * ]| Capture the desktop and display it.
  * |[
- * gst-launch dx9screencapsrc x=100 y=100 width=320 height=240 !
- * ffmpegcolorspace ! dshowvideosink
+ * gst-launch-1.0 dx9screencapsrc x=100 y=100 width=320 height=240 !
+ * videoconvert ! dshowvideosink
  * ]| Capture a portion of the desktop and display it.
  * </refsect2>
  */
diff --git a/sys/winscreencap/gstgdiscreencapsrc.c b/sys/winscreencap/gstgdiscreencapsrc.c
index 92d9ec2..55bd4b5 100644
--- a/sys/winscreencap/gstgdiscreencapsrc.c
+++ b/sys/winscreencap/gstgdiscreencapsrc.c
@@ -32,11 +32,11 @@
  * <refsect2>
  * <title>Example pipelines</title>
  * |[
- * gst-launch gdiscreencapsrc ! ffmpegcolorspace ! dshowvideosink
+ * gst-launch-1.0 gdiscreencapsrc ! videoconvert ! dshowvideosink
  * ]| Capture the desktop and display it.
  * |[
- * gst-launch gdiscreencapsrc x=100 y=100 width=320 height=240 cursor=TRUE
- * ! ffmpegcolorspace ! dshowvideosink
+ * gst-launch-1.0 gdiscreencapsrc x=100 y=100 width=320 height=240 cursor=TRUE
+ * ! videoconvert ! dshowvideosink
  * ]| Capture a portion of the desktop, including the mouse cursor, and
  * display it.
  * </refsect2>
diff --git a/tests/Makefile.in b/tests/Makefile.in
index 211626c..1353a65 100644
--- a/tests/Makefile.in
+++ b/tests/Makefile.in
@@ -247,6 +247,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -284,6 +286,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -311,6 +315,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -329,6 +335,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -339,6 +347,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -364,6 +374,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -389,6 +401,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -520,6 +534,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -577,8 +593,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -648,6 +668,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/check/Makefile.am b/tests/check/Makefile.am
index fbce4d7..1701aa0 100644
--- a/tests/check/Makefile.am
+++ b/tests/check/Makefile.am
@@ -42,8 +42,10 @@
 
 if USE_DASH
 check_dash = elements/dash_mpd
+check_dash_demux = elements/dash_demux
 else
 check_dash =
+check_dash_demux =
 endif
 
 if USE_FAAC
@@ -167,11 +169,19 @@
 endif
 
 if USE_HLS
-check_hlsdemux = elements/hlsdemux_m3u8
+check_hlsdemux_m3u8 = elements/hlsdemux_m3u8
+check_hls_demux = elements/hls_demux
 else
+check_hlsdemux_m3u8 =
 check_hlsdemux =
 endif
 
+if WITH_GST_PLAYER_TESTS
+check_player = libs/player
+else
+check_player =
+endif
+
 if USE_CURL
 check_curl = elements/curlhttpsink \
 	elements/curlfilesink \
@@ -205,6 +215,7 @@
     libs/gstglmemory \
     libs/gstglupload \
     libs/gstglcolorconvert \
+    libs/gstglsl \
     elements/glimagesink
 else
 check_gl=
@@ -229,6 +240,7 @@
 	generic/states \
 	$(check_assrender) \
 	$(check_dash) \
+	$(check_dash_demux) \
 	$(check_faac)  \
 	$(check_faad)  \
 	$(check_voaacenc) \
@@ -243,12 +255,12 @@
 	$(check_curl) \
 	$(check_shm) \
 	elements/aiffparse \
+	elements/videoframe-audiolevel \
 	elements/autoconvert \
 	elements/autovideoconvert \
 	elements/audiointerleave \
 	elements/audiomixer \
 	elements/asfmux \
-	elements/baseaudiovisualizer \
 	elements/camerabin \
 	elements/dataurisrc \
 	elements/gdppay \
@@ -265,7 +277,8 @@
 	elements/mxfdemux \
 	elements/mxfmux \
 	elements/pcapparse \
-	elements/rtponvif \
+	elements/rtponvifparse \
+	elements/rtponviftimestamp \
 	elements/id3mux \
 	pipelines/mxf \
 	$(check_mimic) \
@@ -283,7 +296,9 @@
 	$(check_orc) \
 	libs/insertbin \
 	$(check_gl) \
+	$(check_hlsdemux_m3u8) \
 	$(check_hlsdemux) \
+	$(check_player) \
 	$(EXPERIMENTAL_CHECKS)
 
 noinst_HEADERS = elements/mxfdemux.h
@@ -369,6 +384,13 @@
 	$(GST_PLUGINS_BAD_LIBS) -lgstcodecparsers-@GST_API_VERSION@ \
 	$(GST_BASE_LIBS) $(GST_LIBS) $(LDADD)
 
+elements_videoframe_audiolevel_CFLAGS = \
+	$(GST_PLUGINS_BASE_CFLAGS) \
+	$(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
+elements_videoframe_audiolevel_LDADD = \
+	$(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD) \
+	-lgstaudio-@GST_API_VERSION@
+
 elements_faad_CFLAGS = \
 	$(GST_PLUGINS_BASE_CFLAGS) \
 	$(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
@@ -398,15 +420,6 @@
 	$(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD) \
 	-lgstaudio-@GST_API_VERSION@
 
-elements_baseaudiovisualizer_SOURCES = elements/baseaudiovisualizer.c
-elements_baseaudiovisualizer_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) \
-	$(GST_PLUGINS_BASE_CFLAGS) \
-	$(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
-elements_baseaudiovisualizer_LDADD = \
-	$(GST_PLUGINS_BASE_LIBS) -lgstaudio-@GST_API_VERSION@  \
-	-lgstvideo-@GST_API_VERSION@ 	$(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) \
-	$(GST_LIBS) $(LDADD)
-
 elements_camerabin_CFLAGS = \
 	$(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
 	$(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS) -DGST_USE_UNSTABLE_API
@@ -446,6 +459,15 @@
 	$(top_builddir)/gst-libs/gst/uridownloader/libgsturidownloader-@GST_API_VERSION@.la
 elements_dash_mpd_SOURCES = elements/dash_mpd.c
 
+elements_dash_demux_CFLAGS = $(AM_CFLAGS) $(LIBXML2_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_PLUGINS_BAD_CFLAGS)
+elements_dash_demux_LDADD = \
+	$(LDADD) $(LIBXML2_LIBS) $(GST_BASE_LIBS) \
+	-lgsttag-$(GST_API_VERSION) \
+	-lgstapp-$(GST_API_VERSION) \
+	$(top_builddir)/gst-libs/gst/adaptivedemux/libgstadaptivedemux-@GST_API_VERSION@.la
+
+elements_dash_demux_SOURCES = elements/test_http_src.c elements/test_http_src.h elements/adaptive_demux_engine.c elements/adaptive_demux_engine.h elements/adaptive_demux_common.c elements/adaptive_demux_common.h elements/dash_demux.c
+
 pipelines_streamheader_CFLAGS = $(GIO_CFLAGS) $(AM_CFLAGS)
 pipelines_streamheader_LDADD = $(GIO_LIBS) $(LDADD)
 
@@ -455,8 +477,41 @@
 libs_insertbin_CFLAGS = \
 	$(GST_PLUGINS_BAD_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
 
-elements_rtponvif_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS)
-elements_rtponvif_LDADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) -lgstrtp-$(GST_API_VERSION) $(LDADD)
+libs_player_SOURCES = libs/player.c
+
+libs_player_LDADD = \
+	$(top_builddir)/gst-libs/gst/player/libgstplayer-@GST_API_VERSION@.la \
+	$(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD)
+libs_player_CFLAGS = \
+	$(GST_PLUGINS_BAD_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS) \
+	-DTEST_PATH=\"$(builddir)/media\"
+
+if WITH_GST_PLAYER_TESTS
+PLAYER_MEDIA_FILES = \
+	media/audio.ogg \
+	media/audio-video.ogg \
+	media/audio-short.ogg \
+	media/audio-video-short.ogg \
+	media/sintel.mkv \
+	media/test_sub.srt
+
+$(PLAYER_MEDIA_FILES):
+	$(MKDIR_P) media
+	$(WGET) -c http://gstreamer.freedesktop.org/data/media/small/$(subst media/,,$@) -O media/$(subst media/,,$@)
+
+libs/player_dummy.c: $(PLAYER_MEDIA_FILES)
+	touch libs/player_dummy.c
+
+nodist_libs_player_SOURCES = libs/player_dummy.c
+
+CLEANFILES += $(PLAYER_MEDIA_FILES) libs/player_dummy.c
+endif
+
+elements_rtponvifparse_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+elements_rtponvifparse_LDADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) -lgstrtp-$(GST_API_VERSION) $(LDADD)
+
+elements_rtponviftimestamp_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+elements_rtponviftimestamp_LDADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) -lgstrtp-$(GST_API_VERSION) $(LDADD)
 
 EXTRA_DIST = gst-plugins-bad.supp $(uvch264_dist_data)
 
@@ -515,6 +570,15 @@
 	$(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) \
 	$(GST_BASE_LIBS) $(GST_LIBS) $(LDADD)
 
+libs_gstglsl_LDADD = \
+	$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
+	$(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD)
+
+libs_gstglsl_CFLAGS = \
+	$(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
+	-DGST_USE_UNSTABLE_API \
+	$(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
+
 elements_glimagesink_CFLAGS = \
 	$(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
 	-DGST_USE_UNSTABLE_API \
@@ -546,6 +610,13 @@
 elements_hlsdemux_m3u8_LDADD = $(GST_BASE_LIBS) $(LDADD)
 elements_hlsdemux_m3u8_SOURCES = elements/hlsdemux_m3u8.c
 
+elements_hls_demux_CFLAGS = $(GST_BASE_CFLAGS) $(AM_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_PLUGINS_BAD_CFLAGS)
+elements_hls_demux_LDADD = $(GST_BASE_LIBS) $(LDADD) \
+	-lgsttag-$(GST_API_VERSION) \
+	-lgstapp-$(GST_API_VERSION) \
+	$(top_builddir)/gst-libs/gst/adaptivedemux/libgstadaptivedemux-@GST_API_VERSION@.la
+elements_hls_demux_SOURCES = elements/test_http_src.c elements/test_http_src.h elements/adaptive_demux_engine.c elements/adaptive_demux_engine.h elements/adaptive_demux_common.c elements/adaptive_demux_common.h elements/hls_demux.c
+
 orc_compositor_CFLAGS = $(ORC_CFLAGS)
 orc_compositor_LDADD = $(ORC_LIBS) -lorc-test-0.4
 nodist_orc_compositor_SOURCES = orc/compositor.c
diff --git a/tests/check/Makefile.in b/tests/check/Makefile.in
index c20cbb0..365db84 100644
--- a/tests/check/Makefile.in
+++ b/tests/check/Makefile.in
@@ -91,34 +91,37 @@
 build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
-noinst_PROGRAMS = pipelines/streamheader$(EXEEXT) $(am__EXEEXT_27)
+noinst_PROGRAMS = pipelines/streamheader$(EXEEXT) $(am__EXEEXT_30)
 check_PROGRAMS = generic/states$(EXEEXT) $(am__EXEEXT_1) \
 	$(am__EXEEXT_2) $(am__EXEEXT_3) $(am__EXEEXT_4) \
 	$(am__EXEEXT_5) $(am__EXEEXT_6) $(am__EXEEXT_7) \
 	$(am__EXEEXT_8) $(am__EXEEXT_9) $(am__EXEEXT_10) \
 	$(am__EXEEXT_11) $(am__EXEEXT_12) $(am__EXEEXT_13) \
-	$(am__EXEEXT_15) $(am__EXEEXT_16) elements/aiffparse$(EXEEXT) \
+	$(am__EXEEXT_14) $(am__EXEEXT_16) $(am__EXEEXT_17) \
+	elements/aiffparse$(EXEEXT) \
+	elements/videoframe-audiolevel$(EXEEXT) \
 	elements/autoconvert$(EXEEXT) \
 	elements/autovideoconvert$(EXEEXT) \
 	elements/audiointerleave$(EXEEXT) elements/audiomixer$(EXEEXT) \
-	elements/asfmux$(EXEEXT) elements/baseaudiovisualizer$(EXEEXT) \
-	elements/camerabin$(EXEEXT) elements/dataurisrc$(EXEEXT) \
-	elements/gdppay$(EXEEXT) elements/gdpdepay$(EXEEXT) \
-	elements/compositor$(EXEEXT) $(am__EXEEXT_17) \
-	elements/jpegparse$(EXEEXT) elements/h263parse$(EXEEXT) \
-	elements/h264parse$(EXEEXT) elements/mpegtsmux$(EXEEXT) \
-	elements/mpegvideoparse$(EXEEXT) \
-	elements/mpeg4videoparse$(EXEEXT) $(am__EXEEXT_18) \
+	elements/asfmux$(EXEEXT) elements/camerabin$(EXEEXT) \
+	elements/dataurisrc$(EXEEXT) elements/gdppay$(EXEEXT) \
+	elements/gdpdepay$(EXEEXT) elements/compositor$(EXEEXT) \
+	$(am__EXEEXT_18) elements/jpegparse$(EXEEXT) \
+	elements/h263parse$(EXEEXT) elements/h264parse$(EXEEXT) \
+	elements/mpegtsmux$(EXEEXT) elements/mpegvideoparse$(EXEEXT) \
+	elements/mpeg4videoparse$(EXEEXT) $(am__EXEEXT_19) \
 	elements/mxfdemux$(EXEEXT) elements/mxfmux$(EXEEXT) \
-	elements/pcapparse$(EXEEXT) elements/rtponvif$(EXEEXT) \
-	elements/id3mux$(EXEEXT) pipelines/mxf$(EXEEXT) \
-	$(am__EXEEXT_19) libs/mpegvideoparser$(EXEEXT) \
-	libs/mpegts$(EXEEXT) libs/h264parser$(EXEEXT) \
-	libs/vp8parser$(EXEEXT) libs/aggregator$(EXEEXT) \
-	$(am__EXEEXT_20) libs/vc1parser$(EXEEXT) $(am__EXEEXT_21) \
-	$(am__EXEEXT_22) elements/viewfinderbin$(EXEEXT) \
-	$(am__EXEEXT_23) $(am__EXEEXT_24) libs/insertbin$(EXEEXT) \
-	$(am__EXEEXT_25) $(am__EXEEXT_26)
+	elements/pcapparse$(EXEEXT) elements/rtponvifparse$(EXEEXT) \
+	elements/rtponviftimestamp$(EXEEXT) elements/id3mux$(EXEEXT) \
+	pipelines/mxf$(EXEEXT) $(am__EXEEXT_20) \
+	libs/mpegvideoparser$(EXEEXT) libs/mpegts$(EXEEXT) \
+	libs/h264parser$(EXEEXT) libs/vp8parser$(EXEEXT) \
+	libs/aggregator$(EXEEXT) $(am__EXEEXT_21) \
+	libs/vc1parser$(EXEEXT) $(am__EXEEXT_22) $(am__EXEEXT_23) \
+	elements/viewfinderbin$(EXEEXT) $(am__EXEEXT_24) \
+	$(am__EXEEXT_25) libs/insertbin$(EXEEXT) $(am__EXEEXT_26) \
+	$(am__EXEEXT_27) $(am__EXEEXT_28) $(am__EXEEXT_29)
+@WITH_GST_PLAYER_TESTS_TRUE@am__append_1 = $(PLAYER_MEDIA_FILES) libs/player_dummy.c
 subdir = tests/check
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
@@ -177,39 +180,43 @@
 	$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 @USE_ASSRENDER_TRUE@am__EXEEXT_1 = elements/assrender$(EXEEXT)
 @USE_DASH_TRUE@am__EXEEXT_2 = elements/dash_mpd$(EXEEXT)
-@USE_FAAC_TRUE@am__EXEEXT_3 = elements/faac$(EXEEXT)
-@USE_FAAD_TRUE@am__EXEEXT_4 = elements/faad$(EXEEXT)
-@USE_VOAACENC_TRUE@am__EXEEXT_5 = elements/voaacenc$(EXEEXT)
-@USE_VOAMRWBENC_TRUE@am__EXEEXT_6 = elements/voamrwbenc$(EXEEXT)
-@USE_MPEG2ENC_TRUE@am__EXEEXT_7 = elements/mpeg2enc$(EXEEXT)
-@USE_MPLEX_TRUE@am__EXEEXT_8 = elements/mplex$(EXEEXT)
-@USE_OFA_TRUE@am__EXEEXT_9 = elements/ofa$(EXEEXT)
-@USE_TIMIDITY_TRUE@am__EXEEXT_10 = elements/timidity$(EXEEXT)
-@USE_KATE_TRUE@am__EXEEXT_11 = elements/kate$(EXEEXT)
-@USE_OPENCV_TRUE@am__EXEEXT_12 = elements/templatematch$(EXEEXT)
-@USE_OPUS_TRUE@am__EXEEXT_13 = elements/opus$(EXEEXT)
-@USE_SSH2_TRUE@am__EXEEXT_14 = elements/curlsftpsink$(EXEEXT)
-@USE_CURL_TRUE@am__EXEEXT_15 = elements/curlhttpsink$(EXEEXT) \
+@USE_DASH_TRUE@am__EXEEXT_3 = elements/dash_demux$(EXEEXT)
+@USE_FAAC_TRUE@am__EXEEXT_4 = elements/faac$(EXEEXT)
+@USE_FAAD_TRUE@am__EXEEXT_5 = elements/faad$(EXEEXT)
+@USE_VOAACENC_TRUE@am__EXEEXT_6 = elements/voaacenc$(EXEEXT)
+@USE_VOAMRWBENC_TRUE@am__EXEEXT_7 = elements/voamrwbenc$(EXEEXT)
+@USE_MPEG2ENC_TRUE@am__EXEEXT_8 = elements/mpeg2enc$(EXEEXT)
+@USE_MPLEX_TRUE@am__EXEEXT_9 = elements/mplex$(EXEEXT)
+@USE_OFA_TRUE@am__EXEEXT_10 = elements/ofa$(EXEEXT)
+@USE_TIMIDITY_TRUE@am__EXEEXT_11 = elements/timidity$(EXEEXT)
+@USE_KATE_TRUE@am__EXEEXT_12 = elements/kate$(EXEEXT)
+@USE_OPENCV_TRUE@am__EXEEXT_13 = elements/templatematch$(EXEEXT)
+@USE_OPUS_TRUE@am__EXEEXT_14 = elements/opus$(EXEEXT)
+@USE_SSH2_TRUE@am__EXEEXT_15 = elements/curlsftpsink$(EXEEXT)
+@USE_CURL_TRUE@am__EXEEXT_16 = elements/curlhttpsink$(EXEEXT) \
 @USE_CURL_TRUE@	elements/curlfilesink$(EXEEXT) \
-@USE_CURL_TRUE@	elements/curlftpsink$(EXEEXT) $(am__EXEEXT_14) \
+@USE_CURL_TRUE@	elements/curlftpsink$(EXEEXT) $(am__EXEEXT_15) \
 @USE_CURL_TRUE@	elements/curlsmtpsink$(EXEEXT)
-@USE_SHM_TRUE@am__EXEEXT_16 = elements/shm$(EXEEXT)
-@USE_EXIF_TRUE@am__EXEEXT_17 = elements/jifmux$(EXEEXT)
-@USE_MPG123_TRUE@am__EXEEXT_18 = elements/mpg123audiodec$(EXEEXT)
-@USE_MIMIC_TRUE@am__EXEEXT_19 = pipelines/mimic$(EXEEXT)
-@USE_UVCH264_TRUE@am__EXEEXT_20 = elements/uvch264demux$(EXEEXT)
-@USE_SCHRO_TRUE@am__EXEEXT_21 = elements/schroenc$(EXEEXT)
-@USE_X265_TRUE@am__EXEEXT_22 = elements/x265enc$(EXEEXT)
-@USE_ZBAR_TRUE@am__EXEEXT_23 = elements/zbar$(EXEEXT)
-@HAVE_ORC_TRUE@am__EXEEXT_24 = orc/bayer$(EXEEXT) \
+@USE_SHM_TRUE@am__EXEEXT_17 = elements/shm$(EXEEXT)
+@USE_EXIF_TRUE@am__EXEEXT_18 = elements/jifmux$(EXEEXT)
+@USE_MPG123_TRUE@am__EXEEXT_19 = elements/mpg123audiodec$(EXEEXT)
+@USE_MIMIC_TRUE@am__EXEEXT_20 = pipelines/mimic$(EXEEXT)
+@USE_UVCH264_TRUE@am__EXEEXT_21 = elements/uvch264demux$(EXEEXT)
+@USE_SCHRO_TRUE@am__EXEEXT_22 = elements/schroenc$(EXEEXT)
+@USE_X265_TRUE@am__EXEEXT_23 = elements/x265enc$(EXEEXT)
+@USE_ZBAR_TRUE@am__EXEEXT_24 = elements/zbar$(EXEEXT)
+@HAVE_ORC_TRUE@am__EXEEXT_25 = orc/bayer$(EXEEXT) \
 @HAVE_ORC_TRUE@	orc/audiomixer$(EXEEXT) orc/compositor$(EXEEXT)
-@USE_GL_TRUE@am__EXEEXT_25 = libs/gstglcontext$(EXEEXT) \
+@USE_GL_TRUE@am__EXEEXT_26 = libs/gstglcontext$(EXEEXT) \
 @USE_GL_TRUE@	libs/gstglmemory$(EXEEXT) \
 @USE_GL_TRUE@	libs/gstglupload$(EXEEXT) \
 @USE_GL_TRUE@	libs/gstglcolorconvert$(EXEEXT) \
+@USE_GL_TRUE@	libs/gstglsl$(EXEEXT) \
 @USE_GL_TRUE@	elements/glimagesink$(EXEEXT)
-@USE_HLS_TRUE@am__EXEEXT_26 = elements/hlsdemux_m3u8$(EXEEXT)
-@USE_NEON_TRUE@am__EXEEXT_27 = elements/neonhttpsrc$(EXEEXT)
+@USE_HLS_TRUE@am__EXEEXT_27 = elements/hlsdemux_m3u8$(EXEEXT)
+am__EXEEXT_28 =
+@WITH_GST_PLAYER_TESTS_TRUE@am__EXEEXT_29 = libs/player$(EXEEXT)
+@USE_NEON_TRUE@am__EXEEXT_30 = elements/neonhttpsrc$(EXEEXT)
 PROGRAMS = $(noinst_PROGRAMS)
 elements_aiffparse_SOURCES = elements/aiffparse.c
 elements_aiffparse_OBJECTS = elements/aiffparse.$(OBJEXT)
@@ -257,16 +264,6 @@
 	elements/autovideoconvert.$(OBJEXT)
 elements_autovideoconvert_LDADD = $(LDADD)
 elements_autovideoconvert_DEPENDENCIES = $(am__DEPENDENCIES_1)
-am_elements_baseaudiovisualizer_OBJECTS = elements/elements_baseaudiovisualizer-baseaudiovisualizer.$(OBJEXT)
-elements_baseaudiovisualizer_OBJECTS =  \
-	$(am_elements_baseaudiovisualizer_OBJECTS)
-elements_baseaudiovisualizer_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
-elements_baseaudiovisualizer_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
-	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
-	$(elements_baseaudiovisualizer_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
-	$(LDFLAGS) -o $@
 am_elements_camerabin_OBJECTS =  \
 	elements/elements_camerabin-camerabin.$(OBJEXT)
 elements_camerabin_OBJECTS = $(am_elements_camerabin_OBJECTS)
@@ -307,6 +304,19 @@
 elements_curlsmtpsink_OBJECTS = elements/curlsmtpsink.$(OBJEXT)
 elements_curlsmtpsink_LDADD = $(LDADD)
 elements_curlsmtpsink_DEPENDENCIES = $(am__DEPENDENCIES_1)
+am_elements_dash_demux_OBJECTS =  \
+	elements/elements_dash_demux-test_http_src.$(OBJEXT) \
+	elements/elements_dash_demux-adaptive_demux_engine.$(OBJEXT) \
+	elements/elements_dash_demux-adaptive_demux_common.$(OBJEXT) \
+	elements/elements_dash_demux-dash_demux.$(OBJEXT)
+elements_dash_demux_OBJECTS = $(am_elements_dash_demux_OBJECTS)
+elements_dash_demux_DEPENDENCIES = $(am__DEPENDENCIES_2) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(top_builddir)/gst-libs/gst/adaptivedemux/libgstadaptivedemux-@GST_API_VERSION@.la
+elements_dash_demux_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(elements_dash_demux_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 am_elements_dash_mpd_OBJECTS =  \
 	elements/elements_dash_mpd-dash_mpd.$(OBJEXT)
 elements_dash_mpd_OBJECTS = $(am_elements_dash_mpd_OBJECTS)
@@ -463,16 +473,25 @@
 elements_pcapparse_SOURCES = elements/pcapparse.c
 elements_pcapparse_OBJECTS = elements/pcapparse.$(OBJEXT)
 elements_pcapparse_DEPENDENCIES = libparser.la $(am__DEPENDENCIES_2)
-elements_rtponvif_SOURCES = elements/rtponvif.c
-elements_rtponvif_OBJECTS =  \
-	elements/elements_rtponvif-rtponvif.$(OBJEXT)
-elements_rtponvif_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+elements_rtponvifparse_SOURCES = elements/rtponvifparse.c
+elements_rtponvifparse_OBJECTS =  \
+	elements/elements_rtponvifparse-rtponvifparse.$(OBJEXT)
+elements_rtponvifparse_DEPENDENCIES = $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
 	$(am__DEPENDENCIES_2)
-elements_rtponvif_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+elements_rtponvifparse_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
-	$(elements_rtponvif_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
-	-o $@
+	$(elements_rtponvifparse_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
+elements_rtponviftimestamp_SOURCES = elements/rtponviftimestamp.c
+elements_rtponviftimestamp_OBJECTS = elements/elements_rtponviftimestamp-rtponviftimestamp.$(OBJEXT)
+elements_rtponviftimestamp_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_2)
+elements_rtponviftimestamp_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(elements_rtponviftimestamp_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
+	$(LDFLAGS) -o $@
 elements_schroenc_SOURCES = elements/schroenc.c
 elements_schroenc_OBJECTS = elements/schroenc.$(OBJEXT)
 elements_schroenc_LDADD = $(LDADD)
@@ -503,6 +522,16 @@
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
 	$(elements_uvch264demux_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
 	$(LDFLAGS) -o $@
+elements_videoframe_audiolevel_SOURCES =  \
+	elements/videoframe-audiolevel.c
+elements_videoframe_audiolevel_OBJECTS = elements/elements_videoframe_audiolevel-videoframe-audiolevel.$(OBJEXT)
+elements_videoframe_audiolevel_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_2)
+elements_videoframe_audiolevel_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(elements_videoframe_audiolevel_CFLAGS) $(CFLAGS) \
+	$(AM_LDFLAGS) $(LDFLAGS) -o $@
 elements_viewfinderbin_SOURCES = elements/viewfinderbin.c
 elements_viewfinderbin_OBJECTS = elements/viewfinderbin.$(OBJEXT)
 elements_viewfinderbin_LDADD = $(LDADD)
@@ -579,6 +608,15 @@
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
 	$(libs_gstglmemory_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) \
 	-o $@
+libs_gstglsl_SOURCES = libs/gstglsl.c
+libs_gstglsl_OBJECTS = libs/libs_gstglsl-gstglsl.$(OBJEXT)
+libs_gstglsl_DEPENDENCIES =  \
+	$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+libs_gstglsl_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libs_gstglsl_CFLAGS) \
+	$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 libs_gstglupload_SOURCES = libs/gstglupload.c
 libs_gstglupload_OBJECTS =  \
 	libs/libs_gstglupload-gstglupload.$(OBJEXT)
@@ -626,6 +664,16 @@
 	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
 	$(libs_mpegvideoparser_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
 	$(LDFLAGS) -o $@
+am_libs_player_OBJECTS = libs/libs_player-player.$(OBJEXT)
+@WITH_GST_PLAYER_TESTS_TRUE@nodist_libs_player_OBJECTS = libs/libs_player-player_dummy.$(OBJEXT)
+libs_player_OBJECTS = $(am_libs_player_OBJECTS) \
+	$(nodist_libs_player_OBJECTS)
+libs_player_DEPENDENCIES = $(top_builddir)/gst-libs/gst/player/libgstplayer-@GST_API_VERSION@.la \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_2)
+libs_player_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libs_player_CFLAGS) \
+	$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
 libs_vc1parser_SOURCES = libs/vc1parser.c
 libs_vc1parser_OBJECTS = libs/libs_vc1parser-vc1parser.$(OBJEXT)
 libs_vc1parser_DEPENDENCIES = $(top_builddir)/gst-libs/gst/codecparsers/libgstcodecparsers-@GST_API_VERSION@.la \
@@ -721,60 +769,64 @@
 	elements/asfmux.c elements/assrender.c \
 	elements/audiointerleave.c elements/audiomixer.c \
 	elements/autoconvert.c elements/autovideoconvert.c \
-	$(elements_baseaudiovisualizer_SOURCES) \
 	$(elements_camerabin_SOURCES) elements/compositor.c \
 	elements/curlfilesink.c elements/curlftpsink.c \
 	elements/curlhttpsink.c elements/curlsftpsink.c \
-	elements/curlsmtpsink.c $(elements_dash_mpd_SOURCES) \
-	elements/dataurisrc.c elements/faac.c elements/faad.c \
-	elements/gdpdepay.c elements/gdppay.c elements/glimagesink.c \
-	elements/h263parse.c elements/h264parse.c \
-	$(elements_hlsdemux_m3u8_SOURCES) elements/id3mux.c \
-	$(elements_jifmux_SOURCES) elements/jpegparse.c \
-	elements/kate.c elements/mpeg2enc.c elements/mpeg4videoparse.c \
-	elements/mpegtsmux.c elements/mpegvideoparse.c \
-	elements/mpg123audiodec.c elements/mplex.c elements/mxfdemux.c \
-	elements/mxfmux.c elements/neonhttpsrc.c elements/ofa.c \
-	elements/opus.c elements/pcapparse.c elements/rtponvif.c \
-	elements/schroenc.c elements/shm.c elements/templatematch.c \
-	elements/timidity.c elements/uvch264demux.c \
+	elements/curlsmtpsink.c $(elements_dash_demux_SOURCES) \
+	$(elements_dash_mpd_SOURCES) elements/dataurisrc.c \
+	elements/faac.c elements/faad.c elements/gdpdepay.c \
+	elements/gdppay.c elements/glimagesink.c elements/h263parse.c \
+	elements/h264parse.c $(elements_hlsdemux_m3u8_SOURCES) \
+	elements/id3mux.c $(elements_jifmux_SOURCES) \
+	elements/jpegparse.c elements/kate.c elements/mpeg2enc.c \
+	elements/mpeg4videoparse.c elements/mpegtsmux.c \
+	elements/mpegvideoparse.c elements/mpg123audiodec.c \
+	elements/mplex.c elements/mxfdemux.c elements/mxfmux.c \
+	elements/neonhttpsrc.c elements/ofa.c elements/opus.c \
+	elements/pcapparse.c elements/rtponvifparse.c \
+	elements/rtponviftimestamp.c elements/schroenc.c \
+	elements/shm.c elements/templatematch.c elements/timidity.c \
+	elements/uvch264demux.c elements/videoframe-audiolevel.c \
 	elements/viewfinderbin.c elements/voaacenc.c \
 	elements/voamrwbenc.c elements/x265enc.c elements/zbar.c \
 	generic/states.c libs/aggregator.c libs/gstglcolorconvert.c \
-	libs/gstglcontext.c libs/gstglmemory.c libs/gstglupload.c \
-	libs/h264parser.c libs/insertbin.c libs/mpegts.c \
-	libs/mpegvideoparser.c libs/vc1parser.c libs/vp8parser.c \
-	$(nodist_orc_audiomixer_SOURCES) $(nodist_orc_bayer_SOURCES) \
-	$(nodist_orc_compositor_SOURCES) pipelines/mimic.c \
-	pipelines/mxf.c pipelines/streamheader.c
+	libs/gstglcontext.c libs/gstglmemory.c libs/gstglsl.c \
+	libs/gstglupload.c libs/h264parser.c libs/insertbin.c \
+	libs/mpegts.c libs/mpegvideoparser.c $(libs_player_SOURCES) \
+	$(nodist_libs_player_SOURCES) libs/vc1parser.c \
+	libs/vp8parser.c $(nodist_orc_audiomixer_SOURCES) \
+	$(nodist_orc_bayer_SOURCES) $(nodist_orc_compositor_SOURCES) \
+	pipelines/mimic.c pipelines/mxf.c pipelines/streamheader.c
 DIST_SOURCES = $(libparser_la_SOURCES) elements/aiffparse.c \
 	elements/asfmux.c elements/assrender.c \
 	elements/audiointerleave.c elements/audiomixer.c \
 	elements/autoconvert.c elements/autovideoconvert.c \
-	$(elements_baseaudiovisualizer_SOURCES) \
 	$(elements_camerabin_SOURCES) elements/compositor.c \
 	elements/curlfilesink.c elements/curlftpsink.c \
 	elements/curlhttpsink.c elements/curlsftpsink.c \
-	elements/curlsmtpsink.c $(elements_dash_mpd_SOURCES) \
-	elements/dataurisrc.c elements/faac.c elements/faad.c \
-	elements/gdpdepay.c elements/gdppay.c elements/glimagesink.c \
-	elements/h263parse.c elements/h264parse.c \
-	$(elements_hlsdemux_m3u8_SOURCES) elements/id3mux.c \
-	$(elements_jifmux_SOURCES) elements/jpegparse.c \
-	elements/kate.c elements/mpeg2enc.c elements/mpeg4videoparse.c \
-	elements/mpegtsmux.c elements/mpegvideoparse.c \
-	elements/mpg123audiodec.c elements/mplex.c elements/mxfdemux.c \
-	elements/mxfmux.c elements/neonhttpsrc.c elements/ofa.c \
-	elements/opus.c elements/pcapparse.c elements/rtponvif.c \
-	elements/schroenc.c elements/shm.c elements/templatematch.c \
-	elements/timidity.c elements/uvch264demux.c \
+	elements/curlsmtpsink.c $(elements_dash_demux_SOURCES) \
+	$(elements_dash_mpd_SOURCES) elements/dataurisrc.c \
+	elements/faac.c elements/faad.c elements/gdpdepay.c \
+	elements/gdppay.c elements/glimagesink.c elements/h263parse.c \
+	elements/h264parse.c $(elements_hlsdemux_m3u8_SOURCES) \
+	elements/id3mux.c $(elements_jifmux_SOURCES) \
+	elements/jpegparse.c elements/kate.c elements/mpeg2enc.c \
+	elements/mpeg4videoparse.c elements/mpegtsmux.c \
+	elements/mpegvideoparse.c elements/mpg123audiodec.c \
+	elements/mplex.c elements/mxfdemux.c elements/mxfmux.c \
+	elements/neonhttpsrc.c elements/ofa.c elements/opus.c \
+	elements/pcapparse.c elements/rtponvifparse.c \
+	elements/rtponviftimestamp.c elements/schroenc.c \
+	elements/shm.c elements/templatematch.c elements/timidity.c \
+	elements/uvch264demux.c elements/videoframe-audiolevel.c \
 	elements/viewfinderbin.c elements/voaacenc.c \
 	elements/voamrwbenc.c elements/x265enc.c elements/zbar.c \
 	generic/states.c libs/aggregator.c libs/gstglcolorconvert.c \
-	libs/gstglcontext.c libs/gstglmemory.c libs/gstglupload.c \
-	libs/h264parser.c libs/insertbin.c libs/mpegts.c \
-	libs/mpegvideoparser.c libs/vc1parser.c libs/vp8parser.c \
-	pipelines/mimic.c pipelines/mxf.c pipelines/streamheader.c
+	libs/gstglcontext.c libs/gstglmemory.c libs/gstglsl.c \
+	libs/gstglupload.c libs/h264parser.c libs/insertbin.c \
+	libs/mpegts.c libs/mpegvideoparser.c $(libs_player_SOURCES) \
+	libs/vc1parser.c libs/vp8parser.c pipelines/mimic.c \
+	pipelines/mxf.c pipelines/streamheader.c
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -1042,6 +1094,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -1079,6 +1133,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -1106,6 +1162,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -1124,6 +1182,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -1134,6 +1194,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -1159,6 +1221,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -1184,6 +1248,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = $(top_builddir)/tools
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -1315,6 +1381,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -1372,8 +1440,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -1443,6 +1515,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -1553,12 +1626,14 @@
 
 
 # the core dumps of some machines have PIDs appended
-CLEANFILES = core.* test-registry.*
+CLEANFILES = core.* test-registry.* $(am__append_1)
 SUPPRESSIONS = $(top_srcdir)/common/gst.supp $(srcdir)/gst-plugins-bad.supp
 @USE_ASSRENDER_FALSE@check_assrender = 
 @USE_ASSRENDER_TRUE@check_assrender = elements/assrender
 @USE_DASH_FALSE@check_dash = 
 @USE_DASH_TRUE@check_dash = elements/dash_mpd
+@USE_DASH_FALSE@check_dash_demux = 
+@USE_DASH_TRUE@check_dash_demux = elements/dash_demux
 @USE_FAAC_FALSE@check_faac = 
 @USE_FAAC_TRUE@check_faac = elements/faac
 @USE_FAAD_FALSE@check_faad = 
@@ -1599,8 +1674,12 @@
 @USE_OPUS_TRUE@check_opus = elements/opus
 @USE_SSH2_FALSE@check_curl_sftp = 
 @USE_SSH2_TRUE@check_curl_sftp = elements/curlsftpsink
+@USE_HLS_FALSE@check_hlsdemux_m3u8 = 
+@USE_HLS_TRUE@check_hlsdemux_m3u8 = elements/hlsdemux_m3u8
+@USE_HLS_TRUE@check_hls_demux = elements/hls_demux
 @USE_HLS_FALSE@check_hlsdemux = 
-@USE_HLS_TRUE@check_hlsdemux = elements/hlsdemux_m3u8
+@WITH_GST_PLAYER_TESTS_FALSE@check_player = 
+@WITH_GST_PLAYER_TESTS_TRUE@check_player = libs/player
 @USE_CURL_FALSE@check_curl = 
 @USE_CURL_TRUE@check_curl = elements/curlhttpsink \
 @USE_CURL_TRUE@	elements/curlfilesink \
@@ -1624,6 +1703,7 @@
 @USE_GL_TRUE@    libs/gstglmemory \
 @USE_GL_TRUE@    libs/gstglupload \
 @USE_GL_TRUE@    libs/gstglcolorconvert \
+@USE_GL_TRUE@    libs/gstglsl \
 @USE_GL_TRUE@    elements/glimagesink
 
 VALGRIND_TO_FIX = \
@@ -1710,6 +1790,14 @@
 	$(GST_PLUGINS_BAD_LIBS) -lgstcodecparsers-@GST_API_VERSION@ \
 	$(GST_BASE_LIBS) $(GST_LIBS) $(LDADD)
 
+elements_videoframe_audiolevel_CFLAGS = \
+	$(GST_PLUGINS_BASE_CFLAGS) \
+	$(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
+
+elements_videoframe_audiolevel_LDADD = \
+	$(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD) \
+	-lgstaudio-@GST_API_VERSION@
+
 elements_faad_CFLAGS = \
 	$(GST_PLUGINS_BASE_CFLAGS) \
 	$(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
@@ -1742,16 +1830,6 @@
 	$(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD) \
 	-lgstaudio-@GST_API_VERSION@
 
-elements_baseaudiovisualizer_SOURCES = elements/baseaudiovisualizer.c
-elements_baseaudiovisualizer_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) \
-	$(GST_PLUGINS_BASE_CFLAGS) \
-	$(GST_BASE_CFLAGS) $(GST_CONTROLLER_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
-
-elements_baseaudiovisualizer_LDADD = \
-	$(GST_PLUGINS_BASE_LIBS) -lgstaudio-@GST_API_VERSION@  \
-	-lgstvideo-@GST_API_VERSION@ 	$(GST_BASE_LIBS) $(GST_CONTROLLER_LIBS) \
-	$(GST_LIBS) $(LDADD)
-
 elements_camerabin_CFLAGS = \
 	$(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
 	$(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS) -DGST_USE_UNSTABLE_API
@@ -1787,6 +1865,14 @@
 	$(top_builddir)/gst-libs/gst/uridownloader/libgsturidownloader-@GST_API_VERSION@.la
 
 elements_dash_mpd_SOURCES = elements/dash_mpd.c
+elements_dash_demux_CFLAGS = $(AM_CFLAGS) $(LIBXML2_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_PLUGINS_BAD_CFLAGS)
+elements_dash_demux_LDADD = \
+	$(LDADD) $(LIBXML2_LIBS) $(GST_BASE_LIBS) \
+	-lgsttag-$(GST_API_VERSION) \
+	-lgstapp-$(GST_API_VERSION) \
+	$(top_builddir)/gst-libs/gst/adaptivedemux/libgstadaptivedemux-@GST_API_VERSION@.la
+
+elements_dash_demux_SOURCES = elements/test_http_src.c elements/test_http_src.h elements/adaptive_demux_engine.c elements/adaptive_demux_engine.h elements/adaptive_demux_common.c elements/adaptive_demux_common.h elements/dash_demux.c
 pipelines_streamheader_CFLAGS = $(GIO_CFLAGS) $(AM_CFLAGS)
 pipelines_streamheader_LDADD = $(GIO_LIBS) $(LDADD)
 libs_insertbin_LDADD = \
@@ -1796,8 +1882,28 @@
 libs_insertbin_CFLAGS = \
 	$(GST_PLUGINS_BAD_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
 
-elements_rtponvif_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS)
-elements_rtponvif_LDADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) -lgstrtp-$(GST_API_VERSION) $(LDADD)
+libs_player_SOURCES = libs/player.c
+libs_player_LDADD = \
+	$(top_builddir)/gst-libs/gst/player/libgstplayer-@GST_API_VERSION@.la \
+	$(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD)
+
+libs_player_CFLAGS = \
+	$(GST_PLUGINS_BAD_CFLAGS) $(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS) \
+	-DTEST_PATH=\"$(builddir)/media\"
+
+@WITH_GST_PLAYER_TESTS_TRUE@PLAYER_MEDIA_FILES = \
+@WITH_GST_PLAYER_TESTS_TRUE@	media/audio.ogg \
+@WITH_GST_PLAYER_TESTS_TRUE@	media/audio-video.ogg \
+@WITH_GST_PLAYER_TESTS_TRUE@	media/audio-short.ogg \
+@WITH_GST_PLAYER_TESTS_TRUE@	media/audio-video-short.ogg \
+@WITH_GST_PLAYER_TESTS_TRUE@	media/sintel.mkv \
+@WITH_GST_PLAYER_TESTS_TRUE@	media/test_sub.srt
+
+@WITH_GST_PLAYER_TESTS_TRUE@nodist_libs_player_SOURCES = libs/player_dummy.c
+elements_rtponvifparse_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+elements_rtponvifparse_LDADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) -lgstrtp-$(GST_API_VERSION) $(LDADD)
+elements_rtponviftimestamp_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_BASE_CFLAGS) $(AM_CFLAGS)
+elements_rtponviftimestamp_LDADD = $(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) -lgstrtp-$(GST_API_VERSION) $(LDADD)
 EXTRA_DIST = gst-plugins-bad.supp $(uvch264_dist_data)
 orc_bayer_CFLAGS = $(ORC_CFLAGS)
 orc_bayer_LDADD = $(ORC_LIBS) -lorc-test-0.4
@@ -1844,6 +1950,15 @@
 	$(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) \
 	$(GST_BASE_LIBS) $(GST_LIBS) $(LDADD)
 
+libs_gstglsl_LDADD = \
+	$(top_builddir)/gst-libs/gst/gl/libgstgl-@GST_API_VERSION@.la \
+	$(GST_PLUGINS_BASE_LIBS) $(GST_BASE_LIBS) $(GST_LIBS) $(LDADD)
+
+libs_gstglsl_CFLAGS = \
+	$(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
+	-DGST_USE_UNSTABLE_API \
+	$(GST_BASE_CFLAGS) $(GST_CFLAGS) $(AM_CFLAGS)
+
 elements_glimagesink_CFLAGS = \
 	$(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) \
 	-DGST_USE_UNSTABLE_API \
@@ -1875,6 +1990,13 @@
 elements_hlsdemux_m3u8_CFLAGS = $(GST_BASE_CFLAGS) $(AM_CFLAGS) -I$(top_srcdir)/ext/hls
 elements_hlsdemux_m3u8_LDADD = $(GST_BASE_LIBS) $(LDADD)
 elements_hlsdemux_m3u8_SOURCES = elements/hlsdemux_m3u8.c
+elements_hls_demux_CFLAGS = $(GST_BASE_CFLAGS) $(AM_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_PLUGINS_BAD_CFLAGS)
+elements_hls_demux_LDADD = $(GST_BASE_LIBS) $(LDADD) \
+	-lgsttag-$(GST_API_VERSION) \
+	-lgstapp-$(GST_API_VERSION) \
+	$(top_builddir)/gst-libs/gst/adaptivedemux/libgstadaptivedemux-@GST_API_VERSION@.la
+
+elements_hls_demux_SOURCES = elements/test_http_src.c elements/test_http_src.h elements/adaptive_demux_engine.c elements/adaptive_demux_engine.h elements/adaptive_demux_common.c elements/adaptive_demux_common.h elements/hls_demux.c
 orc_compositor_CFLAGS = $(ORC_CFLAGS)
 orc_compositor_LDADD = $(ORC_LIBS) -lorc-test-0.4
 nodist_orc_compositor_SOURCES = orc/compositor.c
@@ -1995,12 +2117,6 @@
 elements/autovideoconvert$(EXEEXT): $(elements_autovideoconvert_OBJECTS) $(elements_autovideoconvert_DEPENDENCIES) $(EXTRA_elements_autovideoconvert_DEPENDENCIES) elements/$(am__dirstamp)
 	@rm -f elements/autovideoconvert$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(elements_autovideoconvert_OBJECTS) $(elements_autovideoconvert_LDADD) $(LIBS)
-elements/elements_baseaudiovisualizer-baseaudiovisualizer.$(OBJEXT):  \
-	elements/$(am__dirstamp) elements/$(DEPDIR)/$(am__dirstamp)
-
-elements/baseaudiovisualizer$(EXEEXT): $(elements_baseaudiovisualizer_OBJECTS) $(elements_baseaudiovisualizer_DEPENDENCIES) $(EXTRA_elements_baseaudiovisualizer_DEPENDENCIES) elements/$(am__dirstamp)
-	@rm -f elements/baseaudiovisualizer$(EXEEXT)
-	$(AM_V_CCLD)$(elements_baseaudiovisualizer_LINK) $(elements_baseaudiovisualizer_OBJECTS) $(elements_baseaudiovisualizer_LDADD) $(LIBS)
 elements/elements_camerabin-camerabin.$(OBJEXT):  \
 	elements/$(am__dirstamp) elements/$(DEPDIR)/$(am__dirstamp)
 
@@ -2043,6 +2159,18 @@
 elements/curlsmtpsink$(EXEEXT): $(elements_curlsmtpsink_OBJECTS) $(elements_curlsmtpsink_DEPENDENCIES) $(EXTRA_elements_curlsmtpsink_DEPENDENCIES) elements/$(am__dirstamp)
 	@rm -f elements/curlsmtpsink$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(elements_curlsmtpsink_OBJECTS) $(elements_curlsmtpsink_LDADD) $(LIBS)
+elements/elements_dash_demux-test_http_src.$(OBJEXT):  \
+	elements/$(am__dirstamp) elements/$(DEPDIR)/$(am__dirstamp)
+elements/elements_dash_demux-adaptive_demux_engine.$(OBJEXT):  \
+	elements/$(am__dirstamp) elements/$(DEPDIR)/$(am__dirstamp)
+elements/elements_dash_demux-adaptive_demux_common.$(OBJEXT):  \
+	elements/$(am__dirstamp) elements/$(DEPDIR)/$(am__dirstamp)
+elements/elements_dash_demux-dash_demux.$(OBJEXT):  \
+	elements/$(am__dirstamp) elements/$(DEPDIR)/$(am__dirstamp)
+
+elements/dash_demux$(EXEEXT): $(elements_dash_demux_OBJECTS) $(elements_dash_demux_DEPENDENCIES) $(EXTRA_elements_dash_demux_DEPENDENCIES) elements/$(am__dirstamp)
+	@rm -f elements/dash_demux$(EXEEXT)
+	$(AM_V_CCLD)$(elements_dash_demux_LINK) $(elements_dash_demux_OBJECTS) $(elements_dash_demux_LDADD) $(LIBS)
 elements/elements_dash_mpd-dash_mpd.$(OBJEXT):  \
 	elements/$(am__dirstamp) elements/$(DEPDIR)/$(am__dirstamp)
 
@@ -2199,12 +2327,18 @@
 elements/pcapparse$(EXEEXT): $(elements_pcapparse_OBJECTS) $(elements_pcapparse_DEPENDENCIES) $(EXTRA_elements_pcapparse_DEPENDENCIES) elements/$(am__dirstamp)
 	@rm -f elements/pcapparse$(EXEEXT)
 	$(AM_V_CCLD)$(LINK) $(elements_pcapparse_OBJECTS) $(elements_pcapparse_LDADD) $(LIBS)
-elements/elements_rtponvif-rtponvif.$(OBJEXT):  \
+elements/elements_rtponvifparse-rtponvifparse.$(OBJEXT):  \
 	elements/$(am__dirstamp) elements/$(DEPDIR)/$(am__dirstamp)
 
-elements/rtponvif$(EXEEXT): $(elements_rtponvif_OBJECTS) $(elements_rtponvif_DEPENDENCIES) $(EXTRA_elements_rtponvif_DEPENDENCIES) elements/$(am__dirstamp)
-	@rm -f elements/rtponvif$(EXEEXT)
-	$(AM_V_CCLD)$(elements_rtponvif_LINK) $(elements_rtponvif_OBJECTS) $(elements_rtponvif_LDADD) $(LIBS)
+elements/rtponvifparse$(EXEEXT): $(elements_rtponvifparse_OBJECTS) $(elements_rtponvifparse_DEPENDENCIES) $(EXTRA_elements_rtponvifparse_DEPENDENCIES) elements/$(am__dirstamp)
+	@rm -f elements/rtponvifparse$(EXEEXT)
+	$(AM_V_CCLD)$(elements_rtponvifparse_LINK) $(elements_rtponvifparse_OBJECTS) $(elements_rtponvifparse_LDADD) $(LIBS)
+elements/elements_rtponviftimestamp-rtponviftimestamp.$(OBJEXT):  \
+	elements/$(am__dirstamp) elements/$(DEPDIR)/$(am__dirstamp)
+
+elements/rtponviftimestamp$(EXEEXT): $(elements_rtponviftimestamp_OBJECTS) $(elements_rtponviftimestamp_DEPENDENCIES) $(EXTRA_elements_rtponviftimestamp_DEPENDENCIES) elements/$(am__dirstamp)
+	@rm -f elements/rtponviftimestamp$(EXEEXT)
+	$(AM_V_CCLD)$(elements_rtponviftimestamp_LINK) $(elements_rtponviftimestamp_OBJECTS) $(elements_rtponviftimestamp_LDADD) $(LIBS)
 elements/schroenc.$(OBJEXT): elements/$(am__dirstamp) \
 	elements/$(DEPDIR)/$(am__dirstamp)
 
@@ -2235,6 +2369,12 @@
 elements/uvch264demux$(EXEEXT): $(elements_uvch264demux_OBJECTS) $(elements_uvch264demux_DEPENDENCIES) $(EXTRA_elements_uvch264demux_DEPENDENCIES) elements/$(am__dirstamp)
 	@rm -f elements/uvch264demux$(EXEEXT)
 	$(AM_V_CCLD)$(elements_uvch264demux_LINK) $(elements_uvch264demux_OBJECTS) $(elements_uvch264demux_LDADD) $(LIBS)
+elements/elements_videoframe_audiolevel-videoframe-audiolevel.$(OBJEXT):  \
+	elements/$(am__dirstamp) elements/$(DEPDIR)/$(am__dirstamp)
+
+elements/videoframe-audiolevel$(EXEEXT): $(elements_videoframe_audiolevel_OBJECTS) $(elements_videoframe_audiolevel_DEPENDENCIES) $(EXTRA_elements_videoframe_audiolevel_DEPENDENCIES) elements/$(am__dirstamp)
+	@rm -f elements/videoframe-audiolevel$(EXEEXT)
+	$(AM_V_CCLD)$(elements_videoframe_audiolevel_LINK) $(elements_videoframe_audiolevel_OBJECTS) $(elements_videoframe_audiolevel_LDADD) $(LIBS)
 elements/viewfinderbin.$(OBJEXT): elements/$(am__dirstamp) \
 	elements/$(DEPDIR)/$(am__dirstamp)
 
@@ -2307,6 +2447,12 @@
 libs/gstglmemory$(EXEEXT): $(libs_gstglmemory_OBJECTS) $(libs_gstglmemory_DEPENDENCIES) $(EXTRA_libs_gstglmemory_DEPENDENCIES) libs/$(am__dirstamp)
 	@rm -f libs/gstglmemory$(EXEEXT)
 	$(AM_V_CCLD)$(libs_gstglmemory_LINK) $(libs_gstglmemory_OBJECTS) $(libs_gstglmemory_LDADD) $(LIBS)
+libs/libs_gstglsl-gstglsl.$(OBJEXT): libs/$(am__dirstamp) \
+	libs/$(DEPDIR)/$(am__dirstamp)
+
+libs/gstglsl$(EXEEXT): $(libs_gstglsl_OBJECTS) $(libs_gstglsl_DEPENDENCIES) $(EXTRA_libs_gstglsl_DEPENDENCIES) libs/$(am__dirstamp)
+	@rm -f libs/gstglsl$(EXEEXT)
+	$(AM_V_CCLD)$(libs_gstglsl_LINK) $(libs_gstglsl_OBJECTS) $(libs_gstglsl_LDADD) $(LIBS)
 libs/libs_gstglupload-gstglupload.$(OBJEXT): libs/$(am__dirstamp) \
 	libs/$(DEPDIR)/$(am__dirstamp)
 
@@ -2337,6 +2483,14 @@
 libs/mpegvideoparser$(EXEEXT): $(libs_mpegvideoparser_OBJECTS) $(libs_mpegvideoparser_DEPENDENCIES) $(EXTRA_libs_mpegvideoparser_DEPENDENCIES) libs/$(am__dirstamp)
 	@rm -f libs/mpegvideoparser$(EXEEXT)
 	$(AM_V_CCLD)$(libs_mpegvideoparser_LINK) $(libs_mpegvideoparser_OBJECTS) $(libs_mpegvideoparser_LDADD) $(LIBS)
+libs/libs_player-player.$(OBJEXT): libs/$(am__dirstamp) \
+	libs/$(DEPDIR)/$(am__dirstamp)
+libs/libs_player-player_dummy.$(OBJEXT): libs/$(am__dirstamp) \
+	libs/$(DEPDIR)/$(am__dirstamp)
+
+libs/player$(EXEEXT): $(libs_player_OBJECTS) $(libs_player_DEPENDENCIES) $(EXTRA_libs_player_DEPENDENCIES) libs/$(am__dirstamp)
+	@rm -f libs/player$(EXEEXT)
+	$(AM_V_CCLD)$(libs_player_LINK) $(libs_player_OBJECTS) $(libs_player_LDADD) $(LIBS)
 libs/libs_vc1parser-vc1parser.$(OBJEXT): libs/$(am__dirstamp) \
 	libs/$(DEPDIR)/$(am__dirstamp)
 
@@ -2423,9 +2577,12 @@
 @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_assrender-assrender.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_audiointerleave-audiointerleave.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_audiomixer-audiomixer.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_baseaudiovisualizer-baseaudiovisualizer.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_camerabin-camerabin.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_compositor-compositor.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_dash_demux-adaptive_demux_common.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_dash_demux-adaptive_demux_engine.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_dash_demux-dash_demux.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_dash_demux-test_http_src.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_dash_mpd-dash_mpd.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_faac-faac.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_faad-faad.Po@am__quote@
@@ -2437,9 +2594,11 @@
 @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_kate-kate.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_mpegtsmux-mpegtsmux.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_mpg123audiodec-mpg123audiodec.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_rtponvif-rtponvif.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_rtponvifparse-rtponvifparse.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_rtponviftimestamp-rtponviftimestamp.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_timidity-timidity.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_uvch264demux-uvch264demux.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_videoframe_audiolevel-videoframe-audiolevel.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/elements_voaacenc-voaacenc.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/h263parse.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@elements/$(DEPDIR)/h264parse.Po@am__quote@
@@ -2468,11 +2627,14 @@
 @AMDEP_TRUE@@am__include@ @am__quote@libs/$(DEPDIR)/libs_gstglcolorconvert-gstglcolorconvert.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@libs/$(DEPDIR)/libs_gstglcontext-gstglcontext.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@libs/$(DEPDIR)/libs_gstglmemory-gstglmemory.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libs/$(DEPDIR)/libs_gstglsl-gstglsl.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@libs/$(DEPDIR)/libs_gstglupload-gstglupload.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@libs/$(DEPDIR)/libs_h264parser-h264parser.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@libs/$(DEPDIR)/libs_insertbin-insertbin.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@libs/$(DEPDIR)/libs_mpegts-mpegts.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@libs/$(DEPDIR)/libs_mpegvideoparser-mpegvideoparser.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libs/$(DEPDIR)/libs_player-player.Po@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@libs/$(DEPDIR)/libs_player-player_dummy.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@libs/$(DEPDIR)/libs_vc1parser-vc1parser.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@libs/$(DEPDIR)/libs_vp8parser-vp8parser.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@orc/$(DEPDIR)/orc_audiomixer-audiomixer.Po@am__quote@
@@ -2555,20 +2717,6 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_audiomixer_CFLAGS) $(CFLAGS) -c -o elements/elements_audiomixer-audiomixer.obj `if test -f 'elements/audiomixer.c'; then $(CYGPATH_W) 'elements/audiomixer.c'; else $(CYGPATH_W) '$(srcdir)/elements/audiomixer.c'; fi`
 
-elements/elements_baseaudiovisualizer-baseaudiovisualizer.o: elements/baseaudiovisualizer.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_baseaudiovisualizer_CFLAGS) $(CFLAGS) -MT elements/elements_baseaudiovisualizer-baseaudiovisualizer.o -MD -MP -MF elements/$(DEPDIR)/elements_baseaudiovisualizer-baseaudiovisualizer.Tpo -c -o elements/elements_baseaudiovisualizer-baseaudiovisualizer.o `test -f 'elements/baseaudiovisualizer.c' || echo '$(srcdir)/'`elements/baseaudiovisualizer.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_baseaudiovisualizer-baseaudiovisualizer.Tpo elements/$(DEPDIR)/elements_baseaudiovisualizer-baseaudiovisualizer.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='elements/baseaudiovisualizer.c' object='elements/elements_baseaudiovisualizer-baseaudiovisualizer.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_baseaudiovisualizer_CFLAGS) $(CFLAGS) -c -o elements/elements_baseaudiovisualizer-baseaudiovisualizer.o `test -f 'elements/baseaudiovisualizer.c' || echo '$(srcdir)/'`elements/baseaudiovisualizer.c
-
-elements/elements_baseaudiovisualizer-baseaudiovisualizer.obj: elements/baseaudiovisualizer.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_baseaudiovisualizer_CFLAGS) $(CFLAGS) -MT elements/elements_baseaudiovisualizer-baseaudiovisualizer.obj -MD -MP -MF elements/$(DEPDIR)/elements_baseaudiovisualizer-baseaudiovisualizer.Tpo -c -o elements/elements_baseaudiovisualizer-baseaudiovisualizer.obj `if test -f 'elements/baseaudiovisualizer.c'; then $(CYGPATH_W) 'elements/baseaudiovisualizer.c'; else $(CYGPATH_W) '$(srcdir)/elements/baseaudiovisualizer.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_baseaudiovisualizer-baseaudiovisualizer.Tpo elements/$(DEPDIR)/elements_baseaudiovisualizer-baseaudiovisualizer.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='elements/baseaudiovisualizer.c' object='elements/elements_baseaudiovisualizer-baseaudiovisualizer.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_baseaudiovisualizer_CFLAGS) $(CFLAGS) -c -o elements/elements_baseaudiovisualizer-baseaudiovisualizer.obj `if test -f 'elements/baseaudiovisualizer.c'; then $(CYGPATH_W) 'elements/baseaudiovisualizer.c'; else $(CYGPATH_W) '$(srcdir)/elements/baseaudiovisualizer.c'; fi`
-
 elements/elements_camerabin-camerabin.o: elements/camerabin.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_camerabin_CFLAGS) $(CFLAGS) -MT elements/elements_camerabin-camerabin.o -MD -MP -MF elements/$(DEPDIR)/elements_camerabin-camerabin.Tpo -c -o elements/elements_camerabin-camerabin.o `test -f 'elements/camerabin.c' || echo '$(srcdir)/'`elements/camerabin.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_camerabin-camerabin.Tpo elements/$(DEPDIR)/elements_camerabin-camerabin.Po
@@ -2597,6 +2745,62 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_compositor_CFLAGS) $(CFLAGS) -c -o elements/elements_compositor-compositor.obj `if test -f 'elements/compositor.c'; then $(CYGPATH_W) 'elements/compositor.c'; else $(CYGPATH_W) '$(srcdir)/elements/compositor.c'; fi`
 
+elements/elements_dash_demux-test_http_src.o: elements/test_http_src.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_dash_demux_CFLAGS) $(CFLAGS) -MT elements/elements_dash_demux-test_http_src.o -MD -MP -MF elements/$(DEPDIR)/elements_dash_demux-test_http_src.Tpo -c -o elements/elements_dash_demux-test_http_src.o `test -f 'elements/test_http_src.c' || echo '$(srcdir)/'`elements/test_http_src.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_dash_demux-test_http_src.Tpo elements/$(DEPDIR)/elements_dash_demux-test_http_src.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='elements/test_http_src.c' object='elements/elements_dash_demux-test_http_src.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_dash_demux_CFLAGS) $(CFLAGS) -c -o elements/elements_dash_demux-test_http_src.o `test -f 'elements/test_http_src.c' || echo '$(srcdir)/'`elements/test_http_src.c
+
+elements/elements_dash_demux-test_http_src.obj: elements/test_http_src.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_dash_demux_CFLAGS) $(CFLAGS) -MT elements/elements_dash_demux-test_http_src.obj -MD -MP -MF elements/$(DEPDIR)/elements_dash_demux-test_http_src.Tpo -c -o elements/elements_dash_demux-test_http_src.obj `if test -f 'elements/test_http_src.c'; then $(CYGPATH_W) 'elements/test_http_src.c'; else $(CYGPATH_W) '$(srcdir)/elements/test_http_src.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_dash_demux-test_http_src.Tpo elements/$(DEPDIR)/elements_dash_demux-test_http_src.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='elements/test_http_src.c' object='elements/elements_dash_demux-test_http_src.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_dash_demux_CFLAGS) $(CFLAGS) -c -o elements/elements_dash_demux-test_http_src.obj `if test -f 'elements/test_http_src.c'; then $(CYGPATH_W) 'elements/test_http_src.c'; else $(CYGPATH_W) '$(srcdir)/elements/test_http_src.c'; fi`
+
+elements/elements_dash_demux-adaptive_demux_engine.o: elements/adaptive_demux_engine.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_dash_demux_CFLAGS) $(CFLAGS) -MT elements/elements_dash_demux-adaptive_demux_engine.o -MD -MP -MF elements/$(DEPDIR)/elements_dash_demux-adaptive_demux_engine.Tpo -c -o elements/elements_dash_demux-adaptive_demux_engine.o `test -f 'elements/adaptive_demux_engine.c' || echo '$(srcdir)/'`elements/adaptive_demux_engine.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_dash_demux-adaptive_demux_engine.Tpo elements/$(DEPDIR)/elements_dash_demux-adaptive_demux_engine.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='elements/adaptive_demux_engine.c' object='elements/elements_dash_demux-adaptive_demux_engine.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_dash_demux_CFLAGS) $(CFLAGS) -c -o elements/elements_dash_demux-adaptive_demux_engine.o `test -f 'elements/adaptive_demux_engine.c' || echo '$(srcdir)/'`elements/adaptive_demux_engine.c
+
+elements/elements_dash_demux-adaptive_demux_engine.obj: elements/adaptive_demux_engine.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_dash_demux_CFLAGS) $(CFLAGS) -MT elements/elements_dash_demux-adaptive_demux_engine.obj -MD -MP -MF elements/$(DEPDIR)/elements_dash_demux-adaptive_demux_engine.Tpo -c -o elements/elements_dash_demux-adaptive_demux_engine.obj `if test -f 'elements/adaptive_demux_engine.c'; then $(CYGPATH_W) 'elements/adaptive_demux_engine.c'; else $(CYGPATH_W) '$(srcdir)/elements/adaptive_demux_engine.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_dash_demux-adaptive_demux_engine.Tpo elements/$(DEPDIR)/elements_dash_demux-adaptive_demux_engine.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='elements/adaptive_demux_engine.c' object='elements/elements_dash_demux-adaptive_demux_engine.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_dash_demux_CFLAGS) $(CFLAGS) -c -o elements/elements_dash_demux-adaptive_demux_engine.obj `if test -f 'elements/adaptive_demux_engine.c'; then $(CYGPATH_W) 'elements/adaptive_demux_engine.c'; else $(CYGPATH_W) '$(srcdir)/elements/adaptive_demux_engine.c'; fi`
+
+elements/elements_dash_demux-adaptive_demux_common.o: elements/adaptive_demux_common.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_dash_demux_CFLAGS) $(CFLAGS) -MT elements/elements_dash_demux-adaptive_demux_common.o -MD -MP -MF elements/$(DEPDIR)/elements_dash_demux-adaptive_demux_common.Tpo -c -o elements/elements_dash_demux-adaptive_demux_common.o `test -f 'elements/adaptive_demux_common.c' || echo '$(srcdir)/'`elements/adaptive_demux_common.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_dash_demux-adaptive_demux_common.Tpo elements/$(DEPDIR)/elements_dash_demux-adaptive_demux_common.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='elements/adaptive_demux_common.c' object='elements/elements_dash_demux-adaptive_demux_common.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_dash_demux_CFLAGS) $(CFLAGS) -c -o elements/elements_dash_demux-adaptive_demux_common.o `test -f 'elements/adaptive_demux_common.c' || echo '$(srcdir)/'`elements/adaptive_demux_common.c
+
+elements/elements_dash_demux-adaptive_demux_common.obj: elements/adaptive_demux_common.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_dash_demux_CFLAGS) $(CFLAGS) -MT elements/elements_dash_demux-adaptive_demux_common.obj -MD -MP -MF elements/$(DEPDIR)/elements_dash_demux-adaptive_demux_common.Tpo -c -o elements/elements_dash_demux-adaptive_demux_common.obj `if test -f 'elements/adaptive_demux_common.c'; then $(CYGPATH_W) 'elements/adaptive_demux_common.c'; else $(CYGPATH_W) '$(srcdir)/elements/adaptive_demux_common.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_dash_demux-adaptive_demux_common.Tpo elements/$(DEPDIR)/elements_dash_demux-adaptive_demux_common.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='elements/adaptive_demux_common.c' object='elements/elements_dash_demux-adaptive_demux_common.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_dash_demux_CFLAGS) $(CFLAGS) -c -o elements/elements_dash_demux-adaptive_demux_common.obj `if test -f 'elements/adaptive_demux_common.c'; then $(CYGPATH_W) 'elements/adaptive_demux_common.c'; else $(CYGPATH_W) '$(srcdir)/elements/adaptive_demux_common.c'; fi`
+
+elements/elements_dash_demux-dash_demux.o: elements/dash_demux.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_dash_demux_CFLAGS) $(CFLAGS) -MT elements/elements_dash_demux-dash_demux.o -MD -MP -MF elements/$(DEPDIR)/elements_dash_demux-dash_demux.Tpo -c -o elements/elements_dash_demux-dash_demux.o `test -f 'elements/dash_demux.c' || echo '$(srcdir)/'`elements/dash_demux.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_dash_demux-dash_demux.Tpo elements/$(DEPDIR)/elements_dash_demux-dash_demux.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='elements/dash_demux.c' object='elements/elements_dash_demux-dash_demux.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_dash_demux_CFLAGS) $(CFLAGS) -c -o elements/elements_dash_demux-dash_demux.o `test -f 'elements/dash_demux.c' || echo '$(srcdir)/'`elements/dash_demux.c
+
+elements/elements_dash_demux-dash_demux.obj: elements/dash_demux.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_dash_demux_CFLAGS) $(CFLAGS) -MT elements/elements_dash_demux-dash_demux.obj -MD -MP -MF elements/$(DEPDIR)/elements_dash_demux-dash_demux.Tpo -c -o elements/elements_dash_demux-dash_demux.obj `if test -f 'elements/dash_demux.c'; then $(CYGPATH_W) 'elements/dash_demux.c'; else $(CYGPATH_W) '$(srcdir)/elements/dash_demux.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_dash_demux-dash_demux.Tpo elements/$(DEPDIR)/elements_dash_demux-dash_demux.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='elements/dash_demux.c' object='elements/elements_dash_demux-dash_demux.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_dash_demux_CFLAGS) $(CFLAGS) -c -o elements/elements_dash_demux-dash_demux.obj `if test -f 'elements/dash_demux.c'; then $(CYGPATH_W) 'elements/dash_demux.c'; else $(CYGPATH_W) '$(srcdir)/elements/dash_demux.c'; fi`
+
 elements/elements_dash_mpd-dash_mpd.o: elements/dash_mpd.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_dash_mpd_CFLAGS) $(CFLAGS) -MT elements/elements_dash_mpd-dash_mpd.o -MD -MP -MF elements/$(DEPDIR)/elements_dash_mpd-dash_mpd.Tpo -c -o elements/elements_dash_mpd-dash_mpd.o `test -f 'elements/dash_mpd.c' || echo '$(srcdir)/'`elements/dash_mpd.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_dash_mpd-dash_mpd.Tpo elements/$(DEPDIR)/elements_dash_mpd-dash_mpd.Po
@@ -2751,19 +2955,33 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_mpg123audiodec_CFLAGS) $(CFLAGS) -c -o elements/elements_mpg123audiodec-mpg123audiodec.obj `if test -f 'elements/mpg123audiodec.c'; then $(CYGPATH_W) 'elements/mpg123audiodec.c'; else $(CYGPATH_W) '$(srcdir)/elements/mpg123audiodec.c'; fi`
 
-elements/elements_rtponvif-rtponvif.o: elements/rtponvif.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rtponvif_CFLAGS) $(CFLAGS) -MT elements/elements_rtponvif-rtponvif.o -MD -MP -MF elements/$(DEPDIR)/elements_rtponvif-rtponvif.Tpo -c -o elements/elements_rtponvif-rtponvif.o `test -f 'elements/rtponvif.c' || echo '$(srcdir)/'`elements/rtponvif.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_rtponvif-rtponvif.Tpo elements/$(DEPDIR)/elements_rtponvif-rtponvif.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='elements/rtponvif.c' object='elements/elements_rtponvif-rtponvif.o' libtool=no @AMDEPBACKSLASH@
+elements/elements_rtponvifparse-rtponvifparse.o: elements/rtponvifparse.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rtponvifparse_CFLAGS) $(CFLAGS) -MT elements/elements_rtponvifparse-rtponvifparse.o -MD -MP -MF elements/$(DEPDIR)/elements_rtponvifparse-rtponvifparse.Tpo -c -o elements/elements_rtponvifparse-rtponvifparse.o `test -f 'elements/rtponvifparse.c' || echo '$(srcdir)/'`elements/rtponvifparse.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_rtponvifparse-rtponvifparse.Tpo elements/$(DEPDIR)/elements_rtponvifparse-rtponvifparse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='elements/rtponvifparse.c' object='elements/elements_rtponvifparse-rtponvifparse.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rtponvif_CFLAGS) $(CFLAGS) -c -o elements/elements_rtponvif-rtponvif.o `test -f 'elements/rtponvif.c' || echo '$(srcdir)/'`elements/rtponvif.c
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rtponvifparse_CFLAGS) $(CFLAGS) -c -o elements/elements_rtponvifparse-rtponvifparse.o `test -f 'elements/rtponvifparse.c' || echo '$(srcdir)/'`elements/rtponvifparse.c
 
-elements/elements_rtponvif-rtponvif.obj: elements/rtponvif.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rtponvif_CFLAGS) $(CFLAGS) -MT elements/elements_rtponvif-rtponvif.obj -MD -MP -MF elements/$(DEPDIR)/elements_rtponvif-rtponvif.Tpo -c -o elements/elements_rtponvif-rtponvif.obj `if test -f 'elements/rtponvif.c'; then $(CYGPATH_W) 'elements/rtponvif.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtponvif.c'; fi`
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_rtponvif-rtponvif.Tpo elements/$(DEPDIR)/elements_rtponvif-rtponvif.Po
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='elements/rtponvif.c' object='elements/elements_rtponvif-rtponvif.obj' libtool=no @AMDEPBACKSLASH@
+elements/elements_rtponvifparse-rtponvifparse.obj: elements/rtponvifparse.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rtponvifparse_CFLAGS) $(CFLAGS) -MT elements/elements_rtponvifparse-rtponvifparse.obj -MD -MP -MF elements/$(DEPDIR)/elements_rtponvifparse-rtponvifparse.Tpo -c -o elements/elements_rtponvifparse-rtponvifparse.obj `if test -f 'elements/rtponvifparse.c'; then $(CYGPATH_W) 'elements/rtponvifparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtponvifparse.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_rtponvifparse-rtponvifparse.Tpo elements/$(DEPDIR)/elements_rtponvifparse-rtponvifparse.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='elements/rtponvifparse.c' object='elements/elements_rtponvifparse-rtponvifparse.obj' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rtponvif_CFLAGS) $(CFLAGS) -c -o elements/elements_rtponvif-rtponvif.obj `if test -f 'elements/rtponvif.c'; then $(CYGPATH_W) 'elements/rtponvif.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtponvif.c'; fi`
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rtponvifparse_CFLAGS) $(CFLAGS) -c -o elements/elements_rtponvifparse-rtponvifparse.obj `if test -f 'elements/rtponvifparse.c'; then $(CYGPATH_W) 'elements/rtponvifparse.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtponvifparse.c'; fi`
+
+elements/elements_rtponviftimestamp-rtponviftimestamp.o: elements/rtponviftimestamp.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rtponviftimestamp_CFLAGS) $(CFLAGS) -MT elements/elements_rtponviftimestamp-rtponviftimestamp.o -MD -MP -MF elements/$(DEPDIR)/elements_rtponviftimestamp-rtponviftimestamp.Tpo -c -o elements/elements_rtponviftimestamp-rtponviftimestamp.o `test -f 'elements/rtponviftimestamp.c' || echo '$(srcdir)/'`elements/rtponviftimestamp.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_rtponviftimestamp-rtponviftimestamp.Tpo elements/$(DEPDIR)/elements_rtponviftimestamp-rtponviftimestamp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='elements/rtponviftimestamp.c' object='elements/elements_rtponviftimestamp-rtponviftimestamp.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rtponviftimestamp_CFLAGS) $(CFLAGS) -c -o elements/elements_rtponviftimestamp-rtponviftimestamp.o `test -f 'elements/rtponviftimestamp.c' || echo '$(srcdir)/'`elements/rtponviftimestamp.c
+
+elements/elements_rtponviftimestamp-rtponviftimestamp.obj: elements/rtponviftimestamp.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rtponviftimestamp_CFLAGS) $(CFLAGS) -MT elements/elements_rtponviftimestamp-rtponviftimestamp.obj -MD -MP -MF elements/$(DEPDIR)/elements_rtponviftimestamp-rtponviftimestamp.Tpo -c -o elements/elements_rtponviftimestamp-rtponviftimestamp.obj `if test -f 'elements/rtponviftimestamp.c'; then $(CYGPATH_W) 'elements/rtponviftimestamp.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtponviftimestamp.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_rtponviftimestamp-rtponviftimestamp.Tpo elements/$(DEPDIR)/elements_rtponviftimestamp-rtponviftimestamp.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='elements/rtponviftimestamp.c' object='elements/elements_rtponviftimestamp-rtponviftimestamp.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_rtponviftimestamp_CFLAGS) $(CFLAGS) -c -o elements/elements_rtponviftimestamp-rtponviftimestamp.obj `if test -f 'elements/rtponviftimestamp.c'; then $(CYGPATH_W) 'elements/rtponviftimestamp.c'; else $(CYGPATH_W) '$(srcdir)/elements/rtponviftimestamp.c'; fi`
 
 elements/elements_timidity-timidity.o: elements/timidity.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_timidity_CFLAGS) $(CFLAGS) -MT elements/elements_timidity-timidity.o -MD -MP -MF elements/$(DEPDIR)/elements_timidity-timidity.Tpo -c -o elements/elements_timidity-timidity.o `test -f 'elements/timidity.c' || echo '$(srcdir)/'`elements/timidity.c
@@ -2793,6 +3011,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_uvch264demux_CFLAGS) $(CFLAGS) -c -o elements/elements_uvch264demux-uvch264demux.obj `if test -f 'elements/uvch264demux.c'; then $(CYGPATH_W) 'elements/uvch264demux.c'; else $(CYGPATH_W) '$(srcdir)/elements/uvch264demux.c'; fi`
 
+elements/elements_videoframe_audiolevel-videoframe-audiolevel.o: elements/videoframe-audiolevel.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_videoframe_audiolevel_CFLAGS) $(CFLAGS) -MT elements/elements_videoframe_audiolevel-videoframe-audiolevel.o -MD -MP -MF elements/$(DEPDIR)/elements_videoframe_audiolevel-videoframe-audiolevel.Tpo -c -o elements/elements_videoframe_audiolevel-videoframe-audiolevel.o `test -f 'elements/videoframe-audiolevel.c' || echo '$(srcdir)/'`elements/videoframe-audiolevel.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_videoframe_audiolevel-videoframe-audiolevel.Tpo elements/$(DEPDIR)/elements_videoframe_audiolevel-videoframe-audiolevel.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='elements/videoframe-audiolevel.c' object='elements/elements_videoframe_audiolevel-videoframe-audiolevel.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_videoframe_audiolevel_CFLAGS) $(CFLAGS) -c -o elements/elements_videoframe_audiolevel-videoframe-audiolevel.o `test -f 'elements/videoframe-audiolevel.c' || echo '$(srcdir)/'`elements/videoframe-audiolevel.c
+
+elements/elements_videoframe_audiolevel-videoframe-audiolevel.obj: elements/videoframe-audiolevel.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_videoframe_audiolevel_CFLAGS) $(CFLAGS) -MT elements/elements_videoframe_audiolevel-videoframe-audiolevel.obj -MD -MP -MF elements/$(DEPDIR)/elements_videoframe_audiolevel-videoframe-audiolevel.Tpo -c -o elements/elements_videoframe_audiolevel-videoframe-audiolevel.obj `if test -f 'elements/videoframe-audiolevel.c'; then $(CYGPATH_W) 'elements/videoframe-audiolevel.c'; else $(CYGPATH_W) '$(srcdir)/elements/videoframe-audiolevel.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_videoframe_audiolevel-videoframe-audiolevel.Tpo elements/$(DEPDIR)/elements_videoframe_audiolevel-videoframe-audiolevel.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='elements/videoframe-audiolevel.c' object='elements/elements_videoframe_audiolevel-videoframe-audiolevel.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_videoframe_audiolevel_CFLAGS) $(CFLAGS) -c -o elements/elements_videoframe_audiolevel-videoframe-audiolevel.obj `if test -f 'elements/videoframe-audiolevel.c'; then $(CYGPATH_W) 'elements/videoframe-audiolevel.c'; else $(CYGPATH_W) '$(srcdir)/elements/videoframe-audiolevel.c'; fi`
+
 elements/elements_voaacenc-voaacenc.o: elements/voaacenc.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(elements_voaacenc_CFLAGS) $(CFLAGS) -MT elements/elements_voaacenc-voaacenc.o -MD -MP -MF elements/$(DEPDIR)/elements_voaacenc-voaacenc.Tpo -c -o elements/elements_voaacenc-voaacenc.o `test -f 'elements/voaacenc.c' || echo '$(srcdir)/'`elements/voaacenc.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) elements/$(DEPDIR)/elements_voaacenc-voaacenc.Tpo elements/$(DEPDIR)/elements_voaacenc-voaacenc.Po
@@ -2877,6 +3109,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_gstglmemory_CFLAGS) $(CFLAGS) -c -o libs/libs_gstglmemory-gstglmemory.obj `if test -f 'libs/gstglmemory.c'; then $(CYGPATH_W) 'libs/gstglmemory.c'; else $(CYGPATH_W) '$(srcdir)/libs/gstglmemory.c'; fi`
 
+libs/libs_gstglsl-gstglsl.o: libs/gstglsl.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_gstglsl_CFLAGS) $(CFLAGS) -MT libs/libs_gstglsl-gstglsl.o -MD -MP -MF libs/$(DEPDIR)/libs_gstglsl-gstglsl.Tpo -c -o libs/libs_gstglsl-gstglsl.o `test -f 'libs/gstglsl.c' || echo '$(srcdir)/'`libs/gstglsl.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) libs/$(DEPDIR)/libs_gstglsl-gstglsl.Tpo libs/$(DEPDIR)/libs_gstglsl-gstglsl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='libs/gstglsl.c' object='libs/libs_gstglsl-gstglsl.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_gstglsl_CFLAGS) $(CFLAGS) -c -o libs/libs_gstglsl-gstglsl.o `test -f 'libs/gstglsl.c' || echo '$(srcdir)/'`libs/gstglsl.c
+
+libs/libs_gstglsl-gstglsl.obj: libs/gstglsl.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_gstglsl_CFLAGS) $(CFLAGS) -MT libs/libs_gstglsl-gstglsl.obj -MD -MP -MF libs/$(DEPDIR)/libs_gstglsl-gstglsl.Tpo -c -o libs/libs_gstglsl-gstglsl.obj `if test -f 'libs/gstglsl.c'; then $(CYGPATH_W) 'libs/gstglsl.c'; else $(CYGPATH_W) '$(srcdir)/libs/gstglsl.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) libs/$(DEPDIR)/libs_gstglsl-gstglsl.Tpo libs/$(DEPDIR)/libs_gstglsl-gstglsl.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='libs/gstglsl.c' object='libs/libs_gstglsl-gstglsl.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_gstglsl_CFLAGS) $(CFLAGS) -c -o libs/libs_gstglsl-gstglsl.obj `if test -f 'libs/gstglsl.c'; then $(CYGPATH_W) 'libs/gstglsl.c'; else $(CYGPATH_W) '$(srcdir)/libs/gstglsl.c'; fi`
+
 libs/libs_gstglupload-gstglupload.o: libs/gstglupload.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_gstglupload_CFLAGS) $(CFLAGS) -MT libs/libs_gstglupload-gstglupload.o -MD -MP -MF libs/$(DEPDIR)/libs_gstglupload-gstglupload.Tpo -c -o libs/libs_gstglupload-gstglupload.o `test -f 'libs/gstglupload.c' || echo '$(srcdir)/'`libs/gstglupload.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) libs/$(DEPDIR)/libs_gstglupload-gstglupload.Tpo libs/$(DEPDIR)/libs_gstglupload-gstglupload.Po
@@ -2947,6 +3193,34 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_mpegvideoparser_CFLAGS) $(CFLAGS) -c -o libs/libs_mpegvideoparser-mpegvideoparser.obj `if test -f 'libs/mpegvideoparser.c'; then $(CYGPATH_W) 'libs/mpegvideoparser.c'; else $(CYGPATH_W) '$(srcdir)/libs/mpegvideoparser.c'; fi`
 
+libs/libs_player-player.o: libs/player.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_player_CFLAGS) $(CFLAGS) -MT libs/libs_player-player.o -MD -MP -MF libs/$(DEPDIR)/libs_player-player.Tpo -c -o libs/libs_player-player.o `test -f 'libs/player.c' || echo '$(srcdir)/'`libs/player.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) libs/$(DEPDIR)/libs_player-player.Tpo libs/$(DEPDIR)/libs_player-player.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='libs/player.c' object='libs/libs_player-player.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_player_CFLAGS) $(CFLAGS) -c -o libs/libs_player-player.o `test -f 'libs/player.c' || echo '$(srcdir)/'`libs/player.c
+
+libs/libs_player-player.obj: libs/player.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_player_CFLAGS) $(CFLAGS) -MT libs/libs_player-player.obj -MD -MP -MF libs/$(DEPDIR)/libs_player-player.Tpo -c -o libs/libs_player-player.obj `if test -f 'libs/player.c'; then $(CYGPATH_W) 'libs/player.c'; else $(CYGPATH_W) '$(srcdir)/libs/player.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) libs/$(DEPDIR)/libs_player-player.Tpo libs/$(DEPDIR)/libs_player-player.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='libs/player.c' object='libs/libs_player-player.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_player_CFLAGS) $(CFLAGS) -c -o libs/libs_player-player.obj `if test -f 'libs/player.c'; then $(CYGPATH_W) 'libs/player.c'; else $(CYGPATH_W) '$(srcdir)/libs/player.c'; fi`
+
+libs/libs_player-player_dummy.o: libs/player_dummy.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_player_CFLAGS) $(CFLAGS) -MT libs/libs_player-player_dummy.o -MD -MP -MF libs/$(DEPDIR)/libs_player-player_dummy.Tpo -c -o libs/libs_player-player_dummy.o `test -f 'libs/player_dummy.c' || echo '$(srcdir)/'`libs/player_dummy.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) libs/$(DEPDIR)/libs_player-player_dummy.Tpo libs/$(DEPDIR)/libs_player-player_dummy.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='libs/player_dummy.c' object='libs/libs_player-player_dummy.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_player_CFLAGS) $(CFLAGS) -c -o libs/libs_player-player_dummy.o `test -f 'libs/player_dummy.c' || echo '$(srcdir)/'`libs/player_dummy.c
+
+libs/libs_player-player_dummy.obj: libs/player_dummy.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_player_CFLAGS) $(CFLAGS) -MT libs/libs_player-player_dummy.obj -MD -MP -MF libs/$(DEPDIR)/libs_player-player_dummy.Tpo -c -o libs/libs_player-player_dummy.obj `if test -f 'libs/player_dummy.c'; then $(CYGPATH_W) 'libs/player_dummy.c'; else $(CYGPATH_W) '$(srcdir)/libs/player_dummy.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) libs/$(DEPDIR)/libs_player-player_dummy.Tpo libs/$(DEPDIR)/libs_player-player_dummy.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='libs/player_dummy.c' object='libs/libs_player-player_dummy.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_player_CFLAGS) $(CFLAGS) -c -o libs/libs_player-player_dummy.obj `if test -f 'libs/player_dummy.c'; then $(CYGPATH_W) 'libs/player_dummy.c'; else $(CYGPATH_W) '$(srcdir)/libs/player_dummy.c'; fi`
+
 libs/libs_vc1parser-vc1parser.o: libs/vc1parser.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libs_vc1parser_CFLAGS) $(CFLAGS) -MT libs/libs_vc1parser-vc1parser.o -MD -MP -MF libs/$(DEPDIR)/libs_vc1parser-vc1parser.Tpo -c -o libs/libs_vc1parser-vc1parser.o `test -f 'libs/vc1parser.c' || echo '$(srcdir)/'`libs/vc1parser.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) libs/$(DEPDIR)/libs_vc1parser-vc1parser.Tpo libs/$(DEPDIR)/libs_vc1parser-vc1parser.Po
@@ -3256,6 +3530,13 @@
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
+elements/dash_demux.log: elements/dash_demux$(EXEEXT)
+	@p='elements/dash_demux$(EXEEXT)'; \
+	b='elements/dash_demux'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
 elements/faac.log: elements/faac$(EXEEXT)
 	@p='elements/faac$(EXEEXT)'; \
 	b='elements/faac'; \
@@ -3382,6 +3663,13 @@
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
+elements/videoframe-audiolevel.log: elements/videoframe-audiolevel$(EXEEXT)
+	@p='elements/videoframe-audiolevel$(EXEEXT)'; \
+	b='elements/videoframe-audiolevel'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
 elements/autoconvert.log: elements/autoconvert$(EXEEXT)
 	@p='elements/autoconvert$(EXEEXT)'; \
 	b='elements/autoconvert'; \
@@ -3417,13 +3705,6 @@
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
-elements/baseaudiovisualizer.log: elements/baseaudiovisualizer$(EXEEXT)
-	@p='elements/baseaudiovisualizer$(EXEEXT)'; \
-	b='elements/baseaudiovisualizer'; \
-	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
-	--log-file $$b.log --trs-file $$b.trs \
-	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
-	"$$tst" $(AM_TESTS_FD_REDIRECT)
 elements/camerabin.log: elements/camerabin$(EXEEXT)
 	@p='elements/camerabin$(EXEEXT)'; \
 	b='elements/camerabin'; \
@@ -3536,9 +3817,16 @@
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
-elements/rtponvif.log: elements/rtponvif$(EXEEXT)
-	@p='elements/rtponvif$(EXEEXT)'; \
-	b='elements/rtponvif'; \
+elements/rtponvifparse.log: elements/rtponvifparse$(EXEEXT)
+	@p='elements/rtponvifparse$(EXEEXT)'; \
+	b='elements/rtponvifparse'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
+elements/rtponviftimestamp.log: elements/rtponviftimestamp$(EXEEXT)
+	@p='elements/rtponviftimestamp$(EXEEXT)'; \
+	b='elements/rtponviftimestamp'; \
 	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
@@ -3697,6 +3985,13 @@
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
+libs/gstglsl.log: libs/gstglsl$(EXEEXT)
+	@p='libs/gstglsl$(EXEEXT)'; \
+	b='libs/gstglsl'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
 elements/glimagesink.log: elements/glimagesink$(EXEEXT)
 	@p='elements/glimagesink$(EXEEXT)'; \
 	b='elements/glimagesink'; \
@@ -3711,6 +4006,13 @@
 	--log-file $$b.log --trs-file $$b.trs \
 	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
 	"$$tst" $(AM_TESTS_FD_REDIRECT)
+libs/player.log: libs/player$(EXEEXT)
+	@p='libs/player$(EXEEXT)'; \
+	b='libs/player'; \
+	$(am__check_pre) $(LOG_DRIVER) --test-name "$$f" \
+	--log-file $$b.log --trs-file $$b.trs \
+	$(am__common_driver_flags) $(AM_LOG_DRIVER_FLAGS) $(LOG_DRIVER_FLAGS) -- $(LOG_COMPILE) \
+	"$$tst" $(AM_TESTS_FD_REDIRECT)
 .test.log:
 	@p='$<'; \
 	$(am__set_b); \
@@ -3953,7 +4255,7 @@
 	--show-possibly-lost=no                                 \
 	--leak-resolution=high --num-callers=20			\
 	./$* 2>&1 | tee $$valgrind_log ;			\
-	if grep "==" $$valgrind_log > /dev/null 2>&1; then	\
+	if grep "^==" $$valgrind_log > /dev/null 2>&1; then	\
 	    rm $$valgrind_log;					\
 	    exit 1;						\
 	fi ;							\
@@ -4145,6 +4447,13 @@
 clean-local: clean-local-check
 distclean-local: distclean-local-orc
 
+@WITH_GST_PLAYER_TESTS_TRUE@$(PLAYER_MEDIA_FILES):
+@WITH_GST_PLAYER_TESTS_TRUE@	$(MKDIR_P) media
+@WITH_GST_PLAYER_TESTS_TRUE@	$(WGET) -c http://gstreamer.freedesktop.org/data/media/small/$(subst media/,,$@) -O media/$(subst media/,,$@)
+
+@WITH_GST_PLAYER_TESTS_TRUE@libs/player_dummy.c: $(PLAYER_MEDIA_FILES)
+@WITH_GST_PLAYER_TESTS_TRUE@	touch libs/player_dummy.c
+
 orc/bayer.c: $(top_srcdir)/gst/bayer/gstbayerorc.orc
 	$(MKDIR_P) orc
 	$(ORCC) --test -o $@ $<
diff --git a/tests/check/elements/adaptive_demux_common.c b/tests/check/elements/adaptive_demux_common.c
new file mode 100644
index 0000000..67d724d
--- /dev/null
+++ b/tests/check/elements/adaptive_demux_common.c
@@ -0,0 +1,454 @@
+/* A set of utility functions that are common between elements
+ * based upon GstAdaptiveDemux
+ *
+ * Copyright (c) <2015> YouView TV Ltd
+ *
+ * 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 <gst/check/gstcheck.h>
+#include "adaptive_demux_engine.h"
+#include "adaptive_demux_common.h"
+
+#define GST_TEST_HTTP_SRC_NAME            "testhttpsrc"
+
+struct _GstAdaptiveDemuxTestCaseClass
+{
+  GObjectClass parent_class;
+};
+
+#define gst_adaptive_demux_test_case_parent_class parent_class
+
+static void gst_adaptive_demux_test_case_dispose (GObject * object);
+static void gst_adaptive_demux_test_case_finalize (GObject * object);
+static void gst_adaptive_demux_test_case_clear (GstAdaptiveDemuxTestCase *
+    testData);
+
+G_DEFINE_TYPE (GstAdaptiveDemuxTestCase, gst_adaptive_demux_test_case,
+    G_TYPE_OBJECT);
+
+static void
+gst_adaptive_demux_test_case_class_init (GstAdaptiveDemuxTestCaseClass * klass)
+{
+  GObjectClass *object = G_OBJECT_CLASS (klass);
+
+  object->dispose = gst_adaptive_demux_test_case_dispose;
+  object->finalize = gst_adaptive_demux_test_case_finalize;
+}
+
+static void
+gst_adaptive_demux_test_case_init (GstAdaptiveDemuxTestCase * testData)
+{
+  testData->output_streams = NULL;
+  testData->test_task = NULL;
+  g_rec_mutex_init (&testData->test_task_lock);
+  g_mutex_init (&testData->test_task_state_lock);
+  g_cond_init (&testData->test_task_state_cond);
+  gst_adaptive_demux_test_case_clear (testData);
+}
+
+static void
+gst_adaptive_demux_test_case_clear (GstAdaptiveDemuxTestCase * testData)
+{
+  if (testData->output_streams) {
+    g_list_free (testData->output_streams);
+    testData->output_streams = NULL;
+  }
+  testData->count_of_finished_streams = 0;
+  if (testData->test_task) {
+    gst_task_stop (testData->test_task);
+    gst_task_join (testData->test_task);
+    gst_object_unref (testData->test_task);
+    testData->test_task = NULL;
+  }
+  testData->signal_context = NULL;
+  testData->test_task_state = TEST_TASK_STATE_NOT_STARTED;
+  testData->threshold_for_seek = 0;
+  testData->signal_context = NULL;
+}
+
+
+static void
+gst_adaptive_demux_test_case_dispose (GObject * object)
+{
+  GstAdaptiveDemuxTestCase *testData = GST_ADAPTIVE_DEMUX_TEST_CASE (object);
+
+  gst_adaptive_demux_test_case_clear (testData);
+
+  GST_CALL_PARENT (G_OBJECT_CLASS, dispose, (object));
+}
+
+static void
+gst_adaptive_demux_test_case_finalize (GObject * object)
+{
+  GstAdaptiveDemuxTestCase *testData = GST_ADAPTIVE_DEMUX_TEST_CASE (object);
+
+  g_cond_clear (&testData->test_task_state_cond);
+  g_mutex_clear (&testData->test_task_state_lock);
+  g_rec_mutex_clear (&testData->test_task_lock);
+  if (testData->test_task) {
+    gst_task_stop (testData->test_task);
+    gst_task_join (testData->test_task);
+    gst_object_unref (testData->test_task);
+    testData->test_task = NULL;
+  }
+  if (testData->output_streams) {
+    g_list_free (testData->output_streams);
+    testData->output_streams = NULL;
+  }
+
+  GST_CALL_PARENT (G_OBJECT_CLASS, finalize, (object));
+}
+
+/**
+ * gst_adaptive_demux_test_case_new:
+ *
+ * Creates a new #GstAdaptiveDemuxTestCase. Free with g_object_unref().
+ *
+ * Returns: (transfer full): a new #GstAdaptiveDemuxTestCase
+ */
+GstAdaptiveDemuxTestCase *
+gst_adaptive_demux_test_case_new (void)
+{
+  return g_object_newv (GST_TYPE_ADAPTIVE_DEMUX_TEST_CASE, 0, NULL);
+}
+
+
+GstAdaptiveDemuxTestExpectedOutput *
+gst_adaptive_demux_test_find_test_data_by_stream (GstAdaptiveDemuxTestCase *
+    testData, GstAdaptiveDemuxTestOutputStream * stream, guint * index)
+{
+  gchar *pad_name;
+  GstAdaptiveDemuxTestExpectedOutput *ret = NULL;
+  guint count = 0;
+
+  pad_name = gst_pad_get_name (stream->pad);
+  fail_unless (pad_name != NULL);
+  for (GList * walk = testData->output_streams; walk; walk = g_list_next (walk)) {
+    GstAdaptiveDemuxTestExpectedOutput *td = walk->data;
+    if (strcmp (td->name, pad_name) == 0) {
+      ret = td;
+      if (index)
+        *index = count;
+    }
+    ++count;
+  }
+  g_free (pad_name);
+  return ret;
+}
+
+/* function to validate data received by AppSink */
+gboolean
+gst_adaptive_demux_test_check_received_data (GstAdaptiveDemuxTestEngine *
+    engine, GstAdaptiveDemuxTestOutputStream * stream, GstBuffer * buffer,
+    gpointer user_data)
+{
+  GstMapInfo info;
+  guint pattern;
+  guint64 streamOffset;
+  GstAdaptiveDemuxTestCase *testData = GST_ADAPTIVE_DEMUX_TEST_CASE (user_data);
+  GstAdaptiveDemuxTestExpectedOutput *testOutputStreamData;
+
+  fail_unless (stream != NULL);
+  fail_unless (engine->pipeline != NULL);
+  testOutputStreamData =
+      gst_adaptive_demux_test_find_test_data_by_stream (testData, stream, NULL);
+  fail_unless (testOutputStreamData != NULL);
+  streamOffset = stream->segment_start + stream->segment_received_size;
+  if (testOutputStreamData->expected_data) {
+    gsize size = gst_buffer_get_size (buffer);
+    if (gst_buffer_memcmp (buffer, 0,
+            &testOutputStreamData->expected_data[streamOffset], size) == 0) {
+      return TRUE;
+    }
+    /* If buffers do not match, fall back to a slower byte-based check
+       so that the test can output the position where the received data
+       diverges from expected_data
+     */
+  }
+
+  gst_buffer_map (buffer, &info, GST_MAP_READ);
+
+  GST_DEBUG
+      ("segment_start = %" G_GUINT64_FORMAT " segment_received_size = %"
+      G_GUINT64_FORMAT " bufferSize=%d",
+      stream->segment_start, stream->segment_received_size, (gint) info.size);
+
+  pattern = streamOffset - streamOffset % sizeof (pattern);
+  for (guint64 i = 0; i != info.size; ++i) {
+    guint received = info.data[i];
+    guint expected;
+
+    if (testOutputStreamData->expected_data) {
+      fail_unless (streamOffset + i < testOutputStreamData->expected_size);
+      expected = testOutputStreamData->expected_data[streamOffset + i];
+    } else {
+      gchar pattern_byte_to_read;
+
+      pattern_byte_to_read = (streamOffset + i) % sizeof (pattern);
+      if (pattern_byte_to_read == 0) {
+        pattern = streamOffset + i;
+      }
+
+      expected = (pattern >> (pattern_byte_to_read * 8)) & 0xFF;
+#if 0
+      GST_DEBUG
+          ("received '0x%02x' expected '0x%02x' offset %" G_GUINT64_FORMAT
+          " pattern=%08x byte_to_read=%d",
+          received, expected, i, pattern, pattern_byte_to_read);
+#endif
+    }
+
+    fail_unless (received == expected,
+        "output validation failed: received '0x%02x' expected '0x%02x' byte %"
+        G_GUINT64_FORMAT " offset=%" G_GUINT64_FORMAT "\n", received, expected,
+        i, streamOffset);
+  }
+
+  gst_buffer_unmap (buffer, &info);
+  return TRUE;
+}
+
+/* function to check total size of data received by AppSink
+ * will be called when AppSink receives eos.
+ */
+void
+gst_adaptive_demux_test_check_size_of_received_data (GstAdaptiveDemuxTestEngine
+    * engine, GstAdaptiveDemuxTestOutputStream * stream, gpointer user_data)
+{
+  GstAdaptiveDemuxTestCase *testData = GST_ADAPTIVE_DEMUX_TEST_CASE (user_data);
+  GstAdaptiveDemuxTestExpectedOutput *testOutputStreamData;
+
+  testOutputStreamData =
+      gst_adaptive_demux_test_find_test_data_by_stream (testData, stream, NULL);
+  fail_unless (testOutputStreamData != NULL);
+
+  fail_unless (stream->total_received_size ==
+      testOutputStreamData->expected_size,
+      "size validation failed, expected %d received %d",
+      testOutputStreamData->expected_size, stream->total_received_size);
+  testData->count_of_finished_streams++;
+  if (testData->count_of_finished_streams ==
+      g_list_length (testData->output_streams)) {
+    g_main_loop_quit (engine->loop);
+  }
+}
+
+typedef struct _SeekTaskContext
+{
+  GstElement *pipeline;
+  GstTask *task;
+} SeekTaskContext;
+
+/* function to generate a seek event. Will be run in a separate thread */
+static void
+testSeekTaskDoSeek (gpointer user_data)
+{
+  SeekTaskContext *context = (SeekTaskContext *) user_data;
+  GstTask *task;
+
+  GST_DEBUG ("testSeekTaskDoSeek calling seek");
+
+  /* seek to 5ms.
+   * Because there is only one fragment, we expect the whole file to be
+   * downloaded again
+   */
+  if (!gst_element_seek_simple (GST_ELEMENT (context->pipeline),
+          GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH | GST_SEEK_FLAG_KEY_UNIT,
+          5 * GST_MSECOND)) {
+    fail ("Seek failed!\n");
+  }
+  GST_DEBUG ("seek ok");
+  task = context->task;
+  g_slice_free (SeekTaskContext, context);
+  gst_task_stop (task);
+}
+
+/* function to be called during seek test when demux sends data to AppSink
+ * It monitors the data sent and after a while will generate a seek request.
+ */
+static gboolean
+testSeekAdaptiveDemuxSendsData (GstAdaptiveDemuxTestEngine * engine,
+    GstAdaptiveDemuxTestOutputStream * stream,
+    GstBuffer * buffer, gpointer user_data)
+{
+  GstAdaptiveDemuxTestCase *testData = GST_ADAPTIVE_DEMUX_TEST_CASE (user_data);
+  SeekTaskContext *seekContext;
+  GstAdaptiveDemuxTestExpectedOutput *testOutputStreamData;
+  guint index = 0;
+
+  testOutputStreamData =
+      gst_adaptive_demux_test_find_test_data_by_stream (testData, stream,
+      &index);
+  fail_unless (testOutputStreamData != NULL);
+  /* first entry in testData->output_streams is the
+     PAD on which to perform the seek */
+  if (index == 0 &&
+      testData->test_task == NULL &&
+      (stream->total_received_size + stream->segment_received_size) >=
+      testData->threshold_for_seek) {
+    testData->threshold_for_seek =
+        stream->total_received_size + stream->segment_received_size;
+
+    /* the seek will be to the beginning of the file, so expect to receive
+     * threshold_for_seek + a whole file
+     */
+    testOutputStreamData->expected_size += testData->threshold_for_seek;
+
+    GST_DEBUG ("starting seek task");
+
+    g_mutex_lock (&testData->test_task_state_lock);
+    testData->test_task_state =
+        TEST_TASK_STATE_WAITING_FOR_TESTSRC_STATE_CHANGE;
+    g_mutex_unlock (&testData->test_task_state_lock);
+
+    seekContext = g_slice_new (SeekTaskContext);
+    seekContext->pipeline = engine->pipeline;
+    testData->test_task = seekContext->task =
+        gst_task_new ((GstTaskFunction) testSeekTaskDoSeek, seekContext, NULL);
+    gst_task_set_lock (testData->test_task, &testData->test_task_lock);
+    gst_task_start (testData->test_task);
+
+    GST_DEBUG ("seek task started");
+
+    g_mutex_lock (&testData->test_task_state_lock);
+
+    GST_DEBUG ("waiting for seek task to change state on testsrc");
+
+    /* wait for test_task to run, send a flush start event to AppSink
+     * and change the testhttpsrc element state from PLAYING to PAUSED
+     */
+    while (testData->test_task_state ==
+        TEST_TASK_STATE_WAITING_FOR_TESTSRC_STATE_CHANGE) {
+      g_cond_wait (&testData->test_task_state_cond,
+          &testData->test_task_state_lock);
+    }
+    g_mutex_unlock (&testData->test_task_state_lock);
+    /* we can continue now, but this buffer will be rejected by AppSink
+     * because it is in flushing mode
+     */
+    GST_DEBUG ("seek task changed state on testsrc, resuming");
+  }
+
+  return TRUE;
+}
+
+/* callback called when main_loop detects a state changed event */
+static void
+testSeekOnStateChanged (GstBus * bus, GstMessage * msg, gpointer user_data)
+{
+  GstAdaptiveDemuxTestCase *testData = GST_ADAPTIVE_DEMUX_TEST_CASE (user_data);
+  GstState old_state, new_state;
+  const char *srcName = GST_OBJECT_NAME (msg->src);
+
+  gst_message_parse_state_changed (msg, &old_state, &new_state, NULL);
+  GST_DEBUG ("Element %s changed state from %s to %s",
+      GST_OBJECT_NAME (msg->src),
+      gst_element_state_get_name (old_state),
+      gst_element_state_get_name (new_state));
+
+  if (strstr (srcName, "bin") == srcName &&
+      old_state == GST_STATE_PLAYING && new_state == GST_STATE_PAUSED) {
+    g_mutex_lock (&testData->test_task_state_lock);
+    if (testData->test_task_state ==
+        TEST_TASK_STATE_WAITING_FOR_TESTSRC_STATE_CHANGE) {
+      GST_DEBUG ("changing test_task_state");
+      testData->test_task_state = TEST_TASK_STATE_EXITING;
+      g_cond_signal (&testData->test_task_state_cond);
+    }
+    g_mutex_unlock (&testData->test_task_state_lock);
+  }
+}
+
+/*
+ * Issue a seek request after media segment has started to be downloaded
+ * on the first pad listed in GstAdaptiveDemuxTestOutputStreamData and the
+ * first chunk of at least one byte has already arrived in AppSink
+ */
+static void
+testSeekPreTestCallback (GstAdaptiveDemuxTestEngine * engine,
+    gpointer user_data)
+{
+  GstAdaptiveDemuxTestCase *testData = GST_ADAPTIVE_DEMUX_TEST_CASE (user_data);
+  GstBus *bus;
+
+  /* register a callback to listen for state change events */
+  bus = gst_pipeline_get_bus (GST_PIPELINE (engine->pipeline));
+  gst_bus_add_signal_watch (bus);
+  g_signal_connect (bus, "message::state-changed",
+      G_CALLBACK (testSeekOnStateChanged), testData);
+}
+
+/* function to check total size of data received by AppSink
+ * will be called when AppSink receives eos.
+ */
+void gst_adaptive_demux_test_download_error_size_of_received_data
+    (GstAdaptiveDemuxTestEngine * engine,
+    GstAdaptiveDemuxTestOutputStream * stream, gpointer user_data)
+{
+  GstAdaptiveDemuxTestCase *testData = GST_ADAPTIVE_DEMUX_TEST_CASE (user_data);
+  GstAdaptiveDemuxTestExpectedOutput *testOutputStreamData;
+
+  testOutputStreamData =
+      gst_adaptive_demux_test_find_test_data_by_stream (testData, stream, NULL);
+  fail_unless (testOutputStreamData != NULL);
+  /* expect to receive more than 0 */
+  fail_unless (stream->total_received_size > 0,
+      "size validation failed for %s, expected > 0, received %d",
+      testOutputStreamData->name, stream->total_received_size);
+
+  /* expect to receive less than file size */
+  fail_unless (stream->total_received_size <
+      testOutputStreamData->expected_size,
+      "size validation failed for %s, expected < %d received %d",
+      testOutputStreamData->name, testOutputStreamData->expected_size,
+      stream->total_received_size);
+  if (testData->count_of_finished_streams ==
+      g_list_length (testData->output_streams)) {
+    g_main_loop_quit (engine->loop);
+  }
+}
+
+void
+gst_adaptive_demux_test_seek (const gchar * element_name,
+    const gchar * manifest_uri, GstAdaptiveDemuxTestCase * testData)
+{
+  GstAdaptiveDemuxTestCallbacks cb = { 0 };
+  cb.appsink_received_data = gst_adaptive_demux_test_check_received_data;
+  cb.appsink_eos = gst_adaptive_demux_test_check_size_of_received_data;
+  cb.pre_test = testSeekPreTestCallback;
+  cb.demux_sent_data = testSeekAdaptiveDemuxSendsData;
+  gst_adaptive_demux_test_run (element_name, manifest_uri, &cb, testData);
+  /* the call to g_object_unref of testData will clean up the seek task */
+}
+
+void
+gst_adaptive_demux_test_setup (void)
+{
+  GstRegistry *registry;
+  gboolean ret;
+
+  registry = gst_registry_get ();
+  ret = gst_test_http_src_register_plugin (registry, GST_TEST_HTTP_SRC_NAME);
+  fail_unless (ret);
+}
+
+void
+gst_adaptive_demux_test_teardown (void)
+{
+  gst_test_http_src_install_callbacks (NULL, NULL);
+  gst_test_http_src_set_default_blocksize (0);
+}
diff --git a/tests/check/elements/adaptive_demux_common.h b/tests/check/elements/adaptive_demux_common.h
new file mode 100644
index 0000000..3969582
--- /dev/null
+++ b/tests/check/elements/adaptive_demux_common.h
@@ -0,0 +1,208 @@
+/* A set of utility functions that are common between elements
+ * based upon GstAdaptiveDemux
+ *
+ * Copyright (c) <2015> YouView TV Ltd
+ *
+ * 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_ADAPTIVE_DEMUX_COMMON_TEST_H__
+#define __GST_ADAPTIVE_DEMUX_COMMON_TEST_H__
+
+#include <gst/gst.h>
+#include "adaptive_demux_engine.h"
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_ADAPTIVE_DEMUX_TEST_CASE \
+  (gst_adaptive_demux_test_case_get_type())
+#define GST_ADAPTIVE_DEMUX_TEST_CASE(obj) \
+  (G_TYPE_CHECK_INSTANCE_CAST((obj), GST_TYPE_ADAPTIVE_DEMUX_TEST_CASE, GstAdaptiveDemuxTestCase))
+#define GST_ADAPTIVE_DEMUX_TEST_CASE_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_CAST((klass), GST_TYPE_ADAPTIVE_DEMUX_TEST_CASE, GstAdaptiveDemuxTestCaseClass))
+#define GST_ADAPTIVE_DEMUX_TEST_CASE_GET_CLASS(obj) \
+  (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_ADAPTIVE_DEMUX_TEST_CASE, GstAdaptiveDemuxTestCaseClass))
+#define GST_IS_ADAPTIVE_DEMUX_TEST_CASE(obj) \
+  (G_TYPE_CHECK_INSTANCE_TYPE((obj), GST_TYPE_ADAPTIVE_DEMUX_TEST_CASE))
+#define GST_IS_ADAPTIVE_DEMUX_TEST_CASE_CLASS(klass) \
+  (G_TYPE_CHECK_CLASS_TYPE((klass), GST_TYPE_ADAPTIVE_DEMUX_TEST_CASE))
+
+/**
+ * TestTaskState:
+ * The seek test uses a separate task to perform the seek operation.
+ * After starting the task, the caller blocks until the seek task
+ * flushes the AppSink and changes the GstFakeSoupHTTPSrc element state from
+ * PLAYING to PAUSED.
+ * When that event is detected, the caller is allowed to resume.
+ * Any data that will be sent to AppSink after resume will be rejected because
+ * AppSink is in flushing mode.
+ */
+typedef enum
+{
+  TEST_TASK_STATE_NOT_STARTED,
+  TEST_TASK_STATE_WAITING_FOR_TESTSRC_STATE_CHANGE,
+  TEST_TASK_STATE_EXITING,
+} TestTaskState;
+
+/**
+ * GstAdaptiveDemuxTestExpectedOutput:
+ * Structure used to store output stream related data.
+ * It is used by the test during output validation.
+ * The fields are set by the testcase function prior
+ * to starting the test.
+ */
+typedef struct _GstAdaptiveDemuxTestExpectedOutput
+{
+  /* the name of the demux src pad generating this stream */
+  const char *name;
+  /* the expected size on this stream */
+  guint64 expected_size;
+  /* the expected data on this stream (optional) */
+  const guint8* expected_data;
+} GstAdaptiveDemuxTestExpectedOutput;
+
+typedef struct _GstAdaptiveDemuxTestCaseClass GstAdaptiveDemuxTestCaseClass;
+typedef struct _GstAdaptiveDemuxTestCase
+{
+  GObject parent;
+
+  /* output data used to validate the test
+   * list of GstAdaptiveDemuxTestExpectedOutput, one entry per stream
+   */
+  GList *output_streams; /*GList<GstAdaptiveDemuxTestExpectedOutput>*/
+
+  /* the number of streams that finished.
+   * Main thread will stop the pipeline when all streams are finished
+   * (i.e. count_of_finished_streams == g_list_length(output_streams) )
+   */
+  guint count_of_finished_streams;
+
+  /* taskTesk... is a set of variables that can be used by a test
+   * that needs to perform operations from another thread
+   * For example, it is used by the seek test to perform the seek
+   * operation
+   */
+  GstTask *test_task;
+  GRecMutex test_task_lock;
+  TestTaskState test_task_state;
+  GMutex test_task_state_lock;
+  GCond test_task_state_cond;
+
+  /* seek test will wait for this amount of bytes to be sent by 
+   * demux  to AppSink before triggering a seek request
+   */
+  guint64 threshold_for_seek;
+
+  gpointer signal_context;
+} GstAdaptiveDemuxTestCase;
+
+/* high-level unit test functions */
+
+/**
+ * gst_adaptive_demux_test_setup:
+ * Causes the test HTTP src element to be registered
+ */
+void gst_adaptive_demux_test_setup (void);
+
+void gst_adaptive_demux_test_teardown (void);
+
+GType gst_adaptive_demux_test_case_get_type (void);
+
+/**
+ * gst_adaptive_demux_test_case_new: creates new #GstAdaptiveDemuxTestCase
+ * object. Use #g_object_unref to free.
+ */
+GstAdaptiveDemuxTestCase * gst_adaptive_demux_test_case_new (void) G_GNUC_MALLOC;
+
+/**
+ * gst_adaptive_demux_test_seek: test that element supports seeking
+ * @element_name: The name of the demux element (e.g. "dashdemux")
+ * @manifest_uri: The URI of the manifest to load
+ * @testData: The #GstAdaptiveDemuxTestCase that the test expects the
+ * demux element to produce.
+ * 
+ * Creates a pipeline and starts it. Once data is flowing, request a
+ * seek to almost the start of the stream.
+ */
+void gst_adaptive_demux_test_seek (const gchar * element_name,
+    const gchar * manifest_uri,
+    GstAdaptiveDemuxTestCase *testData);
+
+/* Utility functions for use within a unit test */
+
+/**
+ * gst_adaptive_demux_test_check_size_of_received_data:
+ * @engine: The #GstAdaptiveDemuxTestEngine that caused this callback
+ * @stream: The #GstAdaptiveDemuxTestOutputStream that caused this callback
+ * @user_data: A pointer to a #GstAdaptiveDemuxTestCase object
+ *
+ * This function can be used as an EOS callback to check that the
+ * size of received data equals expected_size. It should be used with
+ * a test that expects the entire file to be downloaded.
+ */
+void gst_adaptive_demux_test_check_size_of_received_data(
+    GstAdaptiveDemuxTestEngine *engine,
+    GstAdaptiveDemuxTestOutputStream * stream, gpointer user_data);
+
+/**
+ * gst_adaptive_demux_test_download_error_size_of_received_data:
+ * @engine: The #GstAdaptiveDemuxTestEngine that caused this callback
+ * @stream: The #GstAdaptiveDemuxTestOutputStream that caused this callback
+ * @user_data: A pointer to a #GstAdaptiveDemuxTestCase object
+ *
+ * This function can be used as an EOS callback to check that the
+ * size of received data is >0 && <expected_size. It should be used with
+ * a test that does not expect the entire file to be downloaded.
+ */
+void gst_adaptive_demux_test_download_error_size_of_received_data (
+    GstAdaptiveDemuxTestEngine *engine,
+    GstAdaptiveDemuxTestOutputStream * stream, gpointer user_data);
+
+/**
+ * gst_adaptive_demux_test_check_received_data:
+ * @engine: The #GstAdaptiveDemuxTestEngine that caused this callback
+ * @stream: The #GstAdaptiveDemuxTestOutputStream that caused this callback
+ * @buffer: The #GstBuffer containing the data to check
+ * @user_data: A pointer to a #GstAdaptiveDemuxTestCase object
+ * Returns: TRUE if buffer contains the expected data.
+ *
+ * This function can be used as an appSinkGotData callback, to check
+ * that the contents of the received data matches the expected data
+ */
+gboolean gst_adaptive_demux_test_check_received_data (
+    GstAdaptiveDemuxTestEngine *engine,
+    GstAdaptiveDemuxTestOutputStream * stream,
+    GstBuffer * buffer,
+    gpointer user_data);
+
+/**
+ * gst_adaptive_demux_test_find_test_data_by_stream:
+ * @testData: The #GstAdaptiveDemuxTestCase object that contains the
+ * output_streams list to search
+ * @stream: the #GstAdaptiveDemuxTestOutputStream to search for
+ * @index: (out) (allow none) the index of the entry in output_streams
+ * Returns: The #GstAdaptiveDemuxTestExpectedOutput that matches @stream, or
+ * %NULL if not found
+ *
+ * Search the list of output test data for the entry that matches stream.
+ */
+GstAdaptiveDemuxTestExpectedOutput * gst_adaptive_demux_test_find_test_data_by_stream (
+    GstAdaptiveDemuxTestCase * testData,
+    GstAdaptiveDemuxTestOutputStream * stream,
+    guint * index);
+
+G_END_DECLS
+#endif /* __GST_ADAPTIVE_DEMUX_COMMON_TEST_H__ */
diff --git a/tests/check/elements/adaptive_demux_engine.c b/tests/check/elements/adaptive_demux_engine.c
new file mode 100644
index 0000000..9c77708
--- /dev/null
+++ b/tests/check/elements/adaptive_demux_engine.c
@@ -0,0 +1,473 @@
+/* A generic test engine for elements based upon GstAdaptiveDemux 
+ *
+ * Copyright (c) <2015> YouView TV Ltd
+ *
+ * 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 <gst/check/gstcheck.h>
+#include "adaptive_demux_engine.h"
+
+typedef struct _GstAdaptiveDemuxTestEnginePrivate
+{
+  GstAdaptiveDemuxTestEngine engine;
+  const GstAdaptiveDemuxTestCallbacks *callbacks;
+  gpointer user_data;
+} GstAdaptiveDemuxTestEnginePrivate;
+
+
+#define GST_TEST_GET_LOCK(d)  (&(((GstAdaptiveDemuxTestEnginePrivate*)(d))->engine.lock))
+#define GST_TEST_LOCK(d)      g_mutex_lock (GST_TEST_GET_LOCK (d))
+#define GST_TEST_UNLOCK(d)    g_mutex_unlock (GST_TEST_GET_LOCK (d))
+
+static void
+adaptive_demux_engine_stream_state_finalize (gpointer data)
+{
+  GstAdaptiveDemuxTestOutputStream *stream =
+      (GstAdaptiveDemuxTestOutputStream *) data;
+  if (stream->appsink)
+    gst_object_unref (stream->appsink);
+  if (stream->pad)
+    gst_object_unref (stream->pad);
+  if (stream->internal_pad)
+    gst_object_unref (stream->internal_pad);
+  g_slice_free (GstAdaptiveDemuxTestOutputStream, stream);
+}
+
+/* get the testOutput entry in testData corresponding to the given AppSink */
+static GstAdaptiveDemuxTestOutputStream *
+getTestOutputDataByAppsink (GstAdaptiveDemuxTestEnginePrivate * priv,
+    GstAppSink * appsink)
+{
+  for (guint i = 0; i < priv->engine.output_streams->len; ++i) {
+    GstAdaptiveDemuxTestOutputStream *state;
+    state = g_ptr_array_index (priv->engine.output_streams, i);
+    if (state->appsink == appsink) {
+      return state;
+    }
+  }
+  ck_abort_msg ("cannot find appsink %p in the output data", appsink);
+  return NULL;
+}
+
+/* get the output stream entry in corresponding to the given Pad */
+static GstAdaptiveDemuxTestOutputStream *
+getTestOutputDataByPad (GstAdaptiveDemuxTestEnginePrivate * priv,
+    GstPad * pad, gboolean abort_if_not_found)
+{
+  for (guint i = 0; i < priv->engine.output_streams->len; ++i) {
+    GstAdaptiveDemuxTestOutputStream *stream;
+    stream = g_ptr_array_index (priv->engine.output_streams, i);
+    if (stream->internal_pad == pad || stream->pad == pad) {
+      return stream;
+    }
+  }
+  if (abort_if_not_found)
+    ck_abort_msg ("cannot find pad %p in the output data", pad);
+  return NULL;
+}
+
+/* callback called when AppSink receives data */
+static GstFlowReturn
+on_appSinkNewSample (GstAppSink * appsink, gpointer user_data)
+{
+  GstAdaptiveDemuxTestEnginePrivate *priv =
+      (GstAdaptiveDemuxTestEnginePrivate *) user_data;
+  GstAdaptiveDemuxTestEngine *engine;
+  GstAdaptiveDemuxTestOutputStream *testOutputStream = NULL;
+  GstSample *sample;
+  GstBuffer *buffer;
+  gboolean ret = TRUE;
+
+  fail_unless (priv != NULL);
+  GST_TEST_LOCK (priv);
+  engine = &priv->engine;
+  testOutputStream = getTestOutputDataByAppsink (priv, appsink);
+
+  sample = gst_app_sink_pull_sample (appsink);
+  fail_unless (sample != NULL);
+  buffer = gst_sample_get_buffer (sample);
+  fail_unless (buffer != NULL);
+
+  /* call the test callback, if registered */
+  if (priv->callbacks->appsink_received_data)
+    ret = priv->callbacks->appsink_received_data (engine,
+        testOutputStream, buffer, priv->user_data);
+
+  testOutputStream->segment_received_size += gst_buffer_get_size (buffer);
+
+  gst_sample_unref (sample);
+
+  GST_TEST_UNLOCK (priv);
+
+  if (!ret)
+    return GST_FLOW_EOS;
+
+  return GST_FLOW_OK;
+}
+
+/* callback called when AppSink receives eos */
+static void
+on_appSinkEOS (GstAppSink * appsink, gpointer user_data)
+{
+  GstAdaptiveDemuxTestEnginePrivate *priv =
+      (GstAdaptiveDemuxTestEnginePrivate *) user_data;
+  GstAdaptiveDemuxTestOutputStream *testOutputStream = NULL;
+
+  fail_unless (priv != NULL);
+  GST_TEST_LOCK (priv);
+  testOutputStream = getTestOutputDataByAppsink (priv, appsink);
+
+  testOutputStream->total_received_size +=
+      testOutputStream->segment_received_size;
+  testOutputStream->segment_received_size = 0;
+
+  if (priv->callbacks->appsink_eos)
+    priv->callbacks->appsink_eos (&priv->engine,
+        testOutputStream, priv->user_data);
+
+  GST_TEST_UNLOCK (priv);
+}
+
+/* callback called when demux sends data to AppSink */
+static GstPadProbeReturn
+on_demux_sent_data (GstPad * pad, GstPadProbeInfo * info, gpointer data)
+{
+  GstAdaptiveDemuxTestEnginePrivate *priv =
+      (GstAdaptiveDemuxTestEnginePrivate *) data;
+  GstAdaptiveDemuxTestOutputStream *stream = NULL;
+  GstBuffer *buffer;
+
+  buffer = GST_PAD_PROBE_INFO_BUFFER (info);
+
+  GST_TEST_LOCK (priv);
+  stream = getTestOutputDataByPad (priv, pad, TRUE);
+
+  if (priv->callbacks->demux_sent_data) {
+    (*priv->callbacks->demux_sent_data) (&priv->engine,
+        stream, buffer, priv->user_data);
+  }
+
+  GST_TEST_UNLOCK (priv);
+  return GST_PAD_PROBE_OK;
+}
+
+/* callback called when demux receives events from GstFakeSoupHTTPSrc */
+static GstPadProbeReturn
+on_demuxReceivesEvent (GstPad * pad, GstPadProbeInfo * info, gpointer data)
+{
+  GstAdaptiveDemuxTestEnginePrivate *priv =
+      (GstAdaptiveDemuxTestEnginePrivate *) data;
+  GstAdaptiveDemuxTestOutputStream *stream = NULL;
+  GstEvent *event;
+  const GstSegment *segment;
+
+  event = GST_PAD_PROBE_INFO_EVENT (info);
+  GST_DEBUG ("Received event %" GST_PTR_FORMAT " on pad %" GST_PTR_FORMAT,
+      event, pad);
+
+  if (GST_EVENT_TYPE (event) == GST_EVENT_SEGMENT) {
+    /* a new segment will start arriving
+     * update segment_start used by pattern validation
+     */
+    gst_event_parse_segment (event, &segment);
+
+    GST_TEST_LOCK (priv);
+    stream = getTestOutputDataByPad (priv, pad, TRUE);
+    stream->total_received_size += stream->segment_received_size;
+    stream->segment_received_size = 0;
+    stream->segment_start = segment->start;
+    GST_TEST_UNLOCK (priv);
+  } else if (GST_EVENT_TYPE (event) == GST_EVENT_EOS) {
+    GST_TEST_LOCK (priv);
+    stream = getTestOutputDataByPad (priv, pad, TRUE);
+    if (priv->callbacks->demux_sent_eos) {
+      priv->callbacks->demux_sent_eos (&priv->engine, stream, priv->user_data);
+    }
+    GST_TEST_UNLOCK (priv);
+  }
+
+  return GST_PAD_PROBE_OK;
+}
+
+/* callback called when demux creates a src pad.
+ * We will create an AppSink to get the data
+ */
+static void
+on_demuxNewPad (GstElement * demux, GstPad * pad, gpointer user_data)
+{
+  GstAdaptiveDemuxTestEnginePrivate *priv =
+      (GstAdaptiveDemuxTestEnginePrivate *) user_data;
+  GstElement *pipeline;
+  GstElement *sink;
+  gboolean ret;
+  gchar *name;
+  GstPad *internal_pad;
+  GstAppSinkCallbacks appSinkCallbacks;
+  GstAdaptiveDemuxTestOutputStream *stream;
+  GObjectClass *gobject_class;
+
+  fail_unless (priv != NULL);
+  name = gst_pad_get_name (pad);
+
+  stream = g_slice_new0 (GstAdaptiveDemuxTestOutputStream);
+  GST_DEBUG ("created pad %p", pad);
+
+  sink = gst_element_factory_make ("appsink", name);
+  g_free (name);
+  fail_unless (sink != NULL);
+
+  GST_TEST_LOCK (priv);
+
+  /* register the AppSink pointer in the test output data */
+  gst_object_ref (sink);
+  stream->appsink = GST_APP_SINK (sink);
+
+  appSinkCallbacks.eos = on_appSinkEOS;
+  appSinkCallbacks.new_preroll = NULL;
+  appSinkCallbacks.new_sample = on_appSinkNewSample;
+
+  gst_app_sink_set_callbacks (GST_APP_SINK (sink), &appSinkCallbacks, priv,
+      NULL);
+
+  gst_pad_add_probe (pad, GST_PAD_PROBE_TYPE_BUFFER,
+      (GstPadProbeCallback) on_demux_sent_data, priv, NULL);
+  gobject_class = G_OBJECT_GET_CLASS (sink);
+  if (g_object_class_find_property (gobject_class, "sync")) {
+    GST_DEBUG ("Setting sync=FALSE on AppSink");
+    g_object_set (G_OBJECT (sink), "sync", FALSE, NULL);
+  }
+  stream->pad = gst_object_ref (pad);
+  internal_pad =
+      GST_PAD_CAST (gst_proxy_pad_get_internal (GST_PROXY_PAD (pad)));
+
+  gst_pad_add_probe (internal_pad, GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM,
+      (GstPadProbeCallback) on_demuxReceivesEvent, priv, NULL);
+
+  /* keep the reference to the internal_pad.
+   * We will need it to identify the stream in the on_demuxReceivesEvent callback
+   */
+  stream->internal_pad = internal_pad;
+
+  g_ptr_array_add (priv->engine.output_streams, stream);
+  GST_TEST_UNLOCK (priv);
+
+  pipeline = GST_ELEMENT (gst_element_get_parent (demux));
+  fail_unless (pipeline != NULL);
+  ret = gst_bin_add (GST_BIN (pipeline), sink);
+  fail_unless_equals_int (ret, TRUE);
+  gst_object_unref (pipeline);
+  ret = gst_element_link (demux, sink);
+  fail_unless_equals_int (ret, TRUE);
+  ret = gst_element_sync_state_with_parent (sink);
+  fail_unless_equals_int (ret, TRUE);
+  GST_TEST_LOCK (priv);
+  if (priv->callbacks->demux_pad_added) {
+    priv->callbacks->demux_pad_added (&priv->engine, stream, priv->user_data);
+  }
+  GST_TEST_UNLOCK (priv);
+}
+
+/* callback called when demux removes a src pad.
+ * We remove the AppSink associated with this pad
+ */
+static void
+on_demuxPadRemoved (GstElement * demux, GstPad * pad, gpointer user_data)
+{
+  GstAdaptiveDemuxTestEnginePrivate *priv =
+      (GstAdaptiveDemuxTestEnginePrivate *) user_data;
+  GstAdaptiveDemuxTestOutputStream *stream = NULL;
+
+  fail_unless (priv != NULL);
+
+  GST_DEBUG ("Pad removed: %" GST_PTR_FORMAT, pad);
+
+  GST_TEST_LOCK (priv);
+  stream = getTestOutputDataByPad (priv, pad, FALSE);
+  if (stream) {
+    GstStateChangeReturn ret;
+    GstState currentState, pending;
+    GstElement *appSink;
+
+    if (priv->callbacks->demux_pad_removed) {
+      priv->callbacks->demux_pad_removed (&priv->engine, stream,
+          priv->user_data);
+    }
+    fail_unless (stream->appsink != NULL);
+    fail_unless (stream->internal_pad != NULL);
+    gst_object_unref (stream->internal_pad);
+    stream->internal_pad = NULL;
+    appSink = GST_ELEMENT (stream->appsink);
+    ret = gst_element_get_state (appSink, &currentState, &pending, 0);
+    if ((ret == GST_STATE_CHANGE_SUCCESS && currentState == GST_STATE_PLAYING)
+        || (ret == GST_STATE_CHANGE_ASYNC && pending == GST_STATE_PLAYING)) {
+      GST_DEBUG ("Changing AppSink element to PAUSED");
+      gst_element_set_state (appSink, GST_STATE_PAUSED);
+    }
+  }
+  GST_TEST_UNLOCK (priv);
+}
+
+/* callback called when main_loop detects an error message
+ * We will signal main loop to quit
+ */
+static void
+on_ErrorMessageOnBus (GstBus * bus, GstMessage * msg, gpointer user_data)
+{
+  GstAdaptiveDemuxTestEnginePrivate *priv =
+      (GstAdaptiveDemuxTestEnginePrivate *) user_data;
+  GError *err = NULL;
+  gchar *dbg_info = NULL;
+
+  gst_message_parse_error (msg, &err, &dbg_info);
+  GST_DEBUG ("ERROR from element %s: '%s'. Debugging info: %s",
+      GST_OBJECT_NAME (msg->src), err->message, (dbg_info) ? dbg_info : "none");
+  g_error_free (err);
+  g_free (dbg_info);
+
+  GST_TEST_LOCK (priv);
+
+  fail_unless (priv->callbacks->bus_error_message,
+      "unexpected error detected on bus");
+
+  priv->callbacks->bus_error_message (&priv->engine, msg, priv->user_data);
+
+  GST_TEST_UNLOCK (priv);
+}
+
+static gboolean
+start_pipeline_playing (gpointer user_data)
+{
+  GstAdaptiveDemuxTestEnginePrivate *priv =
+      (GstAdaptiveDemuxTestEnginePrivate *) user_data;
+  GstStateChangeReturn stateChange;
+
+  GST_DEBUG ("Moving pipeline to PLAYING state");
+  stateChange =
+      gst_element_set_state (priv->engine.pipeline, GST_STATE_PLAYING);
+  fail_unless (stateChange != GST_STATE_CHANGE_FAILURE);
+  GST_DEBUG ("PLAYING stateChange = %d", stateChange);
+  return FALSE;
+}
+
+/*
+ * Create a demux element, run a test using the input data and check
+ * the output data
+ */
+void
+gst_adaptive_demux_test_run (const gchar * element_name,
+    const gchar * manifest_uri,
+    const GstAdaptiveDemuxTestCallbacks * callbacks, gpointer user_data)
+{
+  GstBus *bus;
+  GstElement *demux;
+  GstElement *manifest_source;
+  gboolean ret;
+  GstStateChangeReturn stateChange;
+  GstAdaptiveDemuxTestEnginePrivate *priv;
+
+  priv = g_slice_new0 (GstAdaptiveDemuxTestEnginePrivate);
+  priv->engine.output_streams =
+      g_ptr_array_new_with_free_func
+      (adaptive_demux_engine_stream_state_finalize);
+  g_mutex_init (&priv->engine.lock);
+  priv->callbacks = callbacks;
+  priv->user_data = user_data;
+  priv->engine.loop = g_main_loop_new (NULL, TRUE);
+  fail_unless (priv->engine.loop != NULL);
+  GST_TEST_LOCK (priv);
+  priv->engine.pipeline = gst_pipeline_new ("pipeline");
+  fail_unless (priv->engine.pipeline != NULL);
+  GST_DEBUG ("created pipeline %" GST_PTR_FORMAT, priv->engine.pipeline);
+
+  /* register a callback to listen for error messages */
+  bus = gst_pipeline_get_bus (GST_PIPELINE (priv->engine.pipeline));
+  gst_bus_add_signal_watch_full (bus, G_PRIORITY_HIGH);
+  g_signal_connect (bus, "message::error",
+      G_CALLBACK (on_ErrorMessageOnBus), priv);
+
+  manifest_source =
+      gst_element_make_from_uri (GST_URI_SRC, manifest_uri, NULL, NULL);
+  fail_unless (manifest_source != NULL);
+  priv->engine.manifest_source = manifest_source;
+
+  demux = gst_check_setup_element (element_name);
+  fail_unless (demux != NULL);
+  priv->engine.demux = demux;
+  GST_DEBUG ("created demux %" GST_PTR_FORMAT, demux);
+
+  g_signal_connect (demux, "pad-added", G_CALLBACK (on_demuxNewPad), priv);
+  g_signal_connect (demux, "pad-removed",
+      G_CALLBACK (on_demuxPadRemoved), priv);
+
+  gst_bin_add_many (GST_BIN (priv->engine.pipeline), manifest_source, demux,
+      NULL);
+  ASSERT_OBJECT_REFCOUNT (manifest_source, element_name, 1);
+  ASSERT_OBJECT_REFCOUNT (demux, element_name, 1);
+
+  ret = gst_element_link (manifest_source, demux);
+  fail_unless_equals_int (ret, TRUE);
+
+  /* call a test callback before we start the pipeline */
+  if (callbacks->pre_test)
+    (*callbacks->pre_test) (&priv->engine, priv->user_data);
+
+  GST_TEST_UNLOCK (priv);
+
+  GST_DEBUG ("Starting pipeline");
+  stateChange = gst_element_set_state (priv->engine.pipeline, GST_STATE_PAUSED);
+  fail_unless (stateChange != GST_STATE_CHANGE_FAILURE);
+  /* wait for completion of the move to PAUSED */
+  stateChange = gst_element_get_state (priv->engine.pipeline, NULL, NULL,
+      GST_CLOCK_TIME_NONE);
+  fail_unless (stateChange != GST_STATE_CHANGE_FAILURE);
+
+  g_idle_add ((GSourceFunc) start_pipeline_playing, priv);
+
+  /* block until a callback calls g_main_loop_quit (engine.loop) */
+  GST_DEBUG ("main thread waiting for streams to finish");
+  g_main_loop_run (priv->engine.loop);
+  GST_DEBUG ("main thread finished. Stopping pipeline");
+
+  /* no need to use gst_element_get_state as the move the GST_STATE_NULL
+     is always synchronous */
+  stateChange = gst_element_set_state (priv->engine.pipeline, GST_STATE_NULL);
+  fail_unless (stateChange != GST_STATE_CHANGE_FAILURE);
+
+  GST_TEST_LOCK (priv);
+
+  /* call a test callback after the stop of the pipeline */
+  if (callbacks->post_test)
+    (*callbacks->post_test) (&priv->engine, priv->user_data);
+
+  g_signal_handlers_disconnect_by_func (bus,
+      G_CALLBACK (on_ErrorMessageOnBus), priv);
+  gst_bus_remove_signal_watch (bus);
+  g_signal_handlers_disconnect_by_func (demux, G_CALLBACK (on_demuxNewPad),
+      priv);
+  g_signal_handlers_disconnect_by_func (demux, G_CALLBACK (on_demuxPadRemoved),
+      priv);
+
+  GST_DEBUG ("main thread pipeline stopped");
+  gst_object_unref (priv->engine.pipeline);
+  priv->engine.pipeline = NULL;
+  g_main_loop_unref (priv->engine.loop);
+  g_ptr_array_unref (priv->engine.output_streams);
+
+  GST_TEST_UNLOCK (priv);
+  g_mutex_clear (&priv->engine.lock);
+  g_slice_free (GstAdaptiveDemuxTestEnginePrivate, priv);
+}
diff --git a/tests/check/elements/adaptive_demux_engine.h b/tests/check/elements/adaptive_demux_engine.h
new file mode 100644
index 0000000..267d7e8
--- /dev/null
+++ b/tests/check/elements/adaptive_demux_engine.h
@@ -0,0 +1,185 @@
+/* A generic test engine for elements based upon GstAdaptiveDemux 
+ *
+ * Copyright (c) <2015> YouView TV Ltd
+ *
+ * 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_ADAPTIVE_DEMUX_TEST_ENGINE_H__
+#define __GST_ADAPTIVE_DEMUX_TEST_ENGINE_H__
+
+#include <gst/gst.h>
+#include <gst/app/gstappsink.h>
+#include "test_http_src.h"
+
+G_BEGIN_DECLS
+
+typedef struct _GstAdaptiveDemuxTestEngine GstAdaptiveDemuxTestEngine;
+
+typedef struct _GstAdaptiveDemuxTestOutputStream {
+  /* the GstAppSink element getting the data for this stream */
+  GstAppSink *appsink;
+  GstPad *pad;
+  /* the internal pad of adaptivedemux element used to send data to the GstAppSink element */
+  GstPad *internal_pad;
+  /* current segment start offset */
+  guint64 segment_start;
+  /* the size received so far on this segment */
+  guint64 segment_received_size;
+  /* the total size received so far on this stream, excluding current segment */
+  guint64 total_received_size;
+} GstAdaptiveDemuxTestOutputStream;
+
+/* GstAdaptiveDemuxTestCallbacks: contains various callbacks that can
+ * be registered by a test. Not all callbacks needs to be configured
+ * by a test. A callback that is not required by a test must be set
+ * to NULL.
+ */
+typedef struct _GstAdaptiveDemuxTestCallbacks
+{
+  /**
+   * pre_test: called before starting the pipeline
+   * @engine: #GstAdaptiveDemuxTestEngine
+   * @user_data: the user_data passed to gst_adaptive_demux_test_run()
+   */
+  void (*pre_test) (GstAdaptiveDemuxTestEngine *engine, gpointer user_data);
+  
+  /**
+   * post_test: called after stopping the pipeline.
+   * @engine: #GstAdaptiveDemuxTestEngine
+   * @user_data: the user_data passed to gst_adaptive_demux_test_run()
+   */
+  void (*post_test) (GstAdaptiveDemuxTestEngine *engine, gpointer user_data);
+
+  /**
+   * appsink_received_data: called each time AppSink receives data
+   * @engine: #GstAdaptiveDemuxTestEngine
+   * @stream: #GstAdaptiveDemuxTestOutputStream
+   * @buffer: the #GstBuffer that was recevied by #GstAppSink
+   * @user_data: the user_data passed to gst_adaptive_demux_test_run()
+   * Returns: #TRUE to continue processing, #FALSE to cause EOS
+   *
+   * Can be used by a test to perform additional operations (eg validate
+   * output data)
+   */
+  gboolean (*appsink_received_data) (GstAdaptiveDemuxTestEngine *engine,
+      GstAdaptiveDemuxTestOutputStream * stream,
+      GstBuffer * buffer, gpointer user_data);
+
+  /**
+   * appsink_eos: called each time AppSink receives eos
+   * @engine: #GstAdaptiveDemuxTestEngine
+   * @stream: #GstAdaptiveDemuxTestOutputStream
+   * @user_data: the user_data passed to gst_adaptive_demux_test_run()
+   *
+   * Can be used by a test to perform additional operations (eg validate
+   * output data)
+   */
+  void (*appsink_eos) (GstAdaptiveDemuxTestEngine *engine,
+      GstAdaptiveDemuxTestOutputStream * stream, gpointer user_data);
+
+  /**
+   * demux_pad_added: called each time the demux creates a new pad
+   * @engine: #GstAdaptiveDemuxTestEngine
+   * @stream: the #GstAdaptiveDemuxTestOutputStream that has been created
+   * @user_data: the user_data passed to gst_adaptive_demux_test_run()
+   */
+  void (*demux_pad_added) (GstAdaptiveDemuxTestEngine * engine,
+      GstAdaptiveDemuxTestOutputStream * stream, gpointer user_data);
+
+  /**
+   * demux_pad_removed: called each time the demux removes a pad
+   * @engine: #GstAdaptiveDemuxTestEngine
+   * @stream: the #GstAdaptiveDemuxTestOutputStream that will no longer
+   * be used
+   * @user_data: the user_data passed to gst_adaptive_demux_test_run()
+   */
+  void (*demux_pad_removed) (GstAdaptiveDemuxTestEngine * engine,
+      GstAdaptiveDemuxTestOutputStream * stream, gpointer user_data);
+
+  /**
+   * demux_sent_data: called each time the demux sends data to AppSink
+   * @engine: #GstAdaptiveDemuxTestEngine
+   * @stream: #GstAdaptiveDemuxTestOutputStream
+   * @buffer: the #GstBuffer that was sent by demux
+   * @user_data: the user_data passed to gst_adaptive_demux_test_run()
+   */
+  gboolean (*demux_sent_data) (GstAdaptiveDemuxTestEngine *engine,
+      GstAdaptiveDemuxTestOutputStream * stream,
+      GstBuffer * buffer, gpointer user_data);
+
+  /**
+   * demux_sent_eos: called each time demux send an EOS event
+   * @engine: #GstAdaptiveDemuxTestEngine
+   * @stream: #GstAdaptiveDemuxTestOutputStream
+   * @user_data: the user_data passed to gst_adaptive_demux_test_run()
+   * Can be used by a test to perform additional operations (eg validate
+   * output data)
+   */
+  void (*demux_sent_eos) (GstAdaptiveDemuxTestEngine *engine,
+      GstAdaptiveDemuxTestOutputStream * stream, gpointer user_data);
+  
+  /**
+   * bus_error_message: called if an error is posted to the bus
+   * @engine: #GstAdaptiveDemuxTestEngine
+   * @msg: the #GstMessage that contains the error
+   * @user_data: the user_data passed to gst_adaptive_demux_test_run()
+   *
+   * The callback can decide if this error is expected, or to fail
+   * the test
+   */
+  void (*bus_error_message)(GstAdaptiveDemuxTestEngine *engine,
+      GstMessage * msg, gpointer user_data);
+} GstAdaptiveDemuxTestCallbacks;
+
+/* structure containing all data used by a test
+ * Any callback defined by a test will receive this as first parameter
+ */
+struct _GstAdaptiveDemuxTestEngine
+{
+  GstElement *pipeline;
+  GstElement *demux;
+  GstElement *manifest_source;
+  GMainLoop *loop;
+  GPtrArray *output_streams; /* GPtrArray<GstAdaptiveDemuxTestOutputStream> */
+  /* mutex to lock accesses to this structure when data is shared 
+   * between threads */
+  GMutex lock;
+};
+
+/**
+ * gst_adaptive_demux_test_run:
+ * @element_name: The name of the demux element (e.g. "dashdemux")
+ * @manifest_uri: The URI of the manifest to load
+ * @callbacks: The callbacks to use while the test is in operating
+ * @user_data: Opaque pointer that is passed to every callback
+ *
+ * Creates a pipeline with the specified demux element in it,
+ * connect a testhttpsrc element to this demux element and
+ * request manifest_uri. When the demux element adds a new
+ * pad, the engine will create an AppSink element and attach
+ * it to this pad. 
+ *
+ * Information about these pads is collected in 
+ * GstAdaptiveDemuxTestEngine::output_streams
+ */
+void gst_adaptive_demux_test_run (const gchar * element_name,
+    const gchar * manifest_uri,
+    const GstAdaptiveDemuxTestCallbacks * callbacks,
+    gpointer user_data);
+
+G_END_DECLS
+#endif /* __GST_ADAPTIVE_DEMUX_TEST_ENGINE_H__ */
diff --git a/tests/check/elements/baseaudiovisualizer.c b/tests/check/elements/baseaudiovisualizer.c
deleted file mode 100644
index f0fd93a..0000000
--- a/tests/check/elements/baseaudiovisualizer.c
+++ /dev/null
@@ -1,178 +0,0 @@
-/* GStreamer
- * Copyright (C) <2011> Stefan Kost <ensonic@users.sf.net>
- *
- * unit test for the baseaudiovisualizer class
- *
- * 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 "../../gst/audiovisualizers/gstaudiovisualizer.c"
-#undef GST_CAT_DEFAULT
-
-#include <gst/check/gstcheck.h>
-#include <string.h>
-
-/* dummy subclass for testing */
-
-#define GST_TYPE_TEST_SCOPE            (gst_test_scope_get_type())
-#define GST_TEST_SCOPE(obj)            (G_TYPE_CHECK_INSTANCE_CAST((obj),GST_TYPE_TEST_SCOPE,GstTestScope))
-#define GST_TEST_SCOPE_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST((klass),GST_TYPE_TEST_SCOPE,GstTestScopeClass))
-typedef struct _GstTestScope GstTestScope;
-typedef struct _GstTestScopeClass GstTestScopeClass;
-
-struct _GstTestScope
-{
-  GstAudioVisualizer parent;
-};
-
-struct _GstTestScopeClass
-{
-  GstAudioVisualizerClass parent_class;
-};
-
-static GstStaticPadTemplate gst_test_scope_src_template =
-GST_STATIC_PAD_TEMPLATE ("src",
-    GST_PAD_SRC,
-    GST_PAD_ALWAYS,
-    GST_STATIC_CAPS (GST_VIDEO_CAPS_MAKE ("xRGB"))
-    );
-
-static GstStaticPadTemplate gst_test_scope_sink_template =
-GST_STATIC_PAD_TEMPLATE ("sink",
-    GST_PAD_SINK,
-    GST_PAD_ALWAYS,
-    GST_STATIC_CAPS ("audio/x-raw, "
-        "format = (string) " GST_AUDIO_NE (S16) ", "
-        "layout = (string) interleaved, "
-        "channels = (int) 2, "
-        "channel-mask = (bitmask) 3, " "rate = (int) 44100")
-    );
-
-static GType gst_test_scope_get_type (void);
-
-G_DEFINE_TYPE (GstTestScope, gst_test_scope, GST_TYPE_AUDIO_VISUALIZER);
-
-static void
-gst_test_scope_class_init (GstTestScopeClass * g_class)
-{
-  GstElementClass *element_class = GST_ELEMENT_CLASS (g_class);
-
-  gst_element_class_set_static_metadata (element_class, "test scope",
-      "Visualization",
-      "Dummy test scope", "Stefan Kost <ensonic@users.sf.net>");
-
-  gst_element_class_add_pad_template (element_class,
-      gst_static_pad_template_get (&gst_test_scope_src_template));
-  gst_element_class_add_pad_template (element_class,
-      gst_static_pad_template_get (&gst_test_scope_sink_template));
-}
-
-static void
-gst_test_scope_init (GstTestScope * scope)
-{
-  /* do nothing */
-}
-
-/* tests */
-#define CAPS "audio/x-raw, "  \
-        "format = (string) " GST_AUDIO_NE (S16) ", " \
-        "layout = (string) interleaved, " \
-        "rate = (int) 44100, " \
-        "channels = (int) 2, " \
-        "channel-mask = (bitmask) 3"
-
-static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
-    GST_PAD_SINK,
-    GST_PAD_ALWAYS,
-    GST_STATIC_CAPS ("video/x-raw, "
-        "format = (string) xRGB, "
-        "width = (int) 320, "
-        "height = (int) 240, " "framerate = (fraction) 30/1")
-    );
-static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
-    GST_PAD_SRC,
-    GST_PAD_ALWAYS,
-    GST_STATIC_CAPS (CAPS)
-    );
-
-GST_START_TEST (count_in_out)
-{
-  GstElement *elem;
-  GstPad *srcpad, *sinkpad;
-  GstBuffer *buffer;
-  GstCaps *caps;
-
-  /* setup up */
-  elem = gst_check_setup_element ("testscope");
-  srcpad = gst_check_setup_src_pad (elem, &srctemplate);
-  sinkpad = gst_check_setup_sink_pad (elem, &sinktemplate);
-  gst_pad_set_active (srcpad, TRUE);
-  gst_pad_set_active (sinkpad, TRUE);
-
-  fail_unless (gst_element_set_state (elem,
-          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
-      "could not set to playing");
-
-  caps = gst_caps_from_string (CAPS);
-  gst_check_setup_events (srcpad, elem, caps, GST_FORMAT_TIME);
-  gst_caps_unref (caps);
-
-  /* push 1s audio to get 30 video-frames */
-  buffer = gst_buffer_new_and_alloc (44100 * 2 * sizeof (gint16));
-  ASSERT_BUFFER_REFCOUNT (buffer, "buffer", 1);
-
-  /* pushing gives away my reference ... */
-  fail_unless (gst_pad_push (srcpad, buffer) == GST_FLOW_OK);
-  /* ... but it ends up being collected on the global buffer list */
-  ASSERT_BUFFER_REFCOUNT (buffer, "buffer", 1);
-  fail_unless_equals_int (g_list_length (buffers), 30);
-
-  /* clean up */
-  g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
-  g_list_free (buffers);
-  buffers = NULL;
-
-  gst_pad_set_active (srcpad, FALSE);
-  gst_pad_set_active (sinkpad, FALSE);
-  gst_check_teardown_src_pad (elem);
-  gst_check_teardown_sink_pad (elem);
-  gst_check_teardown_element (elem);
-}
-
-GST_END_TEST;
-
-static void
-baseaudiovisualizer_init (void)
-{
-  gst_element_register (NULL, "testscope", GST_RANK_NONE, GST_TYPE_TEST_SCOPE);
-}
-
-static Suite *
-baseaudiovisualizer_suite (void)
-{
-  Suite *s = suite_create ("baseaudiovisualizer");
-  TCase *tc_chain = tcase_create ("general");
-
-  suite_add_tcase (s, tc_chain);
-  tcase_add_checked_fixture (tc_chain, baseaudiovisualizer_init, NULL);
-
-  tcase_add_test (tc_chain, count_in_out);
-
-  return s;
-}
-
-
-GST_CHECK_MAIN (baseaudiovisualizer);
diff --git a/tests/check/elements/compositor.c b/tests/check/elements/compositor.c
index ccd68a1..77c65cf 100644
--- a/tests/check/elements/compositor.c
+++ b/tests/check/elements/compositor.c
@@ -1444,6 +1444,50 @@
 
 GST_END_TEST;
 
+/* Test that the GST_ELEMENT(vagg)->sinkpads GList is always sorted by zorder */
+GST_START_TEST (test_pad_z_order)
+{
+  GstElement *compositor;
+  GstPad *sinkpad1, *sinkpad2, *sinkpad3;
+  guint zorder1, zorder2;
+  GList *sinkpads;
+
+  GST_INFO ("preparing test");
+
+  compositor = gst_element_factory_make ("compositor", NULL);
+  sinkpad1 = gst_element_get_request_pad (compositor, "sink_%u");
+  sinkpad2 = gst_element_get_request_pad (compositor, "sink_%u");
+
+  /* Pads requested later have a higher z-order than earlier ones by default */
+  g_object_get (sinkpad1, "zorder", &zorder1, NULL);
+  g_object_get (sinkpad2, "zorder", &zorder2, NULL);
+  ck_assert_int_gt (zorder2, zorder1);
+  sinkpads = GST_ELEMENT (compositor)->sinkpads;
+  ck_assert_ptr_eq (sinkpads->data, sinkpad1);
+  ck_assert_ptr_eq (sinkpads->next->data, sinkpad2);
+
+  /* Make sinkpad1's zorder the largest, which should re-sort the sinkpads */
+  g_object_set (sinkpad1, "zorder", zorder2 + 1, NULL);
+  sinkpads = GST_ELEMENT (compositor)->sinkpads;
+  ck_assert_ptr_eq (sinkpads->data, sinkpad2);
+  ck_assert_ptr_eq (sinkpads->next->data, sinkpad1);
+
+  /* Get a new pad, which should be the highest pad now */
+  sinkpad3 = gst_element_get_request_pad (compositor, "sink_%u");
+  sinkpads = GST_ELEMENT (compositor)->sinkpads;
+  ck_assert_ptr_eq (sinkpads->data, sinkpad2);
+  ck_assert_ptr_eq (sinkpads->next->data, sinkpad1);
+  ck_assert_ptr_eq (sinkpads->next->next->data, sinkpad3);
+
+  /* cleanup */
+  gst_object_unref (compositor);
+  gst_object_unref (sinkpad1);
+  gst_object_unref (sinkpad2);
+  gst_object_unref (sinkpad3);
+}
+
+GST_END_TEST;
+
 typedef struct
 {
   gint buffers_sent;
@@ -1628,6 +1672,7 @@
   tcase_add_test (tc_chain, test_segment_base_handling);
   tcase_add_test (tc_chain, test_obscured_skipped);
   tcase_add_test (tc_chain, test_ignore_eos);
+  tcase_add_test (tc_chain, test_pad_z_order);
   tcase_add_test (tc_chain, test_start_time_zero_live_drop_0);
   tcase_add_test (tc_chain, test_start_time_zero_live_drop_3);
   tcase_add_test (tc_chain, test_start_time_zero_live_drop_3_unlinked_1);
diff --git a/tests/check/elements/curlftpsink.c b/tests/check/elements/curlftpsink.c
index f8706f7..185a152 100644
--- a/tests/check/elements/curlftpsink.c
+++ b/tests/check/elements/curlftpsink.c
@@ -63,8 +63,7 @@
       "epsv-mode", &res_epsv_mode,
       "create-dirs", &res_create_dirs,
       "create-tmp-file", &res_create_tmpfile,
-      "temp-file-name", &res_tmp_file_name,
-      NULL);
+      "temp-file-name", &res_tmp_file_name, NULL);
 
   fail_unless (strncmp (res_location, "mylocation", strlen ("mylocation"))
       == 0);
@@ -72,12 +71,13 @@
       == 0);
   fail_unless (strncmp (res_ftp_port, "1.2.3.4:0", strlen ("1.2.3.4:0"))
       == 0);
-  fail_unless (strncmp (res_tmp_file_name, "test_tmp_file_", strlen ("test_tmp_file_"))
+  fail_unless (strncmp (res_tmp_file_name, "test_tmp_file_",
+          strlen ("test_tmp_file_"))
       == 0);
   fail_unless (res_epsv_mode == FALSE);
   fail_unless (res_create_dirs == FALSE);
   fail_unless (res_create_tmpfile == FALSE);
-  
+
   g_free (res_location);
   g_free (res_file_name);
   g_free (res_ftp_port);
@@ -99,8 +99,7 @@
       "epsv-mode", &res_epsv_mode,
       "create-dirs", &res_create_dirs,
       "create-tmp-file", &res_create_tmpfile,
-      "temp-file-name", &res_tmp_file_name,
-      NULL);
+      "temp-file-name", &res_tmp_file_name, NULL);
 
   fail_unless (strncmp (res_location, "newlocation", strlen ("newlocation"))
       == 0);
@@ -108,13 +107,14 @@
       == 0);
   fail_unless (strncmp (res_ftp_port, "", strlen (""))
       == 0);
-  fail_unless (strncmp (res_tmp_file_name, "test_tmp_file_", strlen ("test_tmp_file_"))
+  fail_unless (strncmp (res_tmp_file_name, "test_tmp_file_",
+          strlen ("test_tmp_file_"))
       == 0);
   fail_unless (res_epsv_mode == TRUE);
   fail_unless (res_create_dirs == TRUE);
   fail_unless (res_create_dirs == TRUE);
   fail_unless (res_create_tmpfile == TRUE);
-  
+
   g_free (res_location);
   g_free (res_file_name);
   g_free (res_ftp_port);
@@ -122,6 +122,7 @@
 
   cleanup_curlftpsink (sink);
 }
+
 GST_END_TEST;
 
 static Suite *
diff --git a/tests/check/elements/curlhttpsink.c b/tests/check/elements/curlhttpsink.c
index fcdb6e1..68370fb 100644
--- a/tests/check/elements/curlhttpsink.c
+++ b/tests/check/elements/curlhttpsink.c
@@ -54,16 +54,14 @@
 
   g_object_set (G_OBJECT (sink),
       "location", "mylocation",
-      "file-name","myfile",
+      "file-name", "myfile",
       "user", "user",
       "passwd", "passwd",
       "proxy", "myproxy",
       "proxy-port", 7777,
       "proxy-user", "proxy_user",
       "proxy-passwd", "proxy_passwd",
-      "content-type", "image/jpeg",
-      "use-content-length", TRUE,
-      NULL);
+      "content-type", "image/jpeg", "use-content-length", TRUE, NULL);
 
   g_object_get (sink,
       "location", &res_location,
@@ -75,8 +73,7 @@
       "proxy-user", &res_proxy_user,
       "proxy-passwd", &res_proxy_passwd,
       "content-type", &res_content_type,
-      "use-content-length", &res_use_content_length,
-      NULL);
+      "use-content-length", &res_use_content_length, NULL);
 
   fail_unless (strncmp (res_location, "mylocation", strlen ("mylocation"))
       == 0);
@@ -89,7 +86,7 @@
   fail_unless (strncmp (res_proxy_user, "proxy_user", strlen ("proxy_user"))
       == 0);
   fail_unless (strncmp (res_proxy_passwd, "proxy_passwd",
-        strlen ("proxy_passwd")) == 0);
+          strlen ("proxy_passwd")) == 0);
   fail_unless (strncmp (res_content_type, "image/jpeg", strlen ("image/jpeg"))
       == 0);
   fail_unless (res_use_content_length == TRUE);
@@ -118,6 +115,7 @@
 
   cleanup_curlhttpsink (sink);
 }
+
 GST_END_TEST;
 
 static Suite *
diff --git a/tests/check/elements/curlsmtpsink.c b/tests/check/elements/curlsmtpsink.c
index e526327..450b721 100644
--- a/tests/check/elements/curlsmtpsink.c
+++ b/tests/check/elements/curlsmtpsink.c
@@ -80,9 +80,7 @@
       "nbr-attachments", &res_nbr_attach,
       "use-ssl", &res_use_ssl,
       "pop-location", &res_pop_location,
-      "pop_user", &res_pop_usr,
-      "pop-passwd", &res_pop_passwd,
-      NULL);
+      "pop_user", &res_pop_usr, "pop-passwd", &res_pop_passwd, NULL);
 
   fail_unless (strncmp (res_location, "mylocation", strlen ("mylocation"))
       == 0);
@@ -147,9 +145,7 @@
       "subject", &res_subj,
       "use-ssl", &res_use_ssl,
       "message-body", &res_msg,
-      "mail-from", &res_mail_from,
-      "mail-rcpt", &res_mail_rcpt,
-      NULL);
+      "mail-from", &res_mail_from, "mail-rcpt", &res_mail_rcpt, NULL);
 
   fail_unless (strncmp (res_location, "newlocation", strlen ("newlocation"))
       == 0);
@@ -160,7 +156,7 @@
   fail_unless (strncmp (res_passwd, "newpasswd", strlen ("newpasswd"))
       == 0);
   fail_unless (strncmp (res_mail_rcpt, "rcpt1,rcpt2,rcpt3",
-      strlen ("rcpt1,rcpt2,rcpt3")) == 0);
+          strlen ("rcpt1,rcpt2,rcpt3")) == 0);
   fail_unless (strncmp (res_mail_from, "newsender", strlen ("newsender"))
       == 0);
   fail_unless (strncmp (res_subj, "newsubject", strlen ("newsubject"))
@@ -190,6 +186,7 @@
 
   cleanup_curlsmtpsink (sink);
 }
+
 GST_END_TEST;
 
 static Suite *
diff --git a/tests/check/elements/dash_demux.c b/tests/check/elements/dash_demux.c
new file mode 100644
index 0000000..ce7556f
--- /dev/null
+++ b/tests/check/elements/dash_demux.c
@@ -0,0 +1,832 @@
+/* GStreamer unit test for MPEG-DASH
+ *
+ * Copyright (c) <2015> YouView TV Ltd
+ *
+ * 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 <gst/check/gstcheck.h>
+#include "adaptive_demux_common.h"
+
+#define DEMUX_ELEMENT_NAME "dashdemux"
+
+#define COPY_OUTPUT_TEST_DATA(outputTestData,testData) do { \
+    guint otdPos, otdLen = sizeof((outputTestData)) / sizeof((outputTestData)[0]); \
+    for(otdPos=0; otdPos<otdLen; ++otdPos){ \
+  (testData)->output_streams = g_list_append ((testData)->output_streams, &(outputTestData)[otdPos]); \
+    } \
+  } while(0)
+
+typedef struct _GstDashDemuxTestInputData
+{
+  const gchar *uri;
+  const guint8 *payload;
+  guint64 size;
+} GstDashDemuxTestInputData;
+
+static gboolean
+gst_dashdemux_http_src_start (GstTestHTTPSrc * src,
+    const gchar * uri, GstTestHTTPSrcInput * input_data, gpointer user_data)
+{
+  const GstDashDemuxTestInputData *input =
+      (const GstDashDemuxTestInputData *) user_data;
+  for (guint i = 0; input[i].uri; ++i) {
+    if (strcmp (input[i].uri, uri) == 0) {
+      input_data->context = (gpointer) & input[i];
+      input_data->size = input[i].size;
+      if (input[i].size == 0)
+        input_data->size = strlen ((gchar *) input[i].payload);
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+static GstFlowReturn
+gst_dashdemux_http_src_create (GstTestHTTPSrc * src,
+    guint64 offset,
+    guint length, GstBuffer ** retbuf, gpointer context, gpointer user_data)
+{
+  /*  const GstDashDemuxTestInputData *input =
+     (const GstDashDemuxTestInputData *) user_data; */
+  const GstDashDemuxTestInputData *input =
+      (const GstDashDemuxTestInputData *) context;
+  GstBuffer *buf;
+
+  buf = gst_buffer_new_allocate (NULL, length, NULL);
+  fail_if (buf == NULL, "Not enough memory to allocate buffer");
+
+  if (input->payload) {
+    gst_buffer_fill (buf, 0, input->payload + offset, length);
+  } else {
+    GstMapInfo info;
+    guint pattern;
+
+    pattern = offset - offset % sizeof (pattern);
+
+    gst_buffer_map (buf, &info, GST_MAP_WRITE);
+    for (guint64 i = 0; i < length; ++i) {
+      gchar pattern_byte_to_write = (offset + i) % sizeof (pattern);
+      if (pattern_byte_to_write == 0) {
+        pattern = offset + i;
+      }
+      info.data[i] = (pattern >> (pattern_byte_to_write * 8)) & 0xFF;
+    }
+    gst_buffer_unmap (buf, &info);
+  }
+  *retbuf = buf;
+  return GST_FLOW_OK;
+}
+
+/******************** Test specific code starts here **************************/
+
+/*
+ * Test an mpd with an audio and a video stream
+ *
+ */
+GST_START_TEST (simpleTest)
+{
+  const gchar *mpd =
+      "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+      "<MPD xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
+      "     xmlns=\"urn:mpeg:DASH:schema:MPD:2011\""
+      "     xsi:schemaLocation=\"urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd\""
+      "     xmlns:yt=\"http://youtube.com/yt/2012/10/10\""
+      "     profiles=\"urn:mpeg:dash:profile:isoff-on-demand:2011\""
+      "     type=\"static\""
+      "     minBufferTime=\"PT1.500S\""
+      "     mediaPresentationDuration=\"PT135.743S\">"
+      "  <Period>"
+      "    <AdaptationSet mimeType=\"audio/webm\""
+      "                   subsegmentAlignment=\"true\">"
+      "      <Representation id=\"171\""
+      "                      codecs=\"vorbis\""
+      "                      audioSamplingRate=\"44100\""
+      "                      startWithSAP=\"1\""
+      "                      bandwidth=\"129553\">"
+      "        <AudioChannelConfiguration"
+      "           schemeIdUri=\"urn:mpeg:dash:23003:3:audio_channel_configuration:2011\""
+      "           value=\"2\" />"
+      "        <BaseURL>audio.webm</BaseURL>"
+      "        <SegmentBase indexRange=\"4452-4686\""
+      "                     indexRangeExact=\"true\">"
+      "          <Initialization range=\"0-4451\" />"
+      "        </SegmentBase>"
+      "      </Representation>"
+      "    </AdaptationSet>"
+      "    <AdaptationSet mimeType=\"video/webm\""
+      "                   subsegmentAlignment=\"true\">"
+      "      <Representation id=\"242\""
+      "                      codecs=\"vp9\""
+      "                      width=\"426\""
+      "                      height=\"240\""
+      "                      startWithSAP=\"1\""
+      "                      bandwidth=\"490208\">"
+      "        <BaseURL>video.webm</BaseURL>"
+      "        <SegmentBase indexRange=\"234-682\""
+      "                     indexRangeExact=\"true\">"
+      "          <Initialization range=\"0-233\" />"
+      "        </SegmentBase>"
+      "      </Representation></AdaptationSet></Period></MPD>";
+  GstDashDemuxTestInputData inputTestData[] = {
+    {"http://unit.test/test.mpd", (guint8 *) mpd, 0},
+    {"http://unit.test/audio.webm", NULL, 5000},
+    {"http://unit.test/video.webm", NULL, 9000},
+    {NULL, NULL, 0},
+  };
+  GstTestHTTPSrcCallbacks http_src_callbacks = { 0 };
+  GstAdaptiveDemuxTestExpectedOutput outputTestData[] = {
+    {"audio_00", 5000, NULL},
+    {"video_00", 9000, NULL}
+  };
+  GstAdaptiveDemuxTestCallbacks test_callbacks = { 0 };
+  GstAdaptiveDemuxTestCase *testData;
+
+  testData = gst_adaptive_demux_test_case_new ();
+  http_src_callbacks.src_start = gst_dashdemux_http_src_start;
+  http_src_callbacks.src_create = gst_dashdemux_http_src_create;
+  gst_test_http_src_install_callbacks (&http_src_callbacks, inputTestData);
+
+  COPY_OUTPUT_TEST_DATA (outputTestData, testData);
+  test_callbacks.appsink_received_data =
+      gst_adaptive_demux_test_check_received_data;
+  test_callbacks.appsink_eos =
+      gst_adaptive_demux_test_check_size_of_received_data;
+
+  gst_adaptive_demux_test_run (DEMUX_ELEMENT_NAME, "http://unit.test/test.mpd",
+      &test_callbacks, testData);
+  g_object_unref (testData);
+}
+
+GST_END_TEST;
+
+/*
+ * Test an mpd with 2 periods
+ *
+ */
+GST_START_TEST (testTwoPeriods)
+{
+  const gchar *mpd =
+      "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+      "<MPD xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
+      "     xmlns=\"urn:mpeg:DASH:schema:MPD:2011\""
+      "     xsi:schemaLocation=\"urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd\""
+      "     xmlns:yt=\"http://youtube.com/yt/2012/10/10\""
+      "     profiles=\"urn:mpeg:dash:profile:isoff-on-demand:2011\""
+      "     type=\"static\""
+      "     minBufferTime=\"PT1.500S\""
+      "     mediaPresentationDuration=\"PT300S\">"
+      "  <Period id=\"Period0\" duration=\"PT0.1S\">"
+      "    <AdaptationSet mimeType=\"audio/webm\""
+      "                   subsegmentAlignment=\"true\">"
+      "      <Representation id=\"171\""
+      "                      codecs=\"vorbis\""
+      "                      audioSamplingRate=\"44100\""
+      "                      startWithSAP=\"1\""
+      "                      bandwidth=\"129553\">"
+      "        <AudioChannelConfiguration"
+      "           schemeIdUri=\"urn:mpeg:dash:23003:3:audio_channel_configuration:2011\""
+      "           value=\"2\" />"
+      "        <BaseURL>audio1.webm</BaseURL>"
+      "        <SegmentBase indexRange=\"4452-4686\""
+      "                     indexRangeExact=\"true\">"
+      "          <Initialization range=\"0-4451\" />"
+      "        </SegmentBase>"
+      "      </Representation>"
+      "    </AdaptationSet>"
+      "    <AdaptationSet mimeType=\"video/webm\""
+      "                   subsegmentAlignment=\"true\">"
+      "      <Representation id=\"242\""
+      "                      codecs=\"vp9\""
+      "                      width=\"426\""
+      "                      height=\"240\""
+      "                      startWithSAP=\"1\""
+      "                      bandwidth=\"490208\">"
+      "        <BaseURL>video1.webm</BaseURL>"
+      "        <SegmentBase indexRange=\"234-682\""
+      "                     indexRangeExact=\"true\">"
+      "          <Initialization range=\"0-233\" />"
+      "        </SegmentBase>"
+      "      </Representation>"
+      "    </AdaptationSet>"
+      "  </Period>"
+      "  <Period>"
+      "    <AdaptationSet mimeType=\"audio/webm\""
+      "                   subsegmentAlignment=\"true\">"
+      "      <Representation id=\"171\""
+      "                      codecs=\"vorbis\""
+      "                      audioSamplingRate=\"44100\""
+      "                      startWithSAP=\"1\""
+      "                      bandwidth=\"129553\">"
+      "        <AudioChannelConfiguration"
+      "           schemeIdUri=\"urn:mpeg:dash:23003:3:audio_channel_configuration:2011\""
+      "           value=\"2\" />"
+      "        <BaseURL>audio2.webm</BaseURL>"
+      "        <SegmentBase indexRange=\"4452-4686\""
+      "                     indexRangeExact=\"true\">"
+      "          <Initialization range=\"0-4451\" />"
+      "        </SegmentBase>"
+      "      </Representation>"
+      "    </AdaptationSet>"
+      "    <AdaptationSet mimeType=\"video/webm\""
+      "                   subsegmentAlignment=\"true\">"
+      "      <Representation id=\"242\""
+      "                      codecs=\"vp9\""
+      "                      width=\"426\""
+      "                      height=\"240\""
+      "                      startWithSAP=\"1\""
+      "                      bandwidth=\"490208\">"
+      "        <BaseURL>video2.webm</BaseURL>"
+      "        <SegmentBase indexRange=\"234-682\""
+      "                     indexRangeExact=\"true\">"
+      "          <Initialization range=\"0-233\" />"
+      "        </SegmentBase>"
+      "      </Representation></AdaptationSet></Period></MPD>";
+
+  GstDashDemuxTestInputData inputTestData[] = {
+    {"http://unit.test/test.mpd", (guint8 *) mpd, 0},
+    {"http://unit.test/audio1.webm", NULL, 5001},
+    {"http://unit.test/video1.webm", NULL, 9001},
+    {"http://unit.test/audio2.webm", NULL, 5002},
+    {"http://unit.test/video2.webm", NULL, 9002},
+    {NULL, NULL, 0},
+  };
+  GstTestHTTPSrcCallbacks http_src_callbacks = { 0 };
+  GstAdaptiveDemuxTestExpectedOutput outputTestData[] = {
+    {"audio_00", 5001, NULL},
+    {"video_00", 9001, NULL},
+    {"audio_01", 5002, NULL},
+    {"video_01", 9002, NULL},
+  };
+  GstAdaptiveDemuxTestCallbacks test_callbacks = { 0 };
+  GstAdaptiveDemuxTestCase *testData;
+
+  testData = gst_adaptive_demux_test_case_new ();
+  http_src_callbacks.src_start = gst_dashdemux_http_src_start;
+  http_src_callbacks.src_create = gst_dashdemux_http_src_create;
+  COPY_OUTPUT_TEST_DATA (outputTestData, testData);
+  test_callbacks.appsink_received_data =
+      gst_adaptive_demux_test_check_received_data;
+  test_callbacks.appsink_eos =
+      gst_adaptive_demux_test_check_size_of_received_data;
+
+  gst_test_http_src_install_callbacks (&http_src_callbacks, inputTestData);
+  gst_adaptive_demux_test_run (DEMUX_ELEMENT_NAME,
+      "http://unit.test/test.mpd", &test_callbacks, testData);
+  gst_object_unref (testData);
+}
+
+GST_END_TEST;
+
+/* test setting a property on an object */
+#define test_int_prop(object, name, value) \
+do \
+{ \
+  int val = value; \
+  int val_after; \
+  g_object_set (object, name, val, NULL); \
+  g_object_get (object, name, &val_after, NULL); \
+  fail_unless (val_after == val, "property check failed for %s: set to %d, but got %d", \
+      name, val, val_after); \
+} while (0)
+
+#define test_float_prop(object, name, value) \
+do \
+{ \
+  float val = value; \
+  float val_after; \
+  g_object_set (object, name, val, NULL); \
+  g_object_get (object, name, &val_after, NULL); \
+  fail_unless (val_after == val, "property check failed for %s: set to %f, but got %f", \
+      name, val, val_after); \
+} while (0)
+
+/* test setting an invalid value for a property on an object.
+ * Expect an assert and the property to remain unchanged
+ */
+#define test_invalid_int_prop(object, name, value) \
+do \
+{ \
+  int val_before; \
+  int val_after; \
+  int val = value; \
+  g_object_get (object, name, &val_before, NULL); \
+  ASSERT_WARNING (g_object_set (object, name, val, NULL)); \
+  g_object_get (object, name, &val_after, NULL); \
+  fail_unless (val_after == val_before, "property check failed for %s: before %d, after %d", \
+      name, val_before, val_after); \
+} while (0)
+
+#define test_invalid_float_prop(object, name, value) \
+do \
+{ \
+  float val_before; \
+  float val_after; \
+  float val = value; \
+  g_object_get (object, name, &val_before, NULL); \
+  ASSERT_WARNING (g_object_set (object, name, val, NULL)); \
+  g_object_get (object, name, &val_after, NULL); \
+  fail_unless (val_after == val_before, "property check failed for %s: before %f, after %f", \
+      name, val_before, val_after); \
+} while (0)
+
+static void
+setAndTestDashParams (GstAdaptiveDemuxTestEngine * engine, gpointer user_data)
+{
+  /*  GstAdaptiveDemuxTestCase * testData = (GstAdaptiveDemuxTestCase*)user_data; */
+  GObject *dashdemux = G_OBJECT (engine->demux);
+
+  test_int_prop (dashdemux, "connection-speed", 1000);
+  test_invalid_int_prop (dashdemux, "connection-speed", 4294967 + 1);
+
+  test_float_prop (dashdemux, "bitrate-limit", 1);
+  test_invalid_float_prop (dashdemux, "bitrate-limit", 2.1);
+
+  test_int_prop (dashdemux, "max-buffering-time", 15);
+  test_invalid_int_prop (dashdemux, "max-buffering-time", 1);
+
+  test_float_prop (dashdemux, "bandwidth-usage", 0.5);
+  test_invalid_float_prop (dashdemux, "bandwidth-usage", 2);
+
+  test_int_prop (dashdemux, "max-bitrate", 1000);
+  test_invalid_int_prop (dashdemux, "max-bitrate", 10);
+}
+
+/*
+ * Test setting parameters
+ *
+ */
+GST_START_TEST (testParameters)
+{
+  const gchar *mpd =
+      "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+      "<MPD xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
+      "     xmlns=\"urn:mpeg:DASH:schema:MPD:2011\""
+      "     xsi:schemaLocation=\"urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd\""
+      "     xmlns:yt=\"http://youtube.com/yt/2012/10/10\""
+      "     profiles=\"urn:mpeg:dash:profile:isoff-on-demand:2011\""
+      "     type=\"static\""
+      "     minBufferTime=\"PT1.500S\""
+      "     mediaPresentationDuration=\"PT135.743S\">"
+      "  <Period>"
+      "    <AdaptationSet mimeType=\"audio/webm\""
+      "                   subsegmentAlignment=\"true\">"
+      "      <Representation id=\"171\""
+      "                      codecs=\"vorbis\""
+      "                      audioSamplingRate=\"44100\""
+      "                      startWithSAP=\"1\""
+      "                      bandwidth=\"129553\">"
+      "        <AudioChannelConfiguration"
+      "           schemeIdUri=\"urn:mpeg:dash:23003:3:audio_channel_configuration:2011\""
+      "           value=\"2\" />"
+      "        <BaseURL>audio.webm</BaseURL>"
+      "        <SegmentBase indexRange=\"4452-4686\""
+      "                     indexRangeExact=\"true\">"
+      "          <Initialization range=\"0-4451\" />"
+      "        </SegmentBase>"
+      "      </Representation></AdaptationSet></Period></MPD>";
+
+  GstDashDemuxTestInputData inputTestData[] = {
+    {"http://unit.test/test.mpd", (guint8 *) mpd, 0},
+    {"http://unit.test/audio.webm", NULL, 5000},
+    {NULL, NULL, 0},
+  };
+  GstTestHTTPSrcCallbacks http_src_callbacks = { 0 };
+  GstAdaptiveDemuxTestExpectedOutput outputTestData[] = {
+    {"audio_00", 5000, NULL},
+  };
+  GstAdaptiveDemuxTestCallbacks test_callbacks = { 0 };
+  GstAdaptiveDemuxTestCase *testData;
+
+  testData = gst_adaptive_demux_test_case_new ();
+  http_src_callbacks.src_start = gst_dashdemux_http_src_start;
+  http_src_callbacks.src_create = gst_dashdemux_http_src_create;
+  COPY_OUTPUT_TEST_DATA (outputTestData, testData);
+  test_callbacks.pre_test = setAndTestDashParams;
+  test_callbacks.appsink_received_data =
+      gst_adaptive_demux_test_check_received_data;
+  test_callbacks.appsink_eos =
+      gst_adaptive_demux_test_check_size_of_received_data;
+
+  gst_test_http_src_install_callbacks (&http_src_callbacks, inputTestData);
+  gst_adaptive_demux_test_run (DEMUX_ELEMENT_NAME, "http://unit.test/test.mpd",
+      &test_callbacks, testData);
+  gst_object_unref (testData);
+}
+
+GST_END_TEST;
+
+/*
+ * Test seeking
+ *
+ */
+GST_START_TEST (testSeek)
+{
+  const gchar *mpd =
+      "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+      "<MPD xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
+      "     xmlns=\"urn:mpeg:DASH:schema:MPD:2011\""
+      "     xsi:schemaLocation=\"urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd\""
+      "     xmlns:yt=\"http://youtube.com/yt/2012/10/10\""
+      "     profiles=\"urn:mpeg:dash:profile:isoff-on-demand:2011\""
+      "     type=\"static\""
+      "     minBufferTime=\"PT1.500S\""
+      "     mediaPresentationDuration=\"PT135.743S\">"
+      "  <Period>"
+      "    <AdaptationSet mimeType=\"audio/webm\""
+      "                   subsegmentAlignment=\"true\">"
+      "      <Representation id=\"171\""
+      "                      codecs=\"vorbis\""
+      "                      audioSamplingRate=\"44100\""
+      "                      startWithSAP=\"1\""
+      "                      bandwidth=\"129553\">"
+      "        <AudioChannelConfiguration"
+      "           schemeIdUri=\"urn:mpeg:dash:23003:3:audio_channel_configuration:2011\""
+      "           value=\"2\" />"
+      "        <BaseURL>audio.webm</BaseURL>"
+      "        <SegmentBase indexRange=\"4452-4686\""
+      "                     indexRangeExact=\"true\">"
+      "          <Initialization range=\"0-4451\" />"
+      "        </SegmentBase>"
+      "      </Representation></AdaptationSet></Period></MPD>";
+  GstDashDemuxTestInputData inputTestData[] = {
+    {"http://unit.test/test.mpd", (guint8 *) mpd, 0},
+    {"http://unit.test/audio.webm", NULL, 10000},
+    {NULL, NULL, 0},
+  };
+  GstTestHTTPSrcCallbacks http_src_callbacks = { 0 };
+  GstAdaptiveDemuxTestExpectedOutput outputTestData[] = {
+    {"audio_00", 10000, NULL},
+  };
+  GstAdaptiveDemuxTestCase *testData;
+
+  testData = gst_adaptive_demux_test_case_new ();
+
+  http_src_callbacks.src_start = gst_dashdemux_http_src_start;
+  http_src_callbacks.src_create = gst_dashdemux_http_src_create;
+  COPY_OUTPUT_TEST_DATA (outputTestData, testData);
+
+  /* media segment starts at 4687
+   * Issue a seek request after media segment has started to be downloaded
+   * on the first pad listed in GstAdaptiveDemuxTestOutputStreamData and the
+   * first chunk of at least one byte has already arrived in AppSink
+   */
+  testData->threshold_for_seek = 4687 + 1;
+
+  gst_test_http_src_install_callbacks (&http_src_callbacks, inputTestData);
+  gst_adaptive_demux_test_seek (DEMUX_ELEMENT_NAME,
+      "http://unit.test/test.mpd", testData);
+  gst_object_unref (testData);
+}
+
+GST_END_TEST;
+
+static void
+testDownloadErrorMessageCallback (GstAdaptiveDemuxTestEngine * engine,
+    GstMessage * msg, gpointer user_data)
+{
+  GError *err = NULL;
+  gchar *dbg_info = NULL;
+
+  fail_unless (GST_MESSAGE_TYPE (msg) == GST_MESSAGE_ERROR);
+  gst_message_parse_error (msg, &err, &dbg_info);
+  GST_DEBUG ("Error from element %s : %s\n",
+      GST_OBJECT_NAME (msg->src), err->message);
+  fail_unless_equals_string (GST_OBJECT_NAME (msg->src), DEMUX_ELEMENT_NAME);
+  /*GST_DEBUG ("dbg_info=%s\n", dbg_info); */
+  g_error_free (err);
+  g_free (dbg_info);
+  g_main_loop_quit (engine->loop);
+}
+
+/*
+ * Test error case of failing to download a segment
+ */
+GST_START_TEST (testDownloadError)
+{
+  const gchar *mpd =
+      "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+      "<MPD xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
+      "     xmlns=\"urn:mpeg:DASH:schema:MPD:2011\""
+      "     xsi:schemaLocation=\"urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd\""
+      "     xmlns:yt=\"http://youtube.com/yt/2012/10/10\""
+      "     profiles=\"urn:mpeg:dash:profile:isoff-on-demand:2011\""
+      "     type=\"static\""
+      "     minBufferTime=\"PT1.500S\""
+      "     mediaPresentationDuration=\"PT0.5S\">"
+      "  <Period>"
+      "    <AdaptationSet mimeType=\"audio/webm\""
+      "                   subsegmentAlignment=\"true\">"
+      "      <Representation id=\"171\""
+      "                      codecs=\"vorbis\""
+      "                      audioSamplingRate=\"44100\""
+      "                      startWithSAP=\"1\""
+      "                      bandwidth=\"129553\">"
+      "        <AudioChannelConfiguration"
+      "           schemeIdUri=\"urn:mpeg:dash:23003:3:audio_channel_configuration:2011\""
+      "           value=\"2\" />"
+      "        <BaseURL>audio_file_not_available.webm</BaseURL>"
+      "        <SegmentBase indexRange=\"4452-4686\""
+      "                     indexRangeExact=\"true\">"
+      "          <Initialization range=\"0-4451\" />"
+      "        </SegmentBase>"
+      "      </Representation></AdaptationSet></Period></MPD>";
+
+  GstDashDemuxTestInputData inputTestData[] = {
+    {"http://unit.test/test.mpd", (guint8 *) mpd, 0},
+    {NULL, NULL, 0},
+  };
+  GstTestHTTPSrcCallbacks http_src_callbacks = { 0 };
+  GstAdaptiveDemuxTestExpectedOutput outputTestData[] = {
+    {"audio_00", 0, NULL},
+  };
+  GstAdaptiveDemuxTestCallbacks test_callbacks = { 0 };
+  GstAdaptiveDemuxTestCase *testData;
+
+  testData = gst_adaptive_demux_test_case_new ();
+  http_src_callbacks.src_start = gst_dashdemux_http_src_start;
+  http_src_callbacks.src_create = gst_dashdemux_http_src_create;
+  COPY_OUTPUT_TEST_DATA (outputTestData, testData);
+  test_callbacks.appsink_received_data =
+      gst_adaptive_demux_test_check_received_data;
+  test_callbacks.bus_error_message = testDownloadErrorMessageCallback;
+  test_callbacks.appsink_eos =
+      gst_adaptive_demux_test_check_size_of_received_data;
+
+  gst_test_http_src_install_callbacks (&http_src_callbacks, inputTestData);
+  gst_adaptive_demux_test_run (DEMUX_ELEMENT_NAME, "http://unit.test/test.mpd",
+      &test_callbacks, testData);
+  gst_object_unref (testData);
+}
+
+GST_END_TEST;
+
+/* generate queries to adaptive demux */
+static gboolean
+testQueryCheckDataReceived (GstAdaptiveDemuxTestEngine * engine,
+    GstAdaptiveDemuxTestOutputStream * stream,
+    GstBuffer * buffer, gpointer user_data)
+{
+  GList *pads;
+  GstPad *pad;
+  GstQuery *query;
+  gboolean ret;
+  gint64 duration;
+  gboolean seekable;
+  gint64 segment_start;
+  gint64 segment_end;
+  gchar *uri;
+  gchar *redirect_uri;
+  gboolean redirect_permanent;
+
+  pads = GST_ELEMENT_PADS (stream->appsink);
+
+  /* AppSink should have only 1 pad */
+  fail_unless (pads != NULL);
+  fail_unless (g_list_length (pads) == 1);
+  pad = GST_PAD (pads->data);
+
+  query = gst_query_new_duration (GST_FORMAT_TIME);
+  ret = gst_pad_peer_query (pad, query);
+  fail_unless (ret == TRUE);
+  gst_query_parse_duration (query, NULL, &duration);
+  fail_unless (duration == 135743 * GST_MSECOND);
+  gst_query_unref (query);
+
+  query = gst_query_new_seeking (GST_FORMAT_TIME);
+  ret = gst_pad_peer_query (pad, query);
+  fail_unless (ret == TRUE);
+  gst_query_parse_seeking (query, NULL, &seekable, &segment_start,
+      &segment_end);
+  fail_unless (seekable == TRUE);
+  fail_unless (segment_start == 0);
+  fail_unless (segment_end == duration);
+  gst_query_unref (query);
+
+  query = gst_query_new_uri ();
+  ret = gst_pad_peer_query (pad, query);
+  fail_unless (ret == TRUE);
+  gst_query_parse_uri (query, &uri);
+  gst_query_parse_uri_redirection (query, &redirect_uri);
+  gst_query_parse_uri_redirection_permanent (query, &redirect_permanent);
+  fail_unless (strcmp (uri, "http://unit.test/test.mpd") == 0);
+  /* adaptive demux does not reply with redirect information */
+  fail_unless (redirect_uri == NULL);
+  fail_unless (redirect_permanent == FALSE);
+  g_free (uri);
+  g_free (redirect_uri);
+  gst_query_unref (query);
+
+  return gst_adaptive_demux_test_check_received_data (engine,
+      stream, buffer, user_data);
+}
+
+/*
+ * Test queries
+ *
+ */
+GST_START_TEST (testQuery)
+{
+  const gchar *mpd =
+      "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+      "<MPD xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
+      "     xmlns=\"urn:mpeg:DASH:schema:MPD:2011\""
+      "     xsi:schemaLocation=\"urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd\""
+      "     xmlns:yt=\"http://youtube.com/yt/2012/10/10\""
+      "     profiles=\"urn:mpeg:dash:profile:isoff-on-demand:2011\""
+      "     type=\"static\""
+      "     minBufferTime=\"PT1.500S\""
+      "     mediaPresentationDuration=\"PT135.743S\">"
+      "  <Period>"
+      "    <AdaptationSet mimeType=\"audio/webm\""
+      "                   subsegmentAlignment=\"true\">"
+      "      <Representation id=\"171\""
+      "                      codecs=\"vorbis\""
+      "                      audioSamplingRate=\"44100\""
+      "                      startWithSAP=\"1\""
+      "                      bandwidth=\"129553\">"
+      "        <AudioChannelConfiguration"
+      "           schemeIdUri=\"urn:mpeg:dash:23003:3:audio_channel_configuration:2011\""
+      "           value=\"2\" />"
+      "        <BaseURL>audio.webm</BaseURL>"
+      "        <SegmentBase indexRange=\"4452-4686\""
+      "                     indexRangeExact=\"true\">"
+      "          <Initialization range=\"0-4451\" />"
+      "        </SegmentBase>"
+      "      </Representation></AdaptationSet></Period></MPD>";
+  GstDashDemuxTestInputData inputTestData[] = {
+    {"http://unit.test/test.mpd", (guint8 *) mpd, 0},
+    {"http://unit.test/audio.webm", NULL, 5000},
+    {NULL, NULL, 0},
+  };
+  GstTestHTTPSrcCallbacks http_src_callbacks = { 0 };
+  GstAdaptiveDemuxTestExpectedOutput outputTestData[] = {
+    {"audio_00", 5000, NULL},
+  };
+  GstAdaptiveDemuxTestCallbacks test_callbacks = { 0 };
+  GstAdaptiveDemuxTestCase *testData;
+
+  testData = gst_adaptive_demux_test_case_new ();
+  http_src_callbacks.src_start = gst_dashdemux_http_src_start;
+  http_src_callbacks.src_create = gst_dashdemux_http_src_create;
+  COPY_OUTPUT_TEST_DATA (outputTestData, testData);
+  test_callbacks.appsink_received_data = testQueryCheckDataReceived;
+  test_callbacks.appsink_eos =
+      gst_adaptive_demux_test_check_size_of_received_data;
+
+  gst_test_http_src_install_callbacks (&http_src_callbacks, inputTestData);
+  gst_adaptive_demux_test_run (DEMUX_ELEMENT_NAME,
+      "http://unit.test/test.mpd", &test_callbacks, testData);
+  gst_object_unref (testData);
+}
+
+GST_END_TEST;
+
+static GstFlowReturn
+test_fragment_download_error_src_create (GstTestHTTPSrc * src,
+    guint64 offset,
+    guint length, GstBuffer ** retbuf, gpointer context, gpointer user_data)
+{
+  const GstDashDemuxTestInputData *input =
+      (const GstDashDemuxTestInputData *) context;
+  fail_unless (input != NULL);
+  if (!g_str_has_suffix (input->uri, ".mpd") && offset > 2000) {
+    GST_DEBUG ("network_error %s %" G_GUINT64_FORMAT " @ %d",
+        input->uri, offset, 2000);
+    GST_ELEMENT_ERROR (src, RESOURCE, READ,
+        (("A network error occurred, or the server closed the connection unexpectedly.")), ("A network error occurred, or the server closed the connection unexpectedly."));
+    return GST_FLOW_ERROR;
+  }
+  return gst_dashdemux_http_src_create (src, offset, length, retbuf, context,
+      user_data);
+}
+
+/* function to check total size of data received by AppSink
+ * will be called when AppSink receives eos.
+ */
+static void
+testFragmentDownloadErrorCheckSizeOfDataReceived (GstAdaptiveDemuxTestEngine *
+    engine, GstAdaptiveDemuxTestOutputStream * stream, gpointer user_data)
+{
+  GstAdaptiveDemuxTestCase *testData = GST_ADAPTIVE_DEMUX_TEST_CASE (user_data);
+  GstAdaptiveDemuxTestExpectedOutput *testOutputStreamData;
+
+  testOutputStreamData =
+      gst_adaptive_demux_test_find_test_data_by_stream (testData, stream, NULL);
+  fail_unless (testOutputStreamData != NULL);
+
+  /* expect to receive more than 0 */
+  fail_unless (stream->total_received_size > 0,
+      "size validation failed for %s, expected > 0, received %d",
+      testOutputStreamData->name, stream->total_received_size);
+
+  /* expect to receive less than file size */
+  fail_unless (stream->total_received_size <
+      testOutputStreamData->expected_size,
+      "size validation failed for %s, expected < %d received %d",
+      testOutputStreamData->name, testOutputStreamData->expected_size,
+      stream->total_received_size);
+}
+
+/*
+ * Test fragment download error
+ * Let the adaptive demux download a few bytes, then instruct the
+ * GstTestHTTPSrc element to generate an error.
+ */
+GST_START_TEST (testFragmentDownloadError)
+{
+  const gchar *mpd =
+      "<?xml version=\"1.0\" encoding=\"utf-8\"?>"
+      "<MPD xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\""
+      "     xmlns=\"urn:mpeg:DASH:schema:MPD:2011\""
+      "     xsi:schemaLocation=\"urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd\""
+      "     xmlns:yt=\"http://youtube.com/yt/2012/10/10\""
+      "     profiles=\"urn:mpeg:dash:profile:isoff-on-demand:2011\""
+      "     type=\"static\""
+      "     minBufferTime=\"PT1.500S\""
+      "     mediaPresentationDuration=\"PT0.5S\">"
+      "  <Period>"
+      "    <AdaptationSet mimeType=\"audio/webm\""
+      "                   subsegmentAlignment=\"true\">"
+      "      <Representation id=\"171\""
+      "                      codecs=\"vorbis\""
+      "                      audioSamplingRate=\"44100\""
+      "                      startWithSAP=\"1\""
+      "                      bandwidth=\"129553\">"
+      "        <AudioChannelConfiguration"
+      "           schemeIdUri=\"urn:mpeg:dash:23003:3:audio_channel_configuration:2011\""
+      "           value=\"2\" />"
+      "        <BaseURL>audio.webm</BaseURL>"
+      "        <SegmentBase indexRange=\"4452-4686\""
+      "                     indexRangeExact=\"true\">"
+      "          <Initialization range=\"0-4451\" />"
+      "        </SegmentBase>"
+      "      </Representation></AdaptationSet></Period></MPD>";
+
+  GstDashDemuxTestInputData inputTestData[] = {
+    {"http://unit.test/test.mpd", (guint8 *) mpd, 0},
+    {"http://unit.test/audio.webm", NULL, 5000},
+    {NULL, NULL, 0},
+  };
+  GstTestHTTPSrcCallbacks http_src_callbacks = { 0 };
+  GstAdaptiveDemuxTestExpectedOutput outputTestData[] = {
+    {"audio_00", 5000, NULL},
+  };
+  GstAdaptiveDemuxTestCallbacks test_callbacks = { 0 };
+  GstAdaptiveDemuxTestCase *testData;
+
+  testData = gst_adaptive_demux_test_case_new ();
+  http_src_callbacks.src_start = gst_dashdemux_http_src_start;
+  http_src_callbacks.src_create = test_fragment_download_error_src_create;
+  COPY_OUTPUT_TEST_DATA (outputTestData, testData);
+  test_callbacks.appsink_received_data =
+      gst_adaptive_demux_test_check_received_data;
+  test_callbacks.appsink_eos = testFragmentDownloadErrorCheckSizeOfDataReceived;
+  /*  test_callbacks.demux_sent_eos = gst_adaptive_demux_test_check_size_of_received_data; */
+
+  test_callbacks.bus_error_message = testDownloadErrorMessageCallback;
+
+  gst_test_http_src_install_callbacks (&http_src_callbacks, inputTestData);
+  gst_adaptive_demux_test_run (DEMUX_ELEMENT_NAME,
+      "http://unit.test/test.mpd", &test_callbacks, testData);
+  gst_object_unref (testData);
+}
+
+GST_END_TEST;
+
+static Suite *
+dash_demux_suite (void)
+{
+  Suite *s = suite_create ("dash_demux");
+  TCase *tc_basicTest = tcase_create ("basicTest");
+
+  tcase_add_test (tc_basicTest, simpleTest);
+  tcase_add_test (tc_basicTest, testTwoPeriods);
+  tcase_add_test (tc_basicTest, testParameters);
+  tcase_add_test (tc_basicTest, testSeek);
+  tcase_add_test (tc_basicTest, testDownloadError);
+  tcase_add_test (tc_basicTest, testFragmentDownloadError);
+  tcase_add_test (tc_basicTest, testQuery);
+
+  tcase_add_unchecked_fixture (tc_basicTest, gst_adaptive_demux_test_setup,
+      gst_adaptive_demux_test_teardown);
+
+  suite_add_tcase (s, tc_basicTest);
+
+  return s;
+}
+
+GST_CHECK_MAIN (dash_demux);
diff --git a/tests/check/elements/dash_mpd.c b/tests/check/elements/dash_mpd.c
index 05d9711..b460d14 100644
--- a/tests/check/elements/dash_mpd.c
+++ b/tests/check/elements/dash_mpd.c
@@ -87,7 +87,7 @@
       "     id=\"testId\""
       "     type=\"static\""
       "     availabilityStartTime=\"2015-03-24T1:10:50\""
-      "     availabilityEndTime=\"2015-03-24T1:10:50\""
+      "     availabilityEndTime=\"2015-03-24T1:10:50.123456\""
       "     mediaPresentationDuration=\"P0Y1M2DT12H10M20.5S\""
       "     minimumUpdatePeriod=\"P0Y1M2DT12H10M20.5S\""
       "     minBufferTime=\"P0Y1M2DT12H10M20.5S\""
@@ -119,6 +119,7 @@
   assert_equals_int (gst_date_time_get_hour (availabilityStartTime), 1);
   assert_equals_int (gst_date_time_get_minute (availabilityStartTime), 10);
   assert_equals_int (gst_date_time_get_second (availabilityStartTime), 50);
+  assert_equals_int (gst_date_time_get_microsecond (availabilityStartTime), 0);
 
   availabilityEndTime = mpdclient->mpd_node->availabilityEndTime;
   assert_equals_int (gst_date_time_get_year (availabilityEndTime), 2015);
@@ -127,27 +128,29 @@
   assert_equals_int (gst_date_time_get_hour (availabilityEndTime), 1);
   assert_equals_int (gst_date_time_get_minute (availabilityEndTime), 10);
   assert_equals_int (gst_date_time_get_second (availabilityEndTime), 50);
+  assert_equals_int (gst_date_time_get_microsecond (availabilityEndTime),
+      123456);
 
-  assert_equals_int64 (mpdclient->mpd_node->mediaPresentationDuration,
-      (gint64) duration_to_ms (0, 1, 2, 12, 10, 20, 500));
+  assert_equals_uint64 (mpdclient->mpd_node->mediaPresentationDuration,
+      duration_to_ms (0, 1, 2, 12, 10, 20, 500));
 
-  assert_equals_int64 (mpdclient->mpd_node->minimumUpdatePeriod,
-      (gint64) duration_to_ms (0, 1, 2, 12, 10, 20, 500));
+  assert_equals_uint64 (mpdclient->mpd_node->minimumUpdatePeriod,
+      duration_to_ms (0, 1, 2, 12, 10, 20, 500));
 
-  assert_equals_int64 (mpdclient->mpd_node->minBufferTime,
-      (gint64) duration_to_ms (0, 1, 2, 12, 10, 20, 500));
+  assert_equals_uint64 (mpdclient->mpd_node->minBufferTime,
+      duration_to_ms (0, 1, 2, 12, 10, 20, 500));
 
-  assert_equals_int64 (mpdclient->mpd_node->timeShiftBufferDepth,
-      (gint64) duration_to_ms (0, 1, 2, 12, 10, 20, 500));
+  assert_equals_uint64 (mpdclient->mpd_node->timeShiftBufferDepth,
+      duration_to_ms (0, 1, 2, 12, 10, 20, 500));
 
-  assert_equals_int64 (mpdclient->mpd_node->suggestedPresentationDelay,
-      (gint64) duration_to_ms (0, 1, 2, 12, 10, 20, 500));
+  assert_equals_uint64 (mpdclient->mpd_node->suggestedPresentationDelay,
+      duration_to_ms (0, 1, 2, 12, 10, 20, 500));
 
-  assert_equals_int64 (mpdclient->mpd_node->maxSegmentDuration,
-      (gint64) duration_to_ms (0, 1, 2, 12, 10, 20, 500));
+  assert_equals_uint64 (mpdclient->mpd_node->maxSegmentDuration,
+      duration_to_ms (0, 1, 2, 12, 10, 20, 500));
 
-  assert_equals_int64 (mpdclient->mpd_node->maxSubsegmentDuration,
-      (gint64) duration_to_ms (0, 1, 2, 12, 10, 20, 500));
+  assert_equals_uint64 (mpdclient->mpd_node->maxSubsegmentDuration,
+      duration_to_ms (0, 1, 2, 12, 10, 20, 500));
 
   gst_mpd_client_free (mpdclient);
 }
@@ -301,10 +304,10 @@
   metricsNode = (GstMetricsNode *) mpdclient->mpd_node->Metrics->data;
   assert_equals_pointer (metricsNode->metrics, NULL);
   metricsRangeNode = (GstMetricsRangeNode *) metricsNode->MetricsRanges->data;
-  assert_equals_int64 (metricsRangeNode->starttime,
-      (gint64) duration_to_ms (0, 1, 2, 12, 10, 20, 500));
-  assert_equals_int64 (metricsRangeNode->duration,
-      (gint64) duration_to_ms (0, 1, 2, 12, 10, 20, 123));
+  assert_equals_uint64 (metricsRangeNode->starttime,
+      duration_to_ms (0, 1, 2, 12, 10, 20, 500));
+  assert_equals_uint64 (metricsRangeNode->duration,
+      duration_to_ms (0, 1, 2, 12, 10, 20, 123));
 
   gst_mpd_client_free (mpdclient);
 }
@@ -362,10 +365,10 @@
 
   periodNode = (GstPeriodNode *) mpdclient->mpd_node->Periods->data;
   assert_equals_string (periodNode->id, "TestId");
-  assert_equals_int64 (periodNode->start,
-      (gint64) duration_to_ms (0, 1, 2, 12, 10, 20, 123));
-  assert_equals_int64 (periodNode->duration,
-      (gint64) duration_to_ms (0, 1, 2, 12, 10, 20, 765));
+  assert_equals_uint64 (periodNode->start,
+      duration_to_ms (0, 1, 2, 12, 10, 20, 123));
+  assert_equals_uint64 (periodNode->duration,
+      duration_to_ms (0, 1, 2, 12, 10, 20, 765));
   assert_equals_int (periodNode->bitstreamSwitching, 1);
 
   gst_mpd_client_free (mpdclient);
@@ -531,7 +534,7 @@
       "<?xml version=\"1.0\"?>"
       "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\""
       "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\">"
-      "  <Period><SegmentList></SegmentList></Period></MPD>";
+      "  <Period><SegmentList duration=\"1\"></SegmentList></Period></MPD>";
 
   gboolean ret;
   GstMpdClient *mpdclient = gst_mpd_client_new ();
@@ -600,6 +603,7 @@
       "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\">"
       "  <Period>"
       "    <SegmentList timescale=\"10\""
+      "                 duration=\"1\""
       "                 presentationTimeOffset=\"11\""
       "                 indexRange=\"20-21\""
       "                 indexRangeExact=\"false\">"
@@ -721,7 +725,7 @@
       "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\""
       "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\">"
       "  <Period>"
-      "    <SegmentList>"
+      "    <SegmentList duration=\"0\">"
       "      <BitstreamSwitching sourceURL=\"TestSourceURL\""
       "                          range=\"100-200\">"
       "      </BitstreamSwitching></SegmentList></Period></MPD>";
@@ -759,7 +763,7 @@
       "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\""
       "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\">"
       "  <Period>"
-      "    <SegmentList>"
+      "    <SegmentList duration=\"1\">"
       "      <SegmentURL media=\"TestMedia\""
       "                  mediaRange=\"100-200\""
       "                  index=\"TestIndex\""
@@ -801,6 +805,7 @@
       "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\">"
       "  <Period>"
       "    <SegmentTemplate media=\"TestMedia\""
+      "                     duration=\"0\""
       "                     index=\"TestIndex\""
       "                     initialization=\"TestInitialization\""
       "                     bitstreamSwitching=\"TestBitstreamSwitching\">"
@@ -877,6 +882,7 @@
       "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\">"
       "  <Period>"
       "    <SegmentTemplate timescale=\"123456\""
+      "                     duration=\"1\""
       "                     presentationTimeOffset=\"123456789\""
       "                     indexRange=\"100-200\""
       "                     indexRangeExact=\"true\">"
@@ -998,7 +1004,7 @@
       "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\""
       "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\">"
       "  <Period>"
-      "    <SegmentTemplate>"
+      "    <SegmentTemplate duration=\"1\">"
       "      <BitstreamSwitching sourceURL=\"TestSourceURL\""
       "                          range=\"100-200\">"
       "      </BitstreamSwitching></SegmentTemplate></Period></MPD>";
@@ -1074,10 +1080,14 @@
   assert_equals_uint64 (adaptationSet->maxWidth, 2000);
   assert_equals_uint64 (adaptationSet->minHeight, 1100);
   assert_equals_uint64 (adaptationSet->maxHeight, 2100);
-  assert_equals_uint64 (adaptationSet->minFrameRate->num, 25);
-  assert_equals_uint64 (adaptationSet->minFrameRate->den, 123);
-  assert_equals_uint64 (adaptationSet->maxFrameRate->num, 26);
-  assert_equals_uint64 (adaptationSet->maxFrameRate->den, 1);
+  assert_equals_uint64 (adaptationSet->RepresentationBase->minFrameRate->num,
+      25);
+  assert_equals_uint64 (adaptationSet->RepresentationBase->minFrameRate->den,
+      123);
+  assert_equals_uint64 (adaptationSet->RepresentationBase->maxFrameRate->num,
+      26);
+  assert_equals_uint64 (adaptationSet->RepresentationBase->maxFrameRate->den,
+      1);
   assert_equals_int (adaptationSet->segmentAlignment->flag, 1);
   assert_equals_uint64 (adaptationSet->segmentAlignment->value, 2);
   assert_equals_int (adaptationSet->subsegmentAlignment->flag, 0);
@@ -1897,7 +1907,7 @@
       "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\">"
       "  <Period>"
       "    <AdaptationSet>"
-      "      <SegmentList></SegmentList></AdaptationSet></Period></MPD>";
+      "      <SegmentList duration=\"1\"></SegmentList></AdaptationSet></Period></MPD>";
 
   gboolean ret;
   GstMpdClient *mpdclient = gst_mpd_client_new ();
@@ -1931,6 +1941,7 @@
       "  <Period>"
       "    <AdaptationSet>"
       "      <SegmentTemplate media=\"TestMedia\""
+      "                       duration=\"1\""
       "                       index=\"TestIndex\""
       "                       initialization=\"TestInitialization\""
       "                       bitstreamSwitching=\"TestBitstreamSwitching\">"
@@ -1971,11 +1982,12 @@
       "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\""
       "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\">"
       "  <Period>"
-      "    <SegmentTemplate media=\"ParentMedia\" "
+      "    <SegmentTemplate media=\"ParentMedia\" duration=\"1\" "
       "                     initialization=\"ParentInitialization\">"
       "    </SegmentTemplate>"
       "    <AdaptationSet>"
       "      <SegmentTemplate media=\"TestMedia\""
+      "                       duration=\"1\""
       "                       index=\"TestIndex\""
       "                       bitstreamSwitching=\"TestBitstreamSwitching\">"
       "      </SegmentTemplate></AdaptationSet></Period></MPD>";
@@ -2016,7 +2028,7 @@
       "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\">"
       "  <Period>"
       "    <AdaptationSet>"
-      "      <Representation id=\"Test Id\""
+      "      <Representation id=\"Test_Id\""
       "                      bandwidth=\"100\""
       "                      qualityRanking=\"200\""
       "                      dependencyId=\"one two three\""
@@ -2033,7 +2045,7 @@
   adaptationSet = (GstAdaptationSetNode *) periodNode->AdaptationSets->data;
   representation = (GstRepresentationNode *)
       adaptationSet->Representations->data;
-  assert_equals_string (representation->id, "Test Id");
+  assert_equals_string (representation->id, "Test_Id");
   assert_equals_uint64 (representation->bandwidth, 100);
   assert_equals_uint64 (representation->qualityRanking, 200);
   assert_equals_string (representation->dependencyId[0], "one");
@@ -2277,7 +2289,7 @@
       "  <Period>"
       "    <AdaptationSet>"
       "      <Representation>"
-      "        <SegmentList>"
+      "        <SegmentList duration=\"1\">"
       "        </SegmentList>"
       "      </Representation></AdaptationSet></Period></MPD>";
 
@@ -2316,7 +2328,7 @@
       "  <Period>"
       "    <AdaptationSet>"
       "      <Representation>"
-      "        <SegmentTemplate>"
+      "        <SegmentTemplate duration=\"1\">"
       "        </SegmentTemplate>"
       "      </Representation></AdaptationSet></Period></MPD>";
 
@@ -2421,6 +2433,48 @@
       &selected_method);
   fail_if (urls == NULL);
   assert_equals_int (selected_method, GST_MPD_UTCTIMING_TYPE_HTTP_XSDATE);
+  urls =
+      gst_mpd_client_get_utc_timing_sources (mpdclient,
+      GST_MPD_UTCTIMING_TYPE_NTP, &selected_method);
+  fail_if (urls == NULL);
+  assert_equals_int (selected_method, GST_MPD_UTCTIMING_TYPE_NTP);
+  assert_equals_int (g_strv_length (urls), 4);
+  assert_equals_string (urls[0], "0.europe.pool.ntp.org");
+  assert_equals_string (urls[1], "1.europe.pool.ntp.org");
+  assert_equals_string (urls[2], "2.europe.pool.ntp.org");
+  assert_equals_string (urls[3], "3.europe.pool.ntp.org");
+  gst_mpd_client_free (mpdclient);
+}
+
+GST_END_TEST;
+
+/*
+ * Test parsing invalid UTCTiming values:
+ * - elements with no schemeIdUri property should be rejected
+ * - elements with no value property should be rejected
+ * - elements with unrecognised UTCTiming scheme should be rejected
+ * - elements with empty values should be rejected
+ *
+ */
+GST_START_TEST (dash_mpdparser_utctiming_invalid_value)
+{
+  const gchar *xml =
+      "<?xml version=\"1.0\"?>"
+      "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\""
+      " profiles=\"urn:mpeg:dash:profile:isoff-main:2011\">"
+      "<UTCTiming invalid_schemeIdUri=\"dummy.uri.scheme\" value=\"dummy value\"/>"
+      "<UTCTiming schemeIdUri=\"urn:mpeg:dash:utc:ntp:2014\" invalid_value=\"dummy value\"/>"
+      "<UTCTiming schemeIdUri=\"dummy.uri.scheme\" value=\"dummy value\"/>"
+      "<UTCTiming schemeIdUri=\"urn:mpeg:dash:utc:ntp:2014\" value=\"\"/>"
+      "</MPD>";
+  gboolean ret;
+  GstMpdClient *mpdclient = gst_mpd_client_new ();
+
+  ret = gst_mpd_parse (mpdclient, xml, (gint) strlen (xml));
+
+  assert_equals_int (ret, TRUE);
+  fail_if (mpdclient->mpd_node == NULL);
+  fail_if (mpdclient->mpd_node->UTCTiming != NULL);
   gst_mpd_client_free (mpdclient);
 }
 
@@ -2459,20 +2513,60 @@
  */
 GST_START_TEST (dash_mpdparser_template_parsing)
 {
-  const gchar *url_template;
   const gchar *id = "TestId";
   guint number = 7;
   guint bandwidth = 2500;
   guint64 time = 100;
   gchar *result;
 
-  url_template = "TestMedia$Bandwidth$$$test";
-  result =
-      gst_mpdparser_build_URL_from_template (url_template, id, number,
-      bandwidth, time);
-  assert_equals_string (result, "TestMedia2500$test");
-  g_free (result);
+  struct TestUrl
+  {
+    const gchar *urlTemplate;
+    const gchar *expectedResponse;
+  };
 
+  /* various test scenarios to attempt */
+  struct TestUrl testUrl[] = {
+    {"", NULL},                 /* empty string for template */
+    {"$$", "$"},                /* escaped $ */
+    {"Number", "Number"},       /* string similar with an identifier, but without $ */
+    {"Number$Number$", "Number7"},      /* Number identifier */
+    {"Number$Number$$$", "Number7$"},   /* Number identifier followed by $$ */
+    {"Number$Number$Number$Number$", "Number7Number7"}, /* series of "Number" string and Number identifier */
+    {"Representation$RepresentationID$", "RepresentationTestId"},       /* RepresentationID identifier */
+    {"TestMedia$Bandwidth$$$test", "TestMedia2500$test"},       /* Bandwidth identifier */
+    {"TestMedia$Time$", "TestMedia100"},        /* Time identifier */
+    {"TestMedia$Time", NULL},   /* Identifier not finished with $ */
+    {"Time$Time%d$", NULL},     /* usage of %d (no width) */
+    {"Time$Time%0d$", "Time100"},       /* usage of format smaller than number of digits */
+    {"Time$Time%01d$", "Time100"},      /* usage of format smaller than number of digits */
+    {"Time$Time%05d$", "Time00100"},    /* usage of format bigger than number of digits */
+    {"Time$Time%05dtest$", "Time00100test"},    /* usage extra text in format */
+    {"Time$Time%3d$", NULL},    /* incorrect format: width does not start with 0 */
+    {"Time$Time%0-4d$", NULL},  /* incorrect format: width is not a number */
+    {"Time$Time%0$", NULL},     /* incorrect format: no d, x or u */
+    {"Time$Time1%01d$", NULL},  /* incorrect format: does not start with % after identifier */
+    {"$Bandwidth%/init.mp4v", NULL},    /* incorrect identifier: not finished with $ */
+    {"$Number%/$Time$.mp4v", NULL},     /* incorrect number of $ separators */
+    {"$RepresentationID1$", NULL},      /* incorrect identifier */
+    {"$Bandwidth1$", NULL},     /* incorrect identifier */
+    {"$Number1$", NULL},        /* incorrect identifier */
+    {"$RepresentationID%01d$", NULL},   /* incorrect format: RepresentationID does not support formatting */
+    {"Time$Time%05u$", NULL},   /* %u format */
+    {"Time$Time%05x$", NULL},   /* %x format */
+    {"Time$Time%05utest$", NULL},       /* %u format followed by text */
+    {"Time$Time%05xtest$", NULL},       /* %x format followed by text */
+    {"Time$Time%05xtest%$", NULL},      /* second % character in format */
+  };
+
+  guint count = sizeof (testUrl) / sizeof (testUrl[0]);
+  for (int i = 0; i < count; i++) {
+    result =
+        gst_mpdparser_build_URL_from_template (testUrl[i].urlTemplate, id,
+        number, bandwidth, time);
+    assert_equals_string (result, testUrl[i].expectedResponse);
+    g_free (result);
+  }
 }
 
 GST_END_TEST;
@@ -2541,6 +2635,114 @@
 GST_END_TEST;
 
 /*
+ * Test bitstreamSwitching inheritance from Period to AdaptationSet
+ *
+ * Description of bistreamSwitching attribute in Period:
+ * "When set to ‘true’, this is equivalent as if the
+ * AdaptationSet@bitstreamSwitching for each Adaptation Set contained in this
+ * Period is set to 'true'. In this case, the AdaptationSet@bitstreamSwitching
+ * attribute shall not be set to 'false' for any Adaptation Set in this Period"
+ *
+ */
+GST_START_TEST (dash_mpdparser_bitstreamSwitching_inheritance)
+{
+  GList *adaptationSets;
+  GstAdaptationSetNode *adapt_set;
+  guint activeStreams;
+  GstActiveStream *activeStream;
+  GstCaps *caps;
+  GstStructure *s;
+  gboolean bitstreamSwitchingFlag;
+
+  const gchar *xml =
+      "<?xml version=\"1.0\"?>"
+      "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\""
+      "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\">"
+      "  <Period id=\"Period0\""
+      "          duration=\"P0Y0M1DT1H1M1S\""
+      "          bitstreamSwitching=\"true\">"
+      "    <AdaptationSet id=\"1\""
+      "                   mimeType=\"video/mp4\">"
+      "      <Representation>"
+      "      </Representation>"
+      "    </AdaptationSet>"
+      "    <AdaptationSet id=\"2\""
+      "                   mimeType=\"audio\""
+      "                   bitstreamSwitching=\"false\">"
+      "      <Representation>"
+      "      </Representation></AdaptationSet></Period></MPD>";
+
+  gboolean ret;
+  GstMpdClient *mpdclient = gst_mpd_client_new ();
+
+  ret = gst_mpd_parse (mpdclient, xml, (gint) strlen (xml));
+  assert_equals_int (ret, TRUE);
+
+  /* process the xml data */
+  ret = gst_mpd_client_setup_media_presentation (mpdclient, GST_CLOCK_TIME_NONE,
+      -1, NULL);
+  assert_equals_int (ret, TRUE);
+
+  /* get the list of adaptation sets of the first period */
+  adaptationSets = gst_mpd_client_get_adaptation_sets (mpdclient);
+  fail_if (adaptationSets == NULL);
+
+  /* setup streaming from the first adaptation set */
+  adapt_set = (GstAdaptationSetNode *) g_list_nth_data (adaptationSets, 0);
+  fail_if (adapt_set == NULL);
+  ret = gst_mpd_client_setup_streaming (mpdclient, adapt_set);
+  assert_equals_int (ret, TRUE);
+
+  /* setup streaming from the second adaptation set */
+  adapt_set = (GstAdaptationSetNode *) g_list_nth_data (adaptationSets, 1);
+  fail_if (adapt_set == NULL);
+  ret = gst_mpd_client_setup_streaming (mpdclient, adapt_set);
+  assert_equals_int (ret, TRUE);
+
+  /* 2 active streams */
+  activeStreams = gst_mpdparser_get_nb_active_stream (mpdclient);
+  assert_equals_int (activeStreams, 2);
+
+  /* get details of the first active stream */
+  activeStream = gst_mpdparser_get_active_stream_by_index (mpdclient, 0);
+  fail_if (activeStream == NULL);
+
+  assert_equals_int (activeStream->mimeType, GST_STREAM_VIDEO);
+  caps = gst_mpd_client_get_stream_caps (activeStream);
+  fail_unless (caps != NULL);
+  s = gst_caps_get_structure (caps, 0);
+  assert_equals_string (gst_structure_get_name (s), "video/quicktime");
+  gst_caps_unref (caps);
+
+  /* inherited from Period's bitstreamSwitching */
+  bitstreamSwitchingFlag =
+      gst_mpd_client_get_bitstream_switching_flag (activeStream);
+  assert_equals_int (bitstreamSwitchingFlag, TRUE);
+
+  /* get details of the second active stream */
+  activeStream = gst_mpdparser_get_active_stream_by_index (mpdclient, 1);
+  fail_if (activeStream == NULL);
+
+  assert_equals_int (activeStream->mimeType, GST_STREAM_AUDIO);
+  caps = gst_mpd_client_get_stream_caps (activeStream);
+  fail_unless (caps != NULL);
+  s = gst_caps_get_structure (caps, 0);
+  assert_equals_string (gst_structure_get_name (s), "audio");
+  gst_caps_unref (caps);
+
+  /* set to FALSE in our example, but overwritten to TRUE by Period's
+   * bitstreamSwitching
+   */
+  bitstreamSwitchingFlag =
+      gst_mpd_client_get_bitstream_switching_flag (activeStream);
+  assert_equals_int (bitstreamSwitchingFlag, TRUE);
+
+  gst_mpd_client_free (mpdclient);
+}
+
+GST_END_TEST;
+
+/*
  * Test various duration formats
  */
 GST_START_TEST (dash_mpdparser_various_duration_formats)
@@ -2575,50 +2777,50 @@
   periodNode =
       (GstPeriodNode *) g_list_nth_data (mpdclient->mpd_node->Periods, 0);
   assert_equals_string (periodNode->id, "Period0");
-  assert_equals_int64 (periodNode->start,
-      (gint64) duration_to_ms (0, 0, 0, 0, 0, 1, 0));
+  assert_equals_uint64 (periodNode->start,
+      duration_to_ms (0, 0, 0, 0, 0, 1, 0));
 
   periodNode =
       (GstPeriodNode *) g_list_nth_data (mpdclient->mpd_node->Periods, 1);
   assert_equals_string (periodNode->id, "Period1");
-  assert_equals_int64 (periodNode->start,
-      (gint64) duration_to_ms (0, 0, 0, 0, 0, 1, 500));
+  assert_equals_uint64 (periodNode->start,
+      duration_to_ms (0, 0, 0, 0, 0, 1, 500));
 
   periodNode =
       (GstPeriodNode *) g_list_nth_data (mpdclient->mpd_node->Periods, 2);
   assert_equals_string (periodNode->id, "Period2");
-  assert_equals_int64 (periodNode->start,
-      (gint64) duration_to_ms (0, 0, 0, 0, 0, 1, 700));
+  assert_equals_uint64 (periodNode->start,
+      duration_to_ms (0, 0, 0, 0, 0, 1, 700));
 
   periodNode =
       (GstPeriodNode *) g_list_nth_data (mpdclient->mpd_node->Periods, 3);
   assert_equals_string (periodNode->id, "Period3");
-  assert_equals_int64 (periodNode->start,
-      (gint64) duration_to_ms (0, 0, 0, 0, 1, 0, 0));
+  assert_equals_uint64 (periodNode->start,
+      duration_to_ms (0, 0, 0, 0, 1, 0, 0));
 
   periodNode =
       (GstPeriodNode *) g_list_nth_data (mpdclient->mpd_node->Periods, 4);
   assert_equals_string (periodNode->id, "Period4");
-  assert_equals_int64 (periodNode->start,
-      (gint64) duration_to_ms (0, 0, 0, 1, 0, 0, 0));
+  assert_equals_uint64 (periodNode->start,
+      duration_to_ms (0, 0, 0, 1, 0, 0, 0));
 
   periodNode =
       (GstPeriodNode *) g_list_nth_data (mpdclient->mpd_node->Periods, 5);
   assert_equals_string (periodNode->id, "Period5");
-  assert_equals_int64 (periodNode->start,
-      (gint64) duration_to_ms (0, 0, 1, 0, 0, 0, 0));
+  assert_equals_uint64 (periodNode->start,
+      duration_to_ms (0, 0, 1, 0, 0, 0, 0));
 
   periodNode =
       (GstPeriodNode *) g_list_nth_data (mpdclient->mpd_node->Periods, 6);
   assert_equals_string (periodNode->id, "Period6");
-  assert_equals_int64 (periodNode->start,
-      (gint64) duration_to_ms (0, 1, 0, 0, 0, 0, 0));
+  assert_equals_uint64 (periodNode->start,
+      duration_to_ms (0, 1, 0, 0, 0, 0, 0));
 
   periodNode =
       (GstPeriodNode *) g_list_nth_data (mpdclient->mpd_node->Periods, 7);
   assert_equals_string (periodNode->id, "Period7");
-  assert_equals_int64 (periodNode->start,
-      (gint64) duration_to_ms (1, 0, 0, 0, 0, 0, 0));
+  assert_equals_uint64 (periodNode->start,
+      duration_to_ms (1, 0, 0, 0, 0, 0, 0));
 
   gst_mpd_client_free (mpdclient);
 }
@@ -3080,7 +3282,8 @@
   GstAdaptationSetNode *adapt_set;
   guint activeStreams;
   GstActiveStream *activeStream;
-  const gchar *mimeType;
+  GstCaps *caps;
+  GstStructure *s;
   gboolean bitstreamSwitchingFlag;
   guint videoStreamWidth;
   guint videoStreamHeight;
@@ -3133,8 +3336,11 @@
   fail_if (activeStream == NULL);
 
   assert_equals_int (activeStream->mimeType, GST_STREAM_VIDEO);
-  mimeType = gst_mpd_client_get_stream_mimeType (activeStream);
-  assert_equals_string (mimeType, "video/quicktime");
+  caps = gst_mpd_client_get_stream_caps (activeStream);
+  fail_unless (caps != NULL);
+  s = gst_caps_get_structure (caps, 0);
+  assert_equals_string (gst_structure_get_name (s), "video/quicktime");
+  gst_caps_unref (caps);
 
   bitstreamSwitchingFlag =
       gst_mpd_client_get_bitstream_switching_flag (activeStream);
@@ -3416,6 +3622,179 @@
 
 GST_END_TEST;
 
+/* test multiple BaseUrl entries per section */
+GST_START_TEST (dash_mpdparser_get_baseURL5)
+{
+  GstPeriodNode *periodNode;
+  GstAdaptationSetNode *adaptationSet;
+  GstRepresentationNode *representation;
+  const gchar *baseURL;
+  GstBaseURL *gstBaseURL;
+
+  const gchar *xml =
+      "<?xml version=\"1.0\"?>"
+      "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\""
+      "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\">"
+      "  <BaseURL>/mpd_base_url1/</BaseURL>"
+      "  <BaseURL>/mpd_base_url2/</BaseURL>"
+      "  <Period id=\"Period0\" duration=\"P0Y0M1DT1H1M1S\">"
+      "    <BaseURL> period_base_url1/</BaseURL>"
+      "    <BaseURL> period_base_url2/</BaseURL>"
+      "    <BaseURL> period_base_url3/</BaseURL>"
+      "    <AdaptationSet id=\"1\" mimeType=\"audio\" lang=\"en\">"
+      "      <BaseURL>adaptation_base_url1/</BaseURL>"
+      "      <BaseURL>adaptation_base_url2/</BaseURL>"
+      "      <BaseURL>adaptation_base_url3/</BaseURL>"
+      "      <BaseURL>adaptation_base_url4/</BaseURL>"
+      "      <Representation>"
+      "        <BaseURL>representation_base_url1/</BaseURL>"
+      "        <BaseURL>representation_base_url2/</BaseURL>"
+      "        <BaseURL>representation_base_url3/</BaseURL>"
+      "        <BaseURL>representation_base_url4/</BaseURL>"
+      "        <BaseURL>representation_base_url5/</BaseURL>"
+      "      </Representation></AdaptationSet></Period></MPD>";
+
+  GstMpdClient *mpdclient = setup_mpd_client (xml);
+
+  assert_equals_int (g_list_length (mpdclient->mpd_node->BaseURLs), 2);
+  gstBaseURL = g_list_nth_data (mpdclient->mpd_node->BaseURLs, 0);
+  assert_equals_string (gstBaseURL->baseURL, "/mpd_base_url1/");
+  gstBaseURL = g_list_nth_data (mpdclient->mpd_node->BaseURLs, 1);
+  assert_equals_string (gstBaseURL->baseURL, "/mpd_base_url2/");
+
+  periodNode = (GstPeriodNode *) mpdclient->mpd_node->Periods->data;
+  assert_equals_int (g_list_length (periodNode->BaseURLs), 3);
+  gstBaseURL = g_list_nth_data (periodNode->BaseURLs, 0);
+  assert_equals_string (gstBaseURL->baseURL, " period_base_url1/");
+  gstBaseURL = g_list_nth_data (periodNode->BaseURLs, 1);
+  assert_equals_string (gstBaseURL->baseURL, " period_base_url2/");
+  gstBaseURL = g_list_nth_data (periodNode->BaseURLs, 2);
+  assert_equals_string (gstBaseURL->baseURL, " period_base_url3/");
+
+  adaptationSet = (GstAdaptationSetNode *) periodNode->AdaptationSets->data;
+  assert_equals_int (g_list_length (adaptationSet->BaseURLs), 4);
+  gstBaseURL = g_list_nth_data (adaptationSet->BaseURLs, 0);
+  assert_equals_string (gstBaseURL->baseURL, "adaptation_base_url1/");
+  gstBaseURL = g_list_nth_data (adaptationSet->BaseURLs, 1);
+  assert_equals_string (gstBaseURL->baseURL, "adaptation_base_url2/");
+  gstBaseURL = g_list_nth_data (adaptationSet->BaseURLs, 2);
+  assert_equals_string (gstBaseURL->baseURL, "adaptation_base_url3/");
+  gstBaseURL = g_list_nth_data (adaptationSet->BaseURLs, 3);
+  assert_equals_string (gstBaseURL->baseURL, "adaptation_base_url4/");
+
+  representation = (GstRepresentationNode *)
+      adaptationSet->Representations->data;
+  assert_equals_int (g_list_length (representation->BaseURLs), 5);
+  gstBaseURL = g_list_nth_data (representation->BaseURLs, 0);
+  assert_equals_string (gstBaseURL->baseURL, "representation_base_url1/");
+  gstBaseURL = g_list_nth_data (representation->BaseURLs, 1);
+  assert_equals_string (gstBaseURL->baseURL, "representation_base_url2/");
+  gstBaseURL = g_list_nth_data (representation->BaseURLs, 2);
+  assert_equals_string (gstBaseURL->baseURL, "representation_base_url3/");
+  gstBaseURL = g_list_nth_data (representation->BaseURLs, 3);
+  assert_equals_string (gstBaseURL->baseURL, "representation_base_url4/");
+  gstBaseURL = g_list_nth_data (representation->BaseURLs, 4);
+  assert_equals_string (gstBaseURL->baseURL, "representation_base_url5/");
+
+  /* test baseURL. Its value should be computed like this:
+   *  - start with xml url (null)
+   *  - set it to the value from MPD's BaseURL element: "/mpd_base_url1/"
+   *  - update the value with BaseURL element from Period. Because this
+   * is a relative url, it will update the current value. baseURL becomes
+   * "/mpd_base_url1/period_base_url1/"
+   *  - update the value with BaseURL element from AdaptationSet. Because this
+   * is a relative url, it will update the current value. baseURL becomes
+   * "/mpd_base_url1/period_base_url1/adaptation_base_url1/"
+   *  - update the value with BaseURL element from Representation. Because this
+   * is an relative url, it will update the current value."
+   */
+  baseURL = gst_mpdparser_get_baseURL (mpdclient, 0);
+  fail_if (baseURL == NULL);
+  assert_equals_string (baseURL,
+      "/mpd_base_url1/period_base_url1/adaptation_base_url1/representation_base_url1/");
+
+  gst_mpd_client_free (mpdclient);
+}
+
+GST_END_TEST;
+
+/* test no BaseURL */
+GST_START_TEST (dash_mpdparser_get_baseURL6)
+{
+  const gchar *baseURL;
+  const gchar *xml =
+      "<?xml version=\"1.0\"?>"
+      "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\""
+      "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\">"
+      "  <Period id=\"Period0\" duration=\"P0Y0M1DT1H1M1S\">"
+      "    <AdaptationSet id=\"1\" mimeType=\"audio\" lang=\"en\">"
+      "      <Representation>"
+      "      </Representation></AdaptationSet></Period></MPD>";
+
+  GstMpdClient *mpdclient = setup_mpd_client (xml);
+
+  baseURL = gst_mpdparser_get_baseURL (mpdclient, 0);
+  fail_if (baseURL == NULL);
+  assert_equals_string (baseURL, "");
+
+  gst_mpd_client_free (mpdclient);
+}
+
+GST_END_TEST;
+
+/* BaseURL: test that the path is made absolute (a / is prepended if needed */
+GST_START_TEST (dash_mpdparser_get_baseURL7)
+{
+  const gchar *baseURL;
+  const gchar *xml =
+      "<?xml version=\"1.0\"?>"
+      "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\""
+      "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\">"
+      "  <BaseURL>x/example.com/</BaseURL>"
+      "  <Period id=\"Period0\" duration=\"P0Y0M1DT1H1M1S\">"
+      "    <AdaptationSet id=\"1\" mimeType=\"audio\" lang=\"en\">"
+      "      <Representation>"
+      "      </Representation></AdaptationSet></Period></MPD>";
+
+  GstMpdClient *mpdclient;
+
+  mpdclient = setup_mpd_client (xml);
+
+  baseURL = gst_mpdparser_get_baseURL (mpdclient, 0);
+  fail_if (baseURL == NULL);
+  assert_equals_string (baseURL, "/x/example.com/");
+
+  gst_mpd_client_free (mpdclient);
+}
+
+GST_END_TEST;
+
+/* BaseURL: test that a / is not prepended if the string contains ':'
+ * This tests uris with schema present */
+GST_START_TEST (dash_mpdparser_get_baseURL8)
+{
+  const gchar *baseURL;
+  const gchar *xml =
+      "<?xml version=\"1.0\"?>"
+      "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\""
+      "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\">"
+      "  <BaseURL>x:y/example.com/</BaseURL>"
+      "  <Period id=\"Period0\" duration=\"P0Y0M1DT1H1M1S\">"
+      "    <AdaptationSet id=\"1\" mimeType=\"audio\" lang=\"en\">"
+      "      <Representation>"
+      "      </Representation></AdaptationSet></Period></MPD>";
+
+  GstMpdClient *mpdclient = setup_mpd_client (xml);
+
+  baseURL = gst_mpdparser_get_baseURL (mpdclient, 0);
+  fail_if (baseURL == NULL);
+  assert_equals_string (baseURL, "x:y/example.com/");
+
+  gst_mpd_client_free (mpdclient);
+}
+
+GST_END_TEST;
+
 /*
  * Test getting mediaPresentationDuration
  *
@@ -3509,12 +3888,9 @@
   gboolean hasNextSegment;
   GstActiveStream *activeStream;
   GstFlowReturn flow;
-  GstMediaSegment segment;
   GstDateTime *segmentEndTime;
   GstDateTime *gst_time;
   GDateTime *g_time;
-  GstClockTime ts;
-  gint64 diff;
 
   const gchar *xml =
       "<?xml version=\"1.0\"?>"
@@ -3523,7 +3899,7 @@
       "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\""
       "     availabilityStartTime=\"2015-03-24T0:0:0\""
       "     mediaPresentationDuration=\"P0Y0M0DT3H3M30S\">"
-      "  <Period id=\"Period0\">"
+      "  <Period id=\"Period0\" start=\"P0Y0M0DT0H0M10S\">"
       "    <AdaptationSet mimeType=\"video/mp4\">"
       "      <Representation>"
       "        <SegmentList duration=\"45\">"
@@ -3602,11 +3978,6 @@
       gst_mpd_client_has_next_segment (mpdclient, activeStream, TRUE);
   assert_equals_int (hasNextSegment, 0);
 
-  /* get chunk 0. segment_index will not change */
-  ret = gst_mpdparser_get_chunk_by_index (mpdclient, 0, 0, &segment);
-  assert_equals_int (ret, 1);
-  assert_equals_int (segment.number, 1);
-
   /* segment index is still 1 */
   hasNextSegment =
       gst_mpd_client_has_next_segment (mpdclient, activeStream, TRUE);
@@ -3615,6 +3986,7 @@
   /* each segment has a duration of 0 hours, 0 min 45 seconds
    * segment index is 1.
    * End time is at the end of segment 1, so 2 * segment_duration = 2 * 45s
+   * We also add period start time (10s)
    */
   segmentEndTime =
       gst_mpd_client_get_next_segment_availability_end_time (mpdclient,
@@ -3624,7 +3996,7 @@
   assert_equals_int (gst_date_time_get_day (segmentEndTime), 24);
   assert_equals_int (gst_date_time_get_hour (segmentEndTime), 0);
   assert_equals_int (gst_date_time_get_minute (segmentEndTime), 1);
-  assert_equals_int (gst_date_time_get_second (segmentEndTime), 30);
+  assert_equals_int (gst_date_time_get_second (segmentEndTime), 40);
   gst_date_time_unref (segmentEndTime);
 
   /* seek to time */
@@ -3640,15 +4012,6 @@
       gst_mpd_client_has_next_segment (mpdclient, activeStream, TRUE);
   assert_equals_int (hasNextSegment, 1);
 
-  /* check if stream at moment ts is available.
-   * timeShiftBufferDepth was not set, so it is considered infinite.
-   * All segments from the past must be available
-   */
-  ts = 30 * GST_SECOND;
-  ret = gst_mpd_client_check_time_position (mpdclient, activeStream, ts, &diff);
-  assert_equals_int (ret, 0);
-  assert_equals_int64 (diff, 0);
-
   gst_mpd_client_free (mpdclient);
 }
 
@@ -3940,36 +4303,11 @@
   expectedDuration = duration_to_ms (0, 0, 0, 0, 0, 110, 0);
   expectedTimestamp = duration_to_ms (0, 0, 0, 0, 0, 0, 0);
 
-  /* the representation contains 2 segments
-   *  - one inherited from AdaptationSet (duration 100)
-   *  - the second defined in the Representation (duration 110)
-   *
-   * Both will have the duration specified in the Representation (110)
-   */
+  /* the representation contains 1 segment (the one from Representation) */
 
   /* check first segment */
   ret = gst_mpd_client_get_next_fragment (mpdclient, 0, &fragment);
   assert_equals_int (ret, TRUE);
-  assert_equals_string (fragment.uri, "/TestMediaAdaptation");
-  assert_equals_int64 (fragment.range_start, 10);
-  assert_equals_int64 (fragment.range_end, 20);
-  assert_equals_string (fragment.index_uri, "/TestIndexAdaptation");
-  assert_equals_int64 (fragment.index_range_start, 30);
-  assert_equals_int64 (fragment.index_range_end, 40);
-  assert_equals_uint64 (fragment.duration, expectedDuration * GST_MSECOND);
-  assert_equals_uint64 (fragment.timestamp, expectedTimestamp * GST_MSECOND);
-  gst_media_fragment_info_clear (&fragment);
-
-  /* advance to next segment */
-  flow = gst_mpd_client_advance_segment (mpdclient, activeStream, TRUE);
-  assert_equals_int (flow, GST_FLOW_OK);
-
-  /* second segment starts after first ends */
-  expectedTimestamp = expectedTimestamp + expectedDuration;
-
-  /* check second segment */
-  ret = gst_mpd_client_get_next_fragment (mpdclient, 0, &fragment);
-  assert_equals_int (ret, TRUE);
   assert_equals_string (fragment.uri, "/TestMediaRep");
   assert_equals_int64 (fragment.range_start, 100);
   assert_equals_int64 (fragment.range_end, 200);
@@ -3980,6 +4318,10 @@
   assert_equals_uint64 (fragment.timestamp, expectedTimestamp * GST_MSECOND);
   gst_media_fragment_info_clear (&fragment);
 
+  /* try to advance to next segment. Should fail */
+  flow = gst_mpd_client_advance_segment (mpdclient, activeStream, TRUE);
+  assert_equals_int (flow, GST_FLOW_EOS);
+
   gst_mpd_client_free (mpdclient);
 }
 
@@ -4078,6 +4420,8 @@
   GstClockTime expectedDuration;
   GstClockTime expectedTimestamp;
   GstClockTime periodStartTime;
+  GstClockTime offset;
+  GstClockTime lastFragmentTimestampEnd;
   const gchar *xml =
       "<?xml version=\"1.0\"?>"
       "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\""
@@ -4088,6 +4432,7 @@
       "    <AdaptationSet mimeType=\"video/mp4\">"
       "      <Representation id=\"repId\" bandwidth=\"250000\">"
       "        <SegmentTemplate duration=\"12000\""
+      "                         presentationTimeOffset=\"15\""
       "                         media=\"TestMedia_rep=$RepresentationID$number=$Number$bandwidth=$Bandwidth$time=$Time$\""
       "                         index=\"TestIndex\">"
       "        </SegmentTemplate>"
@@ -4147,8 +4492,22 @@
   periodStartTime = gst_mpd_parser_get_period_start_time (mpdclient);
   assert_equals_uint64 (periodStartTime, 10 * GST_SECOND);
 
+  offset = gst_mpd_parser_get_stream_presentation_offset (mpdclient, 0);
+  assert_equals_uint64 (offset, 15 * GST_SECOND);
+
   gst_media_fragment_info_clear (&fragment);
 
+  /*
+   * Period starts at 10s.
+   * MPD has a duration of 3h3m30s, so period duration is 3h3m20s.
+   * We expect the last fragment to end at period start + period duration: 3h3m30s
+   */
+  expectedTimestamp = duration_to_ms (0, 0, 0, 3, 3, 30, 0);
+  gst_mpd_client_get_last_fragment_timestamp_end (mpdclient, 0,
+      &lastFragmentTimestampEnd);
+  assert_equals_uint64 (lastFragmentTimestampEnd,
+      expectedTimestamp * GST_MSECOND);
+
   gst_mpd_client_free (mpdclient);
 }
 
@@ -4274,6 +4633,138 @@
 GST_END_TEST;
 
 /*
+ * Test SegmentList with multiple inherited segmentURLs
+ *
+ */
+GST_START_TEST (dash_mpdparser_multiple_inherited_segmentURL)
+{
+  GList *adaptationSets;
+  GstAdaptationSetNode *adapt_set;
+  GstActiveStream *activeStream;
+  GstMediaFragmentInfo fragment;
+  GstClockTime expectedDuration;
+  GstClockTime expectedTimestamp;
+  GstFlowReturn flow;
+
+  /*
+   * Period duration is 30 seconds
+   * Period start is 10 seconds. Thus, period duration is 20 seconds.
+   *
+   * There are 2 segments in the AdaptationSet segment list and 2 in the
+   * Representation's segment list.
+   * Segment duration is 5s for the Adaptation segments and 8s for
+   * Representation segments.
+   * Separately, each segment list (duration 2*5=10 or 2*8=16) fits comfortably
+   * in the Period's 20s duration.
+   *
+   * We expect the Representation segments to overwrite the AdaptationSet segments.
+   */
+  const gchar *xml =
+      "<?xml version=\"1.0\"?>"
+      "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\""
+      " profiles=\"urn:mpeg:dash:profile:isoff-main:2011\""
+      " availabilityStartTime=\"2015-03-24T0:0:0\""
+      " mediaPresentationDuration=\"P0Y0M0DT0H0M30S\">"
+      "<Period start=\"P0Y0M0DT0H0M10S\">"
+      "  <AdaptationSet mimeType=\"video/mp4\">"
+      "    <SegmentList duration=\"5\">"
+      "      <SegmentURL"
+      "         media=\"TestMedia0\" mediaRange=\"10-20\""
+      "         index=\"TestIndex0\" indexRange=\"100-200\""
+      "      ></SegmentURL>"
+      "      <SegmentURL"
+      "         media=\"TestMedia1\" mediaRange=\"20-30\""
+      "         index=\"TestIndex1\" indexRange=\"200-300\""
+      "      ></SegmentURL>"
+      "    </SegmentList>"
+      "    <Representation>"
+      "      <SegmentList duration=\"8\">"
+      "        <SegmentURL"
+      "           media=\"TestMedia2\" mediaRange=\"30-40\""
+      "           index=\"TestIndex2\" indexRange=\"300-400\""
+      "        ></SegmentURL>"
+      "        <SegmentURL"
+      "           media=\"TestMedia3\" mediaRange=\"40-50\""
+      "           index=\"TestIndex3\" indexRange=\"400-500\""
+      "        ></SegmentURL>"
+      "      </SegmentList>"
+      "    </Representation></AdaptationSet></Period></MPD>";
+
+  gboolean ret;
+  GstMpdClient *mpdclient = gst_mpd_client_new ();
+
+  ret = gst_mpd_parse (mpdclient, xml, (gint) strlen (xml));
+  assert_equals_int (ret, TRUE);
+
+  /* process the xml data */
+  ret = gst_mpd_client_setup_media_presentation (mpdclient, GST_CLOCK_TIME_NONE,
+      -1, NULL);
+  assert_equals_int (ret, TRUE);
+
+  /* get the list of adaptation sets of the first period */
+  adaptationSets = gst_mpd_client_get_adaptation_sets (mpdclient);
+  fail_if (adaptationSets == NULL);
+
+  /* setup streaming from the first adaptation set */
+  adapt_set = (GstAdaptationSetNode *) g_list_nth_data (adaptationSets, 0);
+  fail_if (adapt_set == NULL);
+  ret = gst_mpd_client_setup_streaming (mpdclient, adapt_set);
+  assert_equals_int (ret, TRUE);
+
+  activeStream = gst_mpdparser_get_active_stream_by_index (mpdclient, 0);
+  fail_if (activeStream == NULL);
+
+  expectedDuration = duration_to_ms (0, 0, 0, 0, 0, 8, 0);
+  expectedTimestamp = duration_to_ms (0, 0, 0, 0, 0, 0, 0);
+
+  /* the representation contains 2 segments defined in the Representation
+   *
+   * Both will have the duration specified in the Representation (8)
+   */
+
+  /* check first segment */
+  ret = gst_mpd_client_get_next_fragment (mpdclient, 0, &fragment);
+  assert_equals_int (ret, TRUE);
+  assert_equals_string (fragment.uri, "/TestMedia2");
+  assert_equals_int64 (fragment.range_start, 30);
+  assert_equals_int64 (fragment.range_end, 40);
+  assert_equals_string (fragment.index_uri, "/TestIndex2");
+  assert_equals_int64 (fragment.index_range_start, 300);
+  assert_equals_int64 (fragment.index_range_end, 400);
+  assert_equals_uint64 (fragment.duration, expectedDuration * GST_MSECOND);
+  assert_equals_uint64 (fragment.timestamp, expectedTimestamp * GST_MSECOND);
+  gst_media_fragment_info_clear (&fragment);
+
+  /* advance to next segment */
+  flow = gst_mpd_client_advance_segment (mpdclient, activeStream, TRUE);
+  assert_equals_int (flow, GST_FLOW_OK);
+
+  /* second segment starts after previous ends */
+  expectedTimestamp = expectedTimestamp + expectedDuration;
+
+  /* check second segment */
+  ret = gst_mpd_client_get_next_fragment (mpdclient, 0, &fragment);
+  assert_equals_int (ret, TRUE);
+  assert_equals_string (fragment.uri, "/TestMedia3");
+  assert_equals_int64 (fragment.range_start, 40);
+  assert_equals_int64 (fragment.range_end, 50);
+  assert_equals_string (fragment.index_uri, "/TestIndex3");
+  assert_equals_int64 (fragment.index_range_start, 400);
+  assert_equals_int64 (fragment.index_range_end, 500);
+  assert_equals_uint64 (fragment.duration, expectedDuration * GST_MSECOND);
+  assert_equals_uint64 (fragment.timestamp, expectedTimestamp * GST_MSECOND);
+  gst_media_fragment_info_clear (&fragment);
+
+  /* try to advance to the next segment. There isn't any, so it should fail */
+  flow = gst_mpd_client_advance_segment (mpdclient, activeStream, TRUE);
+  assert_equals_int (flow, GST_FLOW_EOS);
+
+  gst_mpd_client_free (mpdclient);
+}
+
+GST_END_TEST;
+
+/*
  * Test parsing empty xml string
  *
  */
@@ -4438,6 +4929,368 @@
 
 GST_END_TEST;
 
+GST_START_TEST (dash_mpdparser_whitespace_strings)
+{
+  fail_unless (gst_mpdparser_validate_no_whitespace ("") == TRUE);
+  fail_unless (gst_mpdparser_validate_no_whitespace ("/") == TRUE);
+  fail_unless (gst_mpdparser_validate_no_whitespace (" ") == FALSE);
+  fail_unless (gst_mpdparser_validate_no_whitespace ("aaaaaaaa ") == FALSE);
+  fail_unless (gst_mpdparser_validate_no_whitespace ("a\ta") == FALSE);
+  fail_unless (gst_mpdparser_validate_no_whitespace ("a\ra") == FALSE);
+  fail_unless (gst_mpdparser_validate_no_whitespace ("a\na") == FALSE);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (dash_mpdparser_rfc1738_strings)
+{
+  fail_unless (gst_mpdparser_validate_rfc1738_url ("/") == TRUE);
+  fail_unless (gst_mpdparser_validate_rfc1738_url (" ") == FALSE);
+  fail_unless (gst_mpdparser_validate_rfc1738_url ("aaaaaaaa ") == FALSE);
+
+  fail_unless (gst_mpdparser_validate_rfc1738_url ("") == TRUE);
+  fail_unless (gst_mpdparser_validate_rfc1738_url ("a") == TRUE);
+  fail_unless (gst_mpdparser_validate_rfc1738_url
+      (";:@&=aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789$-_.+!*'(),%AA")
+      == TRUE);
+  fail_unless (gst_mpdparser_validate_rfc1738_url
+      (";:@&=aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789$-_.+!*'(),/%AA")
+      == TRUE);
+  fail_unless (gst_mpdparser_validate_rfc1738_url
+      (";:@&=aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ0123456789$-_.+!*'(),% ")
+      == FALSE);
+  fail_unless (gst_mpdparser_validate_rfc1738_url ("%AA") == TRUE);
+  fail_unless (gst_mpdparser_validate_rfc1738_url ("%A") == FALSE);
+  fail_unless (gst_mpdparser_validate_rfc1738_url ("%") == FALSE);
+  fail_unless (gst_mpdparser_validate_rfc1738_url ("%XA") == FALSE);
+  fail_unless (gst_mpdparser_validate_rfc1738_url ("%AX") == FALSE);
+  fail_unless (gst_mpdparser_validate_rfc1738_url ("%XX") == FALSE);
+  fail_unless (gst_mpdparser_validate_rfc1738_url ("\001") == FALSE);
+}
+
+GST_END_TEST;
+
+/*
+ * Test negative period duration
+ */
+GST_START_TEST (dash_mpdparser_negative_period_duration)
+{
+  const gchar *xml =
+      "<?xml version=\"1.0\"?>"
+      "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\""
+      "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\""
+      "     availabilityStartTime=\"2015-03-24T0:0:0\""
+      "     mediaPresentationDuration=\"P0Y0M0DT3H3M30S\">"
+      "  <Period id=\"Period0\""
+      "          start=\"P0Y0M0DT1H0M0S\""
+      "          duration=\"-PT10S\">"
+      "  </Period><Period id=\"Period1\"></Period></MPD>";
+
+  gboolean ret;
+  GstMpdClient *mpdclient = gst_mpd_client_new ();
+
+  ret = gst_mpd_parse (mpdclient, xml, (gint) strlen (xml));
+  assert_equals_int (ret, TRUE);
+
+  /* process the xml data
+   * should fail due to negative duration of Period0
+   */
+  ret = gst_mpd_client_setup_media_presentation (mpdclient, GST_CLOCK_TIME_NONE,
+      -1, NULL);
+  assert_equals_int (ret, FALSE);
+
+  gst_mpd_client_free (mpdclient);
+}
+
+GST_END_TEST;
+
+/*
+ * Test parsing negative values from attributes that should be unsigned
+ *
+ */
+GST_START_TEST (dash_mpdparser_read_unsigned_from_negative_values)
+{
+  GstPeriodNode *periodNode;
+  GstSegmentBaseType *segmentBase;
+  GstAdaptationSetNode *adaptationSet;
+  GstRepresentationNode *representation;
+  GstSubRepresentationNode *subRepresentation;
+
+  const gchar *xml =
+      "<?xml version=\"1.0\"?>"
+      "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\""
+      "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\""
+      "     availabilityStartTime=\"2015--1-13T12:25:37\">"
+      "  <Period start=\"-P-2015Y\" duration=\"-P-5M\">"
+      "    <SegmentBase presentationTimeOffset=\"-10\""
+      "                 timescale=\"-5\""
+      "                 indexRange=\"1--10\">"
+      "    </SegmentBase>"
+      "    <AdaptationSet par=\"-1:7\""
+      "                   minFrameRate=\" -1\""
+      "                   segmentAlignment=\"-4\">"
+      "      <Representation>"
+      "        <SubRepresentation dependencyLevel=\"1 -2 3\">"
+      "        </SubRepresentation>"
+      "      </Representation></AdaptationSet></Period></MPD>";
+
+  gboolean ret;
+  GstMpdClient *mpdclient = gst_mpd_client_new ();
+
+  ret = gst_mpd_parse (mpdclient, xml, (gint) strlen (xml));
+  assert_equals_int (ret, TRUE);
+
+  periodNode = (GstPeriodNode *) mpdclient->mpd_node->Periods->data;
+  segmentBase = periodNode->SegmentBase;
+  adaptationSet = (GstAdaptationSetNode *) periodNode->AdaptationSets->data;
+  representation = (GstRepresentationNode *)
+      adaptationSet->Representations->data;
+  subRepresentation = (GstSubRepresentationNode *)
+      representation->SubRepresentations->data;
+
+  /* availabilityStartTime parsing should fail */
+  fail_if (mpdclient->mpd_node->availabilityStartTime != NULL);
+
+  /* Period start parsing should fail */
+  assert_equals_int64 (periodNode->start, -1);
+
+  /* Period duration parsing should fail */
+  assert_equals_int64 (periodNode->duration, -1);
+
+  /* expect negative value to be rejected and presentationTimeOffset to be 0 */
+  assert_equals_uint64 (segmentBase->presentationTimeOffset, 0);
+  assert_equals_uint64 (segmentBase->timescale, 1);
+  fail_if (segmentBase->indexRange != NULL);
+
+  /* par ratio parsing should fail */
+  fail_if (adaptationSet->par != NULL);
+
+  /* minFrameRate parsing should fail */
+  fail_if (adaptationSet->RepresentationBase->minFrameRate != NULL);
+
+  /* segmentAlignment parsing should fail */
+  fail_if (adaptationSet->segmentAlignment != NULL);
+
+  /* dependency level parsing should fail */
+  fail_if (subRepresentation->dependencyLevel != NULL);
+
+  gst_mpd_client_free (mpdclient);
+}
+
+GST_END_TEST;
+
+/*
+ * Test negative mediaPresentationDuration duration
+ */
+GST_START_TEST (dash_mpdparser_negative_mediaPresentationDuration)
+{
+  const gchar *xml =
+      "<?xml version=\"1.0\"?>"
+      "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\""
+      "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\""
+      "     availabilityStartTime=\"2015-03-24T0:0:0\""
+      "     mediaPresentationDuration=\"-P0Y0M0DT3H3M30S\">"
+      "  <Period id=\"Period0\" start=\"P0Y0M0DT1H0M0S\"></Period></MPD>";
+
+  gboolean ret;
+  GstMpdClient *mpdclient = gst_mpd_client_new ();
+
+  ret = gst_mpd_parse (mpdclient, xml, (gint) strlen (xml));
+  assert_equals_int (ret, TRUE);
+
+  /* process the xml data
+   * should fail due to negative duration of mediaPresentationDuration
+   */
+  ret = gst_mpd_client_setup_media_presentation (mpdclient, GST_CLOCK_TIME_NONE,
+      -1, NULL);
+  assert_equals_int (ret, FALSE);
+
+  gst_mpd_client_free (mpdclient);
+}
+
+GST_END_TEST;
+
+/*
+ * Test parsing an MPD with no profiles
+ */
+GST_START_TEST (dash_mpdparser_no_profiles)
+{
+  const gchar *xml =
+      "<?xml version=\"1.0\"?>"
+      "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\"></MPD>";
+
+  gboolean ret;
+  GstMpdClient *mpdclient = gst_mpd_client_new ();
+
+  ret = gst_mpd_parse (mpdclient, xml, strlen (xml));
+
+  assert_equals_int (ret, TRUE);
+
+  gst_mpd_client_free (mpdclient);
+}
+
+GST_END_TEST;
+
+/*
+ * Test S node list greater than SegmentURL list
+ *
+ */
+GST_START_TEST (dash_mpdparser_unmatched_segmentTimeline_segmentURL)
+{
+  GList *adaptationSets;
+  GstAdaptationSetNode *adapt_set;
+
+  const gchar *xml =
+      "<?xml version=\"1.0\"?>"
+      "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\""
+      "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\""
+      "     availabilityStartTime=\"2015-03-24T0:0:0\""
+      "     mediaPresentationDuration=\"P0Y0M0DT3H3M30S\">"
+      "  <Period start=\"P0Y0M0DT0H0M10S\">"
+      "    <AdaptationSet mimeType=\"video/mp4\">"
+      "      <Representation>"
+      "        <SegmentList>"
+      "          <SegmentTimeline>"
+      "            <S t=\"3\"  d=\"2\" r=\"1\"></S>"
+      "            <S t=\"10\" d=\"3\" r=\"0\"></S>"
+      "          </SegmentTimeline>"
+      "          <SegmentURL media=\"TestMedia0\""
+      "                      index=\"TestIndex0\">"
+      "          </SegmentURL>"
+      "        </SegmentList>"
+      "      </Representation></AdaptationSet></Period></MPD>";
+
+  gboolean ret;
+  GstMpdClient *mpdclient = gst_mpd_client_new ();
+
+  ret = gst_mpd_parse (mpdclient, xml, (gint) strlen (xml));
+  assert_equals_int (ret, TRUE);
+
+  /* process the xml data */
+  ret = gst_mpd_client_setup_media_presentation (mpdclient, GST_CLOCK_TIME_NONE,
+      -1, NULL);
+  assert_equals_int (ret, TRUE);
+
+  /* get the list of adaptation sets of the first period */
+  adaptationSets = gst_mpd_client_get_adaptation_sets (mpdclient);
+  fail_if (adaptationSets == NULL);
+
+  adapt_set = (GstAdaptationSetNode *) g_list_nth_data (adaptationSets, 0);
+  fail_if (adapt_set == NULL);
+
+  /* setup streaming from the first adaptation set.
+   * Should fail because the second S node does not have a  matching
+   * SegmentURL node
+   */
+  ret = gst_mpd_client_setup_streaming (mpdclient, adapt_set);
+  assert_equals_int (ret, FALSE);
+
+  gst_mpd_client_free (mpdclient);
+}
+
+GST_END_TEST;
+
+/*
+ * Test parsing of the default presentation delay property
+ */
+GST_START_TEST (dash_mpdparser_default_presentation_delay)
+{
+  const gchar *xml =
+      "<?xml version=\"1.0\"?>"
+      "<MPD xmlns=\"urn:mpeg:dash:schema:mpd:2011\""
+      "     profiles=\"urn:mpeg:dash:profile:isoff-main:2011\""
+      "     maxSegmentDuration=\"PT2S\">"
+      "  <Period id=\"Period0\" start=\"P0S\"></Period></MPD>";
+
+  gboolean ret;
+  GstMpdClient *mpdclient = gst_mpd_client_new ();
+  gint64 value;
+
+  ret = gst_mpd_parse (mpdclient, xml, (gint) strlen (xml));
+  assert_equals_int (ret, TRUE);
+  value = gst_mpd_client_parse_default_presentation_delay (mpdclient, "5s");
+  assert_equals_int64 (value, 5000);
+  value = gst_mpd_client_parse_default_presentation_delay (mpdclient, "5S");
+  assert_equals_int64 (value, 5000);
+  value =
+      gst_mpd_client_parse_default_presentation_delay (mpdclient, "5 seconds");
+  assert_equals_int64 (value, 5000);
+  value = gst_mpd_client_parse_default_presentation_delay (mpdclient, "2500ms");
+  assert_equals_int64 (value, 2500);
+  value = gst_mpd_client_parse_default_presentation_delay (mpdclient, "3f");
+  assert_equals_int64 (value, 6000);
+  value = gst_mpd_client_parse_default_presentation_delay (mpdclient, "3F");
+  assert_equals_int64 (value, 6000);
+  value = gst_mpd_client_parse_default_presentation_delay (mpdclient, "");
+  assert_equals_int64 (value, 0);
+  value = gst_mpd_client_parse_default_presentation_delay (mpdclient, "10");
+  assert_equals_int64 (value, 0);
+  value =
+      gst_mpd_client_parse_default_presentation_delay (mpdclient,
+      "not a number");
+  assert_equals_int64 (value, 0);
+
+  gst_mpd_client_free (mpdclient);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (dash_mpdparser_duration)
+{
+  guint64 v;
+
+  fail_unless (gst_mpdparser_parse_duration ("", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration (" ", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("0", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("D-1", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("T", &v) == FALSE);
+
+  fail_unless (gst_mpdparser_parse_duration ("P", &v) == TRUE);
+  fail_unless (gst_mpdparser_parse_duration ("PT", &v) == TRUE);
+  fail_unless (gst_mpdparser_parse_duration ("PX", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("PPT", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("PTT", &v) == FALSE);
+
+  fail_unless (gst_mpdparser_parse_duration ("P1D", &v) == TRUE);
+  fail_unless (gst_mpdparser_parse_duration ("P1D1D", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("P1D1M", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("P1M1D", &v) == TRUE);
+  fail_unless (gst_mpdparser_parse_duration ("P1M1D1M", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("P1M1D1D", &v) == FALSE);
+
+  fail_unless (gst_mpdparser_parse_duration ("P0M0D", &v) == TRUE);
+  fail_unless (gst_mpdparser_parse_duration ("P-1M", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("P15M", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("P-1D", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("P35D", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("P-1Y", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("PT-1H", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("PT25H", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("PT-1M", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("PT65M", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("PT-1S", &v) == FALSE);
+  /* seconds are allowed to be larger than 60 */
+  fail_unless (gst_mpdparser_parse_duration ("PT65S", &v) == TRUE);
+
+  fail_unless (gst_mpdparser_parse_duration ("PT1.1H", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("PT1-1H", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("PT1-H", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("PT-H", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("PTH", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("PT0", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("PT1.1S", &v) == TRUE);
+  fail_unless (gst_mpdparser_parse_duration ("PT1.1.1S", &v) == FALSE);
+
+  fail_unless (gst_mpdparser_parse_duration ("P585Y", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("P584Y", &v) == TRUE);
+
+  fail_unless (gst_mpdparser_parse_duration (" P10DT8H", &v) == TRUE);
+  fail_unless (gst_mpdparser_parse_duration ("P10D T8H", &v) == FALSE);
+  fail_unless (gst_mpdparser_parse_duration ("P10DT8H ", &v) == TRUE);
+}
+
+GST_END_TEST;
+
 /*
  * create a test suite containing all dash testcases
  */
@@ -4448,6 +5301,8 @@
   TCase *tc_simpleMPD = tcase_create ("simpleMPD");
   TCase *tc_complexMPD = tcase_create ("complexMPD");
   TCase *tc_negativeTests = tcase_create ("negativeTests");
+  TCase *tc_stringTests = tcase_create ("stringTests");
+  TCase *tc_duration = tcase_create ("duration");
 
   GST_DEBUG_CATEGORY_INIT (gst_dash_demux_debug, "gst_dash_demux_debug", 0,
       "mpeg dash tests");
@@ -4551,13 +5406,16 @@
       dash_mpdparser_period_adaptationSet_representation_segmentTemplate);
   tcase_add_test (tc_simpleMPD, dash_mpdparser_period_subset);
   tcase_add_test (tc_simpleMPD, dash_mpdparser_utctiming);
+  tcase_add_test (tc_simpleMPD, dash_mpdparser_utctiming_invalid_value);
 
   /* tests checking other possible values for attributes */
   tcase_add_test (tc_simpleMPD, dash_mpdparser_type_dynamic);
   tcase_add_test (tc_simpleMPD, dash_mpdparser_template_parsing);
   tcase_add_test (tc_simpleMPD, dash_mpdparser_isoff_ondemand_profile);
   tcase_add_test (tc_simpleMPD, dash_mpdparser_GstDateTime);
+  tcase_add_test (tc_simpleMPD, dash_mpdparser_bitstreamSwitching_inheritance);
   tcase_add_test (tc_simpleMPD, dash_mpdparser_various_duration_formats);
+  tcase_add_test (tc_simpleMPD, dash_mpdparser_default_presentation_delay);
 
   /* tests checking the MPD management
    * (eg. setting active streams, obtaining attributes values)
@@ -4575,6 +5433,10 @@
   tcase_add_test (tc_complexMPD, dash_mpdparser_get_baseURL2);
   tcase_add_test (tc_complexMPD, dash_mpdparser_get_baseURL3);
   tcase_add_test (tc_complexMPD, dash_mpdparser_get_baseURL4);
+  tcase_add_test (tc_complexMPD, dash_mpdparser_get_baseURL5);
+  tcase_add_test (tc_complexMPD, dash_mpdparser_get_baseURL6);
+  tcase_add_test (tc_complexMPD, dash_mpdparser_get_baseURL7);
+  tcase_add_test (tc_complexMPD, dash_mpdparser_get_baseURL8);
   tcase_add_test (tc_complexMPD, dash_mpdparser_get_mediaPresentationDuration);
   tcase_add_test (tc_complexMPD, dash_mpdparser_get_streamPresentationOffset);
   tcase_add_test (tc_complexMPD, dash_mpdparser_segments);
@@ -4585,20 +5447,36 @@
   tcase_add_test (tc_complexMPD, dash_mpdparser_segment_list);
   tcase_add_test (tc_complexMPD, dash_mpdparser_segment_template);
   tcase_add_test (tc_complexMPD, dash_mpdparser_segment_timeline);
+  tcase_add_test (tc_complexMPD, dash_mpdparser_multiple_inherited_segmentURL);
 
   /* tests checking the parsing of missing/incomplete attributes of xml */
   tcase_add_test (tc_negativeTests, dash_mpdparser_missing_xml);
   tcase_add_test (tc_negativeTests, dash_mpdparser_missing_mpd);
   tcase_add_test (tc_negativeTests, dash_mpdparser_no_end_tag);
+  tcase_add_test (tc_negativeTests, dash_mpdparser_no_profiles);
   tcase_add_test (tc_negativeTests, dash_mpdparser_no_default_namespace);
   tcase_add_test (tc_negativeTests,
       dash_mpdparser_wrong_period_duration_inferred_from_next_period);
   tcase_add_test (tc_negativeTests,
       dash_mpdparser_wrong_period_duration_inferred_from_next_mediaPresentationDuration);
+  tcase_add_test (tc_negativeTests, dash_mpdparser_negative_period_duration);
+  tcase_add_test (tc_negativeTests,
+      dash_mpdparser_read_unsigned_from_negative_values);
+  tcase_add_test (tc_negativeTests,
+      dash_mpdparser_negative_mediaPresentationDuration);
+  tcase_add_test (tc_negativeTests,
+      dash_mpdparser_unmatched_segmentTimeline_segmentURL);
+
+  tcase_add_test (tc_stringTests, dash_mpdparser_whitespace_strings);
+  tcase_add_test (tc_stringTests, dash_mpdparser_rfc1738_strings);
+
+  tcase_add_test (tc_duration, dash_mpdparser_duration);
 
   suite_add_tcase (s, tc_simpleMPD);
   suite_add_tcase (s, tc_complexMPD);
   suite_add_tcase (s, tc_negativeTests);
+  suite_add_tcase (s, tc_stringTests);
+  suite_add_tcase (s, tc_duration);
 
   return s;
 }
diff --git a/tests/check/elements/dataurisrc.c b/tests/check/elements/dataurisrc.c
index 8deeccf..b034b2e 100644
--- a/tests/check/elements/dataurisrc.c
+++ b/tests/check/elements/dataurisrc.c
@@ -23,7 +23,7 @@
 #include <gst/check/gstcheck.h>
 
 /* sine wave encoded in ogg/vorbis, created with:
- *   gst-launch-0.10 audiotestsrc num-buffers=110 ! audioconvert ! \
+ *   gst-launch-1.0 audiotestsrc num-buffers=110 ! audioconvert ! \
  *                   audio/x-raw,channels=1 ! vorbisenc ! oggmux ! \
  *                   filesink location=sine.ogg
  * and then encoded to base64 */
diff --git a/tests/check/elements/hlsdemux_m3u8.c b/tests/check/elements/hlsdemux_m3u8.c
index 406123e..f49e901 100644
--- a/tests/check/elements/hlsdemux_m3u8.c
+++ b/tests/check/elements/hlsdemux_m3u8.c
@@ -30,7 +30,7 @@
 #include "m3u8.h"
 #include "m3u8.c"
 
-GST_DEBUG_CATEGORY (fragmented_debug);
+GST_DEBUG_CATEGORY (hls_debug);
 
 static const gchar *INVALID_PLAYLIST = "#EXTM3 UINVALID";
 
@@ -94,6 +94,16 @@
 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=65000,CODECS=\"mp4a.40.5\"\n\
 http://example.com/audio-only.m3u8";
 
+static const gchar *VARIANT_PLAYLIST_WITH_URI_MISSING = "#EXTM3U \n\
+#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=128000\n\
+http://example.com/low.m3u8\n\
+#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=256000\n\
+\n\
+#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=768000\n\
+http://example.com/hi.m3u8\n\
+#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=65000,CODECS=\"mp4a.40.5\"\n\
+http://example.com/audio-only.m3u8";
+
 static const gchar *EMPTY_LINES_VARIANT_PLAYLIST = "#EXTM3U \n\
 #EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=128000\n\n\
 http://example.com/low.m3u8\n\n\
@@ -371,7 +381,7 @@
   assert_equals_int (stream->bandwidth, 65000);
   assert_equals_int (stream->program_id, 1);
   assert_equals_string (stream->uri, "http://example.com/audio-only.m3u8");
-  assert_equals_string (stream->codecs, "\"mp4a.40.5\"");
+  assert_equals_string (stream->codecs, "mp4a.40.5");
 
   /* Low */
   tmp = g_list_next (tmp);
@@ -408,6 +418,17 @@
 
 GST_END_TEST;
 
+GST_START_TEST (test_load_main_playlist_variant_with_missing_uri)
+{
+  GstM3U8Client *client;
+
+  client = load_playlist (VARIANT_PLAYLIST_WITH_URI_MISSING);
+  assert_equals_int (g_list_length (client->main->lists), 3);
+  gst_m3u8_client_free (client);
+}
+
+GST_END_TEST;
+
 GST_START_TEST (test_load_windows_line_endings_variant_playlist)
 {
   do_test_load_main_playlist_variant (WINDOWS_LINE_ENDINGS_VARIANT_PLAYLIST);
@@ -490,6 +511,8 @@
   GstM3U8Client *client;
   GstM3U8 *pl;
   GstM3U8MediaFile *file;
+  gint64 start = -1;
+  gint64 stop = -1;
 
   client = load_playlist (LIVE_PLAYLIST);
 
@@ -509,6 +532,9 @@
   assert_equals_string (file->uri,
       "https://priv.example.com/fileSequence2683.ts");
   assert_equals_int (file->sequence, 2683);
+  fail_unless (gst_m3u8_client_get_seek_range (client, &start, &stop));
+  assert_equals_int64 (start, 0);
+  assert_equals_float (stop / (double) GST_SECOND, 16.0);
 
   gst_m3u8_client_free (client);
 }
@@ -552,6 +578,8 @@
   GstM3U8Client *client;
   GstM3U8 *pl;
   GstM3U8MediaFile *file;
+  gint64 start = -1;
+  gint64 stop = -1;
 
   client = load_playlist (DOUBLES_PLAYLIST);
 
@@ -565,6 +593,10 @@
   assert_equals_float (file->duration / (double) GST_SECOND, 10.2344);
   file = GST_M3U8_MEDIA_FILE (g_list_nth_data (pl->files, 3));
   assert_equals_float (file->duration / (double) GST_SECOND, 9.92);
+  fail_unless (gst_m3u8_client_get_seek_range (client, &start, &stop));
+  assert_equals_int64 (start, 0);
+  assert_equals_float (stop / (double) GST_SECOND,
+      10.321 + 9.6789 + 10.2344 + 9.92);
   gst_m3u8_client_free (client);
 }
 
@@ -1301,19 +1333,62 @@
 GST_END_TEST;
 #endif
 
+GST_START_TEST (test_url_with_slash_query_param)
+{
+  static const gchar *MASTER_PLAYLIST = "#EXTM3U \n"
+      "#EXT-X-VERSION:4\n"
+      "#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=1251135, CODECS=\"avc1.42001f, mp4a.40.2\", RESOLUTION=640x352\n"
+      "1251/media.m3u8?acl=/*1054559_h264_1500k.mp4\n";
+  GstM3U8Client *client;
+  GstM3U8 *media;
+
+  client = load_playlist (MASTER_PLAYLIST);
+
+  assert_equals_int (g_list_length (client->main->lists), 1);
+  media = g_list_nth_data (client->main->lists, 0);
+  assert_equals_string (media->uri,
+      "http://localhost/1251/media.m3u8?acl=/*1054559_h264_1500k.mp4");
+  gst_m3u8_client_free (client);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_stream_inf_tag)
+{
+  static const gchar *MASTER_PLAYLIST = "#EXTM3U \n"
+      "#EXT-X-VERSION:4\n"
+      "#EXT-X-STREAM-INF:PROGRAM-ID=1, BANDWIDTH=1251135, CODECS=\"avc1.42001f, mp4a.40.2\", RESOLUTION=640x352\n"
+      "media.m3u8\n";
+  GstM3U8Client *client;
+  GstM3U8 *media;
+
+  client = load_playlist (MASTER_PLAYLIST);
+
+  assert_equals_int (g_list_length (client->main->lists), 1);
+  media = g_list_nth_data (client->main->lists, 0);
+  assert_equals_int64 (media->program_id, 1);
+  assert_equals_int64 (media->width, 640);
+  assert_equals_int64 (media->height, 352);
+  assert_equals_int64 (media->bandwidth, 1251135);
+  assert_equals_string (media->codecs, "avc1.42001f, mp4a.40.2");
+  gst_m3u8_client_free (client);
+}
+
+GST_END_TEST;
+
 static Suite *
 hlsdemux_suite (void)
 {
   Suite *s = suite_create ("hlsdemux_m3u8");
   TCase *tc_m3u8 = tcase_create ("m3u8client");
 
-  GST_DEBUG_CATEGORY_INIT (fragmented_debug, "hlsdemux_m3u", 0,
-      "hlsdemux m3u test");
+  GST_DEBUG_CATEGORY_INIT (hls_debug, "hlsdemux_m3u", 0, "hlsdemux m3u test");
 
   suite_add_tcase (s, tc_m3u8);
   tcase_add_test (tc_m3u8, test_load_main_playlist_invalid);
   tcase_add_test (tc_m3u8, test_load_main_playlist_rendition);
   tcase_add_test (tc_m3u8, test_load_main_playlist_variant);
+  tcase_add_test (tc_m3u8, test_load_main_playlist_variant_with_missing_uri);
   tcase_add_test (tc_m3u8, test_load_windows_line_endings_variant_playlist);
   tcase_add_test (tc_m3u8, test_load_main_playlist_with_empty_lines);
   tcase_add_test (tc_m3u8, test_load_windows_main_playlist_with_empty_lines);
@@ -1341,7 +1416,8 @@
 #endif
   tcase_add_test (tc_m3u8, test_playlist_with_doubles_duration);
   tcase_add_test (tc_m3u8, test_playlist_with_encryption);
-
+  tcase_add_test (tc_m3u8, test_url_with_slash_query_param);
+  tcase_add_test (tc_m3u8, test_stream_inf_tag);
   return s;
 }
 
diff --git a/tests/check/elements/id3mux.c b/tests/check/elements/id3mux.c
index 1356ec2..190aff4 100644
--- a/tests/check/elements/id3mux.c
+++ b/tests/check/elements/id3mux.c
@@ -45,6 +45,8 @@
   0x08, 0x00, 0x4b, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00
 };
 
+static const guint8 privatedata[] = { 0x99, 0x66, 0x33, 0x11, 0x22, 0x44 };
+
 #define MP3_FRAME_SIZE 626
 
 /* the peak and gain values are stored pretty roughly, so check that they're
@@ -122,6 +124,20 @@
         GST_TAG_BEATS_PER_MINUTE, TEST_BPM, NULL);
   }
   if (mask & (1 << 13)) {
+    GstSample *sample;
+    GstBuffer *buf;
+
+    buf = gst_buffer_new_and_alloc (sizeof (privatedata));
+    gst_buffer_fill (buf, 0, privatedata, sizeof (privatedata));
+    sample = gst_sample_new (buf, NULL, NULL,
+        gst_structure_new ("ID3PrivateFrame",
+            "owner", G_TYPE_STRING, "me", NULL));
+    gst_buffer_unref (buf);
+    gst_tag_list_add (tags, GST_TAG_MERGE_KEEP,
+        GST_TAG_PRIVATE_DATA, sample, NULL);
+    gst_sample_unref (sample);
+  }
+  if (mask & (1 << 14)) {
   }
   return tags;
 }
@@ -270,6 +286,20 @@
     fail_unless_sorta_equals_float (bpm, TEST_BPM);
   }
   if (mask & (1 << 13)) {
+    GstSample *sample = NULL;
+    const GstStructure *info;
+    GstBuffer *buf;
+
+    fail_unless (gst_tag_list_get_sample (tags, GST_TAG_PRIVATE_DATA, &sample));
+    fail_unless (sample != NULL);
+    buf = gst_sample_get_buffer (sample);
+    fail_if (gst_buffer_memcmp (buf, 0, privatedata, sizeof (privatedata)));
+    info = gst_sample_get_info (sample);
+    fail_unless (gst_structure_has_name (info, "ID3PrivateFrame"));
+    fail_unless_equals_string (gst_structure_get_string (info, "owner"), "me");
+    gst_sample_unref (sample);
+  }
+  if (mask & (1 << 14)) {
   }
 }
 
diff --git a/tests/check/elements/mxfmux.c b/tests/check/elements/mxfmux.c
index b12dd91..748ebc0 100644
--- a/tests/check/elements/mxfmux.c
+++ b/tests/check/elements/mxfmux.c
@@ -239,6 +239,32 @@
 
 GST_END_TEST;
 
+GST_START_TEST (test_h264_raw_audio)
+{
+  gchar *pipeline;
+  GstElementFactory *factory = NULL;
+
+  if ((factory = gst_element_factory_find ("x264enc")) == NULL)
+    return;
+  gst_object_unref (factory);
+  if ((factory = gst_element_factory_find ("h264parse")) == NULL)
+    return;
+  gst_object_unref (factory);
+
+  pipeline = g_strdup_printf ("videotestsrc num-buffers=250 ! "
+      "video/x-raw,framerate=25/1 ! "
+      "x264enc ! h264parse ! "
+      "mxfmux name=mux ! "
+      "fakesink  "
+      "audiotestsrc num-buffers=250 ! "
+      "audioconvert ! " "audio/x-raw,format=S24LE,channels=2 ! mux. ");
+
+  run_test (pipeline);
+  g_free (pipeline);
+}
+
+GST_END_TEST;
+
 static Suite *
 mxfmux_suite (void)
 {
@@ -248,16 +274,12 @@
   suite_add_tcase (s, tc_chain);
   tcase_set_timeout (tc_chain, 180);
 
-  /* FIXME: remove again once ported */
-  if (!gst_registry_check_feature_version (gst_registry_get (), "mxfmux", 1, 0,
-          0))
-    return s;
-
   tcase_add_test (tc_chain, test_mpeg2);
   tcase_add_test (tc_chain, test_raw_video_raw_audio);
   tcase_add_test (tc_chain, test_raw_video_stride_transform);
   tcase_add_test (tc_chain, test_jpeg2000_alaw);
   tcase_add_test (tc_chain, test_dnxhd_mp3);
+  tcase_add_test (tc_chain, test_h264_raw_audio);
   tcase_add_test (tc_chain, test_multiple_av_streams);
 
   return s;
diff --git a/tests/check/elements/opus.c b/tests/check/elements/opus.c
index 3afeb4e..c4b4b84 100644
--- a/tests/check/elements/opus.c
+++ b/tests/check/elements/opus.c
@@ -36,11 +36,6 @@
                            "rate = (int) 48000, " \
                            "channels = (int) 1 "
 
-static const guint8 opus_ogg_id_header[19] = {
-  0x4f, 0x70, 0x75, 0x73, 0x48, 0x65, 0x61, 0x64, 0x00, 0x02, 0x00, 0x00, 0x00,
-  0x00, 0x00, 0x00, 0x00, 0x00, 0x00
-};
-
 /* A lot of these taken from the vorbisdec test */
 
 /* For ease of programming we use globals to keep refs for our floating
@@ -136,40 +131,6 @@
   }
 }
 
-GST_START_TEST (test_opus_id_header)
-{
-  GstElement *opusdec;
-  GstBuffer *inbuffer;
-  GstCaps *caps;
-
-  opusdec = setup_opusdec ();
-  fail_unless (gst_element_set_state (opusdec,
-          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
-      "could not set to playing");
-
-  caps = gst_caps_new_empty_simple ("audio/x-opus");
-  gst_check_setup_events (mydecsrcpad, opusdec, caps, GST_FORMAT_TIME);
-  gst_caps_unref (caps);
-
-  inbuffer = gst_buffer_new_and_alloc (sizeof (opus_ogg_id_header));
-  gst_buffer_fill (inbuffer, 0, opus_ogg_id_header,
-      sizeof (opus_ogg_id_header));
-  ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
-  gst_buffer_ref (inbuffer);
-
-  /* pushing gives away my reference ... */
-  fail_unless (gst_pad_push (mydecsrcpad, inbuffer) == GST_FLOW_OK);
-  /* ... and nothing ends up on the global buffer list */
-  ASSERT_BUFFER_REFCOUNT (inbuffer, "inbuffer", 1);
-  gst_buffer_unref (inbuffer);
-  check_buffers (0);
-
-  /* cleanup */
-  cleanup_opusdec (opusdec);
-}
-
-GST_END_TEST;
-
 GST_START_TEST (test_opus_encode_nothing)
 {
   GstElement *opusenc;
@@ -365,7 +326,6 @@
   suite_add_tcase (s, tc_chain);
 
 #define X if (0)
-  tcase_add_test (tc_chain, test_opus_id_header);
   tcase_add_test (tc_chain, test_opus_encode_nothing);
   tcase_add_test (tc_chain, test_opus_decode_nothing);
   tcase_add_test (tc_chain, test_opus_encode_samples);
diff --git a/tests/check/elements/pcapparse.c b/tests/check/elements/pcapparse.c
index 8a2a054..15d3555 100644
--- a/tests/check/elements/pcapparse.c
+++ b/tests/check/elements/pcapparse.c
@@ -1,5 +1,6 @@
 #include "parser.h"
 #include <gst/check/gstcheck.h>
+#include <gst/check/gstharness.h>
 
 static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
     GST_PAD_SRC,
@@ -36,7 +37,7 @@
   if (vdata->data_to_verify == pcap_frame_with_eth_padding) {
     offset = pcap_frame_with_eth_padding_offset;
     size = sizeof (pcap_frame_with_eth_padding) -
-      pcap_frame_with_eth_padding_offset - 2;
+        pcap_frame_with_eth_padding_offset - 2;
   }
 
   fail_unless_equals_int (gst_buffer_get_size (buffer), size);
@@ -50,7 +51,7 @@
 setup_element (const gchar * desc)
 {
   GstElement *element;
-  GstCaps * caps;
+  GstCaps *caps;
 
   (void) desc;
 
@@ -67,6 +68,51 @@
   gst_parser_test_split (pcap_frame_with_eth_padding,
       sizeof (pcap_frame_with_eth_padding));
 }
+
+GST_END_TEST;
+
+static const guint8 zerosize_data[] = {
+  0xd4, 0xc3, 0xb2, 0xa1, 0x02, 0x00, 0x04, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x04, 0x00, 0x01, 0x00, 0x00, 0x00,
+  0xd3, 0xff, 0x7a, 0x56, 0xbb, 0xd8, 0x0e, 0x00,
+  0x2a, 0x00, 0x00, 0x00, 0x2a, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+  0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x45, 0x00,
+  0x00, 0x1c, 0x06, 0xe7, 0x40, 0x00, 0x40, 0x11,
+  0x35, 0xe8, 0x7f, 0x00, 0x00, 0x01, 0x7f, 0x00,
+  0x00, 0x01, 0xd2, 0xa3, 0x13, 0x8c, 0x00, 0x08,
+  0xfe, 0x1b
+};
+
+GST_START_TEST (test_parse_zerosize_frames)
+{
+  GstBuffer *in_buf, *out_buf;
+  GstHarness *h;
+  gsize data_size;
+
+  h = gst_harness_new ("pcapparse");
+
+  gst_harness_set_src_caps_str (h, "raw/x-pcap");
+
+  data_size = sizeof (zerosize_data);
+
+  in_buf = gst_buffer_new_wrapped (g_memdup (zerosize_data, data_size),
+      data_size);
+
+  gst_harness_push (h, in_buf);
+  gst_harness_play (h);
+  gst_harness_push_event (h, gst_event_new_eos ());
+
+  /* check that a buffer comes out and that it is 0 bytes in size */
+  out_buf = gst_harness_pull (h);
+
+  fail_unless (gst_buffer_get_size (out_buf) == 0);
+
+  gst_buffer_unref (out_buf);
+  gst_harness_teardown (h);
+}
+
 GST_END_TEST;
 
 static Suite *
@@ -86,6 +132,7 @@
 
   suite_add_tcase (s, tc_chain);
   tcase_add_test (tc_chain, test_parse_frames_with_eth_padding);
+  tcase_add_test (tc_chain, test_parse_zerosize_frames);
 
   return s;
 }
diff --git a/tests/check/elements/rtponvif.c b/tests/check/elements/rtponvif.c
deleted file mode 100644
index cce808b..0000000
--- a/tests/check/elements/rtponvif.c
+++ /dev/null
@@ -1,439 +0,0 @@
-/*
- * onviftimestamp.c
- *
- * Copyright (C) 2014 Axis Communications AB
- *  Author: Guillaume Desmottes <guillaume.desmottes@collabora.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 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
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include <gst/check/gstcheck.h>
-#include <gst/rtp/gstrtpbuffer.h>
-
-/* For ease of programming we use globals to keep refs for our floating
- * src and sink pads we create; otherwise we always have to do get_pad,
- * get_peer, and then remove references in every test function */
-static GstPad *mysrcpad, *mysinkpad;
-
-static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
-    GST_PAD_SINK,
-    GST_PAD_ALWAYS,
-    GST_STATIC_CAPS ("application/x-rtp")
-    );
-static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
-    GST_PAD_SRC,
-    GST_PAD_ALWAYS,
-    GST_STATIC_CAPS ("application/x-rtp")
-    );
-
-#define NTP_OFFSET (guint64) 1245
-#define TIMESTAMP 42
-
-static void
-setup_element (GstElement * element)
-{
-  mysrcpad = gst_check_setup_src_pad (element, &srctemplate);
-  mysinkpad = gst_check_setup_sink_pad (element, &sinktemplate);
-  gst_pad_set_active (mysrcpad, TRUE);
-  gst_pad_set_active (mysinkpad, TRUE);
-
-  fail_unless (gst_element_set_state (element,
-          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
-      "could not set to playing");
-}
-
-static GstElement *
-setup_rtponviftimestamp (gboolean set_e_bit)
-{
-  GstElement *timestamp;
-
-  GST_DEBUG ("setup_rtponviftimestamp");
-  timestamp = gst_check_setup_element ("rtponviftimestamp");
-
-  g_object_set (timestamp, "ntp-offset", NTP_OFFSET, "cseq", 0x12345678,
-      "set-e-bit", set_e_bit, NULL);
-
-  setup_element (timestamp);
-
-  return timestamp;
-}
-
-static void
-cleanup_element (GstElement * element)
-{
-  fail_unless (gst_element_set_state (element,
-          GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
-
-  gst_pad_set_active (mysrcpad, FALSE);
-  if (mysinkpad)
-    gst_pad_set_active (mysinkpad, FALSE);
-  gst_check_teardown_src_pad (element);
-  gst_check_teardown_sink_pad (element);
-  gst_check_teardown_element (element);
-  mysrcpad = NULL;
-  mysinkpad = NULL;
-}
-
-static void
-cleanup_rtponviftimestamp (GstElement * timestamp)
-{
-  GST_DEBUG ("cleanup_rtponviftimestamp");
-
-  cleanup_element (timestamp);
-}
-
-static void
-check_buffer_equal (GstBuffer * buf, GstBuffer * expected)
-{
-  GstMapInfo info_buf, info_expected;
-
-  fail_if (buf == NULL);
-  fail_if (expected == NULL);
-
-  gst_buffer_map (buf, &info_buf, GST_MAP_READ);
-  gst_buffer_map (expected, &info_expected, GST_MAP_READ);
-
-  GST_LOG ("buffer: size %" G_GSIZE_FORMAT, info_buf.size);
-  GST_LOG ("expected: size %" G_GSIZE_FORMAT, info_expected.size);
-  GST_MEMDUMP ("buffer", info_buf.data, info_buf.size);
-  GST_MEMDUMP ("expected", info_expected.data, info_expected.size);
-
-  fail_unless (info_buf.size == info_expected.size,
-      "size of the buffers are not the same");
-  fail_unless (memcmp (info_buf.data, info_expected.data, info_buf.size) == 0,
-      "data is not the same");
-
-  gst_buffer_unmap (buf, &info_buf);
-  gst_buffer_unmap (expected, &info_expected);
-}
-
-/* Create a RTP buffer without the extension */
-static GstBuffer *
-create_rtp_buffer (guint64 timestamp, gboolean clean_point, gboolean discont)
-{
-  GstBuffer *buffer_in;
-  GstRTPBuffer rtpbuffer_in = GST_RTP_BUFFER_INIT;
-
-  buffer_in = gst_rtp_buffer_new_allocate (4, 0, 0);
-  buffer_in->pts = timestamp;
-
-  if (!clean_point)
-    GST_BUFFER_FLAG_SET (buffer_in, GST_BUFFER_FLAG_DELTA_UNIT);
-  if (discont)
-    GST_BUFFER_FLAG_SET (buffer_in, GST_BUFFER_FLAG_DISCONT);
-
-  fail_unless (gst_rtp_buffer_map (buffer_in, GST_MAP_READ, &rtpbuffer_in));
-  fail_if (gst_rtp_buffer_get_extension (&rtpbuffer_in));
-  gst_rtp_buffer_unmap (&rtpbuffer_in);
-
-  return buffer_in;
-}
-
-static guint64
-convert_to_ntp (guint64 t)
-{
-  guint64 ntptime;
-
-  /* convert to NTP time. upper 32 bits should contain the seconds
-   * and the lower 32 bits, the fractions of a second. */
-  ntptime = gst_util_uint64_scale (t, (G_GINT64_CONSTANT (1) << 32),
-      GST_SECOND);
-
-  return ntptime;
-}
-
-/* Create a copy of @buffer_in having the RTP extension */
-static GstBuffer *
-create_extension_buffer (GstBuffer * buffer_in, gboolean clean_point,
-    gboolean end_contiguous, gboolean discont)
-{
-  GstBuffer *buffer_out;
-  GstRTPBuffer rtpbuffer_out = GST_RTP_BUFFER_INIT;
-  guint8 *data;
-  guint8 flags = 0;
-
-  buffer_out = gst_buffer_copy (buffer_in);
-
-  fail_unless (gst_rtp_buffer_map (buffer_out, GST_MAP_READWRITE,
-          &rtpbuffer_out));
-
-  /* extension */
-  gst_rtp_buffer_set_extension_data (&rtpbuffer_out, 0xABAC, 3);
-  fail_unless (gst_rtp_buffer_get_extension (&rtpbuffer_out));
-  gst_rtp_buffer_get_extension_data (&rtpbuffer_out, NULL, (gpointer) & data,
-      NULL);
-
-  /* NTP timestamp */
-  GST_WRITE_UINT64_BE (data, convert_to_ntp (buffer_in->pts + NTP_OFFSET));
-
-  /* C E D mbz */
-  if (clean_point)
-    flags |= (1 << 7);
-  if (end_contiguous)
-    flags |= (1 << 6);
-  if (discont)
-    flags |= (1 << 5);
-
-  GST_WRITE_UINT8 (data + 8, flags);
-
-  /* CSeq */
-  GST_WRITE_UINT8 (data + 9, 0x78);
-
-  memset (data + 10, 0, 4);
-
-  gst_rtp_buffer_unmap (&rtpbuffer_out);
-
-  return buffer_out;
-}
-
-static void
-do_one_buffer_test_apply (gboolean clean_point, gboolean discont)
-{
-  GstElement *apply;
-  GstBuffer *buffer_in, *buffer_out;
-  GstSegment segment;
-
-  apply = setup_rtponviftimestamp (FALSE);
-
-  buffer_in = create_rtp_buffer (TIMESTAMP, clean_point, discont);
-  buffer_out = create_extension_buffer (buffer_in, clean_point, FALSE, discont);
-
-  /* stream start */
-  fail_unless (gst_pad_push_event (mysrcpad,
-          gst_event_new_stream_start ("test")));
-
-  /* Push a segment */
-  gst_segment_init (&segment, GST_FORMAT_TIME);
-  fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment)));
-
-  /* Push buffer */
-  fail_unless (gst_pad_push (mysrcpad, buffer_in) == GST_FLOW_OK,
-      "failed pushing buffer");
-
-  check_buffer_equal (buffers->data, buffer_out);
-
-  g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
-  g_list_free (buffers);
-  buffers = NULL;
-
-  ASSERT_OBJECT_REFCOUNT (apply, "rtponviftimestamp", 1);
-  cleanup_rtponviftimestamp (apply);
-}
-
-static void
-do_two_buffers_test_apply (gboolean end_contiguous)
-{
-  GstElement *apply;
-  GstBuffer *buffer_in, *buffer_out;
-  GstSegment segment;
-
-  apply = setup_rtponviftimestamp (TRUE);
-
-  buffer_in = create_rtp_buffer (TIMESTAMP, FALSE, FALSE);
-  buffer_out = create_extension_buffer (buffer_in, FALSE, end_contiguous,
-      FALSE);
-
-  /* stream start */
-  fail_unless (gst_pad_push_event (mysrcpad,
-          gst_event_new_stream_start ("test")));
-
-  /* Push a segment */
-  gst_segment_init (&segment, GST_FORMAT_TIME);
-  fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment)));
-
-  /* Push buffer */
-  fail_unless (gst_pad_push (mysrcpad, buffer_in) == GST_FLOW_OK,
-      "failed pushing buffer");
-
-  /* The buffer hasn't been pushed it as the element is waiting for the next
-   * buffer. */
-  g_assert_cmpuint (g_list_length (buffers), ==, 0);
-
-  /* A second buffer is pushed, it has the DISCONT flag if we want that the
-   * first one has the 'E' bit set. */
-  buffer_in = create_rtp_buffer (TIMESTAMP + 1, FALSE, end_contiguous);
-
-  fail_unless (gst_pad_push (mysrcpad, buffer_in) == GST_FLOW_OK,
-      "failed pushing buffer");
-
-  /* The first buffer has now been pushed out */
-  g_assert_cmpuint (g_list_length (buffers), ==, 1);
-
-  check_buffer_equal (buffers->data, buffer_out);
-
-  g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
-  g_list_free (buffers);
-  buffers = NULL;
-
-  /* Push EOS */
-  fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()));
-
-  /* The second buffer has been pushed out */
-  g_assert_cmpuint (g_list_length (buffers), ==, 1);
-
-  /* Latest buffer always has the 'E' flag */
-  buffer_out = create_extension_buffer (buffer_in, FALSE, TRUE, end_contiguous);
-  check_buffer_equal (buffers->data, buffer_out);
-
-  ASSERT_OBJECT_REFCOUNT (apply, "rtponviftimestamp", 1);
-  cleanup_rtponviftimestamp (apply);
-}
-
-GST_START_TEST (test_apply_discont)
-{
-  do_one_buffer_test_apply (FALSE, TRUE);
-}
-
-GST_END_TEST;
-
-GST_START_TEST (test_apply_not_discont)
-{
-  do_one_buffer_test_apply (FALSE, FALSE);
-}
-
-GST_END_TEST;
-
-GST_START_TEST (test_apply_clean_point)
-{
-  do_one_buffer_test_apply (TRUE, FALSE);
-}
-
-GST_END_TEST;
-
-GST_START_TEST (test_apply_no_e_bit)
-{
-  do_two_buffers_test_apply (FALSE);
-}
-
-GST_END_TEST;
-
-GST_START_TEST (test_apply_e_bit)
-{
-  do_two_buffers_test_apply (TRUE);
-}
-
-GST_END_TEST;
-
-static GstElement *
-setup_rtponvifparse (gboolean set_e_bit)
-{
-  GstElement *parse;
-
-  GST_DEBUG ("setup_rtponvifparse");
-  parse = gst_check_setup_element ("rtponvifparse");
-
-  setup_element (parse);
-
-  return parse;
-}
-
-static void
-cleanup_rtponvifparse (GstElement * parse)
-{
-  GST_DEBUG ("cleanup_rtponvifparse");
-
-  cleanup_element (parse);
-}
-
-static void
-test_parse (gboolean clean_point, gboolean discont)
-{
-  GstElement *parse;
-  GstBuffer *rtp, *buf;
-  GstSegment segment;
-
-  parse = setup_rtponvifparse (FALSE);
-
-  rtp = gst_rtp_buffer_new_allocate (4, 0, 0);
-  buf = create_extension_buffer (rtp, clean_point, FALSE, discont);
-  gst_buffer_unref (rtp);
-
-  /* stream start */
-  fail_unless (gst_pad_push_event (mysrcpad,
-          gst_event_new_stream_start ("test")));
-
-  /* Push a segment */
-  gst_segment_init (&segment, GST_FORMAT_TIME);
-  fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment)));
-
-  /* Push buffer */
-  fail_unless (gst_pad_push (mysrcpad, buf) == GST_FLOW_OK,
-      "failed pushing buffer");
-
-  g_assert_cmpuint (g_list_length (buffers), ==, 1);
-  buf = buffers->data;
-
-  if (clean_point)
-    g_assert (!GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT));
-  else
-    g_assert (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT));
-
-  if (discont)
-    g_assert (GST_BUFFER_IS_DISCONT (buf));
-  else
-    g_assert (!GST_BUFFER_IS_DISCONT (buf));
-
-  g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
-  g_list_free (buffers);
-  buffers = NULL;
-
-  ASSERT_OBJECT_REFCOUNT (parse, "rtponvifparse", 1);
-  cleanup_rtponvifparse (parse);
-}
-
-GST_START_TEST (test_parse_no_flag)
-{
-  test_parse (FALSE, FALSE);
-}
-
-GST_END_TEST;
-
-GST_START_TEST (test_parse_clean_point)
-{
-  test_parse (TRUE, FALSE);
-}
-
-GST_END_TEST;
-
-GST_START_TEST (test_parse_discont)
-{
-  test_parse (FALSE, TRUE);
-}
-
-GST_END_TEST;
-
-static Suite *
-onviftimestamp_suite (void)
-{
-  Suite *s = suite_create ("onviftimestamp");
-  TCase *tc_chain;
-
-  tc_chain = tcase_create ("apply");
-  suite_add_tcase (s, tc_chain);
-  tcase_add_test (tc_chain, test_apply_discont);
-  tcase_add_test (tc_chain, test_apply_not_discont);
-  tcase_add_test (tc_chain, test_apply_clean_point);
-  tcase_add_test (tc_chain, test_apply_no_e_bit);
-  tcase_add_test (tc_chain, test_apply_e_bit);
-
-  tc_chain = tcase_create ("parse");
-  suite_add_tcase (s, tc_chain);
-  tcase_add_test (tc_chain, test_parse_no_flag);
-  tcase_add_test (tc_chain, test_parse_clean_point);
-  tcase_add_test (tc_chain, test_parse_discont);
-
-  return s;
-}
-
-GST_CHECK_MAIN (onviftimestamp);
diff --git a/tests/check/elements/rtponvifparse.c b/tests/check/elements/rtponvifparse.c
new file mode 100644
index 0000000..4651ac8
--- /dev/null
+++ b/tests/check/elements/rtponvifparse.c
@@ -0,0 +1,246 @@
+/*
+ * onviftimestamp.c
+ *
+ * Copyright (C) 2014 Axis Communications AB
+ *  Author: Guillaume Desmottes <guillaume.desmottes@collabora.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gst/check/gstcheck.h>
+#include <gst/rtp/gstrtpbuffer.h>
+
+/* For ease of programming we use globals to keep refs for our floating
+ * src and sink pads we create; otherwise we always have to do get_pad,
+ * get_peer, and then remove references in every test function */
+static GstPad *mysrcpad, *mysinkpad;
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+    GST_PAD_SINK,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS ("application/x-rtp")
+    );
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+    GST_PAD_SRC,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS ("application/x-rtp")
+    );
+
+#define NTP_OFFSET (guint64) 1245
+#define TIMESTAMP 42
+
+static void
+setup_element (GstElement * element)
+{
+  mysrcpad = gst_check_setup_src_pad (element, &srctemplate);
+  mysinkpad = gst_check_setup_sink_pad (element, &sinktemplate);
+  gst_pad_set_active (mysrcpad, TRUE);
+  gst_pad_set_active (mysinkpad, TRUE);
+
+  fail_unless (gst_element_set_state (element,
+          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS,
+      "could not set to playing");
+}
+
+static void
+cleanup_element (GstElement * element)
+{
+  fail_unless (gst_element_set_state (element,
+          GST_STATE_NULL) == GST_STATE_CHANGE_SUCCESS, "could not set to null");
+
+  gst_pad_set_active (mysrcpad, FALSE);
+  if (mysinkpad)
+    gst_pad_set_active (mysinkpad, FALSE);
+  gst_check_teardown_src_pad (element);
+  gst_check_teardown_sink_pad (element);
+  gst_check_teardown_element (element);
+  mysrcpad = NULL;
+  mysinkpad = NULL;
+}
+
+static guint64
+convert_to_ntp (guint64 t)
+{
+  guint64 ntptime;
+
+  /* convert to NTP time. upper 32 bits should contain the seconds
+   * and the lower 32 bits, the fractions of a second. */
+  ntptime = gst_util_uint64_scale (t, (G_GINT64_CONSTANT (1) << 32),
+      GST_SECOND);
+
+  return ntptime;
+}
+
+/* Create a copy of @buffer_in having the RTP extension */
+static GstBuffer *
+create_extension_buffer (GstBuffer * buffer_in, gboolean clean_point,
+    gboolean end_contiguous, gboolean discont)
+{
+  GstBuffer *buffer_out;
+  GstRTPBuffer rtpbuffer_out = GST_RTP_BUFFER_INIT;
+  guint8 *data;
+  guint8 flags = 0;
+
+  buffer_out = gst_buffer_copy (buffer_in);
+
+  fail_unless (gst_rtp_buffer_map (buffer_out, GST_MAP_READWRITE,
+          &rtpbuffer_out));
+
+  /* extension */
+  gst_rtp_buffer_set_extension_data (&rtpbuffer_out, 0xABAC, 3);
+  fail_unless (gst_rtp_buffer_get_extension (&rtpbuffer_out));
+  gst_rtp_buffer_get_extension_data (&rtpbuffer_out, NULL, (gpointer) & data,
+      NULL);
+
+  /* NTP timestamp */
+  GST_WRITE_UINT64_BE (data, convert_to_ntp (buffer_in->pts + NTP_OFFSET));
+
+  /* C E D mbz */
+  if (clean_point)
+    flags |= (1 << 7);
+  if (end_contiguous)
+    flags |= (1 << 6);
+  if (discont)
+    flags |= (1 << 5);
+
+  GST_WRITE_UINT8 (data + 8, flags);
+
+  /* CSeq */
+  GST_WRITE_UINT8 (data + 9, 0x78);
+
+  memset (data + 10, 0, 4);
+
+  gst_rtp_buffer_unmap (&rtpbuffer_out);
+
+  return buffer_out;
+}
+
+static GstElement *
+setup_rtponvifparse (gboolean set_e_bit)
+{
+  GstElement *parse;
+
+  GST_DEBUG ("setup_rtponvifparse");
+  parse = gst_check_setup_element ("rtponvifparse");
+
+  setup_element (parse);
+
+  return parse;
+}
+
+static void
+cleanup_rtponvifparse (GstElement * parse)
+{
+  GST_DEBUG ("cleanup_rtponvifparse");
+
+  cleanup_element (parse);
+}
+
+static void
+test_parse (gboolean clean_point, gboolean discont)
+{
+  GstElement *parse;
+  GstBuffer *rtp, *buf;
+  GstSegment segment;
+
+  parse = setup_rtponvifparse (FALSE);
+
+  rtp = gst_rtp_buffer_new_allocate (4, 0, 0);
+  buf = create_extension_buffer (rtp, clean_point, FALSE, discont);
+  gst_buffer_unref (rtp);
+
+  /* stream start */
+  fail_unless (gst_pad_push_event (mysrcpad,
+          gst_event_new_stream_start ("test")));
+
+  /* Push a segment */
+  gst_segment_init (&segment, GST_FORMAT_TIME);
+  fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment)));
+
+  /* Push buffer */
+  fail_unless (gst_pad_push (mysrcpad, buf) == GST_FLOW_OK,
+      "failed pushing buffer");
+
+  g_assert_cmpuint (g_list_length (buffers), ==, 1);
+  buf = buffers->data;
+
+  if (clean_point)
+    g_assert (!GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT));
+  else
+    g_assert (GST_BUFFER_FLAG_IS_SET (buf, GST_BUFFER_FLAG_DELTA_UNIT));
+
+  if (discont)
+    g_assert (GST_BUFFER_IS_DISCONT (buf));
+  else
+    g_assert (!GST_BUFFER_IS_DISCONT (buf));
+
+  g_list_foreach (buffers, (GFunc) gst_mini_object_unref, NULL);
+  g_list_free (buffers);
+  buffers = NULL;
+
+  ASSERT_OBJECT_REFCOUNT (parse, "rtponvifparse", 1);
+  cleanup_rtponvifparse (parse);
+}
+
+GST_START_TEST (test_parse_no_flag)
+{
+  test_parse (FALSE, FALSE);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_parse_clean_point)
+{
+  test_parse (TRUE, FALSE);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_parse_discont)
+{
+  test_parse (FALSE, TRUE);
+}
+
+GST_END_TEST;
+
+static Suite *
+onviftimestamp_suite (void)
+{
+  Suite *s = suite_create ("onviftimestamp");
+  TCase *tc_chain;
+
+  tc_chain = tcase_create ("parse");
+  suite_add_tcase (s, tc_chain);
+  tcase_add_test (tc_chain, test_parse_no_flag);
+  tcase_add_test (tc_chain, test_parse_clean_point);
+  tcase_add_test (tc_chain, test_parse_discont);
+
+  return s;
+}
+
+int
+main (int argc, char **argv)
+{
+  int nf;
+  Suite *s = onviftimestamp_suite ();
+  SRunner *sr = srunner_create (s);
+
+  gst_check_init (&argc, &argv);
+
+  srunner_run_all (sr, CK_NORMAL);
+  nf = srunner_ntests_failed (sr);
+  srunner_free (sr);
+
+  return nf;
+}
diff --git a/tests/check/elements/rtponviftimestamp.c b/tests/check/elements/rtponviftimestamp.c
new file mode 100644
index 0000000..09413a8
--- /dev/null
+++ b/tests/check/elements/rtponviftimestamp.c
@@ -0,0 +1,786 @@
+/*
+ * onviftimestamp.c
+ *
+ * Copyright (C) 2014 Axis Communications AB
+ *  Author: Guillaume Desmottes <guillaume.desmottes@collabora.com>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 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
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gst/check/gstcheck.h>
+#include <gst/rtp/gstrtpbuffer.h>
+
+/* For ease of programming we use globals to keep refs for our floating
+ * src and sink pads we create; otherwise we always have to do get_pad,
+ * get_peer, and then remove references in every test function */
+static GstElement *element;
+static GstPad *mysrcpad;
+static GstPad *mysinkpad;
+/* These are global mainly because they are used from the setup/cleanup
+ * fixture functions */
+static gulong myprobe;
+static GList *mypushedevents;
+static GList *myreceivedevents;
+
+static GstStaticPadTemplate sinktemplate = GST_STATIC_PAD_TEMPLATE ("sink",
+    GST_PAD_SINK,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS ("application/x-rtp")
+    );
+static GstStaticPadTemplate srctemplate = GST_STATIC_PAD_TEMPLATE ("src",
+    GST_PAD_SRC,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS ("application/x-rtp")
+    );
+
+#define NTP_OFFSET  ((guint64) 1245)
+#define TIMESTAMP   ((GstClockTime)42)
+#define CSEQ        0x78
+#define COMPARE     TRUE
+#define NO_COMPARE  FALSE
+
+static GstPadProbeReturn
+event_probe (GstPad * pad, GstPadProbeInfo * info, gpointer user_data)
+{
+  GstEvent *event = GST_PAD_PROBE_INFO_EVENT (info);
+
+  GST_INFO ("got %" GST_PTR_FORMAT, event);
+  myreceivedevents = g_list_append (myreceivedevents, gst_event_ref (event));
+
+  return GST_PAD_PROBE_OK;
+}
+
+static GstEvent *
+create_ntp_offset_event (GstClockTime ntp_offset, gboolean discont)
+{
+  GstStructure *structure;
+
+  structure = gst_structure_new ("GstNtpOffset", "ntp-offset", G_TYPE_UINT64,
+      ntp_offset, "discont", G_TYPE_BOOLEAN, discont, NULL);
+
+  return gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM, structure);
+}
+
+static GstEvent *
+create_event (GstEventType type)
+{
+  GstEvent *event = NULL;
+
+  switch (type) {
+    case GST_EVENT_CUSTOM_DOWNSTREAM:
+      event = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM,
+          gst_structure_new ("x-app/test", "test-field", G_TYPE_STRING,
+              "test-value", NULL));
+      break;
+    case GST_EVENT_CUSTOM_DOWNSTREAM_OOB:
+      event = gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM_OOB,
+          gst_structure_new ("x-app/test", "test-field", G_TYPE_STRING,
+              "test-value", NULL));
+      break;
+    case GST_EVENT_EOS:
+      event = gst_event_new_eos ();
+      break;
+    default:
+      g_assert_not_reached ();
+      break;
+  }
+
+  return event;
+}
+
+static void
+create_and_push_event (GstEventType type)
+{
+  GstEvent *event = create_event (type);
+
+  mypushedevents = g_list_append (mypushedevents, event);
+  fail_unless (gst_pad_push_event (mysrcpad, event));
+}
+
+static void
+check_and_clear_events (gint expected, gboolean compare)
+{
+  GList *p;
+  GList *r;
+
+  /* verify that there's as many queued events as expected */
+  fail_unless_equals_int (g_list_length (myreceivedevents), expected);
+
+  if (compare) {
+    fail_unless_equals_int (expected, g_list_length (mypushedevents));
+
+    /* verify that the events are queued in the expected order */
+    r = myreceivedevents;
+    p = mypushedevents;
+
+    while (p != NULL) {
+      fail_unless_equals_pointer (p->data, r->data);
+      p = g_list_next (p);
+      r = g_list_next (r);
+    }
+  }
+
+  g_list_free_full (myreceivedevents, (GDestroyNotify) gst_event_unref);
+  myreceivedevents = NULL;
+  g_list_free (mypushedevents);
+  mypushedevents = NULL;
+}
+
+static void
+setup (void)
+{
+  element = gst_check_setup_element ("rtponviftimestamp");
+
+  mysinkpad = gst_check_setup_sink_pad (element, &sinktemplate);
+  gst_pad_set_active (mysinkpad, TRUE);
+
+  mysrcpad = gst_check_setup_src_pad (element, &srctemplate);
+  gst_pad_set_active (mysrcpad, TRUE);
+}
+
+static void
+cleanup (void)
+{
+  gst_check_drop_buffers ();
+
+  gst_pad_set_active (mysrcpad, FALSE);
+  gst_check_teardown_src_pad (element);
+  mysrcpad = NULL;
+
+  gst_pad_set_active (mysinkpad, FALSE);
+  gst_check_teardown_sink_pad (element);
+  mysinkpad = NULL;
+
+  gst_check_teardown_element (element);
+  element = NULL;
+
+  gst_check_drop_buffers ();
+}
+
+static void
+setup_with_event (void)
+{
+  setup ();
+
+  myprobe = gst_pad_add_probe (mysinkpad,
+      GST_PAD_PROBE_TYPE_EVENT_DOWNSTREAM, event_probe, NULL, NULL);
+  myreceivedevents = NULL;
+  mypushedevents = NULL;
+}
+
+static void
+cleanup_with_event (void)
+{
+  gst_pad_remove_probe (mysinkpad, myprobe);
+  myprobe = 0;
+  myreceivedevents = NULL;
+  mypushedevents = NULL;
+
+  cleanup ();
+}
+
+static void
+check_buffer_equal (GstBuffer * buf, GstBuffer * expected)
+{
+  GstMapInfo info_buf, info_expected;
+
+  fail_if (buf == NULL);
+  fail_if (expected == NULL);
+
+  fail_unless (gst_buffer_map (buf, &info_buf, GST_MAP_READ));
+  fail_unless (gst_buffer_map (expected, &info_expected, GST_MAP_READ));
+
+  GST_LOG ("buffer: size %" G_GSIZE_FORMAT, info_buf.size);
+  GST_LOG ("expected: size %" G_GSIZE_FORMAT, info_expected.size);
+  GST_MEMDUMP ("buffer", info_buf.data, info_buf.size);
+  GST_MEMDUMP ("expected", info_expected.data, info_expected.size);
+
+  fail_unless_equals_uint64 (info_buf.size, info_expected.size);
+  fail_unless_equals_int (memcmp (info_buf.data, info_expected.data,
+          info_buf.size), 0);
+
+  gst_buffer_unmap (buf, &info_buf);
+  gst_buffer_unmap (expected, &info_expected);
+}
+
+/* Create a RTP buffer without the extension */
+static GstBuffer *
+create_rtp_buffer (GstClockTime timestamp, gboolean clean_point)
+{
+  GstBuffer *buffer_in;
+  GstRTPBuffer rtpbuffer_in = GST_RTP_BUFFER_INIT;
+
+  buffer_in = gst_rtp_buffer_new_allocate (0, 0, 0);
+  GST_BUFFER_PTS (buffer_in) = timestamp;
+
+  if (!clean_point)
+    GST_BUFFER_FLAG_SET (buffer_in, GST_BUFFER_FLAG_DELTA_UNIT);
+
+  fail_unless (gst_rtp_buffer_map (buffer_in, GST_MAP_READ, &rtpbuffer_in));
+  fail_if (gst_rtp_buffer_get_extension (&rtpbuffer_in));
+  gst_rtp_buffer_unmap (&rtpbuffer_in);
+
+  return buffer_in;
+}
+
+static guint64
+convert_to_ntp (GstClockTime t)
+{
+  guint64 ntptime;
+
+  /* convert to NTP time. upper 32 bits should contain the seconds
+   * and the lower 32 bits, the fractions of a second. */
+  ntptime = gst_util_uint64_scale (t, (G_GINT64_CONSTANT (1) << 32),
+      GST_SECOND);
+
+  return ntptime;
+}
+
+/* Create a copy of @buffer_in having the RTP extension */
+static GstBuffer *
+create_extension_buffer (GstBuffer * buffer_in, gboolean clean_point,
+    gboolean end_contiguous, gboolean discont, guint64 ntp_offset, guint8 cseq)
+{
+  GstBuffer *buffer_out;
+  GstRTPBuffer rtpbuffer_out = GST_RTP_BUFFER_INIT;
+  guint8 *data;
+  guint8 flags = 0;
+
+  buffer_out = gst_buffer_copy (buffer_in);
+
+  fail_unless (gst_rtp_buffer_map (buffer_out, GST_MAP_READWRITE,
+          &rtpbuffer_out));
+
+  /* extension */
+  fail_unless (gst_rtp_buffer_set_extension_data (&rtpbuffer_out, 0xABAC, 3));
+  fail_unless (gst_rtp_buffer_get_extension (&rtpbuffer_out));
+  fail_unless (gst_rtp_buffer_get_extension_data (&rtpbuffer_out, NULL,
+          (gpointer) & data, NULL));
+
+  /* NTP timestamp */
+  GST_WRITE_UINT64_BE (data, convert_to_ntp (GST_BUFFER_PTS (buffer_in) +
+          ntp_offset));
+
+  /* C E D mbz */
+  if (clean_point)
+    flags |= (1 << 7);
+  if (end_contiguous)
+    flags |= (1 << 6);
+  if (discont)
+    flags |= (1 << 5);
+
+  GST_WRITE_UINT8 (data + 8, flags);
+
+  /* CSeq */
+  GST_WRITE_UINT8 (data + 9, cseq);
+
+  memset (data + 10, 0, 4);
+
+  gst_rtp_buffer_unmap (&rtpbuffer_out);
+
+  return buffer_out;
+}
+
+static void
+do_one_buffer_test_apply (gboolean clean_point)
+{
+  GstBuffer *buffer_in, *buffer_out;
+
+  g_object_set (element, "ntp-offset", NTP_OFFSET, "cseq", 0x12345678,
+      "set-e-bit", FALSE, NULL);
+
+  ASSERT_SET_STATE (element, GST_STATE_PLAYING, GST_STATE_CHANGE_SUCCESS);
+
+  buffer_in = create_rtp_buffer (TIMESTAMP, clean_point);
+  buffer_out = create_extension_buffer (buffer_in, clean_point, FALSE, FALSE,
+      NTP_OFFSET, CSEQ);
+
+  /* push initial events */
+  gst_check_setup_events (mysrcpad, element, NULL, GST_FORMAT_TIME);
+
+  /* Push buffer */
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer_in), GST_FLOW_OK);
+
+  check_buffer_equal ((GstBuffer *) buffers->data, buffer_out);
+  gst_buffer_unref (buffer_out);
+
+  ASSERT_SET_STATE (element, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
+}
+
+static void
+do_two_buffers_test_apply (gboolean end_contiguous)
+{
+  GstBuffer *buffer_in, *buffer_out;
+  GList *node;
+
+  g_object_set (element, "ntp-offset", NTP_OFFSET, "cseq", 0x12345678,
+      "set-e-bit", TRUE, NULL);
+
+  ASSERT_SET_STATE (element, GST_STATE_PLAYING, GST_STATE_CHANGE_SUCCESS);
+
+  buffer_in = create_rtp_buffer (TIMESTAMP, FALSE);
+  buffer_out = create_extension_buffer (buffer_in, FALSE, end_contiguous,
+      FALSE, NTP_OFFSET, CSEQ);
+
+  /* push initial events */
+  gst_check_setup_events (mysrcpad, element, NULL, GST_FORMAT_TIME);
+
+  /* Push buffer */
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer_in), GST_FLOW_OK);
+
+  /* The buffer hasn't been pushed it as the element is waiting for the next
+   * buffer. */
+  fail_unless_equals_int (g_list_length (buffers), 0);
+
+  /* push an ntp-offset event to trigger a discontinuty */
+  fail_unless (gst_pad_push_event (mysrcpad,
+          create_ntp_offset_event (NTP_OFFSET, end_contiguous)));
+
+  /* A second buffer is pushed */
+  buffer_in = create_rtp_buffer (TIMESTAMP + 1, FALSE);
+
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer_in), GST_FLOW_OK);
+
+  /* The first buffer has now been pushed out */
+  fail_unless_equals_int (g_list_length (buffers), 1);
+
+  node = g_list_last (buffers);
+  check_buffer_equal ((GstBuffer *) node->data, buffer_out);
+  gst_buffer_unref (buffer_out);
+
+  /* Push EOS */
+  fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()));
+
+  /* The second buffer has been pushed out */
+  fail_unless_equals_int (g_list_length (buffers), 2);
+
+  /* Last buffer always has the 'E' flag */
+  buffer_out = create_extension_buffer (buffer_in, FALSE, TRUE, end_contiguous,
+      NTP_OFFSET, CSEQ);
+  node = g_list_last (buffers);
+  check_buffer_equal ((GstBuffer *) node->data, buffer_out);
+  gst_buffer_unref (buffer_out);
+
+  ASSERT_SET_STATE (element, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
+}
+
+GST_START_TEST (test_apply_clean_point)
+{
+  do_one_buffer_test_apply (TRUE);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_apply_no_e_bit)
+{
+  do_two_buffers_test_apply (FALSE);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_apply_e_bit)
+{
+  do_two_buffers_test_apply (TRUE);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_flushing)
+{
+  GstBuffer *buffer;
+
+  /* set the e-bit, so the element use caching */
+  g_object_set (element, "set-e-bit", TRUE, NULL);
+  /* set the ntp-offset, since no one will provide a clock */
+  g_object_set (element, "ntp-offset", NTP_OFFSET, NULL);
+
+  ASSERT_SET_STATE (element, GST_STATE_PLAYING, GST_STATE_CHANGE_SUCCESS);
+  gst_check_setup_events (mysrcpad, element, NULL, GST_FORMAT_TIME);
+
+  /* create and push the first buffer */
+  buffer = create_rtp_buffer (TIMESTAMP, TRUE);
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer), GST_FLOW_OK);
+
+  /* no buffers should have made it through */
+  fail_unless_equals_int (g_list_length (buffers), 0);
+
+  /* flush the element */
+  fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_flush_start ()));
+  fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_flush_stop (FALSE)));
+
+  /* resend events */
+  gst_check_setup_events (mysrcpad, element, NULL, GST_FORMAT_TIME);
+
+  /* create and push a second buffer */
+  buffer = create_rtp_buffer (TIMESTAMP + 1, TRUE);
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer), GST_FLOW_OK);
+
+  /* still no buffers should have made it through (the first one should have
+   * been dropped during flushing) */
+  fail_unless_equals_int (g_list_length (buffers), 0);
+
+  ASSERT_SET_STATE (element, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_reusable_element_no_e_bit)
+{
+  GstBuffer *buffer;
+
+  /* set the ntp-offset, since no one will provide a clock */
+  g_object_set (element, "ntp-offset", NTP_OFFSET, NULL);
+
+  ASSERT_SET_STATE (element, GST_STATE_PLAYING, GST_STATE_CHANGE_SUCCESS);
+  gst_check_setup_events (mysrcpad, element, NULL, GST_FORMAT_TIME);
+
+  /* create and push the first buffer */
+  buffer = create_rtp_buffer (TIMESTAMP, TRUE);
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer), GST_FLOW_OK);
+
+  /* create and push a second buffer */
+  buffer = create_rtp_buffer (TIMESTAMP + 1, TRUE);
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer), GST_FLOW_OK);
+
+  /* create and push a third buffer */
+  buffer = create_rtp_buffer (TIMESTAMP + 2, TRUE);
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer), GST_FLOW_OK);
+
+  ASSERT_SET_STATE (element, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
+
+  fail_unless_equals_int (g_list_length (buffers), 3);
+
+  ASSERT_SET_STATE (element, GST_STATE_PLAYING, GST_STATE_CHANGE_SUCCESS);
+  gst_check_setup_events (mysrcpad, element, NULL, GST_FORMAT_TIME);
+
+  /* create and push the first buffer */
+  buffer = create_rtp_buffer (TIMESTAMP, TRUE);
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer), GST_FLOW_OK);
+
+  /* create and push a second buffer */
+  buffer = create_rtp_buffer (TIMESTAMP + 1, TRUE);
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer), GST_FLOW_OK);
+
+  /* create and push a third buffer */
+  buffer = create_rtp_buffer (TIMESTAMP + 2, TRUE);
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer), GST_FLOW_OK);
+
+  ASSERT_SET_STATE (element, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
+
+  fail_unless_equals_int (g_list_length (buffers), 6);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_reusable_element_e_bit)
+{
+  GstBuffer *buffer;
+
+  /* set the e-bit, so the element use caching */
+  g_object_set (element, "set-e-bit", TRUE, NULL);
+  /* set the ntp-offset, since no one will provide a clock */
+  g_object_set (element, "ntp-offset", NTP_OFFSET, NULL);
+
+  ASSERT_SET_STATE (element, GST_STATE_PLAYING, GST_STATE_CHANGE_SUCCESS);
+  gst_check_setup_events (mysrcpad, element, NULL, GST_FORMAT_TIME);
+
+  /* create and push the first buffer */
+  buffer = create_rtp_buffer (TIMESTAMP, TRUE);
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer), GST_FLOW_OK);
+
+  /* create and push a second buffer */
+  buffer = create_rtp_buffer (TIMESTAMP + 1, TRUE);
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer), GST_FLOW_OK);
+
+  /* create and push a third buffer */
+  buffer = create_rtp_buffer (TIMESTAMP + 2, TRUE);
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer), GST_FLOW_OK);
+
+  ASSERT_SET_STATE (element, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
+
+  fail_unless_equals_int (g_list_length (buffers), 2);
+
+  ASSERT_SET_STATE (element, GST_STATE_PLAYING, GST_STATE_CHANGE_SUCCESS);
+  gst_check_setup_events (mysrcpad, element, NULL, GST_FORMAT_TIME);
+
+  /* create and push the first buffer */
+  buffer = create_rtp_buffer (TIMESTAMP, TRUE);
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer), GST_FLOW_OK);
+
+  /* create and push a second buffer */
+  buffer = create_rtp_buffer (TIMESTAMP + 1, TRUE);
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer), GST_FLOW_OK);
+
+  /* create and push a third buffer */
+  buffer = create_rtp_buffer (TIMESTAMP + 2, TRUE);
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer), GST_FLOW_OK);
+
+  ASSERT_SET_STATE (element, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
+
+  fail_unless_equals_int (g_list_length (buffers), 4);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_ntp_offset_event)
+{
+  GstBuffer *buffer_in, *buffer1_out, *buffer2_out;
+  GList *node;
+
+  /* set the e-bit, so the element use caching */
+  g_object_set (element, "set-e-bit", TRUE, NULL);
+
+  ASSERT_SET_STATE (element, GST_STATE_PLAYING, GST_STATE_CHANGE_SUCCESS);
+  gst_check_setup_events (mysrcpad, element, NULL, GST_FORMAT_TIME);
+
+  /* push an ntp-offset event */
+  fail_unless (gst_pad_push_event (mysrcpad,
+          create_ntp_offset_event (NTP_OFFSET, FALSE)));
+
+  /* create and push the first buffer */
+  buffer_in = create_rtp_buffer (TIMESTAMP, TRUE);
+  buffer1_out = create_extension_buffer (buffer_in, TRUE, TRUE, FALSE,
+      NTP_OFFSET, 0);
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer_in), GST_FLOW_OK);
+
+  /* push a new ntp offset */
+  fail_unless (gst_pad_push_event (mysrcpad,
+          create_ntp_offset_event (2 * NTP_OFFSET, TRUE)));
+
+  /* create and push a second buffer (last) */
+  buffer_in = create_rtp_buffer (TIMESTAMP + 1, TRUE);
+  buffer2_out = create_extension_buffer (buffer_in, TRUE, TRUE, TRUE,
+      2 * NTP_OFFSET, 0);
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer_in), GST_FLOW_OK);
+
+  /* the first buffer should have been pushed now */
+  fail_unless_equals_int (g_list_length (buffers), 1);
+  node = g_list_last (buffers);
+  check_buffer_equal ((GstBuffer *) node->data, buffer1_out);
+  gst_buffer_unref (buffer1_out);
+
+  /* push EOS */
+  fail_unless (gst_pad_push_event (mysrcpad, gst_event_new_eos ()));
+
+  /* the second buffer has now been pushed */
+  fail_unless_equals_int (g_list_length (buffers), 2);
+  node = g_list_last (buffers);
+  check_buffer_equal ((GstBuffer *) node->data, buffer2_out);
+  gst_buffer_unref (buffer2_out);
+
+  ASSERT_SET_STATE (element, GST_STATE_NULL, GST_STATE_CHANGE_SUCCESS);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_serialized_events)
+{
+  GstBuffer *buffer;
+
+  /* we want the e-bit set so that buffers are cached */
+  g_object_set (element, "set-e-bit", TRUE, NULL);
+  g_object_set (element, "ntp-offset", NTP_OFFSET, NULL);
+
+  ASSERT_SET_STATE (element, GST_STATE_PLAYING, GST_STATE_CHANGE_SUCCESS);
+
+  /* send intitial events (stream-start and segment) */
+  gst_check_setup_events (mysrcpad, element, NULL, GST_FORMAT_TIME);
+  check_and_clear_events (2, NO_COMPARE);
+
+  /* events received while no buffer is cached should be forwarded */
+  create_and_push_event (GST_EVENT_CUSTOM_DOWNSTREAM);
+  check_and_clear_events (1, NO_COMPARE);
+
+  /* create and push the first buffer, which should be cached */
+  buffer = create_rtp_buffer (TIMESTAMP, TRUE);
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer), GST_FLOW_OK);
+  fail_unless_equals_int (g_list_length (buffers), 0);
+  /* serialized events should be queued when there's a buffer cached */
+  create_and_push_event (GST_EVENT_CUSTOM_DOWNSTREAM);
+  fail_unless_equals_int (g_list_length (myreceivedevents), 0);
+  /* there's still a buffer cached... */
+  create_and_push_event (GST_EVENT_CUSTOM_DOWNSTREAM);
+  fail_unless_equals_int (g_list_length (myreceivedevents), 0);
+
+  /* receiving a new buffer should let the first through, along with the
+   * queued serialized events  */
+  buffer = create_rtp_buffer (TIMESTAMP, TRUE);
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer), GST_FLOW_OK);
+  fail_unless_equals_int (g_list_length (buffers), 1);
+  check_and_clear_events (2, COMPARE);
+
+  /* there's still a buffer cached, a new serialized event should be quueud */
+  create_and_push_event (GST_EVENT_CUSTOM_DOWNSTREAM);
+  fail_unless_equals_int (g_list_length (myreceivedevents), 0);
+
+  /* when receiving an EOS cached buffer and queued events should be forwarded */
+  create_and_push_event (GST_EVENT_EOS);
+  check_and_clear_events (2, COMPARE);
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_non_serialized_events)
+{
+  GstEvent *event;
+  GstBuffer *buffer;
+
+  /* we want the e-bit set so that buffers are cached */
+  g_object_set (element, "set-e-bit", TRUE, NULL);
+  g_object_set (element, "ntp-offset", NTP_OFFSET, NULL);
+
+  ASSERT_SET_STATE (element, GST_STATE_PLAYING, GST_STATE_CHANGE_SUCCESS);
+
+  /* send intitial events (stream-start and segment) */
+  gst_check_setup_events (mysrcpad, element, NULL, GST_FORMAT_TIME);
+  fail_unless_equals_int (g_list_length (myreceivedevents), 2);
+  check_and_clear_events (2, NO_COMPARE);
+
+  /* events received while no buffer is cached should be forwarded */
+  create_and_push_event (GST_EVENT_CUSTOM_DOWNSTREAM_OOB);
+  check_and_clear_events (1, COMPARE);
+
+  /* create and push the first buffer, which should be cached */
+  buffer = create_rtp_buffer (TIMESTAMP, TRUE);
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer), GST_FLOW_OK);
+  fail_unless_equals_int (g_list_length (buffers), 0);
+  /* non-serialized events should be forwarded regardless of whether
+   * there is a cached buffer */
+  create_and_push_event (GST_EVENT_CUSTOM_DOWNSTREAM_OOB);
+  check_and_clear_events (1, COMPARE);
+
+  /* there's still a buffer cached, push a serialized event and make sure
+   * it's queued */
+  create_and_push_event (GST_EVENT_CUSTOM_DOWNSTREAM);
+  fail_unless_equals_int (g_list_length (myreceivedevents), 0);
+  /* non-serialized events should be forwarded regardless of whether there
+   * are serialized events queued, thus the g_list_prepend below */
+  event = create_event (GST_EVENT_CUSTOM_DOWNSTREAM_OOB);
+  mypushedevents = g_list_prepend (mypushedevents, event);
+  fail_unless (gst_pad_push_event (mysrcpad, event));
+  fail_unless_equals_int (g_list_length (myreceivedevents), 1);
+
+  /* when receiving an EOS cached buffer and queued events should be forwarded */
+  create_and_push_event (GST_EVENT_EOS);
+  fail_unless_equals_int (g_list_length (buffers), 1);
+  check_and_clear_events (3, COMPARE);
+}
+
+GST_END_TEST;
+
+static void
+do_ntp_time (GstClockTime buffer_time, gint segment_start, gint segment_base)
+{
+  GstSegment segment;
+  GstBuffer *buffer;
+  GstRTPBuffer rtpbuffer = GST_RTP_BUFFER_INIT;
+  guint8 *data;
+  guint64 expected_ntp_time;
+  guint64 timestamp;
+
+  /* create a segment that controls the behavior
+   * by changing segment.start and segment.base we affect the stream time and
+   * running time respectively */
+  gst_segment_init (&segment, GST_FORMAT_TIME);
+  segment.start = segment_start;
+  segment.base = segment_base;
+  gst_pad_push_event (mysrcpad, gst_event_new_segment (&segment));
+
+  expected_ntp_time = gst_segment_to_stream_time (&segment, GST_FORMAT_TIME,
+      buffer_time);
+  expected_ntp_time += NTP_OFFSET;
+  expected_ntp_time = gst_util_uint64_scale (expected_ntp_time,
+      (G_GINT64_CONSTANT (1) << 32), GST_SECOND);
+
+  buffer = create_rtp_buffer (buffer_time, FALSE);
+  fail_unless_equals_int (gst_pad_push (mysrcpad, buffer), GST_FLOW_OK);
+  fail_unless_equals_int (g_list_length (buffers), 1);
+
+  buffer = g_list_last (buffers)->data;
+
+  /* get the extension header */
+  fail_unless (gst_rtp_buffer_map (buffer, GST_MAP_READWRITE, &rtpbuffer));
+  fail_unless (gst_rtp_buffer_get_extension_data (&rtpbuffer, NULL,
+          (gpointer) & data, NULL));
+
+  /* ...and read the NTP timestamp and verify that it's the expected one */
+  timestamp = GST_READ_UINT64_BE (data);
+  fail_unless_equals_uint64 (timestamp, expected_ntp_time);
+
+  gst_rtp_buffer_unmap (&rtpbuffer);
+  gst_check_drop_buffers ();
+}
+
+GST_START_TEST (test_ntp_time)
+{
+  /* we do not need buffer caching, so do not set the e-bit */
+  g_object_set (element, "set-e-bit", FALSE, NULL);
+  /* set an ntp offset suitable for testing */
+  g_object_set (element, "ntp-offset", NTP_OFFSET, NULL);
+
+  ASSERT_SET_STATE (element, GST_STATE_PLAYING, GST_STATE_CHANGE_SUCCESS);
+
+  /* push initial events */
+  gst_check_setup_events (mysrcpad, element, NULL, GST_FORMAT_TIME);
+
+  /* first test with a "clean" segment */
+  do_ntp_time (GST_MSECOND, 0, 0);
+  do_ntp_time (GST_SECOND + GST_MSECOND, 0, 0);
+
+  /* verify that changing the running time does not affect the ntp time stamps  */
+  do_ntp_time (GST_MSECOND, 0, GST_SECOND);
+  do_ntp_time (GST_SECOND + GST_MSECOND, 0, GST_SECOND);
+
+  /* changing the segment.start affects the stream time, verify that the element
+   * handles it correctly */
+  do_ntp_time (GST_MSECOND, GST_MSECOND / 2, 0);
+  do_ntp_time (GST_SECOND + GST_MSECOND, GST_MSECOND / 2, 0);
+
+  /* and finally change both of them and verify that all's fine */
+  do_ntp_time (GST_MSECOND, GST_MSECOND / 2, GST_SECOND);
+  do_ntp_time (GST_SECOND + GST_MSECOND, GST_MSECOND / 2, GST_SECOND);
+}
+
+GST_END_TEST;
+
+static Suite *
+onviftimestamp_suite (void)
+{
+  Suite *s = suite_create ("onviftimestamp");
+  TCase *tc_general, *tc_events;
+
+  tc_general = tcase_create ("general");
+  suite_add_tcase (s, tc_general);
+  tcase_add_checked_fixture (tc_general, setup, cleanup);
+
+  tcase_add_test (tc_general, test_apply_clean_point);
+  tcase_add_test (tc_general, test_apply_no_e_bit);
+  tcase_add_test (tc_general, test_apply_e_bit);
+  tcase_add_test (tc_general, test_flushing);
+  tcase_add_test (tc_general, test_reusable_element_no_e_bit);
+  tcase_add_test (tc_general, test_reusable_element_e_bit);
+  tcase_add_test (tc_general, test_ntp_offset_event);
+  tcase_add_test (tc_general, test_ntp_time);
+
+  tc_events = tcase_create ("events");
+  suite_add_tcase (s, tc_events);
+  tcase_add_checked_fixture (tc_events, setup_with_event, cleanup_with_event);
+
+  tcase_add_test (tc_events, test_serialized_events);
+  tcase_add_test (tc_events, test_non_serialized_events);
+
+  return s;
+}
+
+GST_CHECK_MAIN (onviftimestamp);
diff --git a/tests/check/elements/templatematch.c b/tests/check/elements/templatematch.c
index 5b56718..99fc794 100644
--- a/tests/check/elements/templatematch.c
+++ b/tests/check/elements/templatematch.c
@@ -92,7 +92,8 @@
   GstElement *element;
   GstPad *sinkpad, *srcpad;
   GstCaps *caps =
-      gst_caps_from_string (CAPS_TMPL ", width=(int)16, height=(int)16");
+      gst_caps_from_string (CAPS_TMPL
+      ", width=(int)16, height=(int)16, framerate=1/1");
   GstBus *bus;
   GstMessage *msg;
   const GstStructure *structure;
diff --git a/tests/check/elements/test_http_src.c b/tests/check/elements/test_http_src.c
new file mode 100644
index 0000000..88b0c4f
--- /dev/null
+++ b/tests/check/elements/test_http_src.c
@@ -0,0 +1,716 @@
+/* HTTP source element for use in tests
+ *
+ * Copyright (c) <2015> YouView TV Ltd
+ *
+ * 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 <gst/check/gstcheck.h>
+#include <gst/base/gstbasesrc.h>
+
+#include "test_http_src.h"
+
+#ifndef GST_PACKAGE_NAME
+#define GST_PACKAGE_NAME "gst-plugins-bad"
+#endif
+
+#ifndef GST_PACKAGE_ORIGIN
+#define GST_PACKAGE_ORIGIN "https://developer.gnome.org/gstreamer/"
+#endif
+
+#define GST_TEST_HTTP_SRC(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), GST_TYPE_TEST_HTTP_SRC, GstTestHTTPSrc))
+#define GST_TEST_HTTP_SRC_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass), GST_TYPE_TEST_HTTP_SRC, GstTestHTTPSrcClass))
+#define GST_IS_TEST_HTTP_SRC(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), GST_TYPE_TEST_HTTP_SRC))
+#define GST_IS_TEST_HTTP_SRC_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GST_TYPE_TEST_HTTP_SRC))
+#define GST_TEST_HTTP_SRC_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj), GST_TYPE_TEST_HTTP_SRC, GstTestHTTPSrcClass))
+
+#define DEFAULT_USER_AGENT  "GStreamer testhttpsrc "
+#define DEFAULT_COMPRESS    FALSE
+#define DEFAULT_HTTP_METHOD NULL
+#define DEFAULT_KEEP_ALIVE  FALSE
+
+enum
+{
+  PROP_0,
+  PROP_USER_AGENT,
+  PROP_EXTRA_HEADERS,
+  PROP_COMPRESS,
+  PROP_KEEP_ALIVE,
+  PROP_METHOD,
+  PROP_LAST
+};
+
+typedef enum
+{
+  METHOD_INVALID,
+  METHOD_GET,
+  METHOD_POST,
+  METHOD_HEAD,
+  METHOD_OPTIONS
+} HttpMethod;
+
+typedef struct _GstTestHTTPSrcMethodName
+{
+  const gchar *name;
+  HttpMethod method;
+} GstTestHTTPSrcMethodName;
+
+static const GstTestHTTPSrcMethodName gst_test_http_src_methods[] = {
+  {"GET", METHOD_GET},
+  {"POST", METHOD_POST},
+  {"HEAD", METHOD_HEAD},
+  {"OPTIONS", METHOD_OPTIONS},
+  {NULL, METHOD_INVALID}
+};
+
+typedef struct _GstTestHTTPSrc
+{
+  GstBaseSrc parent;
+
+  GMutex mutex;
+
+  GstTestHTTPSrcInput input;
+
+  gchar *uri;                   /* the uri for which data is being requested */
+  gboolean compress;
+  gboolean keep_alive;
+  gchar *http_method_name;
+  HttpMethod http_method;
+  GstStructure *extra_headers;
+  gchar *user_agent;
+
+  guint64 position;
+  /* index immediately after the last byte from the segment to be retrieved */
+  guint64 segment_end;
+
+  GstEvent *http_headers_event;
+  gboolean duration_changed;
+} GstTestHTTPSrc;
+
+typedef struct _GstTestHTTPSrcClass
+{
+  GstBaseSrcClass parent_class;
+} GstTestHTTPSrcClass;
+
+typedef struct _PluginInitContext
+{
+  const gchar *name;
+  guint rank;
+  GType type;
+} PluginInitContext;
+
+static const GstTestHTTPSrcCallbacks *gst_test_http_src_callbacks = NULL;
+static gpointer gst_test_http_src_callback_user_data = NULL;
+static guint gst_test_http_src_blocksize = 0;
+
+static GstStaticPadTemplate gst_dashdemux_test_source_template =
+GST_STATIC_PAD_TEMPLATE ("src",
+    GST_PAD_SRC,
+    GST_PAD_ALWAYS,
+    GST_STATIC_CAPS_ANY);
+
+static void gst_test_http_src_uri_handler_init (gpointer g_iface,
+    gpointer iface_data);
+static void gst_test_http_src_finalize (GObject * object);
+static gboolean gst_test_http_src_is_seekable (GstBaseSrc * basesrc);
+static gboolean gst_test_http_src_do_seek (GstBaseSrc * basesrc,
+    GstSegment * segment);
+static gboolean gst_test_http_src_start (GstBaseSrc * basesrc);
+static gboolean gst_test_http_src_stop (GstBaseSrc * basesrc);
+static gboolean gst_test_http_src_get_size (GstBaseSrc * basesrc,
+    guint64 * size);
+static GstFlowReturn gst_test_http_src_create (GstBaseSrc * basesrc,
+    guint64 offset, guint length, GstBuffer ** ret);
+static void gst_test_http_src_set_property (GObject * object, guint prop_id,
+    const GValue * value, GParamSpec * pspec);
+static void gst_test_http_src_get_property (GObject * object, guint prop_id,
+    GValue * value, GParamSpec * pspec);
+
+
+#define _do_init \
+  G_IMPLEMENT_INTERFACE (GST_TYPE_URI_HANDLER, gst_test_http_src_uri_handler_init);
+
+#define gst_test_http_src_parent_class parent_class
+G_DEFINE_TYPE_WITH_CODE (GstTestHTTPSrc, gst_test_http_src,
+    GST_TYPE_BASE_SRC, _do_init);
+
+static void
+gst_test_http_src_class_init (GstTestHTTPSrcClass * klass)
+{
+  GObjectClass *gobject_class;
+  GstElementClass *gstelement_class;
+  GstBaseSrcClass *gstbasesrc_class;
+
+  gobject_class = G_OBJECT_CLASS (klass);
+  gstelement_class = GST_ELEMENT_CLASS (klass);
+  gstbasesrc_class = GST_BASE_SRC_CLASS (klass);
+
+  gobject_class->set_property = gst_test_http_src_set_property;
+  gobject_class->get_property = gst_test_http_src_get_property;
+  gobject_class->finalize = gst_test_http_src_finalize;
+
+  g_object_class_install_property (gobject_class, PROP_COMPRESS,
+      g_param_spec_boolean ("compress", "Compress",
+          "Allow compressed content encodings",
+          DEFAULT_COMPRESS, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_property (gobject_class, PROP_EXTRA_HEADERS,
+      g_param_spec_boxed ("extra-headers", "Extra Headers",
+          "Extra headers to append to the HTTP request",
+          GST_TYPE_STRUCTURE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_property (gobject_class, PROP_KEEP_ALIVE,
+      g_param_spec_boolean ("keep-alive", "keep-alive",
+          "Use HTTP persistent connections", DEFAULT_KEEP_ALIVE,
+          G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_property (gobject_class, PROP_METHOD,
+      g_param_spec_string ("method", "HTTP method",
+          "The HTTP method to use (GET, HEAD, OPTIONS, etc)",
+          DEFAULT_HTTP_METHOD, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  g_object_class_install_property (gobject_class,
+      PROP_USER_AGENT,
+      g_param_spec_string ("user-agent", "User-Agent",
+          "Value of the User-Agent HTTP request header field",
+          DEFAULT_USER_AGENT, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS));
+
+  gst_element_class_set_metadata (gstelement_class,
+      "Test HTTP source element for unit tests",
+      "Source/Network",
+      "Use in unit tests", "Alex Ashley <alex.ashley@youview.com>");
+  gst_element_class_add_pad_template (gstelement_class,
+      gst_static_pad_template_get (&gst_dashdemux_test_source_template));
+
+  gstbasesrc_class->start = GST_DEBUG_FUNCPTR (gst_test_http_src_start);
+  gstbasesrc_class->stop = GST_DEBUG_FUNCPTR (gst_test_http_src_stop);
+  gstbasesrc_class->is_seekable =
+      GST_DEBUG_FUNCPTR (gst_test_http_src_is_seekable);
+  gstbasesrc_class->do_seek = GST_DEBUG_FUNCPTR (gst_test_http_src_do_seek);
+  gstbasesrc_class->get_size = GST_DEBUG_FUNCPTR (gst_test_http_src_get_size);
+  gstbasesrc_class->create = GST_DEBUG_FUNCPTR (gst_test_http_src_create);
+
+}
+
+static void
+gst_test_http_src_init (GstTestHTTPSrc * src)
+{
+  g_mutex_init (&src->mutex);
+  src->uri = NULL;
+  memset (&src->input, 0, sizeof (src->input));
+  src->compress = FALSE;
+  src->keep_alive = FALSE;
+  src->http_method_name = NULL;
+  src->http_method = METHOD_GET;
+  src->user_agent = NULL;
+  src->position = 0;
+  src->segment_end = 0;
+  src->http_headers_event = NULL;
+  src->duration_changed = FALSE;
+  if (gst_test_http_src_blocksize)
+    gst_base_src_set_blocksize (GST_BASE_SRC (src),
+        gst_test_http_src_blocksize);
+}
+
+static void
+gst_test_http_src_reset_input (GstTestHTTPSrc * src)
+{
+  src->input.context = NULL;
+  src->input.size = 0;
+  src->input.status_code = 0;
+  if (src->input.request_headers) {
+    gst_structure_free (src->input.request_headers);
+    src->input.request_headers = NULL;
+  }
+  if (src->input.response_headers) {
+    gst_structure_free (src->input.response_headers);
+    src->input.response_headers = NULL;
+  }
+  if (src->http_headers_event) {
+    gst_event_unref (src->http_headers_event);
+    src->http_headers_event = NULL;
+  }
+  if (src->extra_headers) {
+    gst_structure_free (src->extra_headers);
+    src->extra_headers = NULL;
+  }
+  src->duration_changed = FALSE;
+}
+
+static void
+gst_test_http_src_finalize (GObject * object)
+{
+  GstTestHTTPSrc *src;
+
+  src = GST_TEST_HTTP_SRC (object);
+
+  g_free (src->uri);
+  gst_test_http_src_reset_input (src);
+  g_mutex_clear (&src->mutex);
+
+  G_OBJECT_CLASS (parent_class)->finalize (object);
+}
+
+static gboolean
+gst_test_http_src_start (GstBaseSrc * basesrc)
+{
+  GstTestHTTPSrc *src;
+  GstStructure *http_headers;
+
+  src = GST_TEST_HTTP_SRC (basesrc);
+  g_mutex_lock (&src->mutex);
+  gst_test_http_src_reset_input (src);
+  if (!src->uri) {
+    GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ, (("No URL set.")),
+        ("Missing location property"));
+    g_mutex_unlock (&src->mutex);
+    return FALSE;
+  }
+  if (!gst_test_http_src_callbacks) {
+    GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ,
+        (("Callbacks not registered.")), ("Callbacks not registered"));
+    g_mutex_unlock (&src->mutex);
+    return FALSE;
+  }
+  if (!gst_test_http_src_callbacks->src_start) {
+    GST_ELEMENT_ERROR (src, RESOURCE, OPEN_READ,
+        (("src_start callback not defined.")),
+        ("src_start callback not registered"));
+    g_mutex_unlock (&src->mutex);
+    return FALSE;
+  }
+  if (!gst_test_http_src_callbacks->src_start (src, src->uri, &src->input,
+          gst_test_http_src_callback_user_data)) {
+    if (src->input.status_code == 0) {
+      src->input.status_code = 404;
+    }
+  } else {
+    if (src->input.status_code == 0) {
+      src->input.status_code = 200;
+    }
+    src->position = 0;
+    src->segment_end = src->input.size;
+    gst_base_src_set_dynamic_size (basesrc, FALSE);
+    basesrc->segment.duration = src->input.size;
+    src->duration_changed = TRUE;
+  }
+  http_headers = gst_structure_new_empty ("http-headers");
+  gst_structure_set (http_headers, "uri", G_TYPE_STRING, src->uri, NULL);
+  if (!src->input.request_headers) {
+    src->input.request_headers = gst_structure_new_empty ("request-headers");
+  }
+  if (!gst_structure_has_field_typed (src->input.request_headers,
+          "User-Agent", G_TYPE_STRING)) {
+    gst_structure_set (src->input.request_headers,
+        "User-Agent", G_TYPE_STRING,
+        src->user_agent ? src->user_agent : DEFAULT_USER_AGENT, NULL);
+  }
+  if (!gst_structure_has_field_typed (src->input.request_headers,
+          "Connection", G_TYPE_STRING)) {
+    gst_structure_set (src->input.request_headers,
+        "Connection", G_TYPE_STRING,
+        src->keep_alive ? "Keep-Alive" : "Close", NULL);
+  }
+  if (src->compress
+      && !gst_structure_has_field_typed (src->input.request_headers,
+          "Accept-Encoding", G_TYPE_STRING)) {
+    gst_structure_set (src->input.request_headers, "Accept-Encoding",
+        G_TYPE_STRING, "compress, gzip", NULL);
+  }
+  gst_structure_set (http_headers, "request-headers", GST_TYPE_STRUCTURE,
+      src->input.request_headers, NULL);
+  if (!src->input.response_headers) {
+    src->input.response_headers = gst_structure_new_empty ("response-headers");
+  }
+  if (!gst_structure_has_field_typed (src->input.response_headers,
+          "Connection", G_TYPE_STRING)) {
+    gst_structure_set (src->input.response_headers,
+        "Connection", G_TYPE_STRING,
+        src->keep_alive ? "keep-alive" : "close", NULL);
+  }
+  if (!gst_structure_has_field_typed (src->input.response_headers,
+          "Date", G_TYPE_STRING)) {
+    GDateTime *now;
+    gchar *date_str;
+
+    now = g_date_time_new_now_local ();
+    fail_unless (now != NULL);
+    date_str = g_date_time_format (now, "%a, %e %b %Y %T %Z");
+    fail_unless (date_str != NULL);
+    gst_structure_set (src->input.response_headers,
+        "Date", G_TYPE_STRING, date_str, NULL);
+    g_free (date_str);
+    g_date_time_unref (now);
+  }
+  gst_structure_set (http_headers, "response-headers", GST_TYPE_STRUCTURE,
+      src->input.response_headers, NULL);
+  if (src->http_headers_event) {
+    gst_event_unref (src->http_headers_event);
+  }
+  src->http_headers_event =
+      gst_event_new_custom (GST_EVENT_CUSTOM_DOWNSTREAM_STICKY, http_headers);
+  g_mutex_unlock (&src->mutex);
+  return TRUE;
+}
+
+static gboolean
+gst_test_http_src_stop (GstBaseSrc * basesrc)
+{
+  GstTestHTTPSrc *src;
+
+  src = GST_TEST_HTTP_SRC (basesrc);
+  g_mutex_lock (&src->mutex);
+  src->position = 0;
+  gst_test_http_src_reset_input (src);
+  g_mutex_unlock (&src->mutex);
+  return TRUE;
+}
+
+static gboolean
+gst_test_http_src_is_seekable (GstBaseSrc * basesrc)
+{
+  GstTestHTTPSrc *src;
+  gboolean ret;
+
+  src = GST_TEST_HTTP_SRC (basesrc);
+  g_mutex_lock (&src->mutex);
+  /* if size is set, we can seek */
+  ret = src->input.size > 0;
+  g_mutex_unlock (&src->mutex);
+  return ret;
+}
+
+static gboolean
+gst_test_http_src_do_seek (GstBaseSrc * basesrc, GstSegment * segment)
+{
+  GstTestHTTPSrc *src = GST_TEST_HTTP_SRC (basesrc);
+
+  GST_DEBUG ("gst_test_http_src_do_seek start = %" G_GUINT64_FORMAT,
+      segment->start);
+
+  /*
+     According to RFC7233, the range is inclusive:
+     The first-byte-pos value in a byte-range-spec gives the byte-offset
+     of the first byte in a range.  The last-byte-pos value gives the
+     byte-offset of the last byte in the range; that is, the byte
+     positions specified are inclusive.  Byte offsets start at zero.
+   */
+
+  g_mutex_lock (&src->mutex);
+  if (!src->uri) {
+    GST_DEBUG ("attempt to seek before URI set");
+    g_mutex_unlock (&src->mutex);
+    return FALSE;
+  }
+  if (src->input.status_code >= 200 && src->input.status_code < 300) {
+    if (segment->start >= src->input.size) {
+      GST_DEBUG ("attempt to seek to %" G_GUINT64_FORMAT " but size is %"
+          G_GUINT64_FORMAT, segment->start, src->input.size);
+      g_mutex_unlock (&src->mutex);
+      return FALSE;
+    }
+    if (segment->stop != -1 && segment->stop > src->input.size) {
+      g_mutex_unlock (&src->mutex);
+      return FALSE;
+    }
+  } else {
+    GST_DEBUG ("Attempt to seek on a URL that will generate HTTP error %u",
+        src->input.status_code);
+  }
+  src->position = segment->start;
+
+  if (segment->stop != -1) {
+    src->segment_end = segment->stop;
+  } else {
+    src->segment_end = src->input.size;
+  }
+  g_mutex_unlock (&src->mutex);
+  return TRUE;
+}
+
+static gboolean
+gst_test_http_src_get_size (GstBaseSrc * basesrc, guint64 * size)
+{
+  GstTestHTTPSrc *src;
+
+  src = GST_TEST_HTTP_SRC (basesrc);
+
+  g_mutex_lock (&src->mutex);
+  /* if it was started, size is set */
+  if (src->uri && src->input.status_code >= 200 && src->input.status_code < 300) {
+    *size = src->input.size;
+    g_mutex_unlock (&src->mutex);
+    return TRUE;
+  }
+  /* cannot get the size if it wasn't started */
+  g_mutex_unlock (&src->mutex);
+  return FALSE;
+}
+
+static GstFlowReturn
+gst_test_http_src_create (GstBaseSrc * basesrc, guint64 offset,
+    guint length, GstBuffer ** retbuf)
+{
+  GstTestHTTPSrc *src = GST_TEST_HTTP_SRC (basesrc);
+  guint bytes_read;
+  GstFlowReturn ret = GST_FLOW_OK;
+  guint blocksize;
+
+  fail_unless (gst_test_http_src_callbacks != NULL);
+  fail_unless (gst_test_http_src_callbacks->src_create != NULL);
+
+  GST_OBJECT_LOCK (src);
+  blocksize = basesrc->blocksize;
+  GST_OBJECT_UNLOCK (src);
+
+  g_mutex_lock (&src->mutex);
+  GST_DEBUG ("gst_test_http_src_create feeding from %" G_GUINT64_FORMAT,
+      src->position);
+  if (src->uri == NULL) {
+    GST_ELEMENT_ERROR (src, RESOURCE, READ, (NULL), GST_ERROR_SYSTEM);
+    g_mutex_unlock (&src->mutex);
+    return GST_FLOW_ERROR;
+  }
+  if (src->input.status_code < 200 || src->input.status_code >= 300) {
+    GST_ELEMENT_ERROR (src, RESOURCE, NOT_FOUND, ("%s",
+            "Generated requested error"), ("%s (%d), URL: %s, Redirect to: %s",
+            "Generated requested error", src->input.status_code, src->uri,
+            GST_STR_NULL (NULL)));
+    g_mutex_unlock (&src->mutex);
+    return GST_FLOW_ERROR;
+  }
+  if (src->http_method == METHOD_INVALID) {
+    GST_ELEMENT_ERROR (src, RESOURCE, READ, ("%s",
+            "Invalid HTTP method"), ("%s (%s), URL: %s",
+            "Invalid HTTP method", src->http_method_name, src->uri));
+    g_mutex_unlock (&src->mutex);
+    return GST_FLOW_ERROR;
+  } else if (src->http_method == METHOD_HEAD) {
+    ret = GST_FLOW_EOS;
+    goto http_events;
+  }
+  fail_unless_equals_uint64 (offset, src->position);
+  bytes_read = MIN ((src->segment_end - src->position), blocksize);
+  if (bytes_read == 0) {
+    ret = GST_FLOW_EOS;
+    goto http_events;
+  }
+  ret = gst_test_http_src_callbacks->src_create (src,
+      offset, bytes_read, retbuf,
+      src->input.context, gst_test_http_src_callback_user_data);
+  if (ret != GST_FLOW_OK) {
+    goto http_events;
+  }
+
+  GST_BUFFER_OFFSET (*retbuf) = src->position;
+  GST_BUFFER_OFFSET_END (*retbuf) = src->position + bytes_read;
+
+  src->position += bytes_read;
+http_events:
+  if (src->http_headers_event) {
+    gst_pad_push_event (GST_BASE_SRC_PAD (src), src->http_headers_event);
+    src->http_headers_event = NULL;
+  }
+  if (src->duration_changed) {
+    src->duration_changed = FALSE;
+    gst_element_post_message (GST_ELEMENT (src),
+        gst_message_new_duration_changed (GST_OBJECT (src)));
+  }
+
+  g_mutex_unlock (&src->mutex);
+  return ret;
+}
+
+static void
+gst_test_http_src_set_property (GObject * object, guint prop_id,
+    const GValue * value, GParamSpec * pspec)
+{
+  GstTestHTTPSrc *src = GST_TEST_HTTP_SRC (object);
+
+  switch (prop_id) {
+    case PROP_USER_AGENT:
+      g_free (src->user_agent);
+      src->user_agent = g_value_dup_string (value);
+      break;
+    case PROP_EXTRA_HEADERS:{
+      const GstStructure *s = gst_value_get_structure (value);
+      if (src->extra_headers)
+        gst_structure_free (src->extra_headers);
+      src->extra_headers = s ? gst_structure_copy (s) : NULL;
+      break;
+    }
+    case PROP_COMPRESS:
+      src->compress = g_value_get_boolean (value);
+      GST_DEBUG ("Set compress=%s", src->compress ? "TRUE" : "FALSE");
+      break;
+    case PROP_KEEP_ALIVE:
+      src->keep_alive = g_value_get_boolean (value);
+      break;
+    case PROP_METHOD:
+      g_free (src->http_method_name);
+      src->http_method_name = g_value_dup_string (value);
+      src->http_method = METHOD_INVALID;
+      for (guint i = 0; gst_test_http_src_methods[i].name; ++i) {
+        if (strcmp (gst_test_http_src_methods[i].name,
+                src->http_method_name) == 0) {
+          src->http_method = gst_test_http_src_methods[i].method;
+          break;
+        }
+      }
+      /* we don't cause an error for an invalid method at this point,
+         as GstSoupHTTPSrc does not use the http_method_name string until
+         trying to open a connection.
+       */
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static void
+gst_test_http_src_get_property (GObject * object, guint prop_id,
+    GValue * value, GParamSpec * pspec)
+{
+  GstTestHTTPSrc *src = GST_TEST_HTTP_SRC (object);
+
+  switch (prop_id) {
+    case PROP_USER_AGENT:
+      g_value_set_string (value, src->user_agent);
+      break;
+    case PROP_EXTRA_HEADERS:
+      gst_value_set_structure (value, src->extra_headers);
+      break;
+    case PROP_COMPRESS:
+      g_value_set_boolean (value, src->compress);
+      break;
+    case PROP_KEEP_ALIVE:
+      g_value_set_boolean (value, src->keep_alive);
+      break;
+    case PROP_METHOD:
+      g_value_set_string (value, src->http_method_name);
+      break;
+    default:
+      G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
+      break;
+  }
+}
+
+static gboolean
+gst_test_http_src_set_location (GstTestHTTPSrc * src,
+    const gchar * uri, GError ** error)
+{
+  g_mutex_lock (&src->mutex);
+  g_free (src->uri);
+  src->uri = g_strdup (uri);
+  g_mutex_unlock (&src->mutex);
+  return TRUE;
+}
+
+static GstURIType
+gst_test_http_src_uri_get_type (GType type)
+{
+  return GST_URI_SRC;
+}
+
+static const gchar *const *
+gst_test_http_src_uri_get_protocols (GType type)
+{
+  static const gchar *protocols[] = { "http", NULL };
+
+  return protocols;
+}
+
+static gchar *
+gst_test_http_src_uri_get_uri (GstURIHandler * handler)
+{
+  GstTestHTTPSrc *src = GST_TEST_HTTP_SRC (handler);
+  gchar *ret;
+  g_mutex_lock (&src->mutex);
+  ret = g_strdup (src->uri);
+  g_mutex_unlock (&src->mutex);
+  return ret;
+}
+
+static gboolean
+gst_test_http_src_uri_set_uri (GstURIHandler * handler, const gchar * uri,
+    GError ** err)
+{
+  GstTestHTTPSrc *src = GST_TEST_HTTP_SRC (handler);
+
+  return gst_test_http_src_set_location (src, uri, err);
+}
+
+static void
+gst_test_http_src_uri_handler_init (gpointer g_iface, gpointer iface_data)
+{
+  GstURIHandlerInterface *iface = (GstURIHandlerInterface *) g_iface;
+
+  iface->get_type = gst_test_http_src_uri_get_type;
+  iface->get_protocols = gst_test_http_src_uri_get_protocols;
+  iface->get_uri = gst_test_http_src_uri_get_uri;
+  iface->set_uri = gst_test_http_src_uri_set_uri;
+}
+
+static gboolean
+gst_test_http_src_plugin_init_func (GstPlugin * plugin, gpointer user_data)
+{
+  PluginInitContext *context = (PluginInitContext *) user_data;
+  gboolean ret;
+
+  ret =
+      gst_element_register (plugin, context->name, context->rank,
+      context->type);
+  return ret;
+}
+
+gboolean
+gst_test_http_src_register_plugin (GstRegistry * registry, const gchar * name)
+{
+  gboolean ret;
+  PluginInitContext context;
+
+  context.name = name;
+  context.rank = GST_RANK_PRIMARY + 1;
+  context.type = GST_TYPE_TEST_HTTP_SRC;
+  ret = gst_plugin_register_static_full (GST_VERSION_MAJOR,     /* version */
+      GST_VERSION_MINOR,        /* version */
+      name,                     /* name */
+      "Replaces a souphttpsrc plugin and returns predefined data.",     /* description */
+      gst_test_http_src_plugin_init_func,       /* init function */
+      "0.0.0",                  /* version string */
+      GST_LICENSE_UNKNOWN,      /* license */
+      __FILE__,                 /* source */
+      GST_PACKAGE_NAME,         /* package */
+      GST_PACKAGE_ORIGIN,       /* origin */
+      &context                  /* user_data */
+      );
+  return ret;
+}
+
+void
+gst_test_http_src_install_callbacks (const GstTestHTTPSrcCallbacks *
+    callbacks, gpointer user_data)
+{
+  gst_test_http_src_callbacks = callbacks;
+  gst_test_http_src_callback_user_data = user_data;
+}
+
+void
+gst_test_http_src_set_default_blocksize (guint blocksize)
+{
+  gst_test_http_src_blocksize = blocksize;
+}
diff --git a/tests/check/elements/test_http_src.h b/tests/check/elements/test_http_src.h
new file mode 100644
index 0000000..61161af
--- /dev/null
+++ b/tests/check/elements/test_http_src.h
@@ -0,0 +1,132 @@
+/* HTTP source element for use in tests
+ *
+ * Copyright (c) <2015> YouView TV Ltd
+ *
+ * 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_TEST_HTTP_SRC_H__
+#define __GST_TEST_HTTP_SRC_H__
+
+#include <gst/gst.h>
+
+G_BEGIN_DECLS
+
+#define GST_TYPE_TEST_HTTP_SRC            (gst_test_http_src_get_type ())
+
+/* structure used by src_start function to configure the
+ * GstTestHTTPSrc plugin.
+ * It specifies information about a given URI.
+ */
+typedef struct _GstTestHTTPSrcInput
+{
+  gpointer context; /* opaque pointer that can be used in callbacks */
+  guint64 size; /* size of resource, in bytes */
+  GstStructure *request_headers;
+  GstStructure *response_headers;
+  guint status_code; /* HTTP status code */
+} GstTestHTTPSrcInput;
+
+/* Opaque structure used by GstTestHTTPSrc */
+typedef struct _GstTestHTTPSrc GstTestHTTPSrc;
+
+typedef struct _GstTestHTTPSrcCallbacks {
+  /**
+   * src_start:
+   * @src: The #GstTestHTTPSrc calling this callback
+   * @uri: The URI that is being requested
+   * @input_data: (out) The implementation of this callback is
+   * responsible for filling in this #GstTestHTTPSrcInput
+   * with the appropriate information, return returning %TRUE.
+   * If returning %FALSE, only GstTestHTTPSrcInput::status_code
+   * should be updated.
+   * Returns: %TRUE if GstTestHTTPSrc should respond to this URI,
+   * using the supplied input_data.
+   *
+   * src_start is used to "open" the given URI. The callback must return
+   * %TRUE to simulate a success, and set appropriate fields in input_data.
+   * Returning %FALSE indicates that the request URI is not found.
+   * In this situation GstTestHTTPSrc will cause the appropriate
+   * 404 error to be posted to the bus 
+   */
+  gboolean (*src_start)(GstTestHTTPSrc *src,
+                        const gchar *uri,
+                        GstTestHTTPSrcInput *input_data,
+                        gpointer user_data);
+  /**
+   * src_create:
+   * @src: the #GstTestHTTPSrc calling this callback
+   * @offset: the offset from the start of the resource
+   * @length: requested number of bytes
+   * @retbuf: (out) used to return a newly allocated #GstBuffer
+   * @context: (allow none) the value of the context field
+   * in #GstTestHTTPSrcInput.
+   * @user_data: the value of user_data provided to 
+   * #gst_test_http_src_install_callbacks
+   * Returns: %GST_FLOW_OK to indicate success, or some other value of
+   * #GstFlowReturn to indicate EOS or error.
+   *
+   * The src_create function is used to create a #GstBuffer for
+   * simulating the data that is returned when accessing this
+   * "open" stream. It can also be used to simulate various error
+   * conditions by returning something other than %GST_FLOW_OK
+   */
+  GstFlowReturn (*src_create)(GstTestHTTPSrc *src,
+                              guint64 offset,
+                              guint length,
+                              GstBuffer ** retbuf,
+                              gpointer context,
+                              gpointer user_data);
+} GstTestHTTPSrcCallbacks;
+
+GType gst_test_http_src_get_type (void);
+
+/**
+ * gst_test_http_src_register_plugin:
+ * @registry: the #GstRegistry to use for registering this plugin
+ * @name: the name to use for this plugin
+ * Returns: true if successful
+ *
+ * Registers this plugin with the GstRegitry using the given name. It will
+ * be given a high rank, so that it will be picked in preference to any
+ * other element that implements #GstURIHandler.
+ */
+gboolean gst_test_http_src_register_plugin (GstRegistry * registry, const gchar * name);
+
+/**
+ * gst_test_http_src_install_callbacks:
+ * @callbacks: the #GstTestHTTPSrcCallbacks callback functions that will
+ * be called every time this element is asked to open a URI or provide data
+ * for an open URI.
+ * @user_data: a pointer that is passed to every callback
+ */
+void gst_test_http_src_install_callbacks (const GstTestHTTPSrcCallbacks *callbacks, gpointer user_data);
+
+/**
+ * gst_test_http_src_set_default_blocksize:
+ * @blocksize: the default block size to use (0=use #GstBaseSrc default)
+ *
+ * Set the default blocksize that will be used by instances of
+ * #GstTestHTTPSrc. It specifies the size (in bytes) that will be
+ * returned in each #GstBuffer. This default can be overridden
+ * by an instance of #GstTestHTTPSrc using the "blocksize" property
+ * of #GstBaseSrc
+ */
+void gst_test_http_src_set_default_blocksize (guint blocksize);
+
+G_END_DECLS
+
+#endif /* __GST_TEST_HTTP_SRC_H__ */
diff --git a/tests/check/elements/videoframe-audiolevel.c b/tests/check/elements/videoframe-audiolevel.c
new file mode 100644
index 0000000..9d57390
--- /dev/null
+++ b/tests/check/elements/videoframe-audiolevel.c
@@ -0,0 +1,636 @@
+/* GStreamer unit test for videoframe-audiolevel
+ *
+ * Copyright (C) 2015 Vivia Nikolaidou <vivia@toolsonair.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
+
+/* suppress warnings for deprecated API such as GValueArray
+ * with newer GLib versions (>= 2.31.0) */
+#define GLIB_DISABLE_DEPRECATION_WARNINGS
+
+#include <gst/check/gstcheck.h>
+#include <gst/audio/audio.h>
+
+static gboolean got_eos;
+static guint audio_buffer_count, video_buffer_count;
+static GstSegment current_audio_segment, current_video_segment;
+static guint num_msgs;
+static GQueue v_timestamp_q, msg_timestamp_q;
+
+static guint n_abuffers, n_vbuffers;
+static guint channels, fill_value;
+static gdouble expected_rms;
+static gboolean audiodelay, videodelay, per_channel, long_video;
+static gboolean early_video, late_video;
+static gboolean video_gaps, video_overlaps;
+static gboolean audio_nondiscont, audio_drift;
+
+static guint fill_value_per_channel[] = { 0, 1 };
+static gdouble expected_rms_per_channel[] = { 0, 0.0078125 };
+
+static void
+set_default_params (void)
+{
+  n_abuffers = 40;
+  n_vbuffers = 15;
+  channels = 2;
+  expected_rms = 0.0078125;
+  fill_value = 1;
+  audiodelay = FALSE;
+  videodelay = FALSE;
+  per_channel = FALSE;
+  long_video = FALSE;
+  video_gaps = FALSE;
+  video_overlaps = FALSE;
+  audio_nondiscont = FALSE;
+  audio_drift = FALSE;
+  early_video = FALSE;
+  late_video = FALSE;
+};
+
+static GstFlowReturn
+output_achain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
+{
+  GstClockTime timestamp;
+  guint8 b;
+  gboolean audio_jitter = audio_nondiscont || audio_drift || early_video;
+
+  timestamp = GST_BUFFER_TIMESTAMP (buffer);
+  if (!audio_jitter)
+    fail_unless_equals_int64 (timestamp,
+        (audio_buffer_count % n_abuffers) * 1 * GST_SECOND);
+  timestamp =
+      gst_segment_to_stream_time (&current_audio_segment, GST_FORMAT_TIME,
+      timestamp);
+  if (!audio_jitter)
+    fail_unless_equals_int64 (timestamp,
+        (audio_buffer_count % n_abuffers) * 1 * GST_SECOND);
+
+  timestamp = GST_BUFFER_TIMESTAMP (buffer);
+  timestamp =
+      gst_segment_to_running_time (&current_audio_segment, GST_FORMAT_TIME,
+      timestamp);
+  if (!audio_jitter)
+    fail_unless_equals_int64 (timestamp, audio_buffer_count * 1 * GST_SECOND);
+
+  gst_buffer_extract (buffer, 0, &b, 1);
+
+  if (per_channel) {
+    fail_unless_equals_int (b, fill_value_per_channel[0]);
+  } else {
+    fail_unless_equals_int (b, fill_value);
+  }
+
+  audio_buffer_count++;
+  gst_buffer_unref (buffer);
+  return GST_FLOW_OK;
+}
+
+static gboolean
+output_aevent (GstPad * pad, GstObject * parent, GstEvent * event)
+{
+  switch (GST_EVENT_TYPE (event)) {
+    case GST_EVENT_FLUSH_STOP:
+      gst_segment_init (&current_audio_segment, GST_FORMAT_UNDEFINED);
+      break;
+    case GST_EVENT_SEGMENT:
+      gst_event_copy_segment (event, &current_audio_segment);
+      break;
+    case GST_EVENT_EOS:
+      got_eos = TRUE;
+      break;
+    default:
+      break;
+  }
+
+  gst_event_unref (event);
+  return TRUE;
+}
+
+static GstFlowReturn
+output_vchain (GstPad * pad, GstObject * parent, GstBuffer * buffer)
+{
+  GstClockTime timestamp;
+  guint8 b;
+  gboolean jitter = video_gaps || video_overlaps || late_video;
+
+  timestamp = GST_BUFFER_TIMESTAMP (buffer);
+  if (!jitter)
+    fail_unless_equals_int64 (timestamp,
+        (video_buffer_count % n_vbuffers) * 25 * GST_MSECOND);
+  timestamp =
+      gst_segment_to_stream_time (&current_video_segment, GST_FORMAT_TIME,
+      timestamp);
+  if (!jitter)
+    fail_unless_equals_int64 (timestamp,
+        (video_buffer_count % n_vbuffers) * 25 * GST_MSECOND);
+
+  timestamp = GST_BUFFER_TIMESTAMP (buffer);
+  timestamp =
+      gst_segment_to_running_time (&current_video_segment, GST_FORMAT_TIME,
+      timestamp);
+  if (!jitter)
+    fail_unless_equals_int64 (timestamp, video_buffer_count * 25 * GST_MSECOND);
+
+  gst_buffer_extract (buffer, 0, &b, 1);
+  if (!jitter)
+    fail_unless_equals_int (b, video_buffer_count % n_vbuffers);
+
+  video_buffer_count++;
+  gst_buffer_unref (buffer);
+  return GST_FLOW_OK;
+}
+
+static gboolean
+output_vevent (GstPad * pad, GstObject * parent, GstEvent * event)
+{
+  switch (GST_EVENT_TYPE (event)) {
+    case GST_EVENT_FLUSH_STOP:
+      gst_segment_init (&current_video_segment, GST_FORMAT_UNDEFINED);
+      break;
+    case GST_EVENT_SEGMENT:
+      gst_event_copy_segment (event, &current_video_segment);
+      break;
+    case GST_EVENT_EOS:
+      got_eos = TRUE;
+      break;
+    default:
+      break;
+  }
+
+  gst_event_unref (event);
+  return TRUE;
+}
+
+static gpointer
+push_abuffers (gpointer data)
+{
+  GstSegment segment;
+  GstPad *pad = data;
+  gint i, j, k;
+  GstClockTime timestamp = 0;
+  GstAudioInfo info;
+  GstCaps *caps;
+  guint buf_size = 1000;
+
+  if (audiodelay)
+    g_usleep (2000);
+
+  if (early_video)
+    timestamp = 50 * GST_MSECOND;
+
+  gst_pad_send_event (pad, gst_event_new_stream_start ("test"));
+
+  gst_audio_info_set_format (&info, GST_AUDIO_FORMAT_S8, buf_size, channels,
+      NULL);
+  caps = gst_audio_info_to_caps (&info);
+  gst_pad_send_event (pad, gst_event_new_caps (caps));
+  gst_caps_unref (caps);
+
+  gst_segment_init (&segment, GST_FORMAT_TIME);
+  gst_pad_send_event (pad, gst_event_new_segment (&segment));
+
+  for (i = 0; i < n_abuffers; i++) {
+    GstBuffer *buf = gst_buffer_new_and_alloc (channels * buf_size);
+
+    if (per_channel) {
+      GstMapInfo map;
+      guint8 *in_data;
+
+      gst_buffer_map (buf, &map, GST_MAP_WRITE);
+      in_data = map.data;
+
+      for (j = 0; j < buf_size; j++) {
+        for (k = 0; k < channels; k++) {
+          in_data[j * channels + k] = fill_value_per_channel[k];
+        }
+      }
+
+      gst_buffer_unmap (buf, &map);
+    } else {
+      gst_buffer_memset (buf, 0, fill_value, channels * buf_size);
+    }
+
+    GST_BUFFER_TIMESTAMP (buf) = timestamp;
+    timestamp += 1 * GST_SECOND;
+    if (audio_drift)
+      timestamp += 50 * GST_MSECOND;
+    else if (i == 4 && audio_nondiscont)
+      timestamp += 30 * GST_MSECOND;
+    GST_BUFFER_DURATION (buf) = timestamp - GST_BUFFER_TIMESTAMP (buf);
+
+    fail_unless (gst_pad_chain (pad, buf) == GST_FLOW_OK);
+  }
+  gst_pad_send_event (pad, gst_event_new_eos ());
+
+  return NULL;
+}
+
+static gpointer
+push_vbuffers (gpointer data)
+{
+  GstSegment segment;
+  GstPad *pad = data;
+  gint i;
+  GstClockTime timestamp = 0;
+
+  if (videodelay)
+    g_usleep (2000);
+
+  if (late_video)
+    timestamp = 50 * GST_MSECOND;
+
+  gst_pad_send_event (pad, gst_event_new_stream_start ("test"));
+  gst_segment_init (&segment, GST_FORMAT_TIME);
+  gst_pad_send_event (pad, gst_event_new_segment (&segment));
+
+  for (i = 0; i < n_vbuffers; i++) {
+    GstBuffer *buf = gst_buffer_new_and_alloc (1000);
+    GstClockTime *rtime = g_new (GstClockTime, 1);
+
+    gst_buffer_memset (buf, 0, i, 1);
+
+    GST_BUFFER_TIMESTAMP (buf) = timestamp;
+    timestamp += 25 * GST_MSECOND;
+    GST_BUFFER_DURATION (buf) = timestamp - GST_BUFFER_TIMESTAMP (buf);
+    *rtime = gst_segment_to_running_time (&segment, GST_FORMAT_TIME, timestamp);
+    g_queue_push_tail (&v_timestamp_q, rtime);
+
+    if (i == 4) {
+      if (video_gaps)
+        timestamp += 10 * GST_MSECOND;
+      else if (video_overlaps)
+        timestamp -= 10 * GST_MSECOND;
+    }
+
+    fail_unless (gst_pad_chain (pad, buf) == GST_FLOW_OK);
+  }
+  gst_pad_send_event (pad, gst_event_new_eos ());
+
+  return NULL;
+}
+
+static GstBusSyncReply
+on_message (GstBus * bus, GstMessage * message, gpointer user_data)
+{
+  const GstStructure *s = gst_message_get_structure (message);
+  const gchar *name = gst_structure_get_name (s);
+  GValueArray *rms_arr;
+  const GValue *array_val;
+  const GValue *value;
+  gdouble rms;
+  gint channels2;
+  guint i;
+  GstClockTime *rtime = g_new (GstClockTime, 1);
+
+  if (message->type != GST_MESSAGE_ELEMENT
+      || strcmp (name, "videoframe-audiolevel") != 0)
+    goto done;
+
+  num_msgs++;
+  if (!gst_structure_get_clock_time (s, "running-time", rtime))
+    g_warning ("Could not parse running time");
+  else
+    g_queue_push_tail (&msg_timestamp_q, rtime);
+
+  /* the values are packed into GValueArrays with the value per channel */
+  array_val = gst_structure_get_value (s, "rms");
+  rms_arr = (GValueArray *) g_value_get_boxed (array_val);
+  channels2 = rms_arr->n_values;
+  fail_unless_equals_int (channels2, channels);
+
+  for (i = 0; i < channels; ++i) {
+    value = g_value_array_get_nth (rms_arr, i);
+    rms = g_value_get_double (value);
+    if (per_channel) {
+      fail_unless_equals_float (rms, expected_rms_per_channel[i]);
+    } else if (early_video && *rtime <= 50 * GST_MSECOND) {
+      fail_unless_equals_float (rms, 0);
+    } else {
+      fail_unless_equals_float (rms, expected_rms);
+    }
+  }
+
+done:
+  return GST_BUS_PASS;
+}
+
+static void
+test_videoframe_audiolevel_generic (void)
+{
+  GstElement *alevel;
+  GstPad *asink, *vsink, *asrc, *vsrc, *aoutput_sink, *voutput_sink;
+  GThread *athread, *vthread;
+  GstBus *bus;
+  guint i;
+
+  got_eos = FALSE;
+  audio_buffer_count = 0;
+  video_buffer_count = 0;
+  num_msgs = 0;
+
+  g_queue_init (&v_timestamp_q);
+  g_queue_init (&msg_timestamp_q);
+
+  alevel = gst_element_factory_make ("videoframe-audiolevel", NULL);
+  fail_unless (alevel != NULL);
+
+  bus = gst_bus_new ();
+  gst_element_set_bus (alevel, bus);
+  gst_bus_set_sync_handler (bus, on_message, NULL, NULL);
+
+  asink = gst_element_get_static_pad (alevel, "asink");
+  fail_unless (asink != NULL);
+
+  vsink = gst_element_get_static_pad (alevel, "vsink");
+  fail_unless (vsink != NULL);
+
+  asrc = gst_element_get_static_pad (alevel, "asrc");
+  aoutput_sink = gst_pad_new ("sink", GST_PAD_SINK);
+  fail_unless (aoutput_sink != NULL);
+  fail_unless (gst_pad_link (asrc, aoutput_sink) == GST_PAD_LINK_OK);
+
+  vsrc = gst_element_get_static_pad (alevel, "vsrc");
+  voutput_sink = gst_pad_new ("sink", GST_PAD_SINK);
+  fail_unless (voutput_sink != NULL);
+  fail_unless (gst_pad_link (vsrc, voutput_sink) == GST_PAD_LINK_OK);
+
+  gst_pad_set_chain_function (aoutput_sink, output_achain);
+  gst_pad_set_event_function (aoutput_sink, output_aevent);
+
+  gst_pad_set_chain_function (voutput_sink, output_vchain);
+  gst_pad_set_event_function (voutput_sink, output_vevent);
+
+  gst_pad_set_active (aoutput_sink, TRUE);
+  gst_pad_set_active (voutput_sink, TRUE);
+  fail_unless (gst_element_set_state (alevel,
+          GST_STATE_PLAYING) == GST_STATE_CHANGE_SUCCESS);
+
+  athread = g_thread_new ("athread", (GThreadFunc) push_abuffers, asink);
+  vthread = g_thread_new ("vthread", (GThreadFunc) push_vbuffers, vsink);
+
+  g_thread_join (vthread);
+  g_thread_join (athread);
+
+  fail_unless (got_eos);
+  fail_unless_equals_int (audio_buffer_count, n_abuffers);
+  fail_unless_equals_int (video_buffer_count, n_vbuffers);
+  if (!long_video)
+    fail_unless_equals_int (num_msgs, n_vbuffers);
+
+  fail_unless_equals_int (g_queue_get_length (&v_timestamp_q), n_vbuffers);
+  /* num_msgs is equal to n_vbuffers except in the case of long_video */
+  fail_unless_equals_int (g_queue_get_length (&msg_timestamp_q), num_msgs);
+
+  for (i = 0; i < g_queue_get_length (&msg_timestamp_q); i++) {
+    GstClockTime *vt = g_queue_pop_head (&v_timestamp_q);
+    GstClockTime *mt = g_queue_pop_head (&msg_timestamp_q);
+    fail_unless (vt != NULL);
+    fail_unless (mt != NULL);
+    if (!video_gaps && !video_overlaps && !early_video)
+      fail_unless_equals_uint64 (*vt, *mt);
+    g_free (vt);
+    g_free (mt);
+  }
+
+  /* teardown */
+  gst_element_set_state (alevel, GST_STATE_NULL);
+  gst_bus_set_flushing (bus, TRUE);
+  gst_object_unref (bus);
+  g_queue_foreach (&v_timestamp_q, (GFunc) g_free, NULL);
+  g_queue_foreach (&msg_timestamp_q, (GFunc) g_free, NULL);
+  g_queue_clear (&v_timestamp_q);
+  g_queue_clear (&msg_timestamp_q);
+  gst_pad_unlink (asrc, aoutput_sink);
+  gst_object_unref (asrc);
+  gst_pad_unlink (vsrc, voutput_sink);
+  gst_object_unref (vsrc);
+  gst_object_unref (asink);
+  gst_object_unref (vsink);
+  gst_pad_set_active (aoutput_sink, FALSE);
+  gst_object_unref (aoutput_sink);
+  gst_pad_set_active (voutput_sink, FALSE);
+  gst_object_unref (voutput_sink);
+  gst_object_unref (alevel);
+}
+
+GST_START_TEST (test_videoframe_audiolevel_16chan_1)
+{
+  set_default_params ();
+  channels = 16;
+  test_videoframe_audiolevel_generic ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_videoframe_audiolevel_8chan_1)
+{
+  set_default_params ();
+  channels = 8;
+  test_videoframe_audiolevel_generic ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_videoframe_audiolevel_2chan_1)
+{
+  set_default_params ();
+  test_videoframe_audiolevel_generic ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_videoframe_audiolevel_1chan_1)
+{
+  set_default_params ();
+  channels = 1;
+  test_videoframe_audiolevel_generic ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_videoframe_audiolevel_16chan_0)
+{
+  set_default_params ();
+  channels = 16;
+  expected_rms = 0;
+  fill_value = 0;
+  test_videoframe_audiolevel_generic ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_videoframe_audiolevel_8chan_0)
+{
+  set_default_params ();
+  channels = 8;
+  expected_rms = 0;
+  fill_value = 0;
+  test_videoframe_audiolevel_generic ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_videoframe_audiolevel_2chan_0)
+{
+  set_default_params ();
+  channels = 2;
+  expected_rms = 0;
+  fill_value = 0;
+  test_videoframe_audiolevel_generic ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_videoframe_audiolevel_1chan_0)
+{
+  set_default_params ();
+  channels = 1;
+  expected_rms = 0;
+  fill_value = 0;
+  test_videoframe_audiolevel_generic ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_videoframe_audiolevel_adelay)
+{
+  set_default_params ();
+  audiodelay = TRUE;
+  test_videoframe_audiolevel_generic ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_videoframe_audiolevel_vdelay)
+{
+  set_default_params ();
+  videodelay = TRUE;
+  test_videoframe_audiolevel_generic ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_videoframe_audiolevel_per_channel)
+{
+  set_default_params ();
+  per_channel = TRUE;
+  test_videoframe_audiolevel_generic ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_videoframe_audiolevel_long_video)
+{
+  set_default_params ();
+  n_abuffers = 6;
+  n_vbuffers = 255;
+  long_video = TRUE;
+  test_videoframe_audiolevel_generic ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_videoframe_audiolevel_video_gaps)
+{
+  set_default_params ();
+  video_gaps = TRUE;
+  test_videoframe_audiolevel_generic ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_videoframe_audiolevel_video_overlaps)
+{
+  set_default_params ();
+  video_overlaps = TRUE;
+  test_videoframe_audiolevel_generic ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_videoframe_audiolevel_audio_nondiscont)
+{
+  set_default_params ();
+  audio_nondiscont = TRUE;
+  test_videoframe_audiolevel_generic ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_videoframe_audiolevel_audio_drift)
+{
+  set_default_params ();
+  audio_drift = TRUE;
+  test_videoframe_audiolevel_generic ();
+}
+
+GST_END_TEST;
+GST_START_TEST (test_videoframe_audiolevel_early_video)
+{
+  set_default_params ();
+  early_video = TRUE;
+  test_videoframe_audiolevel_generic ();
+}
+
+GST_END_TEST;
+
+GST_START_TEST (test_videoframe_audiolevel_late_video)
+{
+  set_default_params ();
+  late_video = TRUE;
+  test_videoframe_audiolevel_generic ();
+}
+
+GST_END_TEST;
+
+
+static Suite *
+videoframe_audiolevel_suite (void)
+{
+  Suite *s = suite_create ("videoframe-audiolevel");
+  TCase *tc_chain;
+
+  tc_chain = tcase_create ("videoframe-audiolevel");
+  tcase_add_test (tc_chain, test_videoframe_audiolevel_16chan_1);
+  tcase_add_test (tc_chain, test_videoframe_audiolevel_8chan_1);
+  tcase_add_test (tc_chain, test_videoframe_audiolevel_2chan_1);
+  tcase_add_test (tc_chain, test_videoframe_audiolevel_1chan_1);
+  tcase_add_test (tc_chain, test_videoframe_audiolevel_16chan_0);
+  tcase_add_test (tc_chain, test_videoframe_audiolevel_8chan_0);
+  tcase_add_test (tc_chain, test_videoframe_audiolevel_2chan_0);
+  tcase_add_test (tc_chain, test_videoframe_audiolevel_1chan_0);
+  tcase_add_test (tc_chain, test_videoframe_audiolevel_adelay);
+  tcase_add_test (tc_chain, test_videoframe_audiolevel_vdelay);
+  tcase_add_test (tc_chain, test_videoframe_audiolevel_per_channel);
+  tcase_add_test (tc_chain, test_videoframe_audiolevel_long_video);
+  tcase_add_test (tc_chain, test_videoframe_audiolevel_video_gaps);
+  tcase_add_test (tc_chain, test_videoframe_audiolevel_video_overlaps);
+  tcase_add_test (tc_chain, test_videoframe_audiolevel_audio_nondiscont);
+  tcase_add_test (tc_chain, test_videoframe_audiolevel_audio_drift);
+  tcase_add_test (tc_chain, test_videoframe_audiolevel_early_video);
+  tcase_add_test (tc_chain, test_videoframe_audiolevel_late_video);
+  suite_add_tcase (s, tc_chain);
+
+  return s;
+}
+
+GST_CHECK_MAIN (videoframe_audiolevel);
diff --git a/tests/check/libs/aggregator.c b/tests/check/libs/aggregator.c
index b21c7cd..16355b9 100644
--- a/tests/check/libs/aggregator.c
+++ b/tests/check/libs/aggregator.c
@@ -344,7 +344,7 @@
       g_atomic_int_inc (&test->flush_stop_events);
   }
 
-  return GST_PAD_PROBE_DROP;
+  return GST_PAD_PROBE_HANDLED;
 }
 
 /*
@@ -723,6 +723,7 @@
 
   gst_segment_init (&GST_AGGREGATOR (test.aggregator)->segment,
       GST_FORMAT_TIME);
+
   /* now do a successful flushing seek */
   event = gst_event_new_seek (1, GST_FORMAT_TIME, GST_SEEK_FLAG_FLUSH,
       GST_SEEK_TYPE_SET, 0, GST_SEEK_TYPE_SET, 10 * GST_SECOND);
@@ -765,7 +766,7 @@
   gst_pad_push_event (data2.srcpad, gst_event_new_flush_stop (TRUE));
 
   /* and the last FLUSH_STOP is forwarded downstream */
-  fail_unless_equals_int (test.flush_start_events, 1);
+  fail_unless_equals_int (test.flush_stop_events, 1);
 
   /*  Check collected */
   gst_pad_add_probe (test.srcpad, GST_PAD_PROBE_TYPE_BUFFER,
diff --git a/tests/check/libs/gstglcolorconvert.c b/tests/check/libs/gstglcolorconvert.c
index 2a01263..f2be514 100644
--- a/tests/check/libs/gstglcolorconvert.c
+++ b/tests/check/libs/gstglcolorconvert.c
@@ -116,17 +116,20 @@
 static void
 check_conversion (TestFrame * frames, guint size)
 {
+  GstGLBaseMemoryAllocator *base_mem_alloc;
   gint i, j, k, l;
   gint ref_count = 0;
 
+  base_mem_alloc =
+      GST_GL_BASE_MEMORY_ALLOCATOR (gst_allocator_find
+      (GST_GL_MEMORY_ALLOCATOR_NAME));
+
   for (i = 0; i < size; i++) {
     GstBuffer *inbuf;
     GstVideoInfo in_info;
     gint in_width = frames[i].width;
     gint in_height = frames[i].height;
     GstVideoFormat in_v_format = frames[i].v_format;
-    gchar *in_data[GST_VIDEO_MAX_PLANES] = { 0 };
-    GstGLMemory *in_mem[GST_VIDEO_MAX_PLANES] = { 0 };
     GstVideoFrame in_frame;
     GstCaps *in_caps;
 
@@ -135,18 +138,22 @@
     gst_caps_set_features (in_caps, 0,
         gst_caps_features_from_string (GST_CAPS_FEATURE_MEMORY_GL_MEMORY));
 
-    for (j = 0; j < GST_VIDEO_INFO_N_PLANES (&in_info); j++) {
-      in_data[j] = frames[i].data[j];
-    }
-
     /* create GL buffer */
-    ref_count += GST_VIDEO_INFO_N_PLANES (&in_info);
     inbuf = gst_buffer_new ();
-    fail_unless (gst_gl_memory_setup_wrapped (context, &in_info, NULL,
-            (gpointer *) in_data, in_mem, &ref_count, _frame_unref));
-
     for (j = 0; j < GST_VIDEO_INFO_N_PLANES (&in_info); j++) {
-      gst_buffer_append_memory (inbuf, (GstMemory *) in_mem[j]);
+      GstGLVideoAllocationParams *params;
+      GstGLBaseMemory *mem;
+
+      ref_count++;
+      params = gst_gl_video_allocation_params_new_wrapped_data (context, NULL,
+          &in_info, j, NULL, GST_GL_TEXTURE_TARGET_2D, frames[i].data[j],
+          &ref_count, _frame_unref);
+
+      mem = gst_gl_base_memory_alloc (base_mem_alloc,
+          (GstGLAllocationParams *) params);
+      gst_buffer_append_memory (inbuf, GST_MEMORY_CAST (mem));
+
+      gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
     }
 
     fail_unless (gst_video_frame_map (&in_frame, &in_info, inbuf,
@@ -155,8 +162,8 @@
     /* sanity check that the correct values were wrapped */
     for (j = 0; j < GST_VIDEO_INFO_N_PLANES (&in_info); j++) {
       for (k = 0; k < _video_info_plane_size (&in_info, j); k++) {
-        if (in_data[j][k] != IGNORE_MAGIC)
-          fail_unless (((gchar *) in_frame.data[j])[k] == in_data[j][k]);
+        if (frames[i].data[j][k] != IGNORE_MAGIC)
+          fail_unless (((gchar *) in_frame.data[j])[k] == frames[i].data[j][k]);
       }
     }
 
@@ -214,6 +221,8 @@
 
     fail_unless_equals_int (ref_count, 0);
   }
+
+  gst_object_unref (base_mem_alloc);
 }
 
 GST_START_TEST (test_reorder_buffer)
@@ -232,7 +241,7 @@
 static Suite *
 gst_gl_color_convert_suite (void)
 {
-  Suite *s = suite_create ("GstGLUpload");
+  Suite *s = suite_create ("GstGLColorConvert");
   TCase *tc_chain = tcase_create ("upload");
 
   suite_add_tcase (s, tc_chain);
diff --git a/tests/check/libs/gstglcontext.c b/tests/check/libs/gstglcontext.c
index 8bb5f99..edbf9f9 100644
--- a/tests/check/libs/gstglcontext.c
+++ b/tests/check/libs/gstglcontext.c
@@ -28,29 +28,6 @@
 
 #include <stdio.h>
 
-#if GST_GL_HAVE_GLES2
-/* *INDENT-OFF* */
-static const gchar *vertex_shader_str_gles2 =
-      "attribute vec4 a_position;   \n"
-      "attribute vec2 a_texCoord;   \n"
-      "varying vec2 v_texCoord;     \n"
-      "void main()                  \n"
-      "{                            \n"
-      "   gl_Position = a_position; \n"
-      "   v_texCoord = a_texCoord;  \n"
-      "}                            \n";
-
-static const gchar *fragment_shader_str_gles2 =
-      "precision mediump float;                            \n"
-      "varying vec2 v_texCoord;                            \n"
-      "uniform sampler2D s_texture;                        \n"
-      "void main()                                         \n"
-      "{                                                   \n"
-      "  gl_FragColor = texture2D( s_texture, v_texCoord );\n"
-      "}                                                   \n";
-/* *INDENT-ON* */
-#endif
-
 static GstGLDisplay *display;
 
 static void
@@ -65,19 +42,27 @@
   gst_object_unref (display);
 }
 
-static GLuint fbo_id, rbo, tex;
+static GLuint vbo, vbo_indices, vao, fbo_id, rbo, tex;
 static GstGLFramebuffer *fbo;
-#if GST_GL_HAVE_GLES2
-static GError *error;
 static GstGLShader *shader;
 static GLint shader_attr_position_loc;
 static GLint shader_attr_texture_loc;
-#endif
+
+static const GLfloat vertices[] = {
+  /* x, y, z, s, t */
+  1.0f, 1.0f, 0.0f, 1.0f, 0.0f,
+  -1.0f, 1.0f, 0.0f, 0.0f, 0.0f,
+  -1.0f, -1.0f, 0.0f, 0.0f, 1.0f,
+  1.0f, -1.0f, 0.0f, 1.0f, 1.0f
+};
+
+static const GLushort indices[] = { 0, 1, 2, 0, 2, 3 };
 
 static void
 init (gpointer data)
 {
   GstGLContext *context = data;
+  GError *error = NULL;
 
   /* has to be called in the thread that is going to use the framebuffer */
   fbo = gst_gl_framebuffer_new (context);
@@ -88,25 +73,14 @@
   gst_gl_context_gen_texture (context, &tex, GST_VIDEO_FORMAT_RGBA, 320, 240);
   fail_if (tex == 0, "failed to create texture");
 
-#if GST_GL_HAVE_GLES2
-  if (gst_gl_context_get_gl_api (context) & GST_GL_API_GLES2) {
-    shader = gst_gl_shader_new (context);
-    fail_if (shader == NULL, "failed to create shader object");
+  shader = gst_gl_shader_new_default (context, &error);
+  fail_if (shader == NULL, "failed to create shader object: %s",
+      error->message);
 
-    gst_gl_shader_set_vertex_source (shader, vertex_shader_str_gles2);
-    gst_gl_shader_set_fragment_source (shader, fragment_shader_str_gles2);
-
-    error = NULL;
-    gst_gl_shader_compile (shader, &error);
-    fail_if (error != NULL, "Error compiling shader %s\n",
-        error ? error->message : "Unknown Error");
-
-    shader_attr_position_loc =
-        gst_gl_shader_get_attribute_location (shader, "a_position");
-    shader_attr_texture_loc =
-        gst_gl_shader_get_attribute_location (shader, "a_texCoord");
-  }
-#endif
+  shader_attr_position_loc =
+      gst_gl_shader_get_attribute_location (shader, "a_position");
+  shader_attr_texture_loc =
+      gst_gl_shader_get_attribute_location (shader, "a_texcoord");
 }
 
 static void
@@ -115,11 +89,10 @@
   GstGLContext *context = data;
   GstGLFuncs *gl = context->gl_vtable;
   gl->DeleteTextures (1, &tex);
+  if (vao)
+    gl->DeleteVertexArrays (1, &vao);
   gst_object_unref (fbo);
-#if GST_GL_HAVE_GLES2
-  if (gst_gl_context_get_gl_api (context) & GST_GL_API_GLES2)
-    gst_object_unref (shader);
-#endif
+  gst_object_unref (shader);
 }
 
 static void
@@ -145,86 +118,112 @@
 }
 
 static void
+_bind_buffer (GstGLContext * context)
+{
+  const GstGLFuncs *gl = context->gl_vtable;
+
+  gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, vbo_indices);
+  gl->BindBuffer (GL_ARRAY_BUFFER, vbo);
+
+  /* Load the vertex position */
+  gl->VertexAttribPointer (shader_attr_position_loc, 3, GL_FLOAT, GL_FALSE,
+      5 * sizeof (GLfloat), (void *) 0);
+
+  /* Load the texture coordinate */
+  gl->VertexAttribPointer (shader_attr_texture_loc, 2, GL_FLOAT, GL_FALSE,
+      5 * sizeof (GLfloat), (void *) (3 * sizeof (GLfloat)));
+
+  gl->EnableVertexAttribArray (shader_attr_position_loc);
+  gl->EnableVertexAttribArray (shader_attr_texture_loc);
+}
+
+static void
+_unbind_buffer (GstGLContext * context)
+{
+  const GstGLFuncs *gl = context->gl_vtable;
+
+  gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0);
+  gl->BindBuffer (GL_ARRAY_BUFFER, 0);
+
+  gl->DisableVertexAttribArray (shader_attr_position_loc);
+  gl->DisableVertexAttribArray (shader_attr_texture_loc);
+}
+
+static void
+init_blit (gpointer data)
+{
+  GstGLContext *context = data;
+  const GstGLFuncs *gl = context->gl_vtable;
+
+  if (!vbo) {
+    if (gl->GenVertexArrays) {
+      gl->GenVertexArrays (1, &vao);
+      gl->BindVertexArray (vao);
+    }
+
+    gl->GenBuffers (1, &vbo);
+    gl->BindBuffer (GL_ARRAY_BUFFER, vbo);
+    gl->BufferData (GL_ARRAY_BUFFER, 4 * 5 * sizeof (GLfloat), vertices,
+        GL_STATIC_DRAW);
+
+    gl->GenBuffers (1, &vbo_indices);
+    gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, vbo_indices);
+    gl->BufferData (GL_ELEMENT_ARRAY_BUFFER, sizeof (indices), indices,
+        GL_STATIC_DRAW);
+
+    if (gl->GenVertexArrays) {
+      _bind_buffer (context);
+      gl->BindVertexArray (0);
+    }
+
+    gl->BindBuffer (GL_ARRAY_BUFFER, 0);
+    gl->BindBuffer (GL_ELEMENT_ARRAY_BUFFER, 0);
+  }
+}
+
+static void
+deinit_blit (gpointer data)
+{
+  GstGLContext *context = data;
+  const GstGLFuncs *gl = context->gl_vtable;
+
+  if (vbo)
+    gl->DeleteBuffers (1, &vbo);
+  vbo = 0;
+  if (vbo_indices)
+    gl->DeleteBuffers (1, &vbo_indices);
+  vbo_indices = 0;
+  if (vao)
+    gl->DeleteVertexArrays (1, &vao);
+  vao = 0;
+}
+
+static void
 draw_render (gpointer data)
 {
   GstGLContext *context = data;
   GstGLContextClass *context_class = GST_GL_CONTEXT_GET_CLASS (context);
   const GstGLFuncs *gl = context->gl_vtable;
 
-  /* redraw the texture into the system provided framebuffer */
+  gl->Clear (GL_COLOR_BUFFER_BIT);
 
-#if GST_GL_HAVE_OPENGL
-  if (gst_gl_context_get_gl_api (context) & GST_GL_API_OPENGL) {
-    GLfloat verts[8] = { 1.0f, 1.0f,
-      -1.0f, 1.0f,
-      -1.0f, -1.0f,
-      1.0f, -1.0f
-    };
-    GLfloat texcoords[8] = { 1.0f, 0.0f,
-      0.0f, 0.0f,
-      0.0f, 1.0f,
-      1.0f, 1.0f
-    };
+  gst_gl_shader_use (shader);
 
-    gl->Viewport (0, 0, 320, 240);
+  gl->ActiveTexture (GL_TEXTURE0);
+  gl->BindTexture (GL_TEXTURE_2D, tex);
+  gst_gl_shader_set_uniform_1i (shader, "s_texture", 0);
 
-    gl->Clear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+  if (gl->GenVertexArrays)
+    gl->BindVertexArray (vao);
+  else
+    _bind_buffer (context);
 
-    gl->MatrixMode (GL_PROJECTION);
-    gl->LoadIdentity ();
+  gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0);
 
-    gl->ActiveTexture (GL_TEXTURE0);
-    gl->BindTexture (GL_TEXTURE_2D, tex);
-
-    gl->EnableClientState (GL_VERTEX_ARRAY);
-    gl->VertexPointer (2, GL_FLOAT, 0, &verts);
-
-    gl->ClientActiveTexture (GL_TEXTURE0);
-    gl->EnableClientState (GL_TEXTURE_COORD_ARRAY);
-    gl->TexCoordPointer (2, GL_FLOAT, 0, &texcoords);
-
-    gl->DrawArrays (GL_TRIANGLE_FAN, 0, 4);
-
-    gl->DisableClientState (GL_VERTEX_ARRAY);
-    gl->DisableClientState (GL_TEXTURE_COORD_ARRAY);
-  }
-#endif
-#if GST_GL_HAVE_GLES2
-  if (gst_gl_context_get_gl_api (context) & GST_GL_API_GLES2) {
-    const GLfloat vVertices[] = { 1.0f, 1.0f, 0.0f,
-      1.0f, 0.0f,
-      -1.0f, 1.0f, 0.0f,
-      0.0f, 0.0f,
-      -1.0f, -1.0f, 0.0f,
-      0.0f, 1.0f,
-      1.0f, -1.0f, 0.0f,
-      1.0f, 1.0f
-    };
-
-    GLushort indices[] = { 0, 1, 2, 0, 2, 3 };
-
-    gl->Clear (GL_COLOR_BUFFER_BIT);
-
-    gst_gl_shader_use (shader);
-
-    /* Load the vertex position */
-    gl->VertexAttribPointer (shader_attr_position_loc, 3,
-        GL_FLOAT, GL_FALSE, 5 * sizeof (GLfloat), vVertices);
-
-    /* Load the texture coordinate */
-    gl->VertexAttribPointer (shader_attr_texture_loc, 2,
-        GL_FLOAT, GL_FALSE, 5 * sizeof (GLfloat), &vVertices[3]);
-
-    gl->EnableVertexAttribArray (shader_attr_position_loc);
-    gl->EnableVertexAttribArray (shader_attr_texture_loc);
-
-    gl->ActiveTexture (GL_TEXTURE0);
-    gl->BindTexture (GL_TEXTURE_2D, tex);
-    gst_gl_shader_set_uniform_1i (shader, "s_texture", 0);
-
-    gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);
-  }
-#endif
+  if (gl->GenVertexArrays)
+    gl->BindVertexArray (0);
+  else
+    _unbind_buffer (context);
 
   context_class->swap_buffers (context);
 }
@@ -263,6 +262,7 @@
   gst_gl_window_draw (window);
 
   gst_gl_window_send_message (other_window, GST_GL_WINDOW_CB (init), context);
+  gst_gl_window_send_message (window, GST_GL_WINDOW_CB (init_blit), context);
 
   while (i < 10) {
     gst_gl_window_send_message (other_window, GST_GL_WINDOW_CB (draw_tex),
@@ -273,6 +273,7 @@
   }
 
   gst_gl_window_send_message (other_window, GST_GL_WINDOW_CB (deinit), context);
+  gst_gl_window_send_message (window, GST_GL_WINDOW_CB (deinit_blit), context);
 
   gst_object_unref (window);
   gst_object_unref (other_window);
@@ -314,6 +315,7 @@
   fail_if (!ret, "error received %s\n",
       error ? error->message : "Unknown error");
   fail_if (wrapped_context->gl_vtable->TexImage2D == NULL);
+  gst_gl_context_activate (wrapped_context, FALSE);
 }
 
 GST_START_TEST (test_wrapped_context)
@@ -365,6 +367,7 @@
   gst_gl_window_draw (window);
 
   gst_gl_window_send_message (other_window, GST_GL_WINDOW_CB (init), context);
+  gst_gl_window_send_message (window, GST_GL_WINDOW_CB (init_blit), context);
 
   while (i < 10) {
     gst_gl_window_send_message (other_window, GST_GL_WINDOW_CB (draw_tex),
@@ -378,6 +381,7 @@
       wrapped_context);
 
   gst_gl_window_send_message (other_window, GST_GL_WINDOW_CB (deinit), context);
+  gst_gl_window_send_message (window, GST_GL_WINDOW_CB (deinit_blit), context);
 
   gst_object_unref (other_context);
   gst_object_unref (other_window);
diff --git a/tests/check/libs/gstglmemory.c b/tests/check/libs/gstglmemory.c
index 238e2bb..7387e25 100644
--- a/tests/check/libs/gstglmemory.c
+++ b/tests/check/libs/gstglmemory.c
@@ -26,7 +26,7 @@
 
 #include <gst/check/gstcheck.h>
 
-#include <gst/gl/gstglmemory.h>
+#include <gst/gl/gl.h>
 
 #include <stdio.h>
 
@@ -39,7 +39,7 @@
   display = gst_gl_display_new ();
   context = gst_gl_context_new (display);
   gst_gl_context_create (context, 0, NULL);
-  gst_gl_memory_init ();
+  gst_gl_memory_init_once ();
 }
 
 static void
@@ -54,14 +54,16 @@
   GstMemory *mem, *mem2;
   GstGLMemory *gl_mem, *gl_mem2;
   GstAllocator *gl_allocator;
+  GstGLBaseMemoryAllocator *base_mem_alloc;
   gint i, j;
   static GstVideoFormat formats[] = {
     GST_VIDEO_FORMAT_RGBA, GST_VIDEO_FORMAT_RGB,
     GST_VIDEO_FORMAT_YUY2, GST_VIDEO_FORMAT_I420
   };
 
-  gl_allocator = gst_allocator_find (GST_GL_MEMORY_ALLOCATOR);
+  gl_allocator = gst_allocator_find (GST_GL_MEMORY_ALLOCATOR_NAME);
   fail_if (gl_allocator == NULL);
+  base_mem_alloc = GST_GL_BASE_MEMORY_ALLOCATOR (gl_allocator);
 
   /* test allocator creation */
   ASSERT_WARNING (mem = gst_allocator_alloc (gl_allocator, 0, NULL));
@@ -73,7 +75,13 @@
     gst_video_info_set_format (&v_info, formats[i], width, height);
 
     for (j = 0; j < GST_VIDEO_INFO_N_PLANES (&v_info); j++) {
-      mem = gst_gl_memory_alloc (context, NULL, &v_info, j, NULL);
+      GstGLVideoAllocationParams *params;
+
+      params = gst_gl_video_allocation_params_new (context, NULL, &v_info, j,
+          NULL, GST_GL_TEXTURE_TARGET_2D);
+
+      mem = (GstMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
+          (GstGLAllocationParams *) params);
       fail_if (mem == NULL);
       gl_mem = (GstGLMemory *) mem;
 
@@ -96,6 +104,7 @@
         printf ("%s\n", gst_gl_context_get_error ());
       fail_if (gst_gl_context_get_error () != NULL);
 
+      gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
       gst_memory_unref (mem);
       gst_memory_unref (mem2);
     }
@@ -111,52 +120,68 @@
   0xff, 0x00, 0x00, 0xff,
 };
 
-GST_START_TEST (test_transfer)
+static void
+test_transfer_allocator (const gchar * allocator_name)
 {
   GstAllocator *gl_allocator;
+  GstGLBaseMemoryAllocator *base_mem_alloc;
   GstVideoInfo v_info;
   GstMemory *mem, *mem2, *mem3;
   GstMapInfo map_info;
+  GstGLVideoAllocationParams *params;
 
-  gl_allocator = gst_allocator_find (GST_GL_MEMORY_ALLOCATOR);
+  gl_allocator = gst_allocator_find (allocator_name);
   fail_if (gl_allocator == NULL);
+  base_mem_alloc = GST_GL_BASE_MEMORY_ALLOCATOR (gl_allocator);
 
   gst_video_info_set_format (&v_info, GST_VIDEO_FORMAT_RGBA, 1, 1);
 
+  params = gst_gl_video_allocation_params_new (context, NULL, &v_info, 0,
+      NULL, GST_GL_TEXTURE_TARGET_2D);
+
   /* texture creation */
-  mem = (GstMemory *) gst_gl_memory_alloc (context, NULL, &v_info, 0, NULL);
+  mem = (GstMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
+      (GstGLAllocationParams *) params);
+  gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
-          GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
-          GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
 
   /* test wrapping raw data */
+  params = gst_gl_video_allocation_params_new_wrapped_data (context, NULL,
+      &v_info, 0, NULL, GST_GL_TEXTURE_TARGET_2D, rgba_pixel, NULL, NULL);
   mem2 =
-      (GstMemory *) gst_gl_memory_wrapped (context, &v_info, 0, NULL,
-      rgba_pixel, NULL, NULL);
+      (GstMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
+      (GstGLAllocationParams *) params);
+  gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
   fail_if (mem == NULL);
 
   fail_unless (GST_MEMORY_FLAG_IS_SET (mem2,
-          GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem2,
-          GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
 
   /* wrapped texture creation */
-  mem3 = (GstMemory *) gst_gl_memory_wrapped_texture (context,
-      ((GstGLMemory *) mem)->tex_id, GL_TEXTURE_2D, &v_info, 0, NULL, NULL,
-      NULL);
+  params = gst_gl_video_allocation_params_new_wrapped_texture (context, NULL,
+      &v_info, 0, NULL, GST_GL_TEXTURE_TARGET_2D, ((GstGLMemory *) mem)->tex_id,
+      NULL, NULL);
+  mem3 =
+      (GstMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
+      (GstGLAllocationParams *) params);
+  gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem3,
-          GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
   fail_unless (GST_MEMORY_FLAG_IS_SET (mem3,
-          GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
 
   /* check data/flags are correct */
   fail_unless (gst_memory_map (mem2, &map_info, GST_MAP_READ));
 
   fail_unless (GST_MEMORY_FLAG_IS_SET (mem2,
-          GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem2,
-          GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
 
   fail_unless (((gchar *) map_info.data)[0] == rgba_pixel[0]);
   fail_unless (((gchar *) map_info.data)[1] == rgba_pixel[1]);
@@ -166,32 +191,31 @@
   gst_memory_unmap (mem2, &map_info);
 
   fail_unless (GST_MEMORY_FLAG_IS_SET (mem2,
-          GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem2,
-          GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
 
   fail_unless (gst_memory_map (mem2, &map_info, GST_MAP_READ | GST_MAP_GL));
 
   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem2,
-          GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem2,
-          GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
 
   /* test texture copy */
-  fail_unless (gst_gl_memory_copy_into_texture ((GstGLMemory *) mem2,
-          ((GstGLMemory *) mem)->tex_id, GST_VIDEO_GL_TEXTURE_TYPE_RGBA, 1, 1,
-          4, FALSE));
-  GST_MINI_OBJECT_FLAG_SET (mem, GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD);
-  GST_GL_MEMORY_ADD_TRANSFER (mem, GST_GL_MEMORY_TRANSFER_NEED_DOWNLOAD);
+  fail_unless (gst_gl_memory_copy_into ((GstGLMemory *) mem2,
+          ((GstGLMemory *) mem)->tex_id, GST_GL_TEXTURE_TARGET_2D,
+          GST_VIDEO_GL_TEXTURE_TYPE_RGBA, 1, 1));
+  GST_MINI_OBJECT_FLAG_SET (mem, GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD);
 
   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem2,
-          GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem2,
-          GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
-          GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
   fail_unless (GST_MEMORY_FLAG_IS_SET (mem,
-          GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
 
   gst_memory_unmap (mem2, &map_info);
 
@@ -209,9 +233,9 @@
   fail_unless (gst_memory_map (mem3, &map_info, GST_MAP_READ));
 
   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
-          GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
-          GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
 
   fail_unless (((gchar *) map_info.data)[0] == rgba_pixel[0]);
   fail_unless (((gchar *) map_info.data)[1] == rgba_pixel[1]);
@@ -225,18 +249,18 @@
   gst_memory_unmap (mem3, &map_info);
 
   fail_unless (GST_MEMORY_FLAG_IS_SET (mem3,
-          GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem3,
-          GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
 
   /* test download flag */
   fail_unless (gst_memory_map (mem3, &map_info, GST_MAP_WRITE | GST_MAP_GL));
   gst_memory_unmap (mem3, &map_info);
 
   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem3,
-          GST_GL_BASE_BUFFER_FLAG_NEED_UPLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_UPLOAD));
   fail_unless (GST_MEMORY_FLAG_IS_SET (mem3,
-          GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
 
   if (gst_gl_context_get_error ())
     printf ("%s\n", gst_gl_context_get_error ());
@@ -248,31 +272,44 @@
   gst_object_unref (gl_allocator);
 }
 
+
+GST_START_TEST (test_transfer)
+{
+  test_transfer_allocator (GST_GL_MEMORY_ALLOCATOR_NAME);
+  test_transfer_allocator (GST_GL_MEMORY_PBO_ALLOCATOR_NAME);
+}
+
 GST_END_TEST;
 
 GST_START_TEST (test_separate_transfer)
 {
+  GstGLBaseMemoryAllocator *base_mem_alloc;
+  GstGLVideoAllocationParams *params;
   GstAllocator *gl_allocator;
   GstVideoInfo v_info;
   GstMemory *mem;
   GstMapInfo info;
 
-  gl_allocator = gst_allocator_find (GST_GL_MEMORY_ALLOCATOR);
+  gl_allocator = gst_allocator_find (GST_GL_MEMORY_PBO_ALLOCATOR_NAME);
   fail_if (gl_allocator == NULL);
+  base_mem_alloc = GST_GL_BASE_MEMORY_ALLOCATOR (gl_allocator);
 
   gst_video_info_set_format (&v_info, GST_VIDEO_FORMAT_RGBA, 1, 1);
 
+  params = gst_gl_video_allocation_params_new_wrapped_data (context, NULL,
+      &v_info, 0, NULL, GST_GL_TEXTURE_TARGET_2D, rgba_pixel, NULL, NULL);
   mem =
-      (GstMemory *) gst_gl_memory_wrapped (context, &v_info, 0, NULL,
-      rgba_pixel, NULL, NULL);
+      (GstMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
+      (GstGLAllocationParams *) params);
+  gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
   fail_if (mem == NULL);
   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
-          GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
 
-  gst_gl_memory_upload_transfer ((GstGLMemory *) mem);
+  gst_gl_memory_pbo_upload_transfer ((GstGLMemoryPBO *) mem);
 
   fail_unless (!GST_MEMORY_FLAG_IS_SET (mem,
-          GST_GL_BASE_BUFFER_FLAG_NEED_DOWNLOAD));
+          GST_GL_BASE_MEMORY_TRANSFER_NEED_DOWNLOAD));
 
   fail_unless (gst_memory_map (mem, &info, GST_MAP_READ));
 
diff --git a/tests/check/libs/gstglsl.c b/tests/check/libs/gstglsl.c
new file mode 100644
index 0000000..d7a7c0c
--- /dev/null
+++ b/tests/check/libs/gstglsl.c
@@ -0,0 +1,308 @@
+/* GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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/check/gstcheck.h>
+
+#include <gst/gl/gstglsl.h>
+
+#include <stdio.h>
+
+static void
+setup (void)
+{
+}
+
+static void
+teardown (void)
+{
+}
+
+/* *INDENT-OFF* */
+static const struct {GstGLSLVersion version; const gchar * name;} glsl_versions[] = {
+  {GST_GLSL_VERSION_100, "100"},
+  {GST_GLSL_VERSION_110, "110"},
+  {GST_GLSL_VERSION_120, "120"},
+  {GST_GLSL_VERSION_130, "130"},
+  {GST_GLSL_VERSION_140, "140"},
+  {GST_GLSL_VERSION_150, "150"},
+  {GST_GLSL_VERSION_300, "300"},
+  {GST_GLSL_VERSION_310, "310"},
+  {GST_GLSL_VERSION_320, "320"},
+  {GST_GLSL_VERSION_330, "330"},
+  {GST_GLSL_VERSION_400, "400"},
+  {GST_GLSL_VERSION_410, "410"},
+  {GST_GLSL_VERSION_420, "420"},
+  {GST_GLSL_VERSION_430, "430"},
+  {GST_GLSL_VERSION_440, "440"},
+  {GST_GLSL_VERSION_450, "450"},
+};
+
+static const struct {GstGLSLProfile profile; const gchar * name;} glsl_profiles[] = {
+  {GST_GLSL_PROFILE_ES, "es"},
+  {GST_GLSL_PROFILE_CORE, "core"},
+  {GST_GLSL_PROFILE_COMPATIBILITY, "compatibility"},
+};
+
+static const struct {GstGLSLVersion version; GstGLSLProfile profile; const gchar * name;} glsl_version_profiles[] = {
+  {GST_GLSL_VERSION_100, GST_GLSL_PROFILE_ES, "100"},
+  {GST_GLSL_VERSION_110, GST_GLSL_PROFILE_COMPATIBILITY, "110"},
+  {GST_GLSL_VERSION_120, GST_GLSL_PROFILE_COMPATIBILITY, "120"},
+  {GST_GLSL_VERSION_130, GST_GLSL_PROFILE_COMPATIBILITY, "130"},
+  {GST_GLSL_VERSION_140, GST_GLSL_PROFILE_COMPATIBILITY, "140"},
+  {GST_GLSL_VERSION_150, GST_GLSL_PROFILE_COMPATIBILITY, "150"},
+  {GST_GLSL_VERSION_300, GST_GLSL_PROFILE_ES, "300 es"},
+  {GST_GLSL_VERSION_310, GST_GLSL_PROFILE_ES, "310 es"},
+  {GST_GLSL_VERSION_320, GST_GLSL_PROFILE_ES, "320 es"},
+  {GST_GLSL_VERSION_330, GST_GLSL_PROFILE_CORE, "330 core"},
+  {GST_GLSL_VERSION_330, GST_GLSL_PROFILE_COMPATIBILITY, "330 compatibility"},
+  {GST_GLSL_VERSION_400, GST_GLSL_PROFILE_CORE, "400 core"},
+  {GST_GLSL_VERSION_400, GST_GLSL_PROFILE_COMPATIBILITY, "400 compatibility"},
+  {GST_GLSL_VERSION_410, GST_GLSL_PROFILE_CORE, "410 core"},
+  {GST_GLSL_VERSION_410, GST_GLSL_PROFILE_COMPATIBILITY, "410 compatibility"},
+  {GST_GLSL_VERSION_420, GST_GLSL_PROFILE_CORE, "420 core"},
+  {GST_GLSL_VERSION_420, GST_GLSL_PROFILE_COMPATIBILITY, "420 compatibility"},
+  {GST_GLSL_VERSION_430, GST_GLSL_PROFILE_CORE, "430 core"},
+  {GST_GLSL_VERSION_430, GST_GLSL_PROFILE_COMPATIBILITY, "430 compatibility"},
+  {GST_GLSL_VERSION_440, GST_GLSL_PROFILE_CORE, "440 core"},
+  {GST_GLSL_VERSION_440, GST_GLSL_PROFILE_COMPATIBILITY, "440 compatibility"},
+  {GST_GLSL_VERSION_450, GST_GLSL_PROFILE_CORE, "450 core"},
+  {GST_GLSL_VERSION_450, GST_GLSL_PROFILE_COMPATIBILITY, "450 compatibility"},
+};
+
+static const gchar * invalid_deserialize_glsl[] = {
+  "",
+  " \t\r\n",
+  "ael dja",
+  "es",
+  "core",
+  "compatibility",
+  "1000",
+  "100 es",
+  "100 core",
+  "100 compatibility",
+  "150 es",
+  "150 core",
+  "150 compatibility",
+  "300 core",
+  "300 compatibility",
+  "310 core",
+  "310 compatibility",
+  "320 core",
+  "320 compatibility",
+  "330 es",
+};
+
+static const struct {GstGLSLVersion version; GstGLSLProfile profile;} invalid_serialize_glsl[] = {
+  {GST_GLSL_VERSION_100, GST_GLSL_PROFILE_CORE},
+  {GST_GLSL_VERSION_100, GST_GLSL_PROFILE_COMPATIBILITY},
+  {GST_GLSL_VERSION_110, GST_GLSL_PROFILE_ES},
+  {GST_GLSL_VERSION_110, GST_GLSL_PROFILE_CORE},
+  {GST_GLSL_VERSION_120, GST_GLSL_PROFILE_ES},
+  {GST_GLSL_VERSION_120, GST_GLSL_PROFILE_CORE},
+  {GST_GLSL_VERSION_130, GST_GLSL_PROFILE_ES},
+  {GST_GLSL_VERSION_130, GST_GLSL_PROFILE_CORE},
+  {GST_GLSL_VERSION_140, GST_GLSL_PROFILE_ES},
+  {GST_GLSL_VERSION_140, GST_GLSL_PROFILE_CORE},
+  {GST_GLSL_VERSION_150, GST_GLSL_PROFILE_ES},
+  {GST_GLSL_VERSION_150, GST_GLSL_PROFILE_CORE},
+  {GST_GLSL_VERSION_300, GST_GLSL_PROFILE_NONE},
+  {GST_GLSL_VERSION_300, GST_GLSL_PROFILE_CORE},
+  {GST_GLSL_VERSION_300, GST_GLSL_PROFILE_COMPATIBILITY},
+  {GST_GLSL_VERSION_310, GST_GLSL_PROFILE_NONE},
+  {GST_GLSL_VERSION_310, GST_GLSL_PROFILE_CORE},
+  {GST_GLSL_VERSION_310, GST_GLSL_PROFILE_COMPATIBILITY},
+  {GST_GLSL_VERSION_320, GST_GLSL_PROFILE_NONE},
+  {GST_GLSL_VERSION_320, GST_GLSL_PROFILE_CORE},
+  {GST_GLSL_VERSION_320, GST_GLSL_PROFILE_COMPATIBILITY},
+  {GST_GLSL_VERSION_330, GST_GLSL_PROFILE_ES},
+  {GST_GLSL_VERSION_400, GST_GLSL_PROFILE_ES},
+  {GST_GLSL_VERSION_410, GST_GLSL_PROFILE_ES},
+  {GST_GLSL_VERSION_420, GST_GLSL_PROFILE_ES},
+  {GST_GLSL_VERSION_430, GST_GLSL_PROFILE_ES},
+  {GST_GLSL_VERSION_440, GST_GLSL_PROFILE_ES},
+  {GST_GLSL_VERSION_450, GST_GLSL_PROFILE_ES},
+};
+
+static const struct {const gchar *name; gboolean succeed; GstGLSLVersion version; GstGLSLProfile profile;} glsl_str_map[] = {
+  {"//#version 100\n", FALSE, GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_NONE},
+  {"/*\n#version 100*/\n", FALSE, GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_NONE},
+  {"/*\r#version 100*/", FALSE, GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_NONE},
+  {"#\rversion 100", FALSE, GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_NONE},
+  {"#\nversion 100", FALSE, GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_NONE},
+  {"\t#version 100", FALSE, GST_GLSL_VERSION_NONE, GST_GLSL_PROFILE_NONE},
+  {"//\r#version 100", TRUE, GST_GLSL_VERSION_100, GST_GLSL_PROFILE_ES},
+  {"//\n#version 100", TRUE, GST_GLSL_VERSION_100, GST_GLSL_PROFILE_ES},
+  {"# \tversion 100", TRUE, GST_GLSL_VERSION_100, GST_GLSL_PROFILE_ES},
+  {"\n#version 100", TRUE, GST_GLSL_VERSION_100, GST_GLSL_PROFILE_ES},
+  {"\r#version 100", TRUE, GST_GLSL_VERSION_100, GST_GLSL_PROFILE_ES},
+};
+/* *INDENT-ON* */
+
+GST_START_TEST (test_serialization)
+{
+  gint i;
+
+  /* versions */
+  for (i = 0; i < G_N_ELEMENTS (glsl_versions); i++) {
+    GstGLSLVersion version;
+    const gchar *version_s;
+
+    version_s = gst_glsl_version_to_string (glsl_versions[i].version);
+    fail_unless (g_strcmp0 (version_s, glsl_versions[i].name) == 0, "%s != %s",
+        version_s, glsl_versions[i].name);
+    version = gst_glsl_version_from_string (glsl_versions[i].name);
+    fail_unless (version == glsl_versions[i].version, "%s != %s",
+        gst_glsl_version_to_string (glsl_versions[i].version),
+        gst_glsl_version_to_string (version));
+  }
+
+  /* profiles */
+  for (i = 0; i < G_N_ELEMENTS (glsl_profiles); i++) {
+    GstGLSLProfile profile;
+    const gchar *profile_s;
+
+    profile_s = gst_glsl_profile_to_string (glsl_profiles[i].profile);
+    fail_unless (g_strcmp0 (profile_s, glsl_profiles[i].name) == 0, "%s != %s",
+        profile_s, glsl_profiles[i].name);
+    profile = gst_glsl_profile_from_string (glsl_profiles[i].name);
+    fail_unless (profile == glsl_profiles[i].profile, "%s != %s",
+        gst_glsl_profile_to_string (glsl_profiles[i].profile),
+        gst_glsl_profile_to_string (profile));
+  }
+
+  for (i = 0; i < G_N_ELEMENTS (glsl_version_profiles); i++) {
+    gchar *version_profile_s;
+    GstGLSLVersion version;
+    GstGLSLProfile profile;
+
+    version_profile_s =
+        gst_glsl_version_profile_to_string (glsl_version_profiles[i].version,
+        glsl_version_profiles[i].profile);
+    fail_unless (g_strcmp0 (version_profile_s,
+            glsl_version_profiles[i].name) == 0, "%s != %s", version_profile_s,
+        glsl_version_profiles[i].name);
+    fail_unless (gst_glsl_version_profile_from_string (glsl_version_profiles
+            [i].name, &version, &profile), "Failed to parse %s",
+        glsl_version_profiles[i].name);
+    fail_unless (profile == glsl_version_profiles[i].profile
+        && version == glsl_version_profiles[i].version, "%s != %s %s",
+        glsl_version_profiles[i].name, gst_glsl_version_to_string (version),
+        gst_glsl_profile_to_string (profile));
+    g_free (version_profile_s);
+  }
+
+  /* failures */
+  for (i = 0; i < G_N_ELEMENTS (invalid_deserialize_glsl); i++) {
+    GstGLSLVersion version;
+    GstGLSLProfile profile;
+
+    fail_if (gst_glsl_version_profile_from_string (invalid_deserialize_glsl[i],
+            &version, &profile),
+        "successfully deserialized %s into %s %s (should have failed)",
+        invalid_deserialize_glsl[i], gst_glsl_version_to_string (version),
+        gst_glsl_profile_to_string (profile));
+  }
+
+  /* failures */
+  for (i = 0; i < G_N_ELEMENTS (invalid_serialize_glsl); i++) {
+    gchar *version_profile_s;
+
+    version_profile_s =
+        gst_glsl_version_profile_to_string (invalid_serialize_glsl[i].version,
+        invalid_serialize_glsl[i].profile);
+
+    fail_if (version_profile_s != NULL,
+        "successfully serialized %s from %s %s (should have failed)",
+        version_profile_s,
+        gst_glsl_version_to_string (invalid_serialize_glsl[i].version),
+        gst_glsl_profile_to_string (invalid_serialize_glsl[i].profile));
+
+    g_free (version_profile_s);
+  }
+
+  /* map strings to version/profile */
+  for (i = 0; i < G_N_ELEMENTS (glsl_str_map); i++) {
+    GstGLSLVersion version;
+    GstGLSLProfile profile;
+
+    fail_unless (glsl_str_map[i].succeed ==
+        gst_glsl_string_get_version_profile (glsl_str_map[i].name, &version,
+            &profile), "Incorrect result for parsing \'%s\': %s",
+        glsl_str_map[i].name, glsl_str_map[i].succeed ? "false" : "true");
+    if (glsl_str_map[i].succeed) {
+      fail_unless (version == glsl_str_map[i].version, "With %s: %s != %s",
+          glsl_str_map[i].name,
+          gst_glsl_version_to_string (glsl_str_map[i].version),
+          gst_glsl_version_to_string (version));
+      fail_unless (profile == glsl_str_map[i].profile, "With %s: %s != %s",
+          glsl_str_map[i].name,
+          gst_glsl_profile_to_string (glsl_str_map[i].profile),
+          gst_glsl_profile_to_string (profile));
+    }
+  }
+
+  /* special ones */
+  {
+    GstGLSLVersion version;
+    GstGLSLProfile profile;
+    gchar *version_profile_s;
+
+    version_profile_s =
+        gst_glsl_version_profile_to_string (GST_GLSL_VERSION_100,
+        GST_GLSL_PROFILE_ES);
+    fail_unless (g_strcmp0 (version_profile_s, "100") == 0, "%s != 100",
+        version_profile_s);
+    g_free (version_profile_s);
+
+    version_profile_s =
+        gst_glsl_version_profile_to_string (GST_GLSL_VERSION_100,
+        GST_GLSL_PROFILE_NONE);
+    fail_unless (g_strcmp0 (version_profile_s, "100") == 0, "%s != 100",
+        version_profile_s);
+    g_free (version_profile_s);
+
+    fail_unless (gst_glsl_version_profile_from_string ("100", &version,
+            &profile));
+    fail_unless (version == GST_GLSL_VERSION_100
+        && profile == GST_GLSL_PROFILE_ES, "100 != %s %s",
+        gst_glsl_version_to_string (version),
+        gst_glsl_profile_to_string (profile));
+  }
+}
+
+GST_END_TEST;
+
+static Suite *
+gst_gl_upload_suite (void)
+{
+  Suite *s = suite_create ("GstGLSL");
+  TCase *tc_chain = tcase_create ("glsl");
+
+  suite_add_tcase (s, tc_chain);
+  tcase_add_checked_fixture (tc_chain, setup, teardown);
+  tcase_add_test (tc_chain, test_serialization);
+
+  return s;
+}
+
+GST_CHECK_MAIN (gst_gl_upload);
diff --git a/tests/check/libs/gstglupload.c b/tests/check/libs/gstglupload.c
index 11e2fe0..64d7a33 100644
--- a/tests/check/libs/gstglupload.c
+++ b/tests/check/libs/gstglupload.c
@@ -29,41 +29,14 @@
 
 #include <stdio.h>
 
-#if GST_GL_HAVE_GLES2
-/* *INDENT-OFF* */
-static const gchar *vertex_shader_str_gles2 =
-      "attribute vec4 a_position;   \n"
-      "attribute vec2 a_texCoord;   \n"
-      "varying vec2 v_texCoord;     \n"
-      "void main()                  \n"
-      "{                            \n"
-      "   gl_Position = a_position; \n"
-      "   v_texCoord = a_texCoord;  \n"
-      "}                            \n";
-
-static const gchar *fragment_shader_str_gles2 =
-      "precision mediump float;                            \n"
-      "varying vec2 v_texCoord;                            \n"
-      "uniform sampler2D s_texture;                        \n"
-      "void main()                                         \n"
-      "{                                                   \n"
-      "  gl_FragColor = texture2D( s_texture, v_texCoord );\n"
-      "}                                                   \n";
-/* *INDENT-ON* */
-#endif
-
 static GstGLDisplay *display;
 static GstGLContext *context;
 static GstGLWindow *window;
 static GstGLUpload *upload;
 static guint tex_id;
-#if GST_GL_HAVE_GLES2
-static GError *error;
 static GstGLShader *shader;
 static GLint shader_attr_position_loc;
 static GLint shader_attr_texture_loc;
-#endif
-
 
 #define FORMAT GST_VIDEO_GL_TEXTURE_TYPE_RGBA
 #define WIDTH 10
@@ -118,25 +91,15 @@
 static void
 init (gpointer data)
 {
-#if GST_GL_HAVE_GLES2
-  if (gst_gl_context_get_gl_api (context) & GST_GL_API_GLES2) {
-    shader = gst_gl_shader_new (context);
-    fail_if (shader == NULL, "failed to create shader object");
+  GError *error = NULL;
 
-    gst_gl_shader_set_vertex_source (shader, vertex_shader_str_gles2);
-    gst_gl_shader_set_fragment_source (shader, fragment_shader_str_gles2);
+  shader = gst_gl_shader_new_default (context, &error);
+  fail_if (shader == NULL, "failed to create shader object %s", error->message);
 
-    error = NULL;
-    gst_gl_shader_compile (shader, &error);
-    fail_if (error != NULL, "Error compiling shader %s\n",
-        error ? error->message : "Unknown Error");
-
-    shader_attr_position_loc =
-        gst_gl_shader_get_attribute_location (shader, "a_position");
-    shader_attr_texture_loc =
-        gst_gl_shader_get_attribute_location (shader, "a_texCoord");
-  }
-#endif
+  shader_attr_position_loc =
+      gst_gl_shader_get_attribute_location (shader, "a_position");
+  shader_attr_texture_loc =
+      gst_gl_shader_get_attribute_location (shader, "a_texCoord");
 }
 
 static void
@@ -145,81 +108,38 @@
   GstGLContext *context = data;
   GstGLContextClass *context_class = GST_GL_CONTEXT_GET_CLASS (context);
   const GstGLFuncs *gl = context->gl_vtable;
+  const GLfloat vVertices[] = { 1.0f, 1.0f, 0.0f,
+    1.0f, 0.0f,
+    -1.0f, 1.0f, 0.0f,
+    0.0f, 0.0f,
+    -1.0f, -1.0f, 0.0f,
+    0.0f, 1.0f,
+    1.0f, -1.0f, 0.0f,
+    1.0f, 1.0f
+  };
 
-  /* redraw the texture into the system provided framebuffer */
+  GLushort indices[] = { 0, 1, 2, 0, 2, 3 };
 
-#if GST_GL_HAVE_OPENGL
-  if (gst_gl_context_get_gl_api (context) & GST_GL_API_OPENGL) {
-    GLfloat verts[8] = { 1.0f, 1.0f,
-      -1.0f, 1.0f,
-      -1.0f, -1.0f,
-      1.0f, -1.0f
-    };
-    GLfloat texcoords[8] = { 1.0f, 0.0f,
-      0.0f, 0.0f,
-      0.0f, 1.0f,
-      1.0f, 1.0f
-    };
+  gl->Clear (GL_COLOR_BUFFER_BIT);
 
-    gl->Viewport (0, 0, 10, 10);
+  gst_gl_shader_use (shader);
 
-    gl->Clear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+  /* Load the vertex position */
+  gl->VertexAttribPointer (shader_attr_position_loc, 3,
+      GL_FLOAT, GL_FALSE, 5 * sizeof (GLfloat), vVertices);
 
-    gl->MatrixMode (GL_PROJECTION);
-    gl->LoadIdentity ();
+  /* Load the texture coordinate */
+  gl->VertexAttribPointer (shader_attr_texture_loc, 2,
+      GL_FLOAT, GL_FALSE, 5 * sizeof (GLfloat), &vVertices[3]);
 
-    gl->ActiveTexture (GL_TEXTURE_2D);
-    gl->BindTexture (GL_TEXTURE_2D, tex_id);
+  gl->EnableVertexAttribArray (shader_attr_position_loc);
+  gl->EnableVertexAttribArray (shader_attr_texture_loc);
 
-    gl->EnableClientState (GL_VERTEX_ARRAY);
-    gl->VertexPointer (2, GL_FLOAT, 0, &verts);
+  gl->ActiveTexture (GL_TEXTURE0);
+  gl->BindTexture (GL_TEXTURE_2D, tex_id);
+  gst_gl_shader_set_uniform_1i (shader, "s_texture", 0);
 
-    gl->ClientActiveTexture (GL_TEXTURE0);
-    gl->EnableClientState (GL_TEXTURE_COORD_ARRAY);
-    gl->TexCoordPointer (2, GL_FLOAT, 0, &texcoords);
-
-    gl->DrawArrays (GL_TRIANGLE_FAN, 0, 4);
-
-    gl->DisableClientState (GL_VERTEX_ARRAY);
-    gl->DisableClientState (GL_TEXTURE_COORD_ARRAY);
-  }
-#endif
-#if GST_GL_HAVE_GLES2
-  if (gst_gl_context_get_gl_api (context) & GST_GL_API_GLES2) {
-    const GLfloat vVertices[] = { 1.0f, 1.0f, 0.0f,
-      1.0f, 0.0f,
-      -1.0f, 1.0f, 0.0f,
-      0.0f, 0.0f,
-      -1.0f, -1.0f, 0.0f,
-      0.0f, 1.0f,
-      1.0f, -1.0f, 0.0f,
-      1.0f, 1.0f
-    };
-
-    GLushort indices[] = { 0, 1, 2, 0, 2, 3 };
-
-    gl->Clear (GL_COLOR_BUFFER_BIT);
-
-    gst_gl_shader_use (shader);
-
-    /* Load the vertex position */
-    gl->VertexAttribPointer (shader_attr_position_loc, 3,
-        GL_FLOAT, GL_FALSE, 5 * sizeof (GLfloat), vVertices);
-
-    /* Load the texture coordinate */
-    gl->VertexAttribPointer (shader_attr_texture_loc, 2,
-        GL_FLOAT, GL_FALSE, 5 * sizeof (GLfloat), &vVertices[3]);
-
-    gl->EnableVertexAttribArray (shader_attr_position_loc);
-    gl->EnableVertexAttribArray (shader_attr_texture_loc);
-
-    gl->ActiveTexture (GL_TEXTURE0);
-    gl->BindTexture (GL_TEXTURE_2D, tex_id);
-    gst_gl_shader_set_uniform_1i (shader, "s_texture", 0);
-
-    gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);
-  }
-#endif
+  gl->DrawElements (GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, indices);
 
   context_class->swap_buffers (context);
 }
@@ -265,6 +185,8 @@
     i++;
   }
 
+  gst_caps_unref (in_caps);
+  gst_caps_unref (out_caps);
   gst_buffer_unref (inbuf);
   gst_buffer_unref (outbuf);
 }
@@ -273,6 +195,8 @@
 
 GST_START_TEST (test_upload_buffer)
 {
+  GstGLBaseMemoryAllocator *base_mem_alloc;
+  GstGLVideoAllocationParams *params;
   GstBuffer *buffer, *outbuf;
   GstGLMemory *gl_mem;
   GstCaps *in_caps, *out_caps;
@@ -281,13 +205,20 @@
   gint i = 0;
   gboolean res;
 
+  base_mem_alloc =
+      GST_GL_BASE_MEMORY_ALLOCATOR (gst_allocator_find
+      (GST_GL_MEMORY_ALLOCATOR_NAME));
+
   in_caps = gst_caps_from_string ("video/x-raw,format=RGBA,width=10,height=10");
   gst_video_info_from_caps (&in_info, in_caps);
 
   /* create GL buffer */
   buffer = gst_buffer_new ();
-  gl_mem =
-      gst_gl_memory_wrapped (context, &in_info, 0, NULL, rgba_data, NULL, NULL);
+  params = gst_gl_video_allocation_params_new_wrapped_data (context, NULL,
+      &in_info, 0, NULL, GST_GL_TEXTURE_TARGET_2D, rgba_data, NULL, NULL);
+  gl_mem = (GstGLMemory *) gst_gl_base_memory_alloc (base_mem_alloc,
+      (GstGLAllocationParams *) params);
+  gst_gl_allocation_params_free ((GstGLAllocationParams *) params);
 
   res =
       gst_memory_map ((GstMemory *) gl_mem, &map_info,
@@ -318,64 +249,11 @@
     i++;
   }
 
-  gst_gl_upload_release_buffer (upload);
+  gst_caps_unref (in_caps);
+  gst_caps_unref (out_caps);
   gst_buffer_unref (buffer);
   gst_buffer_unref (outbuf);
-}
-
-GST_END_TEST;
-
-GST_START_TEST (test_upload_meta_producer)
-{
-  GstBuffer *buffer;
-  GstGLMemory *gl_mem;
-  GstVideoInfo in_info;
-  GstVideoGLTextureUploadMeta *gl_upload_meta;
-  guint tex_ids[] = { 0, 0, 0, 0 };
-  GstGLUploadMeta *upload_meta;
-  gboolean res;
-  gint i = 0;
-
-  gst_video_info_set_format (&in_info, GST_VIDEO_FORMAT_RGBA, WIDTH, HEIGHT);
-
-  /* create GL buffer */
-  buffer = gst_buffer_new ();
-  gl_mem =
-      gst_gl_memory_wrapped (context, &in_info, 0, NULL, rgba_data, NULL, NULL);
-  gst_buffer_append_memory (buffer, (GstMemory *) gl_mem);
-
-  gst_gl_context_gen_texture (context, &tex_ids[0], GST_VIDEO_FORMAT_RGBA,
-      WIDTH, HEIGHT);
-
-  upload_meta = gst_gl_upload_meta_new (context);
-  gst_gl_upload_meta_set_format (upload_meta, &in_info);
-
-  gst_buffer_add_video_meta_full (buffer, 0, GST_VIDEO_FORMAT_RGBA, WIDTH,
-      HEIGHT, 1, in_info.offset, in_info.stride);
-  gst_gl_upload_meta_add_to_buffer (upload_meta, buffer);
-
-  gl_upload_meta = gst_buffer_get_video_gl_texture_upload_meta (buffer);
-  fail_if (gl_upload_meta == NULL, "Failed to add GstVideoGLTextureUploadMeta"
-      " to buffer\n");
-
-  res = gst_video_gl_texture_upload_meta_upload (gl_upload_meta, tex_ids);
-  fail_if (res == FALSE, "Failed to upload GstVideoGLTextureUploadMeta\n");
-
-  tex_id = tex_ids[0];
-
-  gst_gl_window_set_preferred_size (window, WIDTH, HEIGHT);
-  gst_gl_window_draw (window);
-  gst_gl_window_send_message (window, GST_GL_WINDOW_CB (init), context);
-
-  while (i < 2) {
-    gst_gl_window_send_message (window, GST_GL_WINDOW_CB (draw_render),
-        context);
-    i++;
-  }
-
-  gst_object_unref (upload_meta);
-  gst_gl_context_del_texture (context, &tex_ids[0]);
-  gst_buffer_unref (buffer);
+  gst_object_unref (base_mem_alloc);
 }
 
 GST_END_TEST;
@@ -391,7 +269,6 @@
   tcase_add_checked_fixture (tc_chain, setup, teardown);
   tcase_add_test (tc_chain, test_upload_data);
   tcase_add_test (tc_chain, test_upload_buffer);
-  tcase_add_test (tc_chain, test_upload_meta_producer);
 
   return s;
 }
diff --git a/tests/check/libs/player.c b/tests/check/libs/player.c
new file mode 100644
index 0000000..0f7a63c
--- /dev/null
+++ b/tests/check/libs/player.c
@@ -0,0 +1,1499 @@
+/* GStreamer
+ *
+ * Copyright (C) 2014-2015 Sebastian Dröge <sebastian@centricular.com>
+ * Copyright (C) 2015 Brijesh Singh <brijesh.ksingh@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.
+ */
+
+/* TODO:
+ * - start with pause, go to playing
+ * - play, pause, play
+ * - set uri in play/pause
+ * - play/pause after eos
+ * - seek in play/pause/stopped, after eos, back to 0, after duration
+ * - http buffering
+ */
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#ifdef HAVE_VALGRIND
+# include <valgrind/valgrind.h>
+#endif
+
+#include <gst/check/gstcheck.h>
+
+#define fail_unless_equals_int(a, b)                                    \
+G_STMT_START {                                                          \
+  int first = a;                                                        \
+  int second = b;                                                       \
+  fail_unless(first == second,                                          \
+    "'" #a "' (%d) is not equal to '" #b"' (%d)", first, second);       \
+} G_STMT_END;
+
+#define fail_unless_equals_uint64(a, b)                                 \
+G_STMT_START {                                                          \
+  guint64 first = a;                                                    \
+  guint64 second = b;                                                   \
+  fail_unless(first == second,                                          \
+    "'" #a "' (%" G_GUINT64_FORMAT ") is not equal to '" #b"' (%"       \
+    G_GUINT64_FORMAT ")", first, second);                               \
+} G_STMT_END;
+
+#define fail_unless_equals_double(a, b)                                 \
+G_STMT_START {                                                          \
+  double first = a;                                                     \
+  double second = b;                                                    \
+  fail_unless(first == second,                                          \
+    "'" #a "' (%lf) is not equal to '" #b"' (%lf)", first, second);     \
+} G_STMT_END;
+
+#include <gst/player/player.h>
+
+START_TEST (test_create_and_free)
+{
+  GstPlayer *player;
+
+  player = gst_player_new ();
+  fail_unless (player != NULL);
+  g_object_unref (player);
+}
+
+END_TEST;
+
+START_TEST (test_set_and_get_uri)
+{
+  GstPlayer *player;
+  gchar *uri;
+
+  player = gst_player_new ();
+
+  fail_unless (player != NULL);
+
+  gst_player_set_uri (player, "file:///path/to/a/file");
+  uri = gst_player_get_uri (player);
+
+  fail_unless (g_strcmp0 (uri, "file:///path/to/a/file") == 0);
+
+  g_free (uri);
+  g_object_unref (player);
+}
+
+END_TEST;
+
+START_TEST (test_set_and_get_position_update_interval)
+{
+  GstPlayer *player;
+  guint interval = 0;
+
+  player = gst_player_new ();
+
+  fail_unless (player != NULL);
+
+  gst_player_set_position_update_interval (player, 500);
+  interval = gst_player_get_position_update_interval (player);
+
+  fail_unless (interval == 500);
+
+  g_object_set (player, "position-update-interval", 1000, NULL);
+  g_object_get (player, "position-update-interval", &interval, NULL);
+
+  fail_unless_equals_int (interval, 1000);
+
+  g_object_unref (player);
+}
+
+END_TEST;
+
+typedef enum
+{
+  STATE_CHANGE_BUFFERING,
+  STATE_CHANGE_DURATION_CHANGED,
+  STATE_CHANGE_END_OF_STREAM,
+  STATE_CHANGE_ERROR,
+  STATE_CHANGE_WARNING,
+  STATE_CHANGE_POSITION_UPDATED,
+  STATE_CHANGE_STATE_CHANGED,
+  STATE_CHANGE_VIDEO_DIMENSIONS_CHANGED,
+  STATE_CHANGE_MEDIA_INFO_UPDATED,
+  STATE_CHANGE_SEEK_DONE,
+} TestPlayerStateChange;
+
+static const gchar *
+test_player_state_change_get_name (TestPlayerStateChange change)
+{
+  switch (change) {
+    case STATE_CHANGE_BUFFERING:
+      return "buffering";
+    case STATE_CHANGE_DURATION_CHANGED:
+      return "duration-changed";
+    case STATE_CHANGE_END_OF_STREAM:
+      return "end-of-stream";
+    case STATE_CHANGE_WARNING:
+      return "warning";
+    case STATE_CHANGE_ERROR:
+      return "error";
+    case STATE_CHANGE_POSITION_UPDATED:
+      return "position-updated";
+    case STATE_CHANGE_STATE_CHANGED:
+      return "state-changed";
+    case STATE_CHANGE_VIDEO_DIMENSIONS_CHANGED:
+      return "video-dimensions-changed";
+    case STATE_CHANGE_MEDIA_INFO_UPDATED:
+      return "media-info-updated";
+    case STATE_CHANGE_SEEK_DONE:
+      return "seek-done";
+    default:
+      g_assert_not_reached ();
+      break;
+  }
+}
+
+typedef struct _TestPlayerState TestPlayerState;
+struct _TestPlayerState
+{
+  GMainLoop *loop;
+
+  gint buffering_percent;
+  guint64 position, duration, seek_done_position;
+  gboolean end_of_stream, error, warning, seek_done;
+  GstPlayerState state;
+  gint width, height;
+  GstPlayerMediaInfo *media_info;
+
+  void (*test_callback) (GstPlayer * player, TestPlayerStateChange change,
+      TestPlayerState * old_state, TestPlayerState * new_state);
+  gpointer test_data;
+};
+
+static void
+test_player_state_change_debug (GstPlayer * player,
+    TestPlayerStateChange change, TestPlayerState * old_state,
+    TestPlayerState * new_state)
+{
+  GST_DEBUG_OBJECT (player, "Changed %s:\n"
+      "\tbuffering %d%% -> %d%%\n"
+      "\tposition %" GST_TIME_FORMAT " -> %" GST_TIME_FORMAT "\n"
+      "\tduration %" GST_TIME_FORMAT " -> %" GST_TIME_FORMAT "\n"
+      "\tseek position %" GST_TIME_FORMAT " -> %" GST_TIME_FORMAT "\n"
+      "\tend-of-stream %d -> %d\n"
+      "\terror %d -> %d\n"
+      "\tseek_done %d -> %d\n"
+      "\tstate %s -> %s\n"
+      "\twidth/height %d/%d -> %d/%d\n"
+      "\tmedia_info %p -> %p",
+      test_player_state_change_get_name (change),
+      old_state->buffering_percent, new_state->buffering_percent,
+      GST_TIME_ARGS (old_state->position), GST_TIME_ARGS (new_state->position),
+      GST_TIME_ARGS (old_state->duration), GST_TIME_ARGS (new_state->duration),
+      GST_TIME_ARGS (old_state->seek_done_position),
+      GST_TIME_ARGS (new_state->seek_done_position), old_state->end_of_stream,
+      new_state->end_of_stream, old_state->error, new_state->error,
+      old_state->seek_done, new_state->seek_done,
+      gst_player_state_get_name (old_state->state),
+      gst_player_state_get_name (new_state->state), old_state->width,
+      old_state->height, new_state->width, new_state->height,
+      old_state->media_info, new_state->media_info);
+}
+
+static void
+test_player_state_reset (TestPlayerState * state)
+{
+  state->buffering_percent = 100;
+  state->position = state->duration = state->seek_done_position = -1;
+  state->end_of_stream = state->error = state->seek_done = FALSE;
+  state->state = GST_PLAYER_STATE_STOPPED;
+  state->width = state->height = 0;
+  state->media_info = NULL;
+}
+
+static void
+buffering_cb (GstPlayer * player, gint percent, TestPlayerState * state)
+{
+  TestPlayerState old_state = *state;
+
+  state->buffering_percent = percent;
+  test_player_state_change_debug (player, STATE_CHANGE_BUFFERING, &old_state,
+      state);
+  state->test_callback (player, STATE_CHANGE_BUFFERING, &old_state, state);
+}
+
+static void
+duration_changed_cb (GstPlayer * player, guint64 duration,
+    TestPlayerState * state)
+{
+  TestPlayerState old_state = *state;
+
+  state->duration = duration;
+  test_player_state_change_debug (player, STATE_CHANGE_DURATION_CHANGED,
+      &old_state, state);
+  state->test_callback (player, STATE_CHANGE_DURATION_CHANGED, &old_state,
+      state);
+}
+
+static void
+end_of_stream_cb (GstPlayer * player, TestPlayerState * state)
+{
+  TestPlayerState old_state = *state;
+
+  state->end_of_stream = TRUE;
+  test_player_state_change_debug (player, STATE_CHANGE_END_OF_STREAM,
+      &old_state, state);
+  state->test_callback (player, STATE_CHANGE_END_OF_STREAM, &old_state, state);
+}
+
+static void
+error_cb (GstPlayer * player, GError * error, TestPlayerState * state)
+{
+  TestPlayerState old_state = *state;
+
+  state->error = TRUE;
+  test_player_state_change_debug (player, STATE_CHANGE_ERROR, &old_state,
+      state);
+  state->test_callback (player, STATE_CHANGE_ERROR, &old_state, state);
+}
+
+static void
+warning_cb (GstPlayer * player, GError * error, TestPlayerState * state)
+{
+  TestPlayerState old_state = *state;
+
+  state->warning = TRUE;
+  test_player_state_change_debug (player, STATE_CHANGE_WARNING, &old_state,
+      state);
+  state->test_callback (player, STATE_CHANGE_WARNING, &old_state, state);
+}
+
+static void
+position_updated_cb (GstPlayer * player, guint64 position,
+    TestPlayerState * state)
+{
+  TestPlayerState old_state = *state;
+
+  state->position = position;
+  test_player_state_change_debug (player, STATE_CHANGE_POSITION_UPDATED,
+      &old_state, state);
+  state->test_callback (player, STATE_CHANGE_POSITION_UPDATED, &old_state,
+      state);
+}
+
+static void
+media_info_updated_cb (GstPlayer * player, GstPlayerMediaInfo * media_info,
+    TestPlayerState * state)
+{
+  TestPlayerState old_state = *state;
+
+  state->media_info = media_info;
+
+  test_player_state_change_debug (player, STATE_CHANGE_MEDIA_INFO_UPDATED,
+      &old_state, state);
+  state->test_callback (player, STATE_CHANGE_MEDIA_INFO_UPDATED, &old_state,
+      state);
+}
+
+static void
+state_changed_cb (GstPlayer * player, GstPlayerState player_state,
+    TestPlayerState * state)
+{
+  TestPlayerState old_state = *state;
+
+  state->state = player_state;
+
+  if (player_state == GST_PLAYER_STATE_STOPPED)
+    test_player_state_reset (state);
+
+  test_player_state_change_debug (player, STATE_CHANGE_STATE_CHANGED,
+      &old_state, state);
+  state->test_callback (player, STATE_CHANGE_STATE_CHANGED, &old_state, state);
+}
+
+static void
+video_dimensions_changed_cb (GstPlayer * player, gint width, gint height,
+    TestPlayerState * state)
+{
+  TestPlayerState old_state = *state;
+
+  state->width = width;
+  state->height = height;
+  test_player_state_change_debug (player, STATE_CHANGE_VIDEO_DIMENSIONS_CHANGED,
+      &old_state, state);
+  state->test_callback (player, STATE_CHANGE_VIDEO_DIMENSIONS_CHANGED,
+      &old_state, state);
+}
+
+static void
+seek_done_cb (GstPlayer * player, guint64 position, TestPlayerState * state)
+{
+  TestPlayerState old_state = *state;
+
+  state->seek_done = TRUE;
+  state->seek_done_position = position;
+  test_player_state_change_debug (player, STATE_CHANGE_SEEK_DONE,
+      &old_state, state);
+  state->test_callback (player, STATE_CHANGE_SEEK_DONE, &old_state, state);
+}
+
+static GstPlayer *
+test_player_new (TestPlayerState * state)
+{
+  GstPlayer *player;
+  GstElement *playbin, *fakesink;
+
+  player =
+      gst_player_new_full (NULL,
+      gst_player_g_main_context_signal_dispatcher_new (NULL));
+  fail_unless (player != NULL);
+
+  test_player_state_reset (state);
+
+  playbin = gst_player_get_pipeline (player);
+  fakesink = gst_element_factory_make ("fakesink", "audio-sink");
+  g_object_set (fakesink, "sync", TRUE, NULL);
+  g_object_set (playbin, "audio-sink", fakesink, NULL);
+  fakesink = gst_element_factory_make ("fakesink", "video-sink");
+  g_object_set (fakesink, "sync", TRUE, NULL);
+  g_object_set (playbin, "video-sink", fakesink, NULL);
+  gst_object_unref (playbin);
+
+  g_signal_connect (player, "buffering", G_CALLBACK (buffering_cb), state);
+  g_signal_connect (player, "duration-changed",
+      G_CALLBACK (duration_changed_cb), state);
+  g_signal_connect (player, "end-of-stream", G_CALLBACK (end_of_stream_cb),
+      state);
+  g_signal_connect (player, "error", G_CALLBACK (error_cb), state);
+  g_signal_connect (player, "warning", G_CALLBACK (warning_cb), state);
+  g_signal_connect (player, "position-updated",
+      G_CALLBACK (position_updated_cb), state);
+  g_signal_connect (player, "state-changed", G_CALLBACK (state_changed_cb),
+      state);
+  g_signal_connect (player, "media-info-updated",
+      G_CALLBACK (media_info_updated_cb), state);
+  g_signal_connect (player, "video-dimensions-changed",
+      G_CALLBACK (video_dimensions_changed_cb), state);
+  g_signal_connect (player, "seek-done", G_CALLBACK (seek_done_cb), state);
+
+  return player;
+}
+
+static void
+test_play_audio_video_eos_cb (GstPlayer * player, TestPlayerStateChange change,
+    TestPlayerState * old_state, TestPlayerState * new_state)
+{
+  gint step = GPOINTER_TO_INT (new_state->test_data);
+  gboolean video;
+
+  video = ! !(step & 0x10);
+  step = (step & (~0x10));
+
+  switch (step) {
+    case 0:
+      fail_unless_equals_int (change, STATE_CHANGE_STATE_CHANGED);
+      fail_unless_equals_int (old_state->state, GST_PLAYER_STATE_STOPPED);
+      fail_unless_equals_int (new_state->state, GST_PLAYER_STATE_BUFFERING);
+      new_state->test_data =
+          GINT_TO_POINTER ((video ? 0x10 : 0x00) | (step + 1));
+      break;
+    case 1:
+      fail_unless_equals_int (change, STATE_CHANGE_MEDIA_INFO_UPDATED);
+      new_state->test_data =
+          GINT_TO_POINTER ((video ? 0x10 : 0x00) | (step + 1));
+      break;
+    case 2:
+      fail_unless_equals_int (change, STATE_CHANGE_VIDEO_DIMENSIONS_CHANGED);
+      if (video) {
+        fail_unless_equals_int (new_state->width, 320);
+        fail_unless_equals_int (new_state->height, 240);
+      } else {
+        fail_unless_equals_int (new_state->width, 0);
+        fail_unless_equals_int (new_state->height, 0);
+      }
+      new_state->test_data =
+          GINT_TO_POINTER ((video ? 0x10 : 0x00) | (step + 1));
+      break;
+    case 3:
+      fail_unless_equals_int (change, STATE_CHANGE_DURATION_CHANGED);
+      fail_unless_equals_uint64 (new_state->duration,
+          G_GUINT64_CONSTANT (464399092));
+      new_state->test_data =
+          GINT_TO_POINTER ((video ? 0x10 : 0x00) | (step + 1));
+      break;
+    case 4:
+      fail_unless_equals_int (change, STATE_CHANGE_POSITION_UPDATED);
+      fail_unless_equals_uint64 (new_state->position, G_GUINT64_CONSTANT (0));
+      new_state->test_data =
+          GINT_TO_POINTER ((video ? 0x10 : 0x00) | (step + 1));
+      break;
+    case 5:
+      fail_unless_equals_int (change, STATE_CHANGE_STATE_CHANGED);
+      fail_unless_equals_int (old_state->state, GST_PLAYER_STATE_BUFFERING);
+      fail_unless_equals_int (new_state->state, GST_PLAYER_STATE_PLAYING);
+      new_state->test_data =
+          GINT_TO_POINTER ((video ? 0x10 : 0x00) | (step + 1));
+      break;
+    case 6:
+      if (change == STATE_CHANGE_POSITION_UPDATED) {
+        fail_unless (old_state->position <= new_state->position);
+      } else {
+        fail_unless_equals_uint64 (old_state->position, old_state->duration);
+        fail_unless_equals_int (change, STATE_CHANGE_END_OF_STREAM);
+        new_state->test_data =
+            GINT_TO_POINTER ((video ? 0x10 : 0x00) | (step + 1));
+      }
+      break;
+    case 7:
+      fail_unless_equals_int (change, STATE_CHANGE_STATE_CHANGED);
+      fail_unless_equals_int (old_state->state, GST_PLAYER_STATE_PLAYING);
+      fail_unless_equals_int (new_state->state, GST_PLAYER_STATE_STOPPED);
+      new_state->test_data =
+          GINT_TO_POINTER ((video ? 0x10 : 0x00) | (step + 1));
+      g_main_loop_quit (new_state->loop);
+      break;
+    default:
+      fail ();
+      break;
+  }
+}
+
+START_TEST (test_play_audio_eos)
+{
+  GstPlayer *player;
+  TestPlayerState state;
+  gchar *uri;
+
+  memset (&state, 0, sizeof (state));
+  state.loop = g_main_loop_new (NULL, FALSE);
+  state.test_callback = test_play_audio_video_eos_cb;
+  state.test_data = GINT_TO_POINTER (0);
+
+  player = test_player_new (&state);
+
+  fail_unless (player != NULL);
+
+  uri = gst_filename_to_uri (TEST_PATH "/audio-short.ogg", NULL);
+  fail_unless (uri != NULL);
+  gst_player_set_uri (player, uri);
+  g_free (uri);
+
+  gst_player_play (player);
+  g_main_loop_run (state.loop);
+
+  fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 8);
+
+  g_object_unref (player);
+  g_main_loop_unref (state.loop);
+}
+
+END_TEST;
+
+static void
+test_audio_info (GstPlayerMediaInfo * media_info)
+{
+  gint i = 0;
+  GList *list;
+
+  for (list = gst_player_get_audio_streams (media_info);
+      list != NULL; list = list->next) {
+    GstPlayerStreamInfo *stream = (GstPlayerStreamInfo *) list->data;
+    GstPlayerAudioInfo *audio_info = (GstPlayerAudioInfo *) stream;
+
+    fail_unless (gst_player_stream_info_get_tags (stream) != NULL);
+    fail_unless (gst_player_stream_info_get_caps (stream) != NULL);
+    fail_unless_equals_string (gst_player_stream_info_get_stream_type (stream),
+        "audio");
+
+    if (i == 0) {
+      fail_unless_equals_string (gst_player_stream_info_get_codec (stream),
+          "MPEG-1 Layer 3 (MP3)");
+      fail_unless_equals_int (gst_player_audio_info_get_sample_rate
+          (audio_info), 48000);
+      fail_unless_equals_int (gst_player_audio_info_get_channels (audio_info),
+          2);
+      fail_unless_equals_int (gst_player_audio_info_get_max_bitrate
+          (audio_info), 192000);
+      fail_unless (gst_player_audio_info_get_language (audio_info) != NULL);
+    } else {
+      fail_unless_equals_string (gst_player_stream_info_get_codec (stream),
+          "MPEG-4 AAC");
+      fail_unless_equals_int (gst_player_audio_info_get_sample_rate
+          (audio_info), 48000);
+      fail_unless_equals_int (gst_player_audio_info_get_channels (audio_info),
+          6);
+      fail_unless (gst_player_audio_info_get_language (audio_info) != NULL);
+    }
+
+    i++;
+  }
+}
+
+static void
+test_video_info (GstPlayerMediaInfo * media_info)
+{
+  GList *list;
+
+  for (list = gst_player_get_video_streams (media_info);
+      list != NULL; list = list->next) {
+    gint fps_d, fps_n;
+    guint par_d, par_n;
+    GstPlayerStreamInfo *stream = (GstPlayerStreamInfo *) list->data;
+    GstPlayerVideoInfo *video_info = (GstPlayerVideoInfo *) stream;
+
+    fail_unless (gst_player_stream_info_get_tags (stream) != NULL);
+    fail_unless (gst_player_stream_info_get_caps (stream) != NULL);
+    fail_unless_equals_int (gst_player_stream_info_get_index (stream), 0);
+    fail_unless (strstr (gst_player_stream_info_get_codec (stream),
+            "H.264") != NULL
+        || strstr (gst_player_stream_info_get_codec (stream), "H264") != NULL);
+    fail_unless_equals_int (gst_player_video_info_get_width (video_info), 320);
+    fail_unless_equals_int (gst_player_video_info_get_height (video_info), 240);
+    gst_player_video_info_get_framerate (video_info, &fps_n, &fps_d);
+    fail_unless_equals_int (fps_n, 24);
+    fail_unless_equals_int (fps_d, 1);
+    gst_player_video_info_get_pixel_aspect_ratio (video_info, &par_n, &par_d);
+    fail_unless_equals_int (par_n, 33);
+    fail_unless_equals_int (par_d, 20);
+  }
+}
+
+static void
+test_subtitle_info (GstPlayerMediaInfo * media_info)
+{
+  GList *list;
+
+  for (list = gst_player_get_subtitle_streams (media_info);
+      list != NULL; list = list->next) {
+    GstPlayerStreamInfo *stream = (GstPlayerStreamInfo *) list->data;
+    GstPlayerSubtitleInfo *sub = (GstPlayerSubtitleInfo *) stream;
+
+    fail_unless_equals_string (gst_player_stream_info_get_stream_type (stream),
+        "subtitle");
+    fail_unless (gst_player_stream_info_get_tags (stream) != NULL);
+    fail_unless (gst_player_stream_info_get_caps (stream) != NULL);
+    fail_unless_equals_string (gst_player_stream_info_get_codec (stream),
+        "Timed Text");
+    fail_unless (gst_player_subtitle_info_get_language (sub) != NULL);
+  }
+}
+
+static void
+test_media_info_object (GstPlayer * player, GstPlayerMediaInfo * media_info)
+{
+  GList *list;
+
+  /* gloabl tag */
+  fail_unless (gst_player_media_info_is_seekable (media_info) == TRUE);
+  fail_unless (gst_player_media_info_get_tags (media_info) != NULL);
+  fail_unless_equals_string (gst_player_media_info_get_title (media_info),
+      "Sintel");
+  fail_unless_equals_string (gst_player_media_info_get_container_format
+      (media_info), "Matroska");
+  fail_unless (gst_player_media_info_get_image_sample (media_info) == NULL);
+  fail_unless (strstr (gst_player_media_info_get_uri (media_info),
+          "sintel.mkv") != NULL);
+
+  /* number of streams */
+  list = gst_player_media_info_get_stream_list (media_info);
+  fail_unless (list != NULL);
+  fail_unless_equals_int (g_list_length (list), 10);
+
+  list = gst_player_get_video_streams (media_info);
+  fail_unless (list != NULL);
+  fail_unless_equals_int (g_list_length (list), 1);
+
+  list = gst_player_get_audio_streams (media_info);
+  fail_unless (list != NULL);
+  fail_unless_equals_int (g_list_length (list), 2);
+
+  list = gst_player_get_subtitle_streams (media_info);
+  fail_unless (list != NULL);
+  fail_unless_equals_int (g_list_length (list), 7);
+
+  /* test subtitle */
+  test_subtitle_info (media_info);
+
+  /* test audio */
+  test_audio_info (media_info);
+
+  /* test video */
+  test_video_info (media_info);
+}
+
+static void
+test_play_media_info_cb (GstPlayer * player, TestPlayerStateChange change,
+    TestPlayerState * old_state, TestPlayerState * new_state)
+{
+  gint completed = GPOINTER_TO_INT (new_state->test_data);
+
+  if (change == STATE_CHANGE_MEDIA_INFO_UPDATED) {
+    test_media_info_object (player, new_state->media_info);
+    new_state->test_data = GINT_TO_POINTER (completed + 1);
+    g_main_loop_quit (new_state->loop);
+  } else if (change == STATE_CHANGE_END_OF_STREAM ||
+      change == STATE_CHANGE_ERROR) {
+    g_main_loop_quit (new_state->loop);
+  }
+}
+
+START_TEST (test_play_media_info)
+{
+  GstPlayer *player;
+  TestPlayerState state;
+  gchar *uri;
+
+  memset (&state, 0, sizeof (state));
+  state.loop = g_main_loop_new (NULL, FALSE);
+  state.test_callback = test_play_media_info_cb;
+  state.test_data = GINT_TO_POINTER (0);
+
+  player = test_player_new (&state);
+
+  fail_unless (player != NULL);
+
+  uri = gst_filename_to_uri (TEST_PATH "/sintel.mkv", NULL);
+  fail_unless (uri != NULL);
+  gst_player_set_uri (player, uri);
+  g_free (uri);
+
+  gst_player_play (player);
+  g_main_loop_run (state.loop);
+
+  fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 1);
+  g_object_unref (player);
+  g_main_loop_unref (state.loop);
+}
+
+END_TEST;
+
+static void
+test_play_error_invalid_external_suburi_cb (GstPlayer * player,
+    TestPlayerStateChange change, TestPlayerState * old_state,
+    TestPlayerState * new_state)
+{
+  gint steps = GPOINTER_TO_INT (new_state->test_data);
+
+  if (new_state->state == GST_PLAYER_STATE_PLAYING && !steps) {
+    gchar *suburi;
+
+    suburi = gst_filename_to_uri (TEST_PATH "/foo.srt", NULL);
+    fail_unless (suburi != NULL);
+
+    new_state->test_data = GINT_TO_POINTER (steps + 1);
+    /* load invalid suburi */
+    fail_unless (gst_player_set_subtitle_uri (player, suburi) != FALSE);
+    g_free (suburi);
+
+  } else if (steps && change == STATE_CHANGE_WARNING) {
+    new_state->test_data = GINT_TO_POINTER (steps + 1);
+    g_main_loop_quit (new_state->loop);
+
+  } else if (change == STATE_CHANGE_END_OF_STREAM ||
+      change == STATE_CHANGE_ERROR)
+    g_main_loop_quit (new_state->loop);
+}
+
+static void
+test_play_stream_disable_cb (GstPlayer * player,
+    TestPlayerStateChange change, TestPlayerState * old_state,
+    TestPlayerState * new_state)
+{
+  gint steps = GPOINTER_TO_INT (new_state->test_data) & 0xf;
+  gint mask = GPOINTER_TO_INT (new_state->test_data) & 0xf0;
+
+  if (new_state->state == GST_PLAYER_STATE_PLAYING && !steps) {
+    new_state->test_data = GINT_TO_POINTER (0x10 + steps + 1);
+    gst_player_set_audio_track_enabled (player, FALSE);
+
+  } else if (mask == 0x10 && change == STATE_CHANGE_POSITION_UPDATED) {
+    GstPlayerAudioInfo *audio;
+
+    audio = gst_player_get_current_audio_track (player);
+    fail_unless (audio == NULL);
+    new_state->test_data = GINT_TO_POINTER (0x20 + steps + 1);
+    gst_player_set_subtitle_track_enabled (player, FALSE);
+
+  } else if (mask == 0x20 && change == STATE_CHANGE_POSITION_UPDATED) {
+    GstPlayerSubtitleInfo *sub;
+
+    sub = gst_player_get_current_subtitle_track (player);
+    fail_unless (sub == NULL);
+    new_state->test_data = GINT_TO_POINTER (0x30 + steps + 1);
+    g_main_loop_quit (new_state->loop);
+
+  } else if (change == STATE_CHANGE_END_OF_STREAM ||
+      change == STATE_CHANGE_ERROR) {
+    g_main_loop_quit (new_state->loop);
+  }
+}
+
+START_TEST (test_play_stream_disable)
+{
+  GstPlayer *player;
+  TestPlayerState state;
+  gchar *uri;
+
+  memset (&state, 0, sizeof (state));
+  state.loop = g_main_loop_new (NULL, FALSE);
+  state.test_callback = test_play_stream_disable_cb;
+  state.test_data = GINT_TO_POINTER (0);
+
+  player = test_player_new (&state);
+
+  fail_unless (player != NULL);
+
+  uri = gst_filename_to_uri (TEST_PATH "/sintel.mkv", NULL);
+  fail_unless (uri != NULL);
+  gst_player_set_uri (player, uri);
+  g_free (uri);
+
+  gst_player_play (player);
+  g_main_loop_run (state.loop);
+
+  fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 0x33);
+
+  g_object_unref (player);
+  g_main_loop_unref (state.loop);
+}
+
+END_TEST;
+
+static void
+test_play_stream_switch_audio_cb (GstPlayer * player,
+    TestPlayerStateChange change, TestPlayerState * old_state,
+    TestPlayerState * new_state)
+{
+  gint steps = GPOINTER_TO_INT (new_state->test_data);
+
+  if (new_state->state == GST_PLAYER_STATE_PLAYING && !steps) {
+    gint ret;
+
+    new_state->test_data = GINT_TO_POINTER (steps + 1);
+    ret = gst_player_set_audio_track (player, 1);
+    fail_unless_equals_int (ret, 1);
+
+  } else if (steps && change == STATE_CHANGE_POSITION_UPDATED) {
+    gint index;
+    GstPlayerAudioInfo *audio;
+
+    audio = gst_player_get_current_audio_track (player);
+    fail_unless (audio != NULL);
+    index = gst_player_stream_info_get_index ((GstPlayerStreamInfo *) audio);
+    fail_unless_equals_int (index, 1);
+    g_object_unref (audio);
+
+    new_state->test_data = GINT_TO_POINTER (steps + 1);
+    g_main_loop_quit (new_state->loop);
+
+  } else if (change == STATE_CHANGE_END_OF_STREAM ||
+      change == STATE_CHANGE_ERROR) {
+    g_main_loop_quit (new_state->loop);
+  }
+}
+
+START_TEST (test_play_stream_switch_audio)
+{
+  GstPlayer *player;
+  TestPlayerState state;
+  gchar *uri;
+
+  memset (&state, 0, sizeof (state));
+  state.loop = g_main_loop_new (NULL, FALSE);
+  state.test_callback = test_play_stream_switch_audio_cb;
+  state.test_data = GINT_TO_POINTER (0);
+
+  player = test_player_new (&state);
+
+  fail_unless (player != NULL);
+
+  uri = gst_filename_to_uri (TEST_PATH "/sintel.mkv", NULL);
+  fail_unless (uri != NULL);
+  gst_player_set_uri (player, uri);
+  g_free (uri);
+
+  gst_player_play (player);
+  g_main_loop_run (state.loop);
+
+  fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 2);
+
+  g_object_unref (player);
+  g_main_loop_unref (state.loop);
+}
+
+END_TEST;
+
+static void
+test_play_stream_switch_subtitle_cb (GstPlayer * player,
+    TestPlayerStateChange change, TestPlayerState * old_state,
+    TestPlayerState * new_state)
+{
+  gint steps = GPOINTER_TO_INT (new_state->test_data);
+
+  if (new_state->state == GST_PLAYER_STATE_PLAYING && !steps) {
+    gint ret;
+
+    new_state->test_data = GINT_TO_POINTER (steps + 1);
+    ret = gst_player_set_subtitle_track (player, 5);
+    fail_unless_equals_int (ret, 1);
+
+  } else if (steps && change == STATE_CHANGE_POSITION_UPDATED) {
+    gint index;
+    GstPlayerSubtitleInfo *sub;
+
+    sub = gst_player_get_current_subtitle_track (player);
+    fail_unless (sub != NULL);
+    index = gst_player_stream_info_get_index ((GstPlayerStreamInfo *) sub);
+    fail_unless_equals_int (index, 5);
+    g_object_unref (sub);
+
+    new_state->test_data = GINT_TO_POINTER (steps + 1);
+    g_main_loop_quit (new_state->loop);
+
+  } else if (change == STATE_CHANGE_END_OF_STREAM ||
+      change == STATE_CHANGE_ERROR) {
+    g_main_loop_quit (new_state->loop);
+  }
+}
+
+START_TEST (test_play_stream_switch_subtitle)
+{
+  GstPlayer *player;
+  TestPlayerState state;
+  gchar *uri;
+
+  memset (&state, 0, sizeof (state));
+  state.loop = g_main_loop_new (NULL, FALSE);
+  state.test_callback = test_play_stream_switch_subtitle_cb;
+  state.test_data = GINT_TO_POINTER (0);
+
+  player = test_player_new (&state);
+
+  fail_unless (player != NULL);
+
+  uri = gst_filename_to_uri (TEST_PATH "/sintel.mkv", NULL);
+  fail_unless (uri != NULL);
+  gst_player_set_uri (player, uri);
+  g_free (uri);
+
+  gst_player_play (player);
+  g_main_loop_run (state.loop);
+
+  fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 2);
+
+  g_object_unref (player);
+  g_main_loop_unref (state.loop);
+}
+
+END_TEST;
+
+START_TEST (test_play_error_invalid_external_suburi)
+{
+  GstPlayer *player;
+  TestPlayerState state;
+  gchar *uri;
+
+  memset (&state, 0, sizeof (state));
+  state.loop = g_main_loop_new (NULL, FALSE);
+  state.test_callback = test_play_error_invalid_external_suburi_cb;
+  state.test_data = GINT_TO_POINTER (0);
+
+  player = test_player_new (&state);
+
+  fail_unless (player != NULL);
+
+  uri = gst_filename_to_uri (TEST_PATH "/audio-video.ogg", NULL);
+  fail_unless (uri != NULL);
+  gst_player_set_uri (player, uri);
+  g_free (uri);
+
+  gst_player_play (player);
+  g_main_loop_run (state.loop);
+
+  fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 2);
+
+  g_object_unref (player);
+  g_main_loop_unref (state.loop);
+}
+
+END_TEST;
+
+static gboolean
+has_subtitle_stream (TestPlayerState * new_state)
+{
+  if (gst_player_get_subtitle_streams (new_state->media_info))
+    return TRUE;
+
+  return FALSE;
+}
+
+static void
+test_play_external_suburi_cb (GstPlayer * player,
+    TestPlayerStateChange change, TestPlayerState * old_state,
+    TestPlayerState * new_state)
+{
+  gint steps = GPOINTER_TO_INT (new_state->test_data);
+
+  if (new_state->state == GST_PLAYER_STATE_PLAYING && !steps) {
+    gchar *suburi;
+
+    suburi = gst_filename_to_uri (TEST_PATH "/test_sub.srt", NULL);
+    fail_unless (suburi != NULL);
+
+    fail_unless (gst_player_set_subtitle_uri (player, suburi) != FALSE);
+    g_free (suburi);
+    new_state->test_data = GINT_TO_POINTER (steps + 1);
+
+  } else if (change == STATE_CHANGE_MEDIA_INFO_UPDATED &&
+      has_subtitle_stream (new_state)) {
+    gchar *current_suburi, *suburi;
+
+    current_suburi = gst_player_get_subtitle_uri (player);
+    fail_unless (current_suburi != NULL);
+    suburi = gst_filename_to_uri (TEST_PATH "/test_sub.srt", NULL);
+    fail_unless (suburi != NULL);
+
+    fail_unless_equals_int (g_strcmp0 (current_suburi, suburi), 0);
+
+    g_free (current_suburi);
+    g_free (suburi);
+    new_state->test_data = GINT_TO_POINTER (steps + 1);
+    g_main_loop_quit (new_state->loop);
+
+  } else if (change == STATE_CHANGE_END_OF_STREAM ||
+      change == STATE_CHANGE_ERROR)
+    g_main_loop_quit (new_state->loop);
+}
+
+START_TEST (test_play_external_suburi)
+{
+  GstPlayer *player;
+  TestPlayerState state;
+  gchar *uri;
+
+  memset (&state, 0, sizeof (state));
+  state.loop = g_main_loop_new (NULL, FALSE);
+  state.test_callback = test_play_external_suburi_cb;
+  state.test_data = GINT_TO_POINTER (0);
+
+  player = test_player_new (&state);
+
+  fail_unless (player != NULL);
+
+  uri = gst_filename_to_uri (TEST_PATH "/audio-video.ogg", NULL);
+  fail_unless (uri != NULL);
+  gst_player_set_uri (player, uri);
+  g_free (uri);
+
+  gst_player_play (player);
+  g_main_loop_run (state.loop);
+
+  fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 2);
+
+  g_object_unref (player);
+  g_main_loop_unref (state.loop);
+}
+
+END_TEST;
+
+static void
+test_play_rate_cb (GstPlayer * player,
+    TestPlayerStateChange change, TestPlayerState * old_state,
+    TestPlayerState * new_state)
+{
+  gint steps = GPOINTER_TO_INT (new_state->test_data) & 0xf;
+  gint mask = GPOINTER_TO_INT (new_state->test_data) & 0xf0;
+
+  if (new_state->state == GST_PLAYER_STATE_PLAYING && !steps) {
+    guint64 dur = -1, pos = -1;
+
+    g_object_get (player, "position", &pos, "duration", &dur, NULL);
+    pos = pos + dur * 0.2;      /* seek 20% */
+    gst_player_seek (player, pos);
+
+    /* default rate should be 1.0 */
+    fail_unless_equals_double (gst_player_get_rate (player), 1.0);
+    new_state->test_data = GINT_TO_POINTER (mask + steps + 1);
+  } else if (change == STATE_CHANGE_END_OF_STREAM ||
+      change == STATE_CHANGE_ERROR) {
+    g_main_loop_quit (new_state->loop);
+  } else if (steps == 1 && change == STATE_CHANGE_SEEK_DONE) {
+    if (mask == 0x10)
+      gst_player_set_rate (player, 1.5);
+    else if (mask == 0x20)
+      gst_player_set_rate (player, -1.0);
+
+    new_state->test_data = GINT_TO_POINTER (mask + steps + 1);
+  } else if (steps && (change == STATE_CHANGE_POSITION_UPDATED)) {
+    if (steps == 10) {
+      g_main_loop_quit (new_state->loop);
+    } else {
+      if (mask == 0x10 && (new_state->position > old_state->position))
+        new_state->test_data = GINT_TO_POINTER (mask + steps + 1);
+      else if (mask == 0x20 && (new_state->position < old_state->position))
+        new_state->test_data = GINT_TO_POINTER (mask + steps + 1);
+    }
+  }
+}
+
+START_TEST (test_play_forward_rate)
+{
+  GstPlayer *player;
+  TestPlayerState state;
+  gchar *uri;
+
+  memset (&state, 0, sizeof (state));
+  state.loop = g_main_loop_new (NULL, FALSE);
+  state.test_callback = test_play_rate_cb;
+  state.test_data = GINT_TO_POINTER (0x10);
+
+  player = test_player_new (&state);
+
+  fail_unless (player != NULL);
+
+  uri = gst_filename_to_uri (TEST_PATH "/audio.ogg", NULL);
+  fail_unless (uri != NULL);
+  gst_player_set_uri (player, uri);
+  g_free (uri);
+
+  gst_player_play (player);
+  g_main_loop_run (state.loop);
+
+  fail_unless_equals_int (GPOINTER_TO_INT (state.test_data) & 0xf, 10);
+
+  g_object_unref (player);
+  g_main_loop_unref (state.loop);
+}
+
+END_TEST;
+
+START_TEST (test_play_backward_rate)
+{
+  GstPlayer *player;
+  TestPlayerState state;
+  gchar *uri;
+
+  memset (&state, 0, sizeof (state));
+  state.loop = g_main_loop_new (NULL, FALSE);
+  state.test_callback = test_play_rate_cb;
+  state.test_data = GINT_TO_POINTER (0x20);
+
+  player = test_player_new (&state);
+
+  fail_unless (player != NULL);
+
+  uri = gst_filename_to_uri (TEST_PATH "/audio.ogg", NULL);
+  fail_unless (uri != NULL);
+  gst_player_set_uri (player, uri);
+  g_free (uri);
+
+  gst_player_play (player);
+  g_main_loop_run (state.loop);
+
+  fail_unless_equals_int (GPOINTER_TO_INT (state.test_data) & 0xf, 10);
+
+  g_object_unref (player);
+  g_main_loop_unref (state.loop);
+}
+
+END_TEST;
+
+START_TEST (test_play_audio_video_eos)
+{
+  GstPlayer *player;
+  TestPlayerState state;
+  gchar *uri;
+
+  memset (&state, 0, sizeof (state));
+  state.loop = g_main_loop_new (NULL, FALSE);
+  state.test_callback = test_play_audio_video_eos_cb;
+  state.test_data = GINT_TO_POINTER (0x10);
+
+  player = test_player_new (&state);
+
+  fail_unless (player != NULL);
+
+  uri = gst_filename_to_uri (TEST_PATH "/audio-video-short.ogg", NULL);
+  fail_unless (uri != NULL);
+  gst_player_set_uri (player, uri);
+  g_free (uri);
+
+  gst_player_play (player);
+  g_main_loop_run (state.loop);
+
+  fail_unless_equals_int (GPOINTER_TO_INT (state.test_data) & (~0x10), 8);
+
+  g_object_unref (player);
+  g_main_loop_unref (state.loop);
+}
+
+END_TEST;
+
+static void
+test_play_error_invalid_uri_cb (GstPlayer * player,
+    TestPlayerStateChange change, TestPlayerState * old_state,
+    TestPlayerState * new_state)
+{
+  gint step = GPOINTER_TO_INT (new_state->test_data);
+
+  switch (step) {
+    case 0:
+      fail_unless_equals_int (change, STATE_CHANGE_STATE_CHANGED);
+      fail_unless_equals_int (old_state->state, GST_PLAYER_STATE_STOPPED);
+      fail_unless_equals_int (new_state->state, GST_PLAYER_STATE_BUFFERING);
+      new_state->test_data = GINT_TO_POINTER (step + 1);
+      break;
+    case 1:
+      fail_unless_equals_int (change, STATE_CHANGE_ERROR);
+      new_state->test_data = GINT_TO_POINTER (step + 1);
+      break;
+    case 2:
+      fail_unless_equals_int (change, STATE_CHANGE_STATE_CHANGED);
+      fail_unless_equals_int (old_state->state, GST_PLAYER_STATE_BUFFERING);
+      fail_unless_equals_int (new_state->state, GST_PLAYER_STATE_STOPPED);
+      new_state->test_data = GINT_TO_POINTER (step + 1);
+      g_main_loop_quit (new_state->loop);
+      break;
+    default:
+      fail ();
+      break;
+  }
+}
+
+START_TEST (test_play_error_invalid_uri)
+{
+  GstPlayer *player;
+  TestPlayerState state;
+
+  memset (&state, 0, sizeof (state));
+  state.loop = g_main_loop_new (NULL, FALSE);
+  state.test_callback = test_play_error_invalid_uri_cb;
+  state.test_data = GINT_TO_POINTER (0);
+
+  player = test_player_new (&state);
+
+  fail_unless (player != NULL);
+
+  gst_player_set_uri (player, "foo://bar");
+
+  gst_player_play (player);
+  g_main_loop_run (state.loop);
+
+  fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 3);
+
+  g_object_unref (player);
+  g_main_loop_unref (state.loop);
+}
+
+END_TEST;
+
+static void
+test_play_error_invalid_uri_and_play_cb (GstPlayer * player,
+    TestPlayerStateChange change, TestPlayerState * old_state,
+    TestPlayerState * new_state)
+{
+  gint step = GPOINTER_TO_INT (new_state->test_data);
+  gchar *uri;
+
+  switch (step) {
+    case 0:
+      fail_unless_equals_int (change, STATE_CHANGE_STATE_CHANGED);
+      fail_unless_equals_int (old_state->state, GST_PLAYER_STATE_STOPPED);
+      fail_unless_equals_int (new_state->state, GST_PLAYER_STATE_BUFFERING);
+      new_state->test_data = GINT_TO_POINTER (step + 1);
+      break;
+    case 1:
+      fail_unless_equals_int (change, STATE_CHANGE_ERROR);
+      new_state->test_data = GINT_TO_POINTER (step + 1);
+      break;
+    case 2:
+      fail_unless_equals_int (change, STATE_CHANGE_STATE_CHANGED);
+      fail_unless_equals_int (old_state->state, GST_PLAYER_STATE_BUFFERING);
+      fail_unless_equals_int (new_state->state, GST_PLAYER_STATE_STOPPED);
+      new_state->test_data = GINT_TO_POINTER (step + 1);
+
+      uri = gst_filename_to_uri (TEST_PATH "/audio-short.ogg", NULL);
+      fail_unless (uri != NULL);
+      gst_player_set_uri (player, uri);
+      g_free (uri);
+
+      gst_player_play (player);
+      break;
+    case 3:
+      fail_unless_equals_int (change, STATE_CHANGE_STATE_CHANGED);
+      fail_unless_equals_int (old_state->state, GST_PLAYER_STATE_STOPPED);
+      fail_unless_equals_int (new_state->state, GST_PLAYER_STATE_BUFFERING);
+      new_state->test_data = GINT_TO_POINTER (step + 1);
+      break;
+    case 4:
+      fail_unless_equals_int (change, STATE_CHANGE_MEDIA_INFO_UPDATED);
+      new_state->test_data = GINT_TO_POINTER (step + 1);
+      break;
+    case 5:
+      fail_unless_equals_int (change, STATE_CHANGE_VIDEO_DIMENSIONS_CHANGED);
+      fail_unless_equals_int (new_state->width, 0);
+      fail_unless_equals_int (new_state->height, 0);
+      new_state->test_data = GINT_TO_POINTER (step + 1);
+      break;
+    case 6:
+      fail_unless_equals_int (change, STATE_CHANGE_DURATION_CHANGED);
+      fail_unless_equals_uint64 (new_state->duration,
+          G_GUINT64_CONSTANT (464399092));
+      new_state->test_data = GINT_TO_POINTER (step + 1);
+      break;
+    case 7:
+      fail_unless_equals_int (change, STATE_CHANGE_POSITION_UPDATED);
+      fail_unless_equals_uint64 (new_state->position, G_GUINT64_CONSTANT (0));
+      new_state->test_data = GINT_TO_POINTER (step + 1);
+      break;
+    case 8:
+      fail_unless_equals_int (change, STATE_CHANGE_STATE_CHANGED);
+      fail_unless_equals_int (old_state->state, GST_PLAYER_STATE_BUFFERING);
+      fail_unless_equals_int (new_state->state, GST_PLAYER_STATE_PLAYING);
+      new_state->test_data = GINT_TO_POINTER (step + 1);
+      g_main_loop_quit (new_state->loop);
+      break;
+    default:
+      fail ();
+      break;
+  }
+}
+
+START_TEST (test_play_error_invalid_uri_and_play)
+{
+  GstPlayer *player;
+  TestPlayerState state;
+
+  memset (&state, 0, sizeof (state));
+  state.loop = g_main_loop_new (NULL, FALSE);
+  state.test_callback = test_play_error_invalid_uri_and_play_cb;
+  state.test_data = GINT_TO_POINTER (0);
+
+  player = test_player_new (&state);
+
+  fail_unless (player != NULL);
+
+  gst_player_set_uri (player, "foo://bar");
+
+  gst_player_play (player);
+  g_main_loop_run (state.loop);
+
+  fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 9);
+
+  g_object_unref (player);
+  g_main_loop_unref (state.loop);
+}
+
+END_TEST;
+
+static void
+test_play_seek_done_cb (GstPlayer * player,
+    TestPlayerStateChange change, TestPlayerState * old_state,
+    TestPlayerState * new_state)
+{
+  gint step = GPOINTER_TO_INT (new_state->test_data) & (~0x10);
+
+  if (new_state->state == GST_PLAYER_STATE_PLAYING && !step) {
+    gst_player_seek (player, 0);
+    new_state->test_data = GINT_TO_POINTER (step + 1);
+  } else if (change == STATE_CHANGE_SEEK_DONE || change == STATE_CHANGE_ERROR) {
+    fail_unless_equals_int (change, STATE_CHANGE_SEEK_DONE);
+    fail_unless_equals_uint64 (new_state->seek_done_position,
+        G_GUINT64_CONSTANT (0));
+    new_state->test_data = GINT_TO_POINTER (step + 1);
+    g_main_loop_quit (new_state->loop);
+  }
+}
+
+START_TEST (test_play_audio_video_seek_done)
+{
+  GstPlayer *player;
+  TestPlayerState state;
+  gchar *uri;
+
+  memset (&state, 0, sizeof (state));
+  state.loop = g_main_loop_new (NULL, FALSE);
+  state.test_callback = test_play_seek_done_cb;
+  state.test_data = GINT_TO_POINTER (0);
+
+  player = test_player_new (&state);
+
+  fail_unless (player != NULL);
+
+  uri = gst_filename_to_uri (TEST_PATH "/audio-video.ogg", NULL);
+  fail_unless (uri != NULL);
+  gst_player_set_uri (player, uri);
+  g_free (uri);
+
+  gst_player_play (player);
+  g_main_loop_run (state.loop);
+
+  fail_unless_equals_int (GPOINTER_TO_INT (state.test_data) & (~0x10), 2);
+
+  g_object_unref (player);
+  g_main_loop_unref (state.loop);
+}
+
+END_TEST;
+
+static void
+test_play_position_update_interval_cb (GstPlayer * player,
+    TestPlayerStateChange change, TestPlayerState * old_state,
+    TestPlayerState * new_state)
+{
+  static gboolean do_quit = TRUE;
+  static GstClockTime last_position = GST_CLOCK_TIME_NONE;
+
+  gint steps = GPOINTER_TO_INT (new_state->test_data);
+
+  if (new_state->state == GST_PLAYER_STATE_PLAYING && !steps) {
+    new_state->test_data = GINT_TO_POINTER (steps + 1);
+  } else if (steps && change == STATE_CHANGE_POSITION_UPDATED) {
+    GstClockTime position = gst_player_get_position (player);
+    new_state->test_data = GINT_TO_POINTER (steps + 1);
+
+    if (GST_CLOCK_TIME_IS_VALID (last_position)) {
+      GstClockTime interval = GST_CLOCK_DIFF (last_position, position);
+      GST_DEBUG_OBJECT (player,
+          "position update interval: %" GST_TIME_FORMAT "\n",
+          GST_TIME_ARGS (interval));
+      fail_unless (interval > (590 * GST_MSECOND)
+          && interval < (610 * GST_MSECOND));
+    }
+
+    last_position = position;
+
+    if (do_quit && position >= 2000 * GST_MSECOND) {
+      do_quit = FALSE;
+      gst_player_set_position_update_interval (player, 0);
+      g_main_loop_quit (new_state->loop);
+    }
+  } else if (change == STATE_CHANGE_END_OF_STREAM ||
+      change == STATE_CHANGE_ERROR) {
+    g_main_loop_quit (new_state->loop);
+  }
+}
+
+static gboolean
+quit_loop_cb (gpointer user_data)
+{
+  GMainLoop *loop = user_data;
+  g_main_loop_quit (loop);
+
+  return G_SOURCE_REMOVE;
+}
+
+START_TEST (test_play_position_update_interval)
+{
+  GstPlayer *player;
+  TestPlayerState state;
+  gchar *uri;
+
+  memset (&state, 0, sizeof (state));
+  state.loop = g_main_loop_new (NULL, FALSE);
+  state.test_callback = test_play_position_update_interval_cb;
+  state.test_data = GINT_TO_POINTER (0);
+
+  player = test_player_new (&state);
+  gst_player_set_position_update_interval (player, 600);
+
+  fail_unless (player != NULL);
+
+  uri = gst_filename_to_uri (TEST_PATH "/sintel.mkv", NULL);
+  fail_unless (uri != NULL);
+  gst_player_set_uri (player, uri);
+  g_free (uri);
+
+  gst_player_play (player);
+  g_main_loop_run (state.loop);
+
+  fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 5);
+
+  g_timeout_add (2000, quit_loop_cb, state.loop);
+  g_main_loop_run (state.loop);
+
+  fail_unless_equals_int (GPOINTER_TO_INT (state.test_data), 5);
+
+  g_object_unref (player);
+  g_main_loop_unref (state.loop);
+}
+
+END_TEST;
+
+static Suite *
+player_suite (void)
+{
+  Suite *s = suite_create ("GstPlayer");
+
+  TCase *tc_general = tcase_create ("general");
+
+  /* Use a longer timeout */
+#ifdef HAVE_VALGRIND
+  if (RUNNING_ON_VALGRIND) {
+    tcase_set_timeout (tc_general, 5 * 60);
+  } else
+#endif
+  {
+    tcase_set_timeout (tc_general, 2 * 60);
+  }
+
+  tcase_add_test (tc_general, test_create_and_free);
+  tcase_add_test (tc_general, test_set_and_get_uri);
+  tcase_add_test (tc_general, test_set_and_get_position_update_interval);
+
+#ifdef HAVE_VALGRIND
+  if (RUNNING_ON_VALGRIND) {
+  } else
+#endif
+  {
+    tcase_add_test (tc_general, test_play_position_update_interval);
+  }
+  tcase_add_test (tc_general, test_play_audio_eos);
+  tcase_add_test (tc_general, test_play_audio_video_eos);
+  tcase_add_test (tc_general, test_play_error_invalid_uri);
+  tcase_add_test (tc_general, test_play_error_invalid_uri_and_play);
+  tcase_add_test (tc_general, test_play_media_info);
+  tcase_add_test (tc_general, test_play_stream_disable);
+  tcase_add_test (tc_general, test_play_stream_switch_audio);
+  tcase_add_test (tc_general, test_play_stream_switch_subtitle);
+  tcase_add_test (tc_general, test_play_error_invalid_external_suburi);
+  tcase_add_test (tc_general, test_play_external_suburi);
+  tcase_add_test (tc_general, test_play_forward_rate);
+  tcase_add_test (tc_general, test_play_backward_rate);
+  tcase_add_test (tc_general, test_play_audio_video_seek_done);
+
+  suite_add_tcase (s, tc_general);
+
+  return s;
+}
+
+int
+main (int argc, char **argv)
+{
+  int number_failed;
+  Suite *s;
+  SRunner *sr;
+
+  gst_init (NULL, NULL);
+
+  s = player_suite ();
+  sr = srunner_create (s);
+
+  srunner_run_all (sr, CK_NORMAL);
+
+  number_failed = srunner_ntests_failed (sr);
+
+  srunner_free (sr);
+  return (number_failed == 0) ? 0 : -1;
+}
diff --git a/tests/check/pipelines/mxf.c b/tests/check/pipelines/mxf.c
index 5ab3a50..4b59e3d 100644
--- a/tests/check/pipelines/mxf.c
+++ b/tests/check/pipelines/mxf.c
@@ -260,6 +260,33 @@
 
 GST_END_TEST;
 
+GST_START_TEST (test_h264_raw_audio)
+{
+  gchar *pipeline;
+  GstElementFactory *factory = NULL;
+
+  if ((factory = gst_element_factory_find ("x264enc")) == NULL)
+    return;
+  gst_object_unref (factory);
+  if ((factory = gst_element_factory_find ("h264parse")) == NULL)
+    return;
+  gst_object_unref (factory);
+
+  pipeline = g_strdup_printf ("videotestsrc num-buffers=250 ! "
+      "video/x-raw,framerate=25/1 ! "
+      "x264enc ! h264parse ! "
+      "mxfmux name=mux ! "
+      "mxfdemux name=demux ! "
+      "fakesink  "
+      "audiotestsrc num-buffers=250 ! "
+      "audioconvert ! " "audio/x-raw,format=S24LE,channels=2 ! mux. ");
+
+  run_test (pipeline, 2);
+  g_free (pipeline);
+}
+
+GST_END_TEST;
+
 static Suite *
 mxf_suite (void)
 {
@@ -269,16 +296,12 @@
   suite_add_tcase (s, tc_chain);
   tcase_set_timeout (tc_chain, 180);
 
-  /* FIXME: remove again once ported */
-  if (!gst_registry_check_feature_version (gst_registry_get (), "mxfmux", 1,
-          0, 0))
-    return s;
-
   tcase_add_test (tc_chain, test_mpeg2);
   tcase_add_test (tc_chain, test_raw_video_raw_audio);
   tcase_add_test (tc_chain, test_raw_video_stride_transform);
   tcase_add_test (tc_chain, test_jpeg2000_alaw);
   tcase_add_test (tc_chain, test_dnxhd_mp3);
+  tcase_add_test (tc_chain, test_h264_raw_audio);
   tcase_add_test (tc_chain, test_multiple_av_streams);
 
   return s;
diff --git a/tests/examples/Makefile.am b/tests/examples/Makefile.am
index c26d3d9..57ed6dd 100644
--- a/tests/examples/Makefile.am
+++ b/tests/examples/Makefile.am
@@ -40,6 +40,16 @@
 GTK3_DIR=
 endif
 
+if USE_WAYLAND
+if HAVE_GTK3
+WAYLAND_DIR=waylandsink
+else
+WAYLAND_DIR=
+endif
+else
+WAYLAND_DIR=
+endif
+
 noinst_PROGRAMS = playout
 
 playout_SOURCES = playout.c
@@ -47,7 +57,8 @@
 playout_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) $(GST_LIBS)
 
 SUBDIRS= codecparsers mpegts $(DIRECTFB_DIR) $(GTK_EXAMPLES) $(OPENCV_EXAMPLES) \
-        $(GL_DIR) $(GTK3_DIR) $(AVSAMPLE_DIR)
-DIST_SUBDIRS= codecparsers mpegts camerabin2 directfb mxf opencv uvch264 gl gtk avsamplesink
+        $(GL_DIR) $(GTK3_DIR) $(AVSAMPLE_DIR) $(WAYLAND_DIR)
+DIST_SUBDIRS= codecparsers mpegts camerabin2 directfb mxf opencv uvch264 gl gtk \
+        avsamplesink waylandsink
 
 include $(top_srcdir)/common/parallel-subdirs.mak
diff --git a/tests/examples/Makefile.in b/tests/examples/Makefile.in
index 1a7dfb1..2d4235c 100644
--- a/tests/examples/Makefile.in
+++ b/tests/examples/Makefile.in
@@ -290,6 +290,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -327,6 +329,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -354,6 +358,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -372,6 +378,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -382,6 +390,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -407,6 +417,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -432,6 +444,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -563,6 +577,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -620,8 +636,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -691,6 +711,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -791,13 +812,18 @@
 @HAVE_AVFOUNDATION_TRUE@@HAVE_IOS_TRUE@AVSAMPLE_DIR = 
 @USE_GTK3_FALSE@GTK3_DIR = 
 @USE_GTK3_TRUE@GTK3_DIR = gtk
+@HAVE_GTK3_FALSE@@USE_WAYLAND_TRUE@WAYLAND_DIR = 
+@HAVE_GTK3_TRUE@@USE_WAYLAND_TRUE@WAYLAND_DIR = waylandsink
+@USE_WAYLAND_FALSE@WAYLAND_DIR = 
 playout_SOURCES = playout.c
 playout_CFLAGS = $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
 playout_LDADD = $(GST_PLUGINS_BASE_LIBS) -lgstvideo-$(GST_API_VERSION) $(GST_LIBS)
 SUBDIRS = codecparsers mpegts $(DIRECTFB_DIR) $(GTK_EXAMPLES) $(OPENCV_EXAMPLES) \
-        $(GL_DIR) $(GTK3_DIR) $(AVSAMPLE_DIR)
+        $(GL_DIR) $(GTK3_DIR) $(AVSAMPLE_DIR) $(WAYLAND_DIR)
 
-DIST_SUBDIRS = codecparsers mpegts camerabin2 directfb mxf opencv uvch264 gl gtk avsamplesink
+DIST_SUBDIRS = codecparsers mpegts camerabin2 directfb mxf opencv uvch264 gl gtk \
+        avsamplesink waylandsink
+
 all: all-recursive
 
 .SUFFIXES:
diff --git a/tests/examples/avsamplesink/Makefile.in b/tests/examples/avsamplesink/Makefile.in
index 78ed7c6..2fddbbc 100644
--- a/tests/examples/avsamplesink/Makefile.in
+++ b/tests/examples/avsamplesink/Makefile.in
@@ -244,6 +244,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -281,6 +283,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -308,6 +312,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -326,6 +332,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -336,6 +344,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -361,6 +371,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -386,6 +398,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -517,6 +531,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -574,8 +590,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -645,6 +665,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/camerabin2/Makefile.in b/tests/examples/camerabin2/Makefile.in
index 1ebcc5d..679ff4e 100644
--- a/tests/examples/camerabin2/Makefile.in
+++ b/tests/examples/camerabin2/Makefile.in
@@ -262,6 +262,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -299,6 +301,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -326,6 +330,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -344,6 +350,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -354,6 +362,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -379,6 +389,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -404,6 +416,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -535,6 +549,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -592,8 +608,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -663,6 +683,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/camerabin2/gst-camerabin2-test.c b/tests/examples/camerabin2/gst-camerabin2-test.c
index 90e010a..1c61957 100644
--- a/tests/examples/camerabin2/gst-camerabin2-test.c
+++ b/tests/examples/camerabin2/gst-camerabin2-test.c
@@ -428,7 +428,7 @@
 
       gst_message_parse_error (message, &err, &debug);
       g_print ("Error: %s\n", err->message);
-      g_error_free (err);
+      g_clear_error (&err);
       g_free (debug);
 
       /* Write debug graph to file */
@@ -556,8 +556,7 @@
           gep_filename);
       if (error) {
         GST_WARNING ("Error from file loading: %s", error->message);
-        g_error_free (error);
-        error = NULL;
+        g_clear_error (&error);
       }
     } else {
       prof = gst_encoding_target_get_profile (target, gep_profilename);
@@ -601,7 +600,7 @@
           property_name);
       if (error) {
         GST_ERROR ("%s", error->message);
-        g_error_free (error);
+        g_clear_error (&error);
       }
       res = FALSE;
     }
@@ -1253,6 +1252,8 @@
   g_option_context_add_group (ctx, gst_init_get_option_group ());
   if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
     g_print ("Error initializing: %s\n", err->message);
+    g_option_context_free (ctx);
+    g_clear_error (&err);
     exit (1);
   }
   g_option_context_free (ctx);
diff --git a/tests/examples/codecparsers/Makefile.in b/tests/examples/codecparsers/Makefile.in
index 019bd50..db8b4f4 100644
--- a/tests/examples/codecparsers/Makefile.in
+++ b/tests/examples/codecparsers/Makefile.in
@@ -247,6 +247,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -284,6 +286,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -311,6 +315,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -329,6 +335,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -339,6 +347,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -364,6 +374,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -389,6 +401,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -520,6 +534,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -577,8 +593,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -648,6 +668,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/codecparsers/parse-jpeg.c b/tests/examples/codecparsers/parse-jpeg.c
index fe42999..ca9cf1b 100644
--- a/tests/examples/codecparsers/parse-jpeg.c
+++ b/tests/examples/codecparsers/parse-jpeg.c
@@ -239,7 +239,7 @@
 
   if (!g_file_get_contents (fn, &data, &size, &err)) {
     g_error ("%s", err->message);
-    g_error_free (err);
+    g_clear_error (&err);
     return;
   }
 
@@ -286,6 +286,8 @@
   g_option_context_add_group (ctx, gst_init_get_option_group ());
   if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
     g_print ("Error initializing: %s\n", GST_STR_NULL (err->message));
+    g_option_context_free (ctx);
+    g_clear_error (&err);
     exit (1);
   }
   g_option_context_free (ctx);
diff --git a/tests/examples/directfb/Makefile.in b/tests/examples/directfb/Makefile.in
index 4a57f96..0515727 100644
--- a/tests/examples/directfb/Makefile.in
+++ b/tests/examples/directfb/Makefile.in
@@ -241,6 +241,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -278,6 +280,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -305,6 +309,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -323,6 +329,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -333,6 +341,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -358,6 +368,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -383,6 +395,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -514,6 +528,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -571,8 +587,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -642,6 +662,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/gl/Makefile.in b/tests/examples/gl/Makefile.in
index af34b5e..9f5a918 100644
--- a/tests/examples/gl/Makefile.in
+++ b/tests/examples/gl/Makefile.in
@@ -252,6 +252,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -289,6 +291,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -316,6 +320,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -334,6 +340,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -344,6 +352,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -369,6 +379,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -394,6 +406,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -525,6 +539,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -582,8 +598,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -653,6 +673,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/gl/clutter/Makefile.in b/tests/examples/gl/clutter/Makefile.in
index 160d109..263cb57 100644
--- a/tests/examples/gl/clutter/Makefile.in
+++ b/tests/examples/gl/clutter/Makefile.in
@@ -284,6 +284,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -321,6 +323,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -348,6 +352,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -366,6 +372,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -376,6 +384,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -401,6 +411,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -426,6 +438,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -557,6 +571,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -614,8 +630,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -685,6 +705,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/gl/clutter/cluttershare.c b/tests/examples/gl/clutter/cluttershare.c
index de7cd66..ee4eb7d 100644
--- a/tests/examples/gl/clutter/cluttershare.c
+++ b/tests/examples/gl/clutter/cluttershare.c
@@ -36,7 +36,7 @@
 #include <gst/gst.h>
 #include <gst/video/video.h>
 #include <gst/video/gstvideometa.h>
-#include <gst/gl/gstglmemory.h>
+#include <gst/gl/gl.h>
 
 /* This example shows how to use textures that come from a
  * gst-plugins-gl pipeline, into the clutter framework
diff --git a/tests/examples/gl/cocoa/Makefile.in b/tests/examples/gl/cocoa/Makefile.in
index 2e6054a..6a7e64f 100644
--- a/tests/examples/gl/cocoa/Makefile.in
+++ b/tests/examples/gl/cocoa/Makefile.in
@@ -247,6 +247,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -284,6 +286,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -311,6 +315,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -329,6 +335,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -339,6 +347,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -364,6 +374,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -389,6 +401,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -520,6 +534,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -577,8 +593,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -648,6 +668,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/gl/generic/Makefile.in b/tests/examples/gl/generic/Makefile.in
index 140395a..112221b 100644
--- a/tests/examples/gl/generic/Makefile.in
+++ b/tests/examples/gl/generic/Makefile.in
@@ -248,6 +248,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -285,6 +287,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -312,6 +316,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -330,6 +336,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -340,6 +348,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -365,6 +375,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -390,6 +402,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -521,6 +535,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -578,8 +594,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -649,6 +669,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/gl/generic/cube/Makefile.in b/tests/examples/gl/generic/cube/Makefile.in
index c8561a0..8ebc765 100644
--- a/tests/examples/gl/generic/cube/Makefile.in
+++ b/tests/examples/gl/generic/cube/Makefile.in
@@ -243,6 +243,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -280,6 +282,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -307,6 +311,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -325,6 +331,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -335,6 +343,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -360,6 +370,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -385,6 +397,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -516,6 +530,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -573,8 +589,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -644,6 +664,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/gl/generic/cubeyuv/Makefile.in b/tests/examples/gl/generic/cubeyuv/Makefile.in
index 58b539c..249a304 100644
--- a/tests/examples/gl/generic/cubeyuv/Makefile.in
+++ b/tests/examples/gl/generic/cubeyuv/Makefile.in
@@ -243,6 +243,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -280,6 +282,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -307,6 +311,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -325,6 +331,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -335,6 +343,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -360,6 +370,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -385,6 +397,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -516,6 +530,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -573,8 +589,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -644,6 +664,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/gl/generic/doublecube/Makefile.in b/tests/examples/gl/generic/doublecube/Makefile.in
index 14ce522..bb78e1b 100644
--- a/tests/examples/gl/generic/doublecube/Makefile.in
+++ b/tests/examples/gl/generic/doublecube/Makefile.in
@@ -243,6 +243,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -280,6 +282,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -307,6 +311,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -325,6 +331,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -335,6 +343,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -360,6 +370,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -385,6 +397,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -516,6 +530,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -573,8 +589,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -644,6 +664,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/gl/generic/recordgraphic/Makefile.in b/tests/examples/gl/generic/recordgraphic/Makefile.in
index ebe3a6d..4330875 100644
--- a/tests/examples/gl/generic/recordgraphic/Makefile.in
+++ b/tests/examples/gl/generic/recordgraphic/Makefile.in
@@ -244,6 +244,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -281,6 +283,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -308,6 +312,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -326,6 +332,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -336,6 +344,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -361,6 +371,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -386,6 +398,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -517,6 +531,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -574,8 +590,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -645,6 +665,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/gl/gtk/3dvideo/Makefile.in b/tests/examples/gl/gtk/3dvideo/Makefile.in
index ae0fddc..b33f20e 100644
--- a/tests/examples/gl/gtk/3dvideo/Makefile.in
+++ b/tests/examples/gl/gtk/3dvideo/Makefile.in
@@ -267,6 +267,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -304,6 +306,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -331,6 +335,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -349,6 +355,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -359,6 +367,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -384,6 +394,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -409,6 +421,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -540,6 +554,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -597,8 +613,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -668,6 +688,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/gl/gtk/Makefile.in b/tests/examples/gl/gtk/Makefile.in
index 5033f90..9febf25 100644
--- a/tests/examples/gl/gtk/Makefile.in
+++ b/tests/examples/gl/gtk/Makefile.in
@@ -284,6 +284,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -321,6 +323,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -348,6 +352,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -366,6 +372,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -376,6 +384,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -401,6 +411,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -426,6 +438,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -557,6 +571,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -614,8 +630,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -685,6 +705,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/gl/gtk/filternovideooverlay/Makefile.in b/tests/examples/gl/gtk/filternovideooverlay/Makefile.in
index 5a3c293..a5e5804 100644
--- a/tests/examples/gl/gtk/filternovideooverlay/Makefile.in
+++ b/tests/examples/gl/gtk/filternovideooverlay/Makefile.in
@@ -245,6 +245,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -282,6 +284,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -309,6 +313,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -327,6 +333,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -337,6 +345,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -362,6 +372,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -387,6 +399,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -518,6 +532,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -575,8 +591,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -646,6 +666,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/gl/gtk/filtervideooverlay/Makefile.in b/tests/examples/gl/gtk/filtervideooverlay/Makefile.in
index 4c7697e..a899cb7 100644
--- a/tests/examples/gl/gtk/filtervideooverlay/Makefile.in
+++ b/tests/examples/gl/gtk/filtervideooverlay/Makefile.in
@@ -245,6 +245,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -282,6 +284,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -309,6 +313,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -327,6 +333,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -337,6 +345,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -362,6 +372,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -387,6 +399,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -518,6 +532,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -575,8 +591,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -646,6 +666,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/gl/gtk/fxtest/Makefile.in b/tests/examples/gl/gtk/fxtest/Makefile.in
index 692e6a4..9d283b6 100644
--- a/tests/examples/gl/gtk/fxtest/Makefile.in
+++ b/tests/examples/gl/gtk/fxtest/Makefile.in
@@ -252,6 +252,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -289,6 +291,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -316,6 +320,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -334,6 +340,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -344,6 +352,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -369,6 +379,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -394,6 +406,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -525,6 +539,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -582,8 +598,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -653,6 +673,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/gl/gtk/fxtest/fxtest.c b/tests/examples/gl/gtk/fxtest/fxtest.c
index f83f189..17860eb 100644
--- a/tests/examples/gl/gtk/fxtest/fxtest.c
+++ b/tests/examples/gl/gtk/fxtest/fxtest.c
@@ -76,7 +76,7 @@
       gst_message_parse_error (message, &err, &debug);
 
       g_print ("Error: %s\n", err->message);
-      g_error_free (err);
+      g_clear_error (&err);
 
       if (debug) {
         g_print ("Debug details: %s\n", debug);
@@ -202,6 +202,8 @@
   g_option_context_add_group (context, gtk_get_option_group (TRUE));
   if (!g_option_context_parse (context, &argc, &argv, &error)) {
     g_print ("Inizialization error: %s\n", GST_STR_NULL (error->message));
+    g_option_context_free (context);
+    g_clear_error (&error);
     return -1;
   }
   g_option_context_free (context);
diff --git a/tests/examples/gl/gtk/fxtest/pixbufdrop.c b/tests/examples/gl/gtk/fxtest/pixbufdrop.c
index 463add3..69bf3af 100644
--- a/tests/examples/gl/gtk/fxtest/pixbufdrop.c
+++ b/tests/examples/gl/gtk/fxtest/pixbufdrop.c
@@ -206,6 +206,8 @@
   g_option_context_add_group (context, gtk_get_option_group (TRUE));
   if (!g_option_context_parse (context, &argc, &argv, &error)) {
     g_print ("Inizialization error: %s\n", GST_STR_NULL (error->message));
+    g_option_context_free (context);
+    g_clear_error (&error);
     return -1;
   }
   g_option_context_free (context);
diff --git a/tests/examples/gl/gtk/gtkvideooverlay/Makefile.in b/tests/examples/gl/gtk/gtkvideooverlay/Makefile.in
index 1873139..4e0bc3d 100644
--- a/tests/examples/gl/gtk/gtkvideooverlay/Makefile.in
+++ b/tests/examples/gl/gtk/gtkvideooverlay/Makefile.in
@@ -245,6 +245,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -282,6 +284,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -309,6 +313,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -327,6 +333,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -337,6 +345,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -362,6 +372,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -387,6 +399,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -518,6 +532,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -575,8 +591,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -646,6 +666,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/gl/gtk/switchvideooverlay/Makefile.in b/tests/examples/gl/gtk/switchvideooverlay/Makefile.in
index 1ead60d..4ebab46 100644
--- a/tests/examples/gl/gtk/switchvideooverlay/Makefile.in
+++ b/tests/examples/gl/gtk/switchvideooverlay/Makefile.in
@@ -245,6 +245,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -282,6 +284,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -309,6 +313,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -327,6 +333,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -337,6 +345,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -362,6 +372,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -387,6 +399,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -518,6 +532,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -575,8 +591,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -646,6 +666,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/gl/qt/Makefile.in b/tests/examples/gl/qt/Makefile.in
index 4b195e1..ba6c799 100644
--- a/tests/examples/gl/qt/Makefile.in
+++ b/tests/examples/gl/qt/Makefile.in
@@ -188,6 +188,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -225,6 +227,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -252,6 +256,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -270,6 +276,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -280,6 +288,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -305,6 +315,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -330,6 +342,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -461,6 +475,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -518,8 +534,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -589,6 +609,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/gl/sdl/Makefile.in b/tests/examples/gl/sdl/Makefile.in
index 974c884..5bf6e2d 100644
--- a/tests/examples/gl/sdl/Makefile.in
+++ b/tests/examples/gl/sdl/Makefile.in
@@ -259,6 +259,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -296,6 +298,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -323,6 +327,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -341,6 +347,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -351,6 +359,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -376,6 +386,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -401,6 +413,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -532,6 +546,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -589,8 +605,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -660,6 +680,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/gtk/Makefile.am b/tests/examples/gtk/Makefile.am
index 945331d..71441b4 100644
--- a/tests/examples/gtk/Makefile.am
+++ b/tests/examples/gtk/Makefile.am
@@ -9,7 +9,7 @@
 
 if USE_GTK3_GL
 if USE_GL
-noinst_PROGRAMS += gtkglsink
+noinst_PROGRAMS += gtkglsink glliveshader
 
 gtkglsink_SOURCES = gtkglsink.c
 gtkglsink_CFLAGS = $(GTK3_CFLAGS) \
@@ -20,5 +20,18 @@
 gtkglsink_LDADD = $(GTK3_LIBS) \
 	$(GST_LIBS) \
 	$(GL_LIBS)
+
+glliveshader_SOURCES = glliveshader.c
+glliveshader_CFLAGS = $(GTK3_CFLAGS) \
+	-I$(top_srcdir)/gst-libs \
+	-I$(top_builddir)/gst-libs \
+	$(GST_PLUGINS_BAD_CFLAGS) \
+	$(GST_PLUGINS_BASE_CFLAGS) \
+	$(GST_CFLAGS) \
+	$(GL_CFLAGS)
+glliveshader_LDADD = $(GTK3_LIBS) \
+	$(GST_LIBS) \
+	$(GL_LIBS) \
+	$(top_builddir)/gst-libs/gst/gl/libgstgl-$(GST_API_VERSION).la
 endif
 endif
diff --git a/tests/examples/gtk/Makefile.in b/tests/examples/gtk/Makefile.in
index f929e7f..c38a4ce 100644
--- a/tests/examples/gtk/Makefile.in
+++ b/tests/examples/gtk/Makefile.in
@@ -90,7 +90,7 @@
 host_triplet = @host@
 target_triplet = @target@
 noinst_PROGRAMS = gtksink$(EXEEXT) $(am__EXEEXT_1)
-@USE_GL_TRUE@@USE_GTK3_GL_TRUE@am__append_1 = gtkglsink
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@am__append_1 = gtkglsink glliveshader
 subdir = tests/examples/gtk
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
@@ -134,21 +134,33 @@
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
-@USE_GL_TRUE@@USE_GTK3_GL_TRUE@am__EXEEXT_1 = gtkglsink$(EXEEXT)
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@am__EXEEXT_1 = gtkglsink$(EXEEXT) \
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@	glliveshader$(EXEEXT)
 PROGRAMS = $(noinst_PROGRAMS)
-am__gtkglsink_SOURCES_DIST = gtkglsink.c
-@USE_GL_TRUE@@USE_GTK3_GL_TRUE@am_gtkglsink_OBJECTS =  \
-@USE_GL_TRUE@@USE_GTK3_GL_TRUE@	gtkglsink-gtkglsink.$(OBJEXT)
-gtkglsink_OBJECTS = $(am_gtkglsink_OBJECTS)
+am__glliveshader_SOURCES_DIST = glliveshader.c
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@am_glliveshader_OBJECTS = glliveshader-glliveshader.$(OBJEXT)
+glliveshader_OBJECTS = $(am_glliveshader_OBJECTS)
 am__DEPENDENCIES_1 =
-@USE_GL_TRUE@@USE_GTK3_GL_TRUE@gtkglsink_DEPENDENCIES =  \
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@glliveshader_DEPENDENCIES =  \
 @USE_GL_TRUE@@USE_GTK3_GL_TRUE@	$(am__DEPENDENCIES_1) \
 @USE_GL_TRUE@@USE_GTK3_GL_TRUE@	$(am__DEPENDENCIES_1) \
-@USE_GL_TRUE@@USE_GTK3_GL_TRUE@	$(am__DEPENDENCIES_1)
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@	$(am__DEPENDENCIES_1) \
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@	$(top_builddir)/gst-libs/gst/gl/libgstgl-$(GST_API_VERSION).la
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
+glliveshader_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
+	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(glliveshader_CFLAGS) \
+	$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
+am__gtkglsink_SOURCES_DIST = gtkglsink.c
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@am_gtkglsink_OBJECTS =  \
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@	gtkglsink-gtkglsink.$(OBJEXT)
+gtkglsink_OBJECTS = $(am_gtkglsink_OBJECTS)
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@gtkglsink_DEPENDENCIES =  \
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@	$(am__DEPENDENCIES_1) \
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@	$(am__DEPENDENCIES_1) \
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@	$(am__DEPENDENCIES_1)
 gtkglsink_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
 	$(LIBTOOLFLAGS) --mode=link $(CCLD) $(gtkglsink_CFLAGS) \
 	$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
@@ -192,8 +204,10 @@
 am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = $(gtkglsink_SOURCES) $(gtksink_SOURCES)
-DIST_SOURCES = $(am__gtkglsink_SOURCES_DIST) $(gtksink_SOURCES)
+SOURCES = $(glliveshader_SOURCES) $(gtkglsink_SOURCES) \
+	$(gtksink_SOURCES)
+DIST_SOURCES = $(am__glliveshader_SOURCES_DIST) \
+	$(am__gtkglsink_SOURCES_DIST) $(gtksink_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
@@ -255,6 +269,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -292,6 +308,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -319,6 +337,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -337,6 +357,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -347,6 +369,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -372,6 +396,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -397,6 +423,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -528,6 +556,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -585,8 +615,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -656,6 +690,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -760,6 +795,20 @@
 @USE_GL_TRUE@@USE_GTK3_GL_TRUE@	$(GST_LIBS) \
 @USE_GL_TRUE@@USE_GTK3_GL_TRUE@	$(GL_LIBS)
 
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@glliveshader_SOURCES = glliveshader.c
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@glliveshader_CFLAGS = $(GTK3_CFLAGS) \
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@	-I$(top_srcdir)/gst-libs \
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@	-I$(top_builddir)/gst-libs \
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@	$(GST_PLUGINS_BAD_CFLAGS) \
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@	$(GST_PLUGINS_BASE_CFLAGS) \
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@	$(GST_CFLAGS) \
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@	$(GL_CFLAGS)
+
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@glliveshader_LDADD = $(GTK3_LIBS) \
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@	$(GST_LIBS) \
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@	$(GL_LIBS) \
+@USE_GL_TRUE@@USE_GTK3_GL_TRUE@	$(top_builddir)/gst-libs/gst/gl/libgstgl-$(GST_API_VERSION).la
+
 all: all-am
 
 .SUFFIXES:
@@ -803,6 +852,10 @@
 	echo " rm -f" $$list; \
 	rm -f $$list
 
+glliveshader$(EXEEXT): $(glliveshader_OBJECTS) $(glliveshader_DEPENDENCIES) $(EXTRA_glliveshader_DEPENDENCIES) 
+	@rm -f glliveshader$(EXEEXT)
+	$(AM_V_CCLD)$(glliveshader_LINK) $(glliveshader_OBJECTS) $(glliveshader_LDADD) $(LIBS)
+
 gtkglsink$(EXEEXT): $(gtkglsink_OBJECTS) $(gtkglsink_DEPENDENCIES) $(EXTRA_gtkglsink_DEPENDENCIES) 
 	@rm -f gtkglsink$(EXEEXT)
 	$(AM_V_CCLD)$(gtkglsink_LINK) $(gtkglsink_OBJECTS) $(gtkglsink_LDADD) $(LIBS)
@@ -817,6 +870,7 @@
 distclean-compile:
 	-rm -f *.tab.c
 
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/glliveshader-glliveshader.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtkglsink-gtkglsink.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtksink-gtksink.Po@am__quote@
 
@@ -844,6 +898,20 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
+glliveshader-glliveshader.o: glliveshader.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(glliveshader_CFLAGS) $(CFLAGS) -MT glliveshader-glliveshader.o -MD -MP -MF $(DEPDIR)/glliveshader-glliveshader.Tpo -c -o glliveshader-glliveshader.o `test -f 'glliveshader.c' || echo '$(srcdir)/'`glliveshader.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/glliveshader-glliveshader.Tpo $(DEPDIR)/glliveshader-glliveshader.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='glliveshader.c' object='glliveshader-glliveshader.o' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(glliveshader_CFLAGS) $(CFLAGS) -c -o glliveshader-glliveshader.o `test -f 'glliveshader.c' || echo '$(srcdir)/'`glliveshader.c
+
+glliveshader-glliveshader.obj: glliveshader.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(glliveshader_CFLAGS) $(CFLAGS) -MT glliveshader-glliveshader.obj -MD -MP -MF $(DEPDIR)/glliveshader-glliveshader.Tpo -c -o glliveshader-glliveshader.obj `if test -f 'glliveshader.c'; then $(CYGPATH_W) 'glliveshader.c'; else $(CYGPATH_W) '$(srcdir)/glliveshader.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/glliveshader-glliveshader.Tpo $(DEPDIR)/glliveshader-glliveshader.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='glliveshader.c' object='glliveshader-glliveshader.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(glliveshader_CFLAGS) $(CFLAGS) -c -o glliveshader-glliveshader.obj `if test -f 'glliveshader.c'; then $(CYGPATH_W) 'glliveshader.c'; else $(CYGPATH_W) '$(srcdir)/glliveshader.c'; fi`
+
 gtkglsink-gtkglsink.o: gtkglsink.c
 @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkglsink_CFLAGS) $(CFLAGS) -MT gtkglsink-gtkglsink.o -MD -MP -MF $(DEPDIR)/gtkglsink-gtkglsink.Tpo -c -o gtkglsink-gtkglsink.o `test -f 'gtkglsink.c' || echo '$(srcdir)/'`gtkglsink.c
 @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gtkglsink-gtkglsink.Tpo $(DEPDIR)/gtkglsink-gtkglsink.Po
diff --git a/tests/examples/gtk/glliveshader.c b/tests/examples/gtk/glliveshader.c
new file mode 100644
index 0000000..d8c8d35
--- /dev/null
+++ b/tests/examples/gtk/glliveshader.c
@@ -0,0 +1,345 @@
+/*
+ * GStreamer
+ * Copyright (C) 2015 Matthew Waters <matthew@centricular.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 <gst/gst.h>
+#include <gst/gl/gl.h>
+#include <gtk/gtk.h>
+#if GST_GL_HAVE_WINDOW_X11
+#include <X11/Xlib.h>
+#endif
+
+static GMainLoop *loop;
+
+static const gchar *vert = "#version 330\n\
+in vec4 a_position;\n\
+in vec2 a_texcoord;\n\
+out vec2 v_texcoord;\n\
+uniform float time;\n\
+uniform float width;\n\
+uniform float height;\n\
+void main()\n\
+{\n\
+  gl_Position = a_position;\n\
+  v_texcoord = a_texcoord;\n\
+}\n";
+
+static const gchar *geom = "#version 330\n\
+\n\
+layout(triangles) in;\n\
+layout(triangle_strip, max_vertices = 3) out;\n\
+in vec2 v_texcoord[];\n\
+out vec2 g_texcoord;\n\
+\n\
+void main() {\n\
+  for(int i = 0; i < 3; i++) {\n\
+    gl_Position = gl_in[i].gl_Position;\n\
+    g_texcoord = v_texcoord[i];\n\
+    EmitVertex();\n\
+  }\n\
+  EndPrimitive();\n\
+}\n";
+
+static const gchar *frag = "#version 330\n\
+in vec2 g_texcoord;\n\
+uniform sampler2D tex;\n\
+uniform float time;\n\
+uniform float width;\n\
+uniform float height;\n\
+void main()\n\
+{\n\
+  gl_FragColor = texture2D(tex, g_texcoord);\n\
+}\n";
+
+#define MAX_SHADER_STAGES 8
+struct shader_state;
+
+struct text_view_state
+{
+  struct shader_state *state;
+
+  GLenum type;
+  gchar *str;
+};
+
+struct shader_state
+{
+  GstGLContext *context;
+  GstElement *shader;
+  gboolean shader_linked;
+  GtkWidget *label;
+  struct text_view_state text_states[MAX_SHADER_STAGES];
+  gint n_stages;
+};
+
+static gboolean
+bus_call (GstBus * bus, GstMessage * msg, gpointer data)
+{
+  switch (GST_MESSAGE_TYPE (msg)) {
+    case GST_MESSAGE_EOS:
+      g_print ("End of stream\n");
+      g_main_loop_quit (loop);
+      break;
+    case GST_MESSAGE_ERROR:{
+      gchar *debug;
+      GError *error;
+
+      gst_message_parse_error (msg, &error, &debug);
+      g_free (debug);
+
+      g_printerr ("Error: %s\n", error->message);
+      g_error_free (error);
+
+      g_main_loop_quit (loop);
+      break;
+    }
+    default:
+      break;
+  }
+
+  return TRUE;
+}
+
+static gchar *
+_find_source_for_shader_type (struct shader_state *state, GLenum type)
+{
+  int i = 0;
+
+  for (i = 0; i < state->n_stages; i++) {
+    if (state->text_states[i].type == type)
+      return state->text_states[i].str;
+  }
+
+  return NULL;
+}
+
+static gboolean
+_add_stage_to_shader (GstGLShader * shader, struct shader_state *state,
+    GLenum type, const gchar * default_src)
+{
+  GError *error = NULL;
+  GstGLSLVersion version;
+  GstGLSLProfile profile;
+  GstGLSLStage *stage;
+  const gchar *src;
+
+  src = _find_source_for_shader_type (state, type);
+  if (!src)
+    src = default_src;
+  if (!src)
+    /* FIXME: assume this stage is not needed */
+    return TRUE;
+
+  if (!gst_glsl_string_get_version_profile (src, &version, &profile)) {
+    g_print ("Warning: failed to retreive GLSL version and profile for "
+        "shader type 0x%x\nsrc:\n%s\n", type, src);
+  }
+
+  if (!(stage = gst_glsl_stage_new_with_string (shader->context, type,
+              version, profile, src))) {
+    g_print ("Error: Failed to create GLSL Stage from src:\n%s\n", src);
+    return FALSE;
+  }
+
+  if (!gst_gl_shader_compile_attach_stage (shader, stage, &error)) {
+    /* ignore failed shader compilations */
+    g_print ("%s", error->message);
+    return FALSE;
+  }
+
+  return TRUE;
+}
+
+static GstGLShader *
+_new_shader (GstGLContext * context, struct shader_state *state)
+{
+  GstGLShader *shader = gst_gl_shader_new (context);
+  GError *error = NULL;
+
+  if (!_add_stage_to_shader (shader, state, GL_VERTEX_SHADER, vert)) {
+    gst_object_unref (shader);
+    return NULL;
+  }
+  if (!_add_stage_to_shader (shader, state, GL_GEOMETRY_SHADER, geom)) {
+    gst_object_unref (shader);
+    return NULL;
+  }
+  if (!_add_stage_to_shader (shader, state, GL_FRAGMENT_SHADER, frag)) {
+    gst_object_unref (shader);
+    return NULL;
+  }
+
+  if (!gst_gl_shader_link (shader, &error)) {
+    /* ignore failed shader compilations */
+    g_print ("%s", error->message);
+    gst_object_unref (shader);
+    return NULL;
+  }
+
+  return shader;
+}
+
+static gboolean
+_set_compilation_state (struct shader_state *state)
+{
+  gtk_label_set_text (GTK_LABEL (state->label),
+      state->shader_linked ? "Success" : "Failure");
+
+  return G_SOURCE_REMOVE;
+}
+
+static GstGLShader *
+_create_shader (GstElement * element, struct shader_state *state)
+{
+  GstGLContext *context;
+  GstGLShader *shader, *new_shader;
+
+  g_object_get (G_OBJECT (element), "context", &context, "shader", &shader,
+      NULL);
+
+  new_shader = _new_shader (context, state);
+  if (!shader && !new_shader)
+    g_warning ("Failed to create a shader!");
+  state->shader_linked = new_shader != NULL;
+
+  if (shader)
+    gst_object_unref (shader);
+  gst_object_unref (context);
+
+  g_main_context_invoke (NULL, (GSourceFunc) _set_compilation_state, state);
+
+  return new_shader;
+}
+
+static void
+_on_text_changed (GtkTextBuffer * text, struct text_view_state *state)
+{
+  GtkTextIter start, end;
+
+  gtk_text_buffer_get_bounds (text, &start, &end);
+  g_free (state->str);
+  state->str = gtk_text_buffer_get_text (text, &start, &end, FALSE);
+  g_object_set (state->state->shader, "update-shader", TRUE, NULL);
+}
+
+static GtkWidget *
+_new_source_view (struct shader_state *state, GLenum type, const gchar * templ)
+{
+  static int i = 0;
+  GtkWidget *scroll, *text_view;
+  GtkTextBuffer *text;
+
+  g_return_val_if_fail (i < MAX_SHADER_STAGES, NULL);
+
+  state->text_states[i].state = state;
+  state->text_states[i].type = type;
+  state->text_states[i].str = g_strdup (templ);
+
+  scroll = gtk_scrolled_window_new (NULL, NULL);
+  gtk_widget_set_size_request (scroll, 20, 20);
+  text_view = gtk_text_view_new ();
+  gtk_container_add (GTK_CONTAINER (scroll), text_view);
+  text = gtk_text_view_get_buffer (GTK_TEXT_VIEW (text_view));
+  if (state->text_states[i].str)
+    gtk_text_buffer_set_text (text, state->text_states[i].str, -1);
+  g_signal_connect (text, "changed", G_CALLBACK (_on_text_changed),
+      &state->text_states[i]);
+  state->n_stages++;
+  i++;
+
+  return scroll;
+}
+
+int
+main (int argc, char *argv[])
+{
+  GstElement *pipeline, *src, *upload, *shader, *sink;
+  GtkWidget *window, *paned, *video, *right_box, *book;
+  struct shader_state state = { 0, };
+  GstBus *bus;
+
+#if GST_GL_HAVE_WINDOW_X11
+  XInitThreads ();
+#endif
+
+  gst_init (&argc, &argv);
+  gtk_init (&argc, &argv);
+
+  loop = g_main_loop_new (NULL, FALSE);
+
+  pipeline = gst_pipeline_new (NULL);
+  src = gst_element_factory_make ("videotestsrc", NULL);
+  upload = gst_element_factory_make ("glupload", NULL);
+  shader = gst_element_factory_make ("glshader", NULL);
+  sink = gst_element_factory_make ("gtkglsink", NULL);
+  g_object_get (sink, "widget", &video, NULL);
+
+  g_assert (src && shader && sink);
+  gst_bin_add_many (GST_BIN (pipeline), src, upload, shader, sink, NULL);
+  g_assert (gst_element_link_many (src, upload, shader, sink, NULL));
+
+  bus = gst_pipeline_get_bus (GST_PIPELINE (pipeline));
+  gst_bus_add_watch (bus, bus_call, loop);
+  gst_object_unref (bus);
+
+  state.shader = gst_object_ref (shader);
+  g_signal_connect (shader, "create-shader", G_CALLBACK (_create_shader),
+      &state);
+
+  book = gtk_notebook_new ();
+  /* text view inside a scroll view */
+  gtk_notebook_append_page (GTK_NOTEBOOK (book), _new_source_view (&state,
+          GL_VERTEX_SHADER, vert), gtk_label_new ("Vertex"));
+  gtk_notebook_append_page (GTK_NOTEBOOK (book), _new_source_view (&state,
+          GL_GEOMETRY_SHADER, geom), gtk_label_new ("Geometry"));
+  gtk_notebook_append_page (GTK_NOTEBOOK (book), _new_source_view (&state,
+          GL_FRAGMENT_SHADER, frag), gtk_label_new ("Fragment"));
+  /* status label */
+  state.label = gtk_label_new ("Success");
+
+  /* right side source code editor */
+  right_box = gtk_box_new (GTK_ORIENTATION_VERTICAL, 0);
+  gtk_box_pack_start (GTK_BOX (right_box), book, TRUE, TRUE, 0);
+  gtk_box_pack_start (GTK_BOX (right_box), state.label, FALSE, TRUE, 0);
+
+  paned = gtk_paned_new (GTK_ORIENTATION_HORIZONTAL);
+  gtk_paned_pack1 (GTK_PANED (paned), video, TRUE, FALSE);
+  gtk_widget_set_size_request (video, 20, 20);
+  gtk_paned_pack2 (GTK_PANED (paned), right_box, TRUE, FALSE);
+
+  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+  gtk_window_set_default_size (GTK_WINDOW (window), 640, 480);
+  gtk_container_add (GTK_CONTAINER (window), paned);
+
+  gtk_widget_show_all (window);
+
+  gst_element_set_state (pipeline, GST_STATE_PLAYING);
+
+  g_main_loop_run (loop);
+
+  gst_element_set_state (pipeline, GST_STATE_NULL);
+
+  /*shader strings leaked here */
+  /*g_free (state.str); */
+  gst_object_unref (state.shader);
+
+  gst_object_unref (pipeline);
+
+  return 0;
+}
diff --git a/tests/examples/mpegts/Makefile.in b/tests/examples/mpegts/Makefile.in
index aed3e35..ebc4115 100644
--- a/tests/examples/mpegts/Makefile.in
+++ b/tests/examples/mpegts/Makefile.in
@@ -241,6 +241,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -278,6 +280,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -305,6 +309,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -323,6 +329,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -333,6 +341,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -358,6 +368,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -383,6 +395,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -514,6 +528,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -571,8 +587,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -642,6 +662,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/mxf/Makefile.in b/tests/examples/mxf/Makefile.in
index 920ee34..9fbc215 100644
--- a/tests/examples/mxf/Makefile.in
+++ b/tests/examples/mxf/Makefile.in
@@ -246,6 +246,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -283,6 +285,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -310,6 +314,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -328,6 +334,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -338,6 +346,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -363,6 +373,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -388,6 +400,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -519,6 +533,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -576,8 +592,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -647,6 +667,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/mxf/mxfdemux-structure.c b/tests/examples/mxf/mxfdemux-structure.c
index 1a802a7..a24a310 100644
--- a/tests/examples/mxf/mxfdemux-structure.c
+++ b/tests/examples/mxf/mxfdemux-structure.c
@@ -182,6 +182,7 @@
   GstElement *bin = (GstElement *) gst_element_get_parent (src);
 
   gst_bin_add (GST_BIN (bin), fakesink);
+  gst_element_sync_state_with_parent (fakesink);
 
   gst_pad_link (pad, sinkpad);
 
@@ -244,7 +245,10 @@
   gtk_container_add (GTK_CONTAINER (window), scrolled_window);
   gtk_widget_show_all (window);
 
-  gst_element_set_state (pipeline, GST_STATE_PLAYING);
+  if (gst_element_set_state (pipeline,
+          GST_STATE_PLAYING) == GST_STATE_CHANGE_FAILURE) {
+    g_error ("Failed to change state to PLAYING");
+  }
 
   gtk_main ();
 
diff --git a/tests/examples/opencv/Makefile.in b/tests/examples/opencv/Makefile.in
index 1da21a7..db3e33d 100644
--- a/tests/examples/opencv/Makefile.in
+++ b/tests/examples/opencv/Makefile.in
@@ -263,6 +263,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -300,6 +302,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -327,6 +331,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -345,6 +351,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -355,6 +363,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -380,6 +390,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -405,6 +417,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -536,6 +550,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -593,8 +609,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -664,6 +684,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/opencv/gstfacedetect_test.c b/tests/examples/opencv/gstfacedetect_test.c
index 8ccbda0..9ecf3d0 100644
--- a/tests/examples/opencv/gstfacedetect_test.c
+++ b/tests/examples/opencv/gstfacedetect_test.c
@@ -154,6 +154,8 @@
   g_option_context_add_group (ctx, gst_init_get_option_group ());
   if (!g_option_context_parse (ctx, &argc, &argv, &err)) {
     g_print ("Error initializing: %s\n", err->message);
+    g_option_context_free (ctx);
+    g_clear_error (&err);
     exit (1);
   }
   g_option_context_free (ctx);
diff --git a/tests/examples/playout.c b/tests/examples/playout.c
index c85509a..07048d8 100644
--- a/tests/examples/playout.c
+++ b/tests/examples/playout.c
@@ -680,7 +680,7 @@
   uri = gst_filename_to_uri (item->fn, &err);
   if (err != NULL) {
     GST_WARNING ("Could not convert '%s' to uri: %s", item->fn, err->message);
-    g_error_free (err);
+    g_clear_error (&err);
     return NULL;
   }
 
@@ -1064,6 +1064,8 @@
       g_printerr ("Error initializing: %s\n", err->message);
     else
       g_printerr ("Error initializing: Unknown error!\n");
+    g_option_context_free (ctx);
+    g_clear_error (&err);
     return 1;
   }
 
diff --git a/tests/examples/uvch264/Makefile.in b/tests/examples/uvch264/Makefile.in
index 1bf3a1a..4c818eb 100644
--- a/tests/examples/uvch264/Makefile.in
+++ b/tests/examples/uvch264/Makefile.in
@@ -249,6 +249,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -286,6 +288,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -313,6 +317,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -331,6 +337,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -341,6 +349,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -366,6 +376,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -391,6 +403,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -522,6 +536,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -579,8 +595,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -650,6 +670,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/examples/waylandsink/Makefile.am b/tests/examples/waylandsink/Makefile.am
new file mode 100644
index 0000000..f5ba921
--- /dev/null
+++ b/tests/examples/waylandsink/Makefile.am
@@ -0,0 +1,11 @@
+noinst_PROGRAMS = gtkwaylandsink
+
+gtkwaylandsink_SOURCES = main.c
+
+gtkwaylandsink_CFLAGS=-I$(top_srcdir)/gst-libs -I$(top_builddir)/gst-libs \
+	$(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(GTK3_CFLAGS)
+gtkwaylandsink_LDADD=$(GTK3_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \
+	-lgstvideo-$(GST_API_VERSION) \
+	$(top_builddir)/gst-libs/gst/wayland/libgstwayland-$(GST_API_VERSION).la
+
+EXTRA_DIST = window.ui
diff --git a/gst/liveadder/Makefile.in b/tests/examples/waylandsink/Makefile.in
similarity index 83%
copy from gst/liveadder/Makefile.in
copy to tests/examples/waylandsink/Makefile.in
index ba9e5a2..7261411 100644
--- a/gst/liveadder/Makefile.in
+++ b/tests/examples/waylandsink/Makefile.in
@@ -14,7 +14,6 @@
 
 @SET_MAKE@
 
-
 VPATH = @srcdir@
 am__is_gnu_make = { \
   if test -z '$(MAKELEVEL)'; then \
@@ -90,7 +89,8 @@
 build_triplet = @build@
 host_triplet = @host@
 target_triplet = @target@
-subdir = gst/liveadder
+noinst_PROGRAMS = gtkwaylandsink$(EXEEXT)
+subdir = tests/examples/waylandsink
 ACLOCAL_M4 = $(top_srcdir)/aclocal.m4
 am__aclocal_m4_deps = $(top_srcdir)/common/m4/as-ac-expand.m4 \
 	$(top_srcdir)/common/m4/as-auto-alt.m4 \
@@ -128,54 +128,26 @@
 	$(top_srcdir)/configure.ac
 am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \
 	$(ACLOCAL_M4)
-DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \
-	$(am__DIST_COMMON)
+DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)
 mkinstalldirs = $(install_sh) -d
 CONFIG_HEADER = $(top_builddir)/config.h
 CONFIG_CLEAN_FILES =
 CONFIG_CLEAN_VPATH_FILES =
-am__vpath_adj_setup = srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`;
-am__vpath_adj = case $$p in \
-    $(srcdir)/*) f=`echo "$$p" | sed "s|^$$srcdirstrip/||"`;; \
-    *) f=$$p;; \
-  esac;
-am__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;
-am__install_max = 40
-am__nobase_strip_setup = \
-  srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*|]/\\\\&/g'`
-am__nobase_strip = \
-  for p in $$list; do echo "$$p"; done | sed -e "s|$$srcdirstrip/||"
-am__nobase_list = $(am__nobase_strip_setup); \
-  for p in $$list; do echo "$$p $$p"; done | \
-  sed "s| $$srcdirstrip/| |;"' / .*\//!s/ .*/ ./; s,\( .*\)/[^/]*$$,\1,' | \
-  $(AWK) 'BEGIN { files["."] = "" } { files[$$2] = files[$$2] " " $$1; \
-    if (++n[$$2] == $(am__install_max)) \
-      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = "" } } \
-    END { for (dir in files) print dir, files[dir] }'
-am__base_list = \
-  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\n/ /g' | \
-  sed '$$!N;$$!N;$$!N;$$!N;s/\n/ /g'
-am__uninstall_files_from_dir = { \
-  test -z "$$files" \
-    || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \
-    || { echo " ( cd '$$dir' && rm -f" $$files ")"; \
-         $(am__cd) "$$dir" && rm -f $$files; }; \
-  }
-am__installdirs = "$(DESTDIR)$(plugindir)"
-LTLIBRARIES = $(plugin_LTLIBRARIES)
+PROGRAMS = $(noinst_PROGRAMS)
+am_gtkwaylandsink_OBJECTS = gtkwaylandsink-main.$(OBJEXT)
+gtkwaylandsink_OBJECTS = $(am_gtkwaylandsink_OBJECTS)
 am__DEPENDENCIES_1 =
-libgstliveadder_la_DEPENDENCIES = $(am__DEPENDENCIES_1) \
-	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1)
-am_libgstliveadder_la_OBJECTS = libgstliveadder_la-liveadder.lo
-libgstliveadder_la_OBJECTS = $(am_libgstliveadder_la_OBJECTS)
+gtkwaylandsink_DEPENDENCIES = $(am__DEPENDENCIES_1) \
+	$(am__DEPENDENCIES_1) $(am__DEPENDENCIES_1) \
+	$(top_builddir)/gst-libs/gst/wayland/libgstwayland-$(GST_API_VERSION).la
 AM_V_lt = $(am__v_lt_@AM_V@)
 am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)
 am__v_lt_0 = --silent
 am__v_lt_1 = 
-libgstliveadder_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
-	$(libgstliveadder_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link \
-	$(CCLD) $(libgstliveadder_la_CFLAGS) $(CFLAGS) \
-	$(libgstliveadder_la_LDFLAGS) $(LDFLAGS) -o $@
+gtkwaylandsink_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \
+	$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \
+	$(gtkwaylandsink_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o \
+	$@
 AM_V_P = $(am__v_P_@AM_V@)
 am__v_P_ = $(am__v_P_@AM_DEFAULT_V@)
 am__v_P_0 = false
@@ -210,14 +182,13 @@
 am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)
 am__v_CCLD_0 = @echo "  CCLD    " $@;
 am__v_CCLD_1 = 
-SOURCES = $(libgstliveadder_la_SOURCES)
-DIST_SOURCES = $(libgstliveadder_la_SOURCES)
+SOURCES = $(gtkwaylandsink_SOURCES)
+DIST_SOURCES = $(gtkwaylandsink_SOURCES)
 am__can_run_installinfo = \
   case $$AM_UPDATE_INFO_DIR in \
     n|no|NO) false;; \
     *) (install-info --version) >/dev/null 2>&1;; \
   esac
-HEADERS = $(noinst_HEADERS)
 am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)
 # Read a list of newline-separated strings from the standard input,
 # and print each of them once, without duplicates.  Input order is
@@ -274,6 +245,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -311,6 +284,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -338,6 +313,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -356,6 +333,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -366,6 +345,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -391,6 +372,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -416,6 +399,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -547,6 +532,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -604,8 +591,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -675,6 +666,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
@@ -761,16 +753,15 @@
 top_builddir = @top_builddir@
 top_srcdir = @top_srcdir@
 wayland_scanner = @wayland_scanner@
-plugin_LTLIBRARIES = libgstliveadder.la
-libgstliveadder_la_SOURCES = liveadder.c
-libgstliveadder_la_CFLAGS = $(GST_PLUGINS_BAD_CFLAGS) $(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS)
-libgstliveadder_la_LIBADD = \
-	$(GST_PLUGINS_BASE_LIBS) -lgstaudio-@GST_API_VERSION@ \
-	$(GST_BASE_LIBS) $(GST_LIBS)
+gtkwaylandsink_SOURCES = main.c
+gtkwaylandsink_CFLAGS = -I$(top_srcdir)/gst-libs -I$(top_builddir)/gst-libs \
+	$(GST_PLUGINS_BASE_CFLAGS) $(GST_CFLAGS) $(GTK3_CFLAGS)
 
-libgstliveadder_la_LDFLAGS = $(GST_PLUGIN_LDFLAGS)
-libgstliveadder_la_LIBTOOLFLAGS = $(GST_PLUGIN_LIBTOOLFLAGS)
-noinst_HEADERS = liveadder.h
+gtkwaylandsink_LDADD = $(GTK3_LIBS) $(GST_PLUGINS_BASE_LIBS) $(GST_LIBS) \
+	-lgstvideo-$(GST_API_VERSION) \
+	$(top_builddir)/gst-libs/gst/wayland/libgstwayland-$(GST_API_VERSION).la
+
+EXTRA_DIST = window.ui
 all: all-am
 
 .SUFFIXES:
@@ -784,9 +775,9 @@
 	      exit 1;; \
 	  esac; \
 	done; \
-	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu gst/liveadder/Makefile'; \
+	echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/examples/waylandsink/Makefile'; \
 	$(am__cd) $(top_srcdir) && \
-	  $(AUTOMAKE) --gnu gst/liveadder/Makefile
+	  $(AUTOMAKE) --gnu tests/examples/waylandsink/Makefile
 Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status
 	@case '$?' in \
 	  *config.status*) \
@@ -805,43 +796,18 @@
 	cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh
 $(am__aclocal_m4_deps):
 
-install-pluginLTLIBRARIES: $(plugin_LTLIBRARIES)
-	@$(NORMAL_INSTALL)
-	@list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \
-	list2=; for p in $$list; do \
-	  if test -f $$p; then \
-	    list2="$$list2 $$p"; \
-	  else :; fi; \
-	done; \
-	test -z "$$list2" || { \
-	  echo " $(MKDIR_P) '$(DESTDIR)$(plugindir)'"; \
-	  $(MKDIR_P) "$(DESTDIR)$(plugindir)" || exit 1; \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(plugindir)'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(plugindir)"; \
-	}
+clean-noinstPROGRAMS:
+	@list='$(noinst_PROGRAMS)'; test -n "$$list" || exit 0; \
+	echo " rm -f" $$list; \
+	rm -f $$list || exit $$?; \
+	test -n "$(EXEEXT)" || exit 0; \
+	list=`for p in $$list; do echo "$$p"; done | sed 's/$(EXEEXT)$$//'`; \
+	echo " rm -f" $$list; \
+	rm -f $$list
 
-uninstall-pluginLTLIBRARIES:
-	@$(NORMAL_UNINSTALL)
-	@list='$(plugin_LTLIBRARIES)'; test -n "$(plugindir)" || list=; \
-	for p in $$list; do \
-	  $(am__strip_dir) \
-	  echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(plugindir)/$$f'"; \
-	  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(plugindir)/$$f"; \
-	done
-
-clean-pluginLTLIBRARIES:
-	-test -z "$(plugin_LTLIBRARIES)" || rm -f $(plugin_LTLIBRARIES)
-	@list='$(plugin_LTLIBRARIES)'; \
-	locs=`for p in $$list; do echo $$p; done | \
-	      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \
-	      sort -u`; \
-	test -z "$$locs" || { \
-	  echo rm -f $${locs}; \
-	  rm -f $${locs}; \
-	}
-
-libgstliveadder.la: $(libgstliveadder_la_OBJECTS) $(libgstliveadder_la_DEPENDENCIES) $(EXTRA_libgstliveadder_la_DEPENDENCIES) 
-	$(AM_V_CCLD)$(libgstliveadder_la_LINK) -rpath $(plugindir) $(libgstliveadder_la_OBJECTS) $(libgstliveadder_la_LIBADD) $(LIBS)
+gtkwaylandsink$(EXEEXT): $(gtkwaylandsink_OBJECTS) $(gtkwaylandsink_DEPENDENCIES) $(EXTRA_gtkwaylandsink_DEPENDENCIES) 
+	@rm -f gtkwaylandsink$(EXEEXT)
+	$(AM_V_CCLD)$(gtkwaylandsink_LINK) $(gtkwaylandsink_OBJECTS) $(gtkwaylandsink_LDADD) $(LIBS)
 
 mostlyclean-compile:
 	-rm -f *.$(OBJEXT)
@@ -849,7 +815,7 @@
 distclean-compile:
 	-rm -f *.tab.c
 
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libgstliveadder_la-liveadder.Plo@am__quote@
+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gtkwaylandsink-main.Po@am__quote@
 
 .c.o:
 @am__fastdepCC_TRUE@	$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
@@ -875,12 +841,19 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<
 
-libgstliveadder_la-liveadder.lo: liveadder.c
-@am__fastdepCC_TRUE@	$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstliveadder_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstliveadder_la_CFLAGS) $(CFLAGS) -MT libgstliveadder_la-liveadder.lo -MD -MP -MF $(DEPDIR)/libgstliveadder_la-liveadder.Tpo -c -o libgstliveadder_la-liveadder.lo `test -f 'liveadder.c' || echo '$(srcdir)/'`liveadder.c
-@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/libgstliveadder_la-liveadder.Tpo $(DEPDIR)/libgstliveadder_la-liveadder.Plo
-@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='liveadder.c' object='libgstliveadder_la-liveadder.lo' libtool=yes @AMDEPBACKSLASH@
+gtkwaylandsink-main.o: main.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkwaylandsink_CFLAGS) $(CFLAGS) -MT gtkwaylandsink-main.o -MD -MP -MF $(DEPDIR)/gtkwaylandsink-main.Tpo -c -o gtkwaylandsink-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gtkwaylandsink-main.Tpo $(DEPDIR)/gtkwaylandsink-main.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='main.c' object='gtkwaylandsink-main.o' libtool=no @AMDEPBACKSLASH@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(libgstliveadder_la_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libgstliveadder_la_CFLAGS) $(CFLAGS) -c -o libgstliveadder_la-liveadder.lo `test -f 'liveadder.c' || echo '$(srcdir)/'`liveadder.c
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkwaylandsink_CFLAGS) $(CFLAGS) -c -o gtkwaylandsink-main.o `test -f 'main.c' || echo '$(srcdir)/'`main.c
+
+gtkwaylandsink-main.obj: main.c
+@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkwaylandsink_CFLAGS) $(CFLAGS) -MT gtkwaylandsink-main.obj -MD -MP -MF $(DEPDIR)/gtkwaylandsink-main.Tpo -c -o gtkwaylandsink-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi`
+@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/gtkwaylandsink-main.Tpo $(DEPDIR)/gtkwaylandsink-main.Po
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='main.c' object='gtkwaylandsink-main.obj' libtool=no @AMDEPBACKSLASH@
+@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(gtkwaylandsink_CFLAGS) $(CFLAGS) -c -o gtkwaylandsink-main.obj `if test -f 'main.c'; then $(CYGPATH_W) 'main.c'; else $(CYGPATH_W) '$(srcdir)/main.c'; fi`
 
 mostlyclean-libtool:
 	-rm -f *.lo
@@ -972,11 +945,8 @@
 	done
 check-am: all-am
 check: check-am
-all-am: Makefile $(LTLIBRARIES) $(HEADERS)
+all-am: Makefile $(PROGRAMS)
 installdirs:
-	for dir in "$(DESTDIR)$(plugindir)"; do \
-	  test -z "$$dir" || $(MKDIR_P) "$$dir"; \
-	done
 install: install-am
 install-exec: install-exec-am
 install-data: install-data-am
@@ -1009,7 +979,7 @@
 	@echo "it deletes files that may require special tools to rebuild."
 clean: clean-am
 
-clean-am: clean-generic clean-libtool clean-pluginLTLIBRARIES \
+clean-am: clean-generic clean-libtool clean-noinstPROGRAMS \
 	mostlyclean-am
 
 distclean: distclean-am
@@ -1030,7 +1000,7 @@
 
 info-am:
 
-install-data-am: install-pluginLTLIBRARIES
+install-data-am:
 
 install-dvi: install-dvi-am
 
@@ -1076,24 +1046,23 @@
 
 ps-am:
 
-uninstall-am: uninstall-pluginLTLIBRARIES
+uninstall-am:
 
 .MAKE: install-am install-strip
 
 .PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \
-	clean-libtool clean-pluginLTLIBRARIES cscopelist-am ctags \
+	clean-libtool clean-noinstPROGRAMS cscopelist-am ctags \
 	ctags-am distclean distclean-compile distclean-generic \
 	distclean-libtool distclean-tags distdir dvi dvi-am html \
 	html-am info info-am install install-am install-data \
 	install-data-am install-dvi install-dvi-am install-exec \
 	install-exec-am install-html install-html-am install-info \
 	install-info-am install-man install-pdf install-pdf-am \
-	install-pluginLTLIBRARIES install-ps install-ps-am \
-	install-strip installcheck installcheck-am installdirs \
-	maintainer-clean maintainer-clean-generic mostlyclean \
-	mostlyclean-compile mostlyclean-generic mostlyclean-libtool \
-	pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \
-	uninstall-pluginLTLIBRARIES
+	install-ps install-ps-am install-strip installcheck \
+	installcheck-am installdirs maintainer-clean \
+	maintainer-clean-generic mostlyclean mostlyclean-compile \
+	mostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \
+	tags tags-am uninstall uninstall-am
 
 .PRECIOUS: Makefile
 
diff --git a/tests/examples/waylandsink/main.c b/tests/examples/waylandsink/main.c
new file mode 100644
index 0000000..2f9bf89
--- /dev/null
+++ b/tests/examples/waylandsink/main.c
@@ -0,0 +1,279 @@
+/*
+ * Copyright (C) 2014-2015 Collabora Ltd.
+ *   @author George Kiagiadakis <george.kiagiadakis@collabora.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 <gst/gst.h>
+#include <gtk/gtk.h>
+#include <gdk/gdk.h>
+
+#ifdef GDK_WINDOWING_WAYLAND
+#include <gdk/gdkwayland.h>
+#else
+#error "Wayland is not supported in GTK+"
+#endif
+
+#include <gst/video/videooverlay.h>
+#include <gst/wayland/wayland.h>
+
+
+static gboolean live = FALSE;
+
+static GOptionEntry entries[] = {
+  {"live", 'l', 0, G_OPTION_ARG_NONE, &live, "Use a live source", NULL},
+  {NULL}
+};
+
+typedef struct
+{
+  GtkWidget *app_widget;
+  GtkWidget *video_widget;
+
+  GstElement *pipeline;
+  GstVideoOverlay *overlay;
+
+  gchar **argv;
+  gint current_uri;             /* index for argv */
+} DemoApp;
+
+static void
+on_about_to_finish (GstElement * playbin, DemoApp * d)
+{
+  if (d->argv[++d->current_uri] == NULL)
+    d->current_uri = 1;
+
+  g_print ("Now playing %s\n", d->argv[d->current_uri]);
+  g_object_set (playbin, "uri", d->argv[d->current_uri], NULL);
+}
+
+static void
+error_cb (GstBus * bus, GstMessage * msg, gpointer user_data)
+{
+  DemoApp *d = user_data;
+  gchar *debug = NULL;
+  GError *err = NULL;
+
+  gst_message_parse_error (msg, &err, &debug);
+
+  g_print ("Error: %s\n", err->message);
+  g_error_free (err);
+
+  if (debug) {
+    g_print ("Debug details: %s\n", debug);
+    g_free (debug);
+  }
+
+  gst_element_set_state (d->pipeline, GST_STATE_NULL);
+}
+
+static GstBusSyncReply
+bus_sync_handler (GstBus * bus, GstMessage * message, gpointer user_data)
+{
+  DemoApp *d = user_data;
+
+  if (gst_is_wayland_display_handle_need_context_message (message)) {
+    GstContext *context;
+    GdkDisplay *display;
+    struct wl_display *display_handle;
+
+    display = gtk_widget_get_display (d->video_widget);
+    display_handle = gdk_wayland_display_get_wl_display (display);
+    context = gst_wayland_display_handle_context_new (display_handle);
+    gst_element_set_context (GST_ELEMENT (GST_MESSAGE_SRC (message)), context);
+
+    goto drop;
+  } else if (gst_is_video_overlay_prepare_window_handle_message (message)) {
+    GtkAllocation allocation;
+    GdkWindow *window;
+    struct wl_surface *window_handle;
+
+    /* GST_MESSAGE_SRC (message) will be the overlay object that we have to
+     * use. This may be waylandsink, but it may also be playbin. In the latter
+     * case, we must make sure to use playbin instead of waylandsink, because
+     * playbin resets the window handle and render_rectangle after restarting
+     * playback and the actual window size is lost */
+    d->overlay = GST_VIDEO_OVERLAY (GST_MESSAGE_SRC (message));
+
+    gtk_widget_get_allocation (d->video_widget, &allocation);
+    window = gtk_widget_get_window (d->video_widget);
+    window_handle = gdk_wayland_window_get_wl_surface (window);
+
+    g_print ("setting window handle and size (%d x %d)\n",
+        allocation.width, allocation.height);
+
+    gst_video_overlay_set_window_handle (d->overlay, (guintptr) window_handle);
+    gst_video_overlay_set_render_rectangle (d->overlay, allocation.x,
+        allocation.y, allocation.width, allocation.height);
+
+    goto drop;
+  }
+
+  return GST_BUS_PASS;
+
+drop:
+  gst_message_unref (message);
+  return GST_BUS_DROP;
+}
+
+/* We use the "draw" callback to change the size of the sink
+ * because the "configure-event" is only sent to top-level widgets. */
+static gboolean
+video_widget_draw_cb (GtkWidget * widget, cairo_t * cr, gpointer user_data)
+{
+  DemoApp *d = user_data;
+  GtkAllocation allocation;
+
+  gtk_widget_get_allocation (widget, &allocation);
+
+  g_print ("draw_cb x %d, y %d, w %d, h %d\n",
+      allocation.x, allocation.y, allocation.width, allocation.height);
+
+  if (d->overlay) {
+    gst_video_overlay_set_render_rectangle (d->overlay, allocation.x,
+        allocation.y, allocation.width, allocation.height);
+  }
+
+  /* There is no need to call gst_video_overlay_expose().
+   * The wayland compositor can always re-draw the window
+   * based on its last contents if necessary */
+
+  return FALSE;
+}
+
+static void
+playing_clicked_cb (GtkButton * button, DemoApp * d)
+{
+  gst_element_set_state (d->pipeline, GST_STATE_PLAYING);
+}
+
+static void
+paused_clicked_cb (GtkButton * button, DemoApp * d)
+{
+  gst_element_set_state (d->pipeline, GST_STATE_PAUSED);
+}
+
+static void
+ready_clicked_cb (GtkButton * button, DemoApp * d)
+{
+  gst_element_set_state (d->pipeline, GST_STATE_READY);
+}
+
+static void
+null_clicked_cb (GtkButton * button, DemoApp * d)
+{
+  gst_element_set_state (d->pipeline, GST_STATE_NULL);
+}
+
+static void
+build_window (DemoApp * d)
+{
+  GtkBuilder *builder;
+  GtkWidget *button;
+  GError *error = NULL;
+
+  builder = gtk_builder_new ();
+  if (!gtk_builder_add_from_file (builder, "window.ui", &error)) {
+    g_error ("Failed to load window.ui: %s", error->message);
+    g_error_free (error);
+    goto exit;
+  }
+
+  d->app_widget = GTK_WIDGET (gtk_builder_get_object (builder, "window"));
+  g_object_ref (d->app_widget);
+  g_signal_connect (d->app_widget, "destroy", G_CALLBACK (gtk_main_quit), NULL);
+
+  d->video_widget = GTK_WIDGET (gtk_builder_get_object (builder, "videoarea"));
+  g_signal_connect (d->video_widget, "draw",
+      G_CALLBACK (video_widget_draw_cb), d);
+
+  button = GTK_WIDGET (gtk_builder_get_object (builder, "button_playing"));
+  g_signal_connect (button, "clicked", G_CALLBACK (playing_clicked_cb), d);
+
+  button = GTK_WIDGET (gtk_builder_get_object (builder, "button_paused"));
+  g_signal_connect (button, "clicked", G_CALLBACK (paused_clicked_cb), d);
+
+  button = GTK_WIDGET (gtk_builder_get_object (builder, "button_ready"));
+  g_signal_connect (button, "clicked", G_CALLBACK (ready_clicked_cb), d);
+
+  button = GTK_WIDGET (gtk_builder_get_object (builder, "button_null"));
+  g_signal_connect (button, "clicked", G_CALLBACK (null_clicked_cb), d);
+
+  gtk_widget_show_all (d->app_widget);
+
+exit:
+  g_object_unref (builder);
+}
+
+int
+main (int argc, char **argv)
+{
+  DemoApp *d;
+  GOptionContext *context;
+  GstBus *bus;
+  GError *error = NULL;
+
+  gtk_init (&argc, &argv);
+  gst_init (&argc, &argv);
+
+  context = g_option_context_new ("- waylandsink gtk demo");
+  g_option_context_add_main_entries (context, entries, NULL);
+  if (!g_option_context_parse (context, &argc, &argv, &error)) {
+    g_printerr ("option parsing failed: %s\n", error->message);
+    return 1;
+  }
+
+  d = g_slice_new0 (DemoApp);
+  build_window (d);
+
+  if (argc > 1) {
+    d->argv = argv;
+    d->current_uri = 1;
+
+    d->pipeline = gst_parse_launch ("playbin video-sink=waylandsink", NULL);
+    g_object_set (d->pipeline, "uri", argv[d->current_uri], NULL);
+
+    /* enable looping */
+    g_signal_connect (d->pipeline, "about-to-finish",
+        G_CALLBACK (on_about_to_finish), d);
+  } else {
+    if (live) {
+      d->pipeline = gst_parse_launch ("videotestsrc pattern=18 "
+          "background-color=0x000062FF is-live=true ! waylandsink", NULL);
+    } else {
+      d->pipeline = gst_parse_launch ("videotestsrc pattern=18 "
+          "background-color=0x000062FF ! waylandsink", NULL);
+    }
+  }
+
+  bus = gst_pipeline_get_bus (GST_PIPELINE (d->pipeline));
+  gst_bus_add_signal_watch (bus);
+  g_signal_connect (bus, "message::error", G_CALLBACK (error_cb), d);
+  gst_bus_set_sync_handler (bus, bus_sync_handler, d, NULL);
+  gst_object_unref (bus);
+
+  gst_element_set_state (d->pipeline, GST_STATE_PLAYING);
+
+  gtk_main ();
+
+  gst_element_set_state (d->pipeline, GST_STATE_NULL);
+  gst_object_unref (d->pipeline);
+  g_object_unref (d->app_widget);
+  g_slice_free (DemoApp, d);
+
+  return 0;
+}
diff --git a/tests/examples/waylandsink/window.ui b/tests/examples/waylandsink/window.ui
new file mode 100644
index 0000000..ce6cf82
--- /dev/null
+++ b/tests/examples/waylandsink/window.ui
@@ -0,0 +1,99 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!-- Generated with glade 3.18.2 -->
+<interface>
+  <requires lib="gtk+" version="3.0"/>
+  <object class="GtkWindow" id="window">
+    <property name="can_focus">False</property>
+    <property name="title" translatable="yes">GStreamer Wayland GTK Demo</property>
+    <child>
+      <object class="GtkBox" id="box">
+        <property name="visible">True</property>
+        <property name="can_focus">False</property>
+        <property name="orientation">vertical</property>
+        <child>
+          <object class="GtkEventBox" id="videoarea">
+            <property name="width_request">400</property>
+            <property name="height_request">300</property>
+            <property name="visible">True</property>
+            <property name="app_paintable">True</property>
+            <property name="can_focus">False</property>
+            <property name="double_buffered">False</property>
+            <property name="vexpand">True</property>
+            <child>
+              <placeholder/>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
+        <child>
+          <object class="GtkButtonBox" id="buttonbox">
+            <property name="visible">True</property>
+            <property name="can_focus">False</property>
+            <property name="layout_style">center</property>
+            <child>
+              <object class="GtkButton" id="button_playing">
+                <property name="label" translatable="yes">PLAYING</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="button_paused">
+                <property name="label" translatable="yes">PAUSED</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="button_ready">
+                <property name="label" translatable="yes">READY</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">2</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkButton" id="button_null">
+                <property name="label" translatable="yes">NULL</property>
+                <property name="visible">True</property>
+                <property name="can_focus">True</property>
+                <property name="receives_default">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">3</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">True</property>
+            <property name="position">1</property>
+          </packing>
+        </child>
+      </object>
+    </child>
+  </object>
+</interface>
diff --git a/tests/files/Makefile.in b/tests/files/Makefile.in
index 7550485..e987db4 100644
--- a/tests/files/Makefile.in
+++ b/tests/files/Makefile.in
@@ -188,6 +188,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -225,6 +227,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -252,6 +256,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -270,6 +276,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -280,6 +288,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -305,6 +315,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -330,6 +342,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -461,6 +475,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -518,8 +534,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -589,6 +609,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tests/icles/Makefile.in b/tests/icles/Makefile.in
index bc84a60..f92db03 100644
--- a/tests/icles/Makefile.in
+++ b/tests/icles/Makefile.in
@@ -246,6 +246,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -283,6 +285,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -310,6 +314,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -328,6 +334,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -338,6 +346,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -363,6 +373,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -388,6 +400,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -519,6 +533,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -576,8 +592,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -647,6 +667,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tools/Makefile.in b/tools/Makefile.in
index 12dbade..5847a4a 100644
--- a/tools/Makefile.in
+++ b/tools/Makefile.in
@@ -188,6 +188,8 @@
 CLUTTER_X11_LIBS = @CLUTTER_X11_LIBS@
 CPP = @CPP@
 CPPFLAGS = @CPPFLAGS@
+CUDA_CFLAGS = @CUDA_CFLAGS@
+CUDA_LIBS = @CUDA_LIBS@
 CURL_CFLAGS = @CURL_CFLAGS@
 CURL_LIBS = @CURL_LIBS@
 CXX = @CXX@
@@ -225,6 +227,8 @@
 ECHO_C = @ECHO_C@
 ECHO_N = @ECHO_N@
 ECHO_T = @ECHO_T@
+EGL_CFLAGS = @EGL_CFLAGS@
+EGL_LIBS = @EGL_LIBS@
 EGREP = @EGREP@
 ERROR_CFLAGS = @ERROR_CFLAGS@
 ERROR_CXXFLAGS = @ERROR_CXXFLAGS@
@@ -252,6 +256,8 @@
 GIO_LIBS = @GIO_LIBS@
 GIO_UNIX_CFLAGS = @GIO_UNIX_CFLAGS@
 GIO_UNIX_LIBS = @GIO_UNIX_LIBS@
+GLES2_CFLAGS = @GLES2_CFLAGS@
+GLES2_LIBS = @GLES2_LIBS@
 GLIB_CFLAGS = @GLIB_CFLAGS@
 GLIB_COMPILE_SCHEMAS = @GLIB_COMPILE_SCHEMAS@
 GLIB_EXTRA_CFLAGS = @GLIB_EXTRA_CFLAGS@
@@ -270,6 +276,8 @@
 GMODULE_NO_EXPORT_LIBS = @GMODULE_NO_EXPORT_LIBS@
 GMSGFMT = @GMSGFMT@
 GMSGFMT_015 = @GMSGFMT_015@
+GNUSTL_CFLAGS = @GNUSTL_CFLAGS@
+GNUSTL_LIBS = @GNUSTL_LIBS@
 GRAPHENE_CFLAGS = @GRAPHENE_CFLAGS@
 GRAPHENE_LIBS = @GRAPHENE_LIBS@
 GREP = @GREP@
@@ -280,6 +288,8 @@
 GSTPB_PLUGINS_DIR = @GSTPB_PLUGINS_DIR@
 GSTPB_PREFIX = @GSTPB_PREFIX@
 GST_AGE = @GST_AGE@
+GST_ALLOCATORS_CFLAGS = @GST_ALLOCATORS_CFLAGS@
+GST_ALLOCATORS_LIBS = @GST_ALLOCATORS_LIBS@
 GST_ALL_LDFLAGS = @GST_ALL_LDFLAGS@
 GST_API_VERSION = @GST_API_VERSION@
 GST_BASE_CFLAGS = @GST_BASE_CFLAGS@
@@ -305,6 +315,8 @@
 GST_OPTION_OBJCFLAGS = @GST_OPTION_OBJCFLAGS@
 GST_PACKAGE_NAME = @GST_PACKAGE_NAME@
 GST_PACKAGE_ORIGIN = @GST_PACKAGE_ORIGIN@
+GST_PBUTILS_CFLAGS = @GST_PBUTILS_CFLAGS@
+GST_PBUTILS_LIBS = @GST_PBUTILS_LIBS@
 GST_PKG_CONFIG_PATH = @GST_PKG_CONFIG_PATH@
 GST_PLUGINS_ALL = @GST_PLUGINS_ALL@
 GST_PLUGINS_BAD_CFLAGS = @GST_PLUGINS_BAD_CFLAGS@
@@ -330,6 +342,8 @@
 GST_PREFIX = @GST_PREFIX@
 GST_REVISION = @GST_REVISION@
 GST_TOOLS_DIR = @GST_TOOLS_DIR@
+GST_VIDEO_CFLAGS = @GST_VIDEO_CFLAGS@
+GST_VIDEO_LIBS = @GST_VIDEO_LIBS@
 GTK3_CFLAGS = @GTK3_CFLAGS@
 GTK3_GL_CFLAGS = @GTK3_GL_CFLAGS@
 GTK3_GL_LIBS = @GTK3_GL_LIBS@
@@ -461,6 +475,8 @@
 NETTLE_LIBS = @NETTLE_LIBS@
 NM = @NM@
 NMEDIT = @NMEDIT@
+NVENCODE_CFLAGS = @NVENCODE_CFLAGS@
+NVENCODE_LIBS = @NVENCODE_LIBS@
 OBJC = @OBJC@
 OBJCDEPMODE = @OBJCDEPMODE@
 OBJCFLAGS = @OBJCFLAGS@
@@ -518,8 +534,12 @@
 PYTHON_PLATFORM = @PYTHON_PLATFORM@
 PYTHON_PREFIX = @PYTHON_PREFIX@
 PYTHON_VERSION = @PYTHON_VERSION@
+QT_ANDROID_CFLAGS = @QT_ANDROID_CFLAGS@
+QT_ANDROID_LIBS = @QT_ANDROID_LIBS@
 QT_CFLAGS = @QT_CFLAGS@
 QT_LIBS = @QT_LIBS@
+QT_MAC_CFLAGS = @QT_MAC_CFLAGS@
+QT_MAC_LIBS = @QT_MAC_LIBS@
 QT_WAYLAND_CFLAGS = @QT_WAYLAND_CFLAGS@
 QT_WAYLAND_LIBS = @QT_WAYLAND_LIBS@
 QT_X11_CFLAGS = @QT_X11_CFLAGS@
@@ -589,6 +609,7 @@
 WAYLAND_LIBS = @WAYLAND_LIBS@
 WEBP_CFLAGS = @WEBP_CFLAGS@
 WEBP_LIBS = @WEBP_LIBS@
+WGET = @WGET@
 WILDMIDI_CFLAGS = @WILDMIDI_CFLAGS@
 WILDMIDI_LIBS = @WILDMIDI_LIBS@
 WINKS_LIBS = @WINKS_LIBS@
diff --git a/tools/gst-app-maker b/tools/gst-app-maker
index 786cd64..f3c3d1f 100755
--- a/tools/gst-app-maker
+++ b/tools/gst-app-maker
@@ -151,6 +151,8 @@
   g_option_context_add_group (context, gst_init_get_option_group ());
   if (!g_option_context_parse (context, &argc, &argv, &error)) {
     g_print ("option parsing failed: %s\n", error->message);
+    g_clear_error (&error);
+    g_option_context_free (context);
     exit (1);
   }
   g_option_context_free (context);
@@ -223,6 +225,7 @@
 
   if (error) {
     g_print("pipeline parsing error: %s\n", error->message);
+    g_clear_error (&error);
     gst_object_unref (pipeline);
     return;
   }
@@ -262,6 +265,7 @@
 
   if (error) {
     g_print("pipeline parsing error: %s\n", error->message);
+    g_clear_error (&error);
     gst_object_unref (pipeline);
     return;
   }
@@ -378,6 +382,7 @@
 
         gst_message_parse_error (message, &error, &debug);
         gst_replace_handle_error (replace, error, debug);
+        g_clear_error (&error);
       }
       break;
     case GST_MESSAGE_WARNING:
@@ -387,6 +392,7 @@
 
         gst_message_parse_warning (message, &error, &debug);
         gst_replace_handle_warning (replace, error, debug);
+        g_clear_error (&error);
       }
       break;
     case GST_MESSAGE_INFO:
@@ -396,6 +402,7 @@
 
         gst_message_parse_info (message, &error, &debug);
         gst_replace_handle_info (replace, error, debug);
+        g_clear_error (&error);
       }
       break;
     case GST_MESSAGE_TAG:
diff --git a/tools/gst-element-maker b/tools/gst-element-maker
index facb242..cefd64a 100755
--- a/tools/gst-element-maker
+++ b/tools/gst-element-maker
@@ -116,7 +116,7 @@
  * <refsect2>
  * <title>Example launch line</title>
  * |[
- * gst-launch -v fakesrc ! $replace ! FIXME ! fakesink
+ * gst-launch-1.0 -v fakesrc ! $replace ! FIXME ! fakesink
  * ]|
  * FIXME Describe what the pipeline does.
  * </refsect2>
diff --git a/win32/common/config.h b/win32/common/config.h
index 7851cc8..05996f5 100644
--- a/win32/common/config.h
+++ b/win32/common/config.h
@@ -55,12 +55,18 @@
 /* GStreamer API Version */
 #define GST_API_VERSION "1.0"
 
+/* Define if extra runtime checks should be enabled */
+#undef GST_ENABLE_EXTRA_CHECKS
+
 /* Extra platform specific plugin suffix */
 #undef GST_EXTRA_MODULE_SUFFIX
 
 /* Defined if gcov is enabled to force a rebuild due to config.h changing */
 #undef GST_GCOV_ENABLED
 
+/* DMABUF available for gl plugins */
+#undef GST_GL_HAVE_DMABUF
+
 /* EGL module name */
 #undef GST_GL_LIBEGL_MODULE_NAME
 
@@ -89,7 +95,7 @@
 #define GST_PACKAGE_ORIGIN "Unknown package origin"
 
 /* GStreamer package release date/time for plugins as YYYY-MM-DD */
-#define GST_PACKAGE_RELEASE_DATETIME "2015-12-14"
+#define GST_PACKAGE_RELEASE_DATETIME "2015-12-24"
 
 /* Define if static plugins should be built */
 #undef GST_PLUGIN_BUILD_STATIC
@@ -409,6 +415,12 @@
 /* Define if nettle is available */
 #undef HAVE_NETTLE
 
+/* Define to enable NVIDIA Encode API (used by nvenc). */
+#undef HAVE_NVENC
+
+/* NVENC GStreamer OpenGL support available */
+#undef HAVE_NVENC_GST_GL
+
 /* Define to enable ofa plugins (used by ofa). */
 #undef HAVE_OFA
 
@@ -501,6 +513,15 @@
 /* Define to enable Qt elements (used by qt). */
 #undef HAVE_QT
 
+/* Define if Qt Android integration is installed */
+#undef HAVE_QT_ANDROID
+
+/* Define if Qt iOS integration is installed */
+#undef HAVE_QT_IOS
+
+/* Define if Qt Mac integration is installed */
+#undef HAVE_QT_MAC
+
 /* Define if Qt Wayland integration is installed */
 #undef HAVE_QT_WAYLAND
 
@@ -717,7 +738,7 @@
 #define PACKAGE_NAME "GStreamer Bad Plug-ins"
 
 /* Define to the full name and version of this package. */
-#define PACKAGE_STRING "GStreamer Bad Plug-ins 1.6.2"
+#define PACKAGE_STRING "GStreamer Bad Plug-ins 1.7.1"
 
 /* Define to the one symbol short name of this package. */
 #define PACKAGE_TARNAME "gst-plugins-bad"
@@ -726,7 +747,7 @@
 #undef PACKAGE_URL
 
 /* Define to the version of this package. */
-#define PACKAGE_VERSION "1.6.2"
+#define PACKAGE_VERSION "1.7.1"
 
 /* directory where plugins are located */
 #ifdef _DEBUG
@@ -770,7 +791,7 @@
 #undef USE_EGL_RPI
 
 /* Version number of package */
-#define VERSION "1.6.2"
+#define VERSION "1.7.1"
 
 /* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most
    significant byte first (like Motorola and SPARC, unlike Intel). */